diff --git a/aio/content/cli/help/build-info.json b/aio/content/cli/help/build-info.json index c578dd0072f06..cb832f370d511 100644 --- a/aio/content/cli/help/build-info.json +++ b/aio/content/cli/help/build-info.json @@ -1,4 +1,4 @@ { "branchName": "refs/heads/main", - "sha": "81c55a67fc38f47d14387584cf9593286ddd18c1" + "sha": "47810588dd3e0458285fe60a9f530021c8a915a3" } \ No newline at end of file diff --git a/aio/content/cli/help/build.json b/aio/content/cli/help/build.json index d641477669533..9f8effcf8af1f 100644 --- a/aio/content/cli/help/build.json +++ b/aio/content/cli/help/build.json @@ -3,7 +3,7 @@ "command": "ng build [project]", "shortDescription": "Compiles an Angular application or library into an output directory named dist/ at the given output path.", "longDescriptionRelativePath": "@angular/cli/src/commands/build/long-description.md", - "longDescription": "The command can be used to build a project of type \"application\" or \"library\".\nWhen used to build a library, a different builder is invoked, and only the `ts-config`, `configuration`, and `watch` options are applied.\nAll other options apply only to building applications.\n\nThe application builder uses the [webpack](https://webpack.js.org/) build tool, with default configuration options specified in the workspace configuration file (`angular.json`) or with a named alternative configuration.\nA \"development\" configuration is created by default when you use the CLI to create the project, and you can use that configuration by specifying the `--configuration development`.\n\nThe configuration options generally correspond to the command options.\nYou can override individual configuration defaults by specifying the corresponding options on the command line.\nThe command can accept option names given in dash-case.\nNote that in the configuration file, you must specify names in camelCase.\n\nSome additional options can only be set through the configuration file,\neither by direct editing or with the `ng config` command.\nThese include `assets`, `styles`, and `scripts` objects that provide runtime-global resources to include in the project.\nResources in CSS, such as images and fonts, are automatically written and fingerprinted at the root of the output folder.\n\nFor further details, see [Workspace Configuration](guide/workspace-config).\n", + "longDescription": "The command can be used to build a project of type \"application\" or \"library\".\nWhen used to build a library, a different builder is invoked, and only the `ts-config`, `configuration`, and `watch` options are applied.\nAll other options apply only to building applications.\n\nThe application builder uses the [esbuild](https://esbuild.github.io/) build tool, with default configuration options specified in the workspace configuration file (`angular.json`) or with a named alternative configuration.\nA \"development\" configuration is created by default when you use the CLI to create the project, and you can use that configuration by specifying the `--configuration development`.\n\nThe configuration options generally correspond to the command options.\nYou can override individual configuration defaults by specifying the corresponding options on the command line.\nThe command can accept option names given in dash-case.\nNote that in the configuration file, you must specify names in camelCase.\n\nSome additional options can only be set through the configuration file,\neither by direct editing or with the `ng config` command.\nThese include `assets`, `styles`, and `scripts` objects that provide runtime-global resources to include in the project.\nResources in CSS, such as images and fonts, are automatically written and fingerprinted at the root of the output folder.\n\nFor further details, see [Workspace Configuration](guide/workspace-config).\n", "aliases": [ "b" ], @@ -12,7 +12,7 @@ { "name": "allowed-common-js-dependencies", "type": "array", - "description": "A list of CommonJS packages that are allowed to be used without a build time warning." + "description": "A list of CommonJS or AMD packages that are allowed to be used without a build time warning. Use `'*'` to allow all." }, { "name": "aot", diff --git a/aio/content/cli/help/update.json b/aio/content/cli/help/update.json index e34fd16d8e293..7534ebc78c988 100644 --- a/aio/content/cli/help/update.json +++ b/aio/content/cli/help/update.json @@ -31,7 +31,7 @@ { "name": "from", "type": "string", - "description": "Version from which to migrate from. Only available with a single package being updated, and only with 'migrate-only'." + "description": "Version from which to migrate from. Only available when a single package is updated, and only with 'migrate-only'." }, { "name": "help", @@ -46,7 +46,7 @@ { "name": "name", "type": "string", - "description": "The name of the migration to run. Only available with a single package being updated, and only with 'migrate-only' option." + "description": "The name of the migration to run. Only available when a single package is updated." }, { "name": "next", @@ -71,7 +71,7 @@ { "name": "to", "type": "string", - "description": "Version up to which to apply migrations. Only available with a single package being updated, and only with 'migrate-only' option. Requires 'from' to be specified. Default to the installed version detected." + "description": "Version up to which to apply migrations. Only available when a single package is updated, and only with 'migrate-only' option. Requires 'from' to be specified. Default to the installed version detected." }, { "name": "verbose", diff --git a/aio/content/guide/app-shell.md b/aio/content/guide/app-shell.md index 0d729b174af2c..8a274c597991e 100644 --- a/aio/content/guide/app-shell.md +++ b/aio/content/guide/app-shell.md @@ -7,17 +7,17 @@ This gives users a meaningful first paint of your application that appears quick Learn more in [The App Shell Model](https://developers.google.com/web/fundamentals/architecture/app-shell). -## Step 1: Prepare the application +## Step 1: Generate an application Do this with the following Angular CLI command: -ng new my-app --routing +ng new my-app -For an existing application, you have to manually add the `RouterModule` and defining a `` within your application. +For an existing application, you have to manually add the `Router` and defining a `` within your application. ## Step 2: Create the application shell @@ -31,62 +31,28 @@ ng generate app-shell For more information about this command, see [App shell command](cli/generate#app-shell-command). -After running this command you can see that the `angular.json` configuration file has been updated to add two new targets, with a few other changes. - - - -"server": { - "builder": "@angular-devkit/build-angular:server", - "defaultConfiguration": "production", - "options": { - "outputPath": "dist/my-app/server", - "main": "src/main.server.ts", - "tsConfig": "tsconfig.server.json" - }, - "configurations": { - "development": { - "outputHashing": "none", - }, - "production": { - "outputHashing": "media", - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "sourceMap": false, - "optimization": true - } - } -}, -"app-shell": { - "builder": "@angular-devkit/build-angular:app-shell", - "defaultConfiguration": "production", - "options": { - "route": "shell" - }, - "configurations": { - "development": { - "browserTarget": "my-app:build:development", - "serverTarget": "my-app:server:development", - }, - "production": { - "browserTarget": "my-app:build:production", - "serverTarget": "my-app:server:production" - } - } -} +The command updates the application code and adds extra files to the project structure. + + + + src + ├── app + │ ├── app.config.server.ts # server application configuration + │ └── app-shell # app-shell component + │ ├── app-shell.component.html + │ ├── app-shell.component.scss + │ ├── app-shell.component.spec.ts + │ └── app-shell.component.ts + └── main.server.ts # main server application bootstrapping -## Step 3: Verify the application is built with the shell content -Use the Angular CLI to build the `app-shell` target. +## Step 3: Verify the application is built with the shell content -ng run my-app:app-shell:development +ng build --configuration=development @@ -94,7 +60,7 @@ Or to use the production configuration. -ng run my-app:app-shell:production +ng build @@ -107,4 +73,4 @@ Look for default text `app-shell works!` to show that the application shell rout -@reviewed 2022-02-28 +@reviewed 2023-10-20 diff --git a/aio/content/guide/prerendering.md b/aio/content/guide/prerendering.md index b44fceb2870db..1732290db0306 100644 --- a/aio/content/guide/prerendering.md +++ b/aio/content/guide/prerendering.md @@ -1,63 +1,65 @@ -# Prerendering static pages +# Prerendering (SSG) -Angular Universal lets you prerender the pages of your application. -Prerendering is the process where a dynamic page is processed at build time generating static HTML. +Prerendering, commonly referred to as Static Site Generation (SSG), represents the method by which pages are rendered to static HTML files during the build process. + +ndering maintains the same performance benefits of [server-side rendering (SSR)](/guide/universal/#why-do-it). But achieves a reduced Time to First Byte (TTFB), ultimately enhancing user experience. The key distinction lies in its approach that pages are served as static content, and there is no request-based rendering. + +When the data necessary for server-side rendering remains consistent across all users, the strategy of prerendering emerges as a valuable alternative. Rather than dynamically rendering pages for each user request, prerendering takes a proactive approach by rendering them in advance. ## How to prerender a page -To prerender a static page make sure to add Server-Side Rendering (SSR) capabilities to your application. -For more information see the [universal guide](guide/universal). -Once SSR is added, run the following command: +To prerender a static page, add SSR capabilities to your application with the following Angular CLI command: -npm run prerender +ng add @angular/ssr -### Build options for prerendering +
-When you add prerendering to your application, the following build options are available: +To create an application with prerendering capabilities from the beginning use the [ng new --ssr](cli/new) command. -| Options | Details | -|:--- |:--- | -| `browserTarget` | Specify the target to build. | -| `serverTarget` | Specify the Server target to use for prerendering the application. | -| `routes` | Define an array of extra routes to prerender. | -| `guessRoutes` | Whether builder should extract routes and guess which paths to render. Defaults to `true`. | -| `routesFile` | Specify a file that contains a list of all routes to prerender, separated by newlines. This option is useful if you have a large number of routes. | -| `numProcesses` | Specify the number of CPUs to be used while running the prerendering command. | +
-### Prerendering dynamic routes +Once SSR is added, you can generate the static pages by running the build command: -You can prerender dynamic routes. -An example of a dynamic route is `product/:id`, where `id` is dynamically provided. + -To prerender dynamic routes, choose one from the following options: +ng build -* Provide extra routes in the command line -* Provide routes using a file -* Prerender specific routes + -#### Provide extra routes in the command line +### Build options for prerender -While running the prerender command, you can provide extra routes. -For example: +The application builder `prerender` option can be either a Boolean or an Object for more fine-tuned configuration. +When the option is `false`, no prerendering is done. When it's is `true`, all options use the default value. When it's is an Object, each option can be individually configured. - +| Options | Details | Default Value | +| :--------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------ | +| `discoverRoutes` | Whether the builder should process the Angular Router configuration to find all unparameterized routes and prerender them. | `true` | +| `routesFile` | The path to a file that contains a list of all routes to prerender, separated by newlines. This option is useful if you want to prerender routes with parameterized URLs. | | -ng run <app-name>:prerender --routes /product/1 /product/2 + - +… +"architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "prerender": { + "discoverRoutes": false + }, + }, +… -#### Providing extra routes using a file + -You can provide routes using a file to create static pages. -This method is useful if you have a large number of routes to create. For example, product details for an e-commerce application, which might come from an external source, like a Database or Content Management System (CMS). +### Prerendering parameterized routes -To provide routes using a file, use the `--routes-file` option with the name of a `.txt` file containing the routes. +You can prerender parameterized routes using the `routesFile` option. An example of a parameterized route is `product/:id`, where `id` is dynamically provided. To specify these routes, they should be listed in a text file, with each route on a separate line. -For example, you could create this file by using a script to extract IDs from a database and save them to a `routes.txt` file: +For an app with a large number of parameterized routes, consider generating this file using a script before running `ng build`. @@ -66,24 +68,24 @@ For example, you could create this file by using a script to extract IDs from a -When your `.txt` file is ready, run the following command to prerender the static files with dynamic values: +With routes specified in the `routes.txt` file, use the `routesFile` option to configure the builder to prerender the product routes. - + -ng run <app-name>:prerender --routes-file routes.txt +… +"architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "prerender": { + "routesFile": "routes.txt" + }, + }, +… -#### Prerendering specific routes - -You can also pass specific routes to the prerender command. -If you choose this option, make sure to turn off the `guessRoutes` option. - - - -ng run <app-name>:prerender --no-guess-routes --routes /product/1 /product/2 - - +This configures `ng build` to prerender `/products/1` and `/products/555` at build time. @@ -91,4 +93,4 @@ ng run <app-name>:prerender --no-guess-routes --routes /product/1 /product -@reviewed 2022-02-28 +@reviewed 2023-10-23 diff --git a/aio/src/app/app.component.html b/aio/src/app/app.component.html index 1cfca34f6e661..8fb6fd2372ac1 100644 --- a/aio/src/app/app.component.html +++ b/aio/src/app/app.component.html @@ -11,11 +11,11 @@
- - + + - Help Angular by taking a quick survey! - Go to survey + We have a lot to share, tune in on November 6th! + Join us live diff --git a/aio/yarn.lock b/aio/yarn.lock index da399e151069a..a7af322e99dc8 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -544,12 +544,7 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== - -"@babel/compat-data@^7.23.2": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== @@ -596,7 +591,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.23.2": +"@babel/core@7.23.2", "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== @@ -617,28 +612,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.12.3", "@babel/core@^7.16.0": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" - integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.22.20" - "@babel/helpers" "^7.22.15" - "@babel/parser" "^7.22.16" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.20" - "@babel/types" "^7.22.19" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@7.22.15", "@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== @@ -648,7 +622,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@7.23.0", "@babel/generator@^7.23.0": +"@babel/generator@7.23.0", "@babel/generator@^7.22.15", "@babel/generator@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== @@ -707,17 +681,6 @@ 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" - "@babel/helper-define-polyfill-provider@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" @@ -734,15 +697,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== @@ -758,11 +713,11 @@ "@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== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" @@ -771,18 +726,7 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" - integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-module-transforms@^7.23.0": +"@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== @@ -849,7 +793,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": +"@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== @@ -868,25 +812,7 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" - integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/helpers@^7.23.0": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" - integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.0" - "@babel/types" "^7.23.0" - -"@babel/helpers@^7.23.2": +"@babel/helpers@^7.22.15", "@babel/helpers@^7.23.0", "@babel/helpers@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== @@ -904,12 +830,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": - version "7.22.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" - integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== - -"@babel/parser@^7.23.0": +"@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== @@ -1079,7 +1000,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@7.22.15", "@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== @@ -1089,7 +1010,7 @@ "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-generator-functions@7.23.2", "@babel/plugin-transform-async-generator-functions@^7.23.2": +"@babel/plugin-transform-async-generator-functions@7.23.2", "@babel/plugin-transform-async-generator-functions@^7.22.15", "@babel/plugin-transform-async-generator-functions@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== @@ -1115,14 +1036,7 @@ 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.23.0": +"@babel/plugin-transform-block-scoping@^7.22.15", "@babel/plugin-transform-block-scoping@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== @@ -1169,14 +1083,7 @@ "@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.23.0": +"@babel/plugin-transform-destructuring@^7.22.15", "@babel/plugin-transform-destructuring@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== @@ -1268,15 +1175,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-amd@^7.23.0": +"@babel/plugin-transform-modules-amd@^7.22.5", "@babel/plugin-transform-modules-amd@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== @@ -1284,16 +1183,7 @@ "@babel/helper-module-transforms" "^7.23.0" "@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.23.0": +"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== @@ -1302,17 +1192,7 @@ "@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.23.0": +"@babel/plugin-transform-modules-systemjs@^7.22.11", "@babel/plugin-transform-modules-systemjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== @@ -1388,16 +1268,7 @@ "@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.23.0": +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== @@ -1731,21 +1602,21 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.16.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.15.tgz#7aeb9460598a997b0fe74982a5b02fb9e5d264d9" - integrity sha512-SAj8oKi8UogVi6eXQXKNPu8qZ78Yzy7zawrlTr0M+IuW/g8Qe9gVDhGcF9h1S69OyACpYoLxEzpjs1M15sI5wQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz#a5cd9d8b408fb946b2f074b21ea40c04e516795c" + integrity sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@7.22.15", "@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.23.2": +"@babel/runtime@7.23.2", "@babel/runtime@^7.8.4": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== @@ -1761,39 +1632,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17", "@babel/traverse@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" - integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.19" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" - integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.23.2": +"@babel/traverse@^7.22.17", "@babel/traverse@^7.23.0", "@babel/traverse@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -1809,16 +1648,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" - integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.19", "@babel/types@^7.23.0": +"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== @@ -1911,6 +1741,11 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -2279,9 +2114,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" - integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.9.1.tgz#449dfa81a57a1d755b09aa58d826c1262e4283b4" + integrity sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA== "@eslint/eslintrc@^2.1.2": version "2.1.2" @@ -2327,15 +2162,15 @@ integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== "@google-cloud/pubsub@^3.0.1": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.3.tgz#4ec354fab0e6492654b4365024e0b15def23a08b" - integrity sha512-ZRDC4g7tpIJ8fkAp4MiU+tDfousM/q6pXK6ytFn0cbYEdNQuWOf4wqopNYMOUJ+AIjaTbgmNw77dStOKTc9Acg== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.5.tgz#3fed656b7e7ea3a4618d5590004f08321a1389b9" + integrity sha512-4Qrry4vIToth5mqduVslltWVsyb7DR8OhnkBA3F7XiE0jgQsiuUfwp/RB2F559aXnRbwcfmjvP4jSuEaGcjrCQ== dependencies: "@google-cloud/paginator" "^4.0.0" "@google-cloud/precise-date" "^3.0.0" "@google-cloud/projectify" "^3.0.0" "@google-cloud/promisify" "^2.0.0" - "@opentelemetry/api" "^1.0.0" + "@opentelemetry/api" "^1.6.0" "@opentelemetry/semantic-conventions" "~1.3.0" "@types/duplexify" "^3.6.0" "@types/long" "^4.0.0" @@ -2454,9 +2289,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -3254,10 +3089,11 @@ 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== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.0.tgz#e81f00fdb2a670750ff7731bbefb47ecbf0ccf44" + integrity sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q== dependencies: + agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" lru-cache "^10.0.1" @@ -3386,7 +3222,7 @@ resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.2.2.tgz#0afbeb2133613a5a3b0083e18a250472ccf45932" integrity sha512-liHtyVVOttcqHIV3Xrg/1AJzEgfiOCeqJsleHXHGgPr1fxPx7SIZaa3/QnDY1lNMN+t6Gvj0/r2Ba3iuptYD3Q== -"@opentelemetry/api@^1.0.0": +"@opentelemetry/api@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.6.0.tgz#de2c6823203d6f319511898bb5de7e70f5267e19" integrity sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g== @@ -3675,24 +3511,24 @@ integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== + version "3.5.12" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" + integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== dependencies: "@types/node" "*" "@types/browser-sync@^2.26.3": - version "2.27.1" - resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.1.tgz#e6147254d020e600d1382fc6c4fd9243231ed0ca" - integrity sha512-p/qAU+3dqq/CqobNiiZkIsernNfQe/35QEtor8Oae/WWgMLLhceFogCaAMe7pO4T8Z5WL/Co522YBo2sk/I7AQ== + version "2.27.3" + resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.3.tgz#bfd0eb70f49d71b80048ee3929a3a85959c19f6a" + integrity sha512-AG4+p6Wfg99BtiGTBIWN4u6JHm0nEG74krPU06pWoCFnMhNcpLfurfg5zcPUe8tNqhxJ3ZppZ6D5vxq+CCqbGQ== dependencies: "@types/micromatch" "^2" "@types/node" "*" @@ -3700,17 +3536,17 @@ chokidar "^3.0.0" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" + integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== dependencies: "@types/node" "*" @@ -3720,44 +3556,44 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": - version "2.8.14" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" - integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== + version "2.8.15" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.15.tgz#eb143aa2f8807ddd78e83cbff141bbedd91b60ee" + integrity sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw== dependencies: "@types/node" "*" "@types/duplexify@^3.6.0": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.1.tgz#5685721cf7dc4a21b6f0e8a8efbec6b4d2fbafad" - integrity sha512-n0zoEj/fMdMOvqbHxmqnza/kXyoGgJmEpsXjpP+gEqE1Ye4yNqc7xWipKnUoMpWhMuzJQSfK2gMrwlElly7OGQ== + version "3.6.3" + resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.3.tgz#42b1716c5d52a42ba9072696c0d33ca0a9bffd6d" + integrity sha512-KE0Yb3JraglJMB53+A/RMXbd9w//pQfiSqkrsoAxKcNOEIe1EHfEgbvoi2lkk2AvhhJtplugJSB2Mptc3DZMNA== dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" + integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.44.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.5.tgz#24d7f3b07aff47a13b570efd5c52d96f38cd352e" + integrity sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@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== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" + integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.36" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" - integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + version "4.17.38" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.38.tgz#d9c1d3a134a1226d84ec8e40c182f960f969d5a4" + integrity sha512-hXOtc0tuDHZPFwwhuBJXPbjemWtXnJjbvuuyNH2Y5Z6in+iXc63c4eXYDc7GGGqHy+iwYqAJMdaItqdnbcBKmg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -3765,9 +3601,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -3783,36 +3619,36 @@ "@types/node" "*" "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== "@types/http-proxy@^1.17.8": - version "1.17.12" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" - integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== + version "1.17.13" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" + integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== dependencies: "@types/node" "*" "@types/is-windows@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-1.0.0.tgz#1011fa129d87091e2f6faf9042d6704cdf2e7be0" - integrity sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-1.0.1.tgz#ed99ac3cb86a45796022c52e79c61974af9ffd8b" + integrity sha512-5ca2iU1+JNRb0dOFFDXQ3bukIzkVM8Ft4Wn5rDj9y4tUOtE3DOdfrMH1qegdvx08VU2RRCSyQ7beTZ/WKF0BgQ== "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== "@types/jasmine@~5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.0.tgz#581b2f7393942a56acd3542fe168c803d7d588d6" - integrity sha512-XOV0KsqXNX2gUSqk05RWeolIMgaAQ7+l/ozOBoQ8NGwLg+E7J9vgagODtNgfim4jCzEUP0oJ3gnXeC+Zv+Xi1A== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.1.tgz#7d2a2a983e1e822858ea9e30d90e11a3fe408fc0" + integrity sha512-qL4GoZHHJl1JQ0vK31OtXMfkfGxYJnysmYz9kk0E8j5W96ThKykBF90uD3PcVmQUAzulbsaus2eFiBhCH5itfw== "@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/json5@^0.0.29": version "0.0.29" @@ -3820,9 +3656,9 @@ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/linkify-it@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b" - integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.4.tgz#def6a9bb0ce78140860602f16ace37a9997f086a" + integrity sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ== "@types/long@^4.0.0": version "4.0.2" @@ -3830,9 +3666,9 @@ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== "@types/lunr@^2.3.3": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@types/lunr/-/lunr-2.3.5.tgz#de3a04b085477ce1d7519c8cbdceed92f9310593" - integrity sha512-C4xYh7A4FRKg70AWJCe27oJYVPhUlEY5MQ4dKbRR7G6Xsb2HiqO672yWHRvWxl8/h7IuISvwDjv88ECHUEsV2A== + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/lunr/-/lunr-2.3.6.tgz#8b3e1b856094a1706d7c90975160f0afb2479da3" + integrity sha512-gNcIX3YUvGrfEtL98j/YjIMWqwThoJok3Vm4uqTRfg2xeAkIb1TT7eQrB20zzA/2mPG7XTkLPxLxkJIV1o/cVw== "@types/markdown-it@^12.2.3": version "12.2.3" @@ -3843,38 +3679,38 @@ "@types/mdurl" "*" "@types/marked@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-5.0.1.tgz#15acd796d722b91bf00738c8c8539aaf5034f0c6" - integrity sha512-Y3pAUzHKh605fN6fvASsz5FDSWbZcs/65Q6xYRmnIP9ZIYz27T4IOmXfH9gWJV1dpi7f1e7z7nBGUTx/a0ptpA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-5.0.2.tgz#ca6b0cd7a5c8799c8cd0963df0b3e1a9021dcdfa" + integrity sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg== "@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.12.tgz#beeb511b977c875a5b0cc92eab6fcac2f0895514" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== + version "3.0.14" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.14.tgz#0735473a5b35be032b9f2685b7413cbab1b8a639" + integrity sha512-gVZ04PGgw1qLZKsnWnyFv4ORnaJ+DXLdHTVSFbU8yX6xZ34Bjg4Q32yPkmveUP1yItXReKfB0Aknlh/3zxTKAw== dependencies: "@types/unist" "^2" "@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.4.tgz#574bfbec51eb41ab5f444116c8555bc4347feba5" + integrity sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A== "@types/micromatch@^2": - version "2.3.31" - resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-2.3.31.tgz#d13641cb6965294ed1b1d2ad561a331d6306962b" - integrity sha512-17WSoNz/GKLSfcomM8cMoJJQG2cDKvsoDFTtbwjEMxcizGb0HT6EBRi8qR7NW+XSaVdxHzq/WV/TUOm5f/ksag== + version "2.3.33" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-2.3.33.tgz#0da66e90b706ae798ccea8b03cbb635869b0b266" + integrity sha512-jgUM0r/NgVdakSese7wLBk8dYZMUfJUMd3ByAiA1w4b+M3DNgdiqqK4Y4fdhDuTWY5CzxvUZzW6dceIGNrlVVg== dependencies: "@types/parse-glob" "*" "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" + integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" + integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== "@types/minimatch@^5.1.2": version "5.1.2" @@ -3882,9 +3718,11 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.6.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" - integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" "@types/node@16.10.9": version "16.10.9" @@ -3902,9 +3740,9 @@ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/parse-glob@*": - version "3.0.29" - resolved "https://registry.yarnpkg.com/@types/parse-glob/-/parse-glob-3.0.29.tgz#6a40ec7ebd2418ee69ee397e48e42169268a10bf" - integrity sha512-OFwMPH5eJOhtwR92GMjTNWukaKTdWQC12cBgRvrTQl5CwhruSq6734wi1CTSh5Qjm/pMJWaKOOPKZOp6FpIkXQ== + version "3.0.31" + resolved "https://registry.yarnpkg.com/@types/parse-glob/-/parse-glob-3.0.31.tgz#92e77b8a062fc55989d479de5b9357e7ae7fdfcc" + integrity sha512-83YRiYrTOabm7i0bVYuXBgBTZR5acCBUgNmR4LEihR/vXvujTtiyRzWDTAMh7qicFqlhV+6ItebPRkf4yK64Xg== "@types/q@^0.0.32": version "0.0.32" @@ -3912,14 +3750,14 @@ integrity sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== "@types/retry@0.12.0": version "0.12.0" @@ -3935,82 +3773,82 @@ "@types/node" "*" "@types/selenium-webdriver@^3.0.0": - version "3.0.23" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.23.tgz#59b96c11b63b74f88bdf7adfdf2018b6a844db8a" - integrity sha512-f4lAmp7rmGgsTkRPjgHOpQumgpqjQ0RxbEkOwCwLVSsa5gCnni4GMBfqmN0nObFeDRZj/DTTsx99SOjOXRW2bQ== + version "3.0.24" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.24.tgz#788aac3b3ad788339c01e586fb0fa6ab15d3ee11" + integrity sha512-PKUsOV485ZiB466i6xuhpjiASvcC6+SSZqOwU7DIMn1as8DGrATWdMvjuG7scbyxk/e1SYwAzDB2LbobLxy0Qw== "@types/selenium-webdriver@^4.0.18": - version "4.1.16" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.16.tgz#8438a3027c7905f516f7b2fbf85e7ded3763bc53" - integrity sha512-ETje9rr7nTrD0r/mNnIuCAF7fAZ2xKE/1WyxXZZH9N9Cy2NKJTrpEd7SCdzuIlm/1iu1gjHCVbaDwT+MuDrVZg== + version "4.1.18" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.18.tgz#8c197a8b09a9116f2dcd7551235227e737b36235" + integrity sha512-oBh2f+bbspYPkZoexEIaU8tV6/DR4FBCcMT8vKlFn7yhUTxYzKLgugA2nO0G/hYrwJiHn3EF95+n/GrPdIV5wA== dependencies: "@types/ws" "*" "@types/semver@^7.3.12": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" - integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/send@*", "@types/send@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" + integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.35" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" + integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== dependencies: "@types/node" "*" "@types/tmp@^0.2.1": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.4.tgz#1e26f791b94a95474f1f3322a721dfb065b876fb" - integrity sha512-Vq3rwM+2KgiLacq68EjTJD9cuJ/ne5pXntWn8B8Rxj25SLkGAhCgooCZ1lhcIcV5OFveJ+s5Cqpi+XKfFM/xZA== + version "0.2.5" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.5.tgz#0f3a71d0a94cbd5de45b0aa641575dd503e43ed4" + integrity sha512-KodRrjqWrk/3VyzfR4aeXkf2n5Ssg+bvVUhXlvHVffLiIHriLlrO3vYobB+Kvnr9DkNzMiyWHT3G6hT/xX0ryQ== "@types/triple-beam@^1.3.2": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.3.tgz#726ae98a5f6418c8f24f9b0f2a9f81a8664876ae" - integrity sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.4.tgz#a1d5f480245db86e2f4777000065d4fe7467a012" + integrity sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA== "@types/trusted-types@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" - integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.5.tgz#5cac7e7df3275bb95f79594f192d97da3b4fd5fe" + integrity sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA== "@types/unist@*", "@types/unist@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.0.tgz#988ae8af1e5239e89f9fbb1ade4c935f4eeedf9a" - integrity sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.1.tgz#778652d02ddec1bfc9e5e938fec8d407b8e56cba" + integrity sha512-ue/hDUpPjC85m+PM9OQDMZr3LywT+CT6mPsQq8OJtCLiERkGRcQUFvu9XASF5XWqyZFXbf15lvb3JFJ4dRLWPg== "@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.8" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" - integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + version "2.0.9" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.9.tgz#72e164381659a49557b0a078b28308f2c6a3e1ce" + integrity sha512-zC0iXxAv1C1ERURduJueYzkzZ2zaGyc+P2c95hgkikHPr3z8EdUZOlgEQ5X0DRmwDZn+hekycQnoeiiRVrmilQ== "@types/uuid@^9.0.0": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.4.tgz#e884a59338da907bda8d2ed03e01c5c49d036f1c" - integrity sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA== + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.5.tgz#25a71eb73eba95ac0e559ff3dd018fc08294acf6" + integrity sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ== "@types/vfile-message@*": version "2.0.0" @@ -4029,9 +3867,9 @@ "@types/vfile-message" "*" "@types/ws@*", "@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + version "8.5.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.7.tgz#1ca585074fe5d2c81dec7a3d451f244a2a6d83cb" + integrity sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ== dependencies: "@types/node" "*" @@ -4043,21 +3881,21 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^17.0.0": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.28" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.28.tgz#d106e4301fbacde3d1796ab27374dd16588ec851" + integrity sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw== dependencies: "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + version "2.10.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" + integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== dependencies: "@types/node" "*" @@ -4350,9 +4188,9 @@ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== "@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.51" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.51.tgz#b6628fdb00e984c54f7eca8b8cbd71cc52fabe73" - integrity sha512-E3sHAnUcyvGbXDCY1YJTVTwovF1UFP8IVJ6CFGgTST8RGD2gRQqqmW8dZykpaDWKqO6RBqwJcfmJMyqYBBpixw== + version "3.0.0-rc.53" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.53.tgz#9b5eba91567d8c0f1f5224b1c4477036ea285622" + integrity sha512-kprOp3hV9l7B9oqjgTQIM04mmEaYBYcccUXVIM1NFFf10HqnD9joTfZ1cAqx9lpccWzgUnHkrhVwhhlGjPzyIw== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -4947,9 +4785,9 @@ axios@0.21.4: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267" - integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ== + version "1.5.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" + integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -4986,16 +4824,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -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.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" - semver "^6.3.1" - -babel-plugin-polyfill-corejs2@^0.4.6: +babel-plugin-polyfill-corejs2@^0.4.5, babel-plugin-polyfill-corejs2@^0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== @@ -5004,15 +4833,7 @@ babel-plugin-polyfill-corejs2@^0.4.6: "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" -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.4.2" - core-js-compat "^3.31.0" - -babel-plugin-polyfill-corejs3@^0.8.5: +babel-plugin-polyfill-corejs3@^0.8.3, babel-plugin-polyfill-corejs3@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== @@ -5020,14 +4841,7 @@ babel-plugin-polyfill-corejs3@^0.8.5: "@babel/helper-define-polyfill-provider" "^0.4.3" core-js-compat "^3.32.2" -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.4.2" - -babel-plugin-polyfill-regenerator@^0.5.3: +babel-plugin-polyfill-regenerator@^0.5.2, babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== @@ -5263,17 +5077,7 @@ browser-sync@2.29.3, browser-sync@^2.27.7: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, 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.22.1: +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.21.9, browserslist@^4.22.1: version "4.22.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== @@ -5436,15 +5240,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: - version "1.0.30001538" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" - integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== - -caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001547" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" - integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== +caniuse-lite@^1.0.30001520, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001550" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz#6ec6a2239eb2a8123cc26cfe0571db5c79eb8669" + integrity sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ== canonical-path@1.0.0, canonical-path@^1.0.0: version "1.0.0" @@ -5624,9 +5423,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.7.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjson@^0.3.1: version "0.3.3" @@ -6054,14 +5853,7 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -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.10" - -core-js-compat@^3.32.2: +core-js-compat@^3.31.0, core-js-compat@^3.32.2: version "3.33.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== @@ -6069,9 +5861,9 @@ core-js-compat@^3.32.2: browserslist "^4.22.1" core-js-pure@^3.30.2: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" - integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.0.tgz#938a28754b4d82017a7a8cbd2727b1abecc63591" + integrity sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg== core-util-is@1.0.2: version "1.0.2" @@ -6256,9 +6048,9 @@ cssstyle@^3.0.0: rrweb-cssom "^0.6.0" csv-parse@^5.0.4: - version "5.5.0" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.0.tgz#2313421e69b650dae32a79ac884b20b21ca1d9da" - integrity sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw== + version "5.5.2" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.2.tgz#ab525e642093dccff7c5cca5c7b71fd3e99fe8f2" + integrity sha512-YRVtvdtUNXZCMyK5zd5Wty1W6dNTpGKdqQd4EQ8tl/c6KW1aMBB1Kg1ppky5FONKmEqGJ/8WjLlTNLPne4ioVA== custom-event@~1.0.0: version "1.0.1" @@ -6277,10 +6069,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" - integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== +data-uri-to-buffer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz#540bd4c8753a25ee129035aebdedf63b078703c7" + integrity sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg== data-urls@^4.0.0: version "4.0.0" @@ -6395,9 +6187,9 @@ defaults@^1.0.3: clone "^1.0.2" define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" gopd "^1.0.1" @@ -6753,15 +6545,10 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.477: - version "1.4.525" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz#614284f33901fbecd3e90176c0d60590cd939700" - integrity sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA== - electron-to-chromium@^1.4.535: - version "1.4.551" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz#14db6660a88f66ce095ea2657abe5653bc7f42ed" - integrity sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw== + version "1.4.557" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz#f3941b569c82b7bb909411855c6ff9bfe1507829" + integrity sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw== emoji-regex@^8.0.0: version "8.0.0" @@ -6819,9 +6606,9 @@ engine.io-parser@~5.2.1: integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== engine.io@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c" - integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.3.tgz#80b0692912cef3a417e1b7433301d6397bf0374b" + integrity sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -7721,9 +7508,9 @@ find-yarn-workspace-root@^2.0.0: micromatch "^4.0.2" firebase-tools@^12.0.0: - version "12.5.4" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.5.4.tgz#5235b857cc0d384b2036cd7a25c812cd487d4746" - integrity sha512-fLE+91tJp3PNZPyB6kN9zfn5rkQWhzPX3mlsAGKTMJUA5TLeZA1YlfBbgPr2DJUO47cHN/9b0BYUQjYcYsBPgw== + version "12.7.0" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.7.0.tgz#e28692a7cfb22b21d2492947d3a498d4722e5fc6" + integrity sha512-NBXYEbY9FE20BcEivxL0agXkehNTtcFhQmGGPPWrxntVgWOnbrzy4fh1xjZnQSRgZu4VpEWthXDM+oCkn6ouKQ== dependencies: "@google-cloud/pubsub" "^3.0.1" abort-controller "^3.0.0" @@ -7787,11 +7574,11 @@ firebase-tools@^12.0.0: ws "^7.2.3" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" @@ -7800,7 +7587,7 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.2.7: +flatted@^3.2.7, flatted@^3.2.9: version "3.2.9" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== @@ -7867,9 +7654,9 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.2.0, fraction.js@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fresh@0.5.2, fresh@^0.5.2: version "0.5.2" @@ -7951,9 +7738,9 @@ fs-minipass@^3.0.0: minipass "^7.0.3" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs.realpath@^1.0.0: version "1.0.0" @@ -7966,9 +7753,9 @@ fsevents@~2.3.2: integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6: version "1.1.6" @@ -8102,12 +7889,12 @@ get-symbol-description@^1.0.0: get-intrinsic "^1.1.1" get-uri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" - integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== + version "6.0.2" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.2.tgz#e019521646f4a8ff6d291fbaea2c46da204bb75b" + integrity sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw== dependencies: basic-ftp "^5.0.2" - data-uri-to-buffer "^5.0.1" + data-uri-to-buffer "^6.0.0" debug "^4.3.4" fs-extra "^8.1.0" @@ -8168,13 +7955,13 @@ glob@7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^10.2.2, glob@^10.2.5: - version "10.3.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" - integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== +glob@^10.2.2, glob@^10.3.7: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" - jackspeak "^2.0.3" + jackspeak "^2.3.5" minimatch "^9.0.1" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" @@ -8227,9 +8014,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -8469,11 +8256,9 @@ has-yarn@^2.1.0: integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hast-util-from-parse5@^5.0.0: version "5.0.3" @@ -9521,10 +9306,10 @@ istanbul-reports@^3.0.2, 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== +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -9975,9 +9760,9 @@ karma@~6.4.0: yargs "^16.1.1" keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -10011,12 +9796,12 @@ kuler@^2.0.0: integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" lazystream@^1.0.0: version "1.0.1" @@ -10399,11 +10184,11 @@ log4js@^6.4.1: streamroller "^3.1.5" logform@^2.3.2, logform@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b" - integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== + version "2.6.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== dependencies: - "@colors/colors" "1.5.0" + "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" fecha "^4.2.0" ms "^2.1.1" @@ -10606,9 +10391,9 @@ marked@^4.0.10, marked@^4.0.14: integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== marked@^9.0.0: - version "9.0.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-9.0.3.tgz#95be5e8cba93f2c2ca1d6503794c4f02d81c97d9" - integrity sha512-pI/k4nzBG1PEq1J3XFEHxVvjicfjl8rgaMaqclouGSMPhk7Q3Ejb2ZRxx/ZQOcQ1909HzVoWCFYq6oLgtL4BpQ== + version "9.1.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.2.tgz#a54ca772d2b5a43de7d8ed40111354b4b7985527" + integrity sha512-qoKMJqK0w6vkLk8+KnKZAH6neUZSNaQqVZ/h2yZ9S7CbLuFHyS2viB0jnqcWF9UKjwsAbMrQtnQhdmdvOVOw9w== marky@^1.2.2: version "1.2.5" @@ -10849,9 +10634,9 @@ minipass@^5.0.0: 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== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -11099,9 +10884,9 @@ npm-bundled@^3.0.0: npm-normalize-package-bin "^3.0.0" npm-install-checks@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.2.0.tgz#fae55b9967b03ac309695ec96629492d5cedf371" - integrity sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g== + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: semver "^7.1.1" @@ -11138,9 +10923,9 @@ npm-pick-manifest@9.0.0, npm-pick-manifest@^9.0.0: semver "^7.3.5" 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== + version "16.1.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz#10227b7b36c97bc1cf2902a24e4f710cfe62803c" + integrity sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw== dependencies: make-fetch-happen "^13.0.0" minipass "^7.0.2" @@ -11269,9 +11054,9 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.0.tgz#42695d3879e1cd5bda6df5062164d80c996e23e2" + integrity sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g== object-is@^1.1.5: version "1.1.5" @@ -11927,7 +11712,7 @@ postcss@8.4.29: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@8.4.31: +postcss@8.4.31, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -11936,26 +11721,17 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: - version "8.4.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" - integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - preact-render-to-string@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.1.tgz#bd4f01f9a6b91b16b281343e665d110487f68d67" - integrity sha512-5t7nFeMUextd53igL3GAakAAMaUD+dVWDHaRYaeh1tbPIjQIBtgJnMw6vf8VS/lviV0ggFtkgebatPxvtJsXyQ== + version "6.2.2" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.2.tgz#eb086b6db5d57468ab2c184896884fb0a818245d" + integrity sha512-YDfXQiVeYZutFR8/DpxLSbW3W6b7GgjBExRBxOOqcjrGq5rA9cziitQdNPMZe4RVMSdfBnf4hYqyeLs/KvtIuA== dependencies: pretty-format "^3.8.0" preact@^10.17.1: - version "10.17.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.17.1.tgz#0a1b3c658c019e759326b9648c62912cf5c2dde1" - integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== + version "10.18.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.18.1.tgz#3b84bb305f0b05f4ad5784b981d15fcec4e105da" + integrity sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg== prelude-ls@^1.2.1: version "1.2.1" @@ -12664,7 +12440,7 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@1.22.8: +resolve@1.22.8, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.4, resolve@^1.3.2, resolve@~1.22.1: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -12673,15 +12449,6 @@ resolve@1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.4, resolve@^1.3.2, resolve@~1.22.1: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@~1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -12749,11 +12516,11 @@ rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3: glob "^7.1.3" rimraf@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0" - integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg== + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== dependencies: - glob "^10.2.5" + glob "^10.3.7" robots-parser@^3.0.0: version "3.0.1" @@ -12761,9 +12528,9 @@ robots-parser@^3.0.0: integrity sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ== rollup@^3.27.1: - version "3.29.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.2.tgz#cbc76cd5b03b9f9e93be991d23a1dff9c6d5b740" - integrity sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A== + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" @@ -12880,9 +12647,9 @@ safevalues@^0.3.4: integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== safevalues@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.5.1.tgz#3275e4c275b7aa91fc234ad98346cdfd7d35382e" - integrity sha512-LlnIuLDYHC7BZn+/xXjaHyMiqkMxKHWTpt9bpXKqR8afVd4MJD9ZcEFuMhUNspp9oUw6MJPhaKJFu39zQxVvOg== + version "0.5.2" + resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.5.2.tgz#f0ec859de1cdf95d237d059429916b63a1dc3213" + integrity sha512-8MeVqP6q2UompeFEUVphKZyLzeenFrSATIAAeSE5+6aGiozwVe3mK61TCODNrBFHocBJdpGL/lCmdYWiocdMng== sass-loader@13.3.2: version "13.3.2" @@ -12908,9 +12675,9 @@ saucelabs@^1.5.0: https-proxy-agent "^2.2.1" sax@>=0.6.0, sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== saxes@^6.0.0: version "6.0.0" @@ -13194,7 +12961,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.6.1, shell-quote@^1.7.3: +shell-quote@^1.6.1, shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -13423,9 +13190,9 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.15" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" - integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== spdx-license-list@^2.1.0: version "2.1.0" @@ -13922,9 +13689,9 @@ terser@5.21.0: source-map-support "~0.5.20" terser@^5.16.8: - version "5.20.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.20.0.tgz#ea42aea62578703e33def47d5c5b93c49772423e" - integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== + version "5.22.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" + integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -14358,6 +14125,11 @@ underscore@~1.13.2: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + unherit@^1.0.4: version "1.1.3" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" @@ -14546,14 +14318,6 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -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" - update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -15117,9 +14881,9 @@ wildcard@^2.0.0: integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== winston-transport@^4.4.0, winston-transport@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" - integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + version "4.6.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" + integrity sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg== dependencies: logform "^2.3.2" readable-stream "^3.6.0" @@ -15138,11 +14902,11 @@ winston@^2.1.1: stack-trace "0.0.x" winston@^3.0.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.10.0.tgz#d033cb7bd3ced026fed13bf9d92c55b903116803" - integrity sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g== + version "3.11.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" + integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== dependencies: - "@colors/colors" "1.5.0" + "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" @@ -15297,9 +15061,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.2.1, yaml@^2.2.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" - integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== yargs-parser@21.1.1, yargs-parser@^21.0.0, yargs-parser@^21.1.1: version "21.1.1" diff --git a/goldens/size-tracking/aio-payloads.json b/goldens/size-tracking/aio-payloads.json index d7e719e4a5263..4a155b75ed3b3 100755 --- a/goldens/size-tracking/aio-payloads.json +++ b/goldens/size-tracking/aio-payloads.json @@ -2,7 +2,7 @@ "aio": { "uncompressed": { "runtime": 4252, - "main": 501754, + "main": 506861, "polyfills": 33862, "styles": 60209, "light-theme": 34317, diff --git a/integration/platform-server/projects/ngmodule/server.ts b/integration/platform-server/projects/ngmodule/server.ts index e908b269c8e7b..6201fb1d19670 100644 --- a/integration/platform-server/projects/ngmodule/server.ts +++ b/integration/platform-server/projects/ngmodule/server.ts @@ -38,15 +38,18 @@ app.get('/api-2', (req, res) => { // All regular routes use the Universal engine app.get('*', (req, res) => { + const { protocol, originalUrl, baseUrl, headers } = req; + renderModule(AppServerModule, { document: indexHtml, - url: req.url, - extraProviders: [{provide: APP_BASE_HREF, useValue: req.baseUrl}], + url: `${protocol}://${headers.host}${originalUrl}`, + extraProviders: [{provide: APP_BASE_HREF, useValue: baseUrl}], }).then((response: string) => { res.send(response); }); }); + app.listen(4206, () => { console.log('Server listening on port 4206!'); }); diff --git a/integration/platform-server/projects/ngmodule/src/app/http-transferstate-lazy/http-transfer-state.component.ts b/integration/platform-server/projects/ngmodule/src/app/http-transferstate-lazy/http-transfer-state.component.ts index a4a04a74b2b4e..76b1e62ce4f7c 100644 --- a/integration/platform-server/projects/ngmodule/src/app/http-transferstate-lazy/http-transfer-state.component.ts +++ b/integration/platform-server/projects/ngmodule/src/app/http-transferstate-lazy/http-transfer-state.component.ts @@ -29,7 +29,7 @@ export class TransferStateComponent implements OnInit { ngOnInit(): void { // Test that HTTP cache works when HTTP call is made in a lifecycle hook. - this.httpClient.get('http://localhost:4206/api-2').subscribe((response) => { + this.httpClient.get('/api-2').subscribe((response) => { this.responseTwo = response.data; }); } diff --git a/integration/platform-server/projects/standalone/server.ts b/integration/platform-server/projects/standalone/server.ts index ac1b37df48fb9..572d0c3d67b89 100644 --- a/integration/platform-server/projects/standalone/server.ts +++ b/integration/platform-server/projects/standalone/server.ts @@ -38,10 +38,12 @@ app.get('/api-2', (req, res) => { // All regular routes use the Universal engine app.get('*', (req, res) => { + const { protocol, originalUrl, baseUrl, headers } = req; + renderApplication(bootstrap, { document: indexHtml, - url: req.url, - platformProviders: [{provide: APP_BASE_HREF, useValue: req.baseUrl}], + url: `${protocol}://${headers.host}${originalUrl}`, + platformProviders: [{provide: APP_BASE_HREF, useValue: baseUrl}], }).then((response: string) => { res.send(response); }); diff --git a/integration/platform-server/projects/standalone/src/app/http-transferstate-lazy/http-transfer-state.component.ts b/integration/platform-server/projects/standalone/src/app/http-transferstate-lazy/http-transfer-state.component.ts index dfaa84a5138f7..eda820d63ccc9 100644 --- a/integration/platform-server/projects/standalone/src/app/http-transferstate-lazy/http-transfer-state.component.ts +++ b/integration/platform-server/projects/standalone/src/app/http-transferstate-lazy/http-transfer-state.component.ts @@ -31,7 +31,7 @@ export class TransferStateComponent implements OnInit { ngOnInit(): void { // Test that HTTP cache works when HTTP call is made in a lifecycle hook. - this.httpClient.get('http://localhost:4206/api-2').subscribe((response) => { + this.httpClient.get('/api-2').subscribe((response) => { this.responseTwo = response.data; }); } diff --git a/packages/common/http/public_api.ts b/packages/common/http/public_api.ts index 4a0a4c30ca52d..277680b844510 100644 --- a/packages/common/http/public_api.ts +++ b/packages/common/http/public_api.ts @@ -21,3 +21,6 @@ export {HttpDownloadProgressEvent, HttpErrorResponse, HttpEvent, HttpEventType, export {HttpTransferCacheOptions, withHttpTransferCache as ɵwithHttpTransferCache} from './src/transfer_cache'; export {HttpXhrBackend} from './src/xhr'; export {HttpXsrfTokenExtractor} from './src/xsrf'; + +// Private exports +export * from './src/private_export'; diff --git a/packages/common/http/src/private_export.ts b/packages/common/http/src/private_export.ts new file mode 100644 index 0000000000000..d5b0ff7cb9f87 --- /dev/null +++ b/packages/common/http/src/private_export.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +export {HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS} from './interceptor'; diff --git a/packages/common/http/src/transfer_cache.ts b/packages/common/http/src/transfer_cache.ts index 9e7247e658da7..78f31ab849704 100644 --- a/packages/common/http/src/transfer_cache.ts +++ b/packages/common/http/src/transfer_cache.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {APP_BOOTSTRAP_LISTENER, ApplicationRef, inject, InjectionToken, makeStateKey, Provider, StateKey, TransferState, ɵENABLED_SSR_FEATURES as ENABLED_SSR_FEATURES, ɵformatRuntimeError as formatRuntimeError, ɵtruncateMiddle as truncateMiddle, ɵwhenStable as whenStable} from '@angular/core'; +import {APP_BOOTSTRAP_LISTENER, ApplicationRef, inject, InjectionToken, makeStateKey, Provider, StateKey, TransferState, ɵformatRuntimeError as formatRuntimeError, ɵtruncateMiddle as truncateMiddle, ɵwhenStable as whenStable} from '@angular/core'; import {Observable, of} from 'rxjs'; import {tap} from 'rxjs/operators'; @@ -201,7 +201,7 @@ export function withHttpTransferCache(cacheOptions: HttpTransferCacheOptions): P { provide: CACHE_OPTIONS, useFactory: (): CacheOptions => { - inject(ENABLED_SSR_FEATURES).add('httpcache'); + performance.mark('mark_use_counter', {detail: {feature: 'NgHttpTransferCache'}}); return {isCacheActive: true, ...cacheOptions}; } }, diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts index 183667b5d92c7..e0534583c2ca5 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts @@ -1327,12 +1327,15 @@ class TcbSwitchOp extends TcbOp { } override execute(): null { - const expression = tcbExpression(this.block.expression, this.tcb, this.scope); - // Since we'll use the expression in multiple comparisons, we don't want to // log the same diagnostic more than once. Ignore this expression since we already // produced a `TcbExpressionOp`. - markIgnoreDiagnostics(expression); + const comparisonExpression = tcbExpression(this.block.expression, this.tcb, this.scope); + markIgnoreDiagnostics(comparisonExpression); + + // Wrap the comparisson expression in parentheses so we don't ignore + // diagnostics when comparing incompatible types (see #52315). + const expression = ts.factory.createParenthesizedExpression(comparisonExpression); const root = this.generateCase(0, expression, null); if (root !== undefined) { diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts index ddd10ebb4b368..6c5b4fc9e5a08 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts @@ -1468,8 +1468,8 @@ describe('type check blocks', () => { expect(tcb(TEMPLATE)) .toContain( - 'if (((this).expr) === 1) { "" + ((this).one()); } else if ' + - '(((this).expr) === 2) { "" + ((this).two()); } else { "" + ((this).default()); }'); + 'if ((((this).expr)) === 1) { "" + ((this).one()); } else if ' + + '((((this).expr)) === 2) { "" + ((this).two()); } else { "" + ((this).default()); }'); }); it('should generate a switch block that only has a default case', () => { @@ -1501,9 +1501,10 @@ describe('type check blocks', () => { const result = tcb(TEMPLATE); - expect(result).toContain(`if (((this).expr) === 1) (this).one();`); - expect(result).toContain(`if (((this).expr) === 2) (this).two();`); - expect(result).toContain(`if (((this).expr) !== 1 && ((this).expr) !== 2) (this).default();`); + expect(result).toContain(`if ((((this).expr)) === 1) (this).one();`); + expect(result).toContain(`if ((((this).expr)) === 2) (this).two();`); + expect(result).toContain( + `if ((((this).expr)) !== 1 && (((this).expr)) !== 2) (this).default();`); }); it('should generate a switch block inside a template', () => { @@ -1526,8 +1527,8 @@ describe('type check blocks', () => { expect(tcb(TEMPLATE)) .toContain( 'var _t1: any = null!; { var _t2 = (_t1.exp); _t2(); ' + - 'if (_t2() === "one") { "" + ((this).one()); } ' + - 'else if (_t2() === "two") { "" + ((this).two()); } ' + + 'if ((_t2()) === "one") { "" + ((this).one()); } ' + + 'else if ((_t2()) === "two") { "" + ((this).two()); } ' + 'else { "" + ((this).default()); } }'); }); }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json index f10cd5e366be1..2b96eddb5cba4 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json @@ -223,8 +223,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a for block with an empty block", @@ -241,8 +240,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a for block that tracks by index", @@ -259,8 +257,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a for block that tracks by a field on the item", @@ -277,8 +274,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a nested for block", @@ -295,8 +291,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a for block with template variables", @@ -313,8 +308,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a for block with aliased template variables", @@ -331,8 +325,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should be able to refer to aliased template variables in nested for blocks", @@ -349,8 +342,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should be able to use for loop variables in an event listener", @@ -367,8 +359,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should parenthesize context variables used in an expression", @@ -385,8 +376,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should implicitly allocate data slots for primary and empty block", @@ -403,8 +393,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should not expose for loop variables to the surrounding scope", @@ -421,8 +410,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should optimize tracking function that calls a method on the component with $index and the item from the root template", @@ -439,8 +427,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should optimize tracking function that calls a method on the component with $index and the item from a nested template", @@ -457,8 +444,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should reuse identical pure tracking functions", @@ -475,8 +461,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should reuse identical impure tracking functions", @@ -493,8 +478,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should preserve object and array literals inside tracking expressions", @@ -511,8 +495,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate an for loop block using a pipe in its expression", @@ -529,8 +512,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] } ] -} +} \ No newline at end of file diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js index 03cb9913909d1..37bb40bff2c88 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_aliased_template_variables_template.js @@ -3,9 +3,9 @@ function MyApp_For_3_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const idx_r2 = ctx.$index; - const co_r3 = ctx.$count; - $r3$.ɵɵtextInterpolate6(" Index: ", idx_r2, " First: ", idx_r2 === 0, " Last: ", idx_r2 === co_r3 - 1, " Even: ", idx_r2 % 2 === 0, " Odd: ", idx_r2 % 2 !== 0, " Count: ", co_r3, " "); + const $idx_r2$ = ctx.$index; + const $co_r3$ = ctx.$count; + $r3$.ɵɵtextInterpolate6(" Index: ", $idx_r2$, " First: ", $idx_r2$ === 0, " Last: ", $idx_r2$ === $co_r3$ - 1, " Even: ", $idx_r2$ % 2 === 0, " Odd: ", $idx_r2$ % 2 !== 0, " Count: ", $co_r3$, " "); } } … diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js index 6e817aac928ab..7d92b1a16adf7 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_listener_template.js @@ -1,13 +1,13 @@ function MyApp_For_3_Template(rf, ctx) { if (rf & 1) { - const _r5 = $r3$.ɵɵgetCurrentView(); + const $_r5$ = $r3$.ɵɵgetCurrentView(); $r3$.ɵɵelementStart(0, "div", 0); $r3$.ɵɵlistener("click", function MyApp_For_3_Template_div_click_0_listener() { - const restoredCtx = $r3$.ɵɵrestoreView(_r5); - const $index_r2 = restoredCtx.$index; - const $count_r3 = restoredCtx.$count; - const ctx_r4 = $r3$.ɵɵnextContext(); - return $r3$.ɵɵresetView(ctx_r4.log($index_r2, $index_r2 % 2 === 0, $index_r2 === 0, $count_r3)); + const $restoredCtx$ = $r3$.ɵɵrestoreView($_r5$); + const $index_r2$ = $restoredCtx$.$index; + const $count_r3$ = $restoredCtx$.$count; + const $ctx_r4$ = $r3$.ɵɵnextContext(); + return $r3$.ɵɵresetView($ctx_r4$.log($index_r2$, $index_r2$ % 2 === 0, $index_r2$ === 0, $count_r3$)); }); $r3$.ɵɵelementEnd(); } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js index 19fe4cdfaad85..318d36737e95b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_scope_template.js @@ -3,9 +3,9 @@ function MyApp_For_2_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const $index_r2 = ctx.$index; - const $count_r3 = ctx.$count; - $r3$.ɵɵtextInterpolate4(" ", $index_r2, " ", $count_r3, " ", $index_r2 === 0, " ", $index_r2 === $count_r3 - 1, " "); + const $index_r2$ = ctx.$index; + const $count_r3$ = ctx.$count; + $r3$.ɵɵtextInterpolate4(" ", $index_r2$, " ", $count_r3$, " ", $index_r2$ === 0, " ", $index_r2$ === $count_r3$ - 1, " "); } } … diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js index 8469eb53ee48c..2b59b289be744 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_template_variables_template.js @@ -3,9 +3,9 @@ function MyApp_For_3_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const $index_r2 = ctx.$index; - const $count_r3 = ctx.$count; - $r3$.ɵɵtextInterpolate6(" Index: ", $index_r2, " First: ", $index_r2 === 0, " Last: ", $index_r2 === $count_r3 - 1, " Even: ", $index_r2 % 2 === 0, " Odd: ", $index_r2 % 2 !== 0, " Count: ", $count_r3, " "); + const $index_r2$ = ctx.$index; + const $count_r3$ = ctx.$count; + $r3$.ɵɵtextInterpolate6(" Index: ", $index_r2$, " First: ", $index_r2$ === 0, " Last: ", $index_r2$ === $count_r3$ - 1, " Even: ", $index_r2$ % 2 === 0, " Odd: ", $index_r2$ % 2 !== 0, " Count: ", $count_r3$, " "); } } … diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_variables_expression_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_variables_expression_template.js index fa1ea2e56c6d3..bd86ab1956f71 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_variables_expression_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_variables_expression_template.js @@ -3,7 +3,7 @@ function MyApp_For_1_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const $index_r2 = ctx.$index; - $r3$.ɵɵtextInterpolate1(" ", ($index_r2 % 2 !== 0) + "", " "); + const $index_r2$ = ctx.$index; + $r3$.ɵɵtextInterpolate1(" ", ($index_r2$ % 2 !== 0) + "", " "); } } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_with_empty_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_with_empty_template.js index a721b02fba7a1..f4f411557d8a0 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_with_empty_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/for_with_empty_template.js @@ -3,8 +3,8 @@ function MyApp_For_3_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const item_r2 = ctx.$implicit; - $r3$.ɵɵtextInterpolate1(" ", item_r2.name, " "); + const $item_r2$ = ctx.$implicit; + $r3$.ɵɵtextInterpolate1(" ", $item_r2$.name, " "); } } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template.js index 596ac9770bb5a..bd60b00b9577f 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template.js @@ -3,9 +3,9 @@ function MyApp_For_3_For_2_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const subitem_r5 = ctx.$implicit; - const item_r1 = $r3$.ɵɵnextContext().$implicit; - $r3$.ɵɵtextInterpolate2(" ", subitem_r5, " from ", item_r1.name, " "); + const $subitem_r5$ = ctx.$implicit; + const $item_r1$ = $r3$.ɵɵnextContext().$implicit; + $r3$.ɵɵtextInterpolate2(" ", $subitem_r5$, " from ", $item_r1$.name, " "); } } @@ -15,9 +15,9 @@ function MyApp_For_3_Template(rf, ctx) { $r3$.ɵɵrepeaterCreate(1, MyApp_For_3_For_2_Template, 1, 2, $r3$.ɵɵrepeaterTrackByIndex); } if (rf & 2) { - const item_r1 = ctx.$implicit; - $r3$.ɵɵtextInterpolate1(" ", item_r1.name, " "); - $r3$.ɵɵrepeater(1, item_r1.subItems); + const $item_r1$ = ctx.$implicit; + $r3$.ɵɵtextInterpolate1(" ", $item_r1$.name, " "); + $r3$.ɵɵrepeater(1, $item_r1$.subItems); } } … diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template_variables_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template_variables_template.js index b361148616a72..40a371c87b6ae 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template_variables_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/nested_for_template_variables_template.js @@ -3,9 +3,9 @@ function MyApp_For_3_For_2_Template(rf, ctx) { $r3$.ɵɵtext(0); } if (rf & 2) { - const $count_r7 = ctx.$count; - const outerCount_r3 = $r3$.ɵɵnextContext().$count; - $r3$.ɵɵtextInterpolate2(" Outer: ", outerCount_r3, " Inner: ", $count_r7, " "); + const $count_r7$ = ctx.$count; + const $outerCount_r3$ = $r3$.ɵɵnextContext().$count; + $r3$.ɵɵtextInterpolate2(" Outer: ", $outerCount_r3$, " Inner: ", $count_r7$, " "); } } @@ -15,9 +15,9 @@ function MyApp_For_3_Template(rf, ctx) { $r3$.ɵɵrepeaterCreate(1, MyApp_For_3_For_2_Template, 1, 2, $r3$.ɵɵrepeaterTrackByIdentity); } if (rf & 2) { - const item_r1 = ctx.$implicit; - $r3$.ɵɵtextInterpolate1(" ", item_r1.name, " "); - $r3$.ɵɵrepeater(1, item_r1.subItems); + const $item_r1$ = ctx.$implicit; + $r3$.ɵɵtextInterpolate1(" ", $item_r1$.name, " "); + $r3$.ɵɵrepeater(1, $item_r1$.subItems); } } … diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index ce2c910c16fda..00b576b753c2e 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -4294,6 +4294,31 @@ suppress ]); }); + it('should produce a diagnostic if @switch and @case have different types', () => { + env.write('test.ts', ` + import {Component} from '@angular/core'; + + @Component({ + template: \` + @switch (expr) { + @case (1) { + {{expr}} + } + } + \`, + standalone: true, + }) + export class Main { + expr = true; + } + `); + + const diags = env.driveDiagnostics(); + expect(diags.map(d => ts.flattenDiagnosticMessageText(d.messageText, ''))).toEqual([ + `This comparison appears to be unintentional because the types 'boolean' and 'number' have no overlap.`, + ]); + }); + it('should narrow the type in listener inside switch cases with expressions', () => { env.write('test.ts', ` import {Component} from '@angular/core'; diff --git a/packages/compiler/src/ml_parser/ast.ts b/packages/compiler/src/ml_parser/ast.ts index 776fbffaaff24..1d608a28861a4 100644 --- a/packages/compiler/src/ml_parser/ast.ts +++ b/packages/compiler/src/ml_parser/ast.ts @@ -89,8 +89,8 @@ export class Comment implements BaseNode { export class Block implements BaseNode { constructor( public name: string, public parameters: BlockParameter[], public children: Node[], - public sourceSpan: ParseSourceSpan, public startSourceSpan: ParseSourceSpan, - public endSourceSpan: ParseSourceSpan|null = null) {} + public sourceSpan: ParseSourceSpan, public nameSpan: ParseSourceSpan, + public startSourceSpan: ParseSourceSpan, public endSourceSpan: ParseSourceSpan|null = null) {} visit(visitor: Visitor, context: any) { return visitor.visitBlock(this, context); diff --git a/packages/compiler/src/ml_parser/html_whitespaces.ts b/packages/compiler/src/ml_parser/html_whitespaces.ts index 279cf78892378..3863ad078e72d 100644 --- a/packages/compiler/src/ml_parser/html_whitespaces.ts +++ b/packages/compiler/src/ml_parser/html_whitespaces.ts @@ -101,7 +101,7 @@ export class WhitespaceVisitor implements html.Visitor { visitBlock(block: html.Block, context: any): any { return new html.Block( block.name, block.parameters, visitAllWithSiblings(this, block.children), block.sourceSpan, - block.startSourceSpan, block.endSourceSpan); + block.nameSpan, block.startSourceSpan, block.endSourceSpan); } visitBlockParameter(parameter: html.BlockParameter, context: any) { diff --git a/packages/compiler/src/ml_parser/icu_ast_expander.ts b/packages/compiler/src/ml_parser/icu_ast_expander.ts index 6f56a46dd208c..613fff283e644 100644 --- a/packages/compiler/src/ml_parser/icu_ast_expander.ts +++ b/packages/compiler/src/ml_parser/icu_ast_expander.ts @@ -91,7 +91,7 @@ class _Expander implements html.Visitor { visitBlock(block: html.Block, context: any) { return new html.Block( block.name, block.parameters, html.visitAll(this, block.children), block.sourceSpan, - block.startSourceSpan, block.endSourceSpan); + block.nameSpan, block.startSourceSpan, block.endSourceSpan); } visitBlockParameter(parameter: html.BlockParameter, context: any) { diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts index 8ab09b013ce37..f2842341809ff 100644 --- a/packages/compiler/src/ml_parser/lexer.ts +++ b/packages/compiler/src/ml_parser/lexer.ts @@ -918,7 +918,7 @@ class _Tokenizer { } if (this._tokenizeBlocks && !this._inInterpolation && !this._isInExpansion() && - (this._isBlockStart() || this._cursor.peek() === chars.$RBRACE)) { + (this._cursor.peek() === chars.$AT || this._cursor.peek() === chars.$RBRACE)) { return true; } @@ -944,19 +944,6 @@ class _Tokenizer { return false; } - private _isBlockStart(): boolean { - if (this._tokenizeBlocks && this._cursor.peek() === chars.$AT) { - const tmp = this._cursor.clone(); - - // If it is, also verify that the next character is a valid block identifier. - tmp.advance(); - if (isBlockNameChar(tmp.peek())) { - return true; - } - } - return false; - } - private _readUntil(char: number): string { const start = this._cursor.clone(); this._attemptUntilChar(char); diff --git a/packages/compiler/src/ml_parser/parser.ts b/packages/compiler/src/ml_parser/parser.ts index 45aaca43e8f4a..d70550790573a 100644 --- a/packages/compiler/src/ml_parser/parser.ts +++ b/packages/compiler/src/ml_parser/parser.ts @@ -474,7 +474,7 @@ class _TreeBuilder { const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); // Create a separate `startSpan` because `span` will be modified when there is an `end` span. const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); - const block = new html.Block(token.parts[0], parameters, [], span, startSpan); + const block = new html.Block(token.parts[0], parameters, [], span, token.sourceSpan, startSpan); this._pushContainer(block, false); } @@ -500,7 +500,7 @@ class _TreeBuilder { const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); // Create a separate `startSpan` because `span` will be modified when there is an `end` span. const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); - const block = new html.Block(token.parts[0], parameters, [], span, startSpan); + const block = new html.Block(token.parts[0], parameters, [], span, token.sourceSpan, startSpan); this._pushContainer(block, false); // Incomplete blocks don't have children so we close them immediately and report an error. diff --git a/packages/compiler/src/render3/r3_ast.ts b/packages/compiler/src/render3/r3_ast.ts index c182e9eb1d378..6fe2c2346dd5b 100644 --- a/packages/compiler/src/render3/r3_ast.ts +++ b/packages/compiler/src/render3/r3_ast.ts @@ -315,7 +315,8 @@ export class IfBlockBranch implements Node { } export class UnknownBlock implements Node { - constructor(public name: string, public sourceSpan: ParseSourceSpan) {} + constructor( + public name: string, public sourceSpan: ParseSourceSpan, public nameSpan: ParseSourceSpan) {} visit(visitor: Visitor): Result { return visitor.visitUnknownBlock(this); diff --git a/packages/compiler/src/render3/r3_control_flow.ts b/packages/compiler/src/render3/r3_control_flow.ts index 9e48563ac2e0c..b5960f15baf99 100644 --- a/packages/compiler/src/render3/r3_control_flow.ts +++ b/packages/compiler/src/render3/r3_control_flow.ts @@ -163,7 +163,7 @@ export function createSwitchBlock( } if ((node.name !== 'case' || node.parameters.length === 0) && node.name !== 'default') { - unknownBlocks.push(new t.UnknownBlock(node.name, node.sourceSpan)); + unknownBlocks.push(new t.UnknownBlock(node.name, node.sourceSpan, node.nameSpan)); continue; } diff --git a/packages/compiler/src/render3/r3_template_transform.ts b/packages/compiler/src/render3/r3_template_transform.ts index 5706b60a30ed5..ee43a862ea8e4 100644 --- a/packages/compiler/src/render3/r3_template_transform.ts +++ b/packages/compiler/src/render3/r3_template_transform.ts @@ -383,7 +383,7 @@ class HtmlAstToIvyAst implements html.Visitor { } result = { - node: new t.UnknownBlock(block.name, block.sourceSpan), + node: new t.UnknownBlock(block.name, block.sourceSpan, block.nameSpan), errors: [new ParseError(block.sourceSpan, errorMessage)], }; break; diff --git a/packages/compiler/src/template/pipeline/ir/src/enums.ts b/packages/compiler/src/template/pipeline/ir/src/enums.ts index 9cec6f5078871..f91b0535eb6da 100644 --- a/packages/compiler/src/template/pipeline/ir/src/enums.ts +++ b/packages/compiler/src/template/pipeline/ir/src/enums.ts @@ -185,6 +185,16 @@ export enum OpKind { */ Projection, + /** + * Create a repeater creation instruction op. + */ + RepeaterCreate, + + /** + * An update up for a repeater. + */ + Repeater, + /** * The start of an i18n block. */ @@ -235,6 +245,11 @@ export enum ExpressionKind { */ Context, + /** + * A reference to the view context, for use inside a track function. + */ + TrackContext, + /** * Read of a variable declared in a `VariableOp`. */ @@ -334,8 +349,24 @@ export enum ExpressionKind { * A test expression for a conditional op. */ ConditionalCase, + + /** + * A variable for use inside a repeater, providing one of the ambiently-available context + * properties ($even, $first, etc.). + */ + DerivedRepeaterVar, } +export enum VariableFlags { + None = 0b0000, + + /** + * Always inline this variable, regardless of the number of times it's used. + * An `AlwaysInline` variable may not depend on context, because doing so may cause side effects + * that are illegal when multi-inlined. (The optimizer will enforce this constraint.) + */ + AlwaysInline = 0b0001, +} /** * Distinguishes between different kinds of `SemanticVariable`s. */ @@ -354,6 +385,11 @@ export enum SemanticVariableKind { * Represents a saved state that can be used to restore a view in a listener handler function. */ SavedView, + + /** + * An alias generated by a special embedded view type (e.g. a `@for` block). + */ + Alias, } /** diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index a58313bd90068..9e77c8f47cf5a 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -20,11 +20,11 @@ import {Interpolation, type UpdateOp} from './ops/update'; /** * An `o.Expression` subtype representing a logical expression in the intermediate representation. */ -export type Expression = - LexicalReadExpr|ReferenceExpr|ContextExpr|NextContextExpr|GetCurrentViewExpr|RestoreViewExpr| - ResetViewExpr|ReadVariableExpr|PureFunctionExpr|PureFunctionParameterExpr|PipeBindingExpr| - PipeBindingVariadicExpr|SafePropertyReadExpr|SafeKeyedReadExpr|SafeInvokeFunctionExpr|EmptyExpr| - AssignTemporaryExpr|ReadTemporaryExpr|SanitizerExpr|SlotLiteralExpr|ConditionalCaseExpr; +export type Expression = LexicalReadExpr|ReferenceExpr|ContextExpr|NextContextExpr| + GetCurrentViewExpr|RestoreViewExpr|ResetViewExpr|ReadVariableExpr|PureFunctionExpr| + PureFunctionParameterExpr|PipeBindingExpr|PipeBindingVariadicExpr|SafePropertyReadExpr| + SafeKeyedReadExpr|SafeInvokeFunctionExpr|EmptyExpr|AssignTemporaryExpr|ReadTemporaryExpr| + SanitizerExpr|SlotLiteralExpr|ConditionalCaseExpr|DerivedRepeaterVarExpr; /** * Transformer type which converts expressions into general `o.Expression`s (which may be an @@ -69,8 +69,11 @@ export class LexicalReadExpr extends ExpressionBase { override visitExpression(visitor: o.ExpressionVisitor, context: any): void {} - override isEquivalent(): boolean { - return false; + override isEquivalent(other: LexicalReadExpr): boolean { + // We assume that the lexical reads are in the same context, which must be true for parent + // expressions to be equivalent. + // TODO: is this generally safe? + return this.name === other.name; } override isConstant(): boolean { @@ -144,6 +147,33 @@ export class ContextExpr extends ExpressionBase { } } +/** + * A reference to the current view context inside a track function. + */ +export class TrackContextExpr extends ExpressionBase { + override readonly kind = ExpressionKind.TrackContext; + + constructor(readonly view: XrefId) { + super(); + } + + override visitExpression(): void {} + + override isEquivalent(e: o.Expression): boolean { + return e instanceof TrackContextExpr && e.view === this.view; + } + + override isConstant(): boolean { + return false; + } + + override transformInternalExpressions(): void {} + + override clone(): TrackContextExpr { + return new TrackContextExpr(this.view); + } +} + /** * Runtime operation to navigate to the next view context in the view hierarchy. */ @@ -806,6 +836,39 @@ export class ConditionalCaseExpr extends ExpressionBase { } } +export enum DerivedRepeaterVarIdentity { + First, + Last, + Even, + Odd, +} + +export class DerivedRepeaterVarExpr extends ExpressionBase { + override readonly kind = ExpressionKind.DerivedRepeaterVar; + + constructor(readonly xref: XrefId, readonly identity: DerivedRepeaterVarIdentity) { + super(); + } + + override transformInternalExpressions(transform: ExpressionTransform, flags: VisitorContextFlag): + void {} + + override visitExpression(visitor: o.ExpressionVisitor, context: any) {} + + override isEquivalent(e: o.Expression): boolean { + return e instanceof DerivedRepeaterVarExpr && e.identity === this.identity && + e.xref === this.xref; + } + + override isConstant(): boolean { + return false; + } + + override clone(): o.Expression { + return new DerivedRepeaterVarExpr(this.xref, this.identity); + } +} + /** * Visits all `Expression`s in the AST of `op` with the `visitor` function. */ @@ -903,6 +966,15 @@ export function transformExpressionsInOp( transformExpressionsInStatement(statement, transform, flags); } break; + case OpKind.RepeaterCreate: + op.track = transformExpressionsInExpression(op.track, transform, flags); + if (op.trackByFn !== null) { + op.trackByFn = transformExpressionsInExpression(op.trackByFn, transform, flags); + } + break; + case OpKind.Repeater: + op.collection = transformExpressionsInExpression(op.collection, transform, flags); + break; case OpKind.I18n: case OpKind.I18nStart: for (const [placeholder, expression] of op.params) { diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts index 132b23e8388d7..cf9a14a72c74e 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts @@ -20,24 +20,24 @@ import type {UpdateOp} from './update'; /** * An operation usable on the creation side of the IR. */ -export type CreateOp = - ListEndOp|StatementOp|ElementOp|ElementStartOp|ElementEndOp|ContainerOp| - ContainerStartOp|ContainerEndOp|TemplateOp|EnableBindingsOp|DisableBindingsOp|TextOp|ListenerOp| - PipeOp|VariableOp|NamespaceOp|ProjectionDefOp|ProjectionOp|ExtractedAttributeOp| - DeferOp|DeferSecondaryBlockOp|DeferOnOp|ExtractedMessageOp|I18nOp|I18nStartOp|I18nEndOp|IcuOp; +export type CreateOp = ListEndOp|StatementOp|ElementOp|ElementStartOp| + ElementEndOp|ContainerOp|ContainerStartOp|ContainerEndOp|TemplateOp|EnableBindingsOp| + DisableBindingsOp|TextOp|ListenerOp|PipeOp|VariableOp|NamespaceOp|ProjectionDefOp| + ProjectionOp|ExtractedAttributeOp|DeferOp|DeferSecondaryBlockOp|DeferOnOp|RepeaterCreateOp| + ExtractedMessageOp|I18nOp|I18nStartOp|I18nEndOp|IcuOp; /** * An operation representing the creation of an element or container. */ export type ElementOrContainerOps = - ElementOp|ElementStartOp|ContainerOp|ContainerStartOp|TemplateOp|ProjectionOp; + ElementOp|ElementStartOp|ContainerOp|ContainerStartOp|TemplateOp|ProjectionOp|RepeaterCreateOp; /** * The set of OpKinds that represent the creation of an element or container */ const elementContainerOpKinds = new Set([ OpKind.Element, OpKind.ElementStart, OpKind.Container, OpKind.ContainerStart, OpKind.Template, - OpKind.Projection + OpKind.Projection, OpKind.RepeaterCreate ]); /** @@ -102,7 +102,7 @@ export interface ElementOrContainerOpBase extends Op, ConsumesSlotOpTr } export interface ElementOpBase extends ElementOrContainerOpBase { - kind: OpKind.Element|OpKind.ElementStart|OpKind.Template; + kind: OpKind.Element|OpKind.ElementStart|OpKind.Template|OpKind.RepeaterCreate; /** * The HTML tag name for this element. @@ -215,6 +215,89 @@ export function createTemplateOp( }; } +/** + * An op that creates a repeater (e.g. a for loop). + */ +export interface RepeaterCreateOp extends ElementOpBase { + kind: OpKind.RepeaterCreate; + + /** + * The number of declaration slots used by this repeater's template, or `null` if slots have not + * yet been assigned. + */ + decls: number|null; + + /** + * The number of binding variable slots used by this repeater's, or `null` if binding variables + * have not yet been counted. + */ + vars: number|null; + + /** + * The Xref of the empty view function. (For the primary view function, use the `xref` property). + */ + emptyView: XrefId|null; + + /** + * The track expression to use while iterating. + */ + track: o.Expression; + + /** + * `null` initially, then an `o.Expression`. Might be a track expression, or might be a reference + * into the constant pool. + */ + trackByFn: o.Expression|null; + + /** + * Context variables avaialable in this block. + */ + varNames: RepeaterVarNames; + + /** + * Whether the repeater track function relies on the component instance. + */ + usesComponentInstance: boolean; + + sourceSpan: ParseSourceSpan; +} + +// TODO: add source spans? +export interface RepeaterVarNames { + $index: string; + $count: string; + $first: string; + $last: string; + $even: string; + $odd: string; + $implicit: string; +} + +export function createRepeaterCreateOp( + primaryView: XrefId, emptyView: XrefId|null, track: o.Expression, varNames: RepeaterVarNames, + sourceSpan: ParseSourceSpan): RepeaterCreateOp { + return { + kind: OpKind.RepeaterCreate, + attributes: null, + xref: primaryView, + emptyView, + track, + trackByFn: null, + tag: 'For', + namespace: Namespace.HTML, + nonBindable: false, + localRefs: [], + decls: null, + vars: null, + varNames, + usesComponentInstance: false, + sourceSpan, + ...TRAIT_CONSUMES_SLOT, + ...NEW_OP, + numSlotsUsed: emptyView === null ? 2 : 3, + }; +} + /** * Logical operation representing the end of an element structure in the creation IR. * diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/shared.ts b/packages/compiler/src/template/pipeline/ir/src/ops/shared.ts index 07ee7aa93c600..306c0b6780b11 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/shared.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/shared.ts @@ -7,7 +7,7 @@ */ import * as o from '../../../../../output/output_ast'; -import {OpKind} from '../enums'; +import {OpKind, VariableFlags} from '../enums'; import {Op, XrefId} from '../operations'; import {SemanticVariable} from '../variable'; @@ -68,18 +68,22 @@ export interface VariableOp> extends Op { * Expression representing the value of the variable. */ initializer: o.Expression; + + flags: VariableFlags; } /** * Create a `VariableOp`. */ export function createVariableOp>( - xref: XrefId, variable: SemanticVariable, initializer: o.Expression): VariableOp { + xref: XrefId, variable: SemanticVariable, initializer: o.Expression, + flags: VariableFlags): VariableOp { return { kind: OpKind.Variable, xref, variable, initializer, + flags, ...NEW_OP, }; } diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/update.ts b/packages/compiler/src/template/pipeline/ir/src/ops/update.ts index 1e6ccb82cf386..28c23d7b21f53 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/update.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/update.ts @@ -13,7 +13,7 @@ import {ParseSourceSpan} from '../../../../../parse_util'; import {BindingKind, I18nParamResolutionTime, OpKind} from '../enums'; import type {ConditionalCaseExpr} from '../expression'; import {Op, XrefId} from '../operations'; -import {ConsumesVarsTrait, DependsOnSlotContextOpTrait, TRAIT_CONSUMES_VARS, TRAIT_DEPENDS_ON_SLOT_CONTEXT, TRAIT_USES_SLOT_INDEX, UsesSlotIndexTrait} from '../traits'; +import {ConsumesSlotOpTrait, ConsumesVarsTrait, DependsOnSlotContextOpTrait, TRAIT_CONSUMES_SLOT, TRAIT_CONSUMES_VARS, TRAIT_DEPENDS_ON_SLOT_CONTEXT, TRAIT_USES_SLOT_INDEX, UsesSlotIndexTrait} from '../traits'; import type {HostPropertyOp} from './host'; import {ListEndOp, NEW_OP, StatementOp, VariableOp} from './shared'; @@ -24,7 +24,7 @@ import {ListEndOp, NEW_OP, StatementOp, VariableOp} from './shared'; */ export type UpdateOp = ListEndOp|StatementOp|PropertyOp|AttributeOp|StylePropOp| ClassPropOp|StyleMapOp|ClassMapOp|InterpolateTextOp|AdvanceOp|VariableOp|BindingOp| - HostPropertyOp|ConditionalOp|I18nExpressionOp|I18nApplyOp|IcuUpdateOp; + HostPropertyOp|ConditionalOp|I18nExpressionOp|I18nApplyOp|IcuUpdateOp|RepeaterOp; /** * A logical operation to perform string interpolation on a text node. @@ -535,6 +535,34 @@ export function createConditionalOp( }; } +export interface RepeaterOp extends Op, UsesSlotIndexTrait { + kind: OpKind.Repeater; + + /** + * The RepeaterCreate op associated with this repeater. + */ + target: XrefId; + + /** + * The collection provided to the for loop as its expression. + */ + collection: o.Expression; + + sourceSpan: ParseSourceSpan; +} + +export function createRepeaterOp( + repeaterCreate: XrefId, collection: o.Expression, sourceSpan: ParseSourceSpan): RepeaterOp { + return { + kind: OpKind.Repeater, + target: repeaterCreate, + collection, + sourceSpan, + ...NEW_OP, + ...TRAIT_USES_SLOT_INDEX, + }; +} + /** * An op that represents an expression in an i18n message. */ @@ -571,6 +599,8 @@ export interface I18nExpressionOp extends Op, ConsumesVarsTrait, sourceSpan: ParseSourceSpan; } + + /** * Create an i18n expression op. */ @@ -598,7 +628,7 @@ export interface I18nApplyOp extends Op, UsesSlotIndexTrait { kind: OpKind.I18nApply; /** - * The i18n block to which expressions are applied. + * The i18n block to which expressions are applied */ target: XrefId; @@ -606,7 +636,7 @@ export interface I18nApplyOp extends Op, UsesSlotIndexTrait { } /** - * Creates an op to apply i18n expression ops. + *Creates an op to apply i18n expression ops */ export function createI18nApplyOp(target: XrefId, sourceSpan: ParseSourceSpan): I18nApplyOp { return { diff --git a/packages/compiler/src/template/pipeline/ir/src/variable.ts b/packages/compiler/src/template/pipeline/ir/src/variable.ts index 6980b70572de9..50eb7f5d9de44 100644 --- a/packages/compiler/src/template/pipeline/ir/src/variable.ts +++ b/packages/compiler/src/template/pipeline/ir/src/variable.ts @@ -6,13 +6,14 @@ * found in the LICENSE file at https://angular.io/license */ +import * as o from '../../../../output/output_ast'; import type {SemanticVariableKind} from './enums'; import type {XrefId} from './operations'; /** * Union type for the different kinds of variables. */ -export type SemanticVariable = ContextVariable|IdentifierVariable|SavedViewVariable; +export type SemanticVariable = ContextVariable|IdentifierVariable|SavedViewVariable|AliasVariable; export interface SemanticVariableBase { kind: SemanticVariableKind; @@ -64,3 +65,13 @@ export interface SavedViewVariable extends SemanticVariableBase { */ view: XrefId; } + +/** + * A variable that will be inlined at every location it is used. An alias is also allowed to depend + * on the value of a semantic variable. + */ +export interface AliasVariable extends SemanticVariableBase { + kind: SemanticVariableKind.Alias; + identifier: string; + expression: o.Expression; +} diff --git a/packages/compiler/src/template/pipeline/src/compilation.ts b/packages/compiler/src/template/pipeline/src/compilation.ts index b89fc3a3cbdec..dfcb07ab545ed 100644 --- a/packages/compiler/src/template/pipeline/src/compilation.ts +++ b/packages/compiler/src/template/pipeline/src/compilation.ts @@ -202,6 +202,12 @@ export class ViewCompilationUnit extends CompilationUnit { */ readonly contextVariables = new Map(); + /** + * Set of aliases available within this view. An alias is a variable whose provided expression is + * inlined at every location it is used. It may also depend on context variables, by name. + */ + readonly aliases = new Set(); + /** * Number of declaration slots used within this view, or `null` if slots have not yet been * allocated. diff --git a/packages/compiler/src/template/pipeline/src/emit.ts b/packages/compiler/src/template/pipeline/src/emit.ts index 4f57ef02f042d..31b62ec6077d8 100644 --- a/packages/compiler/src/template/pipeline/src/emit.ts +++ b/packages/compiler/src/template/pipeline/src/emit.ts @@ -1,4 +1,5 @@ /** + * * @license * Copyright Google LLC All Rights Reserved. * @@ -23,6 +24,7 @@ import {phaseConditionals} from './phases/conditionals'; import {phaseConstCollection} from './phases/const_collection'; import {phaseEmptyElements} from './phases/empty_elements'; import {phaseExpandSafeReads} from './phases/expand_safe_reads'; +import {phaseRepeaterDerivedVars} from './phases/repeater_derived_vars'; import {phaseGenerateAdvance} from './phases/generate_advance'; import {phaseGenerateProjectionDef} from './phases/generate_projection_def'; import {phaseGenerateVariables} from './phases/generate_variables'; @@ -61,6 +63,9 @@ import {phaseTemporaryVariables} from './phases/temporary_variables'; import {phaseVarCounting} from './phases/var_counting'; import {phaseVariableOptimization} from './phases/variable_optimization'; import {phaseWrapIcus} from './phases/wrap_icus'; +import {phaseTrackVariables} from './phases/track_variables'; +import {phaseTrackFnGeneration} from './phases/track_fn_generation'; +import {phaseTrackFnOptimization} from './phases/track_fn_optimization'; type Phase = { fn: (job: CompilationJob) => void; kind: Kind.Both | Kind.Host | Kind.Tmpl; @@ -96,7 +101,10 @@ const phases: Phase[] = [ {kind: Kind.Tmpl, fn: phaseSaveRestoreView}, {kind: Kind.Tmpl, fn: phaseFindAnyCasts}, {kind: Kind.Both, fn: phaseResolveDollarEvent}, + {kind: Kind.Tmpl, fn: phaseRepeaterDerivedVars}, + {kind: Kind.Tmpl, fn: phaseTrackVariables}, {kind: Kind.Both, fn: phaseResolveNames}, + {kind: Kind.Tmpl, fn: phaseTrackFnOptimization}, {kind: Kind.Both, fn: phaseResolveContexts}, {kind: Kind.Tmpl, fn: phaseResolveSanitizers}, // TODO: run in both {kind: Kind.Tmpl, fn: phaseLocalRefs}, @@ -105,6 +113,7 @@ const phases: Phase[] = [ {kind: Kind.Both, fn: phaseTemporaryVariables}, {kind: Kind.Tmpl, fn: phaseSlotAllocation}, {kind: Kind.Tmpl, fn: phaseResolveI18nPlaceholders}, + {kind: Kind.Tmpl, fn: phaseTrackFnGeneration}, {kind: Kind.Tmpl, fn: phaseI18nMessageExtraction}, {kind: Kind.Tmpl, fn: phaseI18nConstCollection}, {kind: Kind.Tmpl, fn: phaseConstTraitCollection}, diff --git a/packages/compiler/src/template/pipeline/src/ingest.ts b/packages/compiler/src/template/pipeline/src/ingest.ts index f3501a0164cca..5001e4ea3f2d7 100644 --- a/packages/compiler/src/template/pipeline/src/ingest.ts +++ b/packages/compiler/src/template/pipeline/src/ingest.ts @@ -14,6 +14,7 @@ import {splitNsName} from '../../../ml_parser/tags'; import * as o from '../../../output/output_ast'; import {ParseSourceSpan} from '../../../parse_util'; import * as t from '../../../render3/r3_ast'; +import {Identifiers} from '../../../render3/r3_identifiers'; import {BindingParser} from '../../../template_parser/binding_parser'; import * as ir from '../ir'; @@ -131,6 +132,8 @@ function ingestNodes(unit: ViewCompilationUnit, template: t.Node[]): void { ingestDeferBlock(unit, node); } else if (node instanceof t.Icu) { ingestIcu(unit, node); + } else if (node instanceof t.ForLoopBlock) { + ingestForBlock(unit, node); } else { throw new Error(`Unsupported template node: ${node.constructor.name}`); } @@ -395,6 +398,64 @@ function ingestIcu(unit: ViewCompilationUnit, icu: t.Icu) { } } +/** + * Ingest an `@for` block into the given `ViewCompilation`. + */ +function ingestForBlock(unit: ViewCompilationUnit, forBlock: t.ForLoopBlock): void { + const repeaterView = unit.job.allocateView(unit.xref); + + const createRepeaterAlias = (ident: string, repeaterVar: ir.DerivedRepeaterVarIdentity) => { + repeaterView.aliases.add({ + kind: ir.SemanticVariableKind.Alias, + name: null, + identifier: ident, + expression: new ir.DerivedRepeaterVarExpr(repeaterView.xref, repeaterVar), + }); + }; + + // Set all the context variables and aliases available in the repeater. + repeaterView.contextVariables.set(forBlock.item.name, forBlock.item.value); + repeaterView.contextVariables.set( + forBlock.contextVariables.$index.name, forBlock.contextVariables.$index.value); + repeaterView.contextVariables.set( + forBlock.contextVariables.$count.name, forBlock.contextVariables.$count.value); + createRepeaterAlias(forBlock.contextVariables.$first.name, ir.DerivedRepeaterVarIdentity.First); + createRepeaterAlias(forBlock.contextVariables.$last.name, ir.DerivedRepeaterVarIdentity.Last); + createRepeaterAlias(forBlock.contextVariables.$even.name, ir.DerivedRepeaterVarIdentity.Even); + createRepeaterAlias(forBlock.contextVariables.$odd.name, ir.DerivedRepeaterVarIdentity.Odd); + + const sourceSpan = convertSourceSpan(forBlock.trackBy.span, forBlock.sourceSpan); + const track = convertAst(forBlock.trackBy, unit.job, sourceSpan); + + ingestNodes(repeaterView, forBlock.children); + + let emptyView: ViewCompilationUnit|null = null; + if (forBlock.empty !== null) { + emptyView = unit.job.allocateView(unit.xref); + ingestNodes(emptyView, forBlock.empty.children); + } + + const varNames: ir.RepeaterVarNames = { + $index: forBlock.contextVariables.$index.name, + $count: forBlock.contextVariables.$count.name, + $first: forBlock.contextVariables.$first.name, + $last: forBlock.contextVariables.$last.name, + $even: forBlock.contextVariables.$even.name, + $odd: forBlock.contextVariables.$odd.name, + $implicit: forBlock.item.name, + }; + + const repeaterCreate = ir.createRepeaterCreateOp( + repeaterView.xref, emptyView?.xref ?? null, track, varNames, forBlock.sourceSpan); + unit.create.push(repeaterCreate); + + const expression = convertAst( + forBlock.expression, unit.job, + convertSourceSpan(forBlock.expression.span, forBlock.sourceSpan)); + const repeater = ir.createRepeaterOp(repeaterCreate.xref, expression, forBlock.sourceSpan); + unit.update.push(repeater); +} + /** * Convert a template AST expression into an output AST expression. */ @@ -452,7 +513,8 @@ function convertAst( } else if (ast instanceof e.LiteralMap) { const entries = ast.keys.map((key, idx) => { const value = ast.values[idx]; - // TODO: should literals have source maps, or do we just map the whole surrounding expression? + // TODO: should literals have source maps, or do we just map the whole surrounding + // expression? return new o.LiteralMapEntry(key.key, convertAst(value, job, baseSourceSpan), key.quoted); }); return new o.LiteralMapExpr(entries, undefined, convertSourceSpan(ast.span, baseSourceSpan)); diff --git a/packages/compiler/src/template/pipeline/src/instruction.ts b/packages/compiler/src/template/pipeline/src/instruction.ts index 430f5fb5d7a9a..d0d11ee5fe069 100644 --- a/packages/compiler/src/template/pipeline/src/instruction.ts +++ b/packages/compiler/src/template/pipeline/src/instruction.ts @@ -233,6 +233,33 @@ export function i18nStart(slot: number, constIndex: number, subTemplateIndex: nu return call(Identifiers.i18nStart, args, null); } +export function repeaterCreate( + slot: number, viewFnName: string, decls: number, vars: number, trackByFn: o.Expression, + trackByUsesComponentInstance: boolean, emptyViewFnName: string|null, emptyDecls: number|null, + emptyVars: number|null, sourceSpan: ParseSourceSpan|null): ir.CreateOp { + let args = [ + o.literal(slot), + o.variable(viewFnName), + o.literal(decls), + o.literal(vars), + trackByFn, + ]; + if (trackByUsesComponentInstance || emptyViewFnName !== null) { + args.push(o.literal(trackByUsesComponentInstance)); + if (emptyViewFnName !== null) { + args.push(o.variable(emptyViewFnName)); + args.push(o.literal(emptyDecls)); + args.push(o.literal(emptyVars)); + } + } + return call(Identifiers.repeaterCreate, args, sourceSpan); +} + +export function repeater( + metadataSlot: number, collection: o.Expression, sourceSpan: ParseSourceSpan|null): ir.UpdateOp { + return call(Identifiers.repeater, [o.literal(metadataSlot), collection], sourceSpan); +} + export function i18n(slot: number, constIndex: number, subTemplateIndex: number): ir.CreateOp { const args = [o.literal(slot), o.literal(constIndex)]; if (subTemplateIndex) { diff --git a/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts b/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts index 78b9ce6fe9444..3263036c22d3f 100644 --- a/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts +++ b/packages/compiler/src/template/pipeline/src/phases/generate_variables.ts @@ -43,6 +43,7 @@ function recursivelyProcessView(view: ViewCompilationUnit, parentScope: Scope|nu for (const op of view.create) { switch (op.kind) { case ir.OpKind.Template: + case ir.OpKind.RepeaterCreate: // Descend into child embedded views. recursivelyProcessView(view.job.views.get(op.xref)!, scope); break; @@ -71,6 +72,8 @@ interface Scope { contextVariables: Map; + aliases: Set; + /** * Local references collected from elements within the view. */ @@ -122,6 +125,7 @@ function getScopeForView(view: ViewCompilationUnit, parent: Scope|null): Scope { view: view.xref, }, contextVariables: new Map(), + aliases: view.aliases, references: [], parent, }; @@ -177,23 +181,32 @@ function generateVariablesInScopeForView( // view with a `nextContext` expression. This context switching operation itself declares a // variable, because the context of the view may be referenced directly. newOps.push(ir.createVariableOp( - view.job.allocateXrefId(), scope.viewContextVariable, new ir.NextContextExpr())); + view.job.allocateXrefId(), scope.viewContextVariable, new ir.NextContextExpr(), + ir.VariableFlags.None)); } // Add variables for all context variables available in this scope's view. - for (const [name, value] of view.job.views.get(scope.view)!.contextVariables) { + const scopeView = view.job.views.get(scope.view)!; + for (const [name, value] of scopeView.contextVariables) { const context = new ir.ContextExpr(scope.view); // We either read the context, or, if the variable is CTX_REF, use the context directly. const variable = value === ir.CTX_REF ? context : new o.ReadPropExpr(context, value); // Add the variable declaration. newOps.push(ir.createVariableOp( - view.job.allocateXrefId(), scope.contextVariables.get(name)!, variable)); + view.job.allocateXrefId(), scope.contextVariables.get(name)!, variable, + ir.VariableFlags.None)); + } + + for (const alias of scopeView.aliases) { + newOps.push(ir.createVariableOp( + view.job.allocateXrefId(), alias, alias.expression.clone(), ir.VariableFlags.AlwaysInline)); } // Add variables for all local references declared for elements in this scope. for (const ref of scope.references) { newOps.push(ir.createVariableOp( - view.job.allocateXrefId(), ref.variable, new ir.ReferenceExpr(ref.targetId, ref.offset))); + view.job.allocateXrefId(), ref.variable, new ir.ReferenceExpr(ref.targetId, ref.offset), + ir.VariableFlags.None)); } if (scope.parent !== null) { diff --git a/packages/compiler/src/template/pipeline/src/phases/naming.ts b/packages/compiler/src/template/pipeline/src/phases/naming.ts index 7032e62e55364..75c81afc27090 100644 --- a/packages/compiler/src/template/pipeline/src/phases/naming.ts +++ b/packages/compiler/src/template/pipeline/src/phases/naming.ts @@ -65,6 +65,28 @@ function addNamesToView( case ir.OpKind.Variable: varNames.set(op.xref, getVariableName(op.variable, state)); break; + case ir.OpKind.RepeaterCreate: + if (!(unit instanceof ViewCompilationUnit)) { + throw new Error(`AssertionError: must be compiling a component`); + } + if (op.slot === null) { + throw new Error(`Expected slot to be assigned`); + } + if (op.emptyView !== null) { + const emptyView = unit.job.views.get(op.emptyView)!; + // Repeater empty view function is at slot +2 (metadata is in the first slot). + addNamesToView( + emptyView, + `${baseName}_${prefixWithNamespace(`${op.tag}Empty`, op.namespace)}_${op.slot + 2}`, + state, compatibility); + } + const repeaterToken = + op.tag === null ? '' : '_' + prefixWithNamespace(op.tag, op.namespace); + // Repeater primary view function is at slot +1 (metadata is in the first slot). + addNamesToView( + unit.job.views.get(op.xref)!, `${baseName}${repeaterToken}_${op.slot + 1}`, state, + compatibility); + break; case ir.OpKind.Template: if (!(unit instanceof ViewCompilationUnit)) { throw new Error(`AssertionError: must be compiling a component`); @@ -112,10 +134,12 @@ function getVariableName(variable: ir.SemanticVariable, state: {index: number}): variable.name = `ctx_r${state.index++}`; break; case ir.SemanticVariableKind.Identifier: - variable.name = `${variable.identifier}_${state.index++}`; + // TODO: Prefix increment and `_r` for compatiblity only. + variable.name = `${variable.identifier}_r${++state.index}`; break; default: - variable.name = `_r${state.index++}`; + // TODO: Prefix increment for compatibility only. + variable.name = `_r${++state.index}`; break; } } diff --git a/packages/compiler/src/template/pipeline/src/phases/pipe_creation.ts b/packages/compiler/src/template/pipeline/src/phases/pipe_creation.ts index 5b28683a37162..9b77b7bb12ac5 100644 --- a/packages/compiler/src/template/pipeline/src/phases/pipe_creation.ts +++ b/packages/compiler/src/template/pipeline/src/phases/pipe_creation.ts @@ -30,7 +30,11 @@ function processPipeBindingsInView(unit: CompilationUnit): void { throw new Error(`AssertionError: pipe bindings should not appear in child expressions`); } - if (!ir.hasDependsOnSlotContextTrait(updateOp)) { + // This update op must be associated with a create op that consumes a slot (either by + // depending on the ambient context of `target`, or merely referencing that create op via + // `target`). + if (!ir.hasDependsOnSlotContextTrait(updateOp) && + !ir.hasUsesSlotIndexTrait(updateOp)) { throw new Error(`AssertionError: pipe binding associated with non-slot operation ${ ir.OpKind[updateOp.kind]}`); } diff --git a/packages/compiler/src/template/pipeline/src/phases/pure_function_extraction.ts b/packages/compiler/src/template/pipeline/src/phases/pure_function_extraction.ts index 94be6bfb34003..0e0dfcc0e7bd3 100644 --- a/packages/compiler/src/template/pipeline/src/phases/pure_function_extraction.ts +++ b/packages/compiler/src/template/pipeline/src/phases/pure_function_extraction.ts @@ -41,6 +41,7 @@ class PureFunctionConstant extends GenericKeyFn implements SharedConstantDefinit } } + // TODO: Use the new pool method `getSharedFunctionReference` toSharedConstantDeclaration(declName: string, keyExpr: o.Expression): o.Statement { const fnParams: o.FnParam[] = []; for (let idx = 0; idx < this.numArgs; idx++) { diff --git a/packages/compiler/src/template/pipeline/src/phases/reify.ts b/packages/compiler/src/template/pipeline/src/phases/reify.ts index d36050bd6dcea..d32830f82ddb4 100644 --- a/packages/compiler/src/template/pipeline/src/phases/reify.ts +++ b/packages/compiler/src/template/pipeline/src/phases/reify.ts @@ -164,6 +164,42 @@ function reifyCreateOperations(unit: CompilationUnit, ops: ir.OpList( op, ng.projection(op.slot, op.projectionSlotIndex, op.attributes)); break; + case ir.OpKind.RepeaterCreate: + if (op.slot === null) { + throw new Error('No slot was assigned for repeater instruction'); + } + if (!(unit instanceof ViewCompilationUnit)) { + throw new Error(`AssertionError: must be compiling a component`); + } + const repeaterView = unit.job.views.get(op.xref)!; + if (repeaterView.fnName === null) { + throw new Error(`AssertionError: expected repeater primary view to have been named`); + } + + let emptyViewFnName: string|null = null; + let emptyDecls: number|null = null; + let emptyVars: number|null = null; + if (op.emptyView !== null) { + const emptyView = unit.job.views.get(op.emptyView); + if (emptyView === undefined) { + throw new Error( + 'AssertionError: repeater had empty view xref, but empty view was not found'); + } + if (emptyView.fnName === null || emptyView.decls === null || emptyView.vars === null) { + throw new Error( + `AssertionError: expected repeater empty view to have been named and counted`); + } + emptyViewFnName = emptyView.fnName; + emptyDecls = emptyView.decls; + emptyVars = emptyView.vars; + } + + ir.OpList.replace( + op, + ng.repeaterCreate( + op.slot, repeaterView.fnName, op.decls!, op.vars!, op.trackByFn!, + op.usesComponentInstance, emptyViewFnName, emptyDecls, emptyVars, op.sourceSpan)); + break; case ir.OpKind.Statement: // Pass statement operations directly through. break; @@ -280,6 +316,9 @@ function reifyUpdateOperations(_unit: CompilationUnit, ops: ir.OpList(); + + for (const unit of job.units) { + for (const op of unit.ops()) { + if (op.kind === ir.OpKind.RepeaterCreate) { + repeaters.set(op.xref, op); + } + } + } + + for (const unit of job.units) { + for (const op of unit.ops()) { + ir.transformExpressionsInOp(op, expr => { + if (!(expr instanceof ir.DerivedRepeaterVarExpr)) { + return expr; + } + const repeaterOp = repeaters.get(expr.xref)!; + + switch (expr.identity) { + case ir.DerivedRepeaterVarIdentity.First: + return new o.BinaryOperatorExpr( + o.BinaryOperator.Identical, new ir.LexicalReadExpr(repeaterOp.varNames.$index), + o.literal(0)); + case ir.DerivedRepeaterVarIdentity.Last: + return new o.BinaryOperatorExpr( + o.BinaryOperator.Identical, new ir.LexicalReadExpr(repeaterOp.varNames.$index), + new o.BinaryOperatorExpr( + o.BinaryOperator.Minus, new ir.LexicalReadExpr(repeaterOp.varNames.$count), + o.literal(1))); + case ir.DerivedRepeaterVarIdentity.Even: + return new o.BinaryOperatorExpr( + o.BinaryOperator.Identical, + new o.BinaryOperatorExpr( + o.BinaryOperator.Modulo, new ir.LexicalReadExpr(repeaterOp.varNames.$index), + o.literal(2)), + o.literal(0)); + case ir.DerivedRepeaterVarIdentity.Odd: + return new o.BinaryOperatorExpr( + o.BinaryOperator.NotIdentical, + new o.BinaryOperatorExpr( + o.BinaryOperator.Modulo, new ir.LexicalReadExpr(repeaterOp.varNames.$index), + o.literal(2)), + o.literal(0)); + } + }, ir.VisitorContextFlag.None); + } + } +} diff --git a/packages/compiler/src/template/pipeline/src/phases/resolve_names.ts b/packages/compiler/src/template/pipeline/src/phases/resolve_names.ts index 770750d0bcc13..4a4abb8d23e5b 100644 --- a/packages/compiler/src/template/pipeline/src/phases/resolve_names.ts +++ b/packages/compiler/src/template/pipeline/src/phases/resolve_names.ts @@ -42,6 +42,7 @@ function processLexicalScope( case ir.OpKind.Variable: switch (op.variable.kind) { case ir.SemanticVariableKind.Identifier: + case ir.SemanticVariableKind.Alias: // This variable represents some kind of identifier which can be used in the template. if (scope.has(op.variable.identifier)) { continue; diff --git a/packages/compiler/src/template/pipeline/src/phases/save_restore_view.ts b/packages/compiler/src/template/pipeline/src/phases/save_restore_view.ts index 908f571313029..72d5df4da0d00 100644 --- a/packages/compiler/src/template/pipeline/src/phases/save_restore_view.ts +++ b/packages/compiler/src/template/pipeline/src/phases/save_restore_view.ts @@ -19,7 +19,7 @@ export function phaseSaveRestoreView(job: ComponentCompilationJob): void { name: null, view: view.xref, }, - new ir.GetCurrentViewExpr()), + new ir.GetCurrentViewExpr(), ir.VariableFlags.None), ]); for (const op of view.create) { @@ -56,7 +56,7 @@ function addSaveRestoreViewOperationToListener(unit: ViewCompilationUnit, op: ir name: null, view: unit.xref, }, - new ir.RestoreViewExpr(unit.xref)), + new ir.RestoreViewExpr(unit.xref), ir.VariableFlags.None), ]); // The "restore view" operation in listeners requires a call to `resetView` to reset the diff --git a/packages/compiler/src/template/pipeline/src/phases/slot_allocation.ts b/packages/compiler/src/template/pipeline/src/phases/slot_allocation.ts index 605cf8e84ec54..0c92e15d82385 100644 --- a/packages/compiler/src/template/pipeline/src/phases/slot_allocation.ts +++ b/packages/compiler/src/template/pipeline/src/phases/slot_allocation.ts @@ -58,14 +58,14 @@ export function phaseSlotAllocation(job: ComponentCompilationJob): void { // propagate the number of slots used for each view into the operation which declares it. for (const unit of job.units) { for (const op of unit.ops()) { - if (op.kind === ir.OpKind.Template) { + if (op.kind === ir.OpKind.Template || op.kind === ir.OpKind.RepeaterCreate) { // Record the number of slots used by the view this `ir.TemplateOp` declares in the // operation itself, so it can be emitted later. const childView = job.views.get(op.xref)!; op.decls = childView.decls; } - if (ir.hasUsesSlotIndexTrait(op) && op.targetSlot === null) { + if (ir.hasUsesSlotIndexTrait(op) && op.target !== null && op.targetSlot === null) { if (!slotMap.has(op.target)) { // We do expect to find a slot allocated for everything which might be referenced. throw new Error( diff --git a/packages/compiler/src/template/pipeline/src/phases/track_fn_generation.ts b/packages/compiler/src/template/pipeline/src/phases/track_fn_generation.ts new file mode 100644 index 0000000000000..8938c2e7e52a2 --- /dev/null +++ b/packages/compiler/src/template/pipeline/src/phases/track_fn_generation.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as o from '../../../../output/output_ast'; +import {Identifiers} from '../../../../render3/r3_identifiers'; +import * as ir from '../../ir'; + +import type {CompilationJob} from '../compilation'; + +/** + * Generate track functions that need to be extracted to the constant pool. This entails wrapping + * them in an arrow (or traditional) function, replacing context reads with `this.`, and storing + * them in the constant pool. + * + * Note that, if a track function was previously optimized, it will not need to be extracted, and + * this phase is a no-op. + */ +export function phaseTrackFnGeneration(job: CompilationJob): void { + for (const unit of job.units) { + for (const op of unit.create) { + if (op.kind !== ir.OpKind.RepeaterCreate) { + continue; + } + if (op.trackByFn !== null) { + // The final track function was already set, probably because it was optimized. + continue; + } + + // Find all component context reads. + let usesComponentContext = false; + op.track = ir.transformExpressionsInExpression(op.track, expr => { + if (expr instanceof ir.TrackContextExpr) { + usesComponentContext = true; + return o.variable('this'); + } + return expr; + }, ir.VisitorContextFlag.None); + + let fn: o.FunctionExpr|o.ArrowFunctionExpr; + + const fnParams = [new o.FnParam('$index'), new o.FnParam('$item')]; + if (usesComponentContext) { + fn = new o.FunctionExpr(fnParams, [new o.ReturnStatement(op.track)]); + } else { + fn = o.arrowFn(fnParams, op.track); + } + + op.trackByFn = job.pool.getSharedFunctionReference(fn, '_forTrack'); + } + } +} diff --git a/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts b/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts new file mode 100644 index 0000000000000..b2c507f30aaf8 --- /dev/null +++ b/packages/compiler/src/template/pipeline/src/phases/track_fn_optimization.ts @@ -0,0 +1,83 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as o from '../../../../output/output_ast'; +import {Identifiers} from '../../../../render3/r3_identifiers'; +import * as ir from '../../ir'; + +import type {CompilationJob} from '../compilation'; + +export function phaseTrackFnOptimization(job: CompilationJob): void { + for (const unit of job.units) { + for (const op of unit.create) { + if (op.kind !== ir.OpKind.RepeaterCreate) { + continue; + } + if (op.track instanceof o.ReadVarExpr && op.track.name === '$index') { + // Top-level access of `$index` uses the built in `repeaterTrackByIndex`. + op.trackByFn = o.importExpr(Identifiers.repeaterTrackByIndex); + } else if (op.track instanceof o.ReadVarExpr && op.track.name === '$item') { + // Top-level access of the item uses the built in `repeaterTrackByIdentity`. + op.trackByFn = o.importExpr(Identifiers.repeaterTrackByIdentity); + } else if (isTrackByFunctionCall(job.root.xref, op.track)) { + // Top-level method calls in the form of `fn($index, item)` can be passed in directly. + if (op.track.receiver.receiver.view === unit.xref) { + // TODO: this may be wrong + op.trackByFn = op.track.receiver; + } else { + // This is a plain method call, but not in the component's root view. + // We need to get the component instance, and then call the method on it. + op.trackByFn = + o.importExpr(Identifiers.componentInstance).callFn([]).prop(op.track.receiver.name); + // Because the context is not avaiable (without a special function), we don't want to + // try to resolve it later. Let's get rid of it by overwriting the original track + // expression (which won't be used anyway). + op.track = op.trackByFn; + } + } else { + // The track function could not be optimized. + // Replace context reads with a special IR expression, since context reads in a track + // function are emitted specially. + op.track = ir.transformExpressionsInExpression(op.track, expr => { + if (expr instanceof ir.ContextExpr) { + op.usesComponentInstance = true; + return new ir.TrackContextExpr(expr.view); + } + return expr; + }, ir.VisitorContextFlag.None); + } + } + } +} + +function isTrackByFunctionCall( + rootView: ir.XrefId, expr: o.Expression): expr is o.InvokeFunctionExpr&{ + receiver: o.ReadPropExpr & + { + receiver: ir.ContextExpr + } +} { + if (!(expr instanceof o.InvokeFunctionExpr) || expr.args.length !== 2) { + return false; + } + + if (!(expr.receiver instanceof o.ReadPropExpr && + expr.receiver.receiver instanceof ir.ContextExpr) || + expr.receiver.receiver.view !== rootView) { + return false; + } + + const [arg0, arg1] = expr.args; + if (!(arg0 instanceof o.ReadVarExpr) || arg0.name !== '$index') { + return false; + } + if (!(arg1 instanceof o.ReadVarExpr) || arg1.name !== '$item') { + return false; + } + return true; +} diff --git a/packages/compiler/src/template/pipeline/src/phases/track_variables.ts b/packages/compiler/src/template/pipeline/src/phases/track_variables.ts new file mode 100644 index 0000000000000..1e7130f6977ec --- /dev/null +++ b/packages/compiler/src/template/pipeline/src/phases/track_variables.ts @@ -0,0 +1,35 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as o from '../../../../output/output_ast'; +import * as ir from '../../ir'; + +import type {CompilationJob} from '../compilation'; + +export function phaseTrackVariables(job: CompilationJob): void { + for (const unit of job.units) { + for (const op of unit.create) { + if (op.kind !== ir.OpKind.RepeaterCreate) { + continue; + } + + op.track = ir.transformExpressionsInExpression(op.track, expr => { + if (expr instanceof ir.LexicalReadExpr) { + if (expr.name === op.varNames.$index) { + return o.variable('$index'); + } else if (expr.name === op.varNames.$implicit) { + return o.variable('$item'); + } + + // TODO: handle prohibited context variables (emit as globals?) + } + return expr; + }, ir.VisitorContextFlag.None); + } + } +} diff --git a/packages/compiler/src/template/pipeline/src/phases/var_counting.ts b/packages/compiler/src/template/pipeline/src/phases/var_counting.ts index 3767043f21c68..f1a81afdfd8ff 100644 --- a/packages/compiler/src/template/pipeline/src/phases/var_counting.ts +++ b/packages/compiler/src/template/pipeline/src/phases/var_counting.ts @@ -53,7 +53,7 @@ export function phaseVarCounting(job: CompilationJob): void { // an embedded view). for (const unit of job.units) { for (const op of unit.create) { - if (op.kind !== ir.OpKind.Template) { + if (op.kind !== ir.OpKind.Template && op.kind !== ir.OpKind.RepeaterCreate) { continue; } diff --git a/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts b/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts index 7ce5acb1b2016..4cced45e941f2 100644 --- a/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts +++ b/packages/compiler/src/template/pipeline/src/phases/variable_optimization.ts @@ -30,6 +30,15 @@ import {CompilationJob} from '../compilation'; */ export function phaseVariableOptimization(job: CompilationJob): void { for (const unit of job.units) { + inlineAlwaysInlineVariables(unit.create); + inlineAlwaysInlineVariables(unit.update); + + for (const op of unit.create) { + if (op.kind === ir.OpKind.Listener) { + inlineAlwaysInlineVariables(op.handlerOps); + } + } + optimizeVariablesInOpList(unit.create, job.compatibility); optimizeVariablesInOpList(unit.update, job.compatibility); @@ -95,6 +104,33 @@ interface OpInfo { fences: Fence; } +function inlineAlwaysInlineVariables(ops: ir.OpList): void { + const vars = new Map>(); + for (const op of ops) { + if (op.kind === ir.OpKind.Variable && op.flags & ir.VariableFlags.AlwaysInline) { + ir.visitExpressionsInOp(op, expr => { + if (ir.isIrExpression(expr) && fencesForIrExpression(expr) !== Fence.None) { + throw new Error(`AssertionError: A context-sensitive variable was marked AlwaysInline`); + } + }); + vars.set(op.xref, op); + } + + ir.transformExpressionsInOp(op, expr => { + if (expr instanceof ir.ReadVariableExpr && vars.has(expr.xref)) { + const varOp = vars.get(expr.xref)!; + // Inline by cloning, because we might inline into multiple places. + return varOp.initializer.clone(); + } + return expr; + }, ir.VisitorContextFlag.None); + } + + for (const op of vars.values()) { + ir.OpList.remove(op as ir.CreateOp | ir.UpdateOp); + } +} + /** * Process a list of operations and optimize variables within that list. */ @@ -174,10 +210,15 @@ function optimizeVariablesInOpList( // Next, inline any remaining variables with exactly one usage. const toInline: ir.XrefId[] = []; for (const [id, count] of varUsages) { + const decl = varDecls.get(id)!; + const varInfo = opMap.get(decl as ir.CreateOp | ir.UpdateOp)!; // We can inline variables that: - // - are used once + // - are used exactly once, and // - are not used remotely - if (count !== 1) { + // OR + // - are marked for always inlining + const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline); + if (count !== 1 || isAlwaysInline) { // We can't inline this variable as it's used more than once. continue; } @@ -196,6 +237,12 @@ function optimizeVariablesInOpList( // no future operation will make inlining legal. const decl = varDecls.get(candidate)!; const varInfo = opMap.get(decl as ir.CreateOp | ir.UpdateOp)!; + const isAlwaysInline = !!(decl.flags & ir.VariableFlags.AlwaysInline); + + if (isAlwaysInline) { + throw new Error( + `AssertionError: Found an 'AlwaysInline' variable after the always inlining pass.`); + } // Scan operations following the variable declaration and look for the point where that variable // is used. There should only be one usage given the precondition above. diff --git a/packages/compiler/test/ml_parser/lexer_spec.ts b/packages/compiler/test/ml_parser/lexer_spec.ts index b7a6e1ccd29de..b345adc5452eb 100644 --- a/packages/compiler/test/ml_parser/lexer_spec.ts +++ b/packages/compiler/test/ml_parser/lexer_spec.ts @@ -278,6 +278,1252 @@ describe('HtmlLexer', () => { ]); }); }); + + describe('escapable raw text', () => { + it('should parse text', () => { + expect(tokenizeAndHumanizeParts(`t\ne\rs\r\nt`)).toEqual([ + [TokenType.TAG_OPEN_START, '', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.ESCAPABLE_RAW_TEXT, 't\ne\ns\nt'], + [TokenType.TAG_CLOSE, '', 'title'], + [TokenType.EOF], + ]); + }); + + it('should detect entities', () => { + expect(tokenizeAndHumanizeParts(`&`)).toEqual([ + [TokenType.TAG_OPEN_START, '', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.ESCAPABLE_RAW_TEXT, ''], + [TokenType.ENCODED_ENTITY, '&', '&'], + [TokenType.ESCAPABLE_RAW_TEXT, ''], + [TokenType.TAG_CLOSE, '', 'title'], + [TokenType.EOF], + ]); + }); + + it('should ignore other opening tags', () => { + expect(tokenizeAndHumanizeParts(`a<div>`)).toEqual([ + [TokenType.TAG_OPEN_START, '', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.ESCAPABLE_RAW_TEXT, 'a
'], + [TokenType.TAG_CLOSE, '', 'title'], + [TokenType.EOF], + ]); + }); + + it('should ignore other closing tags', () => { + expect(tokenizeAndHumanizeParts(`a</test>`)).toEqual([ + [TokenType.TAG_OPEN_START, '', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.ESCAPABLE_RAW_TEXT, 'a'], + [TokenType.TAG_CLOSE, '', 'title'], + [TokenType.EOF], + ]); + }); + + it('should store the locations', () => { + expect(tokenizeAndHumanizeSourceSpans(`a`)).toEqual([ + [TokenType.TAG_OPEN_START, ''], + [TokenType.ESCAPABLE_RAW_TEXT, 'a'], + [TokenType.TAG_CLOSE, ''], + [TokenType.EOF, ''], + ]); + }); + }); + + describe('parsable data', () => { + it('should parse an SVG tag', () => { + expect(tokenizeAndHumanizeParts(`<svg:title>test</svg:title>`)).toEqual([ + [TokenType.TAG_OPEN_START, 'svg', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.TEXT, 'test'], + [TokenType.TAG_CLOSE, 'svg', 'title'], + [TokenType.EOF], + ]); + }); + + it('should parse an SVG <title> tag with children', () => { + expect(tokenizeAndHumanizeParts(`<svg:title><f>test</f></svg:title>`)).toEqual([ + [TokenType.TAG_OPEN_START, 'svg', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_OPEN_START, '', 'f'], + [TokenType.TAG_OPEN_END], + [TokenType.TEXT, 'test'], + [TokenType.TAG_CLOSE, '', 'f'], + [TokenType.TAG_CLOSE, 'svg', 'title'], + [TokenType.EOF], + ]); + }); + }); + + describe('expansion forms', () => { + it('should parse an expansion form', () => { + expect( + tokenizeAndHumanizeParts( + '{one.two, three, =4 {four} =5 {five} foo {bar} }', {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'one.two'], + [TokenType.RAW_TEXT, 'three'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'four'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, '=5'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'five'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, 'foo'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'bar'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.EOF], + ]); + }); + + it('should parse an expansion form with text elements surrounding it', () => { + expect(tokenizeAndHumanizeParts( + 'before{one.two, three, =4 {four}}after', {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.TEXT, 'before'], + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'one.two'], + [TokenType.RAW_TEXT, 'three'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'four'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, 'after'], + [TokenType.EOF], + ]); + }); + + it('should parse an expansion form as a tag single child', () => { + expect(tokenizeAndHumanizeParts( + '<div><span>{a, b, =4 {c}}</span></div>', {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.TAG_OPEN_START, '', 'div'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_OPEN_START, '', 'span'], + [TokenType.TAG_OPEN_END], + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'a'], + [TokenType.RAW_TEXT, 'b'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'c'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TAG_CLOSE, '', 'span'], + [TokenType.TAG_CLOSE, '', 'div'], + [TokenType.EOF], + ]); + }); + + it('should parse an expansion form with whitespace surrounding it', () => { + expect(tokenizeAndHumanizeParts( + '<div><span> {a, b, =4 {c}} </span></div>', {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.TAG_OPEN_START, '', 'div'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_OPEN_START, '', 'span'], + [TokenType.TAG_OPEN_END], + [TokenType.TEXT, ' '], + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'a'], + [TokenType.RAW_TEXT, 'b'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'c'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, ' '], + [TokenType.TAG_CLOSE, '', 'span'], + [TokenType.TAG_CLOSE, '', 'div'], + [TokenType.EOF], + ]); + }); + + it('should parse an expansion forms with elements in it', () => { + expect(tokenizeAndHumanizeParts( + '{one.two, three, =4 {four <b>a</b>}}', {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'one.two'], + [TokenType.RAW_TEXT, 'three'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'four '], + [TokenType.TAG_OPEN_START, '', 'b'], + [TokenType.TAG_OPEN_END], + [TokenType.TEXT, 'a'], + [TokenType.TAG_CLOSE, '', 'b'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.EOF], + ]); + }); + + it('should parse an expansion forms containing an interpolation', () => { + expect(tokenizeAndHumanizeParts( + '{one.two, three, =4 {four {{a}}}}', {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'one.two'], + [TokenType.RAW_TEXT, 'three'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'four '], + [TokenType.INTERPOLATION, '{{', 'a', '}}'], + [TokenType.TEXT, ''], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.EOF], + ]); + }); + + it('should parse nested expansion forms', () => { + expect(tokenizeAndHumanizeParts( + `{one.two, three, =4 { {xx, yy, =x {one}} }}`, {tokenizeExpansionForms: true})) + .toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'one.two'], + [TokenType.RAW_TEXT, 'three'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'xx'], + [TokenType.RAW_TEXT, 'yy'], + [TokenType.EXPANSION_CASE_VALUE, '=x'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'one'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, ' '], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.EOF], + ]); + }); + + describe('[line ending normalization', () => { + describe('{escapedString: true}', () => { + it('should normalize line-endings in expansion forms if `i18nNormalizeLineEndingsInICUs` is true', + () => { + const result = tokenizeWithoutErrors( + `{\r\n` + + ` messages.length,\r\n` + + ` plural,\r\n` + + ` =0 {You have \r\nno\r\n messages}\r\n` + + ` =1 {One {{message}}}}\r\n`, + { + tokenizeExpansionForms: true, + escapedString: true, + i18nNormalizeLineEndingsInICUs: true + }); + + expect(humanizeParts(result.tokens)).toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\n messages.length'], + [TokenType.RAW_TEXT, 'plural'], + [TokenType.EXPANSION_CASE_VALUE, '=0'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'You have \nno\n messages'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, '=1'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'One '], + [TokenType.INTERPOLATION, '{{', 'message', '}}'], + [TokenType.TEXT, ''], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, '\n'], + [TokenType.EOF], + ]); + + expect(result.nonNormalizedIcuExpressions).toEqual([]); + }); + + it('should not normalize line-endings in ICU expressions when `i18nNormalizeLineEndingsInICUs` is not defined', + () => { + const result = tokenizeWithoutErrors( + `{\r\n` + + ` messages.length,\r\n` + + ` plural,\r\n` + + ` =0 {You have \r\nno\r\n messages}\r\n` + + ` =1 {One {{message}}}}\r\n`, + {tokenizeExpansionForms: true, escapedString: true}); + + expect(humanizeParts(result.tokens)).toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\r\n messages.length'], + [TokenType.RAW_TEXT, 'plural'], + [TokenType.EXPANSION_CASE_VALUE, '=0'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'You have \nno\n messages'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, '=1'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'One '], + [TokenType.INTERPOLATION, '{{', 'message', '}}'], + [TokenType.TEXT, ''], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, '\n'], + [TokenType.EOF], + ]); + + expect(result.nonNormalizedIcuExpressions!.length).toBe(1); + expect(result.nonNormalizedIcuExpressions![0].sourceSpan.toString()) + .toEqual('\r\n messages.length'); + }); + + it('should not normalize line endings in nested expansion forms when `i18nNormalizeLineEndingsInICUs` is not defined', + () => { + const result = tokenizeWithoutErrors( + `{\r\n` + + ` messages.length, plural,\r\n` + + ` =0 { zero \r\n` + + ` {\r\n` + + ` p.gender, select,\r\n` + + ` male {m}\r\n` + + ` }\r\n` + + ` }\r\n` + + `}`, + {tokenizeExpansionForms: true, escapedString: true}); + expect(humanizeParts(result.tokens)).toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\r\n messages.length'], + [TokenType.RAW_TEXT, 'plural'], + [TokenType.EXPANSION_CASE_VALUE, '=0'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'zero \n '], + + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\r\n p.gender'], + [TokenType.RAW_TEXT, 'select'], + [TokenType.EXPANSION_CASE_VALUE, 'male'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'm'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + + [TokenType.TEXT, '\n '], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.EOF], + ]); + + expect(result.nonNormalizedIcuExpressions!.length).toBe(2); + expect(result.nonNormalizedIcuExpressions![0].sourceSpan.toString()) + .toEqual('\r\n messages.length'); + expect(result.nonNormalizedIcuExpressions![1].sourceSpan.toString()) + .toEqual('\r\n p.gender'); + }); + }); + + describe('{escapedString: false}', () => { + it('should normalize line-endings in expansion forms if `i18nNormalizeLineEndingsInICUs` is true', + () => { + const result = tokenizeWithoutErrors( + `{\r\n` + + ` messages.length,\r\n` + + ` plural,\r\n` + + ` =0 {You have \r\nno\r\n messages}\r\n` + + ` =1 {One {{message}}}}\r\n`, + { + tokenizeExpansionForms: true, + escapedString: false, + i18nNormalizeLineEndingsInICUs: true + }); + + expect(humanizeParts(result.tokens)).toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\n messages.length'], + [TokenType.RAW_TEXT, 'plural'], + [TokenType.EXPANSION_CASE_VALUE, '=0'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'You have \nno\n messages'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, '=1'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'One '], + [TokenType.INTERPOLATION, '{{', 'message', '}}'], + [TokenType.TEXT, ''], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, '\n'], + [TokenType.EOF], + ]); + + expect(result.nonNormalizedIcuExpressions).toEqual([]); + }); + + it('should not normalize line-endings in ICU expressions when `i18nNormalizeLineEndingsInICUs` is not defined', + () => { + const result = tokenizeWithoutErrors( + `{\r\n` + + ` messages.length,\r\n` + + ` plural,\r\n` + + ` =0 {You have \r\nno\r\n messages}\r\n` + + ` =1 {One {{message}}}}\r\n`, + {tokenizeExpansionForms: true, escapedString: false}); + + expect(humanizeParts(result.tokens)).toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\r\n messages.length'], + [TokenType.RAW_TEXT, 'plural'], + [TokenType.EXPANSION_CASE_VALUE, '=0'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'You have \nno\n messages'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, '=1'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'One '], + [TokenType.INTERPOLATION, '{{', 'message', '}}'], + [TokenType.TEXT, ''], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.TEXT, '\n'], + [TokenType.EOF], + ]); + + expect(result.nonNormalizedIcuExpressions!.length).toBe(1); + expect(result.nonNormalizedIcuExpressions![0].sourceSpan.toString()) + .toEqual('\r\n messages.length'); + }); + + it('should not normalize line endings in nested expansion forms when `i18nNormalizeLineEndingsInICUs` is not defined', + () => { + const result = tokenizeWithoutErrors( + `{\r\n` + + ` messages.length, plural,\r\n` + + ` =0 { zero \r\n` + + ` {\r\n` + + ` p.gender, select,\r\n` + + ` male {m}\r\n` + + ` }\r\n` + + ` }\r\n` + + `}`, + {tokenizeExpansionForms: true}); + + expect(humanizeParts(result.tokens)).toEqual([ + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\r\n messages.length'], + [TokenType.RAW_TEXT, 'plural'], + [TokenType.EXPANSION_CASE_VALUE, '=0'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'zero \n '], + + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, '\r\n p.gender'], + [TokenType.RAW_TEXT, 'select'], + [TokenType.EXPANSION_CASE_VALUE, 'male'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'm'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + + [TokenType.TEXT, '\n '], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.EOF], + ]); + + expect(result.nonNormalizedIcuExpressions!.length).toBe(2); + expect(result.nonNormalizedIcuExpressions![0].sourceSpan.toString()) + .toEqual('\r\n messages.length'); + expect(result.nonNormalizedIcuExpressions![1].sourceSpan.toString()) + .toEqual('\r\n p.gender'); + }); + }); + }); + }); + + + describe('errors', () => { + it('should report unescaped "{" on error', () => { + expect(tokenizeAndHumanizeErrors(`<p>before { after</p>`, {tokenizeExpansionForms: true})) + .toEqual([[ + TokenType.RAW_TEXT, + `Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.)`, + '0:21', + ]]); + }); + + it('should report unescaped "{" as an error, even after a prematurely terminated interpolation', + () => { + expect(tokenizeAndHumanizeErrors( + `<code>{{b}<!---->}</code><pre>import {a} from 'a';</pre>`, + {tokenizeExpansionForms: true})) + .toEqual([[ + TokenType.RAW_TEXT, + `Unexpected character "EOF" (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.)`, + '0:56', + ]]); + }); + + it('should include 2 lines of context in message', () => { + const src = '111\n222\n333\nE\n444\n555\n666\n'; + const file = new ParseSourceFile(src, 'file://'); + const location = new ParseLocation(file, 12, 123, 456); + const span = new ParseSourceSpan(location, location); + const error = new TokenError('**ERROR**', null!, span); + expect(error.toString()) + .toEqual(`**ERROR** ("\n222\n333\n[ERROR ->]E\n444\n555\n"): file://@123:456`); + }); + }); + + describe('unicode characters', () => { + it('should support unicode characters', () => { + expect(tokenizeAndHumanizeSourceSpans(`<p>İ</p>`)).toEqual([ + [TokenType.TAG_OPEN_START, '<p'], + [TokenType.TAG_OPEN_END, '>'], + [TokenType.TEXT, 'İ'], + [TokenType.TAG_CLOSE, '</p>'], + [TokenType.EOF, ''], + ]); + }); + }); + + describe('(processing escaped strings)', () => { + it('should unescape standard escape sequences', () => { + expect(tokenizeAndHumanizeParts('\\\' \\\' \\\'', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\' \' \''], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\" \\" \\"', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\" \" \"'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\` \\` \\`', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\` \` \`'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\\\ \\\\ \\\\', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\\ \\ \\'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\n \\n \\n', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\n \n \n'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\r{{\\r}}\\r', {escapedString: true})).toEqual([ + // post processing converts `\r` to `\n` + [TokenType.TEXT, '\n'], + [TokenType.INTERPOLATION, '{{', '\n', '}}'], + [TokenType.TEXT, '\n'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\v \\v \\v', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\v \v \v'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\t \\t \\t', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\t \t \t'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\b \\b \\b', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\b \b \b'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\f \\f \\f', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\f \f \f'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts( + '\\\' \\" \\` \\\\ \\n \\r \\v \\t \\b \\f', {escapedString: true})) + .toEqual([ + [TokenType.TEXT, '\' \" \` \\ \n \n \v \t \b \f'], + [TokenType.EOF], + ]); + }); + + it('should unescape null sequences', () => { + expect(tokenizeAndHumanizeParts('\\0', {escapedString: true})).toEqual([ + [TokenType.EOF], + ]); + // \09 is not an octal number so the \0 is taken as EOF + expect(tokenizeAndHumanizeParts('\\09', {escapedString: true})).toEqual([ + [TokenType.EOF], + ]); + }); + + it('should unescape octal sequences', () => { + // \19 is read as an octal `\1` followed by a normal char `9` + // \1234 is read as an octal `\123` followed by a normal char `4` + // \999 is not an octal number so its backslash just gets removed. + expect(tokenizeAndHumanizeParts( + '\\001 \\01 \\1 \\12 \\223 \\19 \\2234 \\999', {escapedString: true})) + .toEqual([ + [TokenType.TEXT, '\x01 \x01 \x01 \x0A \x93 \x019 \x934 999'], + [TokenType.EOF], + ]); + }); + + it('should unescape hex sequences', () => { + expect(tokenizeAndHumanizeParts('\\x12 \\x4F \\xDC', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\x12 \x4F \xDC'], + [TokenType.EOF], + ]); + }); + + it('should report an error on an invalid hex sequence', () => { + expect(tokenizeAndHumanizeErrors('\\xGG', {escapedString: true})).toEqual([ + [null, 'Invalid hexadecimal escape sequence', '0:2'] + ]); + + expect(tokenizeAndHumanizeErrors('abc \\x xyz', {escapedString: true})).toEqual([ + [TokenType.TEXT, 'Invalid hexadecimal escape sequence', '0:6'] + ]); + + expect(tokenizeAndHumanizeErrors('abc\\x', {escapedString: true})).toEqual([ + [TokenType.TEXT, 'Unexpected character "EOF"', '0:5'] + ]); + }); + + it('should unescape fixed length Unicode sequences', () => { + expect(tokenizeAndHumanizeParts('\\u0123 \\uABCD', {escapedString: true})).toEqual([ + [TokenType.TEXT, '\u0123 \uABCD'], + [TokenType.EOF], + ]); + }); + + it('should error on an invalid fixed length Unicode sequence', () => { + expect(tokenizeAndHumanizeErrors('\\uGGGG', {escapedString: true})).toEqual([ + [null, 'Invalid hexadecimal escape sequence', '0:2'] + ]); + }); + + it('should unescape variable length Unicode sequences', () => { + expect(tokenizeAndHumanizeParts( + '\\u{01} \\u{ABC} \\u{1234} \\u{123AB}', {escapedString: true})) + .toEqual([ + [TokenType.TEXT, '\u{01} \u{ABC} \u{1234} \u{123AB}'], + [TokenType.EOF], + ]); + }); + + it('should error on an invalid variable length Unicode sequence', () => { + expect(tokenizeAndHumanizeErrors('\\u{GG}', {escapedString: true})).toEqual([ + [null, 'Invalid hexadecimal escape sequence', '0:3'] + ]); + }); + + it('should unescape line continuations', () => { + expect(tokenizeAndHumanizeParts('abc\\\ndef', {escapedString: true})).toEqual([ + [TokenType.TEXT, 'abcdef'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeParts('\\\nx\\\ny\\\n', {escapedString: true})).toEqual([ + [TokenType.TEXT, 'xy'], + [TokenType.EOF], + ]); + }); + + it('should remove backslash from "non-escape" sequences', () => { + expect(tokenizeAndHumanizeParts('\a \g \~', {escapedString: true})).toEqual([ + [TokenType.TEXT, 'a g ~'], + [TokenType.EOF], + ]); + }); + + it('should unescape sequences in plain text', () => { + expect(tokenizeAndHumanizeParts('abc\ndef\\nghi\\tjkl\\`\\\'\\"mno', {escapedString: true})) + .toEqual([ + [TokenType.TEXT, 'abc\ndef\nghi\tjkl`\'"mno'], + [TokenType.EOF], + ]); + }); + + it('should unescape sequences in raw text', () => { + expect(tokenizeAndHumanizeParts( + '<script>abc\ndef\\nghi\\tjkl\\`\\\'\\"mno</script>', {escapedString: true})) + .toEqual([ + [TokenType.TAG_OPEN_START, '', 'script'], + [TokenType.TAG_OPEN_END], + [TokenType.RAW_TEXT, 'abc\ndef\nghi\tjkl`\'"mno'], + [TokenType.TAG_CLOSE, '', 'script'], + [TokenType.EOF], + ]); + }); + + it('should unescape sequences in escapable raw text', () => { + expect(tokenizeAndHumanizeParts( + '<title>abc\ndef\\nghi\\tjkl\\`\\\'\\"mno', {escapedString: true})) + .toEqual([ + [TokenType.TAG_OPEN_START, '', 'title'], + [TokenType.TAG_OPEN_END], + [TokenType.ESCAPABLE_RAW_TEXT, 'abc\ndef\nghi\tjkl`\'"mno'], + [TokenType.TAG_CLOSE, '', 'title'], + [TokenType.EOF], + ]); + }); + + it('should parse over escape sequences in tag definitions', () => { + expect(tokenizeAndHumanizeParts('', {escapedString: true})) + .toEqual([ + [TokenType.TAG_OPEN_START, '', 't'], + [TokenType.ATTR_NAME, '', 'a'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_VALUE_TEXT, 'b'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_NAME, '', 'c'], + [TokenType.ATTR_QUOTE, '\''], + [TokenType.ATTR_VALUE_TEXT, 'd'], + [TokenType.ATTR_QUOTE, '\''], + [TokenType.TAG_OPEN_END], + [TokenType.EOF], + ]); + }); + + it('should parse over escaped new line in tag definitions', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '', 't'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 't'], + [TokenType.EOF], + ]); + }); + + it('should parse over escaped characters in tag definitions', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '', 't'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 't'], + [TokenType.EOF], + ]); + }); + + it('should unescape characters in tag names', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '', 'td'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 'td'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeSourceSpans(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, ''], + [TokenType.TAG_CLOSE, ''], + [TokenType.EOF, ''], + ]); + }); + + it('should unescape characters in attributes', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '', 't'], + [TokenType.ATTR_NAME, '', 'd'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_VALUE_TEXT, 'e'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 't'], + [TokenType.EOF], + ]); + }); + + it('should parse over escaped new line in attribute values', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '', 't'], + [TokenType.ATTR_NAME, '', 'a'], + [TokenType.ATTR_VALUE_TEXT, 'b'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 't'], + [TokenType.EOF], + ]); + }); + + it('should tokenize the correct span when there are escape sequences', () => { + const text = + 'selector: "app-root",\ntemplate: "line 1\\n\\"line 2\\"\\nline 3",\ninputs: []'; + const range = { + startPos: 33, + startLine: 1, + startCol: 10, + endPos: 59, + }; + expect(tokenizeAndHumanizeParts(text, {range, escapedString: true})).toEqual([ + [TokenType.TEXT, 'line 1\n"line 2"\nline 3'], + [TokenType.EOF], + ]); + expect(tokenizeAndHumanizeSourceSpans(text, {range, escapedString: true})).toEqual([ + [TokenType.TEXT, 'line 1\\n\\"line 2\\"\\nline 3'], + [TokenType.EOF, ''], + ]); + }); + + it('should account for escape sequences when computing source spans ', () => { + const text = 'line 1\n' + // <- unescaped line break + 'line 2\\n' + // <- escaped line break + 'line 3\\\n' + // <- line continuation + ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '', 't'], [TokenType.TAG_OPEN_END], [TokenType.TEXT, 'line 1'], + [TokenType.TAG_CLOSE, '', 't'], [TokenType.TEXT, '\n'], + + [TokenType.TAG_OPEN_START, '', 't'], [TokenType.TAG_OPEN_END], [TokenType.TEXT, 'line 2'], + [TokenType.TAG_CLOSE, '', 't'], [TokenType.TEXT, '\n'], + + [TokenType.TAG_OPEN_START, '', 't'], [TokenType.TAG_OPEN_END], + [TokenType.TEXT, 'line 3'], // <- line continuation does not appear in token + [TokenType.TAG_CLOSE, '', 't'], + + [TokenType.EOF] + ]); + expect(tokenizeAndHumanizeLineColumn(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, '0:0'], + [TokenType.TAG_OPEN_END, '0:2'], + [TokenType.TEXT, '0:3'], + [TokenType.TAG_CLOSE, '0:9'], + [TokenType.TEXT, '0:13'], // <- real newline increments the row + + [TokenType.TAG_OPEN_START, '1:0'], + [TokenType.TAG_OPEN_END, '1:2'], + [TokenType.TEXT, '1:3'], + [TokenType.TAG_CLOSE, '1:9'], + [TokenType.TEXT, '1:13'], // <- escaped newline does not increment the row + + [TokenType.TAG_OPEN_START, '1:15'], + [TokenType.TAG_OPEN_END, '1:17'], + [TokenType.TEXT, '1:18'], // <- the line continuation increments the row + [TokenType.TAG_CLOSE, '2:0'], + + [TokenType.EOF, '2:4'], + ]); + expect(tokenizeAndHumanizeSourceSpans(text, {escapedString: true})).toEqual([ + [TokenType.TAG_OPEN_START, ''], + [TokenType.TEXT, 'line 1'], [TokenType.TAG_CLOSE, ''], [TokenType.TEXT, '\n'], + + [TokenType.TAG_OPEN_START, ''], + [TokenType.TEXT, 'line 2'], [TokenType.TAG_CLOSE, ''], [TokenType.TEXT, '\\n'], + + [TokenType.TAG_OPEN_START, ''], + [TokenType.TEXT, 'line 3\\\n'], [TokenType.TAG_CLOSE, ''], + + [TokenType.EOF, ''] + ]); + }); + }); + + describe('blocks', () => { + it('should parse a block without parameters', () => { + const expected = [ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]; + + expect(tokenizeAndHumanizeParts('@foo {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo () {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo(){hello}')).toEqual(expected); + }); + + it('should parse a block with parameters', () => { + expect(tokenizeAndHumanizeParts('@for (item of items; track item.id) {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'for'], + [TokenType.BLOCK_PARAMETER, 'item of items'], + [TokenType.BLOCK_PARAMETER, 'track item.id'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block with a trailing semicolon after the parameters', () => { + expect(tokenizeAndHumanizeParts('@for (item of items;) {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'for'], + [TokenType.BLOCK_PARAMETER, 'item of items'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block with a space in its name', () => { + expect(tokenizeAndHumanizeParts('@else if {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'else if'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + + expect(tokenizeAndHumanizeParts('@else if (foo !== 2) {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'else if'], + [TokenType.BLOCK_PARAMETER, 'foo !== 2'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block with an arbitrary amount of spaces around the parentheses', () => { + const expected = [ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_PARAMETER, 'a'], + [TokenType.BLOCK_PARAMETER, 'b'], + [TokenType.BLOCK_PARAMETER, 'c'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]; + + expect(tokenizeAndHumanizeParts('@foo(a; b; c){hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo (a; b; c) {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo(a; b; c) {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo (a; b; c){hello}')).toEqual(expected); + }); + + it('should parse a block with multiple trailing semicolons', () => { + expect(tokenizeAndHumanizeParts('@for (item of items;;;;;) {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'for'], + [TokenType.BLOCK_PARAMETER, 'item of items'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block with trailing whitespace', () => { + expect(tokenizeAndHumanizeParts('@foo {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block with no trailing semicolon', () => { + expect(tokenizeAndHumanizeParts('@for (item of items){hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'for'], + [TokenType.BLOCK_PARAMETER, 'item of items'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should handle semicolons, braces and parentheses used in a block parameter', () => { + const input = `@foo (a === ";"; b === ')'; c === "("; d === '}'; e === "{") {hello}`; + expect(tokenizeAndHumanizeParts(input)).toEqual([ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_PARAMETER, `a === ";"`], + [TokenType.BLOCK_PARAMETER, `b === ')'`], + [TokenType.BLOCK_PARAMETER, `c === "("`], + [TokenType.BLOCK_PARAMETER, `d === '}'`], + [TokenType.BLOCK_PARAMETER, `e === "{"`], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should handle object literals and function calls in block parameters', () => { + expect(tokenizeAndHumanizeParts( + `@foo (on a({a: 1, b: 2}, false, {c: 3}); when b({d: 4})) {hello}`)) + .toEqual([ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_PARAMETER, 'on a({a: 1, b: 2}, false, {c: 3})'], + [TokenType.BLOCK_PARAMETER, 'when b({d: 4})'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse block with unclosed parameters', () => { + expect(tokenizeAndHumanizeParts(`@foo (a === b {hello}`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, 'foo'], + [TokenType.BLOCK_PARAMETER, 'a === b {hello}'], + [TokenType.EOF], + ]); + }); + + it('should parse block with stray parentheses in the parameter position', () => { + expect(tokenizeAndHumanizeParts(`@foo a === b) {hello}`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, 'foo a'], + [TokenType.TEXT, '=== b) {hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse @ as an incomplete block', () => { + expect(tokenizeAndHumanizeParts(`@`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, ''], + [TokenType.EOF], + ]); + }); + + it('should parse space followed by @ as an incomplete block', () => { + expect(tokenizeAndHumanizeParts(` @`)).toEqual([ + [TokenType.TEXT, ' '], + [TokenType.INCOMPLETE_BLOCK_OPEN, ''], + [TokenType.EOF], + ]); + }); + + it('should parse @ followed by space as an incomplete block', () => { + expect(tokenizeAndHumanizeParts(`@ `)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, ''], + [TokenType.TEXT, ' '], + [TokenType.EOF], + ]); + }); + + it('should parse @ followed by newline and text as an incomplete block', () => { + expect(tokenizeAndHumanizeParts(`@\nfoo`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, ''], + [TokenType.TEXT, '\nfoo'], + [TokenType.EOF], + ]); + }); + + it('should parse incomplete block with no name', () => { + expect(tokenizeAndHumanizeParts(`foo bar @ baz clink`)).toEqual([ + [TokenType.TEXT, 'foo bar '], + [TokenType.INCOMPLETE_BLOCK_OPEN, ''], + [TokenType.TEXT, ' baz clink'], + [TokenType.EOF], + ]); + }); + + it('should parse incomplete block with space, then name', () => { + expect(tokenizeAndHumanizeParts(`@ if`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, ''], + [TokenType.TEXT, ' if'], + [TokenType.EOF], + ]); + }); + + it('should report invalid quotes in a parameter', () => { + expect(tokenizeAndHumanizeErrors(`@foo (a === ") {hello}`)).toEqual([ + [TokenType.BLOCK_PARAMETER, 'Unexpected character "EOF"', '0:22'] + ]); + + expect(tokenizeAndHumanizeErrors(`@foo (a === "hi') {hello}`)).toEqual([ + [TokenType.BLOCK_PARAMETER, 'Unexpected character "EOF"', '0:25'] + ]); + }); + + it('should report unclosed object literal inside a parameter', () => { + expect(tokenizeAndHumanizeParts(`@foo ({invalid: true) hello}`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, 'foo'], + [TokenType.BLOCK_PARAMETER, '{invalid: true'], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should handle a semicolon used in a nested string inside a block parameter', () => { + expect(tokenizeAndHumanizeParts(`@if (condition === "';'") {hello}`)).toEqual([ + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, `condition === "';'"`], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should handle a semicolon next to an escaped quote used in a block parameter', () => { + expect(tokenizeAndHumanizeParts('@if (condition === "\\";") {hello}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, 'condition === "\\";"'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse mixed text and html content in a block', () => { + expect(tokenizeAndHumanizeParts('@if (a === 1) {foo bar baz}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, 'a === 1'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'foo '], + [TokenType.TAG_OPEN_START, '', 'b'], + [TokenType.TAG_OPEN_END], + [TokenType.TEXT, 'bar'], + [TokenType.TAG_CLOSE, '', 'b'], + [TokenType.TEXT, ' baz'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse HTML tags with attributes containing curly braces inside blocks', () => { + expect(tokenizeAndHumanizeParts('@if (a === 1) {
}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, 'a === 1'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TAG_OPEN_START, '', 'div'], + [TokenType.ATTR_NAME, '', 'a'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_VALUE_TEXT, '}'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_NAME, '', 'b'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_VALUE_TEXT, '{'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 'div'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse HTML tags with attribute containing block syntax', () => { + expect(tokenizeAndHumanizeParts('
')).toEqual([ + [TokenType.TAG_OPEN_START, '', 'div'], + [TokenType.ATTR_NAME, '', 'a'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.ATTR_VALUE_TEXT, '@if (foo) {}'], + [TokenType.ATTR_QUOTE, '"'], + [TokenType.TAG_OPEN_END], + [TokenType.TAG_CLOSE, '', 'div'], + [TokenType.EOF], + ]); + }); + + it('should parse nested blocks', () => { + expect(tokenizeAndHumanizeParts( + '@if (a) {' + + 'hello a' + + '@if {' + + 'hello unnamed' + + '@if (b) {' + + 'hello b' + + '@if (c) {' + + 'hello c' + + '}' + + '}' + + '}' + + '}')) + .toEqual([ + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, 'a'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello a'], + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello unnamed'], + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, 'b'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello b'], + [TokenType.BLOCK_OPEN_START, 'if'], + [TokenType.BLOCK_PARAMETER, 'c'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, 'hello c'], + [TokenType.BLOCK_CLOSE], + [TokenType.BLOCK_CLOSE], + [TokenType.BLOCK_CLOSE], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block containing an expansion', () => { + const result = tokenizeAndHumanizeParts( + '@foo {{one.two, three, =4 {four} =5 {five} foo {bar} }}', + {tokenizeExpansionForms: true}); + + expect(result).toEqual([ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_OPEN_END], + [TokenType.EXPANSION_FORM_START], + [TokenType.RAW_TEXT, 'one.two'], + [TokenType.RAW_TEXT, 'three'], + [TokenType.EXPANSION_CASE_VALUE, '=4'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'four'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, '=5'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'five'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_CASE_VALUE, 'foo'], + [TokenType.EXPANSION_CASE_EXP_START], + [TokenType.TEXT, 'bar'], + [TokenType.EXPANSION_CASE_EXP_END], + [TokenType.EXPANSION_FORM_END], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse a block containing an interpolation', () => { + expect(tokenizeAndHumanizeParts('@foo {{{message}}}')).toEqual([ + [TokenType.BLOCK_OPEN_START, 'foo'], + [TokenType.BLOCK_OPEN_END], + [TokenType.TEXT, ''], + [TokenType.INTERPOLATION, '{{', 'message', '}}'], + [TokenType.TEXT, ''], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start without parameters with surrounding text', () => { + expect(tokenizeAndHumanizeParts('My email frodo@baggins.com')).toEqual([ + [TokenType.TEXT, 'My email frodo'], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'baggins'], + [TokenType.TEXT, '.com'], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start at the end of the input', () => { + expect(tokenizeAndHumanizeParts('My username is @frodo')).toEqual([ + [TokenType.TEXT, 'My username is '], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'frodo'], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start with parentheses but without params', () => { + expect(tokenizeAndHumanizeParts('Use the @Input() decorator')).toEqual([ + [TokenType.TEXT, 'Use the '], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'Input'], + [TokenType.TEXT, 'decorator'], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start with parentheses and params', () => { + expect(tokenizeAndHumanizeParts('Use @Input({alias: "foo"}) to alias the input')).toEqual([ + [TokenType.TEXT, 'Use '], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'Input'], + [TokenType.BLOCK_PARAMETER, '{alias: "foo"}'], + [TokenType.TEXT, 'to alias the input'], + [TokenType.EOF], + ]); + }); + }); }); describe('attributes', () => { diff --git a/packages/core/src/application_tokens.ts b/packages/core/src/application_tokens.ts index af4ecc2b3a11a..9b1acc63dc0d2 100644 --- a/packages/core/src/application_tokens.ts +++ b/packages/core/src/application_tokens.ts @@ -115,19 +115,6 @@ export const CSP_NONCE = new InjectionToken('CSP nonce', { }, }); -/** - * Internal token to collect all SSR-related features enabled for this application. - * - * Note: the token is in `core` to let other packages register features (the `core` - * package is imported in other packages). - */ -export const ENABLED_SSR_FEATURES = new InjectionToken>( - (typeof ngDevMode === 'undefined' || ngDevMode) ? 'ENABLED_SSR_FEATURES' : '', { - providedIn: 'root', - factory: () => new Set(), - }); - - /** * A configuration object for the image-related options. Contains: * - breakpoints: An array of integer breakpoints used to generate diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index 6e79fd3d7d610..75df01dda7ee3 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -8,7 +8,7 @@ export {setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl} from '../primitives/signals'; export {ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, internalCreateApplication as ɵinternalCreateApplication, whenStable as ɵwhenStable} from './application_ref'; -export {ENABLED_SSR_FEATURES as ɵENABLED_SSR_FEATURES, IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, ImageConfig as ɵImageConfig} from './application_tokens'; +export {IMAGE_CONFIG as ɵIMAGE_CONFIG, IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS, ImageConfig as ɵImageConfig} from './application_tokens'; export {defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers} from './change_detection/change_detection'; export {Console as ɵConsole} from './console'; export {DeferBlockDetails as ɵDeferBlockDetails, getDeferBlocks as ɵgetDeferBlocks} from './defer/discovery'; diff --git a/packages/core/src/defer/cleanup.ts b/packages/core/src/defer/cleanup.ts index 2f014e4bbd18d..23c945db1bae7 100644 --- a/packages/core/src/defer/cleanup.ts +++ b/packages/core/src/defer/cleanup.ts @@ -6,72 +6,39 @@ * found in the LICENSE file at https://angular.io/license */ -import {Injector, ɵɵdefineInjectable} from '../di'; - -import {TDeferBlockDetails} from './interfaces'; +import {LDeferBlockDetails, PREFETCH_TRIGGER_CLEANUP_FNS, TRIGGER_CLEANUP_FNS, TriggerType} from './interfaces'; /** * Registers a cleanup function associated with a prefetching trigger - * of a given defer block. + * or a regular trigger of a defer block. */ -export function registerTDetailsCleanup( - injector: Injector, tDetails: TDeferBlockDetails, key: string, cleanupFn: VoidFunction) { - injector.get(DeferBlockCleanupManager).add(tDetails, key, cleanupFn); -} -/** - * Invokes all registered prefetch cleanup triggers - * and removes all cleanup functions afterwards. - */ -export function invokeTDetailsCleanup(injector: Injector, tDetails: TDeferBlockDetails) { - injector.get(DeferBlockCleanupManager).cleanup(tDetails); +export function storeTriggerCleanupFn( + type: TriggerType, lDetails: LDeferBlockDetails, cleanupFn: VoidFunction) { + const key = type === TriggerType.Prefetch ? PREFETCH_TRIGGER_CLEANUP_FNS : TRIGGER_CLEANUP_FNS; + if (lDetails[key] === null) { + lDetails[key] = []; + } + lDetails[key]!.push(cleanupFn); } + /** - * Internal service to keep track of cleanup functions associated - * with defer blocks. This class is used to manage cleanup functions - * created for prefetching triggers. + * Invokes registered cleanup functions either for prefetch or for regular triggers. */ -export class DeferBlockCleanupManager { - private blocks = new Map>(); - - add(tDetails: TDeferBlockDetails, key: string, callback: VoidFunction) { - if (!this.blocks.has(tDetails)) { - this.blocks.set(tDetails, new Map()); - } - const block = this.blocks.get(tDetails)!; - if (!block.has(key)) { - block.set(key, []); +export function invokeTriggerCleanupFns(type: TriggerType, lDetails: LDeferBlockDetails) { + const key = type === TriggerType.Prefetch ? PREFETCH_TRIGGER_CLEANUP_FNS : TRIGGER_CLEANUP_FNS; + const cleanupFns = lDetails[key]; + if (cleanupFns !== null) { + for (const cleanupFn of cleanupFns) { + cleanupFn(); } - const callbacks = block.get(key)!; - callbacks.push(callback); - } - - has(tDetails: TDeferBlockDetails, key: string): boolean { - return !!this.blocks.get(tDetails)?.has(key); - } - - cleanup(tDetails: TDeferBlockDetails) { - const block = this.blocks.get(tDetails); - if (block) { - for (const callbacks of Object.values(block)) { - for (const callback of callbacks) { - callback(); - } - } - this.blocks.delete(tDetails); - } - } - - ngOnDestroy() { - for (const [block] of this.blocks) { - this.cleanup(block); - } - this.blocks.clear(); + lDetails[key] = null; } +} - /** @nocollapse */ - static ɵprov = /** @pureOrBreakMyCode */ ɵɵdefineInjectable({ - token: DeferBlockCleanupManager, - providedIn: 'root', - factory: () => new DeferBlockCleanupManager(), - }); +/** + * Invokes registered cleanup functions for both prefetch and regular triggers. + */ +export function invokeAllTriggerCleanupFns(lDetails: LDeferBlockDetails) { + invokeTriggerCleanupFns(TriggerType.Prefetch, lDetails); + invokeTriggerCleanupFns(TriggerType.Regular, lDetails); } diff --git a/packages/core/src/defer/dom_triggers.ts b/packages/core/src/defer/dom_triggers.ts index 2c450bbc0432b..b86881bb13888 100644 --- a/packages/core/src/defer/dom_triggers.ts +++ b/packages/core/src/defer/dom_triggers.ts @@ -16,8 +16,9 @@ import {HEADER_OFFSET, INJECTOR, LView} from '../render3/interfaces/view'; import {getNativeByIndex, removeLViewOnDestroy, storeLViewOnDestroy, walkUpViews} from '../render3/util/view_utils'; import {assertElement, assertEqual} from '../util/assert'; import {NgZone} from '../zone'; +import {storeTriggerCleanupFn} from './cleanup'; -import {DEFER_BLOCK_STATE, DeferBlockInternalState, DeferBlockState} from './interfaces'; +import {DEFER_BLOCK_STATE, DeferBlockInternalState, DeferBlockState, TriggerType} from './interfaces'; import {getLDeferBlockDetails} from './utils'; /** Configuration object used to register passive and capturing events. */ @@ -62,10 +63,8 @@ class DeferEventEntry { * Registers an interaction trigger. * @param trigger Element that is the trigger. * @param callback Callback to be invoked when the trigger is interacted with. - * @param injector Injector that can be used by the trigger to resolve DI tokens. */ -export function onInteraction( - trigger: Element, callback: VoidFunction, injector: Injector): VoidFunction { +export function onInteraction(trigger: Element, callback: VoidFunction): VoidFunction { let entry = interactionTriggers.get(trigger); // If this is the first entry for this element, add the listeners. @@ -112,10 +111,8 @@ export function onInteraction( * Registers a hover trigger. * @param trigger Element that is the trigger. * @param callback Callback to be invoked when the trigger is hovered over. - * @param injector Injector that can be used by the trigger to resolve DI tokens. */ -export function onHover( - trigger: Element, callback: VoidFunction, injector: Injector): VoidFunction { +export function onHover(trigger: Element, callback: VoidFunction): VoidFunction { let entry = hoverTriggers.get(trigger); // If this is the first entry for this element, add the listener. @@ -256,11 +253,12 @@ export function getTriggerElement(triggerLView: LView, triggerIndex: number): El * @param registerFn Function that will register the DOM events. * @param callback Callback to be invoked when the trigger receives the event that should render * the deferred block. + * @param type Trigger type to distinguish between regular and prefetch triggers. */ export function registerDomTrigger( initialLView: LView, tNode: TNode, triggerIndex: number, walkUpTimes: number|undefined, registerFn: (element: Element, callback: VoidFunction, injector: Injector) => VoidFunction, - callback: VoidFunction) { + callback: VoidFunction, type: TriggerType) { const injector = initialLView[INJECTOR]!; function pollDomTrigger() { // If the initial view was destroyed, we don't need to do anything. @@ -290,24 +288,24 @@ export function registerDomTrigger( return; } - // TODO: add integration with `DeferBlockCleanupManager`. const element = getTriggerElement(triggerLView, triggerIndex); const cleanup = registerFn(element, () => { - callback(); - removeLViewOnDestroy(triggerLView, cleanup); if (initialLView !== triggerLView) { - removeLViewOnDestroy(initialLView, cleanup); + removeLViewOnDestroy(triggerLView, cleanup); } - cleanup(); + callback(); }, injector); - storeLViewOnDestroy(triggerLView, cleanup); - - // Since the trigger and deferred block might be in different - // views, we have to register the callback in both locations. + // The trigger and deferred block might be in different LViews. + // For the main LView the cleanup would happen as a part of + // `storeTriggerCleanupFn` logic. For trigger LView we register + // a cleanup function there to remove event handlers in case an + // LView gets destroyed before a trigger is invoked. if (initialLView !== triggerLView) { - storeLViewOnDestroy(initialLView, cleanup); + storeLViewOnDestroy(triggerLView, cleanup); } + + storeTriggerCleanupFn(type, lDetails, cleanup); } // Begin polling for the trigger. diff --git a/packages/core/src/defer/idle_scheduler.ts b/packages/core/src/defer/idle_scheduler.ts index 714187ec980d2..94ba16238fccf 100644 --- a/packages/core/src/defer/idle_scheduler.ts +++ b/packages/core/src/defer/idle_scheduler.ts @@ -10,24 +10,17 @@ import {inject, ɵɵdefineInjectable} from '../di'; import {INJECTOR, LView} from '../render3/interfaces/view'; import {NgZone} from '../zone'; -import {wrapWithLViewCleanup} from './utils'; - /** * Helper function to schedule a callback to be invoked when a browser becomes idle. * * @param callback A function to be invoked when a browser becomes idle. * @param lView LView that hosts an instance of a defer block. - * @param withLViewCleanup A flag that indicates whether a scheduled callback - * should be cancelled in case an LView is destroyed before a callback - * was invoked. */ -export function onIdle(callback: VoidFunction, lView: LView, withLViewCleanup: boolean) { +export function onIdle(callback: VoidFunction, lView: LView) { const injector = lView[INJECTOR]!; const scheduler = injector.get(IdleScheduler); const cleanupFn = () => scheduler.remove(callback); - const wrappedCallback = - withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback; - scheduler.add(wrappedCallback); + scheduler.add(callback); return cleanupFn; } @@ -64,8 +57,8 @@ export class IdleScheduler { ngZone = inject(NgZone); - requestIdleCallback = _requestIdleCallback().bind(globalThis); - cancelIdleCallback = _cancelIdleCallback().bind(globalThis); + requestIdleCallbackFn = _requestIdleCallback().bind(globalThis); + cancelIdleCallbackFn = _cancelIdleCallback().bind(globalThis); add(callback: VoidFunction) { const target = this.executingCallbacks ? this.deferred : this.current; @@ -76,14 +69,21 @@ export class IdleScheduler { } remove(callback: VoidFunction) { - this.current.delete(callback); - this.deferred.delete(callback); + const {current, deferred} = this; + + current.delete(callback); + deferred.delete(callback); + + // If the last callback was removed and there is a pending + // idle callback - cancel it. + if (current.size === 0 && deferred.size === 0) { + this.cancelIdleCallback(); + } } private scheduleIdleCallback() { const callback = () => { - this.cancelIdleCallback(this.idleId!); - this.idleId = null; + this.cancelIdleCallback(); this.executingCallbacks = true; @@ -107,14 +107,18 @@ export class IdleScheduler { }; // Ensure that the callback runs in the NgZone since // the `requestIdleCallback` is not currently patched by Zone.js. - this.idleId = this.requestIdleCallback(() => this.ngZone.run(callback)) as number; + this.idleId = this.requestIdleCallbackFn(() => this.ngZone.run(callback)) as number; } - ngOnDestroy() { + private cancelIdleCallback() { if (this.idleId !== null) { - this.cancelIdleCallback(this.idleId); + this.cancelIdleCallbackFn(this.idleId); this.idleId = null; } + } + + ngOnDestroy() { + this.cancelIdleCallback(); this.current.clear(); this.deferred.clear(); } diff --git a/packages/core/src/defer/instructions.ts b/packages/core/src/defer/instructions.ts index f6d4d27564fee..f5156d246a540 100644 --- a/packages/core/src/defer/instructions.ts +++ b/packages/core/src/defer/instructions.ts @@ -21,14 +21,14 @@ import {isDestroyed} from '../render3/interfaces/type_checks'; import {HEADER_OFFSET, INJECTOR, LView, PARENT, TVIEW, TView} from '../render3/interfaces/view'; import {getCurrentTNode, getLView, getSelectedTNode, getTView, nextBindingIndex} from '../render3/state'; import {isPlatformBrowser} from '../render3/util/misc_utils'; -import {getConstant, getTNode} from '../render3/util/view_utils'; +import {getConstant, getTNode, removeLViewOnDestroy, storeLViewOnDestroy} from '../render3/util/view_utils'; import {addLViewToLContainer, createAndRenderEmbeddedLView, removeLViewFromLContainer, shouldAddViewToDom} from '../render3/view_manipulation'; import {assertDefined, throwError} from '../util/assert'; -import {DeferBlockCleanupManager, invokeTDetailsCleanup, registerTDetailsCleanup} from './cleanup'; +import {invokeAllTriggerCleanupFns, invokeTriggerCleanupFns, storeTriggerCleanupFn} from './cleanup'; import {onHover, onInteraction, onViewport, registerDomTrigger} from './dom_triggers'; import {onIdle} from './idle_scheduler'; -import {DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockConfig, DeferBlockDependencyInterceptor, DeferBlockInternalState, DeferBlockState, DeferBlockTriggers, DeferDependenciesLoadingState, DeferredLoadingBlockConfig, DeferredPlaceholderBlockConfig, DependencyResolverFn, LDeferBlockDetails, LOADING_AFTER_CLEANUP_FN, NEXT_DEFER_BLOCK_STATE, STATE_IS_FROZEN_UNTIL, TDeferBlockDetails} from './interfaces'; +import {DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockConfig, DeferBlockDependencyInterceptor, DeferBlockInternalState, DeferBlockState, DeferDependenciesLoadingState, DeferredLoadingBlockConfig, DeferredPlaceholderBlockConfig, DependencyResolverFn, LDeferBlockDetails, LOADING_AFTER_CLEANUP_FN, NEXT_DEFER_BLOCK_STATE, STATE_IS_FROZEN_UNTIL, TDeferBlockDetails, TriggerType} from './interfaces'; import {onTimer, scheduleTimerTrigger} from './timer_scheduler'; import {addDepsToRegistry, assertDeferredDependenciesLoaded, getLDeferBlockDetails, getLoadingBlockAfter, getMinimumDurationForState, getPrimaryBlockTNode, getTDeferBlockDetails, getTemplateIndexForState, setLDeferBlockDetails, setTDeferBlockDetails} from './utils'; @@ -124,6 +124,8 @@ export function ɵɵdefer( ɵɵtemplate(index, null, 0, 0); if (tView.firstCreatePass) { + performance.mark('mark_use_counter', {detail: {feature: 'NgDefer'}}); + const tDetails: TDeferBlockDetails = { primaryTmplIndex, loadingTmplIndex: loadingTmplIndex ?? null, @@ -152,9 +154,18 @@ export function ɵɵdefer( null, // NEXT_DEFER_BLOCK_STATE DeferBlockInternalState.Initial, // DEFER_BLOCK_STATE null, // STATE_IS_FROZEN_UNTIL - null // LOADING_AFTER_CLEANUP_FN + null, // LOADING_AFTER_CLEANUP_FN + null, // TRIGGER_CLEANUP_FNS + null // PREFETCH_TRIGGER_CLEANUP_FNS ]; setLDeferBlockDetails(lView, adjustedIndex, lDetails); + + const cleanupTriggersFn = () => invokeAllTriggerCleanupFns(lDetails); + + // When defer block is triggered - unsubscribe from LView destroy cleanup. + storeTriggerCleanupFn( + TriggerType.Regular, lDetails, () => removeLViewOnDestroy(lView, cleanupTriggersFn)); + storeLViewOnDestroy(lView, cleanupTriggersFn); } /** @@ -199,7 +210,7 @@ export function ɵɵdeferPrefetchWhen(rawValue: unknown) { const tDetails = getTDeferBlockDetails(tView, tNode); if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { // If loading has not been started yet, trigger it now. - triggerPrefetching(tDetails, lView); + triggerPrefetching(tDetails, lView, tNode); } } } @@ -217,7 +228,7 @@ export function ɵɵdeferOnIdle() { * @codeGenApi */ export function ɵɵdeferPrefetchOnIdle() { - scheduleDelayedPrefetching(onIdle, DeferBlockTriggers.OnIdle); + scheduleDelayedPrefetching(onIdle); } /** @@ -251,7 +262,7 @@ export function ɵɵdeferPrefetchOnImmediate() { const tDetails = getTDeferBlockDetails(tView, tNode); if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { - triggerResourceLoading(tDetails, lView); + triggerResourceLoading(tDetails, lView, tNode); } } @@ -270,7 +281,7 @@ export function ɵɵdeferOnTimer(delay: number) { * @codeGenApi */ export function ɵɵdeferPrefetchOnTimer(delay: number) { - scheduleDelayedPrefetching(onTimer(delay), DeferBlockTriggers.OnTimer); + scheduleDelayedPrefetching(onTimer(delay)); } /** @@ -285,7 +296,8 @@ export function ɵɵdeferOnHover(triggerIndex: number, walkUpTimes?: number) { renderPlaceholder(lView, tNode); registerDomTrigger( - lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerDeferBlock(lView, tNode)); + lView, tNode, triggerIndex, walkUpTimes, onHover, () => triggerDeferBlock(lView, tNode), + TriggerType.Regular); } /** @@ -303,7 +315,7 @@ export function ɵɵdeferPrefetchOnHover(triggerIndex: number, walkUpTimes?: num if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { registerDomTrigger( lView, tNode, triggerIndex, walkUpTimes, onHover, - () => triggerPrefetching(tDetails, lView)); + () => triggerPrefetching(tDetails, lView, tNode), TriggerType.Prefetch); } } @@ -319,8 +331,8 @@ export function ɵɵdeferOnInteraction(triggerIndex: number, walkUpTimes?: numbe renderPlaceholder(lView, tNode); registerDomTrigger( - lView, tNode, triggerIndex, walkUpTimes, onInteraction, - () => triggerDeferBlock(lView, tNode)); + lView, tNode, triggerIndex, walkUpTimes, onInteraction, () => triggerDeferBlock(lView, tNode), + TriggerType.Regular); } /** @@ -338,7 +350,7 @@ export function ɵɵdeferPrefetchOnInteraction(triggerIndex: number, walkUpTimes if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { registerDomTrigger( lView, tNode, triggerIndex, walkUpTimes, onInteraction, - () => triggerPrefetching(tDetails, lView)); + () => triggerPrefetching(tDetails, lView, tNode), TriggerType.Prefetch); } } @@ -354,7 +366,8 @@ export function ɵɵdeferOnViewport(triggerIndex: number, walkUpTimes?: number) renderPlaceholder(lView, tNode); registerDomTrigger( - lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerDeferBlock(lView, tNode)); + lView, tNode, triggerIndex, walkUpTimes, onViewport, () => triggerDeferBlock(lView, tNode), + TriggerType.Regular); } /** @@ -372,7 +385,7 @@ export function ɵɵdeferPrefetchOnViewport(triggerIndex: number, walkUpTimes?: if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { registerDomTrigger( lView, tNode, triggerIndex, walkUpTimes, onViewport, - () => triggerPrefetching(tDetails, lView)); + () => triggerPrefetching(tDetails, lView, tNode), TriggerType.Prefetch); } } @@ -382,44 +395,33 @@ export function ɵɵdeferPrefetchOnViewport(triggerIndex: number, walkUpTimes?: * Schedules triggering of a defer block for `on idle` and `on timer` conditions. */ function scheduleDelayedTrigger( - scheduleFn: (callback: VoidFunction, lView: LView, withLViewCleanup: boolean) => VoidFunction) { + scheduleFn: (callback: VoidFunction, lView: LView) => VoidFunction) { const lView = getLView(); const tNode = getCurrentTNode()!; renderPlaceholder(lView, tNode); - scheduleFn(() => triggerDeferBlock(lView, tNode), lView, true /* withLViewCleanup */); + const cleanupFn = scheduleFn(() => triggerDeferBlock(lView, tNode), lView); + const lDetails = getLDeferBlockDetails(lView, tNode); + storeTriggerCleanupFn(TriggerType.Regular, lDetails, cleanupFn); } /** * Schedules prefetching for `on idle` and `on timer` triggers. * * @param scheduleFn A function that does the scheduling. - * @param trigger A trigger that initiated scheduling. */ function scheduleDelayedPrefetching( - scheduleFn: (callback: VoidFunction, lView: LView, withLViewCleanup: boolean) => VoidFunction, - trigger: DeferBlockTriggers) { + scheduleFn: (callback: VoidFunction, lView: LView) => VoidFunction) { const lView = getLView(); const tNode = getCurrentTNode()!; const tView = lView[TVIEW]; const tDetails = getTDeferBlockDetails(tView, tNode); if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { - // Prevent scheduling more than one prefetch init call - // for each defer block. For this reason we use only a trigger - // identifier in a key, so all instances would use the same key. - const key = String(trigger); - const injector = lView[INJECTOR]!; - const manager = injector.get(DeferBlockCleanupManager); - if (!manager.has(tDetails, key)) { - // In case of prefetching, we intentionally avoid cancelling resource loading if - // an underlying LView get destroyed (thus passing `null` as a second argument), - // because there might be other LViews (that represent embedded views) that - // depend on resource loading. - const prefetch = () => triggerPrefetching(tDetails, lView); - const cleanupFn = scheduleFn(prefetch, lView, false /* withLViewCleanup */); - registerTDetailsCleanup(injector, tDetails, key, cleanupFn); - } + const lDetails = getLDeferBlockDetails(lView, tNode); + const prefetch = () => triggerPrefetching(tDetails, lView, tNode); + const cleanupFn = scheduleFn(prefetch, lView); + storeTriggerCleanupFn(TriggerType.Prefetch, lDetails, cleanupFn); } } @@ -559,7 +561,7 @@ function scheduleDeferBlockUpdate( renderDeferBlockState(nextState, tNode, lContainer); } }; - return scheduleTimerTrigger(timeout, callback, hostLView, true); + return scheduleTimerTrigger(timeout, callback, hostLView); } /** @@ -582,9 +584,9 @@ function isValidStateChange( * @param tDetails Static information about this defer block. * @param lView LView of a host view. */ -export function triggerPrefetching(tDetails: TDeferBlockDetails, lView: LView) { +export function triggerPrefetching(tDetails: TDeferBlockDetails, lView: LView, tNode: TNode) { if (lView[INJECTOR] && shouldTriggerDeferBlock(lView[INJECTOR]!)) { - triggerResourceLoading(tDetails, lView); + triggerResourceLoading(tDetails, lView, tNode); } } @@ -594,7 +596,7 @@ export function triggerPrefetching(tDetails: TDeferBlockDetails, lView: LView) { * @param tDetails Static information about this defer block. * @param lView LView of a host view. */ -export function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LView) { +export function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LView, tNode: TNode) { const injector = lView[INJECTOR]!; const tView = lView[TVIEW]; @@ -605,11 +607,15 @@ export function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LVie return; } + const lDetails = getLDeferBlockDetails(lView, tNode); const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails); // Switch from NOT_STARTED -> IN_PROGRESS state. tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS; + // Prefetching is triggered, cleanup all registered prefetch triggers. + invokeTriggerCleanupFns(TriggerType.Prefetch, lDetails); + let dependenciesFn = tDetails.dependencyResolverFn; if (ngDevMode) { @@ -632,10 +638,6 @@ export function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LVie return; } - // Defer block may have multiple prefetch triggers. Once the loading - // starts, invoke all clean functions, since they are no longer needed. - invokeTDetailsCleanup(injector, tDetails); - // Start downloading of defer block dependencies. tDetails.loadingPromise = Promise.allSettled(dependenciesFn()).then(results => { let failed = false; @@ -729,11 +731,16 @@ function triggerDeferBlock(lView: LView, tNode: TNode) { if (!shouldTriggerDeferBlock(injector)) return; + const lDetails = getLDeferBlockDetails(lView, tNode); const tDetails = getTDeferBlockDetails(tView, tNode); + + // Defer block is triggered, cleanup all registered trigger functions. + invokeAllTriggerCleanupFns(lDetails); + switch (tDetails.loadingState) { case DeferDependenciesLoadingState.NOT_STARTED: renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer); - triggerResourceLoading(tDetails, lView); + triggerResourceLoading(tDetails, lView, tNode); // The `loadingState` might have changed to "loading". if ((tDetails.loadingState as DeferDependenciesLoadingState) === diff --git a/packages/core/src/defer/interfaces.ts b/packages/core/src/defer/interfaces.ts index 1ad20286ee888..ed2285e27ade7 100644 --- a/packages/core/src/defer/interfaces.ts +++ b/packages/core/src/defer/interfaces.ts @@ -15,15 +15,18 @@ import type {DependencyType} from '../render3/interfaces/definition'; export type DependencyResolverFn = () => Array>; /** - * Enumerates all `on` triggers of a defer block. + * Defines types of defer block triggers. */ -export const enum DeferBlockTriggers { - OnIdle, - OnTimer, - OnImmediate, - OnHover, - OnInteraction, - OnViewport, +export const enum TriggerType { + /** + * Represents regular triggers (e.g. `@defer (on idle) { ... }`). + */ + Regular, + + /** + * Represents prefetch triggers (e.g. `@defer (prefetch on idle) { ... }`). + */ + Prefetch, } /** @@ -147,6 +150,8 @@ export const NEXT_DEFER_BLOCK_STATE = 0; export const DEFER_BLOCK_STATE = 1; export const STATE_IS_FROZEN_UNTIL = 2; export const LOADING_AFTER_CLEANUP_FN = 3; +export const TRIGGER_CLEANUP_FNS = 4; +export const PREFETCH_TRIGGER_CLEANUP_FNS = 5; /** * Describes instance-specific defer block data. @@ -178,6 +183,16 @@ export interface LDeferBlockDetails extends Array { * the loading block has the `after` parameter configured. */ [LOADING_AFTER_CLEANUP_FN]: VoidFunction|null; + + /** + * List of cleanup functions for regular triggers. + */ + [TRIGGER_CLEANUP_FNS]: VoidFunction[]|null; + + /** + * List of cleanup functions for prefetch triggers. + */ + [PREFETCH_TRIGGER_CLEANUP_FNS]: VoidFunction[]|null; } /** diff --git a/packages/core/src/defer/timer_scheduler.ts b/packages/core/src/defer/timer_scheduler.ts index 67380726a5d00..327197725bb70 100644 --- a/packages/core/src/defer/timer_scheduler.ts +++ b/packages/core/src/defer/timer_scheduler.ts @@ -10,15 +10,12 @@ import {ɵɵdefineInjectable} from '../di'; import {INJECTOR, LView} from '../render3/interfaces/view'; import {arrayInsert2, arraySplice} from '../util/array_utils'; -import {wrapWithLViewCleanup} from './utils'; - /** * Returns a function that captures a provided delay. * Invoking the returned function schedules a trigger. */ export function onTimer(delay: number) { - return (callback: VoidFunction, lView: LView, withLViewCleanup: boolean) => - scheduleTimerTrigger(delay, callback, lView, withLViewCleanup); + return (callback: VoidFunction, lView: LView) => scheduleTimerTrigger(delay, callback, lView); } /** @@ -27,18 +24,12 @@ export function onTimer(delay: number) { * @param delay A number of ms to wait until firing a callback. * @param callback A function to be invoked after a timeout. * @param lView LView that hosts an instance of a defer block. - * @param withLViewCleanup A flag that indicates whether a scheduled callback - * should be cancelled in case an LView is destroyed before a callback - * was invoked. */ -export function scheduleTimerTrigger( - delay: number, callback: VoidFunction, lView: LView, withLViewCleanup: boolean) { +export function scheduleTimerTrigger(delay: number, callback: VoidFunction, lView: LView) { const injector = lView[INJECTOR]!; const scheduler = injector.get(TimerScheduler); const cleanupFn = () => scheduler.remove(callback); - const wrappedCallback = - withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback; - scheduler.add(delay, wrappedCallback); + scheduler.add(delay, callback); return cleanupFn; } @@ -77,11 +68,16 @@ export class TimerScheduler { } remove(callback: VoidFunction) { - const callbackIndex = this.removeFromQueue(this.current, callback); + const {current, deferred} = this; + const callbackIndex = this.removeFromQueue(current, callback); if (callbackIndex === -1) { // Try cleaning up deferred queue only in case // we didn't find a callback in the "current" queue. - this.removeFromQueue(this.deferred, callback); + this.removeFromQueue(deferred, callback); + } + // If the last callback was removed and there is a pending timeout - cancel it. + if (current.length === 0 && deferred.length === 0) { + this.clearTimeout(); } } @@ -120,32 +116,41 @@ export class TimerScheduler { private scheduleTimer() { const callback = () => { - clearTimeout(this.timeoutId!); - this.timeoutId = null; + this.clearTimeout(); this.executingCallbacks = true; - // Invoke callbacks that were scheduled to run - // before the current time. - let now = Date.now(); - let lastCallbackIndex: number|null = null; + // Clone the current state of the queue, since it might be altered + // as we invoke callbacks. + const current = [...this.current]; + + // Invoke callbacks that were scheduled to run before the current time. + const now = Date.now(); + for (let i = 0; i < current.length; i += 2) { + const invokeAt = current[i] as number; + const callback = current[i + 1] as VoidFunction; + if (invokeAt <= now) { + callback(); + } else { + // We've reached a timer that should not be invoked yet. + break; + } + } + // The state of the queue might've changed after callbacks invocation, + // run the cleanup logic based on the *current* state of the queue. + let lastCallbackIndex = -1; for (let i = 0; i < this.current.length; i += 2) { const invokeAt = this.current[i] as number; - const callback = this.current[i + 1] as VoidFunction; if (invokeAt <= now) { - callback(); - // Point at the invoked callback function, which is located - // after the timestamp. + // Add +1 to account for a callback function that + // goes after the timestamp in events array. lastCallbackIndex = i + 1; } else { // We've reached a timer that should not be invoked yet. break; } } - if (lastCallbackIndex !== null) { - // If last callback index is `null` - no callbacks were invoked, - // so no cleanup is needed. Otherwise, remove invoked callbacks - // from the queue. + if (lastCallbackIndex >= 0) { arraySplice(this.current, 0, lastCallbackIndex + 1); } @@ -176,18 +181,16 @@ export class TimerScheduler { // First element in the queue points at the timestamp // of the first (earliest) event. const invokeAt = this.current[0] as number; - if (!this.timeoutId || + if (this.timeoutId === null || // Reschedule a timer in case a queue contains an item with // an earlier timestamp and the delta is more than an average // frame duration. (this.invokeTimerAt && (this.invokeTimerAt - invokeAt > FRAME_DURATION_MS))) { - if (this.timeoutId !== null) { - // There was a timeout already, but an earlier event was added - // into the queue. In this case we drop an old timer and setup - // a new one with an updated (smaller) timeout. - clearTimeout(this.timeoutId); - this.timeoutId = null; - } + // There was a timeout already, but an earlier event was added + // into the queue. In this case we drop an old timer and setup + // a new one with an updated (smaller) timeout. + this.clearTimeout(); + const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS); this.invokeTimerAt = invokeAt; this.timeoutId = setTimeout(callback, timeout) as unknown as number; @@ -195,11 +198,15 @@ export class TimerScheduler { } } - ngOnDestroy() { + private clearTimeout() { if (this.timeoutId !== null) { clearTimeout(this.timeoutId); this.timeoutId = null; } + } + + ngOnDestroy() { + this.clearTimeout(); this.current.length = 0; this.deferred.length = 0; } diff --git a/packages/core/src/defer/utils.ts b/packages/core/src/defer/utils.ts index 36e0443672bf7..3a63a7d361e6e 100644 --- a/packages/core/src/defer/utils.ts +++ b/packages/core/src/defer/utils.ts @@ -10,24 +10,11 @@ import {assertIndexInDeclRange} from '../render3/assert'; import {DependencyDef} from '../render3/interfaces/definition'; import {TContainerNode, TNode} from '../render3/interfaces/node'; import {HEADER_OFFSET, LView, TVIEW, TView} from '../render3/interfaces/view'; -import {getTNode, removeLViewOnDestroy, storeLViewOnDestroy} from '../render3/util/view_utils'; +import {getTNode} from '../render3/util/view_utils'; import {assertEqual, throwError} from '../util/assert'; import {DeferBlockState, DeferDependenciesLoadingState, LDeferBlockDetails, LOADING_AFTER_SLOT, MINIMUM_SLOT, TDeferBlockDetails} from './interfaces'; -/** - * Wraps a given callback into a logic that registers a cleanup function - * in the LView cleanup slot, to be invoked when an LView is destroyed. - */ -export function wrapWithLViewCleanup( - callback: VoidFunction, lView: LView, cleanup: VoidFunction): VoidFunction { - const wrappedCallback = () => { - callback(); - removeLViewOnDestroy(lView, cleanup); - }; - storeLViewOnDestroy(lView, cleanup); - return wrappedCallback; -} /** * Calculates a data slot index for defer block info (either static or diff --git a/packages/core/src/hydration/api.ts b/packages/core/src/hydration/api.ts index 63f7777a36feb..092cc38d5f9a5 100644 --- a/packages/core/src/hydration/api.ts +++ b/packages/core/src/hydration/api.ts @@ -7,7 +7,6 @@ */ import {APP_BOOTSTRAP_LISTENER, ApplicationRef, whenStable} from '../application_ref'; -import {ENABLED_SSR_FEATURES} from '../application_tokens'; import {Console} from '../console'; import {ENVIRONMENT_INITIALIZER, EnvironmentProviders, Injector, makeEnvironmentProviders} from '../di'; import {inject} from '../di/injector_compatibility'; @@ -137,7 +136,7 @@ export function withDomHydration(): EnvironmentProviders { } } if (isEnabled) { - inject(ENABLED_SSR_FEATURES).add('hydration'); + performance.mark('mark_use_counter', {detail: {feature: 'NgHydration'}}); } return isEnabled; }, diff --git a/packages/core/src/render3/after_render_hooks.ts b/packages/core/src/render3/after_render_hooks.ts index 4662c4b711ab6..f55e8b5557d3d 100644 --- a/packages/core/src/render3/after_render_hooks.ts +++ b/packages/core/src/render3/after_render_hooks.ts @@ -130,6 +130,11 @@ export interface InternalAfterNextRenderOptions { injector?: Injector; } +/** `AfterRenderRef` that does nothing. */ +const NOOP_AFTER_RENDER_REF: AfterRenderRef = { + destroy() {} +}; + /** * Register a callback to run once before any userspace `afterRender` or * `afterNextRender` callbacks. @@ -148,6 +153,11 @@ export interface InternalAfterNextRenderOptions { export function internalAfterNextRender( callback: VoidFunction, options?: InternalAfterNextRenderOptions) { const injector = options?.injector ?? inject(Injector); + + // Similarly to the public `afterNextRender` function, an internal one + // is only invoked in a browser. + if (!isPlatformBrowser(injector)) return; + const afterRenderEventManager = injector.get(AfterRenderEventManager); afterRenderEventManager.internalCallbacks.push(callback); } @@ -211,24 +221,23 @@ export function afterRender(callback: VoidFunction, options?: AfterRenderOptions const injector = options?.injector ?? inject(Injector); if (!isPlatformBrowser(injector)) { - return {destroy() {}}; + return NOOP_AFTER_RENDER_REF; } - let destroy: VoidFunction|undefined; - const unregisterFn = injector.get(DestroyRef).onDestroy(() => destroy?.()); + performance.mark('mark_use_counter', {detail: {feature: 'NgAfterRender'}}); + const afterRenderEventManager = injector.get(AfterRenderEventManager); // Lazily initialize the handler implementation, if necessary. This is so that it can be // tree-shaken if `afterRender` and `afterNextRender` aren't used. const callbackHandler = afterRenderEventManager.handler ??= new AfterRenderCallbackHandlerImpl(); - const ngZone = injector.get(NgZone); - const errorHandler = injector.get(ErrorHandler, null, {optional: true}); const phase = options?.phase ?? AfterRenderPhase.MixedReadWrite; - const instance = new AfterRenderCallback(ngZone, errorHandler, phase, callback); - - destroy = () => { + const destroy = () => { callbackHandler.unregister(instance); unregisterFn(); }; + const unregisterFn = injector.get(DestroyRef).onDestroy(destroy); + const instance = new AfterRenderCallback(injector, phase, callback); + callbackHandler.register(instance); return {destroy}; } @@ -288,27 +297,26 @@ export function afterNextRender( const injector = options?.injector ?? inject(Injector); if (!isPlatformBrowser(injector)) { - return {destroy() {}}; + return NOOP_AFTER_RENDER_REF; } - let destroy: VoidFunction|undefined; - const unregisterFn = injector.get(DestroyRef).onDestroy(() => destroy?.()); + performance.mark('mark_use_counter', {detail: {feature: 'NgAfterNextRender'}}); + const afterRenderEventManager = injector.get(AfterRenderEventManager); // Lazily initialize the handler implementation, if necessary. This is so that it can be // tree-shaken if `afterRender` and `afterNextRender` aren't used. const callbackHandler = afterRenderEventManager.handler ??= new AfterRenderCallbackHandlerImpl(); - const ngZone = injector.get(NgZone); - const errorHandler = injector.get(ErrorHandler, null, {optional: true}); const phase = options?.phase ?? AfterRenderPhase.MixedReadWrite; - const instance = new AfterRenderCallback(ngZone, errorHandler, phase, () => { - destroy?.(); - callback(); - }); - - destroy = () => { + const destroy = () => { callbackHandler.unregister(instance); unregisterFn(); }; + const unregisterFn = injector.get(DestroyRef).onDestroy(destroy); + const instance = new AfterRenderCallback(injector, phase, () => { + destroy(); + callback(); + }); + callbackHandler.register(instance); return {destroy}; } @@ -317,9 +325,15 @@ export function afterNextRender( * A wrapper around a function to be used as an after render callback. */ class AfterRenderCallback { + private zone: NgZone; + private errorHandler: ErrorHandler|null; + constructor( - private zone: NgZone, private errorHandler: ErrorHandler|null, - public readonly phase: AfterRenderPhase, private callbackFn: VoidFunction) {} + injector: Injector, public readonly phase: AfterRenderPhase, + private callbackFn: VoidFunction) { + this.zone = injector.get(NgZone); + this.errorHandler = injector.get(ErrorHandler, null, {optional: true}); + } invoke() { try { diff --git a/packages/core/src/render3/util/view_utils.ts b/packages/core/src/render3/util/view_utils.ts index 1a7756426fa98..8e792824f4b16 100644 --- a/packages/core/src/render3/util/view_utils.ts +++ b/packages/core/src/render3/util/view_utils.ts @@ -221,10 +221,6 @@ export function updateAncestorTraversalFlagsOnAttach(lView: LView) { */ export function markAncestorsForTraversal(lView: LView) { let parent = lView[PARENT]; - if (parent === null) { - return; - } - while (parent !== null) { // We stop adding markers to the ancestors once we reach one that already has the marker. This // is to avoid needlessly traversing all the way to the root when the marker already exists. diff --git a/packages/core/test/acceptance/defer_spec.ts b/packages/core/test/acceptance/defer_spec.ts index 0cea738eec30a..ae1c69dde4b9d 100644 --- a/packages/core/test/acceptance/defer_spec.ts +++ b/packages/core/test/acceptance/defer_spec.ts @@ -1183,8 +1183,18 @@ describe('@defer', () => { * and when it's cancelled. This is needed to keep track of calls * made to `requestIdleCallback` and `cancelIdleCallback` APIs. */ - let idleCallbacksRequested = 0; - const onIdleCallbackQueue: IdleRequestCallback[] = []; + let id = 0; + let idleCallbacksRequested: number; + let idleCallbacksInvoked: number; + let idleCallbacksCancelled: number; + const onIdleCallbackQueue: Map = new Map(); + + function resetCounters() { + idleCallbacksRequested = 0; + idleCallbacksInvoked = 0; + idleCallbacksCancelled = 0; + } + resetCounters(); let nativeRequestIdleCallback: (callback: IdleRequestCallback, options?: IdleRequestOptions) => number; @@ -1192,23 +1202,25 @@ describe('@defer', () => { const mockRequestIdleCallback = (callback: IdleRequestCallback, options?: IdleRequestOptions): number => { - onIdleCallbackQueue.push(callback); + onIdleCallbackQueue.set(id, callback); expect(idleCallbacksRequested).toBe(0); expect(NgZone.isInAngularZone()).toBe(true); idleCallbacksRequested++; - return 0; + return id++; }; const mockCancelIdleCallback = (id: number) => { - expect(idleCallbacksRequested).toBe(1); + onIdleCallbackQueue.delete(id); idleCallbacksRequested--; + idleCallbacksCancelled++; }; const triggerIdleCallbacks = () => { - for (const callback of onIdleCallbackQueue) { + for (const [_, callback] of onIdleCallbackQueue) { + idleCallbacksInvoked++; callback(null!); } - onIdleCallbackQueue.length = 0; // empty the queue + onIdleCallbackQueue.clear(); }; beforeEach(() => { @@ -1216,12 +1228,14 @@ describe('@defer', () => { nativeCancelIdleCallback = globalThis.cancelIdleCallback; globalThis.requestIdleCallback = mockRequestIdleCallback; globalThis.cancelIdleCallback = mockCancelIdleCallback; + resetCounters(); }); afterEach(() => { globalThis.requestIdleCallback = nativeRequestIdleCallback; globalThis.cancelIdleCallback = nativeCancelIdleCallback; - onIdleCallbackQueue.length = 0; // clear the queue + onIdleCallbackQueue.clear(); + resetCounters(); }); it('should be able to prefetch resources', async () => { @@ -2057,6 +2071,45 @@ describe('@defer', () => { // We loaded a nested block dependency, expect counter to be 2. expect(loadingFnInvokedTimes).toBe(2); }); + + it('should clear idle handlers when defer block is triggered', async () => { + @Component({ + standalone: true, + selector: 'root-app', + template: ` + @defer (when isVisible; on idle; prefetch on idle) { + Hello world! + } + ` + }) + class RootCmp { + isVisible = false; + } + + TestBed.configureTestingModule({deferBlockBehavior: DeferBlockBehavior.Playthrough}); + + clearDirectiveDefs(RootCmp); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + + // Expecting that an idle callback was requested. + expect(idleCallbacksRequested).toBe(1); + expect(idleCallbacksInvoked).toBe(0); + expect(idleCallbacksCancelled).toBe(0); + + // Trigger defer block. + fixture.componentInstance.isVisible = true; + fixture.detectChanges(); + + await allPendingDynamicImports(); + fixture.detectChanges(); + + // Expecting that an idle callback was cancelled and never invoked. + expect(idleCallbacksRequested).toBe(0); + expect(idleCallbacksInvoked).toBe(0); + expect(idleCallbacksCancelled).toBe(1); + }); }); // Note: these cases specifically use `on interaction`, however @@ -3190,74 +3243,56 @@ describe('@defer', () => { expect(loadingFnInvokedTimes).toBe(1); }); - it('should trigger prefetching and rendering based on `on timer` condition', async () => { - @Component({ - selector: 'nested-cmp', - standalone: true, - template: 'Rendering {{ block }} block.', - }) - class NestedCmp { - @Input() block!: string; - } - - @Component({ - standalone: true, - selector: 'root-app', - imports: [NestedCmp], - template: ` - @defer (on timer(200ms); prefetch on timer(100ms)) { - - } @placeholder { - Placeholder - } - ` - }) - class RootCmp { - } - - let loadingFnInvokedTimes = 0; - const deferDepsInterceptor = { - intercept() { - return () => { - loadingFnInvokedTimes++; - return [dynamicImportOf(NestedCmp)]; - }; - } - }; - - TestBed.configureTestingModule({ - providers: [ - {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, - ], - deferBlockBehavior: DeferBlockBehavior.Playthrough, - }); - - clearDirectiveDefs(RootCmp); + it('should trigger prefetching and rendering based on `on timer` condition', fakeAsync(() => { + const {fixture} = createFixture(` + @defer (on timer(200ms); prefetch on timer(100ms)) { + + } @placeholder { + Placeholder + } + `); - const fixture = TestBed.createComponent(RootCmp); - fixture.detectChanges(); + verifyTimeline( + fixture, + [50, 'Placeholder'], + [150, 'Placeholder'], + [250, 'Main'], + ); + })); - expect(fixture.nativeElement.outerHTML).toContain('Placeholder'); + it('should clear timeout callbacks when defer block is triggered', fakeAsync(() => { + const setSpy = spyOn(globalThis, 'setTimeout'); + const clearSpy = spyOn(globalThis, 'clearTimeout'); - // Make sure loading function is not yet invoked. - expect(loadingFnInvokedTimes).toBe(0); + @Component({ + standalone: true, + selector: 'root-app', + template: ` + @defer (when isVisible; on timer(200ms); prefetch on timer(100ms)) { + Hello world! + } + ` + }) + class RootCmp { + isVisible = false; + } - await timer(110); - await allPendingDynamicImports(); // fetching dependencies of the defer block - fixture.detectChanges(); + TestBed.configureTestingModule({deferBlockBehavior: DeferBlockBehavior.Playthrough}); - // Expect that the loading resources function was invoked once. - expect(loadingFnInvokedTimes).toBe(1); + clearDirectiveDefs(RootCmp); - await timer(110); - fixture.detectChanges(); + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); - // Verify primary blocks content. - expect(fixture.nativeElement.outerHTML).toContain('Rendering primary block'); + // Trigger defer block + fixture.componentInstance.isVisible = true; + fixture.detectChanges(); - // Make sure the loading function wasn't invoked again (count remains `1`). - expect(loadingFnInvokedTimes).toBe(1); - }); + // The `clearTimeout` was called synchronously, because the `when` + // condition was triggered, which resulted in timers cleanup. + expect(setSpy).toHaveBeenCalledTimes(2); + expect(clearSpy).toHaveBeenCalledTimes(2); + })); }); describe('viewport triggers', () => { @@ -3750,4 +3785,96 @@ describe('@defer', () => { expect(fixture.nativeElement.textContent.trim()).toBe('d1 d2 d3 d4 d5 d6'); })); }); + + describe('DOM-based events cleanup', () => { + it('should unbind `interaction` trigger events when the deferred block is loaded', async () => { + @Component({ + standalone: true, + template: ` + @defer ( + when isVisible; + on interaction(trigger); + prefetch on interaction(prefetchTrigger) + ) { Main content } + +
+ ` + }) + class MyCmp { + isVisible = false; + } + + const fixture = TestBed.createComponent(MyCmp); + fixture.detectChanges(); + + const button = fixture.nativeElement.querySelector('button'); + const triggerSpy = spyOn(button, 'removeEventListener'); + const div = fixture.nativeElement.querySelector('div'); + const prefetchSpy = spyOn(div, 'removeEventListener'); + + fixture.componentInstance.isVisible = true; + fixture.detectChanges(); + + await allPendingDynamicImports(); + fixture.detectChanges(); + + // Verify that trigger element is cleaned up. + expect(triggerSpy).toHaveBeenCalledTimes(2); + expect(triggerSpy).toHaveBeenCalledWith('click', jasmine.any(Function), jasmine.any(Object)); + expect(triggerSpy) + .toHaveBeenCalledWith('keydown', jasmine.any(Function), jasmine.any(Object)); + + // Verify that prefetch trigger element is cleaned up. + expect(prefetchSpy).toHaveBeenCalledTimes(2); + expect(prefetchSpy).toHaveBeenCalledWith('click', jasmine.any(Function), jasmine.any(Object)); + expect(prefetchSpy) + .toHaveBeenCalledWith('keydown', jasmine.any(Function), jasmine.any(Object)); + }); + + it('should unbind `hover` trigger events when the deferred block is loaded', async () => { + @Component({ + standalone: true, + template: ` + @defer ( + when isVisible; + on hover(trigger); + prefetch on hover(prefetchTrigger) + ) { Main content } + +
+ ` + }) + class MyCmp { + isVisible = false; + } + + const fixture = TestBed.createComponent(MyCmp); + fixture.detectChanges(); + + const button = fixture.nativeElement.querySelector('button'); + const triggerSpy = spyOn(button, 'removeEventListener'); + const div = fixture.nativeElement.querySelector('div'); + const prefetchSpy = spyOn(div, 'removeEventListener'); + + fixture.componentInstance.isVisible = true; + fixture.detectChanges(); + + await allPendingDynamicImports(); + fixture.detectChanges(); + + // Verify that trigger element is cleaned up. + expect(triggerSpy).toHaveBeenCalledTimes(2); + expect(triggerSpy) + .toHaveBeenCalledWith('mouseenter', jasmine.any(Function), jasmine.any(Object)); + expect(triggerSpy) + .toHaveBeenCalledWith('focusin', jasmine.any(Function), jasmine.any(Object)); + + // Verify that prefetch trigger element is cleaned up. + expect(prefetchSpy).toHaveBeenCalledTimes(2); + expect(prefetchSpy) + .toHaveBeenCalledWith('mouseenter', jasmine.any(Function), jasmine.any(Object)); + expect(prefetchSpy) + .toHaveBeenCalledWith('focusin', jasmine.any(Function), jasmine.any(Object)); + }); + }); }); diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 06d945d529f7b..f6aff46ce982f 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -122,9 +122,6 @@ { "name": "DeferBlockBehavior" }, - { - "name": "DeferBlockCleanupManager" - }, { "name": "DeferBlockInternalState" }, @@ -383,6 +380,9 @@ { "name": "PLATFORM_INITIALIZER" }, + { + "name": "PREFETCH_TRIGGER_CLEANUP_FNS" + }, { "name": "PRESERVE_HOST_CONTENT" }, @@ -482,6 +482,9 @@ { "name": "TRACKED_LVIEWS" }, + { + "name": "TRIGGER_CLEANUP_FNS" + }, { "name": "TYPE" }, @@ -2018,12 +2021,18 @@ { "name": "invertObject" }, + { + "name": "invokeAllTriggerCleanupFns" + }, { "name": "invokeDirectivesHostBindings" }, { "name": "invokeHostBindingsInCreationMode" }, + { + "name": "invokeTriggerCleanupFns" + }, { "name": "isArray" }, @@ -2327,6 +2336,9 @@ { "name": "shouldSearchParent" }, + { + "name": "storeLViewOnDestroy" + }, { "name": "stringify" }, @@ -2393,6 +2405,9 @@ { "name": "ɵɵStandaloneFeature" }, + { + "name": "ɵɵdefer" + }, { "name": "ɵɵdeferWhen" }, diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index b10e27b2bc858..a8cb4270236c2 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -140,9 +140,6 @@ { "name": "EMPTY_PAYLOAD" }, - { - "name": "ENABLED_SSR_FEATURES" - }, { "name": "ENVIRONMENT_INITIALIZER" }, diff --git a/packages/core/testing/src/defer.ts b/packages/core/testing/src/defer.ts index 2030276133e94..90d6ec29b7c5d 100644 --- a/packages/core/testing/src/defer.ts +++ b/packages/core/testing/src/defer.ts @@ -33,7 +33,7 @@ export class DeferBlockFixture { `but there was no @${stateAsString.toLowerCase()} block defined in a template.`); } if (state === DeferBlockState.Complete) { - await triggerResourceLoading(this.block.tDetails, this.block.lView); + await triggerResourceLoading(this.block.tDetails, this.block.lView, this.block.tNode); } renderDeferBlockState(state, this.block.tNode, this.block.lContainer); this.componentFixture.detectChanges(); diff --git a/packages/language-service/src/template_target.ts b/packages/language-service/src/template_target.ts index bed3337dd7889..4a5eafd1bbcd9 100644 --- a/packages/language-service/src/template_target.ts +++ b/packages/language-service/src/template_target.ts @@ -380,6 +380,14 @@ class TemplateTargetVisitor implements t.Visitor { // nodes. return; } + if (last instanceof t.UnknownBlock && isWithin(this.position, last.nameSpan)) { + // Autocompletions such as `@\nfoo`, where a newline follows a bare `@`, would not work + // because the language service visitor sees us inside the subsequent text node. We deal with + // this with using a special-case: if we are completing inside the name span, we don't + // continue to the subsequent text node. + return; + } + if (isTemplateNodeWithKeyAndValue(node) && !isWithinKeyValue(this.position, node)) { // If cursor is within source span but not within key span or value span, // do not return the node. diff --git a/packages/language-service/test/completions_spec.ts b/packages/language-service/test/completions_spec.ts index 038c026b99162..26fcfec220c0f 100644 --- a/packages/language-service/test/completions_spec.ts +++ b/packages/language-service/test/completions_spec.ts @@ -282,12 +282,64 @@ describe('completions', () => { }); describe('for blocks', () => { - it('at top level', () => { - const {templateFile} = setup(`@`, ``); - templateFile.moveCursorToText('@¦'); - const completions = templateFile.getCompletionsAtPosition(); - expectContain( - completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), ['if']); + const completionPrefixes = ['@', '@i']; + + describe(`at top level`, () => { + for (const completionPrefix of completionPrefixes) { + it(`in empty file (with prefix ${completionPrefix})`, () => { + const {templateFile} = setup(`${completionPrefix}`, ``); + templateFile.moveCursorToText(`${completionPrefix}¦`); + const completions = templateFile.getCompletionsAtPosition(); + expectContain( + completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), + ['if']); + }); + + it(`after text (with prefix ${completionPrefix})`, () => { + const {templateFile} = setup(`foo ${completionPrefix}`, ``); + templateFile.moveCursorToText(`${completionPrefix}¦`); + const completions = templateFile.getCompletionsAtPosition(); + expectContain( + completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), + ['if']); + }); + + it(`before text (with prefix ${completionPrefix})`, () => { + const {templateFile} = setup(`${completionPrefix} foo`, ``); + templateFile.moveCursorToText(`${completionPrefix}¦`); + const completions = templateFile.getCompletionsAtPosition(); + expectContain( + completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), + ['if']); + }); + + it(`after newline with text on preceding line (with prefix ${completionPrefix})`, () => { + const {templateFile} = setup(`foo\n${completionPrefix}`, ``); + templateFile.moveCursorToText(`${completionPrefix}¦`); + const completions = templateFile.getCompletionsAtPosition(); + expectContain( + completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), + ['if']); + }); + + it(`before newline with text on newline (with prefix ${completionPrefix})`, () => { + const {templateFile} = setup(`${completionPrefix}\nfoo`, ``); + templateFile.moveCursorToText(`${completionPrefix}¦`); + const completions = templateFile.getCompletionsAtPosition(); + expectContain( + completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), + ['if']); + }); + + it(`in a practical case, on its own line (with prefix ${completionPrefix})`, () => { + const {templateFile} = setup(`
\n ${completionPrefix}\n`, ``); + templateFile.moveCursorToText(`${completionPrefix}¦`); + const completions = templateFile.getCompletionsAtPosition(); + expectContain( + completions, unsafeCastDisplayInfoKindToScriptElementKind(DisplayInfoKind.BLOCK), + ['if']); + }); + } }); it('inside if', () => { diff --git a/packages/platform-server/src/http.ts b/packages/platform-server/src/http.ts index 80098962d9846..6dc14998b5b01 100644 --- a/packages/platform-server/src/http.ts +++ b/packages/platform-server/src/http.ts @@ -6,8 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {XhrFactory} from '@angular/common'; -import {Injectable, Provider} from '@angular/core'; +import {PlatformLocation, XhrFactory} from '@angular/common'; +import {HttpEvent, HttpHandlerFn, HttpRequest, ɵHTTP_ROOT_INTERCEPTOR_FNS as HTTP_ROOT_INTERCEPTOR_FNS} from '@angular/common/http'; +import {inject, Injectable, Provider} from '@angular/core'; +import {Observable} from 'rxjs'; @Injectable() export class ServerXhr implements XhrFactory { @@ -34,7 +36,31 @@ export class ServerXhr implements XhrFactory { } } +function relativeUrlsTransformerInterceptorFn( + request: HttpRequest, next: HttpHandlerFn): Observable> { + const platformLocation = inject(PlatformLocation); + const {href, protocol, hostname, port} = platformLocation; + if (!protocol.startsWith('http')) { + return next(request); + } + + let urlPrefix = `${protocol}//${hostname}`; + if (port) { + urlPrefix += `:${port}`; + } + + const baseHref = platformLocation.getBaseHrefFromDOM() || href; + const baseUrl = new URL(baseHref, urlPrefix); + const newUrl = new URL(request.url, baseUrl).toString(); + + return next(request.clone({url: newUrl})); +} export const SERVER_HTTP_PROVIDERS: Provider[] = [ {provide: XhrFactory, useClass: ServerXhr}, + { + provide: HTTP_ROOT_INTERCEPTOR_FNS, + useValue: relativeUrlsTransformerInterceptorFn, + multi: true, + }, ]; diff --git a/packages/platform-server/src/utils.ts b/packages/platform-server/src/utils.ts index ec416517d1af8..a3ffcbe6f54a3 100644 --- a/packages/platform-server/src/utils.ts +++ b/packages/platform-server/src/utils.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationRef, InjectionToken, PlatformRef, Provider, Renderer2, StaticProvider, Type, ɵannotateForHydration as annotateForHydration, ɵENABLED_SSR_FEATURES as ENABLED_SSR_FEATURES, ɵIS_HYDRATION_DOM_REUSE_ENABLED as IS_HYDRATION_DOM_REUSE_ENABLED, ɵSSR_CONTENT_INTEGRITY_MARKER as SSR_CONTENT_INTEGRITY_MARKER, ɵwhenStable as whenStable} from '@angular/core'; +import {ApplicationRef, InjectionToken, PlatformRef, Provider, Renderer2, StaticProvider, Type, ɵannotateForHydration as annotateForHydration, ɵIS_HYDRATION_DOM_REUSE_ENABLED as IS_HYDRATION_DOM_REUSE_ENABLED, ɵSSR_CONTENT_INTEGRITY_MARKER as SSR_CONTENT_INTEGRITY_MARKER, ɵwhenStable as whenStable} from '@angular/core'; import {PlatformState} from './platform_state'; import {platformServer} from './server'; @@ -50,11 +50,6 @@ function appendSsrContentIntegrityMarker(doc: Document) { function appendServerContextInfo(applicationRef: ApplicationRef) { const injector = applicationRef.injector; let serverContext = sanitizeServerContext(injector.get(SERVER_CONTEXT, DEFAULT_SERVER_CONTEXT)); - const features = injector.get(ENABLED_SSR_FEATURES); - if (features.size > 0) { - // Append features information into the server context value. - serverContext += `|${Array.from(features).join(',')}`; - } applicationRef.components.forEach(componentRef => { const renderer = componentRef.injector.get(Renderer2); const element = componentRef.location.nativeElement; diff --git a/packages/platform-server/test/hydration_spec.ts b/packages/platform-server/test/hydration_spec.ts index cbdb911864f3b..448ff232811e1 100644 --- a/packages/platform-server/test/hydration_spec.ts +++ b/packages/platform-server/test/hydration_spec.ts @@ -2374,6 +2374,53 @@ describe('platform-server hydration integration', () => { verifyClientAndSSRContentsMatch(ssrContents, clientRootNode); }); + it('should not reference IntersectionObserver on the server', async () => { + // This test verifies that there are no errors produced while rendering on a server + // when `on viewport` trigger is used for a defer block. + @Component({ + selector: 'my-lazy-cmp', + standalone: true, + template: 'Hi!', + }) + class MyLazyCmp { + } + + @Component({ + standalone: true, + selector: 'app', + imports: [MyLazyCmp], + template: ` + @defer (when isVisible; prefetch on viewport(ref)) { + + } @placeholder { +
Placeholder!
+ } + ` + }) + class SimpleComponent { + isVisible = false; + } + + const errors: string[] = []; + class CustomErrorHandler extends ErrorHandler { + override handleError(error: any): void { + errors.push(error); + } + } + const envProviders = [{ + provide: ErrorHandler, + useClass: CustomErrorHandler, + }]; + + const html = await ssr(SimpleComponent, undefined, envProviders); + const ssrContents = getAppContents(html); + expect(ssrContents).toContain(' { @Component({ selector: 'my-lazy-cmp', diff --git a/packages/platform-server/test/integration_spec.ts b/packages/platform-server/test/integration_spec.ts index 2e0e75a4c4f2b..34b750d736efc 100644 --- a/packages/platform-server/test/integration_spec.ts +++ b/packages/platform-server/test/integration_spec.ts @@ -11,11 +11,11 @@ import {animate, AnimationBuilder, state, style, transition, trigger} from '@ang import {DOCUMENT, isPlatformServer, PlatformLocation, ɵgetDOM as getDOM} from '@angular/common'; import {HTTP_INTERCEPTORS, HttpClient, HttpClientModule, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http'; import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; -import {ApplicationConfig, ApplicationRef, Component, destroyPlatform, EnvironmentProviders, HostListener, Inject, inject as coreInject, Injectable, Input, makeStateKey, mergeApplicationConfig, NgModule, NgZone, PLATFORM_ID, Provider, TransferState, Type, ViewEncapsulation, ɵwhenStable as whenStable} from '@angular/core'; +import {ApplicationConfig, ApplicationRef, Component, destroyPlatform, EnvironmentProviders, HostListener, Inject, inject as coreInject, Injectable, Input, makeStateKey, mergeApplicationConfig, NgModule, NgModuleRef, NgZone, PLATFORM_ID, Provider, TransferState, Type, ViewEncapsulation, ɵwhenStable as whenStable} from '@angular/core'; import {SSR_CONTENT_INTEGRITY_MARKER} from '@angular/core/src/hydration/utils'; import {InitialRenderPendingTasks} from '@angular/core/src/initial_render_pending_tasks'; import {TestBed} from '@angular/core/testing'; -import {bootstrapApplication, BrowserModule, provideClientHydration, Title, withNoHttpTransferCache} from '@angular/platform-browser'; +import {bootstrapApplication, BrowserModule, provideClientHydration, Title} from '@angular/platform-browser'; import {BEFORE_APP_SERIALIZED, INITIAL_CONFIG, platformServer, PlatformState, provideServerRendering, renderModule, ServerModule} from '@angular/platform-server'; import {provideRouter, RouterOutlet, Routes} from '@angular/router'; import {Observable} from 'rxjs'; @@ -938,30 +938,6 @@ describe('platform-server integration', () => { expect(output).toContain(``); }); - it('includes a set of features into `ng-server-context` attribute', async () => { - const options = { - document: doc, - }; - const providers = [{ - provide: SERVER_CONTEXT, - useValue: 'ssg', - }]; - @Component({ - standalone: true, - selector: 'app', - template: `
Works!
`, - }) - class SimpleApp { - } - - const bootstrap = renderApplication( - getStandaloneBoostrapFn(SimpleApp, [provideClientHydration()]), - {...options, platformProviders: providers}); - // HttpClient cache and DOM hydration are enabled by default. - const output = await bootstrap; - expect(output).toMatch(/ng-server-context="ssg\|httpcache,hydration"/); - }); - it('should handle false values on attributes', async () => { const options = {document: doc}; const bootstrap = isStandalone ? renderApplication(MyHostComponentStandalone, options) : @@ -1171,6 +1147,43 @@ describe('platform-server integration', () => { }); }); }); + + describe(`given 'url' is provided in 'INITIAL_CONFIG'`, () => { + let mock: HttpTestingController; + let ref: NgModuleRef; + let http: HttpClient; + + beforeEach(async () => { + const platform = platformServer([{ + provide: INITIAL_CONFIG, + useValue: {document: '', url: 'http://localhost:4000/foo'} + }]); + + ref = await platform.bootstrapModule(HttpInterceptorExampleModule); + mock = ref.injector.get(HttpTestingController); + http = ref.injector.get(HttpClient); + }); + + it('should resolve relative request URLs to absolute', async () => { + ref.injector.get(NgZone).run(() => { + http.get('/testing').subscribe(body => { + NgZone.assertInAngularZone(); + expect(body).toEqual('success!'); + }); + mock.expectOne('http://localhost:4000/testing').flush('success!'); + }); + }); + + it(`should not replace the baseUrl of a request when it's absolute`, async () => { + ref.injector.get(NgZone).run(() => { + http.get('http://localhost/testing').subscribe(body => { + NgZone.assertInAngularZone(); + expect(body).toEqual('success!'); + }); + mock.expectOne('http://localhost/testing').flush('success!'); + }); + }); + }); }); }); })(); diff --git a/yarn.lock b/yarn.lock index 3b1ce5cdeb7e3..1a653626203de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11,11 +11,12 @@ uuid "^8.3.2" "@actions/http-client@^2.0.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.1.1.tgz#a8e97699c315bed0ecaeaaeb640948470d4586a0" - integrity sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.0.tgz#f8239f375be6185fcd07765efdcf0031ad5df1a0" + integrity sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg== dependencies: tunnel "^0.0.6" + undici "^5.25.4" "@ampproject/remapping@2.2.1", "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -429,7 +430,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4", "@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== @@ -437,12 +438,7 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== - -"@babel/compat-data@^7.23.2": +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== @@ -468,7 +464,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.23.2": +"@babel/core@7.23.2", "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== @@ -489,28 +485,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.12.3", "@babel/core@^7.16.0": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@7.22.15", "@babel/generator@^7.22.10", "@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== @@ -520,7 +495,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@7.23.0", "@babel/generator@^7.23.0": +"@babel/generator@7.23.0", "@babel/generator@^7.22.15", "@babel/generator@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== @@ -544,7 +519,7 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== @@ -579,17 +554,6 @@ 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" - "@babel/helper-define-polyfill-provider@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" @@ -606,15 +570,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-function-name@^7.23.0": +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== @@ -630,11 +586,11 @@ "@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== + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.22.15" + "@babel/types" "^7.23.0" "@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" @@ -643,18 +599,7 @@ dependencies: "@babel/types" "^7.22.15" -"@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.20" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" - integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-module-transforms@^7.23.0": +"@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== @@ -721,7 +666,7 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": +"@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== @@ -740,16 +685,7 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.11", "@babel/helpers@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" - integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/helpers@^7.23.2": +"@babel/helpers@^7.22.15", "@babel/helpers@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== @@ -767,16 +703,11 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@7.23.0", "@babel/parser@^7.23.0": +"@babel/parser@7.23.0", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.11", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": - version "7.22.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" - integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== - "@babel/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" @@ -942,7 +873,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@7.22.15", "@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== @@ -952,7 +883,7 @@ "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-generator-functions@7.23.2", "@babel/plugin-transform-async-generator-functions@^7.23.2": +"@babel/plugin-transform-async-generator-functions@7.23.2", "@babel/plugin-transform-async-generator-functions@^7.22.15", "@babel/plugin-transform-async-generator-functions@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb" integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ== @@ -978,14 +909,7 @@ 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.23.0": +"@babel/plugin-transform-block-scoping@^7.22.15", "@babel/plugin-transform-block-scoping@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022" integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g== @@ -1032,14 +956,7 @@ "@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.23.0": +"@babel/plugin-transform-destructuring@^7.22.15", "@babel/plugin-transform-destructuring@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c" integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg== @@ -1131,15 +1048,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@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-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-amd@^7.23.0": +"@babel/plugin-transform-modules-amd@^7.22.5", "@babel/plugin-transform-modules-amd@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88" integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw== @@ -1147,16 +1056,7 @@ "@babel/helper-module-transforms" "^7.23.0" "@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.23.0": +"@babel/plugin-transform-modules-commonjs@^7.22.15", "@babel/plugin-transform-modules-commonjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== @@ -1165,17 +1065,7 @@ "@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.23.0": +"@babel/plugin-transform-modules-systemjs@^7.22.11", "@babel/plugin-transform-modules-systemjs@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160" integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg== @@ -1251,16 +1141,7 @@ "@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.23.0": +"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158" integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g== @@ -1594,21 +1475,21 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.16.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.15.tgz#7aeb9460598a997b0fe74982a5b02fb9e5d264d9" - integrity sha512-SAj8oKi8UogVi6eXQXKNPu8qZ78Yzy7zawrlTr0M+IuW/g8Qe9gVDhGcF9h1S69OyACpYoLxEzpjs1M15sI5wQ== + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz#a5cd9d8b408fb946b2f074b21ea40c04e516795c" + integrity sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@7.22.15", "@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.23.2": +"@babel/runtime@7.23.2", "@babel/runtime@^7.8.4": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== @@ -1624,7 +1505,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@7.23.2", "@babel/traverse@^7.23.2": +"@babel/traverse@7.23.2", "@babel/traverse@^7.22.17", "@babel/traverse@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -1640,23 +1521,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.22.11", "@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" - integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.19" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@7.23.0", "@babel/types@^7.23.0": +"@babel/types@7.23.0", "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== @@ -1665,15 +1530,6 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.11", "@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" - integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.19" - to-fast-properties "^2.0.0" - "@bazel/bazelisk@^1.7.5": version "1.18.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.18.0.tgz#90ea8fc432ac6a7c83020e47a4bf59cfa2c81020" @@ -1765,6 +1621,11 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -2132,6 +1993,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz#d46a6e220a717f31f39ae80f49477cc3220be0f0" integrity sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA== +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + "@google-cloud/paginator@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@google-cloud/paginator/-/paginator-4.0.1.tgz#5fb8793d4f84d18c50a6f2fad3dadab8d2c533ef" @@ -2156,15 +2022,15 @@ integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== "@google-cloud/pubsub@^3.0.1": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.3.tgz#4ec354fab0e6492654b4365024e0b15def23a08b" - integrity sha512-ZRDC4g7tpIJ8fkAp4MiU+tDfousM/q6pXK6ytFn0cbYEdNQuWOf4wqopNYMOUJ+AIjaTbgmNw77dStOKTc9Acg== + version "3.7.5" + resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.5.tgz#3fed656b7e7ea3a4618d5590004f08321a1389b9" + integrity sha512-4Qrry4vIToth5mqduVslltWVsyb7DR8OhnkBA3F7XiE0jgQsiuUfwp/RB2F559aXnRbwcfmjvP4jSuEaGcjrCQ== dependencies: "@google-cloud/paginator" "^4.0.0" "@google-cloud/precise-date" "^3.0.0" "@google-cloud/projectify" "^3.0.0" "@google-cloud/promisify" "^2.0.0" - "@opentelemetry/api" "^1.0.0" + "@opentelemetry/api" "^1.6.0" "@opentelemetry/semantic-conventions" "~1.3.0" "@types/duplexify" "^3.6.0" "@types/long" "^4.0.0" @@ -2255,7 +2121,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": +"@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== @@ -2269,9 +2135,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2294,9 +2160,11 @@ integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@ljharb/through@^2.3.9": - version "2.3.9" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.9.tgz#85f221eb82f9d555e180e87d6e50fb154af85408" - integrity sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ== + version "2.3.11" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.11.tgz#783600ff12c06f21a76cc26e33abd0b1595092f9" + integrity sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w== + dependencies: + call-bind "^1.0.2" "@material/animation@15.0.0-canary.a246a4439.0": version "15.0.0-canary.a246a4439.0" @@ -3000,15 +2868,6 @@ "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@microsoft/api-extractor-model@7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.0.tgz#33136473abd048ca219a7f0bcb0b80030d712853" - integrity sha512-QIMtUVm1tqiKG+M6ciFgRShcDoovyltaeg+CbyOnyr7SMrp6gg0ojK5/nToMqR9kAvsTS4QVgW4Twl50EoAjcw== - dependencies: - "@microsoft/tsdoc" "0.14.2" - "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.60.0" - "@microsoft/api-extractor-model@7.28.2": version "7.28.2" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.2.tgz#91c66dd820ccc70e0c163e06b392d8363f1b9269" @@ -3018,7 +2877,7 @@ "@microsoft/tsdoc-config" "~0.16.1" "@rushstack/node-core-library" "3.61.0" -"@microsoft/api-extractor@7.38.0": +"@microsoft/api-extractor@7.38.0", "@microsoft/api-extractor@^7.24.2": version "7.38.0" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.38.0.tgz#e72546d6766b3866578a462b040f71b17779e1c5" integrity sha512-e1LhZYnfw+JEebuY2bzhw0imDCl1nwjSThTrQqBXl40hrVo6xm3j/1EpUr89QyzgjqmAwek2ZkIVZbrhaR+cqg== @@ -3036,24 +2895,6 @@ source-map "~0.6.1" typescript "~5.0.4" -"@microsoft/api-extractor@^7.24.2": - version "7.37.0" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.37.0.tgz#374a0ef0e166de53a44033c4c59c7f25c96e15e5" - integrity sha512-df/wffWpDhYRw7kzdxeHGsCpim+dC8aFiZlsJb4uFvVPWhBZpDzOhQxSUTFx3Df1ORY+/JjuPR3fDE9Hq+PHzQ== - dependencies: - "@microsoft/api-extractor-model" "7.28.0" - "@microsoft/tsdoc" "0.14.2" - "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.60.0" - "@rushstack/rig-package" "0.5.0" - "@rushstack/ts-command-line" "4.16.0" - colors "~1.2.1" - lodash "~4.17.15" - resolve "~1.22.1" - semver "~7.5.4" - source-map "~0.6.1" - typescript "~5.0.4" - "@microsoft/tsdoc-config@~0.16.1": version "0.16.2" resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz#b786bb4ead00d54f53839a458ce626c8548d3adf" @@ -3106,10 +2947,11 @@ 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== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.0.tgz#e81f00fdb2a670750ff7731bbefb47ecbf0ccf44" + integrity sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q== dependencies: + agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" lru-cache "^10.0.1" @@ -3186,9 +3028,9 @@ universal-user-agent "^6.0.0" "@octokit/openapi-types@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.0.0.tgz#f43d765b3c7533fd6fb88f3f25df079c24fccf69" - integrity sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw== + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== "@octokit/request-error@^3.0.0": version "3.0.3" @@ -3218,7 +3060,7 @@ dependencies: "@octokit/openapi-types" "^18.0.0" -"@opentelemetry/api@^1.0.0": +"@opentelemetry/api@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.6.0.tgz#de2c6823203d6f319511898bb5de7e70f5267e19" integrity sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g== @@ -3307,38 +3149,38 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@puppeteer/browsers@1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.7.0.tgz#714a25ad6963f5478e36004ea7eda254870a4659" - integrity sha512-sl7zI0IkbQGak/+IE3VEEZab5SSOlI5F6558WvzWGC1n3+C722rfewC1ZIkcF9dsoGSsxhsONoseVlNQG4wWvQ== +"@puppeteer/browsers@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.7.1.tgz#04f1e3aec4b87f50a7acc8f64be2149bda014f0a" + integrity sha512-nIb8SOBgDEMFY2iS2MdnUZOg2ikcYchRrBoF+wtdjieRFKR2uGRipHY/oFLo+2N6anDualyClPzGywTHRGrLfw== dependencies: debug "4.3.4" extract-zip "2.0.1" progress "2.0.3" - proxy-agent "6.3.0" + proxy-agent "6.3.1" tar-fs "3.0.4" unbzip2-stream "1.4.3" yargs "17.7.1" "@rollup/plugin-babel@^6.0.0": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz#07ccde15de278c581673034ad6accdb4a153dfeb" - integrity sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg== + version "6.0.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz#bd698e351fa9aa9619fcae780aea2a603d98e4c4" + integrity sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw== dependencies: "@babel/helper-module-imports" "^7.18.6" "@rollup/pluginutils" "^5.0.1" "@rollup/plugin-commonjs@^25.0.0": - version "25.0.4" - resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.4.tgz#a7547a0c4ec3fa79818eb313e1de0023e548f4e6" - integrity sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ== + version "25.0.7" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz#145cec7589ad952171aeb6a585bbeabd0fd3b4cf" + integrity sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ== dependencies: "@rollup/pluginutils" "^5.0.1" commondir "^1.0.1" estree-walker "^2.0.2" glob "^8.0.3" is-reference "1.2.1" - magic-string "^0.27.0" + magic-string "^0.30.3" "@rollup/plugin-node-resolve@^13.0.4": version "13.3.0" @@ -3362,27 +3204,14 @@ picomatch "^2.2.2" "@rollup/pluginutils@^5.0.1": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.4.tgz#74f808f9053d33bafec0cc98e7b835c9667d32ba" - integrity sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g== + version "5.0.5" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c" + integrity sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q== dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" picomatch "^2.3.1" -"@rushstack/node-core-library@3.60.0": - version "3.60.0" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.60.0.tgz#a52ca6b98762e9f64c1735d21456510d2aa956e3" - integrity sha512-PcyrqhILvzU+65wMFybQ2VeGNnU5JzhDq2OvUi3j6jPUxyllM7b2hrRUwCuVaYboewYzIbpzXFzgxe2K7ii1nw== - dependencies: - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.22.1" - semver "~7.5.4" - z-schema "~5.0.2" - "@rushstack/node-core-library@3.61.0": version "3.61.0" resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.61.0.tgz#7441a0d2ae5268b758a7a49588a78cd55af57e66" @@ -3396,14 +3225,6 @@ semver "~7.5.4" z-schema "~5.0.2" -"@rushstack/rig-package@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.0.tgz#cca786e08634d12c6fde790d524a410a17f173d9" - integrity sha512-bGnOW4DWHOePDiABKy6qyqYJl9i7fKn4bRucExRVt5QzyPxuVHMl8CMmCabtoNSpXzgG3qymWOrMoa/W2PpJrw== - dependencies: - resolve "~1.22.1" - strip-json-comments "~3.1.1" - "@rushstack/rig-package@0.5.1": version "0.5.1" resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.1.tgz#6c9c283cc96b5bb1eae9875946d974ac5429bb21" @@ -3412,16 +3233,6 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/ts-command-line@4.16.0": - version "4.16.0" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.16.0.tgz#92d3af993ca5ee271ea130d41f5ce6a9479cae3f" - integrity sha512-WJKhdR9ThK9Iy7t78O3at7I3X4Ssp5RRZay/IQa8NywqkFy/DQbT3iLouodMMdUwLZD9n8n++xLubVd3dkmpkg== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - "@rushstack/ts-command-line@4.16.1": version "4.16.1" resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.16.1.tgz#3537bbc323f77c8646646465c579b992d39feb16" @@ -3531,16 +3342,16 @@ minimatch "^9.0.3" "@types/adm-zip@^0.5.0": - version "0.5.1" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.1.tgz#2d3ab14cd537b68dc53aebe73d91024ce1373e89" - integrity sha512-3+psmbh60N5JXM2LMkujFqnjMf3KB0LZoIQO73NJvkv57q+384nK/A7pP0v+ZkB/Zrfqn+5xtAyt5OsY+GiYLQ== + version "0.5.3" + resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.3.tgz#6f8a06ffad5fdafad0318fd0837fca763a04c682" + integrity sha512-LfeDIiFdvphelYY2aMWTyQBr5cTb1EL9Qcu19jFizdt2sL/jL+fy1fE8IgAKBFI5XfbGukaRDDM5PiJTrovAhA== dependencies: "@types/node" "*" "@types/angular@^1.6.47": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.8.5.tgz#71c7d3581898f1863100eeed9d25bb737a8e1062" - integrity sha512-tifGGLxuKOEl7Z1BoAkZKpu+eEyfZ/0Ugm5imM+D1Vj+QzuhPQS0icI34laN3CLbksyfZQPGTQa0i+jjZdpiLw== + version "1.8.7" + resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.8.7.tgz#6a391016f794e5ade3d3f06130b88b8355799bff" + integrity sha512-Itzddybhj/oWRJMmXgjfkFoUl0twZjhhc+AhqisYdVQtJ7M1RcZM8oFIwJsXV8AraLZyxQDfZRrRUTy2G7NU2g== "@types/argparse@1.0.38": version "1.0.38" @@ -3558,14 +3369,29 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__generator@*", "@types/babel__generator@7.6.5": +"@types/babel__generator@*": + version "7.6.6" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8" + integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__generator@7.6.5": version "7.6.5" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" -"@types/babel__template@*", "@types/babel__template@7.4.2": +"@types/babel__template@*": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f" + integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__template@7.4.2": version "7.4.2" resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== @@ -3573,7 +3399,14 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@7.20.2": +"@types/babel__traverse@*": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058" + integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw== + dependencies: + "@babel/types" "^7.20.7" + +"@types/babel__traverse@7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== @@ -3581,29 +3414,29 @@ "@babel/types" "^7.20.7" "@types/bluebird@^3.5.27": - version "3.5.39" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.39.tgz#6aaf8bcbf005bb091d06ddaa0f620be078bf6a73" - integrity sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA== + version "3.5.41" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.41.tgz#0ef9959efaf1de8ddd7bcef9664fc7bada60ee35" + integrity sha512-/OT2UoYPu2fqGNS85UYUx0Ke8Zd/vM0/Au0JqLInTprkRO0NexYe7qAUkDsjhsO3BKHI14wX/UhN5SUaoFVDUQ== "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.4" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.4.tgz#78ad68f1f79eb851aa3634db0c7f57f6f601b462" + integrity sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== + version "3.5.12" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.12.tgz#49badafb988e6c433ca675a5fd769b93b7649fc8" + integrity sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg== dependencies: "@types/node" "*" "@types/browser-sync@^2.26.3": - version "2.27.1" - resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.1.tgz#e6147254d020e600d1382fc6c4fd9243231ed0ca" - integrity sha512-p/qAU+3dqq/CqobNiiZkIsernNfQe/35QEtor8Oae/WWgMLLhceFogCaAMe7pO4T8Z5WL/Co522YBo2sk/I7AQ== + version "2.27.3" + resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.3.tgz#bfd0eb70f49d71b80048ee3929a3a85959c19f6a" + integrity sha512-AG4+p6Wfg99BtiGTBIWN4u6JHm0nEG74krPU06pWoCFnMhNcpLfurfg5zcPUe8tNqhxJ3ZppZ6D5vxq+CCqbGQ== dependencies: "@types/micromatch" "^2" "@types/node" "*" @@ -3629,36 +3462,36 @@ "@types/har-format" "*" "@types/cldrjs@^0.4.22": - version "0.4.25" - resolved "https://registry.yarnpkg.com/@types/cldrjs/-/cldrjs-0.4.25.tgz#f0757adf8dbf19db680bcc74a048c7eee01710c8" - integrity sha512-qniOggLcv0pZfta2CQGCigwiniz3PW9lhk/SzSPmzB1Odkb2YGaUvN4SHLS0m23DbEGg4uw4zH8IW18k+mCpHQ== + version "0.4.26" + resolved "https://registry.yarnpkg.com/@types/cldrjs/-/cldrjs-0.4.26.tgz#e4f676dc04e11d748a4d548947f3afe0e87ff1fd" + integrity sha512-tJY44+vZz5dbpQM93A0+CeutmXEgnXncQoXwsvZAncxeYRpcwr9jzkZ+tJobFTeON4ByNIxNJMNAPLT8kgnqaQ== "@types/cli-progress@^3.4.2": - version "3.11.2" - resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.2.tgz#c8ff27cf89b46bfbb7faf140432c464d3a62ec4e" - integrity sha512-Yt/8rEJalfa9ve2SbfQnwFHrc9QF52JIZYHW3FDaTMpkCvnns26ueKiPHDxyJ0CS//IqjMINTx7R5Xa7k7uFHQ== + version "3.11.4" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.4.tgz#58d9e60bd5fd85a57984890ef9c9d831a0dda896" + integrity sha512-yufTxeeNCZuEIxx2uebK8lpSAsJM4lvzakm/VxzYhDtqhXCzwH9jpn7nPCxzrROuEbLATqhFq4MIPoG0tlrsvw== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz#acf51e088b3bb6507f7b093bd2b0de20940179cc" + integrity sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.37" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" + integrity sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q== dependencies: "@types/node" "*" "@types/convert-source-map@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.1.tgz#e72e8a3de9d6fe3d8e43d5c101c346de2ff6abdf" - integrity sha512-tm5Eb3AwhibN6ULRaad5TbNO83WoXVZLh2YRGAFH+qWkUz48l9Hu1jc+wJswB7T+ACWAG0cFnTeeQGpwedvlNw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.2.tgz#a8fe8a33f096c4f49ecfb75613cd3c6cf6d35d25" + integrity sha512-M8jHZquUkvyaHtNVCKNoCqGmbbNFgRJ2JL607SPmcNUWqhU1spBaEJD7qlW3kMiQjKPlyyT4ZUbPG6vO4SYLBg== "@types/cookie@^0.4.1": version "0.4.1" @@ -3666,49 +3499,49 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": - version "2.8.14" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" - integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== + version "2.8.15" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.15.tgz#eb143aa2f8807ddd78e83cbff141bbedd91b60ee" + integrity sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw== dependencies: "@types/node" "*" "@types/diff@^5.0.0": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.4.tgz#ba774c225ee68ce13a090fec16cf34b97a78537b" - integrity sha512-d7489/WO4B65k0SIqxXtviR9+MrPDipWQF6w+5D7YPrqgu6Qb87JsTdWQaNZo7itcdbViQSev3Jaz7dtKO0+Dg== + version "5.0.7" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.7.tgz#471bad8be0d911ed04d115863402920f3a84079c" + integrity sha512-adBosR2GntaQQiuHnfRN9HtxYpoHHJBcdyz7VSXhjpSAmtvIfu/S1fjTqwuIx/Ypba6LCZdfWIqPYx2BR5TneQ== "@types/dom-view-transitions@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/dom-view-transitions/-/dom-view-transitions-1.0.1.tgz#55333c2862c349153b9007ca01011d9379c12c6c" - integrity sha512-A9S1ijj/4MX06I1W/6on8lhaYyq1Ir7gaOvfllW1o4RzVWW88HAeqX0pUx9VgOLnNpdiGeUW2CTkg18p5LWIrA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/dom-view-transitions/-/dom-view-transitions-1.0.3.tgz#d69fd4512de1c2aa8e01321d5e734b7e447a097c" + integrity sha512-1X/BUVdo9pKho8SFWVNcIz0fasBAqwcAvWGMt0Z57LUN68I4AtdrgTUXFryZW/OHUSO+9OH9KtSgCTMrzOZdRg== "@types/duplexify@^3.6.0": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.1.tgz#5685721cf7dc4a21b6f0e8a8efbec6b4d2fbafad" - integrity sha512-n0zoEj/fMdMOvqbHxmqnza/kXyoGgJmEpsXjpP+gEqE1Ye4yNqc7xWipKnUoMpWhMuzJQSfK2gMrwlElly7OGQ== + version "3.6.3" + resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.3.tgz#42b1716c5d52a42ba9072696c0d33ca0a9bffd6d" + integrity sha512-KE0Yb3JraglJMB53+A/RMXbd9w//pQfiSqkrsoAxKcNOEIe1EHfEgbvoi2lkk2AvhhJtplugJSB2Mptc3DZMNA== dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + version "3.7.6" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz#585578b368ed170e67de8aae7b93f54a1b2fdc26" + integrity sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.44.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.2.tgz#0d21c505f98a89b8dd4d37fa162b09da6089199a" - integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + version "8.44.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.5.tgz#24d7f3b07aff47a13b570efd5c52d96f38cd352e" + integrity sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA== dependencies: "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@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== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd" + integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ== "@types/estree@0.0.39": version "0.0.39" @@ -3716,9 +3549,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.36" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz#baa9022119bdc05a4adfe740ffc97b5f9360e545" - integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + version "4.17.38" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.38.tgz#d9c1d3a134a1226d84ec8e40c182f960f969d5a4" + integrity sha512-hXOtc0tuDHZPFwwhuBJXPbjemWtXnJjbvuuyNH2Y5Z6in+iXc63c4eXYDc7GGGqHy+iwYqAJMdaItqdnbcBKmg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -3726,9 +3559,9 @@ "@types/send" "*" "@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + version "4.17.20" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.20.tgz#e7c9b40276d29e38a4e3564d7a3d65911e2aa433" + integrity sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -3736,16 +3569,16 @@ "@types/serve-static" "*" "@types/filesystem@*": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.33.tgz#808e0048221426b30341a6b19a8193213c72ca55" - integrity sha512-2KedRPzwu2K528vFkoXnnWdsG0MtUwPjuA7pRy4vKxlxHEe8qUDZibYHXJKZZr2Cl/ELdCWYqyb/MKwsUuzBWw== + version "0.0.34" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.34.tgz#9b0d0d791ab6b217528cce8d391764b4b47607bf" + integrity sha512-La4bGrgck8/rosDUA1DJJP8hrFcKq0BV6JaaVlNnOo1rJdJDcft3//slEbAmsWNUJwXRCc0DXpeO40yuATlexw== dependencies: "@types/filewriter" "*" "@types/filewriter@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.30.tgz#1be7733877589d57c653b8356cefe5fe7c74b89e" - integrity sha512-lB98tui0uxc7erbj0serZfJlHKLNJHwBltPnbmO1WRpL5T325GOHRiQfr2E29V2q+S1brDO63Fpdt6vb3bES9Q== + version "0.0.31" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.31.tgz#a5a256646bd98209baf9aa32073047f84f4c3f3f" + integrity sha512-12df1utOvPC80+UaVoOO1d81X8pa5MefHNS+gWX9R2ucSESpMz9K5QwlTWDGKASrzCpSFwj7NPYh+nTsolgEGA== "@types/glob@*": version "8.1.0" @@ -3769,71 +3602,66 @@ integrity sha512-wqxfwHk83RS7+6OpytGdo5wqkqtvx+bGaIs1Rwm5NrtQHUfL4OgWs/5p0OipmjmT+fexePh37Ek+mqIpdNjQKA== "@types/har-format@*": - version "1.2.13" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.13.tgz#7ef32562d433166e1ad14e3eb6fcf5c00c8a0ead" - integrity sha512-PwBsCBD3lDODn4xpje3Y1di0aDJp4Ww7aSfMRVw6ysnxD4I7Wmq2mBkSKaDtN403hqH5sp6c9xQUvFYY3+lkBg== + version "1.2.14" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.14.tgz#292e55d52be8659c8486316a0ae439760617e0a3" + integrity sha512-pEmBAoccWvO6XbSI8A7KvIDGEoKtlLWtdqVCKoVBcCDSFvR4Ijd7zGLu7MWGEqk2r8D54uWlMRt+VZuSrfFMzQ== "@types/http-cache-semantics@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" - integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#a3ff232bf7d5c55f38e4e45693eda2ebb545794d" + integrity sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA== "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.3.tgz#c54e61f79b3947d040f150abd58f71efb422ff62" + integrity sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA== "@types/http-proxy@^1.17.8": - version "1.17.12" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" - integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== + version "1.17.13" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.13.tgz#dd3a4da550580eb0557d4c7128a2ff1d1a38d465" + integrity sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw== dependencies: "@types/node" "*" "@types/inquirer@^9.0.3": - version "9.0.3" - resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-9.0.3.tgz#dc99da4f2f6de9d26c284b4f6aaab4d98c456db1" - integrity sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw== + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-9.0.5.tgz#b539aca358dae58620affdc7a153471ed8f9ef03" + integrity sha512-j3QoaC6WX4waapzwBW32csSrMCgwK40TOt1Nxc60frDcQyef4QmlKZus4wUZH6e559kPoIECxrXRU4+I4hPTcQ== dependencies: "@types/through" "*" rxjs "^7.2.0" "@types/is-windows@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-1.0.0.tgz#1011fa129d87091e2f6faf9042d6704cdf2e7be0" - integrity sha512-tJ1rq04tGKuIJoWIH0Gyuwv4RQ3+tIu7wQrC0MV47raQ44kIzXSSFKfrxFUOWVRvesoF7mrTqigXmqoZJsXwTg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-1.0.1.tgz#ed99ac3cb86a45796022c52e79c61974af9ffd8b" + integrity sha512-5ca2iU1+JNRb0dOFFDXQ3bukIzkVM8Ft4Wn5rDj9y4tUOtE3DOdfrMH1qegdvx08VU2RRCSyQ7beTZ/WKF0BgQ== "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068" + integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ== "@types/jasmine-ajax@^3.3.1": - version "3.3.3" - resolved "https://registry.yarnpkg.com/@types/jasmine-ajax/-/jasmine-ajax-3.3.3.tgz#ec89515434d4aee9772e25a730bd626ecf44260d" - integrity sha512-e2iJYrdwfxr6WmLHxNjISUgbrbGaRsFHsc9xnrq8SGFzbSYPDZ4lmAkIulAAjqrkZ1z21OJCZsZwWMnxoeX7+A== - -"@types/jasmine@*": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-4.3.6.tgz#d9855fa9f808138488784610f888046bb9a59aff" - integrity sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g== + version "3.3.4" + resolved "https://registry.yarnpkg.com/@types/jasmine-ajax/-/jasmine-ajax-3.3.4.tgz#6d29b7448ce6ad5b0530b511ec3b04b6e86ecd9a" + integrity sha512-wwUelyULnHiPFGbZAjKVmWfDHsDCTJ9gL55f7lvTWAmSGWP0Q6Dfm+wjslUiNupxkeYnSYqJuNbLnSBcYLIWrg== -"@types/jasmine@^5.0.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.0.tgz#581b2f7393942a56acd3542fe168c803d7d588d6" - integrity sha512-XOV0KsqXNX2gUSqk05RWeolIMgaAQ7+l/ozOBoQ8NGwLg+E7J9vgagODtNgfim4jCzEUP0oJ3gnXeC+Zv+Xi1A== +"@types/jasmine@*", "@types/jasmine@^5.0.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-5.1.1.tgz#7d2a2a983e1e822858ea9e30d90e11a3fe408fc0" + integrity sha512-qL4GoZHHJl1JQ0vK31OtXMfkfGxYJnysmYz9kk0E8j5W96ThKykBF90uD3PcVmQUAzulbsaus2eFiBhCH5itfw== "@types/jasminewd2@^2.0.8": - version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.11.tgz#53239ff1d169fef041ba9c7a2c171bce5dcee4e5" - integrity sha512-J3ggNCbxnHPsd15lzNZtOdPovtErcIl2vD11VSRq2s+ktQr43ZfqO4ws6YDFNRvUoXWCxD5uXTWuwyXPyT5eqg== + version "2.0.12" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.12.tgz#6482ae25eccfbb5c3b41e9a2759089b20d336d2a" + integrity sha512-C4rXKMnGqLqTw4mgfiT0fL91g5oFAUhreR8jeeYk4xYcgh1/CImqgn5pWcErnpJJS43XFUfHGit0sSPQ39G1Pg== dependencies: "@types/jasmine" "*" "@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.13" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" - integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/json5@^0.0.29": version "0.0.29" @@ -3848,9 +3676,9 @@ "@types/node" "*" "@types/linkify-it@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b" - integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.4.tgz#def6a9bb0ce78140860602f16ace37a9997f086a" + integrity sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ== "@types/long@^4.0.0": version "4.0.2" @@ -3866,31 +3694,31 @@ "@types/mdurl" "*" "@types/marked@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/marked/-/marked-5.0.1.tgz#15acd796d722b91bf00738c8c8539aaf5034f0c6" - integrity sha512-Y3pAUzHKh605fN6fvASsz5FDSWbZcs/65Q6xYRmnIP9ZIYz27T4IOmXfH9gWJV1dpi7f1e7z7nBGUTx/a0ptpA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/marked/-/marked-5.0.2.tgz#ca6b0cd7a5c8799c8cd0963df0b3e1a9021dcdfa" + integrity sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg== "@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.4.tgz#574bfbec51eb41ab5f444116c8555bc4347feba5" + integrity sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A== "@types/micromatch@^2": - version "2.3.31" - resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-2.3.31.tgz#d13641cb6965294ed1b1d2ad561a331d6306962b" - integrity sha512-17WSoNz/GKLSfcomM8cMoJJQG2cDKvsoDFTtbwjEMxcizGb0HT6EBRi8qR7NW+XSaVdxHzq/WV/TUOm5f/ksag== + version "2.3.33" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-2.3.33.tgz#0da66e90b706ae798ccea8b03cbb635869b0b266" + integrity sha512-jgUM0r/NgVdakSese7wLBk8dYZMUfJUMd3ByAiA1w4b+M3DNgdiqqK4Y4fdhDuTWY5CzxvUZzW6dceIGNrlVVg== dependencies: "@types/parse-glob" "*" "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.2.tgz#c1ae807f13d308ee7511a5b81c74f327028e66e8" + integrity sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.3.tgz#bbe64987e0eb05de150c305005055c7ad784a9ce" + integrity sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg== "@types/minimatch@*", "@types/minimatch@^5.1.2": version "5.1.2" @@ -3903,9 +3731,11 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.6.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" - integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" "@types/node@16.10.9": version "16.10.9" @@ -3923,19 +3753,19 @@ integrity sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g== "@types/node@^16.11.7": - version "16.18.53" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.53.tgz#21820fe4d5968aaf8071dabd1ee13d24ada1350a" - integrity sha512-vVmHeo4tpF8zsknALU90Hh24VueYdu45ZlXzYWFbom61YR4avJqTFDC3QlWzjuTdAv6/3xHaxiO9NrtVZXrkmw== + version "16.18.59" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.59.tgz#4cdbd631be6d9be266a96fb17b5d0d7ad6bbe26c" + integrity sha512-PJ1w2cNeKUEdey4LiPra0ZuxZFOGvetswE8qHRriV/sUkL5Al4tTmPV9D2+Y/TPIxTHHgxTfRjZVKWhPw/ORhQ== "@types/normalize-package-data@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== "@types/parse-glob@*": - version "3.0.29" - resolved "https://registry.yarnpkg.com/@types/parse-glob/-/parse-glob-3.0.29.tgz#6a40ec7ebd2418ee69ee397e48e42169268a10bf" - integrity sha512-OFwMPH5eJOhtwR92GMjTNWukaKTdWQC12cBgRvrTQl5CwhruSq6734wi1CTSh5Qjm/pMJWaKOOPKZOp6FpIkXQ== + version "3.0.31" + resolved "https://registry.yarnpkg.com/@types/parse-glob/-/parse-glob-3.0.31.tgz#92e77b8a062fc55989d479de5b9357e7ae7fdfcc" + integrity sha512-83YRiYrTOabm7i0bVYuXBgBTZR5acCBUgNmR4LEihR/vXvujTtiyRzWDTAMh7qicFqlhV+6ItebPRkf4yK64Xg== "@types/puppeteer-core@^5.4.0": version "5.4.0" @@ -3957,14 +3787,14 @@ integrity sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.6.tgz#7cb33992049fd7340d5b10c0098e104184dfcd2a" + integrity sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA== "@types/resolve@0.0.8": version "0.0.8" @@ -3981,9 +3811,9 @@ "@types/node" "*" "@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.2.tgz#8de1b0477fd7c12df77e50832fa51701a8414bd6" + integrity sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA== dependencies: "@types/node" "*" @@ -4000,7 +3830,7 @@ "@types/glob" "*" "@types/node" "*" -"@types/selenium-webdriver4@npm:@types/selenium-webdriver@4.1.18": +"@types/selenium-webdriver4@npm:@types/selenium-webdriver@4.1.18", "@types/selenium-webdriver@^4.0.18": version "4.1.18" resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.18.tgz#8c197a8b09a9116f2dcd7551235227e737b36235" integrity sha512-oBh2f+bbspYPkZoexEIaU8tV6/DR4FBCcMT8vKlFn7yhUTxYzKLgugA2nO0G/hYrwJiHn3EF95+n/GrPdIV5wA== @@ -4013,58 +3843,51 @@ integrity sha512-tHdDdGUBKTbiLLwf5mF78EP35F31UZekG+GRNowl8G5rMQoupAT4qWn/7AaGOvmaqvROdqC3Io/hP1ZyO58QkA== "@types/selenium-webdriver@^3.0.0": - version "3.0.23" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.23.tgz#59b96c11b63b74f88bdf7adfdf2018b6a844db8a" - integrity sha512-f4lAmp7rmGgsTkRPjgHOpQumgpqjQ0RxbEkOwCwLVSsa5gCnni4GMBfqmN0nObFeDRZj/DTTsx99SOjOXRW2bQ== - -"@types/selenium-webdriver@^4.0.18": - version "4.1.16" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.16.tgz#8438a3027c7905f516f7b2fbf85e7ded3763bc53" - integrity sha512-ETje9rr7nTrD0r/mNnIuCAF7fAZ2xKE/1WyxXZZH9N9Cy2NKJTrpEd7SCdzuIlm/1iu1gjHCVbaDwT+MuDrVZg== - dependencies: - "@types/ws" "*" + version "3.0.24" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.24.tgz#788aac3b3ad788339c01e586fb0fa6ab15d3ee11" + integrity sha512-PKUsOV485ZiB466i6xuhpjiASvcC6+SSZqOwU7DIMn1as8DGrATWdMvjuG7scbyxk/e1SYwAzDB2LbobLxy0Qw== "@types/semver@^7.3.4": - version "7.5.2" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" - integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== "@types/send@*", "@types/send@^0.17.1": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.3.tgz#81b2ea5a3a18aad357405af2d643ccbe5a09020b" + integrity sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + version "1.9.3" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.3.tgz#af9403916eb6fbf7d6ec6f47b2a4c46eb3222cc9" + integrity sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg== dependencies: "@types/express" "*" "@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.4" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.4.tgz#44b5895a68ca637f06c229119e1c774ca88f81b2" + integrity sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/shelljs@^0.8.6": - version "0.8.12" - resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.12.tgz#79dc9632af7d5ca1b5afb65a6bfc1422d79b5fa0" - integrity sha512-ZA8U81/gldY+rR5zl/7HSHrG2KDfEb3lzG6uCUDhW1DTQE9yC/VBQ45fXnXq8f3CgInfhZmjtdu/WOUlrXRQUg== + version "0.8.14" + resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.14.tgz#87b8817b2397ffe97b86a4d844036ee0d2a1f0ca" + integrity sha512-eqKaGPi60riuxI9pUVeCT02EGo94Y6HT119h7w5bXSELsis6+JqzdEy6H/w2xXl881wcN3VDnb/D0WlgSety5w== dependencies: "@types/glob" "~7.2.0" "@types/node" "*" "@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + version "0.3.35" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.35.tgz#f4a568c73d2a8071944bd6ffdca0d4e66810cd21" + integrity sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw== dependencies: "@types/node" "*" @@ -4074,26 +3897,26 @@ integrity sha512-y+YbooRJv77KiKo9uoivF5Vwu9DcQQw0GmqocqozISnuYTFI7JKlfP0XquXwVmRE0JcxIoYVtfYTYEnq2vvVxg== "@types/through@*": - version "0.0.31" - resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.31.tgz#eb410602641807e74a90c5e951f46686e75eed1c" - integrity sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w== + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.32.tgz#1c4c8a29140221c1b29c2874dea1f4a1f2092c6a" + integrity sha512-7XsfXIsjdfJM2wFDRAtEWp3zb2aVPk5QeyZxGlVK57q4u26DczMHhJmlhr0Jqv0THwxam/L8REXkj8M2I/lcvw== dependencies: "@types/node" "*" "@types/tmp@^0.2.1": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.4.tgz#1e26f791b94a95474f1f3322a721dfb065b876fb" - integrity sha512-Vq3rwM+2KgiLacq68EjTJD9cuJ/ne5pXntWn8B8Rxj25SLkGAhCgooCZ1lhcIcV5OFveJ+s5Cqpi+XKfFM/xZA== + version "0.2.5" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.5.tgz#0f3a71d0a94cbd5de45b0aa641575dd503e43ed4" + integrity sha512-KodRrjqWrk/3VyzfR4aeXkf2n5Ssg+bvVUhXlvHVffLiIHriLlrO3vYobB+Kvnr9DkNzMiyWHT3G6hT/xX0ryQ== "@types/triple-beam@^1.3.2": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.3.tgz#726ae98a5f6418c8f24f9b0f2a9f81a8664876ae" - integrity sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g== + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.4.tgz#a1d5f480245db86e2f4777000065d4fe7467a012" + integrity sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA== "@types/uuid@^9.0.0": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.4.tgz#e884a59338da907bda8d2ed03e01c5c49d036f1c" - integrity sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA== + version "9.0.5" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.5.tgz#25a71eb73eba95ac0e559ff3dd018fc08294acf6" + integrity sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ== "@types/which@^1.3.2": version "1.3.2" @@ -4101,9 +3924,9 @@ integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== "@types/ws@*", "@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + version "8.5.7" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.7.tgz#1ca585074fe5d2c81dec7a3d451f244a2a6d83cb" + integrity sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ== dependencies: "@types/node" "*" @@ -4115,21 +3938,21 @@ "@types/node" "*" "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.1.tgz#07773d7160494d56aa882d7531aac7319ea67c3b" + integrity sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ== "@types/yargs@^17.0.0", "@types/yargs@^17.0.3": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + version "17.0.28" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.28.tgz#d106e4301fbacde3d1796ab27374dd16588ec851" + integrity sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw== dependencies: "@types/yargs-parser" "*" "@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + version "2.10.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" + integrity sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw== dependencies: "@types/node" "*" @@ -5053,16 +4876,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -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.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.2" - semver "^6.3.1" - -babel-plugin-polyfill-corejs2@^0.4.6: +babel-plugin-polyfill-corejs2@^0.4.5, babel-plugin-polyfill-corejs2@^0.4.6: version "0.4.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== @@ -5071,15 +4885,7 @@ babel-plugin-polyfill-corejs2@^0.4.6: "@babel/helper-define-polyfill-provider" "^0.4.3" semver "^6.3.1" -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.4.2" - core-js-compat "^3.31.0" - -babel-plugin-polyfill-corejs3@^0.8.5: +babel-plugin-polyfill-corejs3@^0.8.3, babel-plugin-polyfill-corejs3@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz#a75fa1b0c3fc5bd6837f9ec465c0f48031b8cab1" integrity sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA== @@ -5087,14 +4893,7 @@ babel-plugin-polyfill-corejs3@^0.8.5: "@babel/helper-define-polyfill-provider" "^0.4.3" core-js-compat "^3.32.2" -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.4.2" - -babel-plugin-polyfill-regenerator@^0.5.3: +babel-plugin-polyfill-regenerator@^0.5.2, babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== @@ -5394,17 +5193,7 @@ browser-sync@2.29.3, browser-sync@^2.27.7: ua-parser-js "^1.0.33" yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, 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.22.1: +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.21.9, browserslist@^4.22.1: version "4.22.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== @@ -5628,15 +5417,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: - version "1.0.30001538" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" - integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== - -caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001547" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz#d4f92efc488aab3c7f92c738d3977c2a3180472b" - integrity sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA== +caniuse-lite@^1.0.30001520, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001550" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz#6ec6a2239eb2a8123cc26cfe0571db5c79eb8669" + integrity sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ== canonical-path@1.0.0: version "1.0.0" @@ -5808,12 +5592,13 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -chromium-bidi@0.4.22: - version "0.4.22" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.22.tgz#625dab72946e177f538da2d2b8a681652ef916da" - integrity sha512-wR7Y9Ioez+cNXT4ZP7VNM1HRTljpNnMSLw4/RnwhhZUP4yCU7kIQND00YiktuHekch68jklGPK1q9Jkb29+fQg== +chromium-bidi@0.4.31: + version "0.4.31" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.31.tgz#a28c4329880706e61ff07ed49aed22e6d04e17d1" + integrity sha512-OtvEg2JMRQrHsmLx4FV3u1Hf9waYxB5PmL+yM0HkFpc9H2x3TMbUqS+GP2/fC4399hzOO+EQF8uVU43By9ILag== dependencies: mitt "3.0.1" + urlpattern-polyfill "9.0.0" ci-info@^2.0.0: version "2.0.0" @@ -5821,9 +5606,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.7.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjson@^0.3.1: version "0.3.3" @@ -6469,14 +6254,7 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -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.10" - -core-js-compat@^3.32.2: +core-js-compat@^3.31.0, core-js-compat@^3.32.2: version "3.33.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.0.tgz#24aa230b228406450b2277b7c8bfebae932df966" integrity sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw== @@ -6484,14 +6262,14 @@ core-js-compat@^3.32.2: browserslist "^4.22.1" core-js-pure@^3.30.2: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" - integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.33.0.tgz#938a28754b4d82017a7a8cbd2727b1abecc63591" + integrity sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg== core-js@^3.6.5: - version "3.32.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.2.tgz#172fb5949ef468f93b4be7841af6ab1f21992db7" - integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== + version "3.33.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.0.tgz#70366dbf737134761edb017990cf5ce6c6369c40" + integrity sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw== core-util-is@1.0.2: version "1.0.2" @@ -6516,17 +6294,7 @@ corser@^2.0.1: resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== -cosmiconfig@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== - 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: +cosmiconfig@8.3.6, 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== @@ -6652,9 +6420,9 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csv-parse@^5.0.4: - version "5.5.0" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.0.tgz#2313421e69b650dae32a79ac884b20b21ca1d9da" - integrity sha512-RxruSK3M4XgzcD7Trm2wEN+SJ26ChIb903+IWxNOcB5q4jT2Cs+hFr6QP39J05EohshRFEvyzEBoZ/466S2sbw== + version "5.5.2" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.2.tgz#ab525e642093dccff7c5cca5c7b71fd3e99fe8f2" + integrity sha512-YRVtvdtUNXZCMyK5zd5Wty1W6dNTpGKdqQd4EQ8tl/c6KW1aMBB1Kg1ppky5FONKmEqGJ/8WjLlTNLPne4ioVA== custom-event@~1.0.0: version "1.0.1" @@ -6925,10 +6693,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -data-uri-to-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" - integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== +data-uri-to-buffer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz#540bd4c8753a25ee129035aebdedf63b078703c7" + integrity sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg== date-format@^4.0.14: version "4.0.14" @@ -7039,9 +6807,9 @@ defer-to-connect@^2.0.0: integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" gopd "^1.0.1" @@ -7318,10 +7086,10 @@ dev-ip@^1.0.1: resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== -devtools-protocol@0.0.1159816: - version "0.0.1159816" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz#b5848e8597de01e4738589e7553674c7312c8d2a" - integrity sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA== +devtools-protocol@0.0.1179426: + version "0.0.1179426" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1179426.tgz#c4c3ee671efae868395569123002facbbbffa267" + integrity sha512-KKC7IGwdOr7u9kTGgjUvGTov/z1s2H7oHi3zKCdR9eSDyCPia5CBi4aRhtp7d8uR7l0GS5UTDw3TjKGu5CqINg== devtools-protocol@0.0.818844: version "0.0.818844" @@ -7519,15 +7287,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.477: - version "1.4.525" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz#614284f33901fbecd3e90176c0d60590cd939700" - integrity sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA== - electron-to-chromium@^1.4.535: - version "1.4.551" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.551.tgz#14db6660a88f66ce095ea2657abe5653bc7f42ed" - integrity sha512-/Ng/W/kFv7wdEHYzxdK7Cv0BHEGSkSB3M0Ssl8Ndr1eMiYeas/+Mv4cNaDqamqWx6nd2uQZfPz6g25z25M/sdw== + version "1.4.557" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz#f3941b569c82b7bb909411855c6ff9bfe1507829" + integrity sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw== emoji-regex@^8.0.0: version "8.0.0" @@ -7590,9 +7353,9 @@ engine.io-parser@~5.2.1: integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== engine.io@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.2.tgz#769348ced9d56bd47bd83d308ec1c3375e85937c" - integrity sha512-IXsMcGpw/xRfjra46sVZVHiSWo/nJ/3g1337q9KNXtS6YRzbW5yIzTCb9DjhrBe7r3GZQR0I4+nq+4ODk5g/cA== + version "6.5.3" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.3.tgz#80b0692912cef3a417e1b7433301d6397bf0374b" + integrity sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -8426,9 +8189,9 @@ fined@^1.0.1: parse-filepath "^1.0.1" firebase-tools@^12.0.0: - version "12.5.4" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.5.4.tgz#5235b857cc0d384b2036cd7a25c812cd487d4746" - integrity sha512-fLE+91tJp3PNZPyB6kN9zfn5rkQWhzPX3mlsAGKTMJUA5TLeZA1YlfBbgPr2DJUO47cHN/9b0BYUQjYcYsBPgw== + version "12.7.0" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.7.0.tgz#e28692a7cfb22b21d2492947d3a498d4722e5fc6" + integrity sha512-NBXYEbY9FE20BcEivxL0agXkehNTtcFhQmGGPPWrxntVgWOnbrzy4fh1xjZnQSRgZu4VpEWthXDM+oCkn6ouKQ== dependencies: "@google-cloud/pubsub" "^3.0.1" abort-controller "^3.0.0" @@ -8586,9 +8349,9 @@ forwarded@0.2.0: integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fraction.js@^4.2.0, fraction.js@^4.3.6: - version "4.3.6" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.6.tgz#e9e3acec6c9a28cf7bc36cbe35eea4ceb2c5c92d" - integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fragment-cache@^0.2.1: version "0.2.1" @@ -8676,9 +8439,9 @@ fs-mkdirp-stream@^1.0.0: through2 "^2.0.3" fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.4.tgz#ee8c1b53d3fe8bb7e5d2c5c5dfc0168afdd2f747" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + version "1.0.5" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" + integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== fs-readdir-recursive@^1.1.0: version "1.1.0" @@ -8704,9 +8467,9 @@ fsevents@~2.3.2: integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== furi@^2.0.0: version "2.0.0" @@ -8841,12 +8604,12 @@ get-stream@^6.0.0: integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-uri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" - integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== + version "6.0.2" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.2.tgz#e019521646f4a8ff6d291fbaea2c46da204bb75b" + integrity sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw== dependencies: basic-ftp "^5.0.2" - data-uri-to-buffer "^5.0.1" + data-uri-to-buffer "^6.0.0" debug "^4.3.4" fs-extra "^8.1.0" @@ -8961,12 +8724,12 @@ glob@8.1.0, glob@^8.0.0, glob@^8.0.3: once "^1.3.0" 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== + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" - jackspeak "^2.0.3" + jackspeak "^2.3.5" minimatch "^9.0.1" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" @@ -9369,11 +9132,9 @@ has-yarn@^2.1.0: integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hash.js@^1.1.7: version "1.1.7" @@ -9587,7 +9348,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@7.0.2, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2: +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, https-proxy-agent@^7.0.2: 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== @@ -9675,7 +9436,7 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== -import-fresh@^3.2.1, import-fresh@^3.3.0: +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== @@ -10295,10 +10056,10 @@ istanbul-reports@^3.0.2: 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== +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -10714,9 +10475,9 @@ karma@~6.4.0: yargs "^16.1.1" keyv@^4.0.0: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -10777,12 +10538,12 @@ last-run@^1.1.0: es6-weak-map "^2.0.1" launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" lazystream@^1.0.0: version "1.0.1" @@ -11124,11 +10885,11 @@ log4js@^6.4.1: streamroller "^3.1.5" logform@^2.3.2, logform@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.5.1.tgz#44c77c34becd71b3a42a3970c77929e52c6ed48b" - integrity sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg== + version "2.6.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" + integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== dependencies: - "@colors/colors" "1.5.0" + "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" fecha "^4.2.0" ms "^2.1.1" @@ -11238,7 +10999,7 @@ magic-string@0.30.4: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -magic-string@0.30.5: +magic-string@0.30.5, magic-string@^0.30.3: version "0.30.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== @@ -11252,13 +11013,6 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -magic-string@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" - integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -11377,9 +11131,9 @@ marked@^4.0.10, marked@^4.0.14: integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== marked@^9.0.0: - version "9.0.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-9.0.3.tgz#95be5e8cba93f2c2ca1d6503794c4f02d81c97d9" - integrity sha512-pI/k4nzBG1PEq1J3XFEHxVvjicfjl8rgaMaqclouGSMPhk7Q3Ejb2ZRxx/ZQOcQ1909HzVoWCFYq6oLgtL4BpQ== + version "9.1.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.2.tgz#a54ca772d2b5a43de7d8ed40111354b4b7985527" + integrity sha512-qoKMJqK0w6vkLk8+KnKZAH6neUZSNaQqVZ/h2yZ9S7CbLuFHyS2viB0jnqcWF9UKjwsAbMrQtnQhdmdvOVOw9w== marky@^1.2.2: version "1.2.5" @@ -11632,9 +11386,9 @@ minipass@^5.0.0: 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== + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -11988,9 +11742,9 @@ npm-bundled@^3.0.0: npm-normalize-package-bin "^3.0.0" npm-install-checks@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.2.0.tgz#fae55b9967b03ac309695ec96629492d5cedf371" - integrity sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g== + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== dependencies: semver "^7.1.1" @@ -12027,9 +11781,9 @@ npm-pick-manifest@9.0.0, npm-pick-manifest@^9.0.0: semver "^7.3.5" 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== + version "16.1.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz#10227b7b36c97bc1cf2902a24e4f710cfe62803c" + integrity sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw== dependencies: make-fetch-happen "^13.0.0" minipass "^7.0.2" @@ -12093,9 +11847,9 @@ object-hash@^3.0.0: integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.0.tgz#42695d3879e1cd5bda6df5062164d80c996e23e2" + integrity sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g== object-keys@^1.1.1: version "1.1.1" @@ -12363,7 +12117,7 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.0, pac-proxy-agent@^7.0.1: +pac-proxy-agent@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== @@ -12446,7 +12200,7 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^5.0.0, parse-json@^5.2.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== @@ -12832,7 +12586,7 @@ postcss@8.4.29: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@8.4.31: +postcss@8.4.31, postcss@^8.1.7, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -12841,26 +12595,17 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.1.7, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: - version "8.4.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" - integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - preact-render-to-string@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.1.tgz#bd4f01f9a6b91b16b281343e665d110487f68d67" - integrity sha512-5t7nFeMUextd53igL3GAakAAMaUD+dVWDHaRYaeh1tbPIjQIBtgJnMw6vf8VS/lviV0ggFtkgebatPxvtJsXyQ== + version "6.2.2" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.2.tgz#eb086b6db5d57468ab2c184896884fb0a818245d" + integrity sha512-YDfXQiVeYZutFR8/DpxLSbW3W6b7GgjBExRBxOOqcjrGq5rA9cziitQdNPMZe4RVMSdfBnf4hYqyeLs/KvtIuA== dependencies: pretty-format "^3.8.0" preact@^10.17.1: - version "10.17.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.17.1.tgz#0a1b3c658c019e759326b9648c62912cf5c2dde1" - integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== + version "10.18.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.18.1.tgz#3b84bb305f0b05f4ad5784b981d15fcec4e105da" + integrity sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg== precinct@^8.1.0: version "8.3.1" @@ -13076,21 +12821,7 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-agent@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" - integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - lru-cache "^7.14.1" - pac-proxy-agent "^7.0.0" - proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.1" - -proxy-agent@^6.3.0: +proxy-agent@6.3.1, proxy-agent@^6.3.0: version "6.3.1" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.1.tgz#40e7b230552cf44fd23ffaf7c59024b692612687" integrity sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ== @@ -13161,17 +12892,17 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.1.1.tgz#59be20b6f69acc2139ba2d9e02a33793b59254ff" - integrity sha512-Tlcajcf44zwfa9Sbwv3T8BtaNMJ69wtpHIxwl2NOBTyTK3D1wppQovXTjfw0TDOm3a16eCfQ+5BMi3vRQ4kuAQ== +puppeteer-core@21.3.8: + version "21.3.8" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.3.8.tgz#7ac4879c9f73e8426431d8ca4c58680e517a4b08" + integrity sha512-yv12E/+zZ7Lei5tJB4sUkSrsuqKibuYpYxLGbmtLUjjYIqGE5HKz9OUI2I/RFHEvF+pHi2bTbv5bWydeCGJ6Mw== dependencies: - "@puppeteer/browsers" "1.7.0" - chromium-bidi "0.4.22" + "@puppeteer/browsers" "1.7.1" + chromium-bidi "0.4.31" cross-fetch "4.0.0" debug "4.3.4" - devtools-protocol "0.0.1159816" - ws "8.13.0" + devtools-protocol "0.0.1179426" + ws "8.14.2" puppeteer-core@^5.1.0: version "5.5.0" @@ -13671,7 +13402,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@1.22.8: +resolve@1.22.8, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.21.0, resolve@^1.3.2, resolve@^1.4.0, resolve@~1.22.1: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -13680,15 +13411,6 @@ resolve@1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.21.0, resolve@^1.3.2, resolve@^1.4.0, resolve@~1.22.1: - version "1.22.6" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" - integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - resolve@~1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -13832,9 +13554,9 @@ rollup-plugin-terser@^7.0.1: terser "^5.0.0" rollup@^3.27.1: - version "3.29.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.2.tgz#cbc76cd5b03b9f9e93be991d23a1dff9c6d5b740" - integrity sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A== + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" @@ -13982,9 +13704,9 @@ saucelabs@7.4.0, saucelabs@^1.5.0, saucelabs@^4.6.3: yargs "^17.2.1" sax@>=0.6.0, sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" @@ -14052,7 +13774,6 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selenium-webdriver@4.13.0: - name selenium-webdriver4 version "4.13.0" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.13.0.tgz#1e06bab7adedb308e3635131bc75bd32038261d5" integrity sha512-8JS0h5E0Sq7gNfbGg8LVaQ+Eqek97tvOONn3Jmy+NiWfb12WYpftz4VTC4D2JT4wakdG6VUzGKpA8cFGg0IjkA== @@ -14298,7 +14019,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: +shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -14597,9 +14318,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.15" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" - integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== spdy-transport@^3.0.0: version "3.0.0" @@ -15055,7 +14776,7 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" -terser@5.19.4, terser@^5.0.0, terser@^5.16.8, terser@^5.8.0: +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== @@ -15075,6 +14796,16 @@ terser@5.21.0: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.0.0, terser@^5.16.8, terser@^5.8.0: + version "5.22.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.22.0.tgz#4f18103f84c5c9437aafb7a14918273310a8a49d" + integrity sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -15426,9 +15157,9 @@ type-fest@^3.0.0, type-fest@^3.8.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.3.1.tgz#5cb58cdab5120f7ab0b40cfdc35073fb9adb651d" - integrity sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw== + version "4.5.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.5.0.tgz#79208f4dbb8a9946a55889e9f482b95a3292ee41" + integrity sha512-diLQivFzddJl4ylL3jxSkEc39Tpw7o1QeEHIPxVwryDK2lpB7Nqhzhuo6v5/Ls08Z0yPSAhsyAWlv1/H0ciNmw== type-is@~1.6.18: version "1.6.18" @@ -15554,6 +15285,18 @@ undertaker@^1.2.1: object.reduce "^1.0.0" undertaker-registry "^1.0.0" +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + +undici@^5.25.4: + version "5.26.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.26.3.tgz#ab3527b3d5bb25b12f898dfd22165d472dd71b79" + integrity sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw== + dependencies: + "@fastify/busboy" "^2.0.0" + 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" @@ -15674,14 +15417,6 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -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" - update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -15748,6 +15483,11 @@ url-join@^4.0.1: resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== +urlpattern-polyfill@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz#bc7e386bb12fd7898b58d1509df21d3c29ab3460" + integrity sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -16234,20 +15974,20 @@ wildcard@^2.0.0: integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== winston-transport@^4.4.0, winston-transport@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.5.0.tgz#6e7b0dd04d393171ed5e4e4905db265f7ab384fa" - integrity sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q== + version "4.6.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.6.0.tgz#f1c1a665ad1b366df72199e27892721832a19e1b" + integrity sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg== dependencies: logform "^2.3.2" readable-stream "^3.6.0" triple-beam "^1.3.0" winston@^3.0.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.10.0.tgz#d033cb7bd3ced026fed13bf9d92c55b903116803" - integrity sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g== + version "3.11.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.11.0.tgz#2d50b0a695a2758bb1c95279f0a88e858163ed91" + integrity sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g== dependencies: - "@colors/colors" "1.5.0" + "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" @@ -16319,12 +16059,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -ws@>=8.13.0, ws@>=8.14.2, ws@^8.13.0: +ws@8.14.2, ws@>=8.13.0, ws@>=8.14.2, ws@^8.13.0: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== @@ -16415,9 +16150,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.2.1, yaml@^2.2.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" - integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== yargs-parser@^18.1.2: version "18.1.3"