From dd6e548373f03ebf5157044eb7af03927a6b183a Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 10 Jul 2024 16:56:46 -0700 Subject: [PATCH 001/143] docs: fixing links to guides on the Performance Overview page (#56942) PR Close #56942 --- adev/src/content/guide/performance/overview.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/adev/src/content/guide/performance/overview.md b/adev/src/content/guide/performance/overview.md index ff1b8ee3f2e7..8fa027efd489 100644 --- a/adev/src/content/guide/performance/overview.md +++ b/adev/src/content/guide/performance/overview.md @@ -8,8 +8,8 @@ That said, please note that these best practices will only take the performance | Guides Types | Description | | :---------------------------------------- | :--------------------------------------------------------------------------------------------------------- | -| [Deferrable views](/defer) | Defer loading of select dependencies within a template by wrapping corresponding parts in a `@defer` block. | -| [Image optimization](/image-optimization) | Use the `NgOptimizedImage` directive to adopt best practices for loading images. | -| [Server-side rendering](/ssr) | Learn how to leverage rendering pages on the server to improve load times. | -| [Build-time prerendering](/prerendering) | Also known as static-side generation (SSG), is an alternate rendering method to improve load times. | -| [Hydration](/hydration) | A process to improve application performance by restoring its state after server-side rendering and reusing existing DOM structure as much as possible. | +| [Deferrable views](/guide/defer) | Defer loading of select dependencies within a template by wrapping corresponding parts in a `@defer` block. | +| [Image optimization](/guide/image-optimization) | Use the `NgOptimizedImage` directive to adopt best practices for loading images. | +| [Server-side rendering](/guide/ssr) | Learn how to leverage rendering pages on the server to improve load times. | +| [Build-time prerendering](/guide/prerendering) | Also known as static-side generation (SSG), is an alternate rendering method to improve load times. | +| [Hydration](/guide/hydration) | A process to improve application performance by restoring its state after server-side rendering and reusing existing DOM structure as much as possible. | From be689df4ada1f02ff6ceb6891457e1ad65d07cf0 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Thu, 11 Jul 2024 12:42:17 +0200 Subject: [PATCH 002/143] build: update deps (#56946) Updating `build-tooling` and `docs`. PR Close #56946 --- package.json | 4 +- yarn.lock | 588 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 410 insertions(+), 182 deletions(-) diff --git a/package.json b/package.json index 4b1c98cb4d24..fecfcecfa7bd 100644 --- a/package.json +++ b/package.json @@ -157,8 +157,8 @@ "@actions/github": "^6.0.0", "@angular-devkit/architect-cli": "^0.1801.0-next", "@angular/animations": "^18.1.0-next", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#5e30807f0fc6f1f00b2ac9186bd5f704b72e6ea6", - "@angular/docs": "https://github.com/angular/dev-infra-private-docs-builds.git#97fa4e1998648d1c620113d8eb15a324ae7b20b3", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#3e3184d97be16d18d6b0f48f29fa8463e7f65587", + "@angular/docs": "https://github.com/angular/dev-infra-private-docs-builds.git#2f58fdebbd27f42e8eb8f4b7885f32b066ded66a", "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#806cbfc987d0df61f2ed90a24e2d4176e8a50a5b", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^6.0.0", diff --git a/yarn.lock b/yarn.lock index 8584104f9db1..b67374db4268 100644 --- a/yarn.lock +++ b/yarn.lock @@ -185,6 +185,14 @@ "@angular-devkit/core" "18.1.0-next.1" rxjs "7.8.1" +"@angular-devkit/architect@0.1801.0-rc.0": + version "0.1801.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1801.0-rc.0.tgz#f46a774e6cf45abbb8d3eb496240c3603f899978" + integrity sha512-WFQRXD9UmwejSVBvsMjDGZATh2lmFoZOKjbRMmR8uHNyvYmUpQ0l9jVybquLoAYAhfBtZeaeVr8Z1eO+ZQp8xA== + dependencies: + "@angular-devkit/core" "18.1.0-rc.0" + rxjs "7.8.1" + "@angular-devkit/build-angular@18.1.0-next.1": version "18.1.0-next.1" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-18.1.0-next.1.tgz#68a87fb62c8b73155edca961790a204664ed2970" @@ -299,6 +307,18 @@ rxjs "7.8.1" source-map "0.7.4" +"@angular-devkit/core@18.1.0-rc.0": + version "18.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-18.1.0-rc.0.tgz#646392a93c836d8292112f7814f2dfb59359ddb7" + integrity sha512-tPmYOFZ29ZxSqkksZ09t0a30vC2co5s3SNkNv1Ncf/aWLlMnP4WypX4qHgbibU6MNAPIQhlN+sobtcvryuHxBQ== + dependencies: + ajv "8.16.0" + ajv-formats "3.0.1" + jsonc-parser "3.3.1" + picomatch "4.0.2" + rxjs "7.8.1" + source-map "0.7.4" + "@angular-devkit/schematics@18.1.0-next.1": version "18.1.0-next.1" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-18.1.0-next.1.tgz#d244a8ce85fa62396aaed27e2414f9e65443b80a" @@ -325,12 +345,12 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#5e30807f0fc6f1f00b2ac9186bd5f704b72e6ea6": - version "0.0.0-03b8a7dffd1205e061f0bee949024ebefc2a6592" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#5e30807f0fc6f1f00b2ac9186bd5f704b72e6ea6" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#3e3184d97be16d18d6b0f48f29fa8463e7f65587": + version "0.0.0-47ebdf399433abefafe459b3c51795dd8c6ab220" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#3e3184d97be16d18d6b0f48f29fa8463e7f65587" dependencies: "@angular/benchpress" "0.3.0" - "@angular/build" "18.1.0-next.0" + "@angular/build" "18.1.0-rc.0" "@babel/core" "^7.16.0" "@babel/helper-annotate-as-pure" "^7.18.6" "@babel/plugin-proposal-async-generator-functions" "^7.20.1" @@ -348,7 +368,7 @@ "@types/selenium-webdriver" "^4.1.21" "@types/send" "^0.17.1" "@types/tmp" "^0.2.1" - "@types/uuid" "^9.0.0" + "@types/uuid" "^10.0.0" "@types/ws" "8.5.10" "@types/yargs" "^17.0.0" browser-sync "^3.0.0" @@ -358,7 +378,7 @@ marked-mangle "^1.1.4" preact "^10.17.1" preact-render-to-string "^6.2.1" - prettier "3.3.1" + prettier "3.3.2" protractor "^7.0.0" selenium-webdriver "^4.18.1" send "^0.18.0" @@ -366,20 +386,21 @@ tmp "^0.2.1" "true-case-path" "^2.2.1" tslib "^2.5.2" - typescript "5.4.5" - uuid "^9.0.0" + tsx "^4.15.7" + typescript "5.5.2" + uuid "^10.0.0" yargs "^17.0.0" -"@angular/build@18.1.0-next.0": - version "18.1.0-next.0" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-18.1.0-next.0.tgz#0199110b0d7e1f9786edca49bcae1def50da953d" - integrity sha512-S/swoEAnlO69YHAZqfX3lZBrzFGdyI3pn3Gf3K6cZhEJE3h4/y9+stsAe3jWpi5n5PHEiaUSaJNu0MLpoYnkTA== +"@angular/build@18.1.0-next.1": + version "18.1.0-next.1" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-18.1.0-next.1.tgz#7e018ab3f505bb4939a6558c260ab4be366a86e4" + integrity sha512-VcQrjQNTm/BDFq0nbsIO2+QwtNIDm+8PCh0L8rh84RofFiZWBt+dO735BHiJZLKCo+lRxLtY/mrFteRGqIweJA== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1801.0-next.0" - "@babel/core" "7.24.6" - "@babel/helper-annotate-as-pure" "7.24.6" - "@babel/helper-split-export-declaration" "7.24.6" + "@angular-devkit/architect" "0.1801.0-next.1" + "@babel/core" "7.24.7" + "@babel/helper-annotate-as-pure" "7.24.7" + "@babel/helper-split-export-declaration" "7.24.7" "@vitejs/plugin-basic-ssl" "1.1.0" ansi-colors "4.1.3" browserslist "^4.23.0" @@ -387,7 +408,7 @@ esbuild "0.21.4" fast-glob "3.3.2" https-proxy-agent "7.0.4" - inquirer "9.2.22" + inquirer "9.2.23" lmdb "3.0.11" magic-string "0.30.10" mrmime "2.0.0" @@ -395,41 +416,41 @@ parse5-html-rewriting-stream "7.0.0" picomatch "4.0.2" piscina "4.5.1" - sass "1.77.2" + sass "1.77.4" semver "7.6.2" - undici "6.18.1" + undici "6.18.2" vite "5.2.12" watchpack "2.4.1" -"@angular/build@18.1.0-next.1": - version "18.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/build/-/build-18.1.0-next.1.tgz#7e018ab3f505bb4939a6558c260ab4be366a86e4" - integrity sha512-VcQrjQNTm/BDFq0nbsIO2+QwtNIDm+8PCh0L8rh84RofFiZWBt+dO735BHiJZLKCo+lRxLtY/mrFteRGqIweJA== +"@angular/build@18.1.0-rc.0": + version "18.1.0-rc.0" + resolved "https://registry.yarnpkg.com/@angular/build/-/build-18.1.0-rc.0.tgz#3d783e7b17f78317c90d0a8cec03f01d5172ad51" + integrity sha512-/UCQac+Q2Q+aLwKbgjIZw0QGOkFCOPNCs9RVPp3pObQ5PuFbS0pJOcvCysxGNeHgoKQWRIFDRej/jQSMcHipRA== dependencies: "@ampproject/remapping" "2.3.0" - "@angular-devkit/architect" "0.1801.0-next.1" + "@angular-devkit/architect" "0.1801.0-rc.0" "@babel/core" "7.24.7" "@babel/helper-annotate-as-pure" "7.24.7" "@babel/helper-split-export-declaration" "7.24.7" + "@inquirer/confirm" "3.1.10" "@vitejs/plugin-basic-ssl" "1.1.0" ansi-colors "4.1.3" browserslist "^4.23.0" - critters "0.0.22" - esbuild "0.21.4" + critters "0.0.24" + esbuild "0.21.5" fast-glob "3.3.2" https-proxy-agent "7.0.4" - inquirer "9.2.23" - lmdb "3.0.11" + lmdb "3.0.12" magic-string "0.30.10" mrmime "2.0.0" ora "5.4.1" parse5-html-rewriting-stream "7.0.0" picomatch "4.0.2" - piscina "4.5.1" - sass "1.77.4" + piscina "4.6.1" + sass "1.77.6" semver "7.6.2" - undici "6.18.2" - vite "5.2.12" + undici "6.19.2" + vite "5.3.1" watchpack "2.4.1" "@angular/cdk@18.1.0-next.1": @@ -471,18 +492,18 @@ dependencies: tslib "^2.3.0" -"@angular/docs@https://github.com/angular/dev-infra-private-docs-builds.git#97fa4e1998648d1c620113d8eb15a324ae7b20b3": - version "0.0.0-720be096e12c01c8346d7787e0931b184525b925" - resolved "https://github.com/angular/dev-infra-private-docs-builds.git#97fa4e1998648d1c620113d8eb15a324ae7b20b3" +"@angular/docs@https://github.com/angular/dev-infra-private-docs-builds.git#2f58fdebbd27f42e8eb8f4b7885f32b066ded66a": + version "0.0.0-47ebdf399433abefafe459b3c51795dd8c6ab220" + resolved "https://github.com/angular/dev-infra-private-docs-builds.git#2f58fdebbd27f42e8eb8f4b7885f32b066ded66a" dependencies: "@webcontainer/api" "^1.1.8" diff "~5.2.0" emoji-regex "~10.3.0" fast-glob "~3.3.2" + fflate "^0.8.2" highlight.js "~11.9.0" html-entities "~2.5.2" jsdom "~24.1.0" - jszip "~3.10.1" marked "~12.0.2" mermaid "^10.8.0" @@ -589,14 +610,6 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/code-frame@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.6.tgz#ab88da19344445c3d8889af2216606d3329f3ef2" - integrity sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA== - dependencies: - "@babel/highlight" "^7.24.6" - picocolors "^1.0.0" - "@babel/compat-data@^7.22.6": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" @@ -607,27 +620,6 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== -"@babel/core@7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.6.tgz#8650e0e4b03589ebe886c4e4a60398db0a7ec787" - integrity sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.6" - "@babel/generator" "^7.24.6" - "@babel/helper-compilation-targets" "^7.24.6" - "@babel/helper-module-transforms" "^7.24.6" - "@babel/helpers" "^7.24.6" - "@babel/parser" "^7.24.6" - "@babel/template" "^7.24.6" - "@babel/traverse" "^7.24.6" - "@babel/types" "^7.24.6" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - "@babel/core@7.24.7", "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" @@ -659,23 +651,6 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/generator@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.6.tgz#dfac82a228582a9d30c959fe50ad28951d4737a7" - integrity sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg== - dependencies: - "@babel/types" "^7.24.6" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz#517af93abc77924f9b2514c407bbef527fb8938d" - integrity sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg== - dependencies: - "@babel/types" "^7.24.6" - "@babel/helper-annotate-as-pure@7.24.7", "@babel/helper-annotate-as-pure@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" @@ -698,7 +673,7 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.6", "@babel/helper-compilation-targets@^7.24.7": +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== @@ -796,7 +771,7 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.24.6", "@babel/helper-module-transforms@^7.24.7": +"@babel/helper-module-transforms@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== @@ -867,13 +842,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helper-split-export-declaration@7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz#e830068f7ba8861c53b7421c284da30ae656d7a3" - integrity sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw== - dependencies: - "@babel/types" "^7.24.6" - "@babel/helper-split-export-declaration@7.24.7", "@babel/helper-split-export-declaration@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" @@ -881,7 +849,7 @@ dependencies: "@babel/types" "^7.24.7" -"@babel/helper-string-parser@^7.24.1", "@babel/helper-string-parser@^7.24.6", "@babel/helper-string-parser@^7.24.7": +"@babel/helper-string-parser@^7.24.1", "@babel/helper-string-parser@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== @@ -891,11 +859,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== -"@babel/helper-validator-identifier@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz#08bb6612b11bdec78f3feed3db196da682454a5e" - integrity sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw== - "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" @@ -916,14 +879,6 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/helpers@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.6.tgz#cd124245299e494bd4e00edda0e4ea3545c2c176" - integrity sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA== - dependencies: - "@babel/template" "^7.24.6" - "@babel/types" "^7.24.6" - "@babel/helpers@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" @@ -932,16 +887,6 @@ "@babel/template" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/highlight@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.6.tgz#6d610c1ebd2c6e061cade0153bf69b0590b7b3df" - integrity sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ== - dependencies: - "@babel/helper-validator-identifier" "^7.24.6" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - "@babel/highlight@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" @@ -957,11 +902,6 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== -"@babel/parser@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.6.tgz#5e030f440c3c6c78d195528c3b688b101a365328" - integrity sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q== - "@babel/parser@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" @@ -1648,7 +1588,7 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.24.6", "@babel/template@^7.24.7": +"@babel/template@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== @@ -1657,7 +1597,7 @@ "@babel/parser" "^7.24.7" "@babel/types" "^7.24.7" -"@babel/traverse@^7.24.6", "@babel/traverse@^7.24.7": +"@babel/traverse@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== @@ -1691,15 +1631,6 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@babel/types@^7.24.6": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.6.tgz#ba4e1f59870c10dc2fa95a274ac4feec23b21912" - integrity sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ== - dependencies: - "@babel/helper-string-parser" "^7.24.6" - "@babel/helper-validator-identifier" "^7.24.6" - to-fast-properties "^2.0.0" - "@bazel/bazelisk@^1.7.5": version "1.19.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.19.0.tgz#de12b6920b2c5505a776fadc0c9e75daae930c32" @@ -1982,6 +1913,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz#f83eb142df3ca7b49531c1ed680b81e484316508" integrity sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + "@esbuild/android-arm64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" @@ -1992,6 +1928,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz#dd328039daccd6033b2d1e536c054914bfc92287" integrity sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + "@esbuild/android-arm@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" @@ -2002,6 +1943,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.4.tgz#76767a989720a97b206ea14c52af6e4589e48b0d" integrity sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + "@esbuild/android-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" @@ -2012,6 +1958,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.4.tgz#14a8ae3c35702d882086efb5a8f8d7b0038d8d35" integrity sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q== +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + "@esbuild/darwin-arm64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" @@ -2022,6 +1973,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz#7e735046005e4c12e9139e0bdd1fa6a754430d57" integrity sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA== +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + "@esbuild/darwin-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" @@ -2032,6 +1988,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz#db623553547a5fe3502a63aa88306e9023178482" integrity sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + "@esbuild/freebsd-arm64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" @@ -2042,6 +2003,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz#91cbad647c079bf932086fbd4749d7f563df67b8" integrity sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg== +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + "@esbuild/freebsd-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" @@ -2052,6 +2018,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz#723299b9859ccbe5532fecbadba3ac33019ba8e8" integrity sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ== +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + "@esbuild/linux-arm64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" @@ -2062,6 +2033,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz#531743f861e1ef6e50b874d6c784cda37aa5e685" integrity sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + "@esbuild/linux-arm@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" @@ -2072,6 +2048,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz#1144b5654764960dd97d90ddf0893a9afc63ad91" integrity sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + "@esbuild/linux-ia32@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" @@ -2082,6 +2063,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz#c81b6f2ed3308d3b75ccefb5ac63bc4cf3a9d2e9" integrity sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g== +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + "@esbuild/linux-loong64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" @@ -2092,6 +2078,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz#87b6af7cd0f2551653955fc2dc465b7f4464af0a" integrity sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ== +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + "@esbuild/linux-mips64el@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" @@ -2102,6 +2093,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz#fec73cd39490a0c45d052bef03e011a0ad366c06" integrity sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA== +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + "@esbuild/linux-ppc64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" @@ -2112,6 +2108,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz#ea3b5e13b0fc8666bd4c6f7ea58bd1830f3e6e78" integrity sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg== +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + "@esbuild/linux-riscv64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" @@ -2122,6 +2123,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz#80d406f653fc6b193edaeb55ac88d4ac22c8f155" integrity sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w== +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + "@esbuild/linux-s390x@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" @@ -2132,6 +2138,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz#9cbd26854b5b12cf22fb54c96cd1adffaf6ace6f" integrity sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA== +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + "@esbuild/linux-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" @@ -2142,6 +2153,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz#44dfe1c5cad855362c830c604dba97fbb16fc114" integrity sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg== +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + "@esbuild/netbsd-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" @@ -2152,6 +2168,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz#89b97d823e1cc4bf8c4e5dc8f76c8d6ceb1c87f3" integrity sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + "@esbuild/openbsd-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" @@ -2162,6 +2183,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz#080715bb4981c326364320d7b56835608e2bd98d" integrity sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg== +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + "@esbuild/sunos-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" @@ -2172,6 +2198,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz#8d838a8ac80e211536490108b72fb0091a811626" integrity sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A== +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + "@esbuild/win32-arm64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" @@ -2182,6 +2213,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz#94afb4c2ac89b0f09791606d6d93fdab322f81c8" integrity sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg== +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + "@esbuild/win32-ia32@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" @@ -2192,6 +2228,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz#822085cd52f2f1dd90eabb59346ffa779c0bab83" integrity sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw== +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + "@esbuild/win32-x64@0.20.2": version "0.20.2" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" @@ -2202,6 +2243,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz#11ef0398f9abee161193461910a507ef0d4c0c32" integrity sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + "@fastify/busboy@^2.0.0": version "2.1.1" resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" @@ -2302,11 +2348,45 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz#bf344cc75136039bc41bcf5d1ddbcb40405fca3b" integrity sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg== -"@inquirer/figures@^1.0.2", "@inquirer/figures@^1.0.3": +"@inquirer/confirm@3.1.10": + version "3.1.10" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.10.tgz#8e8b36b1e41d6736d6ac90d1221c9e1ec948eb7a" + integrity sha512-/aAHu83Njy6yf44T+ZrRPUkMcUqprrOiIKsyMvf9jOV+vF5BNb2ja1aLP33MK36W8eaf91MTL/mU/e6METuENg== + dependencies: + "@inquirer/core" "^8.2.3" + "@inquirer/type" "^1.3.3" + +"@inquirer/core@^8.2.3": + version "8.2.4" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-8.2.4.tgz#300de755849d3166d15127e2341cef6aa4bd031d" + integrity sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA== + dependencies: + "@inquirer/figures" "^1.0.3" + "@inquirer/type" "^1.3.3" + "@types/mute-stream" "^0.0.4" + "@types/node" "^20.14.9" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + picocolors "^1.0.1" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + +"@inquirer/figures@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.3.tgz#1227cc980f88e6d6ab85abadbf164f5038041edd" integrity sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw== +"@inquirer/type@^1.3.3": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.4.0.tgz#3dd0c8f78c0548bbc18b9c07af16a86c4007e1f0" + integrity sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw== + dependencies: + mute-stream "^1.0.0" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2485,31 +2565,61 @@ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.11.tgz#8b0034d9f9a5c859f629a5c1e760bf43258e9e6c" integrity sha512-7rO1BiJDWy0WEHDknVSuROMmBHD0Vh5KsgQojN8ulNbOJf0f3KsjoVB3HDPlVO3n75hTjxGn0rG19im28H3DVQ== +"@lmdb/lmdb-darwin-arm64@3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.12.tgz#941c36f78f8f5cbbea4070727d360e2f59611ba1" + integrity sha512-vgTwzNUD3Hy4aqtGhX2+nV/usI0mwy3hDRuTjs8VcK0BLiMVEpNQXgzwlWEgPmA8AAPloUgyOs2nK5clJF5oIg== + "@lmdb/lmdb-darwin-x64@3.0.11": version "3.0.11" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.11.tgz#e7290bec89c21d94ae501f014d12ac24ae8283a5" integrity sha512-rqkwNYEqQ6BR51ffHasIMh/8+slTPf1kfoAdreLDsUkpAJ/hntW0QP9eMC9eOwRjfuOURdlgGLeCaaCpDTxMCQ== +"@lmdb/lmdb-darwin-x64@3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.12.tgz#b73d7b7cc46253320a786e959fa131de90b4a4f9" + integrity sha512-qOt0hAhj2ZLY6aEWu85rzt5zcyCAQITMhCMEPNlo1tuYekpVAdkQNiwXxEkCjBYvwTskvXuwXOOUpjuSc+aJnA== + "@lmdb/lmdb-linux-arm64@3.0.11": version "3.0.11" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.11.tgz#399299cc2f4f97c78666f2c5273842c77847f2c2" integrity sha512-P5d7Uj297g2tlKsvDZDqZNEZ3mw0npTrQuizPS63tXV1VGz/bHMuqL1/NWmJqAtVSPZdhQe0DD/sbBai7Ra6UA== +"@lmdb/lmdb-linux-arm64@3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.12.tgz#c7a74d215728085ec4096feef303ba930e33f9c3" + integrity sha512-Qy4cFXFe9h1wAWMsojex8x1ifvw2kqiZv686YiRTdQEzAfc3vJASHFcD/QejHUCx7YHMYdnUoCS45rG2AiGDTQ== + "@lmdb/lmdb-linux-arm@3.0.11": version "3.0.11" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.11.tgz#943db4a560115bbb96b77be564d128c41898e193" integrity sha512-uGR/sHB5p5d5dzP2+sbrf42++qw8PQbB6CqgHMBfZcXTUWz+A84XWWbl9UMg+6XY11mBHKUpzhswbHnpmE3iAg== +"@lmdb/lmdb-linux-arm@3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.12.tgz#7a603d8732046b67d475030f72d2dabf68045d32" + integrity sha512-Ggd/UXpE+alMncbELCXA3OKpDj9bDBR3qVO7WRTxstloDglRAHfZmUJgTkeaNKjFO1JHqS7AKy0jba9XebZB1w== + "@lmdb/lmdb-linux-x64@3.0.11": version "3.0.11" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.11.tgz#ec5e071a157f185c2920ce99769dbf5a2fffe8f1" integrity sha512-xiO21qpfu/cu1Pcf/2+l2eG/96wFTzgPa25/qQ/VdvlrnKfYhtDzBo06lmfa6xrEzQZJ/kdFzwHZuafCDE58iA== +"@lmdb/lmdb-linux-x64@3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.12.tgz#cc1fbf72a57caf7c0fbd6e7ddecae6660e7b57cd" + integrity sha512-c+noT9IofktxktFllKHFmci8ka2SYGSLN17pj/KSl1hg7mmfAiGp4xxFxEwMLTb+SX95vP1DFiR++1I3WLVxvA== + "@lmdb/lmdb-win32-x64@3.0.11": version "3.0.11" resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.11.tgz#76fdd3338a5f55e778f3c9121cce2cacf87b48a6" integrity sha512-tjlzuLdmTlsWVdj7Wso/p3wJtLMqznkeGEELRMjRQCgas8mONBuwmk9jFO30Di86z4QxL1agZvugUrPMCm/iDw== +"@lmdb/lmdb-win32-x64@3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz#0e06dc23dfe23c4a9d0a9cbcce1b0af74c8884a0" + integrity sha512-CO3MFV8gUx16NU/CyyuumAKblESwvoGVA2XhQKZ976OTOxaTbb8F8D3f0iiZ4MYqsN74jIrFuCmXpPnpjbhfOQ== + "@material/animation@15.0.0-canary.7f224ddd4.0": version "15.0.0-canary.7f224ddd4.0" resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.7f224ddd4.0.tgz#14b4f80718f9d405953dfca4376f9bcef609adc6" @@ -4496,6 +4606,13 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/node-forge@^1.3.0": version "1.3.11" resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" @@ -4532,6 +4649,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^20.14.9": + version "20.14.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" + integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + dependencies: + undici-types "~5.26.4" + "@types/normalize-package-data@^2.4.3": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" @@ -4715,16 +4839,21 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== -"@types/uuid@^9.0.0": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== "@types/which@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/ws@*", "@types/ws@8.5.10", "@types/ws@^8.5.10": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -6291,7 +6420,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.5.0: +cli-spinners@^2.5.0, cli-spinners@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== @@ -6881,6 +7010,19 @@ critters@0.0.22: postcss "^8.4.23" postcss-media-query-parser "^0.2.3" +critters@0.0.24: + version "0.0.24" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.24.tgz#d20b16c28908d2dae4b9cd4851d4d2c93de98a0b" + integrity sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q== + dependencies: + chalk "^4.1.0" + css-select "^5.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.2" + htmlparser2 "^8.0.2" + postcss "^8.4.23" + postcss-media-query-parser "^0.2.3" + cross-env@^5.1.3: version "5.2.1" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.1.tgz#b2c76c1ca7add66dc874d11798466094f551b34d" @@ -8103,6 +8245,35 @@ esbuild@0.21.4: "@esbuild/win32-ia32" "0.21.4" "@esbuild/win32-x64" "0.21.4" +esbuild@0.21.5, esbuild@^0.21.3, esbuild@~0.21.5: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + esbuild@^0.20.1, esbuild@~0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" @@ -8472,6 +8643,11 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + figures@^3.0.0, figures@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -9864,27 +10040,6 @@ inquirer-autocomplete-prompt@^2.0.1: run-async "^2.4.1" rxjs "^7.5.4" -inquirer@9.2.22: - version "9.2.22" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.22.tgz#718cb4153f0d35176aab27d495f8e358d1e2008f" - integrity sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw== - dependencies: - "@inquirer/figures" "^1.0.2" - "@ljharb/through" "^2.3.13" - ansi-escapes "^4.3.2" - chalk "^5.3.0" - cli-cursor "^3.1.0" - cli-width "^4.1.0" - external-editor "^3.1.0" - lodash "^4.17.21" - mute-stream "1.0.0" - ora "^5.4.1" - run-async "^3.0.0" - rxjs "^7.8.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wrap-ansi "^6.2.0" - inquirer@9.2.23, inquirer@^9.2.7: version "9.2.23" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.23.tgz#cd2fe34edca12315b624fbc3c8cb99b1c4f61f90" @@ -10727,6 +10882,11 @@ jsonc-parser@3.2.1: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== +jsonc-parser@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== + jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" @@ -10781,7 +10941,7 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -jszip@^3.1.3, jszip@^3.10.1, jszip@~3.10.1: +jszip@^3.1.3, jszip@^3.10.1: version "3.10.1" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== @@ -11095,6 +11255,24 @@ lmdb@3.0.11: "@lmdb/lmdb-linux-x64" "3.0.11" "@lmdb/lmdb-win32-x64" "3.0.11" +lmdb@3.0.12: + version "3.0.12" + resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-3.0.12.tgz#24dd824f9e50b3a7873d1ebe32f70d0e52befab1" + integrity sha512-JnoEulTgveoC64vlYJ9sufGLuNkk6TcxSYpKxSC9aM42I61jIv3pQH0fgb6qW7HV0+FNqA3g1WCQQYfhfawGoQ== + dependencies: + msgpackr "^1.10.2" + node-addon-api "^6.1.0" + node-gyp-build-optional-packages "5.2.2" + ordered-binary "^1.4.1" + weak-lru-cache "^1.2.2" + optionalDependencies: + "@lmdb/lmdb-darwin-arm64" "3.0.12" + "@lmdb/lmdb-darwin-x64" "3.0.12" + "@lmdb/lmdb-linux-arm" "3.0.12" + "@lmdb/lmdb-linux-arm64" "3.0.12" + "@lmdb/lmdb-linux-x64" "3.0.12" + "@lmdb/lmdb-win32-x64" "3.0.12" + loader-runner@^4.2.0: version "4.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" @@ -12053,7 +12231,7 @@ msgpackr-extract@^3.0.2: "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2" "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2" -msgpackr@^1.9.9: +msgpackr@^1.10.2, msgpackr@^1.9.9: version "1.10.2" resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.10.2.tgz#a73de4767f76659e8c69cf9c80fdfce83937a44a" integrity sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA== @@ -12078,7 +12256,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mute-stream@1.0.0: +mute-stream@1.0.0, mute-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== @@ -12202,6 +12380,13 @@ node-gyp-build-optional-packages@5.1.1: dependencies: detect-libc "^2.0.1" +node-gyp-build-optional-packages@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz#522f50c2d53134d7f3a76cd7255de4ab6c96a3a4" + integrity sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw== + dependencies: + detect-libc "^2.0.1" + node-gyp-build@^4.2.2: version "4.8.1" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" @@ -12985,6 +13170,13 @@ piscina@4.5.1: optionalDependencies: nice-napi "^1.0.2" +piscina@4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.6.1.tgz#4de673b0ff84bf641b31b07b3348669383b51c9a" + integrity sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA== + optionalDependencies: + nice-napi "^1.0.2" + pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -13161,7 +13353,12 @@ precinct@^11.0.5: module-definition "^5.0.1" node-source-walk "^6.0.2" -prettier@3.3.1, prettier@^3.0.0: +prettier@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a" + integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== + +prettier@^3.0.0: version "3.3.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.1.tgz#e68935518dd90bb7ec4821ba970e68f8de16e1ac" integrity sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg== @@ -14108,19 +14305,19 @@ sass-lookup@^5.0.1: dependencies: commander "^10.0.1" -sass@1.77.2: - version "1.77.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.2.tgz#18d4ed2eefc260cdc8099c5439ec1303fd5863aa" - integrity sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA== +sass@1.77.4: + version "1.77.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.4.tgz#92059c7bfc56b827c56eb116778d157ec017a5cd" + integrity sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@1.77.4: - version "1.77.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.4.tgz#92059c7bfc56b827c56eb116778d157ec017a5cd" - integrity sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw== +sass@1.77.6: + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14511,7 +14708,7 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -15555,6 +15752,16 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" +tsx@^4.15.7: + version "4.16.2" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.16.2.tgz#8722be119ae226ef0b4c6210d5ee90f3ba823f19" + integrity sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ== + dependencies: + esbuild "~0.21.5" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + tsx@^4.7.2: version "4.11.2" resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.11.2.tgz#91791db82cbcd3f7515e623cc9ff288f2aa663dc" @@ -15707,16 +15914,21 @@ typescript@5.4.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== -typescript@5.4.5, typescript@^5.0.4, typescript@^5.4.4: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@5.5.2: + version "5.5.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" + integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== typescript@5.5.3: version "5.5.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== +typescript@^5.0.4, typescript@^5.4.4: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + typescript@~4.9.0: version "4.9.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" @@ -15780,16 +15992,16 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -undici@6.18.1: - version "6.18.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.18.1.tgz#8390af4c4bed00fc32cb5f77f1c5e03e3271b8f2" - integrity sha512-/0BWqR8rJNRysS5lqVmfc7eeOErcOP4tZpATVjJOojjHZ71gSYVAtFhEmadcIjwMIUehh5NFyKGsXCnXIajtbA== - undici@6.18.2, undici@^6.15.0: version "6.18.2" resolved "https://registry.yarnpkg.com/undici/-/undici-6.18.2.tgz#f662a5dc33cf654fc412a9912e5a07b138d75c97" integrity sha512-o/MQLTwRm9IVhOqhZ0NQ9oXax1ygPjw6Vs+Vq/4QRjbOAC3B1GCHy7TYxxbExKlb7bzDRzt9vBWU6BDz0RFfYg== +undici@6.19.2: + version "6.19.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.19.2.tgz#231bc5de78d0dafb6260cf454b294576c2f3cd31" + integrity sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA== + undici@^5.25.4: version "5.28.4" resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" @@ -15992,6 +16204,11 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -16135,6 +16352,17 @@ vite@5.2.12: optionalDependencies: fsevents "~2.3.3" +vite@5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.1.tgz#bb2ca6b5fd7483249d3e86b25026e27ba8a663e6" + integrity sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.38" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" From 107173c14d1a0d95b78fbcac53a46bce5f8a6848 Mon Sep 17 00:00:00 2001 From: Tomer953 Date: Thu, 11 Jul 2024 08:46:32 +0300 Subject: [PATCH 003/143] fix(compiler): use strict equality for 'code' comparison (#56944) Replace loose equality (==) with strict equality (===) for the 'code' variable. This change ensures type safety and prevents unintended type coercion. PR Close #56944 --- packages/compiler/src/ml_parser/lexer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts index 3da19622494b..47d6b70b03c9 100644 --- a/packages/compiler/src/ml_parser/lexer.ts +++ b/packages/compiler/src/ml_parser/lexer.ts @@ -409,7 +409,7 @@ class _Tokenizer { this._attemptCharCodeUntilFn((code) => { if ( chars.isAsciiLetter(code) || - code == chars.$$ || + code === chars.$$ || code === chars.$_ || // `@let` names can't start with a digit, but digits are valid anywhere else in the name. (allowDigit && chars.isDigit(code)) From e5f11dd31eeaeaa8ef9fe5e1fd6606f7916db47b Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 10 Jul 2024 14:02:32 +0000 Subject: [PATCH 004/143] build: fix rate limits when deploying angular.dev site (#56929) This commit fixes that the angular.dev deployment is subject to GitHub API rate limiting due to lack of an access token. This commit fixes this, similar to how we fixed it in `angular/components`. The token is pure read-only. PR Close #56929 --- .github/actions/deploy-docs-site/action.yml | 3 +++ .github/actions/deploy-docs-site/lib/credential.ts | 5 +++++ .github/actions/deploy-docs-site/lib/deployments.ts | 4 ++-- .github/actions/deploy-docs-site/lib/main.ts | 6 +++++- .github/actions/deploy-docs-site/main.js | 6 +++++- .github/workflows/ci.yml | 1 + 6 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/actions/deploy-docs-site/action.yml b/.github/actions/deploy-docs-site/action.yml index 91e661d0476d..e29d2b2aeeb9 100644 --- a/.github/actions/deploy-docs-site/action.yml +++ b/.github/actions/deploy-docs-site/action.yml @@ -5,6 +5,9 @@ inputs: serviceKey: description: 'The service key used for firebase deployments.' required: true + githubReleaseTrainReadToken: + description: 'GitHub access token for reading release trains without rate limits.' + required: true configPath: description: 'The path to the firebase config file.' required: true diff --git a/.github/actions/deploy-docs-site/lib/credential.ts b/.github/actions/deploy-docs-site/lib/credential.ts index 69535c7cc0a6..177f4cd0a97c 100644 --- a/.github/actions/deploy-docs-site/lib/credential.ts +++ b/.github/actions/deploy-docs-site/lib/credential.ts @@ -13,3 +13,8 @@ export function getCredentialFilePath(): string { } return credentialFilePath; } + +/** Github access token. Used for querying the active release trains. */ +export const githubReleaseTrainReadToken: string = getInput('githubReleaseTrainReadToken', { + required: true, +}); diff --git a/.github/actions/deploy-docs-site/lib/deployments.ts b/.github/actions/deploy-docs-site/lib/deployments.ts index 0686800a72b3..2690ca34726a 100644 --- a/.github/actions/deploy-docs-site/lib/deployments.ts +++ b/.github/actions/deploy-docs-site/lib/deployments.ts @@ -1,6 +1,6 @@ import {fetchLongTermSupportBranchesFromNpm, ActiveReleaseTrains} from '@angular/ng-dev'; import {ReleaseConfig} from '@angular/ng-dev'; -import {GitClient} from '@angular/ng-dev'; +import {AuthenticatedGitClient} from '@angular/ng-dev'; export interface Deployment { branch: string; @@ -14,7 +14,7 @@ export interface Deployment { export type Deployments = Map; export async function getDeployments(): Promise { - const {github} = await GitClient.get(); + const {github} = await AuthenticatedGitClient.get(); const releaseTrains = await ActiveReleaseTrains.fetch({ api: github, name: 'angular', diff --git a/.github/actions/deploy-docs-site/lib/main.ts b/.github/actions/deploy-docs-site/lib/main.ts index 498fa7ed227a..250cbe05ea2d 100644 --- a/.github/actions/deploy-docs-site/lib/main.ts +++ b/.github/actions/deploy-docs-site/lib/main.ts @@ -2,7 +2,8 @@ import {getInput, setFailed} from '@actions/core'; import {context} from '@actions/github'; import {deployToFirebase, setupRedirect} from './deploy'; import {getDeployments} from './deployments'; -import {GithubConfig, setConfig} from '@angular/ng-dev'; +import {AuthenticatedGitClient, GithubConfig, setConfig} from '@angular/ng-dev'; +import {githubReleaseTrainReadToken} from './credential'; const refMatcher = /refs\/heads\/(.*)/; @@ -14,6 +15,9 @@ async function deployDocs() { owner: 'angular', }, }); + + AuthenticatedGitClient.configure(githubReleaseTrainReadToken); + if (context.eventName !== 'push') { throw Error(); } diff --git a/.github/actions/deploy-docs-site/main.js b/.github/actions/deploy-docs-site/main.js index acc33ef171b8..bf4298a1a826 100644 --- a/.github/actions/deploy-docs-site/main.js +++ b/.github/actions/deploy-docs-site/main.js @@ -11344,6 +11344,9 @@ function getCredentialFilePath() { } return credentialFilePath; } +var githubReleaseTrainReadToken = (0, import_core.getInput)("githubReleaseTrainReadToken", { + required: true +}); // async function deployToFirebase(deployment, configPath, distDirPath) { @@ -12977,7 +12980,7 @@ AuthenticatedGitClient._authenticatedInstance = null; // async function getDeployments() { - const { github } = await GitClient.get(); + const { github } = await AuthenticatedGitClient.get(); const releaseTrains = await ActiveReleaseTrains.fetch({ api: github, name: "angular", @@ -13033,6 +13036,7 @@ async function deployDocs() { owner: "angular" } }); + AuthenticatedGitClient.configure(githubReleaseTrainReadToken); if (import_github3.context.eventName !== "push") { throw Error(); } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a2185f591b6..fb0dbee5d9cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -197,5 +197,6 @@ jobs: uses: ./.github/actions/deploy-docs-site with: serviceKey: ${{ secrets.ANGULAR_DEV_SITE_DEPLOY }} + githubReleaseTrainReadToken: ${{ secrets.DOCS_DEPLOY_GITHUB_RELEASE_TRAIN_TOKEN }} configPath: 'adev/firebase.json' distDir: 'dist/bin/adev/build/browser' From 0953d655b7cb8e940cb1e403b257098576d960ea Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Thu, 6 Jun 2024 00:21:49 +0200 Subject: [PATCH 005/143] docs(docs-infra): focus api search filter on non-touch devices (#56294) PR Close #56294 --- .../api-reference-list.component.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts index efe975ac269f..2cb1e3873aab 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts @@ -6,7 +6,16 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ChangeDetectionStrategy, Component, computed, inject, signal} from '@angular/core'; +import { + ChangeDetectionStrategy, + Component, + ElementRef, + computed, + effect, + inject, + signal, + viewChild, +} from '@angular/core'; import ApiItemsSection from '../api-items-section/api-items-section.component'; import {FormsModule} from '@angular/forms'; import {SlideToggle, TextField} from '@angular/docs'; @@ -38,9 +47,18 @@ export const ALL_STATUSES_KEY = 'All'; }) export default class ApiReferenceList { private readonly apiReferenceManager = inject(ApiReferenceManager); + filterInput = viewChild.required(TextField, {read: ElementRef}); private readonly allGroups = this.apiReferenceManager.apiGroups; + private filterEffect = effect(() => { + if (matchMedia('(hover: hover) and (pointer:fine)').matches) { + // Lord forgive me for I have sinned + // Use the CVA to focus when https://github.com/angular/angular/issues/31133 is implemented + this.filterInput().nativeElement.querySelector('input').focus(); + } + }); + query = signal(''); includeDeprecated = signal(false); type = signal(ALL_STATUSES_KEY); From 8f08d0491630d46ed6d0ba2cfe70ed0e7a0bf58e Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Thu, 11 Jul 2024 18:07:51 +0200 Subject: [PATCH 006/143] ci: add an entry for aio in the pullapprove config (#56952) This would allow me & ben to review some of the changes on the 17.3 branch, for example the redirections. PR Close #56952 --- .pullapprove.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.pullapprove.yml b/.pullapprove.yml index 15817c859efb..84ef909b4b44 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -597,7 +597,8 @@ groups: conditions: - > contains_any_globs(files, [ - 'adev/**/{.*,*}' + 'adev/**/{.*,*}', + 'aio/**/{.*,*}' ]) reviewers: users: From 38b93201c5ab2b8391e320afbdf408f105f54969 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sat, 13 Jul 2024 00:23:32 +0200 Subject: [PATCH 007/143] refactor(compiler-cli): Extract call signatures from interfaces. (#56973) This commit adds support for extracting call signals from interfaces. fixes #56969 PR Close #56973 --- .../src/ngtsc/docs/src/class_extractor.ts | 15 +++++++++++--- .../interface_doc_extraction_spec.ts | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts index 970105117bf6..a8917f7a5510 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts @@ -272,7 +272,8 @@ class ClassExtractor { return ( !member.name || !this.isDocumentableMember(member) || - !!member.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.PrivateKeyword) || + (!ts.isCallSignatureDeclaration(member) && + member.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.PrivateKeyword)) || member.name.getText() === 'prototype' || isAngularPrivateName(member.name.getText()) || isInternal(member) @@ -280,8 +281,16 @@ class ClassExtractor { } /** Gets whether a class member is a method, property, or accessor. */ - private isDocumentableMember(member: ts.Node): member is MethodLike | PropertyLike { - return this.isMethod(member) || this.isProperty(member) || ts.isAccessor(member); + private isDocumentableMember( + member: ts.Node, + ): member is MethodLike | PropertyLike | ts.CallSignatureDeclaration { + return ( + this.isMethod(member) || + this.isProperty(member) || + ts.isAccessor(member) || + // Signatures are documentable if they are part of an interface. + ts.isCallSignatureDeclaration(member) + ); } /** Gets whether a member is a property. */ diff --git a/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts b/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts index a10e459926a6..690709644166 100644 --- a/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts +++ b/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts @@ -76,6 +76,26 @@ runInEachFileSystem(() => { expect(propertyEntry.type).toBe('number'); }); + it('should extract call signatures', () => { + env.write( + 'index.ts', + ` + export interface UserProfile { + (name: string): string; + } + `, + ); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.members.length).toBe(1); + + const methodEntry = interfaceEntry.members[0] as MethodEntry; + expect(methodEntry.memberType).toBe(MemberType.Method); + expect(methodEntry.name).toBe(''); + expect(methodEntry.returnType).toBe('string'); + }); + it('should extract a method with a rest parameter', () => { env.write( 'index.ts', From 0ea6a4a36128dc7a3792f4e164f024e91f429705 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Fri, 12 Jul 2024 11:46:28 -0400 Subject: [PATCH 008/143] fix(migrations): fix common module removal (#56968) This fixes the case that common module is removed on a second run of the migration. We were not looking at block parameters for common module usage. PR Close #56968 --- .../control-flow-migration/types.ts | 17 ++++++- .../test/control_flow_migration_spec.ts | 48 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/packages/core/schematics/ng-generate/control-flow-migration/types.ts b/packages/core/schematics/ng-generate/control-flow-migration/types.ts index c04d8ab85b44..49175f6a766f 100644 --- a/packages/core/schematics/ng-generate/control-flow-migration/types.ts +++ b/packages/core/schematics/ng-generate/control-flow-migration/types.ts @@ -6,7 +6,14 @@ * found in the LICENSE file at https://angular.io/license */ -import {Attribute, Element, ParseTreeResult, RecursiveVisitor, Text} from '@angular/compiler'; +import { + Attribute, + Block, + Element, + ParseTreeResult, + RecursiveVisitor, + Text, +} from '@angular/compiler'; import ts from 'typescript'; import {lookupIdentifiersInSourceFile} from './identifier-lookup'; @@ -377,6 +384,14 @@ export class CommonCollector extends RecursiveVisitor { super.visitElement(el, null); } + override visitBlock(ast: Block): void { + for (const blockParam of ast.parameters) { + if (this.hasPipes(blockParam.expression)) { + this.count++; + } + } + } + override visitText(ast: Text) { if (this.hasPipes(ast.value)) { this.count++; diff --git a/packages/core/schematics/test/control_flow_migration_spec.ts b/packages/core/schematics/test/control_flow_migration_spec.ts index 9c9868de71a6..cc77f95667f7 100644 --- a/packages/core/schematics/test/control_flow_migration_spec.ts +++ b/packages/core/schematics/test/control_flow_migration_spec.ts @@ -6243,6 +6243,54 @@ describe('control flow migration', () => { expect(actual).toBe(expected); }); + it('should not remove common module when second run of migration and common module symbols are found', async () => { + writeFile( + '/comp.ts', + [ + `import {Component} from '@angular/core';`, + `import {CommonModule} from '@angular/common';\n`, + `@Component({`, + ` standalone: true`, + ` selector: 'example-cmp',`, + ` templateUrl: './comp.html',`, + ` imports: [CommonModule],`, + `})`, + `export class ExampleCmp {`, + `}`, + ].join('\n'), + ); + + writeFile( + '/comp.html', + [ + `
`, + ` @if (state$ | async; as state) {`, + `
`, + ` Content here {{state}}`, + `
`, + ` }`, + `
`, + ].join('\n'), + ); + + await runMigration(); + const actual = tree.readContent('/comp.ts'); + const expected = [ + `import {Component} from '@angular/core';`, + `import {CommonModule} from '@angular/common';\n`, + `@Component({`, + ` standalone: true`, + ` selector: 'example-cmp',`, + ` templateUrl: './comp.html',`, + ` imports: [CommonModule],`, + `})`, + `export class ExampleCmp {`, + `}`, + ].join('\n'); + + expect(actual).toBe(expected); + }); + it('should not remove imports when mismatch in counts', async () => { writeFile( '/comp.ts', From f0d6d0688d984970e03d747405a9b11635ecdcf9 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 12 Jul 2024 11:33:07 +0200 Subject: [PATCH 009/143] fix(compiler-cli): avoid emitting references to typecheck files in TS 5.4 (#56961) In #56358 we removed most of the places that untag the references to typecheck files, because it was causing the compiler to throw error when it produces diagnostics. This appears to have caused a regression in TS 5.4 which now emits the synthetic references. These changes add tagging right before the program emits. Fixes #56945. PR Close #56961 --- packages/compiler-cli/src/ngtsc/program.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/compiler-cli/src/ngtsc/program.ts b/packages/compiler-cli/src/ngtsc/program.ts index 4cfdc694cd69..b497ebd58c57 100644 --- a/packages/compiler-cli/src/ngtsc/program.ts +++ b/packages/compiler-cli/src/ngtsc/program.ts @@ -293,6 +293,10 @@ export class NgtscProgram implements api.Program { } } + // Untag all the files, otherwise TS 5.4 may end up emitting + // references to typecheck files (see #56945). + untagAllTsFiles(this.tsProgram); + const forceEmit = opts?.forceEmit ?? false; this.compiler.perfRecorder.memory(PerfCheckpoint.PreEmit); From ea01ce440300c9764fff0082fa6d4abc37117d8d Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 12 Jul 2024 10:29:13 +0200 Subject: [PATCH 010/143] build: update material / cdk (#56960) Material 18.1 includes a fix we were waiting for adev. Fixes #56786 PR Close #56960 --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index fecfcecfa7bd..63bf944fc72c 100644 --- a/package.json +++ b/package.json @@ -52,9 +52,9 @@ "@angular-devkit/build-angular": "18.1.0-next.1", "@angular-devkit/core": "18.1.0-next.1", "@angular-devkit/schematics": "18.1.0-next.1", - "@angular/cdk": "18.1.0-next.1", + "@angular/cdk": "18.1.0", "@angular/cli": "18.1.0-next.1", - "@angular/material": "18.1.0-next.1", + "@angular/material": "18.1.0", "@babel/cli": "7.24.7", "@babel/core": "7.24.7", "@babel/generator": "7.24.7", diff --git a/yarn.lock b/yarn.lock index b67374db4268..29c54b3b174c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -453,10 +453,10 @@ vite "5.3.1" watchpack "2.4.1" -"@angular/cdk@18.1.0-next.1": - version "18.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-18.1.0-next.1.tgz#05bb2b1b9d99cdea775e5f15dbbd8cd5566cf501" - integrity sha512-fTE78Q/8pi7wpuOBhnwwGfr8X+GY2pAb5dcRkXAHJqigevkikpsXrWlb0JiWpl0CjwtfNLanWH51NZLx4I5d+A== +"@angular/cdk@18.1.0": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-18.1.0.tgz#31333e00094a040df78c680c1241a4d799a6fa97" + integrity sha512-GWUyJQ7KdOS0WwQPp7UKnRd7lUKvOrMvktqNWfSxBy/VEdyEeKlXfghk6GQ4u1RXFZ2RU0m1KhX8rY9srYJOwA== dependencies: tslib "^2.3.0" optionalDependencies: @@ -507,10 +507,10 @@ marked "~12.0.2" mermaid "^10.8.0" -"@angular/material@18.1.0-next.1": - version "18.1.0-next.1" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-18.1.0-next.1.tgz#b1ebd0a77b26f8699319d5f3a4c65a6bdc94ce87" - integrity sha512-TVMnpwzo4NStnuun4YhqclB6HIRUzjEn1DhoX/8ITJ8/vXIELF0Q8lNCyYBPy+Dhv1UulydPfwpN69CYEu6hBg== +"@angular/material@18.1.0": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-18.1.0.tgz#141e0873d8656ff7b9378d52beead88f161fb106" + integrity sha512-tL6Qx+E/Q/TaNXec9uuCRNoqK9yjABEraDSbd9WSh2/UYbGlEnE2MaXSha12GKa/l8RRrRYUR7y+v0fIGECBOg== dependencies: "@material/animation" "15.0.0-canary.7f224ddd4.0" "@material/auto-init" "15.0.0-canary.7f224ddd4.0" From 4448b85a2753c3eb9f0c6e56cf394087f244a9f6 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 11 Jul 2024 20:06:21 +0000 Subject: [PATCH 011/143] build: update io_bazel_rules_sass digest to 83022b9 (#56954) See associated pull request for more information. PR Close #56954 --- WORKSPACE | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 77bc236c54df..b0d5663dd28b 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -143,10 +143,10 @@ cldr_xml_data_repository( # sass rules http_archive( name = "io_bazel_rules_sass", - sha256 = "510ac1fd1242e979a3dcb3f5c67273a94684e6c2a147e13b67cf34c62edebf91", - strip_prefix = "rules_sass-ea6b195390649fc7df822d76327e34b9123b7790", + sha256 = "cd83736ea65d0df064283aea5922dbaf132dd2b3aa54e7151aae7edaa9572c3e", + strip_prefix = "rules_sass-83022b98114c07e9588089c7fe8f76bc0262c7e7", urls = [ - "https://github.com/bazelbuild/rules_sass/archive/ea6b195390649fc7df822d76327e34b9123b7790.zip", + "https://github.com/bazelbuild/rules_sass/archive/83022b98114c07e9588089c7fe8f76bc0262c7e7.zip", ], ) From 9173e9b0d674c0f0069d5324cebde7cc3fb8e480 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 9 Jul 2024 05:04:56 +0000 Subject: [PATCH 012/143] build: update actions/upload-artifact action to v4.3.4 (#56905) See associated pull request for more information. PR Close #56905 --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index c65b0a131bb8..d1534abe94ef 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -93,7 +93,7 @@ jobs: - name: Run CI tests for framework run: yarn tsx ./scripts/build/build-packages-dist.mts - name: Archive build artifacts - uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3 + uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4.3.4 with: name: pr-artifacts-${{ github.event.number }} path: dist/packages-dist/ From 4bb558ab0cbf2e5e34816377e977128a177a977a Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 8 Jul 2024 15:10:01 +0000 Subject: [PATCH 013/143] feat(language-service): support writing code refactorings (#56895) In addition to quick fixes, this commit adds the ability to write code refactoring actions that can be applied by users. For example, we may implement a migration as a code refactoring action. Notably the quick fix support, existing already, is insufficient as it only allows for edits to be applied based on diagnostics shwon in e.g. VSCode. PR Close #56895 --- .../compiler-cli/src/ngtsc/perf/src/api.ts | 10 ++++ packages/language-service/api.ts | 15 ++++++ packages/language-service/build.sh | 2 +- .../language-service/src/language_service.ts | 37 +++++++++++++++ .../src/refactorings/refactoring.ts | 46 +++++++++++++++++++ packages/language-service/src/ts_plugin.ts | 25 ++++++++++ 6 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 packages/language-service/src/refactorings/refactoring.ts diff --git a/packages/compiler-cli/src/ngtsc/perf/src/api.ts b/packages/compiler-cli/src/ngtsc/perf/src/api.ts index 9baa7dfa3071..a761026f8971 100644 --- a/packages/compiler-cli/src/ngtsc/perf/src/api.ts +++ b/packages/compiler-cli/src/ngtsc/perf/src/api.ts @@ -168,6 +168,16 @@ export enum PerfPhase { * Time spent by the Angular Language Service to fix all detected same type errors. */ LsCodeFixesAll, + + /** + * Time spent computing possible Angular refactorings. + */ + LSComputeApplicableRefactorings, + + /** + * Time spent computing changes for applying a given refactoring. + */ + LSApplyRefactoring, } /** diff --git a/packages/language-service/api.ts b/packages/language-service/api.ts index 72c2f1952adf..4871c3a7c3fd 100644 --- a/packages/language-service/api.ts +++ b/packages/language-service/api.ts @@ -65,6 +65,14 @@ export type GetTcbResponse = { export type GetComponentLocationsForTemplateResponse = ts.DocumentSpan[]; export type GetTemplateLocationForComponentResponse = ts.DocumentSpan | undefined; +/** + * Function that can be invoked to show progress when computing + * refactoring edits. + * + * Useful for refactorings which take a long time to compute edits for. + */ +export type ApplyRefactoringProgressFn = (percentage: number, updateMessage: string) => void; + /** * `NgLanguageService` describes an instance of an Angular language service, * whose API surface is a strict superset of TypeScript's language service. @@ -77,6 +85,13 @@ export interface NgLanguageService extends ts.LanguageService { position: number, ): GetTemplateLocationForComponentResponse; getTypescriptLanguageService(): ts.LanguageService; + + applyRefactoring( + fileName: string, + positionOrRange: number | ts.TextRange, + refactorName: string, + reportProgress: ApplyRefactoringProgressFn, + ): ts.RefactorEditInfo | undefined; } export function isNgLanguageService( diff --git a/packages/language-service/build.sh b/packages/language-service/build.sh index 50f51f47508a..a1f250d5712a 100755 --- a/packages/language-service/build.sh +++ b/packages/language-service/build.sh @@ -28,7 +28,7 @@ yarn bazel build --config=release //packages/language-service:npm_package pushd "${extension_repo}" rm -rf .angular_packages/language-service mkdir -p .angular_packages/language-service -cp -r "${bazel_bin}/packages/language-service/npm_package/" .angular_packages/language-service +cp -r ${bazel_bin}/packages/language-service/npm_package/* .angular_packages/language-service chmod -R +w .angular_packages/language-service cat <> .angular_packages/language-service/BUILD.bazel load("@aspect_rules_js//npm:defs.bzl", "npm_package") diff --git a/packages/language-service/src/language_service.ts b/packages/language-service/src/language_service.ts index 28b2fcb7abf3..48d3d9896ef0 100644 --- a/packages/language-service/src/language_service.ts +++ b/packages/language-service/src/language_service.ts @@ -18,6 +18,7 @@ import {OptimizeFor} from '@angular/compiler-cli/src/ngtsc/typecheck/api'; import ts from 'typescript'; import { + ApplyRefactoringProgressFn, GetComponentLocationsForTemplateResponse, GetTcbResponse, GetTemplateLocationForComponentResponse, @@ -46,6 +47,7 @@ import { getPropertyAssignmentFromValue, } from './ts_utils'; import {getTemplateInfoAtPosition, isTypeScriptFile} from './utils'; +import {allRefactorings} from './refactorings/refactoring'; type LanguageServiceConfig = Omit; @@ -517,6 +519,41 @@ export class LanguageService { ); } + getPossibleRefactorings( + fileName: string, + positionOrRange: number | ts.TextRange, + ): ts.ApplicableRefactorInfo[] { + return this.withCompilerAndPerfTracing( + PerfPhase.LSComputeApplicableRefactorings, + (compiler) => { + return allRefactorings + .filter((r) => r.isApplicable(compiler, fileName, positionOrRange)) + .map((r) => ({name: r.id, description: r.description, actions: []})); + }, + ); + } + + applyRefactoring( + fileName: string, + positionOrRange: number | ts.TextRange, + refactorName: string, + reportProgress: ApplyRefactoringProgressFn, + ): ts.RefactorEditInfo | undefined { + const matchingRefactoring = allRefactorings.find((r) => r.id === refactorName); + if (matchingRefactoring === undefined) { + return undefined; + } + + return this.withCompilerAndPerfTracing(PerfPhase.LSApplyRefactoring, (compiler) => { + return matchingRefactoring.computeEditsForFix( + compiler, + fileName, + positionOrRange, + reportProgress, + ); + }); + } + /** * Provides an instance of the `NgCompiler` and traces perf results. Perf results are logged only * if the log level is verbose or higher. This method is intended to be called once per public diff --git a/packages/language-service/src/refactorings/refactoring.ts b/packages/language-service/src/refactorings/refactoring.ts new file mode 100644 index 000000000000..1a29e5bbd816 --- /dev/null +++ b/packages/language-service/src/refactorings/refactoring.ts @@ -0,0 +1,46 @@ +/** + * @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 {NgCompiler} from '@angular/compiler-cli/src/ngtsc/core'; +import ts from 'typescript'; +import {ApplyRefactoringProgressFn} from '@angular/language-service/api'; + +/** + * Interface that describes a refactoring. + * + * A refactoring may be applicable at a given position inside + * a file. If it becomes applicable, the language service will suggest + * it as a code action. + * + * Later, the user can request edits for the refactoring lazily, upon + * e.g. click. + */ +export interface Refactoring { + /** Unique id of the refactoring. */ + id: string; + + /** Description of the refactoring. Shown in e.g. VSCode as the code action. */ + description: string; + + /** Whether the refactoring is applicable at the given location. */ + isApplicable( + compiler: NgCompiler, + fileName: string, + positionOrRange: number | ts.TextRange, + ): boolean; + + /** Computes the edits for the refactoring. */ + computeEditsForFix( + compiler: NgCompiler, + fileName: string, + positionOrRange: number | ts.TextRange, + reportProgress: ApplyRefactoringProgressFn, + ): ts.RefactorEditInfo; +} + +export const allRefactorings: Refactoring[] = []; diff --git a/packages/language-service/src/ts_plugin.ts b/packages/language-service/src/ts_plugin.ts index 3f2b0010eb5f..f9965d17c01f 100644 --- a/packages/language-service/src/ts_plugin.ts +++ b/packages/language-service/src/ts_plugin.ts @@ -9,6 +9,7 @@ import ts from 'typescript'; import { + ApplyRefactoringProgressFn, GetComponentLocationsForTemplateResponse, GetTcbResponse, GetTemplateLocationForComponentResponse, @@ -253,6 +254,28 @@ export function create(info: ts.server.PluginCreateInfo): NgLanguageService { return ngLS.getTemplateLocationForComponent(fileName, position); } + function getApplicableRefactors( + fileName: string, + positionOrRange: number | ts.TextRange, + ): ts.ApplicableRefactorInfo[] { + // We never forward to TS for refactors because those are not handled + // properly by the LSP server implementation of the extension. The extension + // will only take care of refactorings from Angular language service. + // Code actions are tied to their provider, so this is unproblematic and will + // not hide built-in TypeScript refactorings: + // https://github.com/microsoft/vscode/blob/ea4d99921cc790d49194e897021faee02a1847f7/src/vs/editor/contrib/codeAction/codeAction.ts#L30-L31 + return ngLS.getPossibleRefactorings(fileName, positionOrRange); + } + + function applyRefactoring( + fileName: string, + positionOrRange: number | ts.TextRange, + refactorName: string, + reportProgress: ApplyRefactoringProgressFn, + ): ts.RefactorEditInfo | undefined { + return ngLS.applyRefactoring(fileName, positionOrRange, refactorName, reportProgress); + } + function getCodeFixesAtPosition( fileName: string, start: number, @@ -330,6 +353,8 @@ export function create(info: ts.server.PluginCreateInfo): NgLanguageService { getCodeFixesAtPosition, getCombinedCodeFix, getTypescriptLanguageService, + getApplicableRefactors, + applyRefactoring, }; } From 7a5384cab8931437aea423c86214ee31f52cfb26 Mon Sep 17 00:00:00 2001 From: Ben Hong Date: Fri, 12 Jul 2024 10:22:42 -0400 Subject: [PATCH 014/143] docs: add quick installation page (#56816) PR Close #56816 --- adev/src/app/sub-navigation-data.ts | 5 + adev/src/content/introduction/installation.md | 96 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 adev/src/content/introduction/installation.md diff --git a/adev/src/app/sub-navigation-data.ts b/adev/src/app/sub-navigation-data.ts index 1cdb16046500..727118021dc4 100644 --- a/adev/src/app/sub-navigation-data.ts +++ b/adev/src/app/sub-navigation-data.ts @@ -31,6 +31,11 @@ const DOCS_SUB_NAVIGATION_DATA: NavigationItem[] = [ path: 'overview', contentPath: 'introduction/what-is-angular', }, + { + label: 'Installation', + path: 'installation', + contentPath: 'introduction/installation', + }, { label: 'Essentials', children: [ diff --git a/adev/src/content/introduction/installation.md b/adev/src/content/introduction/installation.md new file mode 100644 index 000000000000..bd1afd267f37 --- /dev/null +++ b/adev/src/content/introduction/installation.md @@ -0,0 +1,96 @@ + + + +Get started with Angular quickly with online starters or locally with your terminal. + +## Play Online + +If you just want to play around with Angular in your browser without setting up a project, you can use our online sandbox: + + + + The fastest way to play with an Angular app. No setup required. + + + +## Setup a new project locally + +If you're starting a new project, you'll most likely want to create a local project so that you can use tooling such as Git. + +### Prerequisites + +- **Node.js** - v[^18.9.1 or newer](/reference/versions) +- **Text editor** - We recommend [Visual Studio Code](https://code.visualstudio.com/) +- **Terminal** - Required for running Angular CLI commands + +### Instructions + +The following guide will walk you through setting up a local Angular project. + +#### Install Angular CLI + +Open a terminal (if you're using [Visual Studio Code](https://code.visualstudio.com/), you can open an [integrated terminal](https://code.visualstudio.com/docs/editor/integrated-terminal)) and run the following command: + + + +npm install -g @angular/cli + + + +If you are having issues running this command in Windows or Unix, check out the [CLI docs](/tools/cli/setup-local#install-the-angular-cli) for more info. + +#### Create a new project + +In your terminal, run the CLI command `ng new` with the desired project name. In the following examples, we'll be using the example project name of `my-first-angular-app`. + + + +ng new + + + +You will be presented with some configuration options for your project. Use the arrow and enter keys to navigate and select which options you desire. + +If you don't have any preferences, just hit the enter key to take the default options and continue with the setup. + +After you select the configuration options and the CLI runs through the setup, you should see the following message: + +```shell +✔ Packages installed successfully. + Successfully initialized git. +``` + +At this point, you're now ready to run your project locally! + +#### Running your new project locally + +In your terminal, switch to your new Angular project. + + + +cd my-first-angular-app + + + +All of your dependencies should be installed at this point (which you can verify by checking for the existent for a `node_modules` folder in your project), so you can start your project by running the command: + + + +npm start + + + +If everything is successful, you should see a similar confirmation message in your terminal: + +```shell +Watch mode enabled. Watching for file changes... +NOTE: Raw file sizes do not reflect development server per-request transformations. + ➜ Local: http://localhost:4200/ + ➜ press h + enter to show help +``` + +And now you can visit the path in `Local` (e.g., `http://localhost:4200`) to see your application. Happy coding! 🎉 + +## Next steps + +Now that you've created your Angular project, you can learn more about Angular in our [Essentials guide](/essentials) or choose a topic in our in-depth guides! From e958fa8a3c854f2fbcf11e88372a4a21b64d03c7 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 7 Jun 2024 00:33:35 +0200 Subject: [PATCH 015/143] refactor(compiler): include public constructor paramters to class properties. (#56315) Public properties declared in the constructor are part of the public API and we should extract them. Fixes #56310 PR Close #56315 --- .../src/ngtsc/docs/src/class_extractor.ts | 14 +++++++++- .../class_doc_extraction_spec.ts | 28 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts index a8917f7a5510..f386f22b9976 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts @@ -293,10 +293,22 @@ class ClassExtractor { ); } + /** Check if the parameter is a constructor parameter with a public modifier */ + private isPublicConstructorParameterProperty(node: ts.Node): boolean { + if (ts.isParameterPropertyDeclaration(node, node.parent) && node.modifiers) { + return node.modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.PublicKeyword); + } + return false; + } + /** Gets whether a member is a property. */ private isProperty(member: ts.Node): member is PropertyLike { // Classes have declarations, interface have signatures - return ts.isPropertyDeclaration(member) || ts.isPropertySignature(member); + return ( + ts.isPropertyDeclaration(member) || + ts.isPropertySignature(member) || + this.isPublicConstructorParameterProperty(member) + ); } /** Gets whether a member is a method. */ diff --git a/packages/compiler-cli/test/ngtsc/doc_extraction/class_doc_extraction_spec.ts b/packages/compiler-cli/test/ngtsc/doc_extraction/class_doc_extraction_spec.ts index 65dff55ef288..5f436a179054 100644 --- a/packages/compiler-cli/test/ngtsc/doc_extraction/class_doc_extraction_spec.ts +++ b/packages/compiler-cli/test/ngtsc/doc_extraction/class_doc_extraction_spec.ts @@ -573,5 +573,33 @@ runInEachFileSystem(() => { expect(ageSetterEntry.type).toBe('number'); expect(ageSetterEntry.memberTags).toContain(MemberTags.Inherited); }); + + it('should extract public constructor parameters', () => { + env.write( + 'index.ts', + ` + export class MyClass { + myProp: string; + + constructor(public foo: string, private: bar: string, protected: baz: string) {} + }`, + ); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + expect(docs.length).toBe(1); + + const classEntry = docs[0] as ClassEntry; + expect(classEntry.members.length).toBe(2); + + const [myPropEntry, fooEntry] = classEntry.members as PropertyEntry[]; + + expect(myPropEntry.name).toBe('myProp'); + expect(myPropEntry.memberType).toBe(MemberType.Property); + expect((myPropEntry as PropertyEntry).type).toBe('string'); + + expect(fooEntry.name).toBe('foo'); + expect(fooEntry.memberType).toBe(MemberType.Property); + expect((fooEntry as PropertyEntry).type).toBe('string'); + }); }); }); From ac9d9db4e6fce0a06e7643369dff7e7161141843 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 11 Jul 2024 16:05:52 +0000 Subject: [PATCH 016/143] build: update dependency inquirer to v10 (#56883) See associated pull request for more information. PR Close #56883 --- package.json | 2 +- yarn.lock | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 137 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 63bf944fc72c..3c5c4ce029f9 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,7 @@ "gulp": "^5.0.0", "gulp-conventional-changelog": "^5.0.0", "husky": "9.0.11", - "inquirer": "^9.2.7", + "inquirer": "^10.0.0", "jsdom": "^24.0.0", "karma-coverage": "^2.2.1", "karma-jasmine-html-reporter": "^2.1.0", diff --git a/yarn.lock b/yarn.lock index 29c54b3b174c..549a81bd5f7e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2348,6 +2348,17 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz#bf344cc75136039bc41bcf5d1ddbcb40405fca3b" integrity sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg== +"@inquirer/checkbox@^2.3.10": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-2.3.10.tgz#b5165bfa744924cf8e9bb7b9138f23835c9028d8" + integrity sha512-CTc864M2/523rKc9AglIzAcUCuPXDZENgc5S2KZFVRbnMzpXcYTsUWmbqSeL0XLvtlvEtNevkkVbfVhJpruOyQ== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/figures" "^1.0.3" + "@inquirer/type" "^1.4.0" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + "@inquirer/confirm@3.1.10": version "3.1.10" resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.10.tgz#8e8b36b1e41d6736d6ac90d1221c9e1ec948eb7a" @@ -2356,6 +2367,14 @@ "@inquirer/core" "^8.2.3" "@inquirer/type" "^1.3.3" +"@inquirer/confirm@^3.1.14": + version "3.1.14" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.14.tgz#b50a156f2cc0a6f874f2d2ab1739e988fbf950f4" + integrity sha512-nbLSX37b2dGPtKWL3rPuR/5hOuD30S+pqJ/MuFiUEgN6GiMs8UMxiurKAMDzKt6C95ltjupa8zH6+3csXNHWpA== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + "@inquirer/core@^8.2.3": version "8.2.4" resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-8.2.4.tgz#300de755849d3166d15127e2341cef6aa4bd031d" @@ -2375,12 +2394,109 @@ strip-ansi "^6.0.1" wrap-ansi "^6.2.0" +"@inquirer/core@^9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.0.2.tgz#8be8782266f00129acb5c804537d1231b2fe3ac6" + integrity sha512-nguvH3TZar3ACwbytZrraRTzGqyxJfYJwv+ZwqZNatAosdWQMP1GV8zvmkNlBe2JeZSaw0WYBHZk52pDpWC9qA== + dependencies: + "@inquirer/figures" "^1.0.3" + "@inquirer/type" "^1.4.0" + "@types/mute-stream" "^0.0.4" + "@types/node" "^20.14.9" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/editor@^2.1.14": + version "2.1.14" + resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-2.1.14.tgz#f353a053a41c8c5564de3eef621dd3f38addab9c" + integrity sha512-6nWpoJyVAKwAcv67bkbBmmi3f32xua79fP7TRmNUoR4K+B1GiOBsHO1YdvET/jvC+nTlBZL7puKAKyM7G+Lkzw== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + external-editor "^3.1.0" + +"@inquirer/expand@^2.1.14": + version "2.1.14" + resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-2.1.14.tgz#370ad3bbb21df3f957f45b356bd76ac2eeff5592" + integrity sha512-JcxsLajwPykF2kq6biIUdoOzTQ3LXqb8XMVrWkCprG/pFeU1SsxcSSFbF1T5jJGvvlTVcsE+JdGjbQ8ZRZ82RA== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + yoctocolors-cjs "^2.1.2" + "@inquirer/figures@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.3.tgz#1227cc980f88e6d6ab85abadbf164f5038041edd" integrity sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw== -"@inquirer/type@^1.3.3": +"@inquirer/input@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-2.2.1.tgz#cb795ab12f25cc8c6eeb6f51f04c71a70e4067c8" + integrity sha512-Yl1G6h7qWydzrJwqN777geeJVaAFL5Ly83aZlw4xHf8Z/BoTMfKRheyuMaQwOG7LQ4e5nQP7PxXdEg4SzQ+OKw== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + +"@inquirer/number@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-1.0.2.tgz#a1e8cff02dba0e0a449df17d843ea73fa29017ae" + integrity sha512-GcoK+Phxcln0Qw9e73S5a8B2Ejg3HgSTvNfDegIcS5/BKwUm8t5rejja1l09WXjZM9vrVbRDf9RzWtSUiWVYRQ== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + +"@inquirer/password@^2.1.14": + version "2.1.14" + resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-2.1.14.tgz#06621f547b0b05ad4303700f13892cabd3a366ee" + integrity sha512-sPzOkXLhWJQ96K6nPZFnF8XB8tsDrcCRobd1d3EDz81F+4hp8BbdmsnsQcqZ7oYDIOVM/mWJyIUtJ35TrssJxQ== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + ansi-escapes "^4.3.2" + +"@inquirer/prompts@^5.1.2": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-5.1.2.tgz#e40929281b5e398f78a1ebe291ce2e9bbb2c7852" + integrity sha512-E+ndnfwtVQtcmPt888Hc/HAxJUHSaA6OIvyvLAQ5BLQv+t20GbYdFSjXeLgb47OpMU+aRsKA/ys+Zoylw3kTVg== + dependencies: + "@inquirer/checkbox" "^2.3.10" + "@inquirer/confirm" "^3.1.14" + "@inquirer/editor" "^2.1.14" + "@inquirer/expand" "^2.1.14" + "@inquirer/input" "^2.2.1" + "@inquirer/number" "^1.0.2" + "@inquirer/password" "^2.1.14" + "@inquirer/rawlist" "^2.1.14" + "@inquirer/select" "^2.3.10" + +"@inquirer/rawlist@^2.1.14": + version "2.1.14" + resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-2.1.14.tgz#b69f953c3ab07fe6716a39004be4e772fc7a4662" + integrity sha512-pLpEzhKNQ/ugFAFfgCNaXljB+dcCwmXwR1jOxAbVeFIdB3l02E5gjI+h1rb136tq0T8JO6P5KFR1oTeld/wdrA== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/type" "^1.4.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/select@^2.3.10": + version "2.3.10" + resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-2.3.10.tgz#4491805435984726c75f89e8f810ddb1fe503123" + integrity sha512-rr7iR0Zj1YFfgM8IUGimPD9Yukd+n/U63CnYT9kdum6DbRXtMxR45rrreP+EA9ixCnShr+W4xj7suRxC1+8t9g== + dependencies: + "@inquirer/core" "^9.0.2" + "@inquirer/figures" "^1.0.3" + "@inquirer/type" "^1.4.0" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/type@^1.3.3", "@inquirer/type@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.4.0.tgz#3dd0c8f78c0548bbc18b9c07af16a86c4007e1f0" integrity sha512-AjOqykVyjdJQvtfkNDGUyMYGF8xN50VUxftCQWsOyIo4DFRLr6VQhW0VItGI1JIyQGCGgIpKa7hMMwNhZb4OIw== @@ -10040,7 +10156,7 @@ inquirer-autocomplete-prompt@^2.0.1: run-async "^2.4.1" rxjs "^7.5.4" -inquirer@9.2.23, inquirer@^9.2.7: +inquirer@9.2.23: version "9.2.23" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.23.tgz#cd2fe34edca12315b624fbc3c8cb99b1c4f61f90" integrity sha512-kod5s+FBPIDM2xiy9fu+6wdU/SkK5le5GS9lh4FEBjBHqiMgD9lLFbCbuqFNAjNL2ZOy9Wd9F694IOzN9pZHBA== @@ -10061,6 +10177,19 @@ inquirer@9.2.23, inquirer@^9.2.7: strip-ansi "^6.0.1" wrap-ansi "^6.2.0" +inquirer@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-10.0.1.tgz#d05d9b8e1397b3cb136bf00d6ffea6a2d4f75fd3" + integrity sha512-XgthhRIn0Ci9JdGJpUo2EtpPfaczbooZbGTN+FTzSCyUb7YHJcPPnuSXfeG5903bJMy3OyEoVTQMnvO4Ly5tFg== + dependencies: + "@inquirer/prompts" "^5.1.2" + "@inquirer/type" "^1.3.3" + "@types/mute-stream" "^0.0.4" + ansi-escapes "^4.3.2" + mute-stream "^1.0.0" + run-async "^3.0.0" + rxjs "^7.8.1" + inquirer@^8.2.6: version "8.2.6" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" @@ -16990,6 +17119,11 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + zip-stream@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135" From 2a71f056b82d4624c2858629ddaf35ae86e20ad2 Mon Sep 17 00:00:00 2001 From: sihyunjojo Date: Sat, 13 Jul 2024 10:44:31 +0900 Subject: [PATCH 017/143] docs: change code formatting for better readability (#56974) This change improves the consistency and visibility of the documentation by using backticks for code formatting in the instructions. PR Close #56974 --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index abf6b14449ec..e6ae080d3ff5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -353,9 +353,9 @@ DEPRECATED: Closes # ``` -Breaking Change section should start with the phrase "BREAKING CHANGE: " followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions. +Breaking Change section should start with the phrase `BREAKING CHANGE: ` followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions. -Similarly, a Deprecation section should start with "DEPRECATED: " followed by a short description of what is deprecated, a blank line, and a detailed description of the deprecation that also mentions the recommended update path. +Similarly, a Deprecation section should start with `DEPRECATED: ` followed by a short description of what is deprecated, a blank line, and a detailed description of the deprecation that also mentions the recommended update path. ### Revert commits From 9167fc815c5bac5f39352dd13e381c5be84282c5 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 16 Jul 2024 16:56:56 +0200 Subject: [PATCH 018/143] fix(compiler): JIT mode incorrectly interpreting host directive configuration in partial compilation (#57002) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes that the runtime implementation of `ɵɵngDeclareDirective` was interpreting the `hostDirectives` mapping incorrectly. Instead of treating the inputs/outputs as `['binding', 'alias']` arrays, it was parsing them as `['binding: alias']`. This was leading to runtime errors if a user is consuming a partially-compiled library in JIT mode. Fixes #54096. PR Close #57002 --- packages/compiler/src/jit_compiler_facade.ts | 64 ++++++++++++------- .../render3/jit/declare_directive_spec.ts | 44 +++++++++++++ 2 files changed, 86 insertions(+), 22 deletions(-) diff --git a/packages/compiler/src/jit_compiler_facade.ts b/packages/compiler/src/jit_compiler_facade.ts index 4c8c010d3495..18cbe10aa068 100644 --- a/packages/compiler/src/jit_compiler_facade.ts +++ b/packages/compiler/src/jit_compiler_facade.ts @@ -497,6 +497,26 @@ function convertDirectiveFacadeToMetadata(facade: R3DirectiveMetadataFacade): R3 } } + const hostDirectives = facade.hostDirectives?.length + ? facade.hostDirectives.map((hostDirective) => { + return typeof hostDirective === 'function' + ? { + directive: wrapReference(hostDirective), + inputs: null, + outputs: null, + isForwardReference: false, + } + : { + directive: wrapReference(hostDirective.directive), + isForwardReference: false, + inputs: hostDirective.inputs ? parseMappingStringArray(hostDirective.inputs) : null, + outputs: hostDirective.outputs + ? parseMappingStringArray(hostDirective.outputs) + : null, + }; + }) + : null; + return { ...facade, typeArgumentCount: 0, @@ -512,7 +532,7 @@ function convertDirectiveFacadeToMetadata(facade: R3DirectiveMetadataFacade): R3 providers: facade.providers != null ? new WrappedNodeExpr(facade.providers) : null, viewQueries: facade.viewQueries.map(convertToR3QueryMetadata), fullInheritance: false, - hostDirectives: convertHostDirectivesToMetadata(facade), + hostDirectives, }; } @@ -520,6 +540,15 @@ function convertDeclareDirectiveFacadeToMetadata( declaration: R3DeclareDirectiveFacade, typeSourceSpan: ParseSourceSpan, ): R3DirectiveMetadata { + const hostDirectives = declaration.hostDirectives?.length + ? declaration.hostDirectives.map((dir) => ({ + directive: wrapReference(dir.directive), + isForwardReference: false, + inputs: dir.inputs ? getHostDirectiveBindingMapping(dir.inputs) : null, + outputs: dir.outputs ? getHostDirectiveBindingMapping(dir.outputs) : null, + })) + : null; + return { name: declaration.type.name, type: wrapReference(declaration.type), @@ -540,7 +569,7 @@ function convertDeclareDirectiveFacadeToMetadata( fullInheritance: false, isStandalone: declaration.isStandalone ?? false, isSignal: declaration.isSignal ?? false, - hostDirectives: convertHostDirectivesToMetadata(declaration), + hostDirectives, }; } @@ -558,28 +587,19 @@ function convertHostDeclarationToMetadata( }; } -function convertHostDirectivesToMetadata( - metadata: R3DeclareDirectiveFacade | R3DirectiveMetadataFacade, -): R3HostDirectiveMetadata[] | null { - if (metadata.hostDirectives?.length) { - return metadata.hostDirectives.map((hostDirective) => { - return typeof hostDirective === 'function' - ? { - directive: wrapReference(hostDirective), - inputs: null, - outputs: null, - isForwardReference: false, - } - : { - directive: wrapReference(hostDirective.directive), - isForwardReference: false, - inputs: hostDirective.inputs ? parseMappingStringArray(hostDirective.inputs) : null, - outputs: hostDirective.outputs ? parseMappingStringArray(hostDirective.outputs) : null, - }; - }); +/** + * Parses a host directive mapping where each odd array key is the name of an input/output + * and each even key is its public name, e.g. `['one', 'oneAlias', 'two', 'two']`. + */ +function getHostDirectiveBindingMapping(array: string[]) { + let result: {[publicName: string]: string} | null = null; + + for (let i = 1; i < array.length; i += 2) { + result = result || {}; + result[array[i - 1]] = array[i]; } - return null; + return result; } function convertOpaqueValuesToExpressions(obj: {[key: string]: OpaqueValue}): { diff --git a/packages/core/test/render3/jit/declare_directive_spec.ts b/packages/core/test/render3/jit/declare_directive_spec.ts index efed18ae0370..6166bb11aa9d 100644 --- a/packages/core/test/render3/jit/declare_directive_spec.ts +++ b/packages/core/test/render3/jit/declare_directive_spec.ts @@ -261,6 +261,47 @@ describe('directive declaration jit compilation', () => { features: [ɵɵNgOnChangesFeature], }); }); + + it('should compile host directives', () => { + class One {} + class Two {} + + const def = ɵɵngDeclareDirective({ + type: TestClass, + hostDirectives: [ + { + directive: One, + inputs: ['firstInput', 'firstInput', 'secondInput', 'secondInputAlias'], + outputs: ['firstOutput', 'firstOutput', 'secondOutput', 'secondOutputAlias'], + }, + { + directive: Two, + }, + ], + }) as DirectiveDef; + + expectDirectiveDef(def, { + features: [jasmine.any(Function)], + hostDirectives: [ + { + directive: One, + inputs: { + 'firstInput': 'firstInput', + 'secondInput': 'secondInputAlias', + }, + outputs: { + 'firstOutput': 'firstOutput', + 'secondOutput': 'secondOutputAlias', + }, + }, + { + directive: Two, + inputs: {}, + outputs: {}, + }, + ], + }); + }); }); type DirectiveDefExpectations = jasmine.Expected< @@ -278,6 +319,7 @@ type DirectiveDefExpectations = jasmine.Expected< | 'viewQuery' | 'exportAs' | 'providersResolver' + | 'hostDirectives' > >; @@ -303,6 +345,7 @@ function expectDirectiveDef( viewQuery: null, exportAs: null, providersResolver: null, + hostDirectives: null, ...expected, }; @@ -321,6 +364,7 @@ function expectDirectiveDef( expect(actual.providersResolver) .withContext('providersResolver') .toEqual(expectation.providersResolver); + expect(actual.hostDirectives).withContext('hostDirectives').toEqual(expectation.hostDirectives); } class TestClass {} From 7663debce1a8411a763a27b7cf8bc5955f8ea2ed Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 16 Jul 2024 12:17:57 +0000 Subject: [PATCH 019/143] perf(language-service): quick exit if no code fixes can exist (#57000) This is a performance optimization that would exit early when code actions are requested, but we know Angular cannot provide fixes based on the error codes. Previously, we would unnecessarily compute and analyze the application for semantic diagnostics. This will be helpful for: https://github.com/angular/vscode-ng-language-service/pull/2050 PR Close #57000 --- packages/language-service/api.ts | 2 ++ .../language-service/src/language_service.ts | 16 ++++++++++++++++ packages/language-service/src/ts_plugin.ts | 1 + 3 files changed, 19 insertions(+) diff --git a/packages/language-service/api.ts b/packages/language-service/api.ts index 4871c3a7c3fd..2ccfb13da49f 100644 --- a/packages/language-service/api.ts +++ b/packages/language-service/api.ts @@ -92,6 +92,8 @@ export interface NgLanguageService extends ts.LanguageService { refactorName: string, reportProgress: ApplyRefactoringProgressFn, ): ts.RefactorEditInfo | undefined; + + hasCodeFixesForErrorCode(errorCode: number): boolean; } export function isNgLanguageService( diff --git a/packages/language-service/src/language_service.ts b/packages/language-service/src/language_service.ts index 48d3d9896ef0..505eabfaa709 100644 --- a/packages/language-service/src/language_service.ts +++ b/packages/language-service/src/language_service.ts @@ -356,6 +356,17 @@ export class LanguageService { }); } + /** + * Performance helper that can help make quick decisions for + * the VSCode language server to decide whether a code fix exists + * for the given error code. + * + * Related context: https://github.com/angular/vscode-ng-language-service/pull/2050#discussion_r1673079263 + */ + hasCodeFixesForErrorCode(errorCode: number): boolean { + return this.codeFixes.codeActionMetas.some((m) => m.errorCodes.includes(errorCode)); + } + getCodeFixesAtPosition( fileName: string, start: number, @@ -367,6 +378,11 @@ export class LanguageService { return this.withCompilerAndPerfTracing( PerfPhase.LsCodeFixes, (compiler) => { + // Fast exit if we know no code fix can exist for the given range/and error codes. + if (errorCodes.every((code) => !this.hasCodeFixesForErrorCode(code))) { + return []; + } + const templateInfo = getTemplateInfoAtPosition(fileName, start, compiler); if (templateInfo === undefined) { return []; diff --git a/packages/language-service/src/ts_plugin.ts b/packages/language-service/src/ts_plugin.ts index f9965d17c01f..c8b06555c557 100644 --- a/packages/language-service/src/ts_plugin.ts +++ b/packages/language-service/src/ts_plugin.ts @@ -350,6 +350,7 @@ export function create(info: ts.server.PluginCreateInfo): NgLanguageService { getSignatureHelpItems, getOutliningSpans, getTemplateLocationForComponent, + hasCodeFixesForErrorCode: ngLS.hasCodeFixesForErrorCode.bind(ngLS), getCodeFixesAtPosition, getCombinedCodeFix, getTypescriptLanguageService, From f8f3baa7a1da047da78a9ecec85866803ed20a79 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 16 Jul 2024 05:04:52 +0000 Subject: [PATCH 020/143] build: update github/codeql-action action to v3.25.12 (#56997) See associated pull request for more information. PR Close #56997 --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 53ba48032426..0e10728f05ec 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@b611370bb5703a7efb587f9d136a52ea24c5c38c # v3.25.11 + uses: github/codeql-action/upload-sarif@4fa2a7953630fd2f3fb380f21be14ede0169dd4f # v3.25.12 with: sarif_file: results.sarif From e504ad97d44159cf632ec987fce94f66bfddef37 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 15 Jul 2024 08:44:22 +0200 Subject: [PATCH 021/143] fix(core): not all callbacks running when registered at the same time (#56981) Fixes that only the first callback was firing when multiple are registered in the same call to `afterNextRender`, e.g. `afterNextRender({earlyRead: fn, read: fn});` Fixes #56979. PR Close #56981 --- .../core/src/render3/after_render_hooks.ts | 7 +- .../test/acceptance/after_render_hook_spec.ts | 81 +++++++++++++++++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/packages/core/src/render3/after_render_hooks.ts b/packages/core/src/render3/after_render_hooks.ts index d2bd8ea27bae..98641de90fc9 100644 --- a/packages/core/src/render3/after_render_hooks.ts +++ b/packages/core/src/render3/after_render_hooks.ts @@ -598,6 +598,7 @@ function afterRenderImpl( unregisterFn(); }; const unregisterFn = injector.get(DestroyRef).onDestroy(destroy); + let callbacksLeftToRun = 0; const registerCallback = ( phase: AfterRenderPhase, @@ -608,7 +609,10 @@ function afterRenderImpl( } const callback = once ? (...args: [unknown]) => { - destroy(); + callbacksLeftToRun--; + if (callbacksLeftToRun < 1) { + destroy(); + } phaseCallback(...args); } : phaseCallback; @@ -619,6 +623,7 @@ function afterRenderImpl( ); callbackHandler.register(instance); instances.push(instance); + callbacksLeftToRun++; }; registerCallback(AfterRenderPhase.EarlyRead, spec.earlyRead); diff --git a/packages/core/test/acceptance/after_render_hook_spec.ts b/packages/core/test/acceptance/after_render_hook_spec.ts index 706e126b1595..00302b8c120d 100644 --- a/packages/core/test/acceptance/after_render_hook_spec.ts +++ b/packages/core/test/acceptance/after_render_hook_spec.ts @@ -1233,6 +1233,87 @@ describe('after render hooks', () => { 'read-2', ]); }); + + it('should invoke all the callbacks once when they are registered at the same time', () => { + const log: string[] = []; + + @Component({template: ''}) + class Comp { + constructor() { + afterNextRender({ + earlyRead: () => { + log.push('early-read'); + }, + write: () => { + log.push('write'); + }, + mixedReadWrite: () => { + log.push('mixed-read-write'); + }, + read: () => { + log.push('read'); + }, + }); + } + } + + TestBed.configureTestingModule({ + declarations: [Comp], + ...COMMON_CONFIGURATION, + }); + createAndAttachComponent(Comp); + + expect(log).toEqual([]); + TestBed.inject(ApplicationRef).tick(); + expect(log).toEqual(['early-read', 'write', 'mixed-read-write', 'read']); + TestBed.inject(ApplicationRef).tick(); + expect(log).toEqual(['early-read', 'write', 'mixed-read-write', 'read']); + }); + + it('should invoke all the callbacks each time when they are registered at the same time', () => { + const log: string[] = []; + + @Component({template: ''}) + class Comp { + constructor() { + afterRender({ + earlyRead: () => { + log.push('early-read'); + }, + write: () => { + log.push('write'); + }, + mixedReadWrite: () => { + log.push('mixed-read-write'); + }, + read: () => { + log.push('read'); + }, + }); + } + } + + TestBed.configureTestingModule({ + declarations: [Comp], + ...COMMON_CONFIGURATION, + }); + createAndAttachComponent(Comp); + + expect(log).toEqual([]); + TestBed.inject(ApplicationRef).tick(); + expect(log).toEqual(['early-read', 'write', 'mixed-read-write', 'read']); + TestBed.inject(ApplicationRef).tick(); + expect(log).toEqual([ + 'early-read', + 'write', + 'mixed-read-write', + 'read', + 'early-read', + 'write', + 'mixed-read-write', + 'read', + ]); + }); }); it('allows writing to a signal in afterRender', () => { From 80b52021a4e6792384654bc677f9db26a21f2ab4 Mon Sep 17 00:00:00 2001 From: homerlsy Date: Fri, 12 Jul 2024 09:09:25 +0800 Subject: [PATCH 022/143] docs: update structural-directives.md select to [select] (#56955) this custom directive's selector should be [select] PR Close #56955 --- adev/src/content/guide/directives/structural-directives.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/directives/structural-directives.md b/adev/src/content/guide/directives/structural-directives.md index f0e7bea62ebf..4159f3599a8e 100644 --- a/adev/src/content/guide/directives/structural-directives.md +++ b/adev/src/content/guide/directives/structural-directives.md @@ -80,7 +80,7 @@ import {Directive, TemplateRef, ViewContainerRef} from '@angular/core'; @Directive({ standalone: true, - selector: 'select', + selector: '[select]', }) export class SelectDirective { constructor(private templateRef: TemplateRef, private ViewContainerRef: ViewContainerRef) {} From e5e1f49a22ceccaf9694f0fe1a23463cabbafa0e Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 15 Apr 2024 12:18:40 +0200 Subject: [PATCH 023/143] docs: Expose `$localize` in the `@angular/localize/init` entry. (#55345) fixes #54388 PR Close #55345 --- adev/src/assets/BUILD.bazel | 2 +- packages/BUILD.bazel | 1 + packages/localize/src/localize/BUILD.bazel | 11 ++++++++++- packages/localize/src/localize/doc_index.ts | 8 ++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 packages/localize/src/localize/doc_index.ts diff --git a/adev/src/assets/BUILD.bazel b/adev/src/assets/BUILD.bazel index 84f7c174e516..b0ad024697e4 100644 --- a/adev/src/assets/BUILD.bazel +++ b/adev/src/assets/BUILD.bazel @@ -55,7 +55,7 @@ copy_to_directory( "//packages/elements:elements_docs", "//packages/forms:forms_docs", "//packages/localize:localize_docs", - "//packages/localize/init:localize_docs", + "//packages/localize/src/localize:localize_init_docs", "//packages/platform-browser:platform-browser_docs", "//packages/platform-browser-dynamic:platform-browser_dynamic_docs", "//packages/platform-browser-dynamic/testing:platform-browser_dynamic_testing_docs", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 72d68609bc5a..0391e2e11c51 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -86,6 +86,7 @@ generate_api_manifest( "//packages/elements:elements_docs_extraction", "//packages/forms:forms_docs_extraction", "//packages/localize:localize_docs_extraction", + "//packages/localize/src/localize:localize_init_docs_extraction", "//packages/platform-browser:platform-browser_docs_extraction", "//packages/platform-browser-dynamic:platform-browser_dynamic_docs_extraction", "//packages/platform-browser-dynamic/testing:platform-browser_dynamic_testing_docs_extraction", diff --git a/packages/localize/src/localize/BUILD.bazel b/packages/localize/src/localize/BUILD.bazel index 3e7f71635fbc..8888f1897872 100644 --- a/packages/localize/src/localize/BUILD.bazel +++ b/packages/localize/src/localize/BUILD.bazel @@ -1,4 +1,4 @@ -load("//tools:defaults.bzl", "ts_library") +load("//tools:defaults.bzl", "generate_api_docs", "ts_library") package(default_visibility = ["//visibility:public"]) @@ -22,3 +22,12 @@ filegroup( "src/**/*.ts", ]), ) + +generate_api_docs( + name = "localize_init_docs", + srcs = [ + ":files_for_docgen", + ], + entry_point = ":doc_index.ts", + module_name = "@angular/localize/init", +) diff --git a/packages/localize/src/localize/doc_index.ts b/packages/localize/src/localize/doc_index.ts new file mode 100644 index 000000000000..d74be354d033 --- /dev/null +++ b/packages/localize/src/localize/doc_index.ts @@ -0,0 +1,8 @@ +/** + * @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 {$localize} from './src/localize'; From 2c4613a002d7670f8377cb53eaa9aca4bfc9521f Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 12 Jul 2024 16:09:44 +0200 Subject: [PATCH 024/143] fix(common): Don't run preconnect assertion on the server. (#56213) The `window` global is patched by domino on the server but the value of `window.location.href` isn't a valid base. Before this change `getUrl()` would throw when running in devmode on the server. Fixes #56207 PR Close #56213 --- .../directives/ng_optimized_image/lcp_image_observer.ts | 6 +++++- .../ng_optimized_image/preconnect_link_checker.ts | 8 +++++--- .../common/test/directives/ng_optimized_image_spec.ts | 9 +++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts b/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts index ca8e70b89d06..8c7868608c88 100644 --- a/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts +++ b/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts @@ -11,6 +11,7 @@ import { Injectable, OnDestroy, ɵformatRuntimeError as formatRuntimeError, + PLATFORM_ID, } from '@angular/core'; import {DOCUMENT} from '../../dom_tokens'; @@ -19,6 +20,7 @@ import {RuntimeErrorCode} from '../../errors'; import {assertDevMode} from './asserts'; import {imgDirectiveDetails} from './error_helper'; import {getUrl} from './url'; +import {isPlatformBrowser} from '../../platform_id'; interface ObservedImageState { priority: boolean; @@ -46,9 +48,10 @@ export class LCPImageObserver implements OnDestroy { private observer: PerformanceObserver | null = null; constructor() { + const isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); assertDevMode('LCP checker'); const win = inject(DOCUMENT).defaultView; - if (typeof win !== 'undefined' && typeof PerformanceObserver !== 'undefined') { + if (isBrowser && typeof PerformanceObserver !== 'undefined') { this.window = win; this.observer = this.initPerformanceObserver(); } @@ -107,6 +110,7 @@ export class LCPImageObserver implements OnDestroy { } updateImage(originalSrc: string, newSrc: string) { + if (!this.observer) return; const originalUrl = getUrl(originalSrc, this.window!).href; const img = this.images.get(originalUrl); if (img) { diff --git a/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts b/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts index 3f87fdabbafd..d88eb6b03c07 100644 --- a/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts +++ b/packages/common/src/directives/ng_optimized_image/preconnect_link_checker.ts @@ -11,7 +11,7 @@ import { Injectable, InjectionToken, ɵformatRuntimeError as formatRuntimeError, - ɵRuntimeError as RuntimeError, + PLATFORM_ID, } from '@angular/core'; import {DOCUMENT} from '../../dom_tokens'; @@ -20,6 +20,7 @@ import {RuntimeErrorCode} from '../../errors'; import {assertDevMode} from './asserts'; import {imgDirectiveDetails} from './error_helper'; import {extractHostname, getUrl} from './url'; +import {isPlatformServer} from '../../platform_id'; // Set of origins that are always excluded from the preconnect checks. const INTERNAL_PRECONNECT_CHECK_BLOCKLIST = new Set(['localhost', '127.0.0.1', '0.0.0.0']); @@ -56,6 +57,7 @@ export const PRECONNECT_CHECK_BLOCKLIST = new InjectionToken tags found on this page. @@ -102,9 +104,9 @@ export class PreconnectLinkChecker { * @param originalNgSrc ngSrc value */ assertPreconnect(rewrittenSrc: string, originalNgSrc: string): void { - if (!this.window) return; + if (this.isServer) return; - const imgUrl = getUrl(rewrittenSrc, this.window); + const imgUrl = getUrl(rewrittenSrc, this.window!); if (this.blocklist.has(imgUrl.hostname) || this.alreadySeen.has(imgUrl.origin)) return; // Register this origin as seen, so we don't check it again later. diff --git a/packages/common/test/directives/ng_optimized_image_spec.ts b/packages/common/test/directives/ng_optimized_image_spec.ts index cac8ddb31801..6eb03caacc6c 100644 --- a/packages/common/test/directives/ng_optimized_image_spec.ts +++ b/packages/common/test/directives/ng_optimized_image_spec.ts @@ -1360,6 +1360,9 @@ describe('Image directive', () => { it( 'should log a warning if there is no preconnect link for a priority image', withHead('', () => { + // The warning is only logged on the client + if (!isBrowser) return; + setupTestingModule({imageLoader}); const consoleWarnSpy = spyOn(console, 'warn'); @@ -1398,6 +1401,9 @@ describe('Image directive', () => { it( "should log a warning if there is a preconnect, but it doesn't match the priority image", withHead('', () => { + // The warning is only logged on the client + if (!isBrowser) return; + setupTestingModule({imageLoader}); const consoleWarnSpy = spyOn(console, 'warn'); @@ -1422,6 +1428,9 @@ describe('Image directive', () => { withHead( '', () => { + // The warning is only logged on the client + if (!isBrowser) return; + setupTestingModule({imageLoader}); const consoleWarnSpy = spyOn(console, 'warn'); From 982f1b125147e4292716f9524bef75423b70c71c Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 5 Jul 2024 08:53:18 +0000 Subject: [PATCH 025/143] fix(zone.js): support `Timeout.refresh` in Node.js (#56852) The `Timeout` object in Node.js has a `refresh` method, used to restart `setTimeout`/`setInterval` timers. Before this commit, `Timeout.refresh` was not handled, leading to memory leaks when using `fetch` in Node.js. This issue arose because `undici` (the Node.js fetch implementation) uses a refreshed `setTimeout` for cleanup operations. For reference, see: https://github.com/nodejs/undici/blob/1dff4fd9b1b2cee97c5f8cf44041521a62d3f133/lib/util/timers.js#L45 Fixes: #56586 PR Close #56852 --- packages/zone.js/lib/common/timers.ts | 111 +++++++++++------- packages/zone.js/lib/common/utils.ts | 8 ++ packages/zone.js/lib/zone-impl.ts | 43 ++++--- packages/zone.js/test/node/timer.spec.ts | 60 +++++++++- .../zone.js/test/zone-spec/async-test.spec.ts | 4 - .../test/zone-spec/fake-async-test.spec.ts | 2 +- 6 files changed, 164 insertions(+), 64 deletions(-) diff --git a/packages/zone.js/lib/common/timers.ts b/packages/zone.js/lib/common/timers.ts index de99f5024fc8..2af0e6d3d956 100644 --- a/packages/zone.js/lib/common/timers.ts +++ b/packages/zone.js/lib/common/timers.ts @@ -10,9 +10,15 @@ * @suppress {missingRequire} */ -import {patchMethod, scheduleMacroTaskWithCurrentZone, zoneSymbol} from './utils'; +import { + isFunction, + isNumber, + patchMethod, + scheduleMacroTaskWithCurrentZone, + zoneSymbol, +} from './utils'; -const taskSymbol = zoneSymbol('zoneTask'); +export const taskSymbol = zoneSymbol('zoneTask'); interface TimerOptions extends TaskData { handleId?: number; @@ -32,12 +38,27 @@ export function patchTimer(window: any, setName: string, cancelName: string, nam data.args[0] = function () { return task.invoke.apply(this, arguments); }; - data.handleId = setNative!.apply(window, data.args); + + const handleOrId = setNative!.apply(window, data.args); + + // Whlist on Node.js when get can the ID by using `[Symbol.toPrimitive]()` we do + // to this so that we do not cause potentally leaks when using `setTimeout` + // since this can be periodic when using `.refresh`. + if (isNumber(handleOrId)) { + data.handleId = handleOrId; + } else { + data.handle = handleOrId; + // On Node.js a timeout and interval can be restarted over and over again by using the `.refresh` method. + data.isRefreshable = isFunction(handleOrId.refresh); + } + return task; } function clearTask(task: Task) { - return clearNative!.call(window, (task.data).handleId); + const {handle, handleId} = task.data!; + + return clearNative!.call(window, handle ?? handleId); } setNative = patchMethod( @@ -45,12 +66,14 @@ export function patchTimer(window: any, setName: string, cancelName: string, nam setName, (delegate: Function) => function (self: any, args: any[]) { - if (typeof args[0] === 'function') { + if (isFunction(args[0])) { const options: TimerOptions = { + isRefreshable: false, isPeriodic: nameSuffix === 'Interval', delay: nameSuffix === 'Timeout' || nameSuffix === 'Interval' ? args[1] || 0 : undefined, args: args, }; + const callback = args[0]; args[0] = function timer(this: unknown) { try { @@ -64,15 +87,17 @@ export function patchTimer(window: any, setName: string, cancelName: string, nam // Cleanup tasksByHandleId should be handled before scheduleTask // Since some zoneSpec may intercept and doesn't trigger // scheduleFn(scheduleTask) provided here. - if (!options.isPeriodic) { - if (typeof options.handleId === 'number') { + const {handle, handleId, isPeriodic, isRefreshable} = options; + + if (!isPeriodic && !isRefreshable) { + if (handleId) { // in non-nodejs env, we remove timerId // from local cache - delete tasksByHandleId[options.handleId]; - } else if (options.handleId) { + delete tasksByHandleId[handleId]; + } else if (handle) { // Node returns complex objects as handleIds // we remove task reference from timer object - (options.handleId as any)[taskSymbol] = null; + handle[taskSymbol] = null; } } } @@ -84,37 +109,39 @@ export function patchTimer(window: any, setName: string, cancelName: string, nam scheduleTask, clearTask, ); + if (!task) { return task; } + // Node.js must additionally support the ref and unref functions. - const handle: any = (task.data).handleId; - if (typeof handle === 'number') { + const {handleId, handle, isRefreshable, isPeriodic} = task.data; + if (handleId) { // for non nodejs env, we save handleId: task // mapping in local cache for clearTimeout - tasksByHandleId[handle] = task; + tasksByHandleId[handleId] = task; } else if (handle) { // for nodejs env, we save task // reference in timerId Object for clearTimeout handle[taskSymbol] = task; - } - // check whether handle is null, because some polyfill or browser - // may return undefined from setTimeout/setInterval/setImmediate/requestAnimationFrame - if ( - handle && - handle.ref && - handle.unref && - typeof handle.ref === 'function' && - typeof handle.unref === 'function' - ) { - (task).ref = (handle).ref.bind(handle); - (task).unref = (handle).unref.bind(handle); - } - if (typeof handle === 'number' || handle) { - return handle; + if (isRefreshable && !isPeriodic) { + const originalRefresh = handle.refresh; + handle.refresh = function () { + const {zone, state} = task as any; + if (state === 'notScheduled') { + (task as any)._state = 'scheduled'; + zone._updateTaskCount(task, 1); + } else if (state === 'running') { + (task as any)._state = 'scheduling'; + } + + return originalRefresh.call(this); + }; + } } - return task; + + return handle ?? handleId ?? task; } else { // cause an error by calling it directly. return delegate.apply(window, args); @@ -129,27 +156,23 @@ export function patchTimer(window: any, setName: string, cancelName: string, nam function (self: any, args: any[]) { const id = args[0]; let task: Task; - if (typeof id === 'number') { + + if (isNumber(id)) { // non nodejs env. task = tasksByHandleId[id]; + delete tasksByHandleId[id]; } else { - // nodejs env. - task = id && id[taskSymbol]; - // other environments. - if (!task) { + // nodejs env ?? other environments. + task = id?.[taskSymbol]; + if (task) { + id[taskSymbol] = null; + } else { task = id; } } - if (task && typeof task.type === 'string') { - if ( - task.state !== 'notScheduled' && - ((task.cancelFn && task.data!.isPeriodic) || task.runCount === 0) - ) { - if (typeof id === 'number') { - delete tasksByHandleId[id]; - } else if (id) { - id[taskSymbol] = null; - } + + if (task?.type) { + if (task.cancelFn) { // Do not cancel already canceled functions task.zone.cancelTask(task); } diff --git a/packages/zone.js/lib/common/utils.ts b/packages/zone.js/lib/common/utils.ts index cea605a16c53..e75a48264ebe 100644 --- a/packages/zone.js/lib/common/utils.ts +++ b/packages/zone.js/lib/common/utils.ts @@ -567,3 +567,11 @@ export function isIEOrEdge() { } catch (error) {} return ieOrEdge; } + +export function isFunction(value: unknown): value is Function { + return typeof value === 'function'; +} + +export function isNumber(value: unknown): value is number { + return typeof value === 'number'; +} diff --git a/packages/zone.js/lib/zone-impl.ts b/packages/zone.js/lib/zone-impl.ts index 133ba7a91778..8c28d25d16ea 100644 --- a/packages/zone.js/lib/zone-impl.ts +++ b/packages/zone.js/lib/zone-impl.ts @@ -644,6 +644,11 @@ export declare interface TaskData { */ isPeriodic?: boolean; + /** + * A [MacroTask] that can be manually rescheduled. + */ + isRefreshable?: boolean; + /** * Delay in milliseconds when the Task will run. */ @@ -653,6 +658,9 @@ export declare interface TaskData { * identifier returned by the native setTimeout. */ handleId?: number; + + /** The target handler. */ + handle?: any; } /** @@ -925,26 +933,29 @@ export function initZone(): ZoneType { ')', ); } + + const zoneTask = task as ZoneTask; // https://github.com/angular/zone.js/issues/778, sometimes eventTask // will run in notScheduled(canceled) state, we should not try to // run such kind of task but just return + const {type, data: {isPeriodic = false, isRefreshable = false} = {}} = task; - if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) { + if (task.state === notScheduled && (type === eventTask || type === macroTask)) { return; } const reEntryGuard = task.state != running; - reEntryGuard && (task as ZoneTask)._transitionTo(running, scheduled); - task.runCount++; + reEntryGuard && zoneTask._transitionTo(running, scheduled); const previousTask = _currentTask; - _currentTask = task; + _currentTask = zoneTask; _currentZoneFrame = {parent: _currentZoneFrame, zone: this}; + try { - if (task.type == macroTask && task.data && !task.data.isPeriodic) { + if (type == macroTask && task.data && !isPeriodic && !isRefreshable) { task.cancelFn = undefined; } try { - return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs); + return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs); } catch (error) { if (this._zoneDelegate.handleError(this, error)) { throw error; @@ -953,14 +964,18 @@ export function initZone(): ZoneType { } finally { // if the task's state is notScheduled or unknown, then it has already been cancelled // we should not reset the state to scheduled - if (task.state !== notScheduled && task.state !== unknown) { - if (task.type == eventTask || (task.data && task.data.isPeriodic)) { - reEntryGuard && (task as ZoneTask)._transitionTo(scheduled, running); + const state = task.state; + if (state !== notScheduled && state !== unknown) { + if (type == eventTask || isPeriodic || (isRefreshable && state === scheduling)) { + reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling); } else { - task.runCount = 0; - this._updateTaskCount(task as ZoneTask, -1); - reEntryGuard && - (task as ZoneTask)._transitionTo(notScheduled, running, notScheduled); + const zoneDelegates = zoneTask._zoneDelegates; + this._updateTaskCount(zoneTask, -1); + reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled); + + if (isRefreshable) { + zoneTask._zoneDelegates = zoneDelegates; + } } } _currentZoneFrame = _currentZoneFrame.parent!; @@ -1066,7 +1081,7 @@ export function initZone(): ZoneType { } this._updateTaskCount(task as ZoneTask, -1); (task as ZoneTask)._transitionTo(notScheduled, canceling); - task.runCount = 0; + task.runCount = -1; return task; } diff --git a/packages/zone.js/test/node/timer.spec.ts b/packages/zone.js/test/node/timer.spec.ts index fd46ec370475..cdbbcf2e5e54 100644 --- a/packages/zone.js/test/node/timer.spec.ts +++ b/packages/zone.js/test/node/timer.spec.ts @@ -5,7 +5,9 @@ * 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 {promisify} from 'util'; +import {setTimeout as sleep} from 'node:timers/promises'; +import {promisify} from 'node:util'; +import {taskSymbol} from '../../lib/common/timers'; describe('node timer', () => { it('util.promisify should work with setTimeout', (done: DoneFn) => { @@ -33,4 +35,60 @@ describe('node timer', () => { }, ); }); + + it(`'Timeout.refresh' should restart the 'setTimeout' when it is not scheduled`, async () => { + const spy = jasmine.createSpy(); + const timeout = setTimeout(spy, 100) as unknown as NodeJS.Timeout; + + let iterations = 5; + for (let i = 1; i <= iterations; i++) { + timeout.refresh(); + await sleep(150); + } + + expect((timeout as any)[taskSymbol].runCount).toBe(iterations); + + clearTimeout(timeout); + + expect((timeout as any)[taskSymbol]).toBeNull(); + expect(spy).toHaveBeenCalledTimes(iterations); + }); + + it(`'Timeout.refresh' restarts the 'setTimeout' when it is running`, async () => { + let timeout: NodeJS.Timeout; + const spy = jasmine.createSpy().and.callFake(() => timeout.refresh()); + timeout = setTimeout(spy, 100) as unknown as NodeJS.Timeout; + + await sleep(250); + + expect((timeout as any)[taskSymbol].runCount).toBe(2); + + clearTimeout(timeout); + + expect((timeout as any)[taskSymbol]).toBeNull(); + expect(spy).toHaveBeenCalledTimes(2); + }); + + it(`'Timeout.refresh' should restart the 'setInterval'`, async () => { + const spy = jasmine.createSpy(); + const interval = setInterval(spy, 200) as unknown as NodeJS.Timeout; + + // Restart the interval multiple times before the elapsed time. + for (let i = 1; i <= 4; i++) { + interval.refresh(); + await sleep(100); + } + + // Time did not elapse + expect((interval as any)[taskSymbol].runCount).toBe(0); + expect(spy).toHaveBeenCalledTimes(0); + + await sleep(350); + expect((interval as any)[taskSymbol].runCount).toBe(2); + + clearInterval(interval); + + expect((interval as any)[taskSymbol]).toBeNull(); + expect(spy).toHaveBeenCalledTimes(2); + }); }); diff --git a/packages/zone.js/test/zone-spec/async-test.spec.ts b/packages/zone.js/test/zone-spec/async-test.spec.ts index ee35e82a8a62..3a1096421129 100644 --- a/packages/zone.js/test/zone-spec/async-test.spec.ts +++ b/packages/zone.js/test/zone-spec/async-test.spec.ts @@ -13,10 +13,6 @@ describe('AsyncTestZoneSpec', function () { let log: string[]; const AsyncTestZoneSpec = (Zone as any)['AsyncTestZoneSpec']; - function finishCallback() { - log.push('finish'); - } - function failCallback() { log.push('fail'); } diff --git a/packages/zone.js/test/zone-spec/fake-async-test.spec.ts b/packages/zone.js/test/zone-spec/fake-async-test.spec.ts index b60b87ca9e57..bd738cc3d0d4 100644 --- a/packages/zone.js/test/zone-spec/fake-async-test.spec.ts +++ b/packages/zone.js/test/zone-spec/fake-async-test.spec.ts @@ -324,7 +324,7 @@ describe('FakeAsyncTestZoneSpec', () => { // will call `task.state` one more time to check whether to clear the // task or not, so here we use this count to check the issue is fixed or not // For details, please refer to https://github.com/angular/angular/issues/40387 - expect(taskSpy.calls.count()).toEqual(5); + expect(taskSpy.calls.count()).toBe(4); }); }); it( From 59fc4defd33b1a9fcb9125044befa5757d370a71 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 17 Jul 2024 12:28:26 -0700 Subject: [PATCH 026/143] docs: release notes for the v17.3.12 release (#57023) --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bdbdaa390a31..0166c2ad3e9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ + +# 17.3.12 (2024-07-17) +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [327bae473b](https://github.com/angular/angular/commit/327bae473b4ed430efefb4663312a01f59304081) | fix | JIT mode incorrectly interpreting host directive configuration in partial compilation ([#57002](https://github.com/angular/angular/pull/57002)) ([#57003](https://github.com/angular/angular/pull/57003)) | + + + # 18.2.0-next.0 (2024-07-10) ### compiler From 3a415719b729c7b14034ba20cebdab937db8eacc Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 17 Jul 2024 13:08:57 -0700 Subject: [PATCH 027/143] docs: release notes for the v18.1.1 release --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0166c2ad3e9f..ccfa7464babe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ + +# 18.1.1 (2024-07-17) +### common +| Commit | Type | Description | +| -- | -- | -- | +| [a1cb9dfc0d](https://github.com/angular/angular/commit/a1cb9dfc0d3539d16020a53dd4c32311240a6265) | fix | Don't run preconnect assertion on the server. ([#56213](https://github.com/angular/angular/pull/56213)) | +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [daf0317bdc](https://github.com/angular/angular/commit/daf0317bdcef79445eead4a3e0e1be75671f43fb) | fix | JIT mode incorrectly interpreting host directive configuration in partial compilation ([#57002](https://github.com/angular/angular/pull/57002)) | +| [d7dca6dbb6](https://github.com/angular/angular/commit/d7dca6dbb6d8afc77a988de0b7471ac4e078762e) | fix | use strict equality for 'code' comparison ([#56944](https://github.com/angular/angular/pull/56944)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [c94a897248](https://github.com/angular/angular/commit/c94a8972488f62656f5d0368b8763776e2cd39c6) | fix | avoid emitting references to typecheck files in TS 5.4 ([#56961](https://github.com/angular/angular/pull/56961)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [5682527d94](https://github.com/angular/angular/commit/5682527d949b078e92ff7588c7e25dad37fffc52) | fix | not all callbacks running when registered at the same time ([#56981](https://github.com/angular/angular/pull/56981)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [b666d2c20f](https://github.com/angular/angular/commit/b666d2c20f932f435fa6c51e1d74d7bca53381f2) | fix | fix common module removal ([#56968](https://github.com/angular/angular/pull/56968)) | + + + # 17.3.12 (2024-07-17) ### compiler From 89550e734459829e93819ad5f07f387a24891c91 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 17 Jul 2024 13:30:26 -0700 Subject: [PATCH 028/143] release: cut the v18.2.0-next.1 release --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ccfa7464babe..687e207cc08c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,35 @@ + +# 18.2.0-next.1 (2024-07-17) +### common +| Commit | Type | Description | +| -- | -- | -- | +| [2c4613a002](https://github.com/angular/angular/commit/2c4613a002d7670f8377cb53eaa9aca4bfc9521f) | fix | Don't run preconnect assertion on the server. ([#56213](https://github.com/angular/angular/pull/56213)) | +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [9167fc815c](https://github.com/angular/angular/commit/9167fc815c5bac5f39352dd13e381c5be84282c5) | fix | JIT mode incorrectly interpreting host directive configuration in partial compilation ([#57002](https://github.com/angular/angular/pull/57002)) | +| [107173c14d](https://github.com/angular/angular/commit/107173c14d1a0d95b78fbcac53a46bce5f8a6848) | fix | use strict equality for 'code' comparison ([#56944](https://github.com/angular/angular/pull/56944)) | +### compiler-cli +| Commit | Type | Description | +| -- | -- | -- | +| [98ed5b609e](https://github.com/angular/angular/commit/98ed5b609e76d3d2b464abfe49d70413c54d3eee) | feat | run JIT transform on classes with `jit: true` opt-out ([#56892](https://github.com/angular/angular/pull/56892)) | +| [f0d6d0688d](https://github.com/angular/angular/commit/f0d6d0688d984970e03d747405a9b11635ecdcf9) | fix | avoid emitting references to typecheck files in TS 5.4 ([#56961](https://github.com/angular/angular/pull/56961)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [e504ad97d4](https://github.com/angular/angular/commit/e504ad97d44159cf632ec987fce94f66bfddef37) | fix | not all callbacks running when registered at the same time ([#56981](https://github.com/angular/angular/pull/56981)) | +### language-service +| Commit | Type | Description | +| -- | -- | -- | +| [4bb558ab0c](https://github.com/angular/angular/commit/4bb558ab0cbf2e5e34816377e977128a177a977a) | feat | support writing code refactorings ([#56895](https://github.com/angular/angular/pull/56895)) | +| [7663debce1](https://github.com/angular/angular/commit/7663debce1a8411a763a27b7cf8bc5955f8ea2ed) | perf | quick exit if no code fixes can exist ([#57000](https://github.com/angular/angular/pull/57000)) | +### migrations +| Commit | Type | Description | +| -- | -- | -- | +| [0ea6a4a361](https://github.com/angular/angular/commit/0ea6a4a36128dc7a3792f4e164f024e91f429705) | fix | fix common module removal ([#56968](https://github.com/angular/angular/pull/56968)) | + + + # 18.1.1 (2024-07-17) ### common diff --git a/package.json b/package.json index 3c5c4ce029f9..6d69c34c2f4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "18.2.0-next.0", + "version": "18.2.0-next.1", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From d97aee6dc2266c81cbd5207f642f3fee39a2d414 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 17 Jul 2024 13:56:16 -0700 Subject: [PATCH 029/143] release: cut the zone.js 0.14.8 release (#57030) PR Close #57030 --- packages/zone.js/CHANGELOG.md | 10 ++++++++++ packages/zone.js/package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/zone.js/CHANGELOG.md b/packages/zone.js/CHANGELOG.md index 3ae27914cd17..2a71f6898b98 100644 --- a/packages/zone.js/CHANGELOG.md +++ b/packages/zone.js/CHANGELOG.md @@ -1,3 +1,13 @@ +## [0.14.8](https://github.com/angular/angular/compare/zone.js-0.14.7...zone.js-0.14.8) (2024-07-17) + + +### Bug Fixes + +* **zone.js:** allow enabling default `beforeunload` handling ([#55875](https://github.com/angular/angular/issues/55875)) ([b8d5882](https://github.com/angular/angular/commit/b8d5882127a6e9944d30a7e0c87c2e2c59b352e6)), closes [#47579](https://github.com/angular/angular/issues/47579) +* **zone.js:** support `Timeout.refresh` in Node.js ([#56852](https://github.com/angular/angular/issues/56852)) ([982f1b1](https://github.com/angular/angular/commit/982f1b125147e4292716f9524bef75423b70c71c)), closes [/github.com/nodejs/undici/blob/1dff4fd9b1b2cee97c5f8cf44041521a62d3f133/lib/util/timers.js#L45](https://github.com//github.com/nodejs/undici/blob/1dff4fd9b1b2cee97c5f8cf44041521a62d3f133/lib/util/timers.js/issues/L45) [#56586](https://github.com/angular/angular/issues/56586) + + + ## [0.14.7](https://github.com/angular/angular/compare/zone.js-0.14.6...zone.js-0.14.7) (2024-06-06) diff --git a/packages/zone.js/package.json b/packages/zone.js/package.json index 83f02c69b058..82663c2bf9e9 100644 --- a/packages/zone.js/package.json +++ b/packages/zone.js/package.json @@ -1,6 +1,6 @@ { "name": "zone.js", - "version": "0.14.7", + "version": "0.14.8", "description": "Zones for JavaScript", "main": "./bundles/zone.umd.js", "module": "./fesm2015/zone.js", From 1dd43ebe42acd616ca036f465ac03ab7e0091c51 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sun, 7 Jul 2024 23:31:50 +0200 Subject: [PATCH 030/143] docs(docs-infra): no prefix for the current major (#56882) To allow navigation back from next.angular.dev, the current major uses no prefix. fixes #56868 PR Close #56882 --- adev/src/app/core/services/version-manager.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/app/core/services/version-manager.service.ts b/adev/src/app/core/services/version-manager.service.ts index 4b0fcce3350c..3da3517a8f84 100644 --- a/adev/src/app/core/services/version-manager.service.ts +++ b/adev/src/app/core/services/version-manager.service.ts @@ -68,7 +68,7 @@ export class VersionManager { // version: 'rc', // }, { - url: this.getAdevDocsUrl(this.currentMajorVersion), + url: 'https://angular.dev/', displayName: this.getVersion(this.currentMajorVersion), version: this.currentVersionMode, }, From 5e2b29c31638fede4e60913d8a2067c601beac4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20Su=C5=82kowski?= Date: Wed, 17 Jul 2024 13:37:11 +0200 Subject: [PATCH 031/143] docs(docs-infra): add open in StackBlitz button to code editor (#57018) PR Close #57018 --- adev/BUILD.bazel | 1 + .../code-editor/code-editor.component.html | 8 ++++ .../code-editor/code-editor.component.ts | 19 +++++++- .../editor/stackblitz-opener.service.spec.ts | 24 ++++++++++ .../app/editor/stackblitz-opener.service.ts | 46 +++++++++++++++++++ package.json | 5 +- yarn.lock | 5 ++ 7 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 adev/src/app/editor/stackblitz-opener.service.spec.ts create mode 100644 adev/src/app/editor/stackblitz-opener.service.ts diff --git a/adev/BUILD.bazel b/adev/BUILD.bazel index d7b3eca7300d..a1db50e081da 100644 --- a/adev/BUILD.bazel +++ b/adev/BUILD.bazel @@ -78,6 +78,7 @@ APPLICATION_DEPS = [ "@npm//@lezer/highlight", "@npm//@lezer/javascript", "@npm//@lezer/common", + "@npm//@stackblitz/sdk", "@npm//@xterm/xterm", "@npm//@xterm/addon-fit", "@npm//algoliasearch", diff --git a/adev/src/app/editor/code-editor/code-editor.component.html b/adev/src/app/editor/code-editor/code-editor.component.html index 7281d5c04b5c..2f3adf1e5f80 100644 --- a/adev/src/app/editor/code-editor/code-editor.component.html +++ b/adev/src/app/editor/code-editor/code-editor.component.html @@ -65,6 +65,14 @@ + +} +``` + +## Syntax definition + +The `@let` syntax is formally defined as: +* The `@let` keyword. +* Followed by one or more whitespaces, not including new lines. +* Followed by a valid JavaScript name and zero or more whitespaces. +* Followed by the = symbol and zero or more whitespaces. +* Followed by an Angular expression which can be multi-line. +* Terminated by the `;` symbol. + +HELPFUL: A comprehensive description of the feature is availble on [the dedicated guide](guide/templates/let-template-variables) \ No newline at end of file diff --git a/tools/manual_api_docs/generate_block_api_json.ts b/tools/manual_api_docs/generate_block_api_json.ts index 4c785c0062e7..d068f127e761 100644 --- a/tools/manual_api_docs/generate_block_api_json.ts +++ b/tools/manual_api_docs/generate_block_api_json.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {DocEntry, EntryType} from '@angular/compiler-cli'; +import {DocEntry, DocEntryWithSourceInfo, EntryType} from '@angular/compiler-cli'; import {readFileSync, writeFileSync} from 'fs'; import {basename} from 'path'; @@ -15,20 +15,25 @@ function main() { const rawParamLines = readFileSync(paramFilePath, {encoding: 'utf8'}).split('\n'); const [srcs, outputFileExecRootRelativePath] = rawParamLines; - const entries: DocEntry[] = srcs.split(',').map((sourceFilePath) => { + const developerPreview = [{'name': 'developerPreview', 'comment': ''}]; + + const entries: DocEntry[] = srcs.split(',').map((sourceFilePath): DocEntryWithSourceInfo => { const fileContent = readFileSync(sourceFilePath, {encoding: 'utf8'}); + const isDeveloperPreview = fileContent.includes('developerPreview'); + + const filteredContent = fileContent.replace(/^@developerPreview/, ''); return { name: `@${basename(sourceFilePath, '.md')}`, entryType: EntryType.Block, - description: fileContent, - rawComment: fileContent, + description: filteredContent, + rawComment: filteredContent, source: { filePath: '/' + sourceFilePath, startLine: 0, endLine: 0, }, - jsdocTags: [], + jsdocTags: isDeveloperPreview ? developerPreview : [], }; }); From e0f606e4f19cfe1870ba73b0aa6bf2417ab26abd Mon Sep 17 00:00:00 2001 From: Sheik Althaf Date: Tue, 16 Jul 2024 08:25:02 +0530 Subject: [PATCH 037/143] refactor(devtools): use signal api in property view (#56995) Refactor the property view components to use signal apis, in future we can make the components onPush and zoneless PR Close #56995 --- .../property-editor.component.html | 13 +-- .../property-editor.component.ts | 84 ++++++++----------- .../property-preview.component.html | 4 +- .../property-preview.component.ts | 15 ++-- .../property-tab-body.component.html | 4 +- .../property-tab-body.component.ts | 21 ++--- .../property-view-body.component.html | 19 +++-- .../property-view-body.component.ts | 80 +++++++++--------- .../property-view-header.component.html | 4 +- .../property-view-header.component.ts | 6 +- .../property-view-tree.component.html | 8 +- .../property-view-tree.component.ts | 16 ++-- .../property-view.component.html | 10 +-- .../property-view/property-view.component.ts | 30 ++----- 14 files changed, 149 insertions(+), 165 deletions(-) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-editor.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-editor.component.html index 57bd3b270de3..d93932f985c4 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-editor.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-editor.component.html @@ -1,14 +1,14 @@
- @switch (currentPropertyState) { + @switch (currentPropertyState()) { @case (readState) { - @switch(containerType) { - @case('WritableSignal') { - Signal({{valueToSubmit}}) + @switch(containerType()) { + @case('WritableSignal') { + Signal({{valueToSubmit()}}) } - @default { - {{ valueToSubmit }} + @default { + {{ valueToSubmit() }} } } @@ -16,6 +16,7 @@ @case (writeState) { { standalone: true, imports: [FormsModule], }) -export class PropertyEditorComponent implements AfterViewChecked, OnInit { - @Input({required: true}) key!: string; - @Input({required: true}) initialValue!: EditorResult; - @Input() containerType: ContainerType = null; +export class PropertyEditorComponent { + readonly key = input.required(); + readonly initialValue = input.required(); + readonly containerType = input(); - @Output() updateValue = new EventEmitter(); + readonly updateValue = output(); + + readonly inputEl = viewChild>('inputEl'); readState = PropertyEditorState.Read; writeState = PropertyEditorState.Write; - valueToSubmit!: EditorResult; - currentPropertyState = this.readState; - - constructor( - private _cd: ChangeDetectorRef, - private _elementRef: ElementRef, - ) {} - - ngOnInit(): void { - this.valueToSubmit = this.initialValue; - } - - ngAfterViewChecked(): void { - if (this.currentPropertyState === this.writeState) { - this.editor.focus(); - } + readonly valueToSubmit = signal(undefined); + readonly currentPropertyState = signal(this.readState); + + constructor() { + afterNextRender({ + read: () => { + this.valueToSubmit.set(this.initialValue()); + }, + }); + + effect(() => { + const editor = this.inputEl()?.nativeElement; + if (editor && this.currentPropertyState() === this.writeState) { + editor.focus(); + editor.select(); + } + }); } accept(): void { - const parsed = parseValue(this.valueToSubmit); + const parsed = parseValue(this.valueToSubmit()!); this.updateValue.emit(parsed); - this._transition(this.readState); + this.currentPropertyState.set(this.readState); } reject(): void { - this.valueToSubmit = this.initialValue; - this._transition(this.readState); + this.valueToSubmit.set(this.initialValue()); + this.currentPropertyState.set(this.readState); } onClick(): void { - if (this.currentPropertyState === this.readState) { - this._transition(this.writeState); + if (this.currentPropertyState() === this.readState) { + this.currentPropertyState.set(this.writeState); } } onBlur(): void { - if (this.currentPropertyState === this.writeState) { + if (this.currentPropertyState() === this.writeState) { this.accept(); } } - - get editor(): HTMLInputElement { - return this._elementRef.nativeElement.querySelector('input'); - } - - private _transition(state: PropertyEditorState): void { - this.currentPropertyState = state; - if (this.currentPropertyState === this.writeState) { - this._cd.detectChanges(); - this.editor.focus(); - this.editor.select(); - } - } } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.html index f55654234418..216d411fd069 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.html @@ -1,3 +1,3 @@ - - {{ node.prop.descriptor.preview }} + + {{ node().prop.descriptor.preview }} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.ts index 431e490e1e27..70cd9195c03d 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-preview.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, computed, input, output} from '@angular/core'; import {PropType} from 'protocol'; import {FlatNode} from '../../property-resolver/element-property-resolver'; @@ -18,13 +18,14 @@ import {FlatNode} from '../../property-resolver/element-property-resolver'; standalone: true, }) export class PropertyPreviewComponent { - @Input({required: true}) node!: FlatNode; - @Output() inspect = new EventEmitter(); + readonly node = input.required(); + readonly inspect = output(); - get isClickableProp(): boolean { + readonly isClickableProp = computed(() => { + const node = this.node(); return ( - this.node.prop.descriptor.type === PropType.Function || - this.node.prop.descriptor.type === PropType.HTMLNode + node.prop.descriptor.type === PropType.Function || + node.prop.descriptor.type === PropType.HTMLNode ); - } + }); } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html index d04d0f706702..b20c80abde7e 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.html @@ -1,5 +1,5 @@ -@if (currentSelectedElement) { - @for (directive of getCurrentDirectives(); track $index) { +@if (currentSelectedElement()) { + @for (directive of currentDirectives(); track $index) {
diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts index bcfb0e48c9fa..42b5f662b852 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-tab-body.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, computed, input, output} from '@angular/core'; import {DirectivePosition} from 'protocol'; import {IndexedNode} from '../../directive-forest/index-forest'; @@ -21,18 +21,19 @@ import {PropertyViewComponent} from './property-view.component'; imports: [PropertyViewComponent], }) export class PropertyTabBodyComponent { - @Input({required: true}) currentSelectedElement!: IndexedNode | null; - @Output() inspect = new EventEmitter<{node: FlatNode; directivePosition: DirectivePosition}>(); - @Output() viewSource = new EventEmitter(); + readonly currentSelectedElement = input.required(); + readonly inspect = output<{node: FlatNode; directivePosition: DirectivePosition}>(); + readonly viewSource = output(); - getCurrentDirectives(): string[] | undefined { - if (!this.currentSelectedElement) { + readonly currentDirectives = computed(() => { + const selected = this.currentSelectedElement(); + if (!selected) { return; } - const directives = this.currentSelectedElement.directives.map((d) => d.name); - if (this.currentSelectedElement.component) { - directives.push(this.currentSelectedElement.component.name); + const directives = selected.directives.map((d) => d.name); + if (selected.component) { + directives.push(selected.component.name); } return directives; - } + }); } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.html index 449bccac6c99..d80864d1f899 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.html @@ -1,6 +1,6 @@ -@if (controlsLoaded) { +@if (controlsLoaded()) { - @if (controller.directiveMetadata?.dependencies.length > 0) { + @if (controller().directiveMetadata?.dependencies.length > 0) {
@@ -17,19 +17,20 @@ - +
} @for (index of categoryOrder; track $index) {
- @if (!panels[index].hidden) { - + @let panel = panels()[index]; + @if (!panel.hidden) { + - {{ panels[index].title }} + {{ panel.title }} diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts index 14aab70aeb5f..ab59188c1624 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-body.component.ts @@ -7,7 +7,7 @@ */ import {CdkDragDrop, moveItemInArray, CdkDropList, CdkDrag} from '@angular/cdk/drag-drop'; -import {Component, EventEmitter, Input, Output, forwardRef} from '@angular/core'; +import {Component, computed, forwardRef, input, output} from '@angular/core'; import {DirectivePosition, SerializedInjectedService} from 'protocol'; import { @@ -38,57 +38,59 @@ import {MatExpansionModule} from '@angular/material/expansion'; ], }) export class PropertyViewBodyComponent { - @Input({required: true}) controller!: DirectivePropertyResolver; - @Input({required: true}) directiveInputControls!: DirectiveTreeData; - @Input({required: true}) directiveOutputControls!: DirectiveTreeData; - @Input({required: true}) directiveStateControls!: DirectiveTreeData; + readonly controller = input.required(); + readonly directiveInputControls = input.required(); + readonly directiveOutputControls = input.required(); + readonly directiveStateControls = input.required(); - @Output() inspect = new EventEmitter<{node: FlatNode; directivePosition: DirectivePosition}>(); + readonly inspect = output<{node: FlatNode; directivePosition: DirectivePosition}>(); categoryOrder = [0, 1, 2]; - get panels(): { - title: string; - hidden: boolean; - controls: DirectiveTreeData; - documentation: string; - class: string; - }[] { + readonly panels = computed< + { + title: string; + hidden: boolean; + controls: DirectiveTreeData; + documentation: string; + class: string; + }[] + >(() => { return [ { title: '@Inputs', - hidden: this.directiveInputControls.dataSource.data.length === 0, - controls: this.directiveInputControls, + hidden: this.directiveInputControls().dataSource.data.length === 0, + controls: this.directiveInputControls(), documentation: 'https://angular.dev/api/core/input', class: 'cy-inputs', }, { title: '@Outputs', - hidden: this.directiveOutputControls.dataSource.data.length === 0, - controls: this.directiveOutputControls, + hidden: this.directiveOutputControls().dataSource.data.length === 0, + controls: this.directiveOutputControls(), documentation: 'https://angular.dev/api/core/output', class: 'cy-outputs', }, { title: 'Properties', - hidden: this.directiveStateControls.dataSource.data.length === 0, - controls: this.directiveStateControls, + hidden: this.directiveStateControls().dataSource.data.length === 0, + controls: this.directiveStateControls(), documentation: 'https://angular.dev/guide/templates/property-binding', class: 'cy-properties', }, ]; - } + }); - get controlsLoaded(): boolean { + readonly controlsLoaded = computed(() => { return ( - !!this.directiveStateControls && - !!this.directiveOutputControls && - !!this.directiveInputControls + !!this.directiveStateControls() && + !!this.directiveOutputControls() && + !!this.directiveInputControls() ); - } + }); updateValue({node, newValue}: {node: FlatNode; newValue: unknown}): void { - this.controller.updateValue(node, newValue); + this.controller().updateValue(node, newValue); } drop(event: CdkDragDrop): void { @@ -98,7 +100,7 @@ export class PropertyViewBodyComponent { handleInspect(node: FlatNode): void { this.inspect.emit({ node, - directivePosition: this.controller.directivePosition, + directivePosition: this.controller().directivePosition, }); } } @@ -115,27 +117,27 @@ export class PropertyViewBodyComponent { matTooltipPosition="left" matTooltip="Dependency injection token" (click)="$event.stopPropagation()" - >{{ dependency.token }}{{ dependency().token }}
- @if (dependency.flags?.optional) { + @if (dependency().flags?.optional) { Optional - } @if (dependency.flags?.host) { + } @if (dependency().flags?.host) { Host - } @if (dependency.flags?.self) { + } @if (dependency().flags?.self) { Self - } @if (dependency.flags?.skipSelf) { + } @if (dependency().flags?.skipSelf) { SkipSelf }
- +
`, @@ -168,12 +170,12 @@ export class PropertyViewBodyComponent { imports: [MatExpansionModule, MatChipsModule, MatTooltip, ResolutionPathComponent], }) export class DependencyViewerComponent { - @Input({required: true}) dependency!: SerializedInjectedService; + readonly dependency = input.required(); } @Component({ selector: 'ng-injected-services', - template: ` @for (dependency of dependencies; track dependency.position[0]) { + template: ` @for (dependency of dependencies(); track dependency.position[0]) { }`, styles: [ @@ -188,9 +190,9 @@ export class DependencyViewerComponent { imports: [DependencyViewerComponent], }) export class InjectedServicesComponent { - @Input({required: true}) controller!: DirectivePropertyResolver; + readonly controller = input.required(); - get dependencies(): SerializedInjectedService[] { - return this.controller.directiveMetadata?.dependencies ?? []; - } + readonly dependencies = computed(() => { + return this.controller().directiveMetadata?.dependencies ?? []; + }); } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.html index 3318f13cae59..e366e9b816db 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.html @@ -1,6 +1,6 @@ - {{ directive }} + {{ directive() }} - \ No newline at end of file + diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.ts index 91486e78b0e0..d4b6a1fbe9b4 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-header.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, input, output} from '@angular/core'; import {MatIcon} from '@angular/material/icon'; import {MatTooltip} from '@angular/material/tooltip'; import {MatToolbar} from '@angular/material/toolbar'; @@ -19,8 +19,8 @@ import {MatToolbar} from '@angular/material/toolbar'; imports: [MatToolbar, MatTooltip, MatIcon], }) export class PropertyViewHeaderComponent { - @Input({required: true}) directive!: string; - @Output() viewSource = new EventEmitter(); + readonly directive = input.required(); + readonly viewSource = output(); // output that emits directive handleViewSource(event: MouseEvent): void { diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.html index 4d939f2bfa61..8286a3b02050 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.html @@ -1,5 +1,5 @@ -@if (treeControl) { - +@if (treeControl()) { + {{ node.prop.name }}:  @if (!node.prop.descriptor.editable) { @@ -16,12 +16,12 @@
- {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }} + {{ treeControl().isExpanded(node) ? 'expand_more' : 'chevron_right' }}   {{ node.prop.name }}: - {{ treeControl.isExpanded(node) ? '' : node.prop.descriptor.preview }} + {{ treeControl().isExpanded(node) ? '' : node.prop.descriptor.preview }}
diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.ts index 1beba28c6dbd..c209d6c8fdd6 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view-tree.component.ts @@ -7,7 +7,7 @@ */ import {FlatTreeControl} from '@angular/cdk/tree'; -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, input, output} from '@angular/core'; import {FlatNode} from '../../property-resolver/element-property-resolver'; import {PropertyDataSource} from '../../property-resolver/property-data-source'; @@ -32,16 +32,16 @@ import {MatTree, MatTreeNode, MatTreeNodeDef, MatTreeNodePadding} from '@angular ], }) export class PropertyViewTreeComponent { - @Input({required: true}) dataSource!: PropertyDataSource; - @Input({required: true}) treeControl!: FlatTreeControl; - @Output() updateValue = new EventEmitter(); - @Output() inspect = new EventEmitter(); + readonly dataSource = input.required(); + readonly treeControl = input.required>(); + readonly updateValue = output(); + readonly inspect = output(); hasChild = (_: number, node: FlatNode): boolean => node.expandable; toggle(node: FlatNode): void { - if (this.treeControl.isExpanded(node)) { - this.treeControl.collapse(node); + if (this.treeControl().isExpanded(node)) { + this.treeControl().collapse(node); return; } this.expand(node); @@ -52,7 +52,7 @@ export class PropertyViewTreeComponent { if (!prop.descriptor.expandable) { return; } - this.treeControl.expand(node); + this.treeControl().expand(node); } handleUpdate(node: FlatNode, newValue: unknown): void { diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html index 8247268268fd..e97bec87cd07 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.html @@ -1,8 +1,8 @@ - + diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.ts index d037eb9daf90..4dc31e19a9aa 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-view/property-view.component.ts @@ -6,13 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, computed, inject, input, output} from '@angular/core'; import {DirectivePosition} from 'protocol'; -import { - DirectivePropertyResolver, - DirectiveTreeData, -} from '../../property-resolver/directive-property-resolver'; import {ElementPropertyResolver, FlatNode} from '../../property-resolver/element-property-resolver'; import {PropertyViewBodyComponent} from './property-view-body.component'; import {PropertyViewHeaderComponent} from './property-view-header.component'; @@ -25,25 +21,17 @@ import {PropertyViewHeaderComponent} from './property-view-header.component'; imports: [PropertyViewHeaderComponent, PropertyViewBodyComponent], }) export class PropertyViewComponent { - @Input({required: true}) directive!: string; - @Output() inspect = new EventEmitter<{node: FlatNode; directivePosition: DirectivePosition}>(); - @Output() viewSource = new EventEmitter(); + readonly directive = input.required(); + readonly inspect = output<{node: FlatNode; directivePosition: DirectivePosition}>(); + readonly viewSource = output(); - constructor(private _nestedProps: ElementPropertyResolver) {} + private _nestedProps = inject(ElementPropertyResolver); - get controller(): DirectivePropertyResolver | undefined { - return this._nestedProps.getDirectiveController(this.directive); - } + readonly controller = computed(() => this._nestedProps.getDirectiveController(this.directive())); - get directiveInputControls(): DirectiveTreeData | void { - return this.controller?.directiveInputControls; - } + readonly directiveInputControls = computed(() => this.controller()?.directiveInputControls); - get directiveOutputControls(): DirectiveTreeData | void { - return this.controller?.directiveOutputControls; - } + readonly directiveOutputControls = computed(() => this.controller()?.directiveOutputControls); - get directiveStateControls(): DirectiveTreeData | void { - return this.controller?.directiveStateControls; - } + readonly directiveStateControls = computed(() => this.controller()?.directiveStateControls); } From f3a88ad678df7ada8e84a1563fb6a267de65b966 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Wed, 17 Jul 2024 21:21:09 +0200 Subject: [PATCH 038/143] docs(docs-infra): update tutorial deps to 18.1 (#57024) lockfile were still loading 18.0 but TS was already at 5.5 which 18.0 doesn't support PR Close #57024 --- adev/src/content/tutorials/README.md | 13 + .../first-app/common/package-lock.json | 5066 ++++++++--------- .../tutorials/homepage/package-lock.json | 2769 ++++----- .../learn-angular/common/package-lock.json | 2783 ++++----- .../playground/common/package-lock.json | 2793 ++++----- 5 files changed, 6828 insertions(+), 6596 deletions(-) diff --git a/adev/src/content/tutorials/README.md b/adev/src/content/tutorials/README.md index 363eafc06339..154ed2f0a6d4 100644 --- a/adev/src/content/tutorials/README.md +++ b/adev/src/content/tutorials/README.md @@ -92,3 +92,16 @@ See [`src/content/tutorials/playground`](/src/content/tutorials/playground) The homepage contains the source code for the homepage playground. It should not contain any content. See [`src/content/tutorials/homepage`](/src/content/tutorials/homepage) + +## Update dependencies + +To update the dependencies of all tutorials you can run the following script + +```bash +rm ./adev/src/content/tutorials/homepage/package-lock.json ./adev/src/content/tutorials/first-app/common/package-lock.json ./adev/src/content/tutorials/learn-angular/common/package-lock.json ./adev/src/content/tutorials/playground/common/package-lock.json + +npm i --package-lock-only --prefix ./adev/src/content/tutorials/homepage +npm i --package-lock-only --prefix ./adev/src/content/tutorials/first-app/common +npm i --package-lock-only --prefix ./adev/src/content/tutorials/learn-angular/common +npm i --package-lock-only --prefix ./adev/src/content/tutorials/playground/common +``` \ No newline at end of file diff --git a/adev/src/content/tutorials/first-app/common/package-lock.json b/adev/src/content/tutorials/first-app/common/package-lock.json index 16db4d1dbc47..979dfab2447a 100644 --- a/adev/src/content/tutorials/first-app/common/package-lock.json +++ b/adev/src/content/tutorials/first-app/common/package-lock.json @@ -36,7 +36,7 @@ "karma-jasmine-html-reporter": "~2.1.0", "protractor": "~7.0.0", "ts-node": "~10.9.0", - "typescript": "~5.4.0" + "typescript": "~5.5.0" } }, "node_modules/@ampproject/remapping": { @@ -53,12 +53,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1800.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.2.tgz", - "integrity": "sha512-PX7lCTAqWe9C40+fie+DAc8vhpGA+JgZKWWrMHUTV/iZx8RXx2X4xGQsqYu36p4i3MSfQdbn+0xLWGmjScPVOQ==", + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz", + "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", + "@angular-devkit/core": "18.1.0", "rxjs": "7.8.1" }, "engines": { @@ -68,71 +68,70 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.0.2.tgz", - "integrity": "sha512-cQkTx7XaIPj6+DXo6wZmO4iY0hOOfPDnSN/+m84XpBW0tuPGxH7Z9B6wV+Uwcpm9HGPqzRA7VZyPsqbK860b0Q==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.1.0.tgz", + "integrity": "sha512-j/YrEFuEX90Pcyzjew6EcCoxT+Va0AlGjgWyVIuStNTEsCx9Vp7T2tS7w6LL1t6leM7gzf8f/ZKtvRPnAsWdQg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.2", - "@angular-devkit/build-webpack": "0.1800.2", - "@angular-devkit/core": "18.0.2", - "@angular/build": "18.0.2", - "@babel/core": "7.24.5", - "@babel/generator": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", - "@babel/plugin-transform-async-generator-functions": "7.24.3", - "@babel/plugin-transform-async-to-generator": "7.24.1", - "@babel/plugin-transform-runtime": "7.24.3", - "@babel/preset-env": "7.24.5", - "@babel/runtime": "7.24.5", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/build-webpack": "0.1801.0", + "@angular-devkit/core": "18.1.0", + "@angular/build": "18.1.0", + "@babel/core": "7.24.7", + "@babel/generator": "7.24.7", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.24.7", + "@babel/plugin-transform-async-to-generator": "7.24.7", + "@babel/plugin-transform-runtime": "7.24.7", + "@babel/preset-env": "7.24.7", + "@babel/runtime": "7.24.7", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "18.0.2", + "@ngtools/webpack": "18.1.0", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.19", "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.22", - "css-loader": "7.1.1", - "esbuild-wasm": "0.21.3", + "copy-webpack-plugin": "12.0.2", + "critters": "0.0.24", + "css-loader": "7.1.2", + "esbuild-wasm": "0.21.5", "fast-glob": "3.3.2", "http-proxy-middleware": "3.0.0", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", + "https-proxy-agent": "7.0.5", + "istanbul-lib-instrument": "6.0.2", + "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", "less": "4.2.0", "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", + "loader-utils": "3.3.1", "magic-string": "0.30.10", "mini-css-extract-plugin": "2.9.0", "mrmime": "2.0.0", - "open": "8.4.2", + "open": "10.1.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.5.0", + "piscina": "4.6.1", "postcss": "8.4.38", "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.77.2", + "sass": "1.77.6", "sass-loader": "14.2.1", "semver": "7.6.2", "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.31.0", + "terser": "5.29.2", "tree-kill": "1.2.2", - "tslib": "2.6.2", - "undici": "6.18.0", - "vite": "5.2.11", + "tslib": "2.6.3", + "undici": "6.19.2", + "vite": "5.3.2", "watchpack": "2.4.1", - "webpack": "5.91.0", + "webpack": "5.92.1", "webpack-dev-middleware": "7.2.1", "webpack-dev-server": "5.0.4", "webpack-merge": "5.10.0", @@ -144,7 +143,7 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.21.3" + "esbuild": "0.21.5" }, "peerDependencies": { "@angular/compiler-cli": "^18.0.0", @@ -159,7 +158,7 @@ "ng-packagr": "^18.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "@angular/localize": { @@ -197,1014 +196,236 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", - "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", - "dev": true, - "engines": { - "node": ">=14.6.0" - }, - "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/vite/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/@angular-devkit/build-webpack": { - "version": "0.1800.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1800.2.tgz", - "integrity": "sha512-CbTURBhZWzx+5KewS2Nkqy2rwBTFgDCvUwONGWuy1K68+85vOWUKqjkfvriHA+JkWN03w7FzWEtTfcOg0EzYkw==", - "dev": true, - "dependencies": { - "@angular-devkit/architect": "0.1800.2", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "webpack": "^5.30.0", - "webpack-dev-server": "^5.0.2" - } - }, - "node_modules/@angular-devkit/core": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.2.tgz", - "integrity": "sha512-QXcEdfmODc0rKblBerk30yw70fypIkFm6gQBLJgsshpwc+TMA+fuMLcPQebOTzKLtD2tNUkk/7SrWPQIGqeXaA==", - "dev": true, - "dependencies": { - "ajv": "8.13.0", - "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.2", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.2.tgz", - "integrity": "sha512-G9yGcoB67sH0eRNWoiQWNn2KwiI7sDasVscYPGKf1yo7JRiXmzX/LpfKRPsZTl+Bs0FItnwDInsqgMisK89/6g==", - "dev": true, - "dependencies": { - "@angular-devkit/core": "18.0.2", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.10", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/animations": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.1.tgz", - "integrity": "sha512-QAY/oxfuFY2Bjr3foniWlLAiddXHu8879lZvXHt1NVOsiav+vD15IEEQsnuQbJPy/EHEnAlUh9UptB4zQIBp/Q==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^18.13.0 || >=20.9.0" - }, - "peerDependencies": { - "@angular/core": "18.0.1" - } - }, - "node_modules/@angular/build": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.2.tgz", - "integrity": "sha512-iPPHdAJ3LiR8t/+39xjvrqMWcTmRrfphzKxXoIVDcswQjVQIk00EYuxinC6EVa7dSKDl1thk1MeCNZ9DIjaAvQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.2", - "@babel/core": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", - "@vitejs/plugin-basic-ssl": "1.1.0", - "ansi-colors": "4.1.3", - "browserslist": "^4.23.0", - "critters": "0.0.22", - "esbuild": "0.21.3", - "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "lmdb": "3.0.8", - "magic-string": "0.30.10", - "mrmime": "2.0.0", - "ora": "5.4.1", - "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "4.0.2", - "piscina": "4.5.0", - "sass": "1.77.2", - "semver": "7.6.2", - "undici": "6.18.0", - "vite": "5.2.11", - "watchpack": "2.4.1" - }, - "engines": { - "node": "^18.19.1 || ^20.11.1 || >=22.0.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "@angular/compiler-cli": "^18.0.0", - "@angular/localize": "^18.0.0", - "@angular/platform-server": "^18.0.0", - "@angular/service-worker": "^18.0.0", - "less": "^4.2.0", - "postcss": "^8.4.0", - "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" - }, - "peerDependenciesMeta": { - "@angular/localize": { - "optional": true - }, - "@angular/platform-server": { - "optional": true - }, - "@angular/service-worker": { - "optional": true - }, - "less": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tailwindcss": { - "optional": true - } - } - }, - "node_modules/@angular/build/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/build/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], + "node_modules/@angular-devkit/build-angular/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@angular/build/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@angular/build/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-angular/node_modules/vite": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/@angular/build/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1801.0.tgz", + "integrity": "sha512-EnkkhE4tVOk3lU5/bt8hNCQCJMefcpU5E4jChRmFu+m0OtKK2kax3hjPTUVwcpbjwpG5rO7J/U5yIhCY9afXKw==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@angular-devkit/architect": "0.1801.0", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" } }, - "node_modules/@angular/build/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], + "node_modules/@angular-devkit/core": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "ajv": "8.16.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], + "node_modules/@angular-devkit/schematics": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.1.0.tgz", + "integrity": "sha512-BjrYutLfYFiPOSEcLBWCj3ENkwDn8gMfBSJesaBz7OrZBZGK5j0dVgBLIsGTP96TKo4o4vszJQOvS4AtV6xMGg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@angular-devkit/core": "18.1.0", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.10", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@angular/animations": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.1.0.tgz", + "integrity": "sha512-K0BhvZ/SIVoGXZVuh1KOJDdgcGlHfFGMGrs58utndndAb+gYXReMfz4GR5cQs2OObH6TKmIOY2EH7Og1CY2tsw==", + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.1.0" } }, - "node_modules/@angular/build/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], + "node_modules/@angular/build": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.1.0.tgz", + "integrity": "sha512-4yLrGqMDoNBis2Z4s8F3wSqlB2XLtwy/10tREBk9xVaCojERiwDvtHqzbMeHqD6ZMGDFtdhI12q8FT5jZVUmAw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1801.0", + "@babel/core": "7.24.7", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.11", + "@vitejs/plugin-basic-ssl": "1.1.0", + "ansi-colors": "4.1.3", + "browserslist": "^4.23.0", + "critters": "0.0.24", + "esbuild": "0.21.5", + "fast-glob": "3.3.2", + "https-proxy-agent": "7.0.5", + "lmdb": "3.0.12", + "magic-string": "0.30.10", + "mrmime": "2.0.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "rollup": "4.18.0", + "sass": "1.77.6", + "semver": "7.6.2", + "undici": "6.19.2", + "vite": "5.3.2", + "watchpack": "2.4.1" + }, "engines": { - "node": ">=12" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "less": "^4.2.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.6" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } } }, "node_modules/@angular/build/node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, "optional": true, "peer": true, @@ -1225,12 +446,12 @@ } }, "node_modules/@angular/build/node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, @@ -1279,62 +500,24 @@ } } }, - "node_modules/@angular/build/node_modules/vite/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, "node_modules/@angular/cli": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.2.tgz", - "integrity": "sha512-shrxMD1bcWWh7WpBN3KTV+Lt8E62gURSUFhs6kdGLepMDif8LPAv45+hpt8SBU9VfQuL6AHa4cW8uDL9BKGlYA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", + "integrity": "sha512-2E+b7S/736AOmxf5je9OWoPpgPY240TfJfFXwQiVvq/4KyC+ZR9lBrqRx72Xghn8nu3z8Q2BPZIXVGZppl0USQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1800.2", - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "@schematics/angular": "18.0.2", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "@inquirer/prompts": "5.0.7", + "@listr2/prompt-adapter-inquirer": "2.0.13", + "@schematics/angular": "18.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.2", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.3", "npm-package-arg": "11.0.2", "npm-pick-manifest": "9.0.1", - "ora": "5.4.1", "pacote": "18.0.6", "resolve": "1.22.8", "semver": "7.6.2", @@ -1351,32 +534,32 @@ } }, "node_modules/@angular/common": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.1.tgz", - "integrity": "sha512-iADQC5m4fvk+VNXEoU1KR93b0eG218/GuNdzUNVJHcjxdFxPshKk5fiaGSosUCxXPRQOxDKzmS9EDang87E/Ew==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.1.0.tgz", + "integrity": "sha512-noHDLarQSCZZh7hyNd0HR61Fut+q4QCVq9qc/jKPglfbV/6nPujQSmSpT+rNJlNuBOrCLuvH/CNBNbiqii+x3g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1", + "@angular/core": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.1.tgz", - "integrity": "sha512-zyG/ifCtN0drAuwz0oV6LtzTiDREsM1Ay7eJW9wTvp3NCv06goHLtHXX12eFfZQWJViBv924lyRDSWdZN7r3GQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.1.0.tgz", + "integrity": "sha512-JRQzVTeJGSfRLY+dx+gwu/hPQVB8K+5pW12Z42M9x/HBgGW4in0cO2zHkeQPvImqm0nak82Us1Hyf5C+qTlMMQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1" + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -1385,12 +568,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.1.tgz", - "integrity": "sha512-Aoz70+/o8R2lG2EGDAYbj6yu2B7kqa/9loYEwG0fECJTtXoRBP+bEGpUxMmxOb59tMDnbIhBHmNPPEQVTXvgSQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.1.0.tgz", + "integrity": "sha512-BBsogLPJwxkPh7f8RVHsxyyqNE8XpHbAanjB5fAwnU4W6Sw1kR5rFzkeZM3xaRm2MDiC8DovIl6hlf+s/mKYOw==", "dev": true, "dependencies": { - "@babel/core": "7.24.4", + "@babel/core": "7.24.7", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -1405,67 +588,22 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.0.1", - "typescript": ">=5.4 <5.5" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@angular/compiler": "18.1.0", + "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.1.tgz", - "integrity": "sha512-Db1livvugoLdLsWww5IqUS5v+yUN7/5Rj0trZv9BgxIuoNtoipfLqKHwZWpumH3yI5Ucu+UH9zZ1mlGyF0Kexw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.1.0.tgz", + "integrity": "sha512-/57/s7CD/0CwlN+3FlhVmx7ypCWXjKi5UKtnlBAUg0D1denIf6ADxwTHFZABYZcYBqOTJgeQUtUw9u/A+0CIlg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", @@ -1473,36 +611,36 @@ } }, "node_modules/@angular/forms": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.1.tgz", - "integrity": "sha512-j1nUzwnZHO/BRXK0joQbAV10JWxeRVKmPzIaDulY2o28Er1jVKyw2T8EwI+xSvBbAqyJyaAd+ysWUhm3FfH+GA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.1.0.tgz", + "integrity": "sha512-m+7m9wa+n5dEacd458eSZsZTz0B+HbOtr7/uqM0YTMQaPrhwl1epG5Y103mB6yr00JiJcLNlPLjP888cHFjldQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.1", - "@angular/core": "18.0.1", - "@angular/platform-browser": "18.0.1", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0", + "@angular/platform-browser": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.1.tgz", - "integrity": "sha512-rQUsOxZxiwSPvyHdne60IKIGsvFoVc1rO4mDyXU+9sCCLmPKHzNyEzp7vybTZeiqa3k6v3sV/bfHWwrRzmvenw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz", + "integrity": "sha512-jCmxthiI4Zef54crckNht60xwfIsuciGeyZvb7SsXna2maLW9fA4uz1VhZqIWTiBnHwNynVlyfBX3/jBD7S9+g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.0.1", - "@angular/common": "18.0.1", - "@angular/core": "18.0.1" + "@angular/animations": "18.1.0", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1511,19 +649,19 @@ } }, "node_modules/@angular/router": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.1.tgz", - "integrity": "sha512-PapdvfATjRZI0cJ/RH8n/ixHDHa4HIBaOMwhgU73InU9t6NIhBXg6aRECYV2qGt7NtpLYSHmG5Z1Ws86rm5Tyw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.1.0.tgz", + "integrity": "sha512-dl2cSxZkl4we+rWMxdm123TZzlor6yxwNFI2yT7b6DP2i+rXaaHBSSPet0ASp+UX6djz+Osr56Bifs6wi4rhiQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.1", - "@angular/core": "18.0.1", - "@angular/platform-browser": "18.0.1", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0", + "@angular/platform-browser": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1541,30 +679,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1595,12 +733,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", - "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -1610,12 +748,12 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1635,14 +773,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -1660,50 +798,26 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.8.tgz", + "integrity": "sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { @@ -1732,18 +846,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1807,13 +909,13 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1833,9 +935,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -1851,18 +953,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", @@ -1876,9 +966,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1901,18 +991,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-replace-supers": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", @@ -1957,21 +1035,21 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -1987,9 +1065,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" @@ -2011,13 +1089,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, "dependencies": { "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2039,9 +1117,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2377,14 +1455,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -2395,14 +1473,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2475,16 +1553,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.8.tgz", + "integrity": "sha512-VXy91c47uujj758ud9wx+OMgheXm4qJfyhj1P18YvlrQkNOSrwsteHk+EFS3OMGfhMhpZa0A+81eE7G4QC+3CA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-replace-supers": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" @@ -2496,30 +1574,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", @@ -2537,12 +1591,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2742,13 +1796,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-simple-access": "^7.24.7" }, "engines": { @@ -2906,12 +1960,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -2971,18 +2025,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", @@ -3030,13 +2072,13 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.1", "babel-plugin-polyfill-regenerator": "^0.6.1", @@ -3120,12 +2162,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -3198,27 +2240,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", - "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -3230,54 +2272,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.5", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.5", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.5", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.5", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.5", - "@babel/plugin-transform-parameters": "^7.24.5", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.5", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.5", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -3322,9 +2364,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -3348,19 +2390,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", + "@babel/generator": "^7.24.8", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -3369,12 +2411,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -3383,445 +2425,842 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "node_modules/@babel/types": { + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.1.90" + "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz", - "integrity": "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ - "ppc64" + "loong64" ], "dev": true, "optional": true, "os": [ - "aix" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.3.tgz", - "integrity": "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ - "arm" + "mips64el" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz", - "integrity": "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ - "arm64" + "ppc64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.3.tgz", - "integrity": "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ - "x64" + "riscv64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz", - "integrity": "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ - "arm64" + "s390x" ], "dev": true, "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz", - "integrity": "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==", + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz", - "integrity": "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "freebsd" + "netbsd" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz", - "integrity": "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, "optional": true, "os": [ - "freebsd" + "openbsd" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz", - "integrity": "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "linux" + "sunos" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz", - "integrity": "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz", - "integrity": "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz", - "integrity": "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==", + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ - "loong64" + "x64" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz", - "integrity": "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==", - "cpu": [ - "mips64el" - ], + "node_modules/@inquirer/checkbox": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.11.tgz", + "integrity": "sha512-pCt02FZNLX9u8j/42n6iJyJnInbrvrygOfX+Fc4TcASbNRwNUcvhjxR2t49AdlmiO8oXAT3GhFH1T+2GpZPCfw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@inquirer/confirm": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.11.tgz", + "integrity": "sha512-3wWw10VPxQP279FO4bzWsf8YjIAq7NdwATJ4xS2h1uwsXZu/RmtOVV95rZ7yllS1h/dzu+uLewjMAzNDEj8h2w==", + "dev": true, + "dependencies": { + "@inquirer/core": "^8.2.4", + "@inquirer/type": "^1.3.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-8.2.4.tgz", + "integrity": "sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.3", + "@inquirer/type": "^1.3.3", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.9", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "picocolors": "^1.0.1", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@inquirer/editor": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.15.tgz", + "integrity": "sha512-UmtZnY36rGLS/4cCzvdRmk0xxsGgH2AsF0v1SSlBZ3C5JK/Bxm2gNW8fmUVzQ5vm8kpdWASXPapbUx4iV49ScA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@inquirer/expand": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.15.tgz", + "integrity": "sha512-aBnnrBw9vbFJROUlDCsbq8H/plX6JHfPwLmSphxaVqOR+b1hgLdw+oRhZkpcJhG2AZOlc8IKzGdZhji93gQg4w==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/expand/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.4.tgz", + "integrity": "sha512-R7Gsg6elpuqdn55fBH2y9oYzrU/yKrSmIsDX4ROT51vohrECFzTf2zw9BfUbOW8xjfmM2QbVoVYdTwhrtEKWSQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.2.tgz", + "integrity": "sha512-VjkzYSVH0606nLi9HHiSb4QYs2idwRgneiMoFoTAIwQ1Qwx6OIDugOYLtLta3gP8AWZx7qUvgDtj+/SJuiiKuQ==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz", - "integrity": "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==", - "cpu": [ - "ppc64" - ], + "node_modules/@inquirer/password": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.1.15.tgz", + "integrity": "sha512-/JmiTtIcSYbZdPucEW5q2rhC71vGKPivm3LFqNDQEI6lJyffq7hlfKKFC+R1Qp19dMqkaG+O5L1XmcHpmlAUUQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz", - "integrity": "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==", - "cpu": [ - "riscv64" - ], + "node_modules/@inquirer/password/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz", - "integrity": "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==", - "cpu": [ - "s390x" - ], + "node_modules/@inquirer/password/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz", - "integrity": "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==", - "cpu": [ - "x64" - ], + "node_modules/@inquirer/prompts": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.0.7.tgz", + "integrity": "sha512-GFcigCxJTKCH3aECzMIu4FhgLJWnFvMXzpI4CCSoELWFtkOOU2P+goYA61+OKpGrB8fPE7q6n8zAXBSlZRrHjQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@inquirer/checkbox": "^2.3.7", + "@inquirer/confirm": "^3.1.11", + "@inquirer/editor": "^2.1.11", + "@inquirer/expand": "^2.1.11", + "@inquirer/input": "^2.1.11", + "@inquirer/password": "^2.1.11", + "@inquirer/rawlist": "^2.1.11", + "@inquirer/select": "^2.3.7" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz", - "integrity": "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==", - "cpu": [ - "x64" - ], + "node_modules/@inquirer/rawlist": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.1.15.tgz", + "integrity": "sha512-zwU6aWDMyuQNiY5Z0iYXkxi7pliRFXqUmiS7vG6lAGxqcbOSptYgIxGJnd3AU4Y91N0Tbt57+koJL0S2p6vSkA==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz", - "integrity": "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==", - "cpu": [ - "x64" - ], + "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz", - "integrity": "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==", - "cpu": [ - "x64" - ], + "node_modules/@inquirer/rawlist/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz", - "integrity": "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/select": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.3.11.tgz", + "integrity": "sha512-DebGErUSCyzwIP2zx3hs1X4TAzxSl/yNHzuYGE6KFkHq3ubg+5dJZacFxN1C1eBkJvQ0XBWGpY6MTzHsJbxkpw==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz", - "integrity": "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==", - "cpu": [ - "ia32" - ], + "node_modules/@inquirer/select/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz", - "integrity": "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==", - "cpu": [ - "x64" - ], + "node_modules/@inquirer/select/node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "node_modules/@inquirer/type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.0.tgz", + "integrity": "sha512-L/UdayX9Z1lLN+itoTKqJ/X4DX5DaWu2Sruwt4XgZzMNv32x4qllbzMX4MbJlz0yxAQtU19UvABGOjmdq1u3qA==", "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, "engines": { "node": ">=18" } @@ -3922,22 +3361,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3990,9 +3413,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -4044,9 +3467,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.1.3.tgz", - "integrity": "sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", "dev": true, "engines": { "node": ">=10.0" @@ -4065,22 +3488,25 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.13.tgz", + "integrity": "sha512-nAl6teTt7EWSjttNavAnv3uFR3w3vPP3OTYmHyPNHzKhAj2NoBDHmbS3MGpvvO8KXXPASnHjEGrrKrdKTMKPnQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "@inquirer/type": "^1.3.3" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 6" } }, "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.8.tgz", - "integrity": "sha512-+lFwFvU+zQ9zVIFETNtmW++syh3Ps5JS8MPQ8zOYtQZoU+dTR8ivWHTaE2QVk1JG2payGDLUAvpndLAjGMdeeA==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.12.tgz", + "integrity": "sha512-vgTwzNUD3Hy4aqtGhX2+nV/usI0mwy3hDRuTjs8VcK0BLiMVEpNQXgzwlWEgPmA8AAPloUgyOs2nK5clJF5oIg==", "cpu": [ "arm64" ], @@ -4091,9 +3517,9 @@ ] }, "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.8.tgz", - "integrity": "sha512-T98rfsgfdQMS5/mqdsPb6oHSJ+iBYNa+PQDLtXLh6rzTEBsYP9x2uXxIj6VS4qXVDWXVi8rv85NCOG+UBOsHXQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.12.tgz", + "integrity": "sha512-qOt0hAhj2ZLY6aEWu85rzt5zcyCAQITMhCMEPNlo1tuYekpVAdkQNiwXxEkCjBYvwTskvXuwXOOUpjuSc+aJnA==", "cpu": [ "x64" ], @@ -4104,9 +3530,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.8.tgz", - "integrity": "sha512-gVNCi3bYWatdPMeFpFjuZl6bzVL55FkeZU3sPeU+NsMRXC+Zl3qOx3M6cM4OMlJWbhHjYjf2b8q83K0mczaiWQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.12.tgz", + "integrity": "sha512-Ggd/UXpE+alMncbELCXA3OKpDj9bDBR3qVO7WRTxstloDglRAHfZmUJgTkeaNKjFO1JHqS7AKy0jba9XebZB1w==", "cpu": [ "arm" ], @@ -4117,9 +3543,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.8.tgz", - "integrity": "sha512-uEBGCQIChsixpykL0pjCxfF64btv64vzsb1NoM5u0qvabKvKEvErhXGoqovyldDu9u1T/fswD8Kf6ih0vJEvDQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.12.tgz", + "integrity": "sha512-Qy4cFXFe9h1wAWMsojex8x1ifvw2kqiZv686YiRTdQEzAfc3vJASHFcD/QejHUCx7YHMYdnUoCS45rG2AiGDTQ==", "cpu": [ "arm64" ], @@ -4130,9 +3556,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.8.tgz", - "integrity": "sha512-6v0B4sa9ulNezmDZtVpLjNHmA0qZzUl3001YJ2RF0naxsuv/Jq/xEwNYpOzfcdizHfpCE0oBkWzk/r+Slr+0zw==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.12.tgz", + "integrity": "sha512-c+noT9IofktxktFllKHFmci8ka2SYGSLN17pj/KSl1hg7mmfAiGp4xxFxEwMLTb+SX95vP1DFiR++1I3WLVxvA==", "cpu": [ "x64" ], @@ -4143,9 +3569,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.8.tgz", - "integrity": "sha512-lDLGRIMqdwYD39vinwNqqZUxCdL2m2iIdn+0HyQgIHEiT0g5rIAlzaMKzoGWon5NQumfxXFk9y0DarttkR7C1w==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz", + "integrity": "sha512-CO3MFV8gUx16NU/CyyuumAKblESwvoGVA2XhQKZ976OTOxaTbb8F8D3f0iiZ4MYqsN74jIrFuCmXpPnpjbhfOQ==", "cpu": [ "x64" ], @@ -4156,9 +3582,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], @@ -4169,9 +3595,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", "cpu": [ "x64" ], @@ -4182,9 +3608,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", "cpu": [ "arm" ], @@ -4195,9 +3621,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", "cpu": [ "arm64" ], @@ -4208,9 +3634,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", "cpu": [ "x64" ], @@ -4221,9 +3647,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", "cpu": [ "x64" ], @@ -4234,9 +3660,9 @@ ] }, "node_modules/@ngtools/webpack": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.0.2.tgz", - "integrity": "sha512-I+ZNFGBnykUWBwGPCXy6m9R2fIX/ovnAUHylvThYd/M+FUfc+Z/3DpKEUBYIOLVCLNZR5nuK0t9QLlazYhWFgg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.1.0.tgz", + "integrity": "sha512-J4ATDGq0AubLbP3DOFRjp0pDBvSgzjtiu5l1hGq3xf6AzVAEmZFlp2Ac2EykuK2r8XDnCVoLrxICJOXZWWzP2g==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -4245,7 +3671,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^18.0.0", - "typescript": ">=5.4 <5.5", + "typescript": ">=5.4 <5.6", "webpack": "^5.54.0" } }, @@ -4301,13 +3727,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/fs": { "version": "3.1.1", @@ -4322,12 +3745,13 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -4350,13 +3774,10 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/git/node_modules/which": { "version": "4.0.0", @@ -4426,31 +3847,29 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@npmcli/package-json/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4767,14 +4186,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.2.tgz", - "integrity": "sha512-qkJs1oxHtneJ6QxDKpxNyneXGDM9SKVj+Bgi8xUAU3FEzpsYmE/aW3MfwYHOZl0pDBO8c2raqLvlyl3dGP6/Gg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.1.0.tgz", + "integrity": "sha512-k9Dy6JD7hqvCzDqnMjDm7J8H/P6m5mLuX2yEgQWKRAJ/YMINtBQAaKA1T9qXk97kEX6RNLpHMuDIsrIfK/H31Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "jsonc-parser": "3.2.1" + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "jsonc-parser": "3.3.1" }, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -4856,6 +4275,18 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -4918,9 +4349,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5024,9 +4455,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -5068,10 +4499,19 @@ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "16.18.98", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.98.tgz", - "integrity": "sha512-fpiC20NvLpTLAzo3oVBKIqBGR6Fx/8oAK/SSf7G+fydnXMY1x4x9RZ6sBXhqKlCU21g2QapUsbLlhv3+a7wS+Q==", + "version": "16.18.102", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.102.tgz", + "integrity": "sha512-eSe2YwGCcRjqPidxfm20IAq02krERWcIIJW4FNPkU0zQLbc4L9pvhsmB0p6UJecjEf0j/E2ERHsKq7madvthKw==", "dev": true }, "node_modules/@types/node-forge": { @@ -5152,10 +4592,16 @@ "@types/node": "*" } }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.11", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.11.tgz", + "integrity": "sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==", "dev": true, "dependencies": { "@types/node": "*" @@ -5348,9 +4794,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -5359,20 +4805,23 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -5439,9 +4888,9 @@ } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -5572,13 +5021,10 @@ "dev": true }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/array-flatten": { "version": "1.1.1", @@ -5709,22 +5155,6 @@ "webpack": ">=5" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", @@ -5971,9 +5401,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "dev": true, "funding": [ { @@ -5990,10 +5420,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -6100,9 +5530,9 @@ } }, "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -6132,40 +5562,35 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6215,9 +5640,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001628", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", - "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "dev": true, "funding": [ { @@ -6312,15 +5737,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -6335,6 +5763,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -6391,6 +5835,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6645,20 +6118,20 @@ } }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "dependencies": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -6743,6 +6216,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/copyfiles/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/copyfiles/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/copyfiles/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/copyfiles/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6845,24 +6347,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -6870,9 +6354,9 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", - "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -6984,9 +6468,9 @@ } }, "node_modules/css-loader": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.1.tgz", - "integrity": "sha512-OxIR5P2mjO1PSXk44bWuQ8XtMK4dpEqpIyERCx3ewOo3I8EmbcxMPUc5ScLtQfgXtOojoMv57So4V/C02HQLsw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", @@ -7181,12 +6665,15 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/del": { @@ -7295,18 +6782,6 @@ "node": ">=0.3.1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -7415,15 +6890,15 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", - "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", + "version": "1.4.829", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz", + "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==", "dev": true }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/emojis-list": { @@ -7468,9 +6943,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -7482,16 +6957,16 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7511,10 +6986,16 @@ } }, "node_modules/ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/entities": { "version": "4.5.0", @@ -7587,9 +7068,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es6-promise": { @@ -7608,9 +7089,9 @@ } }, "node_modules/esbuild": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz", - "integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -7620,35 +7101,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.3", - "@esbuild/android-arm": "0.21.3", - "@esbuild/android-arm64": "0.21.3", - "@esbuild/android-x64": "0.21.3", - "@esbuild/darwin-arm64": "0.21.3", - "@esbuild/darwin-x64": "0.21.3", - "@esbuild/freebsd-arm64": "0.21.3", - "@esbuild/freebsd-x64": "0.21.3", - "@esbuild/linux-arm": "0.21.3", - "@esbuild/linux-arm64": "0.21.3", - "@esbuild/linux-ia32": "0.21.3", - "@esbuild/linux-loong64": "0.21.3", - "@esbuild/linux-mips64el": "0.21.3", - "@esbuild/linux-ppc64": "0.21.3", - "@esbuild/linux-riscv64": "0.21.3", - "@esbuild/linux-s390x": "0.21.3", - "@esbuild/linux-x64": "0.21.3", - "@esbuild/netbsd-x64": "0.21.3", - "@esbuild/openbsd-x64": "0.21.3", - "@esbuild/sunos-x64": "0.21.3", - "@esbuild/win32-arm64": "0.21.3", - "@esbuild/win32-ia32": "0.21.3", - "@esbuild/win32-x64": "0.21.3" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/esbuild-wasm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.21.3.tgz", - "integrity": "sha512-DMOV+eeVra0yVq3XIojfczdEQsz+RiFnpEj7lqs8Gux9mlTpN7yIbw0a4KzLspn0Uhw6UVEH3nUAidSqc/rcQg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.21.5.tgz", + "integrity": "sha512-L/FlOPMMFtw+6qPAbuPvJXdrOYOp9yx/PEwSrIZW0qghY4vgV003evdYDwqQ/9ENMQI0B6RMod9xT4FHtto6OQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -7694,19 +7175,6 @@ "node": ">=8.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7793,6 +7261,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -8053,16 +7527,19 @@ } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { @@ -8101,9 +7578,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -8116,18 +7593,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -8255,6 +7720,18 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -8274,15 +7751,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -8353,19 +7821,20 @@ } }, "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8531,13 +8000,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/hpack.js": { "version": "2.1.6", @@ -8731,9 +8197,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -8836,9 +8302,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -8891,15 +8357,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -8936,52 +8393,14 @@ "dev": true }, "node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer": { - "version": "9.2.22", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", - "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.2", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -8995,12 +8414,6 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, "node_modules/ipaddr.js": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", @@ -9029,27 +8442,30 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9065,12 +8481,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -9091,28 +8510,13 @@ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, + "is-docker": "^3.0.0" + }, "bin": { - "is-docker": "cli.js" + "is-inside-container": "cli.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9248,15 +8652,18 @@ "dev": true }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { @@ -9308,28 +8715,19 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dev": true, "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=10" } }, "node_modules/istanbul-lib-report": { @@ -9404,16 +8802,13 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -9516,9 +8911,9 @@ } }, "node_modules/jiti": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.3.tgz", - "integrity": "sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, "bin": { "jiti": "bin/jiti.js" @@ -9531,13 +8926,12 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -9601,9 +8995,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "node_modules/jsonfile": { @@ -9751,6 +9145,31 @@ "node": ">=10.0.0" } }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/karma-jasmine": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", @@ -9836,6 +9255,21 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/karma/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -9857,6 +9291,20 @@ "node": ">=0.10.0" } }, + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/karma/node_modules/tmp": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", @@ -9920,9 +9368,9 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -10070,16 +9518,95 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listr2": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", + "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/lmdb": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.8.tgz", - "integrity": "sha512-9rp8JT4jPhCRJUL7vRARa2N06OLSYzLwQsEkhC6Qu5XbcLyM/XBLMzDlgS/K7l7c5CdURLdDk9uE+hPFIogHTQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.12.tgz", + "integrity": "sha512-JnoEulTgveoC64vlYJ9sufGLuNkk6TcxSYpKxSC9aM42I61jIv3pQH0fgb6qW7HV0+FNqA3g1WCQQYfhfawGoQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "msgpackr": "^1.9.9", + "msgpackr": "^1.10.2", "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.1.1", + "node-gyp-build-optional-packages": "5.2.2", "ordered-binary": "^1.4.1", "weak-lru-cache": "^1.2.2" }, @@ -10087,12 +9614,12 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.8", - "@lmdb/lmdb-darwin-x64": "3.0.8", - "@lmdb/lmdb-linux-arm": "3.0.8", - "@lmdb/lmdb-linux-arm64": "3.0.8", - "@lmdb/lmdb-linux-x64": "3.0.8", - "@lmdb/lmdb-win32-x64": "3.0.8" + "@lmdb/lmdb-darwin-arm64": "3.0.12", + "@lmdb/lmdb-darwin-x64": "3.0.12", + "@lmdb/lmdb-linux-arm": "3.0.12", + "@lmdb/lmdb-linux-arm64": "3.0.12", + "@lmdb/lmdb-linux-x64": "3.0.12", + "@lmdb/lmdb-win32-x64": "3.0.12" } }, "node_modules/loader-runner": { @@ -10105,24 +9632,27 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, "engines": { "node": ">= 12.13.0" } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -10147,80 +9677,198 @@ "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", + "dev": true, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "get-east-asian-width": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/log4js": { @@ -10311,14 +9959,14 @@ } }, "node_modules/memfs": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.2.tgz", - "integrity": "sha512-f16coDZlTG1jskq3mxarwB+fGRrd0uXWt+o1WIhRfOwbXQZqUDsTVxQBFK9JjRQHblg8eAG2JSbprDXKjc7ijQ==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", + "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", "dev": true, "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", "@jsonjoy.com/util": "^1.1.2", - "sonic-forest": "^1.0.0", + "tree-dump": "^1.0.1", "tslib": "^2.0.0" }, "engines": { @@ -10541,34 +10189,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -10688,46 +10308,34 @@ "dev": true }, "node_modules/msgpackr": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", - "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", "dev": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" + "node-gyp-build-optional-packages": "5.2.2" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, "node_modules/multicast-dns": { @@ -10853,9 +10461,9 @@ } }, "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -10864,9 +10472,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -10889,9 +10497,9 @@ } }, "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", - "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, "dependencies": { "detect-libc": "^2.0.1" @@ -10912,23 +10520,21 @@ } }, "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -10943,9 +10549,9 @@ } }, "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -10957,15 +10563,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/node-gyp/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -10982,9 +10579,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/noms": { @@ -11013,13 +10610,12 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -11121,16 +10717,16 @@ } }, "node_modules/npm-registry-fetch": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.0.1.tgz", - "integrity": "sha512-fLu9MTdZTlJAHUek/VLklE6EpIiP3VZpTiuN7OOMCt2Sd67NCpSEetMaxHHEZiZxllp8ZLsUpvbEszqTFEc+wA==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, "dependencies": { "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" @@ -11182,10 +10778,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11242,17 +10841,18 @@ } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11312,6 +10912,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -11339,6 +10951,25 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11367,30 +10998,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -11443,6 +11077,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pacote": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", @@ -11573,12 +11213,12 @@ } }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { @@ -11628,13 +11268,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -11643,12 +11280,15 @@ "dev": true }, "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/performance-now": { @@ -11686,119 +11326,49 @@ }, "node_modules/pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/piscina": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz", - "integrity": "sha512-iBaLWI56PFP81cfBSomWTmhOo9W2/yhIOL+Tk8O1vBCpK39cM0tGxB+wgYjG31qq4ohGvysfXSdnj8h7g4rZxA==", - "dev": true, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "dependencies": { - "p-locate": "^6.0.0" + "pinkie": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "nice-napi": "^1.0.2" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, "dependencies": { - "p-limit": "^4.0.0" + "find-up": "^6.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -11924,9 +11494,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -12073,6 +11643,82 @@ "node": ">=8" } }, + "node_modules/protractor/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/protractor/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/protractor/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/protractor/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -12091,6 +11737,41 @@ "source-map": "^0.5.6" } }, + "node_modules/protractor/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/protractor/node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -12189,18 +11870,16 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true }, "node_modules/q": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, "engines": { "node": ">=0.6.0", @@ -12492,12 +12171,12 @@ } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/resolve-url-loader": { @@ -12540,18 +12219,27 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -12572,9 +12260,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { @@ -12640,15 +12328,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12707,9 +12386,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", - "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -13177,10 +12856,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sigstore": { "version": "2.3.1", @@ -13200,17 +12885,45 @@ } }, "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -13240,13 +12953,13 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "dependencies": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "node_modules/socket.io-parser": { @@ -13297,36 +13010,17 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/sonic-forest": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sonic-forest/-/sonic-forest-1.0.3.tgz", - "integrity": "sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, - "dependencies": { - "tree-dump": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" }, - "peerDependencies": { - "tslib": "2" + "engines": { + "node": ">= 14" } }, "node_modules/source-map": { @@ -13484,9 +13178,9 @@ } }, "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true }, "node_modules/sshpk": { @@ -13562,17 +13256,20 @@ "dev": true }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -13590,6 +13287,48 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -13723,9 +13462,9 @@ "dev": true }, "node_modules/terser": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", - "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13823,20 +13562,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -13956,10 +13681,19 @@ "node": ">=0.8" } }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/tree-dump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", - "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, "engines": { "node": ">=10.0" @@ -14093,9 +13827,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -14129,9 +13863,9 @@ } }, "node_modules/undici": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.0.tgz", - "integrity": "sha512-nT8jjv/fE9Et1ilR6QoW8ingRTY2Pp4l2RUrdzV5Yz35RJDrtPc1DXvuNqcpsJSGIRHFdt3YKKktTzJA6r0fTA==", + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", + "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", "dev": true, "engines": { "node": ">=18.17" @@ -14141,9 +13875,7 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -14185,6 +13917,18 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -14237,9 +13981,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -14275,6 +14019,15 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -14522,9 +14275,9 @@ } }, "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -14533,10 +14286,10 @@ "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", + "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -14665,36 +14418,22 @@ "balanced-match": "^1.0.0" } }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -14723,25 +14462,10 @@ } } }, - "node_modules/webpack-dev-server/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-dev-server/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -14753,28 +14477,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.9.tgz", + "integrity": "sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -14783,33 +14489,12 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14.18" + "node": "14 >=14.20 || 16 >=16.20 || >=18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", @@ -15021,6 +14706,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -15054,6 +14768,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -15061,16 +14804,16 @@ "dev": true }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -15154,6 +14897,35 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -15164,9 +14936,9 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "engines": { "node": ">=12.20" @@ -15175,10 +14947,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==" + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" } } } diff --git a/adev/src/content/tutorials/homepage/package-lock.json b/adev/src/content/tutorials/homepage/package-lock.json index 3fcc03dc9d4b..a2c15fe72e0f 100644 --- a/adev/src/content/tutorials/homepage/package-lock.json +++ b/adev/src/content/tutorials/homepage/package-lock.json @@ -21,7 +21,7 @@ "@angular/build": "^18.0.1", "@angular/cli": "^18.0.0", "@angular/compiler-cli": "^18.0.0", - "typescript": "~5.4.0" + "typescript": "~5.5.0" } }, "node_modules/@ampproject/remapping": { @@ -38,12 +38,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1800.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.2.tgz", - "integrity": "sha512-PX7lCTAqWe9C40+fie+DAc8vhpGA+JgZKWWrMHUTV/iZx8RXx2X4xGQsqYu36p4i3MSfQdbn+0xLWGmjScPVOQ==", + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz", + "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", + "@angular-devkit/core": "18.1.0", "rxjs": "7.8.1" }, "engines": { @@ -53,14 +53,14 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.2.tgz", - "integrity": "sha512-QXcEdfmODc0rKblBerk30yw70fypIkFm6gQBLJgsshpwc+TMA+fuMLcPQebOTzKLtD2tNUkk/7SrWPQIGqeXaA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", "dev": true, "dependencies": { - "ajv": "8.13.0", + "ajv": "8.16.0", "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", + "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" @@ -80,13 +80,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.2.tgz", - "integrity": "sha512-G9yGcoB67sH0eRNWoiQWNn2KwiI7sDasVscYPGKf1yo7JRiXmzX/LpfKRPsZTl+Bs0FItnwDInsqgMisK89/6g==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.1.0.tgz", + "integrity": "sha512-BjrYutLfYFiPOSEcLBWCj3ENkwDn8gMfBSJesaBz7OrZBZGK5j0dVgBLIsGTP96TKo4o4vszJQOvS4AtV6xMGg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "jsonc-parser": "3.2.1", + "@angular-devkit/core": "18.1.0", + "jsonc-parser": "3.3.1", "magic-string": "0.30.10", "ora": "5.4.1", "rxjs": "7.8.1" @@ -98,35 +98,37 @@ } }, "node_modules/@angular/build": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.2.tgz", - "integrity": "sha512-iPPHdAJ3LiR8t/+39xjvrqMWcTmRrfphzKxXoIVDcswQjVQIk00EYuxinC6EVa7dSKDl1thk1MeCNZ9DIjaAvQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.1.0.tgz", + "integrity": "sha512-4yLrGqMDoNBis2Z4s8F3wSqlB2XLtwy/10tREBk9xVaCojERiwDvtHqzbMeHqD6ZMGDFtdhI12q8FT5jZVUmAw==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.2", - "@babel/core": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", + "@angular-devkit/architect": "0.1801.0", + "@babel/core": "7.24.7", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.11", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "browserslist": "^4.23.0", - "critters": "0.0.22", - "esbuild": "0.21.3", + "critters": "0.0.24", + "esbuild": "0.21.5", "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "lmdb": "3.0.8", + "https-proxy-agent": "7.0.5", + "lmdb": "3.0.12", "magic-string": "0.30.10", "mrmime": "2.0.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.5.0", - "sass": "1.77.2", + "piscina": "4.6.1", + "rollup": "4.18.0", + "sass": "1.77.6", "semver": "7.6.2", - "undici": "6.18.0", - "vite": "5.2.11", + "undici": "6.19.2", + "vite": "5.3.2", "watchpack": "2.4.1" }, "engines": { @@ -142,7 +144,7 @@ "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "@angular/localize": { @@ -166,23 +168,23 @@ } }, "node_modules/@angular/cli": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.2.tgz", - "integrity": "sha512-shrxMD1bcWWh7WpBN3KTV+Lt8E62gURSUFhs6kdGLepMDif8LPAv45+hpt8SBU9VfQuL6AHa4cW8uDL9BKGlYA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", + "integrity": "sha512-2E+b7S/736AOmxf5je9OWoPpgPY240TfJfFXwQiVvq/4KyC+ZR9lBrqRx72Xghn8nu3z8Q2BPZIXVGZppl0USQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1800.2", - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "@schematics/angular": "18.0.2", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "@inquirer/prompts": "5.0.7", + "@listr2/prompt-adapter-inquirer": "2.0.13", + "@schematics/angular": "18.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.2", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.3", "npm-package-arg": "11.0.2", "npm-pick-manifest": "9.0.1", - "ora": "5.4.1", "pacote": "18.0.6", "resolve": "1.22.8", "semver": "7.6.2", @@ -199,32 +201,32 @@ } }, "node_modules/@angular/common": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.1.tgz", - "integrity": "sha512-iADQC5m4fvk+VNXEoU1KR93b0eG218/GuNdzUNVJHcjxdFxPshKk5fiaGSosUCxXPRQOxDKzmS9EDang87E/Ew==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.1.0.tgz", + "integrity": "sha512-noHDLarQSCZZh7hyNd0HR61Fut+q4QCVq9qc/jKPglfbV/6nPujQSmSpT+rNJlNuBOrCLuvH/CNBNbiqii+x3g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1", + "@angular/core": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.1.tgz", - "integrity": "sha512-zyG/ifCtN0drAuwz0oV6LtzTiDREsM1Ay7eJW9wTvp3NCv06goHLtHXX12eFfZQWJViBv924lyRDSWdZN7r3GQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.1.0.tgz", + "integrity": "sha512-JRQzVTeJGSfRLY+dx+gwu/hPQVB8K+5pW12Z42M9x/HBgGW4in0cO2zHkeQPvImqm0nak82Us1Hyf5C+qTlMMQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1" + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -233,12 +235,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.1.tgz", - "integrity": "sha512-Aoz70+/o8R2lG2EGDAYbj6yu2B7kqa/9loYEwG0fECJTtXoRBP+bEGpUxMmxOb59tMDnbIhBHmNPPEQVTXvgSQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.1.0.tgz", + "integrity": "sha512-BBsogLPJwxkPh7f8RVHsxyyqNE8XpHbAanjB5fAwnU4W6Sw1kR5rFzkeZM3xaRm2MDiC8DovIl6hlf+s/mKYOw==", "dev": true, "dependencies": { - "@babel/core": "7.24.4", + "@babel/core": "7.24.7", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -253,67 +255,22 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.0.1", - "typescript": ">=5.4 <5.5" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@angular/compiler": "18.1.0", + "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.1.tgz", - "integrity": "sha512-Db1livvugoLdLsWww5IqUS5v+yUN7/5Rj0trZv9BgxIuoNtoipfLqKHwZWpumH3yI5Ucu+UH9zZ1mlGyF0Kexw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.1.0.tgz", + "integrity": "sha512-/57/s7CD/0CwlN+3FlhVmx7ypCWXjKi5UKtnlBAUg0D1denIf6ADxwTHFZABYZcYBqOTJgeQUtUw9u/A+0CIlg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", @@ -321,36 +278,36 @@ } }, "node_modules/@angular/forms": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.1.tgz", - "integrity": "sha512-j1nUzwnZHO/BRXK0joQbAV10JWxeRVKmPzIaDulY2o28Er1jVKyw2T8EwI+xSvBbAqyJyaAd+ysWUhm3FfH+GA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.1.0.tgz", + "integrity": "sha512-m+7m9wa+n5dEacd458eSZsZTz0B+HbOtr7/uqM0YTMQaPrhwl1epG5Y103mB6yr00JiJcLNlPLjP888cHFjldQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.1", - "@angular/core": "18.0.1", - "@angular/platform-browser": "18.0.1", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0", + "@angular/platform-browser": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.1.tgz", - "integrity": "sha512-rQUsOxZxiwSPvyHdne60IKIGsvFoVc1rO4mDyXU+9sCCLmPKHzNyEzp7vybTZeiqa3k6v3sV/bfHWwrRzmvenw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz", + "integrity": "sha512-jCmxthiI4Zef54crckNht60xwfIsuciGeyZvb7SsXna2maLW9fA4uz1VhZqIWTiBnHwNynVlyfBX3/jBD7S9+g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.0.1", - "@angular/common": "18.0.1", - "@angular/core": "18.0.1" + "@angular/animations": "18.1.0", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -372,30 +329,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -426,12 +383,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -441,26 +398,26 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -528,9 +485,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -546,14 +503,11 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, "engines": { "node": ">=6.9.0" } @@ -572,21 +526,21 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -602,22 +556,22 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, "dependencies": { "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -639,9 +593,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -650,6 +604,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", @@ -665,19 +634,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", + "@babel/generator": "^7.24.8", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -685,25 +654,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -712,9 +669,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz", - "integrity": "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -728,9 +685,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.3.tgz", - "integrity": "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -744,9 +701,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz", - "integrity": "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -760,9 +717,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.3.tgz", - "integrity": "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -776,9 +733,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz", - "integrity": "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -792,9 +749,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz", - "integrity": "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -808,9 +765,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz", - "integrity": "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -824,9 +781,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz", - "integrity": "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -840,9 +797,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz", - "integrity": "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -856,9 +813,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz", - "integrity": "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -872,9 +829,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz", - "integrity": "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -888,9 +845,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz", - "integrity": "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -904,9 +861,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz", - "integrity": "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -920,9 +877,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz", - "integrity": "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -936,9 +893,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz", - "integrity": "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -952,9 +909,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz", - "integrity": "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -968,9 +925,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz", - "integrity": "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -984,9 +941,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz", - "integrity": "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1000,9 +957,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz", - "integrity": "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1016,9 +973,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz", - "integrity": "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1032,9 +989,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz", - "integrity": "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1048,9 +1005,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz", - "integrity": "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1064,9 +1021,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz", - "integrity": "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1079,189 +1036,529 @@ "node": ">=12" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "node_modules/@inquirer/checkbox": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.11.tgz", + "integrity": "sha512-pCt02FZNLX9u8j/42n6iJyJnInbrvrygOfX+Fc4TcASbNRwNUcvhjxR2t49AdlmiO8oXAT3GhFH1T+2GpZPCfw==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { "node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@inquirer/confirm": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.11.tgz", + "integrity": "sha512-3wWw10VPxQP279FO4bzWsf8YjIAq7NdwATJ4xS2h1uwsXZu/RmtOVV95rZ7yllS1h/dzu+uLewjMAzNDEj8h2w==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/core": "^8.2.4", + "@inquirer/type": "^1.3.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@inquirer/core": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-8.2.4.tgz", + "integrity": "sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/figures": "^1.0.3", + "@inquirer/type": "^1.3.3", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.9", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "picocolors": "^1.0.1", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@inquirer/editor": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.15.tgz", + "integrity": "sha512-UmtZnY36rGLS/4cCzvdRmk0xxsGgH2AsF0v1SSlBZ3C5JK/Bxm2gNW8fmUVzQ5vm8kpdWASXPapbUx4iV49ScA==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "external-editor": "^3.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@inquirer/editor/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@inquirer/expand": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.15.tgz", + "integrity": "sha512-aBnnrBw9vbFJROUlDCsbq8H/plX6JHfPwLmSphxaVqOR+b1hgLdw+oRhZkpcJhG2AZOlc8IKzGdZhji93gQg4w==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@inquirer/expand/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@inquirer/figures": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.4.tgz", + "integrity": "sha512-R7Gsg6elpuqdn55fBH2y9oYzrU/yKrSmIsDX4ROT51vohrECFzTf2zw9BfUbOW8xjfmM2QbVoVYdTwhrtEKWSQ==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@inquirer/input": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.2.tgz", + "integrity": "sha512-VjkzYSVH0606nLi9HHiSb4QYs2idwRgneiMoFoTAIwQ1Qwx6OIDugOYLtLta3gP8AWZx7qUvgDtj+/SJuiiKuQ==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@inquirer/input/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "node_modules/@inquirer/password": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.1.15.tgz", + "integrity": "sha512-/JmiTtIcSYbZdPucEW5q2rhC71vGKPivm3LFqNDQEI6lJyffq7hlfKKFC+R1Qp19dMqkaG+O5L1XmcHpmlAUUQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.8.tgz", - "integrity": "sha512-+lFwFvU+zQ9zVIFETNtmW++syh3Ps5JS8MPQ8zOYtQZoU+dTR8ivWHTaE2QVk1JG2payGDLUAvpndLAjGMdeeA==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/password/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.8.tgz", - "integrity": "sha512-T98rfsgfdQMS5/mqdsPb6oHSJ+iBYNa+PQDLtXLh6rzTEBsYP9x2uXxIj6VS4qXVDWXVi8rv85NCOG+UBOsHXQ==", - "cpu": [ + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.0.7.tgz", + "integrity": "sha512-GFcigCxJTKCH3aECzMIu4FhgLJWnFvMXzpI4CCSoELWFtkOOU2P+goYA61+OKpGrB8fPE7q6n8zAXBSlZRrHjQ==", + "dev": true, + "dependencies": { + "@inquirer/checkbox": "^2.3.7", + "@inquirer/confirm": "^3.1.11", + "@inquirer/editor": "^2.1.11", + "@inquirer/expand": "^2.1.11", + "@inquirer/input": "^2.1.11", + "@inquirer/password": "^2.1.11", + "@inquirer/rawlist": "^2.1.11", + "@inquirer/select": "^2.3.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.1.15.tgz", + "integrity": "sha512-zwU6aWDMyuQNiY5Z0iYXkxi7pliRFXqUmiS7vG6lAGxqcbOSptYgIxGJnd3AU4Y91N0Tbt57+koJL0S2p6vSkA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.3.11.tgz", + "integrity": "sha512-DebGErUSCyzwIP2zx3hs1X4TAzxSl/yNHzuYGE6KFkHq3ubg+5dJZacFxN1C1eBkJvQ0XBWGpY6MTzHsJbxkpw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.0.tgz", + "integrity": "sha512-L/UdayX9Z1lLN+itoTKqJ/X4DX5DaWu2Sruwt4XgZzMNv32x4qllbzMX4MbJlz0yxAQtU19UvABGOjmdq1u3qA==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.13.tgz", + "integrity": "sha512-nAl6teTt7EWSjttNavAnv3uFR3w3vPP3OTYmHyPNHzKhAj2NoBDHmbS3MGpvvO8KXXPASnHjEGrrKrdKTMKPnQ==", + "dev": true, + "dependencies": { + "@inquirer/type": "^1.3.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 6" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.12.tgz", + "integrity": "sha512-vgTwzNUD3Hy4aqtGhX2+nV/usI0mwy3hDRuTjs8VcK0BLiMVEpNQXgzwlWEgPmA8AAPloUgyOs2nK5clJF5oIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.12.tgz", + "integrity": "sha512-qOt0hAhj2ZLY6aEWu85rzt5zcyCAQITMhCMEPNlo1tuYekpVAdkQNiwXxEkCjBYvwTskvXuwXOOUpjuSc+aJnA==", + "cpu": [ "x64" ], "dev": true, @@ -1271,9 +1568,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.8.tgz", - "integrity": "sha512-gVNCi3bYWatdPMeFpFjuZl6bzVL55FkeZU3sPeU+NsMRXC+Zl3qOx3M6cM4OMlJWbhHjYjf2b8q83K0mczaiWQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.12.tgz", + "integrity": "sha512-Ggd/UXpE+alMncbELCXA3OKpDj9bDBR3qVO7WRTxstloDglRAHfZmUJgTkeaNKjFO1JHqS7AKy0jba9XebZB1w==", "cpu": [ "arm" ], @@ -1284,9 +1581,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.8.tgz", - "integrity": "sha512-uEBGCQIChsixpykL0pjCxfF64btv64vzsb1NoM5u0qvabKvKEvErhXGoqovyldDu9u1T/fswD8Kf6ih0vJEvDQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.12.tgz", + "integrity": "sha512-Qy4cFXFe9h1wAWMsojex8x1ifvw2kqiZv686YiRTdQEzAfc3vJASHFcD/QejHUCx7YHMYdnUoCS45rG2AiGDTQ==", "cpu": [ "arm64" ], @@ -1297,9 +1594,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.8.tgz", - "integrity": "sha512-6v0B4sa9ulNezmDZtVpLjNHmA0qZzUl3001YJ2RF0naxsuv/Jq/xEwNYpOzfcdizHfpCE0oBkWzk/r+Slr+0zw==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.12.tgz", + "integrity": "sha512-c+noT9IofktxktFllKHFmci8ka2SYGSLN17pj/KSl1hg7mmfAiGp4xxFxEwMLTb+SX95vP1DFiR++1I3WLVxvA==", "cpu": [ "x64" ], @@ -1310,9 +1607,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.8.tgz", - "integrity": "sha512-lDLGRIMqdwYD39vinwNqqZUxCdL2m2iIdn+0HyQgIHEiT0g5rIAlzaMKzoGWon5NQumfxXFk9y0DarttkR7C1w==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz", + "integrity": "sha512-CO3MFV8gUx16NU/CyyuumAKblESwvoGVA2XhQKZ976OTOxaTbb8F8D3f0iiZ4MYqsN74jIrFuCmXpPnpjbhfOQ==", "cpu": [ "x64" ], @@ -1323,9 +1620,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], @@ -1336,9 +1633,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", "cpu": [ "x64" ], @@ -1349,9 +1646,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", "cpu": [ "arm" ], @@ -1362,9 +1659,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", "cpu": [ "arm64" ], @@ -1375,9 +1672,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", "cpu": [ "x64" ], @@ -1388,9 +1685,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", "cpu": [ "x64" ], @@ -1452,13 +1749,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/fs": { "version": "3.1.1", @@ -1473,12 +1767,13 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -1492,13 +1787,10 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/installed-package-contents": { "version": "2.1.0", @@ -1800,14 +2092,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.2.tgz", - "integrity": "sha512-qkJs1oxHtneJ6QxDKpxNyneXGDM9SKVj+Bgi8xUAU3FEzpsYmE/aW3MfwYHOZl0pDBO8c2raqLvlyl3dGP6/Gg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.1.0.tgz", + "integrity": "sha512-k9Dy6JD7hqvCzDqnMjDm7J8H/P6m5mLuX2yEgQWKRAJ/YMINtBQAaKA1T9qXk97kEX6RNLpHMuDIsrIfK/H31Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "jsonc-parser": "3.2.1" + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "jsonc-parser": "3.3.1" }, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -1917,6 +2209,30 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", @@ -1970,9 +2286,9 @@ } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2149,9 +2465,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "dev": true, "funding": [ { @@ -2168,10 +2484,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2205,9 +2521,9 @@ } }, "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -2228,37 +2544,15 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001628", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", - "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "dev": true, "funding": [ { @@ -2338,15 +2632,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -2361,6 +2658,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -2417,6 +2730,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -2458,6 +2800,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2465,9 +2813,9 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", - "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -2641,23 +2989,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -2729,15 +3060,15 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", - "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", + "version": "1.4.829", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz", + "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==", "dev": true }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/encoding": { @@ -2790,31 +3121,10 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz", - "integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -2824,29 +3134,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.3", - "@esbuild/android-arm": "0.21.3", - "@esbuild/android-arm64": "0.21.3", - "@esbuild/android-x64": "0.21.3", - "@esbuild/darwin-arm64": "0.21.3", - "@esbuild/darwin-x64": "0.21.3", - "@esbuild/freebsd-arm64": "0.21.3", - "@esbuild/freebsd-x64": "0.21.3", - "@esbuild/linux-arm": "0.21.3", - "@esbuild/linux-arm64": "0.21.3", - "@esbuild/linux-ia32": "0.21.3", - "@esbuild/linux-loong64": "0.21.3", - "@esbuild/linux-mips64el": "0.21.3", - "@esbuild/linux-ppc64": "0.21.3", - "@esbuild/linux-riscv64": "0.21.3", - "@esbuild/linux-s390x": "0.21.3", - "@esbuild/linux-x64": "0.21.3", - "@esbuild/netbsd-x64": "0.21.3", - "@esbuild/openbsd-x64": "0.21.3", - "@esbuild/sunos-x64": "0.21.3", - "@esbuild/win32-arm64": "0.21.3", - "@esbuild/win32-ia32": "0.21.3", - "@esbuild/win32-x64": "0.21.3" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -2867,6 +3177,12 @@ "node": ">=0.8.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -2931,9 +3247,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -2999,43 +3315,34 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -3067,18 +3374,6 @@ "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3094,42 +3389,6 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3155,13 +3414,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -3202,9 +3458,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -3289,52 +3545,14 @@ "dev": true }, "node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer": { - "version": "9.2.22", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", - "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.2", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -3361,12 +3579,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3382,12 +3603,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -3448,16 +3672,13 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -3517,9 +3738,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "node_modules/jsonparse": { @@ -3531,16 +3752,89 @@ "node >= 0.2.0" ] }, + "node_modules/listr2": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", + "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/lmdb": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.8.tgz", - "integrity": "sha512-9rp8JT4jPhCRJUL7vRARa2N06OLSYzLwQsEkhC6Qu5XbcLyM/XBLMzDlgS/K7l7c5CdURLdDk9uE+hPFIogHTQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.12.tgz", + "integrity": "sha512-JnoEulTgveoC64vlYJ9sufGLuNkk6TcxSYpKxSC9aM42I61jIv3pQH0fgb6qW7HV0+FNqA3g1WCQQYfhfawGoQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "msgpackr": "^1.9.9", + "msgpackr": "^1.10.2", "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.1.1", + "node-gyp-build-optional-packages": "5.2.2", "ordered-binary": "^1.4.1", "weak-lru-cache": "^1.2.2" }, @@ -3548,19 +3842,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.8", - "@lmdb/lmdb-darwin-x64": "3.0.8", - "@lmdb/lmdb-linux-arm": "3.0.8", - "@lmdb/lmdb-linux-arm64": "3.0.8", - "@lmdb/lmdb-linux-x64": "3.0.8", - "@lmdb/lmdb-win32-x64": "3.0.8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "@lmdb/lmdb-darwin-arm64": "3.0.12", + "@lmdb/lmdb-darwin-x64": "3.0.12", + "@lmdb/lmdb-linux-arm": "3.0.12", + "@lmdb/lmdb-linux-arm64": "3.0.12", + "@lmdb/lmdb-linux-x64": "3.0.12", + "@lmdb/lmdb-win32-x64": "3.0.12" + } }, "node_modules/log-symbols": { "version": "4.1.0", @@ -3648,21 +3936,139 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, @@ -3733,9 +4139,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -3815,34 +4221,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -3962,46 +4340,34 @@ "dev": true }, "node_modules/msgpackr": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", - "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", "dev": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" + "node-gyp-build-optional-packages": "5.2.2" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, "node_modules/mute-stream": { @@ -4069,9 +4435,9 @@ "dev": true }, "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -4080,9 +4446,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -4105,9 +4471,9 @@ } }, "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", - "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, "dependencies": { "detect-libc": "^2.0.1" @@ -4118,19 +4484,10 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/nopt": { @@ -4149,13 +4506,12 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -4248,16 +4604,16 @@ } }, "node_modules/npm-registry-fetch": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.0.1.tgz", - "integrity": "sha512-fLu9MTdZTlJAHUek/VLklE6EpIiP3VZpTiuN7OOMCt2Sd67NCpSEetMaxHHEZiZxllp8ZLsUpvbEszqTFEc+wA==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, "dependencies": { "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" @@ -4347,6 +4703,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4374,6 +4742,25 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4416,6 +4803,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pacote": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", @@ -4517,13 +4910,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/picocolors": { "version": "1.0.1", @@ -4544,18 +4934,18 @@ } }, "node_modules/piscina": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz", - "integrity": "sha512-iBaLWI56PFP81cfBSomWTmhOo9W2/yhIOL+Tk8O1vBCpK39cM0tGxB+wgYjG31qq4ohGvysfXSdnj8h7g4rZxA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", "dev": true, "optionalDependencies": { "nice-napi": "^1.0.2" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -4573,7 +4963,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -4723,16 +5113,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/signal-exit": { @@ -4760,6 +5153,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/rollup": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", @@ -4795,15 +5194,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4862,9 +5252,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", - "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -4890,23 +5280,6 @@ "node": ">=10" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4957,6 +5330,34 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -4982,14 +5383,14 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -5073,17 +5474,20 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -5101,32 +5505,74 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", + "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/supports-color": { + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -5280,9 +5726,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5293,14 +5739,20 @@ } }, "node_modules/undici": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.0.tgz", - "integrity": "sha512-nT8jjv/fE9Et1ilR6QoW8ingRTY2Pp4l2RUrdzV5Yz35RJDrtPc1DXvuNqcpsJSGIRHFdt3YKKktTzJA6r0fTA==", + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", + "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", "dev": true, "engines": { "node": ">=18.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -5326,9 +5778,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -5390,12 +5842,12 @@ } }, "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, @@ -5444,412 +5896,6 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -5958,6 +6004,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -5991,6 +6066,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6033,10 +6137,51 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==" + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" } } } diff --git a/adev/src/content/tutorials/learn-angular/common/package-lock.json b/adev/src/content/tutorials/learn-angular/common/package-lock.json index 01ea956cc70c..388e5c57d833 100644 --- a/adev/src/content/tutorials/learn-angular/common/package-lock.json +++ b/adev/src/content/tutorials/learn-angular/common/package-lock.json @@ -22,7 +22,7 @@ "@angular/build": "^18.0.1", "@angular/cli": "^18.0.0", "@angular/compiler-cli": "^18.0.0", - "typescript": "~5.4.0" + "typescript": "~5.5.0" } }, "node_modules/@ampproject/remapping": { @@ -39,12 +39,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1800.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.2.tgz", - "integrity": "sha512-PX7lCTAqWe9C40+fie+DAc8vhpGA+JgZKWWrMHUTV/iZx8RXx2X4xGQsqYu36p4i3MSfQdbn+0xLWGmjScPVOQ==", + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz", + "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", + "@angular-devkit/core": "18.1.0", "rxjs": "7.8.1" }, "engines": { @@ -54,14 +54,14 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.2.tgz", - "integrity": "sha512-QXcEdfmODc0rKblBerk30yw70fypIkFm6gQBLJgsshpwc+TMA+fuMLcPQebOTzKLtD2tNUkk/7SrWPQIGqeXaA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", "dev": true, "dependencies": { - "ajv": "8.13.0", + "ajv": "8.16.0", "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", + "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" @@ -81,13 +81,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.2.tgz", - "integrity": "sha512-G9yGcoB67sH0eRNWoiQWNn2KwiI7sDasVscYPGKf1yo7JRiXmzX/LpfKRPsZTl+Bs0FItnwDInsqgMisK89/6g==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.1.0.tgz", + "integrity": "sha512-BjrYutLfYFiPOSEcLBWCj3ENkwDn8gMfBSJesaBz7OrZBZGK5j0dVgBLIsGTP96TKo4o4vszJQOvS4AtV6xMGg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "jsonc-parser": "3.2.1", + "@angular-devkit/core": "18.1.0", + "jsonc-parser": "3.3.1", "magic-string": "0.30.10", "ora": "5.4.1", "rxjs": "7.8.1" @@ -99,35 +99,37 @@ } }, "node_modules/@angular/build": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.2.tgz", - "integrity": "sha512-iPPHdAJ3LiR8t/+39xjvrqMWcTmRrfphzKxXoIVDcswQjVQIk00EYuxinC6EVa7dSKDl1thk1MeCNZ9DIjaAvQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.1.0.tgz", + "integrity": "sha512-4yLrGqMDoNBis2Z4s8F3wSqlB2XLtwy/10tREBk9xVaCojERiwDvtHqzbMeHqD6ZMGDFtdhI12q8FT5jZVUmAw==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.2", - "@babel/core": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", + "@angular-devkit/architect": "0.1801.0", + "@babel/core": "7.24.7", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.11", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "browserslist": "^4.23.0", - "critters": "0.0.22", - "esbuild": "0.21.3", + "critters": "0.0.24", + "esbuild": "0.21.5", "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "lmdb": "3.0.8", + "https-proxy-agent": "7.0.5", + "lmdb": "3.0.12", "magic-string": "0.30.10", "mrmime": "2.0.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.5.0", - "sass": "1.77.2", + "piscina": "4.6.1", + "rollup": "4.18.0", + "sass": "1.77.6", "semver": "7.6.2", - "undici": "6.18.0", - "vite": "5.2.11", + "undici": "6.19.2", + "vite": "5.3.2", "watchpack": "2.4.1" }, "engines": { @@ -143,7 +145,7 @@ "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "@angular/localize": { @@ -167,23 +169,23 @@ } }, "node_modules/@angular/cli": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.2.tgz", - "integrity": "sha512-shrxMD1bcWWh7WpBN3KTV+Lt8E62gURSUFhs6kdGLepMDif8LPAv45+hpt8SBU9VfQuL6AHa4cW8uDL9BKGlYA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", + "integrity": "sha512-2E+b7S/736AOmxf5je9OWoPpgPY240TfJfFXwQiVvq/4KyC+ZR9lBrqRx72Xghn8nu3z8Q2BPZIXVGZppl0USQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1800.2", - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "@schematics/angular": "18.0.2", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "@inquirer/prompts": "5.0.7", + "@listr2/prompt-adapter-inquirer": "2.0.13", + "@schematics/angular": "18.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.2", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.3", "npm-package-arg": "11.0.2", "npm-pick-manifest": "9.0.1", - "ora": "5.4.1", "pacote": "18.0.6", "resolve": "1.22.8", "semver": "7.6.2", @@ -200,32 +202,32 @@ } }, "node_modules/@angular/common": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.1.tgz", - "integrity": "sha512-iADQC5m4fvk+VNXEoU1KR93b0eG218/GuNdzUNVJHcjxdFxPshKk5fiaGSosUCxXPRQOxDKzmS9EDang87E/Ew==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.1.0.tgz", + "integrity": "sha512-noHDLarQSCZZh7hyNd0HR61Fut+q4QCVq9qc/jKPglfbV/6nPujQSmSpT+rNJlNuBOrCLuvH/CNBNbiqii+x3g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1", + "@angular/core": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.1.tgz", - "integrity": "sha512-zyG/ifCtN0drAuwz0oV6LtzTiDREsM1Ay7eJW9wTvp3NCv06goHLtHXX12eFfZQWJViBv924lyRDSWdZN7r3GQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.1.0.tgz", + "integrity": "sha512-JRQzVTeJGSfRLY+dx+gwu/hPQVB8K+5pW12Z42M9x/HBgGW4in0cO2zHkeQPvImqm0nak82Us1Hyf5C+qTlMMQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1" + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -234,12 +236,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.1.tgz", - "integrity": "sha512-Aoz70+/o8R2lG2EGDAYbj6yu2B7kqa/9loYEwG0fECJTtXoRBP+bEGpUxMmxOb59tMDnbIhBHmNPPEQVTXvgSQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.1.0.tgz", + "integrity": "sha512-BBsogLPJwxkPh7f8RVHsxyyqNE8XpHbAanjB5fAwnU4W6Sw1kR5rFzkeZM3xaRm2MDiC8DovIl6hlf+s/mKYOw==", "dev": true, "dependencies": { - "@babel/core": "7.24.4", + "@babel/core": "7.24.7", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -254,67 +256,22 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.0.1", - "typescript": ">=5.4 <5.5" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@angular/compiler": "18.1.0", + "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.1.tgz", - "integrity": "sha512-Db1livvugoLdLsWww5IqUS5v+yUN7/5Rj0trZv9BgxIuoNtoipfLqKHwZWpumH3yI5Ucu+UH9zZ1mlGyF0Kexw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.1.0.tgz", + "integrity": "sha512-/57/s7CD/0CwlN+3FlhVmx7ypCWXjKi5UKtnlBAUg0D1denIf6ADxwTHFZABYZcYBqOTJgeQUtUw9u/A+0CIlg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", @@ -322,36 +279,36 @@ } }, "node_modules/@angular/forms": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.1.tgz", - "integrity": "sha512-j1nUzwnZHO/BRXK0joQbAV10JWxeRVKmPzIaDulY2o28Er1jVKyw2T8EwI+xSvBbAqyJyaAd+ysWUhm3FfH+GA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.1.0.tgz", + "integrity": "sha512-m+7m9wa+n5dEacd458eSZsZTz0B+HbOtr7/uqM0YTMQaPrhwl1epG5Y103mB6yr00JiJcLNlPLjP888cHFjldQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.1", - "@angular/core": "18.0.1", - "@angular/platform-browser": "18.0.1", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0", + "@angular/platform-browser": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.1.tgz", - "integrity": "sha512-rQUsOxZxiwSPvyHdne60IKIGsvFoVc1rO4mDyXU+9sCCLmPKHzNyEzp7vybTZeiqa3k6v3sV/bfHWwrRzmvenw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz", + "integrity": "sha512-jCmxthiI4Zef54crckNht60xwfIsuciGeyZvb7SsXna2maLW9fA4uz1VhZqIWTiBnHwNynVlyfBX3/jBD7S9+g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.0.1", - "@angular/common": "18.0.1", - "@angular/core": "18.0.1" + "@angular/animations": "18.1.0", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -360,19 +317,19 @@ } }, "node_modules/@angular/router": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.1.tgz", - "integrity": "sha512-PapdvfATjRZI0cJ/RH8n/ixHDHa4HIBaOMwhgU73InU9t6NIhBXg6aRECYV2qGt7NtpLYSHmG5Z1Ws86rm5Tyw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.1.0.tgz", + "integrity": "sha512-dl2cSxZkl4we+rWMxdm123TZzlor6yxwNFI2yT7b6DP2i+rXaaHBSSPet0ASp+UX6djz+Osr56Bifs6wi4rhiQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.1", - "@angular/core": "18.0.1", - "@angular/platform-browser": "18.0.1", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0", + "@angular/platform-browser": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -390,30 +347,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -444,12 +401,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -459,26 +416,26 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -546,9 +503,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -564,14 +521,11 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, "engines": { "node": ">=6.9.0" } @@ -590,21 +544,21 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -620,22 +574,22 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, "dependencies": { "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -657,9 +611,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -668,6 +622,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", @@ -683,19 +652,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", + "@babel/generator": "^7.24.8", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -703,25 +672,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -730,9 +687,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz", - "integrity": "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -746,9 +703,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.3.tgz", - "integrity": "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -762,9 +719,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz", - "integrity": "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -778,9 +735,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.3.tgz", - "integrity": "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -794,9 +751,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz", - "integrity": "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -810,9 +767,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz", - "integrity": "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -826,9 +783,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz", - "integrity": "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -842,9 +799,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz", - "integrity": "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -858,9 +815,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz", - "integrity": "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -874,9 +831,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz", - "integrity": "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -890,9 +847,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz", - "integrity": "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -906,9 +863,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz", - "integrity": "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -922,9 +879,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz", - "integrity": "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -938,9 +895,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz", - "integrity": "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -954,9 +911,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz", - "integrity": "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -970,9 +927,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz", - "integrity": "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -986,9 +943,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz", - "integrity": "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -1002,9 +959,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz", - "integrity": "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1018,9 +975,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz", - "integrity": "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1034,9 +991,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz", - "integrity": "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1050,9 +1007,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz", - "integrity": "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1066,9 +1023,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz", - "integrity": "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1082,9 +1039,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz", - "integrity": "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1097,189 +1054,529 @@ "node": ">=12" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "node_modules/@inquirer/checkbox": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.11.tgz", + "integrity": "sha512-pCt02FZNLX9u8j/42n6iJyJnInbrvrygOfX+Fc4TcASbNRwNUcvhjxR2t49AdlmiO8oXAT3GhFH1T+2GpZPCfw==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { "node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@inquirer/confirm": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.11.tgz", + "integrity": "sha512-3wWw10VPxQP279FO4bzWsf8YjIAq7NdwATJ4xS2h1uwsXZu/RmtOVV95rZ7yllS1h/dzu+uLewjMAzNDEj8h2w==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/core": "^8.2.4", + "@inquirer/type": "^1.3.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@inquirer/core": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-8.2.4.tgz", + "integrity": "sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/figures": "^1.0.3", + "@inquirer/type": "^1.3.3", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.9", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "picocolors": "^1.0.1", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@inquirer/editor": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.15.tgz", + "integrity": "sha512-UmtZnY36rGLS/4cCzvdRmk0xxsGgH2AsF0v1SSlBZ3C5JK/Bxm2gNW8fmUVzQ5vm8kpdWASXPapbUx4iV49ScA==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "external-editor": "^3.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@inquirer/editor/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@inquirer/expand": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.15.tgz", + "integrity": "sha512-aBnnrBw9vbFJROUlDCsbq8H/plX6JHfPwLmSphxaVqOR+b1hgLdw+oRhZkpcJhG2AZOlc8IKzGdZhji93gQg4w==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@inquirer/expand/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@inquirer/figures": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.4.tgz", + "integrity": "sha512-R7Gsg6elpuqdn55fBH2y9oYzrU/yKrSmIsDX4ROT51vohrECFzTf2zw9BfUbOW8xjfmM2QbVoVYdTwhrtEKWSQ==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@inquirer/input": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.2.tgz", + "integrity": "sha512-VjkzYSVH0606nLi9HHiSb4QYs2idwRgneiMoFoTAIwQ1Qwx6OIDugOYLtLta3gP8AWZx7qUvgDtj+/SJuiiKuQ==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@inquirer/input/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "node_modules/@inquirer/password": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.1.15.tgz", + "integrity": "sha512-/JmiTtIcSYbZdPucEW5q2rhC71vGKPivm3LFqNDQEI6lJyffq7hlfKKFC+R1Qp19dMqkaG+O5L1XmcHpmlAUUQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.8.tgz", - "integrity": "sha512-+lFwFvU+zQ9zVIFETNtmW++syh3Ps5JS8MPQ8zOYtQZoU+dTR8ivWHTaE2QVk1JG2payGDLUAvpndLAjGMdeeA==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/password/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.8.tgz", - "integrity": "sha512-T98rfsgfdQMS5/mqdsPb6oHSJ+iBYNa+PQDLtXLh6rzTEBsYP9x2uXxIj6VS4qXVDWXVi8rv85NCOG+UBOsHXQ==", - "cpu": [ + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.0.7.tgz", + "integrity": "sha512-GFcigCxJTKCH3aECzMIu4FhgLJWnFvMXzpI4CCSoELWFtkOOU2P+goYA61+OKpGrB8fPE7q6n8zAXBSlZRrHjQ==", + "dev": true, + "dependencies": { + "@inquirer/checkbox": "^2.3.7", + "@inquirer/confirm": "^3.1.11", + "@inquirer/editor": "^2.1.11", + "@inquirer/expand": "^2.1.11", + "@inquirer/input": "^2.1.11", + "@inquirer/password": "^2.1.11", + "@inquirer/rawlist": "^2.1.11", + "@inquirer/select": "^2.3.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.1.15.tgz", + "integrity": "sha512-zwU6aWDMyuQNiY5Z0iYXkxi7pliRFXqUmiS7vG6lAGxqcbOSptYgIxGJnd3AU4Y91N0Tbt57+koJL0S2p6vSkA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.3.11.tgz", + "integrity": "sha512-DebGErUSCyzwIP2zx3hs1X4TAzxSl/yNHzuYGE6KFkHq3ubg+5dJZacFxN1C1eBkJvQ0XBWGpY6MTzHsJbxkpw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.0.tgz", + "integrity": "sha512-L/UdayX9Z1lLN+itoTKqJ/X4DX5DaWu2Sruwt4XgZzMNv32x4qllbzMX4MbJlz0yxAQtU19UvABGOjmdq1u3qA==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.13.tgz", + "integrity": "sha512-nAl6teTt7EWSjttNavAnv3uFR3w3vPP3OTYmHyPNHzKhAj2NoBDHmbS3MGpvvO8KXXPASnHjEGrrKrdKTMKPnQ==", + "dev": true, + "dependencies": { + "@inquirer/type": "^1.3.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 6" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.12.tgz", + "integrity": "sha512-vgTwzNUD3Hy4aqtGhX2+nV/usI0mwy3hDRuTjs8VcK0BLiMVEpNQXgzwlWEgPmA8AAPloUgyOs2nK5clJF5oIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.12.tgz", + "integrity": "sha512-qOt0hAhj2ZLY6aEWu85rzt5zcyCAQITMhCMEPNlo1tuYekpVAdkQNiwXxEkCjBYvwTskvXuwXOOUpjuSc+aJnA==", + "cpu": [ "x64" ], "dev": true, @@ -1289,9 +1586,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.8.tgz", - "integrity": "sha512-gVNCi3bYWatdPMeFpFjuZl6bzVL55FkeZU3sPeU+NsMRXC+Zl3qOx3M6cM4OMlJWbhHjYjf2b8q83K0mczaiWQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.12.tgz", + "integrity": "sha512-Ggd/UXpE+alMncbELCXA3OKpDj9bDBR3qVO7WRTxstloDglRAHfZmUJgTkeaNKjFO1JHqS7AKy0jba9XebZB1w==", "cpu": [ "arm" ], @@ -1302,9 +1599,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.8.tgz", - "integrity": "sha512-uEBGCQIChsixpykL0pjCxfF64btv64vzsb1NoM5u0qvabKvKEvErhXGoqovyldDu9u1T/fswD8Kf6ih0vJEvDQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.12.tgz", + "integrity": "sha512-Qy4cFXFe9h1wAWMsojex8x1ifvw2kqiZv686YiRTdQEzAfc3vJASHFcD/QejHUCx7YHMYdnUoCS45rG2AiGDTQ==", "cpu": [ "arm64" ], @@ -1315,9 +1612,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.8.tgz", - "integrity": "sha512-6v0B4sa9ulNezmDZtVpLjNHmA0qZzUl3001YJ2RF0naxsuv/Jq/xEwNYpOzfcdizHfpCE0oBkWzk/r+Slr+0zw==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.12.tgz", + "integrity": "sha512-c+noT9IofktxktFllKHFmci8ka2SYGSLN17pj/KSl1hg7mmfAiGp4xxFxEwMLTb+SX95vP1DFiR++1I3WLVxvA==", "cpu": [ "x64" ], @@ -1328,9 +1625,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.8.tgz", - "integrity": "sha512-lDLGRIMqdwYD39vinwNqqZUxCdL2m2iIdn+0HyQgIHEiT0g5rIAlzaMKzoGWon5NQumfxXFk9y0DarttkR7C1w==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz", + "integrity": "sha512-CO3MFV8gUx16NU/CyyuumAKblESwvoGVA2XhQKZ976OTOxaTbb8F8D3f0iiZ4MYqsN74jIrFuCmXpPnpjbhfOQ==", "cpu": [ "x64" ], @@ -1341,9 +1638,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], @@ -1354,9 +1651,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", "cpu": [ "x64" ], @@ -1367,9 +1664,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", "cpu": [ "arm" ], @@ -1380,9 +1677,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", "cpu": [ "arm64" ], @@ -1393,9 +1690,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", "cpu": [ "x64" ], @@ -1406,9 +1703,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", "cpu": [ "x64" ], @@ -1470,13 +1767,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/fs": { "version": "3.1.1", @@ -1491,12 +1785,13 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -1510,13 +1805,10 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/installed-package-contents": { "version": "2.1.0", @@ -1818,14 +2110,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.2.tgz", - "integrity": "sha512-qkJs1oxHtneJ6QxDKpxNyneXGDM9SKVj+Bgi8xUAU3FEzpsYmE/aW3MfwYHOZl0pDBO8c2raqLvlyl3dGP6/Gg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.1.0.tgz", + "integrity": "sha512-k9Dy6JD7hqvCzDqnMjDm7J8H/P6m5mLuX2yEgQWKRAJ/YMINtBQAaKA1T9qXk97kEX6RNLpHMuDIsrIfK/H31Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "jsonc-parser": "3.2.1" + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "jsonc-parser": "3.3.1" }, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -1935,6 +2227,30 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", @@ -1988,9 +2304,9 @@ } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2167,9 +2483,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "dev": true, "funding": [ { @@ -2186,10 +2502,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2223,9 +2539,9 @@ } }, "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -2246,37 +2562,15 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001628", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", - "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "dev": true, "funding": [ { @@ -2356,15 +2650,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -2379,6 +2676,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -2435,6 +2748,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -2476,6 +2818,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2483,9 +2831,9 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", - "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -2659,23 +3007,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -2747,15 +3078,15 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", - "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", + "version": "1.4.829", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz", + "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==", "dev": true }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/encoding": { @@ -2808,31 +3139,10 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz", - "integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -2842,29 +3152,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.3", - "@esbuild/android-arm": "0.21.3", - "@esbuild/android-arm64": "0.21.3", - "@esbuild/android-x64": "0.21.3", - "@esbuild/darwin-arm64": "0.21.3", - "@esbuild/darwin-x64": "0.21.3", - "@esbuild/freebsd-arm64": "0.21.3", - "@esbuild/freebsd-x64": "0.21.3", - "@esbuild/linux-arm": "0.21.3", - "@esbuild/linux-arm64": "0.21.3", - "@esbuild/linux-ia32": "0.21.3", - "@esbuild/linux-loong64": "0.21.3", - "@esbuild/linux-mips64el": "0.21.3", - "@esbuild/linux-ppc64": "0.21.3", - "@esbuild/linux-riscv64": "0.21.3", - "@esbuild/linux-s390x": "0.21.3", - "@esbuild/linux-x64": "0.21.3", - "@esbuild/netbsd-x64": "0.21.3", - "@esbuild/openbsd-x64": "0.21.3", - "@esbuild/sunos-x64": "0.21.3", - "@esbuild/win32-arm64": "0.21.3", - "@esbuild/win32-ia32": "0.21.3", - "@esbuild/win32-x64": "0.21.3" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -2885,6 +3195,12 @@ "node": ">=0.8.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -2949,9 +3265,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -3017,43 +3333,34 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -3085,18 +3392,6 @@ "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3112,42 +3407,6 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -3173,13 +3432,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -3220,9 +3476,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -3307,52 +3563,14 @@ "dev": true }, "node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer": { - "version": "9.2.22", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", - "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.2", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -3379,12 +3597,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3400,12 +3621,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -3466,16 +3690,13 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -3535,9 +3756,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "node_modules/jsonparse": { @@ -3549,16 +3770,89 @@ "node >= 0.2.0" ] }, + "node_modules/listr2": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", + "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/lmdb": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.8.tgz", - "integrity": "sha512-9rp8JT4jPhCRJUL7vRARa2N06OLSYzLwQsEkhC6Qu5XbcLyM/XBLMzDlgS/K7l7c5CdURLdDk9uE+hPFIogHTQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.12.tgz", + "integrity": "sha512-JnoEulTgveoC64vlYJ9sufGLuNkk6TcxSYpKxSC9aM42I61jIv3pQH0fgb6qW7HV0+FNqA3g1WCQQYfhfawGoQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "msgpackr": "^1.9.9", + "msgpackr": "^1.10.2", "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.1.1", + "node-gyp-build-optional-packages": "5.2.2", "ordered-binary": "^1.4.1", "weak-lru-cache": "^1.2.2" }, @@ -3566,19 +3860,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.8", - "@lmdb/lmdb-darwin-x64": "3.0.8", - "@lmdb/lmdb-linux-arm": "3.0.8", - "@lmdb/lmdb-linux-arm64": "3.0.8", - "@lmdb/lmdb-linux-x64": "3.0.8", - "@lmdb/lmdb-win32-x64": "3.0.8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "@lmdb/lmdb-darwin-arm64": "3.0.12", + "@lmdb/lmdb-darwin-x64": "3.0.12", + "@lmdb/lmdb-linux-arm": "3.0.12", + "@lmdb/lmdb-linux-arm64": "3.0.12", + "@lmdb/lmdb-linux-x64": "3.0.12", + "@lmdb/lmdb-win32-x64": "3.0.12" + } }, "node_modules/log-symbols": { "version": "4.1.0", @@ -3666,21 +3954,139 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, @@ -3751,9 +4157,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -3833,34 +4239,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -3980,46 +4358,34 @@ "dev": true }, "node_modules/msgpackr": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", - "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", "dev": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" + "node-gyp-build-optional-packages": "5.2.2" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, "node_modules/mute-stream": { @@ -4087,9 +4453,9 @@ "dev": true }, "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -4098,9 +4464,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -4123,9 +4489,9 @@ } }, "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", - "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, "dependencies": { "detect-libc": "^2.0.1" @@ -4136,19 +4502,10 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/nopt": { @@ -4167,13 +4524,12 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -4266,16 +4622,16 @@ } }, "node_modules/npm-registry-fetch": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.0.1.tgz", - "integrity": "sha512-fLu9MTdZTlJAHUek/VLklE6EpIiP3VZpTiuN7OOMCt2Sd67NCpSEetMaxHHEZiZxllp8ZLsUpvbEszqTFEc+wA==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, "dependencies": { "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" @@ -4365,6 +4721,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4392,6 +4760,25 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4434,6 +4821,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pacote": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", @@ -4535,13 +4928,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/picocolors": { "version": "1.0.1", @@ -4562,18 +4952,18 @@ } }, "node_modules/piscina": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz", - "integrity": "sha512-iBaLWI56PFP81cfBSomWTmhOo9W2/yhIOL+Tk8O1vBCpK39cM0tGxB+wgYjG31qq4ohGvysfXSdnj8h7g4rZxA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", "dev": true, "optionalDependencies": { "nice-napi": "^1.0.2" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -4591,7 +4981,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -4741,16 +5131,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/signal-exit": { @@ -4778,6 +5171,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/rollup": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", @@ -4813,15 +5212,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -4880,9 +5270,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.77.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", - "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -4908,23 +5298,6 @@ "node": ">=10" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4975,6 +5348,34 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -5000,14 +5401,14 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -5091,17 +5492,20 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -5119,32 +5523,74 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", + "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/supports-color": { + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -5298,9 +5744,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5311,14 +5757,20 @@ } }, "node_modules/undici": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.0.tgz", - "integrity": "sha512-nT8jjv/fE9Et1ilR6QoW8ingRTY2Pp4l2RUrdzV5Yz35RJDrtPc1DXvuNqcpsJSGIRHFdt3YKKktTzJA6r0fTA==", + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", + "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", "dev": true, "engines": { "node": ">=18.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -5344,9 +5796,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -5408,12 +5860,12 @@ } }, "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, @@ -5462,412 +5914,6 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -5976,6 +6022,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6009,6 +6084,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6051,10 +6155,51 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==" + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" } } } diff --git a/adev/src/content/tutorials/playground/common/package-lock.json b/adev/src/content/tutorials/playground/common/package-lock.json index adec3bed516b..afad63518a56 100644 --- a/adev/src/content/tutorials/playground/common/package-lock.json +++ b/adev/src/content/tutorials/playground/common/package-lock.json @@ -24,7 +24,7 @@ "@angular/build": "^18.0.1", "@angular/cli": "^18.0.0", "@angular/compiler-cli": "^18.0.0", - "typescript": "~5.4.0" + "typescript": "~5.5.0" } }, "node_modules/@ampproject/remapping": { @@ -41,12 +41,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1800.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.2.tgz", - "integrity": "sha512-PX7lCTAqWe9C40+fie+DAc8vhpGA+JgZKWWrMHUTV/iZx8RXx2X4xGQsqYu36p4i3MSfQdbn+0xLWGmjScPVOQ==", + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz", + "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", + "@angular-devkit/core": "18.1.0", "rxjs": "7.8.1" }, "engines": { @@ -56,14 +56,14 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.2.tgz", - "integrity": "sha512-QXcEdfmODc0rKblBerk30yw70fypIkFm6gQBLJgsshpwc+TMA+fuMLcPQebOTzKLtD2tNUkk/7SrWPQIGqeXaA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", "dev": true, "dependencies": { - "ajv": "8.13.0", + "ajv": "8.16.0", "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", + "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" @@ -83,13 +83,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.2.tgz", - "integrity": "sha512-G9yGcoB67sH0eRNWoiQWNn2KwiI7sDasVscYPGKf1yo7JRiXmzX/LpfKRPsZTl+Bs0FItnwDInsqgMisK89/6g==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.1.0.tgz", + "integrity": "sha512-BjrYutLfYFiPOSEcLBWCj3ENkwDn8gMfBSJesaBz7OrZBZGK5j0dVgBLIsGTP96TKo4o4vszJQOvS4AtV6xMGg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "jsonc-parser": "3.2.1", + "@angular-devkit/core": "18.1.0", + "jsonc-parser": "3.3.1", "magic-string": "0.30.10", "ora": "5.4.1", "rxjs": "7.8.1" @@ -101,49 +101,51 @@ } }, "node_modules/@angular/animations": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.1.tgz", - "integrity": "sha512-QAY/oxfuFY2Bjr3foniWlLAiddXHu8879lZvXHt1NVOsiav+vD15IEEQsnuQbJPy/EHEnAlUh9UptB4zQIBp/Q==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.1.0.tgz", + "integrity": "sha512-K0BhvZ/SIVoGXZVuh1KOJDdgcGlHfFGMGrs58utndndAb+gYXReMfz4GR5cQs2OObH6TKmIOY2EH7Og1CY2tsw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1" + "@angular/core": "18.1.0" } }, "node_modules/@angular/build": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.2.tgz", - "integrity": "sha512-iPPHdAJ3LiR8t/+39xjvrqMWcTmRrfphzKxXoIVDcswQjVQIk00EYuxinC6EVa7dSKDl1thk1MeCNZ9DIjaAvQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.1.0.tgz", + "integrity": "sha512-4yLrGqMDoNBis2Z4s8F3wSqlB2XLtwy/10tREBk9xVaCojERiwDvtHqzbMeHqD6ZMGDFtdhI12q8FT5jZVUmAw==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.2", - "@babel/core": "7.24.5", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.24.5", + "@angular-devkit/architect": "0.1801.0", + "@babel/core": "7.24.7", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.11", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "browserslist": "^4.23.0", - "critters": "0.0.22", - "esbuild": "0.21.3", + "critters": "0.0.24", + "esbuild": "0.21.5", "fast-glob": "3.3.2", - "https-proxy-agent": "7.0.4", - "inquirer": "9.2.22", - "lmdb": "3.0.8", + "https-proxy-agent": "7.0.5", + "lmdb": "3.0.12", "magic-string": "0.30.10", "mrmime": "2.0.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", "picomatch": "4.0.2", - "piscina": "4.5.0", - "sass": "1.77.2", + "piscina": "4.6.1", + "rollup": "4.18.0", + "sass": "1.77.6", "semver": "7.6.2", - "undici": "6.18.0", - "vite": "5.2.11", + "undici": "6.19.2", + "vite": "5.3.2", "watchpack": "2.4.1" }, "engines": { @@ -159,7 +161,7 @@ "less": "^4.2.0", "postcss": "^8.4.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=5.4 <5.5" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "@angular/localize": { @@ -183,9 +185,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.0.1.tgz", - "integrity": "sha512-2fCqX1sz5cM+LncO6ak4EU2ZBm8MWitv5V53go3Iz5dOVOdrvysBt8smEkWZ4nvEKkFYHEPpQo0YlxEWbuTEmA==", + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.1.1.tgz", + "integrity": "sha512-IaDjvRUgAoKnEeafrnBX+hjTR+1M3O3fV3AybBCjN4NuiPtuyOJiTMg0cTv6RbluJ/SenbT4MQq3tMpOsa9i4w==", "dependencies": { "tslib": "^2.3.0" }, @@ -199,23 +201,23 @@ } }, "node_modules/@angular/cli": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.2.tgz", - "integrity": "sha512-shrxMD1bcWWh7WpBN3KTV+Lt8E62gURSUFhs6kdGLepMDif8LPAv45+hpt8SBU9VfQuL6AHa4cW8uDL9BKGlYA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.1.0.tgz", + "integrity": "sha512-2E+b7S/736AOmxf5je9OWoPpgPY240TfJfFXwQiVvq/4KyC+ZR9lBrqRx72Xghn8nu3z8Q2BPZIXVGZppl0USQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1800.2", - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "@schematics/angular": "18.0.2", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "@inquirer/prompts": "5.0.7", + "@listr2/prompt-adapter-inquirer": "2.0.13", + "@schematics/angular": "18.1.0", "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.2", - "inquirer": "9.2.22", - "jsonc-parser": "3.2.1", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.3", "npm-package-arg": "11.0.2", "npm-pick-manifest": "9.0.1", - "ora": "5.4.1", "pacote": "18.0.6", "resolve": "1.22.8", "semver": "7.6.2", @@ -232,32 +234,32 @@ } }, "node_modules/@angular/common": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.1.tgz", - "integrity": "sha512-iADQC5m4fvk+VNXEoU1KR93b0eG218/GuNdzUNVJHcjxdFxPshKk5fiaGSosUCxXPRQOxDKzmS9EDang87E/Ew==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.1.0.tgz", + "integrity": "sha512-noHDLarQSCZZh7hyNd0HR61Fut+q4QCVq9qc/jKPglfbV/6nPujQSmSpT+rNJlNuBOrCLuvH/CNBNbiqii+x3g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1", + "@angular/core": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.1.tgz", - "integrity": "sha512-zyG/ifCtN0drAuwz0oV6LtzTiDREsM1Ay7eJW9wTvp3NCv06goHLtHXX12eFfZQWJViBv924lyRDSWdZN7r3GQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.1.0.tgz", + "integrity": "sha512-JRQzVTeJGSfRLY+dx+gwu/hPQVB8K+5pW12Z42M9x/HBgGW4in0cO2zHkeQPvImqm0nak82Us1Hyf5C+qTlMMQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.1" + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -266,12 +268,12 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.1.tgz", - "integrity": "sha512-Aoz70+/o8R2lG2EGDAYbj6yu2B7kqa/9loYEwG0fECJTtXoRBP+bEGpUxMmxOb59tMDnbIhBHmNPPEQVTXvgSQ==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.1.0.tgz", + "integrity": "sha512-BBsogLPJwxkPh7f8RVHsxyyqNE8XpHbAanjB5fAwnU4W6Sw1kR5rFzkeZM3xaRm2MDiC8DovIl6hlf+s/mKYOw==", "dev": true, "dependencies": { - "@babel/core": "7.24.4", + "@babel/core": "7.24.7", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", @@ -286,67 +288,22 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.0.1", - "typescript": ">=5.4 <5.5" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@angular/compiler": "18.1.0", + "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/core": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.1.tgz", - "integrity": "sha512-Db1livvugoLdLsWww5IqUS5v+yUN7/5Rj0trZv9BgxIuoNtoipfLqKHwZWpumH3yI5Ucu+UH9zZ1mlGyF0Kexw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.1.0.tgz", + "integrity": "sha512-/57/s7CD/0CwlN+3FlhVmx7ypCWXjKi5UKtnlBAUg0D1denIf6ADxwTHFZABYZcYBqOTJgeQUtUw9u/A+0CIlg==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", @@ -354,26 +311,26 @@ } }, "node_modules/@angular/forms": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.1.tgz", - "integrity": "sha512-j1nUzwnZHO/BRXK0joQbAV10JWxeRVKmPzIaDulY2o28Er1jVKyw2T8EwI+xSvBbAqyJyaAd+ysWUhm3FfH+GA==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.1.0.tgz", + "integrity": "sha512-m+7m9wa+n5dEacd458eSZsZTz0B+HbOtr7/uqM0YTMQaPrhwl1epG5Y103mB6yr00JiJcLNlPLjP888cHFjldQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.1", - "@angular/core": "18.0.1", - "@angular/platform-browser": "18.0.1", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0", + "@angular/platform-browser": "18.1.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.0.1.tgz", - "integrity": "sha512-y8OaESXw32P74Jh2FEr3n7QjqjTlo2Jf+XdgOvp5dd1yxpJ20vnK7ZCEQqCpxdxGAzXqR+2DccKk9tebB9egZw==", + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.1.1.tgz", + "integrity": "sha512-9JdUEUZheMMk+Tu8oDLRdI2eXOeI9d2BjEZYkoDif4iB7TCldmcKJyTYXs3kSZz6B53vup/vgKJUPBHLkIDD+A==", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", "@material/auto-init": "15.0.0-canary.7f224ddd4.0", @@ -427,7 +384,7 @@ }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.0.1", + "@angular/cdk": "18.1.1", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", @@ -436,19 +393,19 @@ } }, "node_modules/@angular/platform-browser": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.1.tgz", - "integrity": "sha512-rQUsOxZxiwSPvyHdne60IKIGsvFoVc1rO4mDyXU+9sCCLmPKHzNyEzp7vybTZeiqa3k6v3sV/bfHWwrRzmvenw==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.1.0.tgz", + "integrity": "sha512-jCmxthiI4Zef54crckNht60xwfIsuciGeyZvb7SsXna2maLW9fA4uz1VhZqIWTiBnHwNynVlyfBX3/jBD7S9+g==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^18.13.0 || >=20.9.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.0.1", - "@angular/common": "18.0.1", - "@angular/core": "18.0.1" + "@angular/animations": "18.1.0", + "@angular/common": "18.1.0", + "@angular/core": "18.1.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -470,30 +427,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.9.tgz", + "integrity": "sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", - "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.24.5", - "@babel/helpers": "^7.24.5", - "@babel/parser": "^7.24.5", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.5", - "@babel/types": "^7.24.5", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -524,12 +481,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.24.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.10.tgz", + "integrity": "sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.24.9", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -539,26 +496,26 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -626,9 +583,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz", + "integrity": "sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.7", @@ -644,14 +601,11 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, "engines": { "node": ">=6.9.0" } @@ -670,21 +624,21 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", - "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -700,22 +654,22 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.8.tgz", + "integrity": "sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==", "dev": true, "dependencies": { "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -737,9 +691,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -748,6 +702,21 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", @@ -763,19 +732,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.8.tgz", + "integrity": "sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", + "@babel/generator": "^7.24.8", "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-function-name": "^7.24.7", "@babel/helper-hoist-variables": "^7.24.7", "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -783,25 +752,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.24.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.9.tgz", + "integrity": "sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -810,9 +767,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.3.tgz", - "integrity": "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -826,9 +783,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.3.tgz", - "integrity": "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -842,9 +799,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.3.tgz", - "integrity": "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -858,9 +815,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.3.tgz", - "integrity": "sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -874,9 +831,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.3.tgz", - "integrity": "sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -890,9 +847,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.3.tgz", - "integrity": "sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -906,9 +863,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.3.tgz", - "integrity": "sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -922,9 +879,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.3.tgz", - "integrity": "sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -938,9 +895,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.3.tgz", - "integrity": "sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -954,9 +911,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.3.tgz", - "integrity": "sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -970,9 +927,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.3.tgz", - "integrity": "sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -986,9 +943,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.3.tgz", - "integrity": "sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -1002,9 +959,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.3.tgz", - "integrity": "sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -1018,9 +975,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.3.tgz", - "integrity": "sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -1034,9 +991,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.3.tgz", - "integrity": "sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -1050,9 +1007,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.3.tgz", - "integrity": "sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -1066,9 +1023,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.3.tgz", - "integrity": "sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -1082,9 +1039,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.3.tgz", - "integrity": "sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -1098,9 +1055,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.3.tgz", - "integrity": "sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -1114,9 +1071,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.3.tgz", - "integrity": "sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -1130,9 +1087,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.3.tgz", - "integrity": "sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1146,9 +1103,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.3.tgz", - "integrity": "sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1162,9 +1119,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.3.tgz", - "integrity": "sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1177,189 +1134,529 @@ "node": ">=12" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", - "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "node_modules/@inquirer/checkbox": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.3.11.tgz", + "integrity": "sha512-pCt02FZNLX9u8j/42n6iJyJnInbrvrygOfX+Fc4TcASbNRwNUcvhjxR2t49AdlmiO8oXAT3GhFH1T+2GpZPCfw==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { "node": ">=18" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@inquirer/checkbox/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@inquirer/confirm": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.11.tgz", + "integrity": "sha512-3wWw10VPxQP279FO4bzWsf8YjIAq7NdwATJ4xS2h1uwsXZu/RmtOVV95rZ7yllS1h/dzu+uLewjMAzNDEj8h2w==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/core": "^8.2.4", + "@inquirer/type": "^1.3.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@inquirer/core": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-8.2.4.tgz", + "integrity": "sha512-7vsXSfxtrrbwMTirfaKwPcjqJy7pzeuF/bP62yo1NQrRJ5HjmMlrhZml/Ljm9ODc1RnbhJlTeSnCkjtFddKjwA==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/figures": "^1.0.3", + "@inquirer/type": "^1.3.3", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.9", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "picocolors": "^1.0.1", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@inquirer/editor": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.1.15.tgz", + "integrity": "sha512-UmtZnY36rGLS/4cCzvdRmk0xxsGgH2AsF0v1SSlBZ3C5JK/Bxm2gNW8fmUVzQ5vm8kpdWASXPapbUx4iV49ScA==", "dev": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "external-editor": "^3.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@inquirer/editor/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@inquirer/expand": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.1.15.tgz", + "integrity": "sha512-aBnnrBw9vbFJROUlDCsbq8H/plX6JHfPwLmSphxaVqOR+b1hgLdw+oRhZkpcJhG2AZOlc8IKzGdZhji93gQg4w==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "node_modules/@inquirer/expand/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@inquirer/figures": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.4.tgz", + "integrity": "sha512-R7Gsg6elpuqdn55fBH2y9oYzrU/yKrSmIsDX4ROT51vohrECFzTf2zw9BfUbOW8xjfmM2QbVoVYdTwhrtEKWSQ==", "dev": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@inquirer/input": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.2.2.tgz", + "integrity": "sha512-VjkzYSVH0606nLi9HHiSb4QYs2idwRgneiMoFoTAIwQ1Qwx6OIDugOYLtLta3gP8AWZx7qUvgDtj+/SJuiiKuQ==", "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@inquirer/input/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@ljharb/through": { - "version": "2.3.13", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", - "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "node_modules/@inquirer/password": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.1.15.tgz", + "integrity": "sha512-/JmiTtIcSYbZdPucEW5q2rhC71vGKPivm3LFqNDQEI6lJyffq7hlfKKFC+R1Qp19dMqkaG+O5L1XmcHpmlAUUQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.7" + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/@lmdb/lmdb-darwin-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.8.tgz", - "integrity": "sha512-+lFwFvU+zQ9zVIFETNtmW++syh3Ps5JS8MPQ8zOYtQZoU+dTR8ivWHTaE2QVk1JG2payGDLUAvpndLAjGMdeeA==", - "cpu": [ - "arm64" - ], + "node_modules/@inquirer/password/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.8.tgz", - "integrity": "sha512-T98rfsgfdQMS5/mqdsPb6oHSJ+iBYNa+PQDLtXLh6rzTEBsYP9x2uXxIj6VS4qXVDWXVi8rv85NCOG+UBOsHXQ==", - "cpu": [ + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.0.7.tgz", + "integrity": "sha512-GFcigCxJTKCH3aECzMIu4FhgLJWnFvMXzpI4CCSoELWFtkOOU2P+goYA61+OKpGrB8fPE7q6n8zAXBSlZRrHjQ==", + "dev": true, + "dependencies": { + "@inquirer/checkbox": "^2.3.7", + "@inquirer/confirm": "^3.1.11", + "@inquirer/editor": "^2.1.11", + "@inquirer/expand": "^2.1.11", + "@inquirer/input": "^2.1.11", + "@inquirer/password": "^2.1.11", + "@inquirer/rawlist": "^2.1.11", + "@inquirer/select": "^2.3.7" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.1.15.tgz", + "integrity": "sha512-zwU6aWDMyuQNiY5Z0iYXkxi7pliRFXqUmiS7vG6lAGxqcbOSptYgIxGJnd3AU4Y91N0Tbt57+koJL0S2p6vSkA==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/type": "^1.5.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/rawlist/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.3.11.tgz", + "integrity": "sha512-DebGErUSCyzwIP2zx3hs1X4TAzxSl/yNHzuYGE6KFkHq3ubg+5dJZacFxN1C1eBkJvQ0XBWGpY6MTzHsJbxkpw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^9.0.3", + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/select/node_modules/@inquirer/core": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.3.tgz", + "integrity": "sha512-p2BRZv/vMmpwlU4ZR966vKQzGVCi4VhLjVofwnFLziTQia541T7i1Ar8/LPh+LzjkXzocme+g5Io6MRtzlCcNA==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.4", + "@inquirer/type": "^1.5.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.14.11", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.0.tgz", + "integrity": "sha512-L/UdayX9Z1lLN+itoTKqJ/X4DX5DaWu2Sruwt4XgZzMNv32x4qllbzMX4MbJlz0yxAQtU19UvABGOjmdq1u3qA==", + "dev": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.13.tgz", + "integrity": "sha512-nAl6teTt7EWSjttNavAnv3uFR3w3vPP3OTYmHyPNHzKhAj2NoBDHmbS3MGpvvO8KXXPASnHjEGrrKrdKTMKPnQ==", + "dev": true, + "dependencies": { + "@inquirer/type": "^1.3.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 6" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.12.tgz", + "integrity": "sha512-vgTwzNUD3Hy4aqtGhX2+nV/usI0mwy3hDRuTjs8VcK0BLiMVEpNQXgzwlWEgPmA8AAPloUgyOs2nK5clJF5oIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.12.tgz", + "integrity": "sha512-qOt0hAhj2ZLY6aEWu85rzt5zcyCAQITMhCMEPNlo1tuYekpVAdkQNiwXxEkCjBYvwTskvXuwXOOUpjuSc+aJnA==", + "cpu": [ "x64" ], "dev": true, @@ -1369,9 +1666,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.8.tgz", - "integrity": "sha512-gVNCi3bYWatdPMeFpFjuZl6bzVL55FkeZU3sPeU+NsMRXC+Zl3qOx3M6cM4OMlJWbhHjYjf2b8q83K0mczaiWQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.12.tgz", + "integrity": "sha512-Ggd/UXpE+alMncbELCXA3OKpDj9bDBR3qVO7WRTxstloDglRAHfZmUJgTkeaNKjFO1JHqS7AKy0jba9XebZB1w==", "cpu": [ "arm" ], @@ -1382,9 +1679,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.8.tgz", - "integrity": "sha512-uEBGCQIChsixpykL0pjCxfF64btv64vzsb1NoM5u0qvabKvKEvErhXGoqovyldDu9u1T/fswD8Kf6ih0vJEvDQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.12.tgz", + "integrity": "sha512-Qy4cFXFe9h1wAWMsojex8x1ifvw2kqiZv686YiRTdQEzAfc3vJASHFcD/QejHUCx7YHMYdnUoCS45rG2AiGDTQ==", "cpu": [ "arm64" ], @@ -1395,9 +1692,9 @@ ] }, "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.8.tgz", - "integrity": "sha512-6v0B4sa9ulNezmDZtVpLjNHmA0qZzUl3001YJ2RF0naxsuv/Jq/xEwNYpOzfcdizHfpCE0oBkWzk/r+Slr+0zw==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.12.tgz", + "integrity": "sha512-c+noT9IofktxktFllKHFmci8ka2SYGSLN17pj/KSl1hg7mmfAiGp4xxFxEwMLTb+SX95vP1DFiR++1I3WLVxvA==", "cpu": [ "x64" ], @@ -1408,9 +1705,9 @@ ] }, "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.8.tgz", - "integrity": "sha512-lDLGRIMqdwYD39vinwNqqZUxCdL2m2iIdn+0HyQgIHEiT0g5rIAlzaMKzoGWon5NQumfxXFk9y0DarttkR7C1w==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.12.tgz", + "integrity": "sha512-CO3MFV8gUx16NU/CyyuumAKblESwvoGVA2XhQKZ976OTOxaTbb8F8D3f0iiZ4MYqsN74jIrFuCmXpPnpjbhfOQ==", "cpu": [ "x64" ], @@ -2173,9 +2470,9 @@ } }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz", - "integrity": "sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", "cpu": [ "arm64" ], @@ -2186,9 +2483,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz", - "integrity": "sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", "cpu": [ "x64" ], @@ -2199,9 +2496,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz", - "integrity": "sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", "cpu": [ "arm" ], @@ -2212,9 +2509,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz", - "integrity": "sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", "cpu": [ "arm64" ], @@ -2225,9 +2522,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz", - "integrity": "sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", "cpu": [ "x64" ], @@ -2238,9 +2535,9 @@ ] }, "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz", - "integrity": "sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", "cpu": [ "x64" ], @@ -2302,13 +2599,10 @@ } }, "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/fs": { "version": "3.1.1", @@ -2323,12 +2617,13 @@ } }, "node_modules/@npmcli/git": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.7.tgz", - "integrity": "sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", @@ -2342,13 +2637,10 @@ } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/@npmcli/installed-package-contents": { "version": "2.1.0", @@ -2650,14 +2942,14 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.2.tgz", - "integrity": "sha512-qkJs1oxHtneJ6QxDKpxNyneXGDM9SKVj+Bgi8xUAU3FEzpsYmE/aW3MfwYHOZl0pDBO8c2raqLvlyl3dGP6/Gg==", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.1.0.tgz", + "integrity": "sha512-k9Dy6JD7hqvCzDqnMjDm7J8H/P6m5mLuX2yEgQWKRAJ/YMINtBQAaKA1T9qXk97kEX6RNLpHMuDIsrIfK/H31Q==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.2", - "@angular-devkit/schematics": "18.0.2", - "jsonc-parser": "3.2.1" + "@angular-devkit/core": "18.1.0", + "@angular-devkit/schematics": "18.1.0", + "jsonc-parser": "3.3.1" }, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -2767,6 +3059,30 @@ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.14.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.11.tgz", + "integrity": "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "dev": true + }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", @@ -2820,9 +3136,9 @@ } }, "node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2999,9 +3315,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", + "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", "dev": true, "funding": [ { @@ -3018,10 +3334,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -3055,9 +3371,9 @@ } }, "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", @@ -3078,37 +3394,15 @@ } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001628", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", - "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001642", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", + "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", "dev": true, "funding": [ { @@ -3188,15 +3482,18 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { @@ -3211,6 +3508,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -3267,6 +3580,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3308,6 +3650,12 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -3315,9 +3663,9 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.22.tgz", - "integrity": "sha512-NU7DEcQZM2Dy8XTKFHxtdnIM/drE312j2T4PCVaSUcS0oBeyT/NImpRw/Ap0zOr/1SE7SgPK9tGPg1WK/sVakw==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -3491,23 +3839,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -3579,15 +3910,15 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", - "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", + "version": "1.4.829", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.829.tgz", + "integrity": "sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==", "dev": true }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", "dev": true }, "node_modules/encoding": { @@ -3640,31 +3971,10 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/esbuild": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.3.tgz", - "integrity": "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -3674,29 +3984,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.3", - "@esbuild/android-arm": "0.21.3", - "@esbuild/android-arm64": "0.21.3", - "@esbuild/android-x64": "0.21.3", - "@esbuild/darwin-arm64": "0.21.3", - "@esbuild/darwin-x64": "0.21.3", - "@esbuild/freebsd-arm64": "0.21.3", - "@esbuild/freebsd-x64": "0.21.3", - "@esbuild/linux-arm": "0.21.3", - "@esbuild/linux-arm64": "0.21.3", - "@esbuild/linux-ia32": "0.21.3", - "@esbuild/linux-loong64": "0.21.3", - "@esbuild/linux-mips64el": "0.21.3", - "@esbuild/linux-ppc64": "0.21.3", - "@esbuild/linux-riscv64": "0.21.3", - "@esbuild/linux-s390x": "0.21.3", - "@esbuild/linux-x64": "0.21.3", - "@esbuild/netbsd-x64": "0.21.3", - "@esbuild/openbsd-x64": "0.21.3", - "@esbuild/sunos-x64": "0.21.3", - "@esbuild/win32-arm64": "0.21.3", - "@esbuild/win32-ia32": "0.21.3", - "@esbuild/win32-x64": "0.21.3" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -3717,6 +4027,12 @@ "node": ">=0.8.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -3781,9 +4097,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -3849,43 +4165,34 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -3917,18 +4224,6 @@ "node": ">=4" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -3944,42 +4239,6 @@ "node": ">=4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -4005,13 +4264,10 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/htmlparser2": { "version": "8.0.2", @@ -4052,9 +4308,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -4139,52 +4395,14 @@ "dev": true }, "node_modules/ini": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.2.tgz", - "integrity": "sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer": { - "version": "9.2.22", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.22.tgz", - "integrity": "sha512-SqLLa/Oe5rZUagTR9z+Zd6izyatHglbmbvVofo1KzuVB54YHleWzeHNLoR7FOICGOeQSqeLh1cordb3MzhGcEw==", - "dev": true, - "dependencies": { - "@inquirer/figures": "^1.0.2", - "@ljharb/through": "^2.3.13", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -4211,12 +4429,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4232,12 +4453,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-glob": { @@ -4298,16 +4522,13 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -4367,9 +4588,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true }, "node_modules/jsonparse": { @@ -4381,16 +4602,89 @@ "node >= 0.2.0" ] }, + "node_modules/listr2": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", + "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/lmdb": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.8.tgz", - "integrity": "sha512-9rp8JT4jPhCRJUL7vRARa2N06OLSYzLwQsEkhC6Qu5XbcLyM/XBLMzDlgS/K7l7c5CdURLdDk9uE+hPFIogHTQ==", + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.12.tgz", + "integrity": "sha512-JnoEulTgveoC64vlYJ9sufGLuNkk6TcxSYpKxSC9aM42I61jIv3pQH0fgb6qW7HV0+FNqA3g1WCQQYfhfawGoQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "msgpackr": "^1.9.9", + "msgpackr": "^1.10.2", "node-addon-api": "^6.1.0", - "node-gyp-build-optional-packages": "5.1.1", + "node-gyp-build-optional-packages": "5.2.2", "ordered-binary": "^1.4.1", "weak-lru-cache": "^1.2.2" }, @@ -4398,19 +4692,13 @@ "download-lmdb-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@lmdb/lmdb-darwin-arm64": "3.0.8", - "@lmdb/lmdb-darwin-x64": "3.0.8", - "@lmdb/lmdb-linux-arm": "3.0.8", - "@lmdb/lmdb-linux-arm64": "3.0.8", - "@lmdb/lmdb-linux-x64": "3.0.8", - "@lmdb/lmdb-win32-x64": "3.0.8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "@lmdb/lmdb-darwin-arm64": "3.0.12", + "@lmdb/lmdb-darwin-x64": "3.0.12", + "@lmdb/lmdb-linux-arm": "3.0.12", + "@lmdb/lmdb-linux-arm64": "3.0.12", + "@lmdb/lmdb-linux-x64": "3.0.12", + "@lmdb/lmdb-win32-x64": "3.0.12" + } }, "node_modules/log-symbols": { "version": "4.1.0", @@ -4498,21 +4786,139 @@ "node": ">=8" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", "dev": true, - "dependencies": { + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dev": true, + "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, @@ -4583,9 +4989,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4665,34 +5071,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -4812,46 +5190,34 @@ "dev": true }, "node_modules/msgpackr": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.10.2.tgz", - "integrity": "sha512-L60rsPynBvNE+8BWipKKZ9jHcSGbtyJYIwjRq0VrIvQ08cRjntGXJYW/tmciZ2IHWIY8WEW32Qa2xbh5+SKBZA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", "dev": true, "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "node_modules/msgpackr-extract": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz", - "integrity": "sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", "dev": true, "hasInstallScript": true, "optional": true, "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" + "node-gyp-build-optional-packages": "5.2.2" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz", - "integrity": "sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==", - "dev": true, - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, "node_modules/mute-stream": { @@ -4919,9 +5285,9 @@ "dev": true }, "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "dependencies": { "env-paths": "^2.2.0", @@ -4930,9 +5296,9 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", - "proc-log": "^3.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", + "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { @@ -4955,9 +5321,9 @@ } }, "node_modules/node-gyp-build-optional-packages": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", - "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", "dev": true, "dependencies": { "detect-libc": "^2.0.1" @@ -4968,19 +5334,10 @@ "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.17.tgz", + "integrity": "sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==", "dev": true }, "node_modules/nopt": { @@ -4999,13 +5356,12 @@ } }, "node_modules/normalize-package-data": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.1.tgz", - "integrity": "sha512-6rvCfeRW+OEZagAB4lMLSNuTNYZWLVtKccK79VSTf//yTY5VOCgcpH80O+bZK8Neps7pUnd5G+QlMg1yV/2iZQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "dependencies": { "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, @@ -5098,16 +5454,16 @@ } }, "node_modules/npm-registry-fetch": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.0.1.tgz", - "integrity": "sha512-fLu9MTdZTlJAHUek/VLklE6EpIiP3VZpTiuN7OOMCt2Sd67NCpSEetMaxHHEZiZxllp8ZLsUpvbEszqTFEc+wA==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, "dependencies": { "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" @@ -5197,6 +5553,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5224,6 +5592,25 @@ "node": ">=8" } }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5266,6 +5653,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pacote": { "version": "18.0.6", "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", @@ -5367,13 +5760,10 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/picocolors": { "version": "1.0.1", @@ -5394,18 +5784,18 @@ } }, "node_modules/piscina": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.5.0.tgz", - "integrity": "sha512-iBaLWI56PFP81cfBSomWTmhOo9W2/yhIOL+Tk8O1vBCpK39cM0tGxB+wgYjG31qq4ohGvysfXSdnj8h7g4rZxA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", "dev": true, "optionalDependencies": { "nice-napi": "^1.0.2" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -5423,7 +5813,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { @@ -5573,16 +5963,19 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/signal-exit": { @@ -5610,6 +6003,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/rollup": { "version": "4.18.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", @@ -5645,15 +6044,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5717,9 +6107,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "node_modules/sass": { - "version": "1.77.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", - "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -5745,23 +6135,6 @@ "node": ">=10" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5812,6 +6185,34 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -5837,14 +6238,14 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" @@ -5928,17 +6329,20 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/string-width-cjs": { @@ -5956,32 +6360,74 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", + "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/supports-color": { + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", @@ -6135,9 +6581,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -6148,14 +6594,20 @@ } }, "node_modules/undici": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.18.0.tgz", - "integrity": "sha512-nT8jjv/fE9Et1ilR6QoW8ingRTY2Pp4l2RUrdzV5Yz35RJDrtPc1DXvuNqcpsJSGIRHFdt3YKKktTzJA6r0fTA==", + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.2.tgz", + "integrity": "sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==", "dev": true, "engines": { "node": ">=18.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -6181,9 +6633,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -6245,12 +6697,12 @@ } }, "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", + "esbuild": "^0.21.3", "postcss": "^8.4.38", "rollup": "^4.13.0" }, @@ -6299,412 +6751,6 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", @@ -6813,6 +6859,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -6846,6 +6921,35 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -6888,10 +6992,51 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==" + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" } } } From 45777876b74c5c8f05a5394d2f6d9cce9c9ae761 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 31 May 2024 19:07:42 +0200 Subject: [PATCH 039/143] docs(docs-infra): filter types (#52979) PR Close #52979 --- adev/src/app/app.config.ts | 2 + .../api-reference-list.component.html | 43 +++++++++---------- .../api-reference-list.component.scss | 17 ++++++-- .../api-reference-list.component.spec.ts | 24 +++++++---- .../api-reference-list.component.ts | 8 ++-- 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/adev/src/app/app.config.ts b/adev/src/app/app.config.ts index 1bc572a0305b..25f0be46e816 100644 --- a/adev/src/app/app.config.ts +++ b/adev/src/app/app.config.ts @@ -32,6 +32,7 @@ import { TitleStrategy, createUrlTreeFromSnapshot, provideRouter, + withComponentInputBinding, withInMemoryScrolling, withViewTransitions, } from '@angular/router'; @@ -70,6 +71,7 @@ export const appConfig: ApplicationConfig = { } }, }), + withComponentInputBinding(), ), provideExperimentalZonelessChangeDetection(), provideClientHydration(), diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html index ccba05a20ed5..90c7eef5b4c4 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.html +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.html @@ -1,30 +1,13 @@
Getting Started
-

API Reference

+

API Reference

@if (featuredGroup().items.length) { - + } -
- - -
- -
    @for (itemType of itemTypes; track itemType) {
  • API Reference
  • }
- - @for (group of filteredGroups(); track group.id) { - - } + + +
+ +
+ @for (group of filteredGroups(); track group.id) { + + } @empty { +
+

No API items found.

+
+ } +
diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss b/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss index 52764cb0d686..fc89ce01764b 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.scss @@ -25,7 +25,6 @@ .adev-reference-list-legend { display: grid; grid-template-columns: repeat(6, 1fr); - padding-block-end: 0.5rem; margin-block-start: 0; padding-inline: 0; cursor: pointer; @@ -57,7 +56,10 @@ border-radius: 0.25rem; margin-inline-end: 0.5rem; margin-block-end: 0.5rem; - transition: color 0.3s ease, background 0.3s ease, border 0.3s ease; + transition: + color 0.3s ease, + background 0.3s ease, + border 0.3s ease; &:hover { color: var(--primary-contrast); @@ -74,8 +76,8 @@ .adev-reference-list-form { display: flex; - justify-content: flex-start; - flex-wrap: wrap-reverse; + justify-content: space-between; + flex-wrap: wrap; gap: 1.5rem; padding-block-start: 1.5rem; padding-block-end: 2rem; @@ -88,6 +90,13 @@ flex-wrap: wrap; } +.adev-reference-list-empty { + text-align: center; + p { + font-size: 1rem; + } +} + .adev-featured-list { display: block; padding-block-end: 1rem; diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.spec.ts b/adev/src/app/features/references/api-reference-list/api-reference-list.component.spec.ts index 67be0c01bac6..24c195056d07 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.spec.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.spec.ts @@ -9,10 +9,11 @@ import {ComponentFixture, TestBed} from '@angular/core/testing'; import ApiReferenceList, {ALL_STATUSES_KEY} from './api-reference-list.component'; -import {RouterTestingModule} from '@angular/router/testing'; import {ApiReferenceManager} from './api-reference-manager.service'; import {signal} from '@angular/core'; import {ApiItemType} from '../interfaces/api-item-type'; +import {RouterTestingHarness} from '@angular/router/testing'; +import {provideRouter} from '@angular/router'; describe('ApiReferenceList', () => { let component: ApiReferenceList; @@ -52,8 +53,11 @@ describe('ApiReferenceList', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [ApiReferenceList, RouterTestingModule], - providers: [{provide: ApiReferenceManager, useValue: fakeApiReferenceManager}], + imports: [ApiReferenceList], + providers: [ + {provide: ApiReferenceManager, useValue: fakeApiReferenceManager}, + provideRouter([{path: 'api', component: ApiReferenceList}]), + ], }); fixture = TestBed.createComponent(ApiReferenceList); component = fixture.componentInstance; @@ -90,25 +94,27 @@ describe('ApiReferenceList', () => { }); it('should display only class items when user selects Class in the Type select', () => { - component.type.set(ApiItemType.CLASS); + fixture.componentInstance.type.set(ApiItemType.CLASS); fixture.detectChanges(); + expect(component.type()).toEqual(ApiItemType.CLASS); expect(component.filteredGroups()![0].items).toEqual([fakeItem2]); }); - it('should set selected type when provided type is different than selected', () => { + it('should set selected type when provided type is different than selected', async () => { + expect(component.type()).toBe(ALL_STATUSES_KEY); component.filterByItemType(ApiItemType.BLOCK); - + await RouterTestingHarness.create(`/api?type=${ApiItemType.BLOCK}`); expect(component.type()).toBe(ApiItemType.BLOCK); }); - it('should reset selected type when provided type is equal to selected', () => { + it('should reset selected type when provided type is equal to selected', async () => { component.filterByItemType(ApiItemType.BLOCK); - + const harness = await RouterTestingHarness.create(`/api?type=${ApiItemType.BLOCK}`); expect(component.type()).toBe(ApiItemType.BLOCK); component.filterByItemType(ApiItemType.BLOCK); - + harness.navigateByUrl(`/api`); expect(component.type()).toBe(ALL_STATUSES_KEY); }); }); diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts index 2cb1e3873aab..1f164f31119b 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts @@ -9,10 +9,11 @@ import { ChangeDetectionStrategy, Component, - ElementRef, computed, effect, + ElementRef, inject, + model, signal, viewChild, } from '@angular/core'; @@ -61,7 +62,8 @@ export default class ApiReferenceList { query = signal(''); includeDeprecated = signal(false); - type = signal(ALL_STATUSES_KEY); + + type = model(ALL_STATUSES_KEY); featuredGroup = this.apiReferenceManager.featuredGroup; filteredGroups = computed((): ApiItemsGroup[] => { @@ -85,6 +87,6 @@ export default class ApiReferenceList { itemTypes = Object.values(ApiItemType); filterByItemType(itemType: ApiItemType): void { - this.type.set(this.type() === itemType ? ALL_STATUSES_KEY : itemType); + this.type.update((currentType) => (currentType === itemType ? ALL_STATUSES_KEY : itemType)); } } From 244c50de54c8cbb0f28d47c875b89d47e5cda038 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 31 May 2024 18:44:41 +0200 Subject: [PATCH 040/143] docs: fix pipes link (#52979) fixes #52968 PR Close #52979 --- adev/src/content/guide/pipes/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/pipes/overview.md b/adev/src/content/guide/pipes/overview.md index 833e90c2be41..60380d7c74eb 100644 --- a/adev/src/content/guide/pipes/overview.md +++ b/adev/src/content/guide/pipes/overview.md @@ -23,5 +23,5 @@ The following are commonly used built-in pipes for data formatting: - [`AsyncPipe`](api/common/AsyncPipe): Subscribe and unsubscribe to an asynchronous source such as an observable. - [`JsonPipe`](api/common/JsonPipe): Display a component object property to the screen as JSON for debugging. -Note: For a complete list of built-in pipes, see the [pipes API documentation](/api/common#pipes "Pipes API reference summary"). +Note: For a complete list of built-in pipes, see the [pipes API documentation](/api?type=pipe "Pipes API reference summary"). To learn more about using pipes for internationalization (i18n) efforts, see [formatting data based on locale](guide/i18n/format-data-locale). From a18f41cb3534a2362b68d16f45ee3fc94e619a85 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 19 Jul 2024 16:51:49 +0200 Subject: [PATCH 041/143] docs: fix filtering on API reference (#57057) With the input binding, the `type` can become `undefined` PR Close #57057 --- .../api-reference-list/api-reference-list.component.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts index 1f164f31119b..f6d03b5606ce 100644 --- a/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts +++ b/adev/src/app/features/references/api-reference-list/api-reference-list.component.ts @@ -78,7 +78,9 @@ export default class ApiReferenceList { ? apiItem.title.toLocaleLowerCase().includes(this.query().toLocaleLowerCase()) : true) && (this.includeDeprecated() ? true : apiItem.isDeprecated === this.includeDeprecated()) && - (this.type() === ALL_STATUSES_KEY || apiItem.itemType === this.type()) + (this.type() === undefined || + this.type() === ALL_STATUSES_KEY || + apiItem.itemType === this.type()) ); }), })) From c76b440ac007128c53699797811bc586220ccbe9 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 18 Jul 2024 09:57:00 +0200 Subject: [PATCH 042/143] fix(compiler-cli): add warning for unused let declarations (#57033) Adds a new extended diagnostic that will flag `@let` declarations that aren't used within the template. The diagnostic can be turned off through the `extendedDiagnostics` compiler option. PR Close #57033 --- .../public-api/compiler-cli/error_code.api.md | 1 + .../extended_template_diagnostic_name.api.md | 4 +- .../src/ngtsc/diagnostics/src/error_code.ts | 13 +++ .../src/extended_template_diagnostic_name.ts | 1 + .../src/ngtsc/typecheck/extended/BUILD.bazel | 1 + .../checks/unused_let_declaration/BUILD.bazel | 17 +++ .../checks/unused_let_declaration/index.ts | 87 +++++++++++++++ .../src/ngtsc/typecheck/extended/index.ts | 2 + .../checks/unused_let_declaration/BUILD.bazel | 30 +++++ .../unused_let_declaration_spec.ts | 103 ++++++++++++++++++ .../test/ngtsc/template_typecheck_spec.ts | 13 ++- .../language-service/test/quick_info_spec.ts | 2 +- 12 files changed, 271 insertions(+), 3 deletions(-) create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts diff --git a/goldens/public-api/compiler-cli/error_code.api.md b/goldens/public-api/compiler-cli/error_code.api.md index e1ad1d87bde9..7c307e96f2ff 100644 --- a/goldens/public-api/compiler-cli/error_code.api.md +++ b/goldens/public-api/compiler-cli/error_code.api.md @@ -105,6 +105,7 @@ export enum ErrorCode { UNDECORATED_PROVIDER = 2005, UNINVOKED_FUNCTION_IN_EVENT_BINDING = 8111, UNSUPPORTED_INITIALIZER_API_USAGE = 8110, + UNUSED_LET_DECLARATION = 8112, // (undocumented) VALUE_HAS_WRONG_TYPE = 1010, // (undocumented) diff --git a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md index 2f57f98462b4..36777b64fa9f 100644 --- a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md +++ b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md @@ -27,7 +27,9 @@ export enum ExtendedTemplateDiagnosticName { // (undocumented) TEXT_ATTRIBUTE_NOT_BINDING = "textAttributeNotBinding", // (undocumented) - UNINVOKED_FUNCTION_IN_EVENT_BINDING = "uninvokedFunctionInEventBinding" + UNINVOKED_FUNCTION_IN_EVENT_BINDING = "uninvokedFunctionInEventBinding", + // (undocumented) + UNUSED_LET_DECLARATION = "unusedLetDeclaration" } // (No @packageDocumentation comment for this package) diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index 9b3fb28331e5..14584d91f778 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -495,6 +495,19 @@ export enum ErrorCode { */ UNINVOKED_FUNCTION_IN_EVENT_BINDING = 8111, + /** + * A `@let` declaration in a template isn't used. + * + * For example: + * ``` + * @let used = 1; + * @let notUsed = 2; + * + * {{used}} + * ``` + */ + UNUSED_LET_DECLARATION = 8112, + /** * The template type-checking engine would need to generate an inline type check block for a * component, but the current type-checking environment doesn't support it. diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts index c04d2b4f9594..1b968e610b13 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts @@ -27,4 +27,5 @@ export enum ExtendedTemplateDiagnosticName { SKIP_HYDRATION_NOT_STATIC = 'skipHydrationNotStatic', INTERPOLATED_SIGNAL_NOT_INVOKED = 'interpolatedSignalNotInvoked', CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION = 'controlFlowPreventingContentProjection', + UNUSED_LET_DECLARATION = 'unusedLetDeclaration', } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel index d49bed313ecf..f4527da5c181 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel @@ -22,6 +22,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/suffix_not_supported", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/text_attribute_not_binding", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/uninvoked_function_in_event_binding", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration", "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel new file mode 100644 index 000000000000..75824d705dfb --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel @@ -0,0 +1,17 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "unused_let_declaration", + srcs = ["index.ts"], + visibility = [ + "//packages/compiler-cli/src/ngtsc:__subpackages__", + "//packages/compiler-cli/test/ngtsc:__pkg__", + ], + deps = [ + "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/typecheck/api", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/api", + "@npm//typescript", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts new file mode 100644 index 000000000000..e670f7f34640 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts @@ -0,0 +1,87 @@ +/** + * @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 {AST, ASTWithSource, TmplAstLetDeclaration, TmplAstNode} from '@angular/compiler'; +import ts from 'typescript'; + +import {ErrorCode, ExtendedTemplateDiagnosticName} from '../../../../diagnostics'; +import {NgTemplateDiagnostic} from '../../../api'; +import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '../../api'; + +interface ClassAnalysis { + allLetDeclarations: Set; + usedLetDeclarations: Set; +} + +/** + * Ensures that all `@let` declarations in a template are used. + */ +class UnusedLetDeclarationCheck extends TemplateCheckWithVisitor { + override code = ErrorCode.UNUSED_LET_DECLARATION as const; + private analysis = new Map(); + + override run( + ctx: TemplateContext, + component: ts.ClassDeclaration, + template: TmplAstNode[], + ): NgTemplateDiagnostic[] { + super.run(ctx, component, template); + + const diagnostics: NgTemplateDiagnostic[] = []; + const {allLetDeclarations, usedLetDeclarations} = this.getAnalysis(component); + + for (const decl of allLetDeclarations) { + if (!usedLetDeclarations.has(decl)) { + diagnostics.push( + ctx.makeTemplateDiagnostic( + decl.sourceSpan, + `@let ${decl.name} is declared but its value is never read.`, + ), + ); + } + } + + this.analysis.clear(); + return diagnostics; + } + + override visitNode( + ctx: TemplateContext, + component: ts.ClassDeclaration, + node: TmplAstNode | AST, + ): NgTemplateDiagnostic[] { + if (node instanceof TmplAstLetDeclaration) { + this.getAnalysis(component).allLetDeclarations.add(node); + } else if (node instanceof AST) { + const unwrappedNode = node instanceof ASTWithSource ? node.ast : node; + const target = ctx.templateTypeChecker.getExpressionTarget(unwrappedNode, component); + + if (target !== null && target instanceof TmplAstLetDeclaration) { + this.getAnalysis(component).usedLetDeclarations.add(target); + } + } + + return []; + } + + private getAnalysis(node: ts.ClassDeclaration): ClassAnalysis { + if (!this.analysis.has(node)) { + this.analysis.set(node, {allLetDeclarations: new Set(), usedLetDeclarations: new Set()}); + } + return this.analysis.get(node)!; + } +} + +export const factory: TemplateCheckFactory< + ErrorCode.UNUSED_LET_DECLARATION, + ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION +> = { + code: ErrorCode.UNUSED_LET_DECLARATION, + name: ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION, + create: () => new UnusedLetDeclarationCheck(), +}; diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index 0dc597df0502..c56e9d945aa0 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -18,6 +18,7 @@ import {factory as optionalChainNotNullableFactory} from './checks/optional_chai import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supported'; import {factory as textAttributeNotBindingFactory} from './checks/text_attribute_not_binding'; import {factory as uninvokedFunctionInEventBindingFactory} from './checks/uninvoked_function_in_event_binding'; +import {factory as unusedLetDeclarationFactory} from './checks/unused_let_declaration'; export {ExtendedTemplateCheckerImpl} from './src/extended_template_checker'; @@ -34,6 +35,7 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< suffixNotSupportedFactory, interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, + unusedLetDeclarationFactory, ]; export const SUPPORTED_DIAGNOSTIC_NAMES = new Set([ diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel new file mode 100644 index 000000000000..a194ca517680 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "test_lib", + testonly = True, + srcs = ["unused_let_declaration_spec.ts"], + deps = [ + "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/core:api", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/compiler-cli/src/ngtsc/file_system/testing", + "//packages/compiler-cli/src/ngtsc/testing", + "//packages/compiler-cli/src/ngtsc/typecheck/extended", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration", + "//packages/compiler-cli/src/ngtsc/typecheck/testing", + "@npm//typescript", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["//tools/testing:node_no_angular"], + data = [ + "//packages/core:npm_package", + ], + deps = [ + ":test_lib", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts new file mode 100644 index 000000000000..e41ec168cdf5 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts @@ -0,0 +1,103 @@ +/** + * @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 ts from 'typescript'; + +import {ErrorCode, ExtendedTemplateDiagnosticName, ngErrorCode} from '../../../../../diagnostics'; +import {absoluteFrom, getSourceFileOrError} from '../../../../../file_system'; +import {runInEachFileSystem} from '../../../../../file_system/testing'; +import {getSourceCodeForDiagnostic} from '../../../../../testing'; +import {getClass, setup} from '../../../../testing'; +import {factory as unusedLetDeclarationFactory} from '../../../checks/unused_let_declaration/index'; +import {ExtendedTemplateCheckerImpl} from '../../../src/extended_template_checker'; + +runInEachFileSystem(() => { + describe('UnusedLetDeclarationCheck', () => { + function diagnose(template: string) { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': template, + }, + source: ` + export class TestCmp { + eventCallback(value: any) {} + } + `, + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [unusedLetDeclarationFactory], + {}, + ); + return extendedTemplateChecker.getDiagnosticsForComponent(component); + } + + it('binds the error code to its extended template diagnostic name', () => { + expect(unusedLetDeclarationFactory.code).toBe(ErrorCode.UNUSED_LET_DECLARATION); + expect(unusedLetDeclarationFactory.name).toBe( + ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION, + ); + }); + + it('should report a @let declaration that is not used', () => { + const diags = diagnose(` + @let used = 1; + @let unused = 2; + {{used}} + `); + + expect(diags.length).toBe(1); + expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); + expect(diags[0].code).toBe(ngErrorCode(ErrorCode.UNUSED_LET_DECLARATION)); + expect(getSourceCodeForDiagnostic(diags[0])).toBe('@let unused = 2'); + }); + + it('should report a @let declaration that is not used', () => { + const diags = diagnose(` + @let foo = 1; + + @if (true) { + @let foo = 2; + {{foo}} + } + `); + + expect(diags.length).toBe(1); + expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); + expect(diags[0].code).toBe(ngErrorCode(ErrorCode.UNUSED_LET_DECLARATION)); + expect(getSourceCodeForDiagnostic(diags[0])).toBe('@let foo = 1'); + }); + + it('should not report a @let declaration that is only used in other @let declarations', () => { + const diags = diagnose(` + @let one = 1; + @let two = 2; + @let three = one + two; + {{three}} + `); + + expect(diags.length).toBe(0); + }); + + it('should not report a @let declaration that is only used in an event listener', () => { + const diags = diagnose(` + @let foo = 1; + + `); + + expect(diags.length).toBe(0); + }); + }); +}); diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index 930844c75cea..fd7093d0767d 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -6611,7 +6611,18 @@ suppress }); describe('@let declarations', () => { - beforeEach(() => env.tsconfig({strictTemplates: true})); + beforeEach(() => + env.tsconfig({ + strictTemplates: true, + extendedDiagnostics: { + checks: { + // Suppress the diagnostic for unused @let since some of the error cases + // we're checking for here also qualify as being unused which adds noise. + unusedLetDeclaration: 'suppress', + }, + }, + }), + ); it('should infer the type of a let declaration', () => { env.write( diff --git a/packages/language-service/test/quick_info_spec.ts b/packages/language-service/test/quick_info_spec.ts index 899fdc40b2ae..c4183d2b6b35 100644 --- a/packages/language-service/test/quick_info_spec.ts +++ b/packages/language-service/test/quick_info_spec.ts @@ -708,7 +708,7 @@ describe('quick info', () => { describe('let declarations', () => { it('should get quick info for a let declaration', () => { expectQuickInfo({ - templateOverride: `@let na¦me = 'Frodo';`, + templateOverride: `@let na¦me = 'Frodo'; {{name}}`, expectedSpanText: `@let name = 'Frodo'`, expectedDisplayString: `(let) name: "Frodo"`, }); From 7d4b2d2413935ca0869e659fc67dd88e00228593 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Wed, 17 Jul 2024 23:12:53 +0200 Subject: [PATCH 043/143] fix(core): `afterNextRender` hooks return that callback value. (#57031) `afterRender` was working fine but `afterNextRender` wasn't PR Close #57031 --- .../core/src/render3/after_render_hooks.ts | 2 +- .../test/acceptance/after_render_hook_spec.ts | 35 ++++++++++++------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/core/src/render3/after_render_hooks.ts b/packages/core/src/render3/after_render_hooks.ts index 98641de90fc9..dbab5ffc8bd3 100644 --- a/packages/core/src/render3/after_render_hooks.ts +++ b/packages/core/src/render3/after_render_hooks.ts @@ -613,7 +613,7 @@ function afterRenderImpl( if (callbacksLeftToRun < 1) { destroy(); } - phaseCallback(...args); + return phaseCallback(...args); } : phaseCallback; diff --git a/packages/core/test/acceptance/after_render_hook_spec.ts b/packages/core/test/acceptance/after_render_hook_spec.ts index 00302b8c120d..b1ceff3296d4 100644 --- a/packages/core/test/acceptance/after_render_hook_spec.ts +++ b/packages/core/test/acceptance/after_render_hook_spec.ts @@ -1279,15 +1279,19 @@ describe('after render hooks', () => { afterRender({ earlyRead: () => { log.push('early-read'); + return 'early'; }, - write: () => { - log.push('write'); + write: (previous) => { + log.push(`previous was ${previous}, this is write`); + return 'write'; }, - mixedReadWrite: () => { - log.push('mixed-read-write'); + mixedReadWrite: (previous) => { + log.push(`previous was ${previous}, this is mixed-read-write`); + return 'mixed'; }, - read: () => { - log.push('read'); + read: (previous) => { + log.push(`previous was ${previous}, this is read`); + return 'read'; }, }); } @@ -1301,17 +1305,22 @@ describe('after render hooks', () => { expect(log).toEqual([]); TestBed.inject(ApplicationRef).tick(); - expect(log).toEqual(['early-read', 'write', 'mixed-read-write', 'read']); + expect(log).toEqual([ + 'early-read', + 'previous was early, this is write', + 'previous was write, this is mixed-read-write', + 'previous was mixed, this is read', + ]); TestBed.inject(ApplicationRef).tick(); expect(log).toEqual([ 'early-read', - 'write', - 'mixed-read-write', - 'read', + 'previous was early, this is write', + 'previous was write, this is mixed-read-write', + 'previous was mixed, this is read', 'early-read', - 'write', - 'mixed-read-write', - 'read', + 'previous was early, this is write', + 'previous was write, this is mixed-read-write', + 'previous was mixed, this is read', ]); }); }); From 4e6a42b21537f294ec9c7bc82d4cd3169e529b0b Mon Sep 17 00:00:00 2001 From: Ashish Deshpande Date: Fri, 5 Jul 2024 23:39:22 +0530 Subject: [PATCH 044/143] docs: update broken link to version updates in versionEvent (#56870) (#56870) PR Close #56870 --- packages/service-worker/src/low_level.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/service-worker/src/low_level.ts b/packages/service-worker/src/low_level.ts index 61485cde38c9..2ab8a8b24f3d 100644 --- a/packages/service-worker/src/low_level.ts +++ b/packages/service-worker/src/low_level.ts @@ -66,7 +66,7 @@ export interface VersionReadyEvent { /** * A union of all event types that can be emitted by - * {@link api/service-worker/SwUpdate#versionUpdates SwUpdate#versionUpdates}. + * {@link SwUpdate#versionUpdates}. * * @publicApi */ From 3664cd6cb2cd31481af2684d2feac34c34094e07 Mon Sep 17 00:00:00 2001 From: Thomas Nguyen Date: Mon, 1 Jul 2024 16:05:33 -0700 Subject: [PATCH 045/143] refactor(core): Allow manual renderer listens to contribute to event delegation as well. (#56799) There are existing usages that inject the renderer to manualy listen (often for event delegation purposes). These should contribute as well. PR Close #56799 --- packages/core/src/event_delegation_utils.ts | 11 ++--- .../src/event_dispatch/event_delegation.ts | 3 -- .../event_dispatch/event_dispatch_spec.ts | 41 ++++++++++++++++++- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/packages/core/src/event_delegation_utils.ts b/packages/core/src/event_delegation_utils.ts index 10811a8d0480..4515ff8b8b31 100644 --- a/packages/core/src/event_delegation_utils.ts +++ b/packages/core/src/event_delegation_utils.ts @@ -46,7 +46,7 @@ export function setJSActionAttributes(nativeElement: Element, eventTypes: string nativeElement.setAttribute(Attribute.JSACTION, `${existingAttr ?? ''}${parts}`); } -export const sharedStashFunction = (rEl: RElement, eventType: string, listenerFn: () => void) => { +export const sharedStashFunction = (rEl: RElement, eventType: string, listenerFn: Function) => { const el = rEl as unknown as Element; const eventListenerMap = el.__jsaction_fns ?? new Map(); const eventListeners = eventListenerMap.get(eventType) ?? []; @@ -93,10 +93,11 @@ export class GlobalEventDelegation implements OnDestroy { return isEarlyEventType(eventType); } - addEventListener(element: HTMLElement, eventType: string, handler: Function): Function { - this.eventContractDetails.instance!.addEvent(eventType); - getActionCache(element)[eventType] = ''; - return () => this.removeEventListener(element, eventType, handler); + addEventListener(element: HTMLElement, eventName: string, handler: Function): Function { + this.eventContractDetails.instance!.addEvent(eventName); + sharedStashFunction(element, eventName, handler); + getActionCache(element)[eventName] = ''; + return () => this.removeEventListener(element, eventName, handler); } removeEventListener(element: HTMLElement, eventType: string, callback: Function): void { diff --git a/packages/core/src/event_dispatch/event_delegation.ts b/packages/core/src/event_dispatch/event_delegation.ts index 05a23e52dec8..1f6e8b65cae0 100644 --- a/packages/core/src/event_dispatch/event_delegation.ts +++ b/packages/core/src/event_dispatch/event_delegation.ts @@ -9,13 +9,11 @@ import {ENVIRONMENT_INITIALIZER, Injector} from '../di'; import {inject} from '../di/injector_compatibility'; import {Provider} from '../di/interface/provider'; -import {setStashFn} from '../render3/instructions/listener'; import { GLOBAL_EVENT_DELEGATION, GlobalEventDelegation, JSACTION_EVENT_CONTRACT, initGlobalEventDelegation, - sharedStashFunction, } from '../event_delegation_utils'; import {IS_GLOBAL_EVENT_DELEGATION_ENABLED} from '../hydration/tokens'; @@ -35,7 +33,6 @@ export function provideGlobalEventDelegation(): Provider[] { const injector = inject(Injector); const eventContractDetails = injector.get(JSACTION_EVENT_CONTRACT); initGlobalEventDelegation(eventContractDetails, injector); - setStashFn(sharedStashFunction); }, multi: true, }, diff --git a/packages/core/test/event_dispatch/event_dispatch_spec.ts b/packages/core/test/event_dispatch/event_dispatch_spec.ts index fd7816a08aaa..6770b8c4c4fe 100644 --- a/packages/core/test/event_dispatch/event_dispatch_spec.ts +++ b/packages/core/test/event_dispatch/event_dispatch_spec.ts @@ -6,7 +6,14 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, ɵJSACTION_EVENT_CONTRACT, ɵprovideGlobalEventDelegation} from '@angular/core'; +import { + Component, + ElementRef, + Renderer2, + ViewChild, + inject, + ɵprovideGlobalEventDelegation, +} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; function configureTestingModule(components: unknown[]) { @@ -183,4 +190,36 @@ describe('event dispatch', () => { expect(onClickSpy).toHaveBeenCalledTimes(1); }); }); + + describe('manual listening', () => { + it('should trigger events when manually registered', async () => { + const onClickSpy = jasmine.createSpy(); + @Component({ + standalone: true, + selector: 'app', + template: ` +
+
+
+ `, + }) + class SimpleComponent { + renderer = inject(Renderer2); + destroy!: Function; + listen(el: Element) { + this.destroy = this.renderer.listen(el, 'click', onClickSpy); + } + } + configureTestingModule([SimpleComponent]); + fixture = TestBed.createComponent(SimpleComponent); + const nativeElement = fixture.debugElement.nativeElement; + (fixture.componentInstance as SimpleComponent).listen(nativeElement); + const bottomEl = nativeElement.querySelector('#bottom')!; + bottomEl.click(); + expect(onClickSpy).toHaveBeenCalledTimes(1); + (fixture.componentInstance as SimpleComponent).destroy(); + bottomEl.click(); + expect(onClickSpy).toHaveBeenCalledTimes(1); + }); + }); }); From 38e4802c7f5f4bbb46d127dc7fb938aa7be429c6 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 16 Jul 2024 10:05:06 +0000 Subject: [PATCH 046/143] build: update babel dependencies (#57045) See associated pull request for more information. Closes #56996 as a pr takeover PR Close #57045 --- package.json | 7 +- packages/compiler-cli/package.json | 2 +- packages/localize/package.json | 2 +- yarn.lock | 144 ++++++++++++++++++++++++++++- 4 files changed, 145 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 2d1cdb79d117..6fa8a0fad7df 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,9 @@ "@angular/cdk": "18.1.0", "@angular/cli": "18.1.0-next.1", "@angular/material": "18.1.0", - "@babel/cli": "7.24.7", - "@babel/core": "7.24.7", - "@babel/generator": "7.24.7", + "@babel/cli": "7.24.8", + "@babel/core": "7.24.9", + "@babel/generator": "7.24.10", "@bazel/concatjs": "5.8.1", "@bazel/esbuild": "5.8.1", "@bazel/jasmine": "5.8.1", @@ -161,6 +161,7 @@ "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#3e3184d97be16d18d6b0f48f29fa8463e7f65587", "@angular/docs": "https://github.com/angular/dev-infra-private-docs-builds.git#2f58fdebbd27f42e8eb8f4b7885f32b066ded66a", "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#806cbfc987d0df61f2ed90a24e2d4176e8a50a5b", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", "@bazel/bazelisk": "^1.7.5", "@bazel/buildifier": "^6.0.0", "@bazel/ibazel": "^0.16.0", diff --git a/packages/compiler-cli/package.json b/packages/compiler-cli/package.json index 23940038bd38..b97e53548018 100644 --- a/packages/compiler-cli/package.json +++ b/packages/compiler-cli/package.json @@ -43,7 +43,7 @@ } }, "dependencies": { - "@babel/core": "7.24.7", + "@babel/core": "7.24.9", "@jridgewell/sourcemap-codec": "^1.4.14", "reflect-metadata": "^0.2.0", "chokidar": "^3.0.0", diff --git a/packages/localize/package.json b/packages/localize/package.json index e684f86ac61c..8b05c4ee7da3 100644 --- a/packages/localize/package.json +++ b/packages/localize/package.json @@ -34,7 +34,7 @@ "./fesm2022/init.mjs" ], "dependencies": { - "@babel/core": "7.24.7", + "@babel/core": "7.24.9", "@types/babel__core": "7.20.5", "fast-glob": "3.3.2", "yargs": "^17.2.1" diff --git a/yarn.lock b/yarn.lock index a4d7f6d8f09f..92180c24e178 100644 --- a/yarn.lock +++ b/yarn.lock @@ -586,10 +586,10 @@ call-me-maybe "^1.0.1" js-yaml "^4.1.0" -"@babel/cli@7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.7.tgz#eb2868c1fa384b17ea88d60107577d3e6fd05c4e" - integrity sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A== +"@babel/cli@7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.8.tgz#79eaa55a69c77cafbea3e87537fd1df5a5a2edf8" + integrity sha512-isdp+G6DpRyKc+3Gqxy2rjzgF7Zj9K0mzLNnxz+E/fgeag8qT3vVulX4gY9dGO1q0y+0lUv6V3a+uhUzMzrwXg== dependencies: "@jridgewell/trace-mapping" "^0.3.25" commander "^6.2.0" @@ -620,6 +620,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.24.8": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" + integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== + "@babel/core@7.24.7", "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" @@ -641,6 +646,37 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.9.tgz#dc07c9d307162c97fa9484ea997ade65841c7c82" + integrity sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.9" + "@babel/helper-compilation-targets" "^7.24.8" + "@babel/helper-module-transforms" "^7.24.9" + "@babel/helpers" "^7.24.8" + "@babel/parser" "^7.24.8" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.8" + "@babel/types" "^7.24.9" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@7.24.10", "@babel/generator@^7.24.8", "@babel/generator@^7.24.9": + version "7.24.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76" + integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg== + dependencies: + "@babel/types" "^7.24.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/generator@7.24.7", "@babel/generator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" @@ -684,6 +720,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" + integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== + dependencies: + "@babel/compat-data" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" @@ -782,6 +829,17 @@ "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" +"@babel/helper-module-transforms@^7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.9.tgz#e13d26306b89eea569180868e652e7f514de9d29" + integrity sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" @@ -854,6 +912,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" @@ -869,6 +932,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.22.20", "@babel/helper-wrap-function@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" @@ -887,6 +955,14 @@ "@babel/template" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helpers@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.8.tgz#2820d64d5d6686cca8789dd15b074cd862795873" + integrity sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.8" + "@babel/highlight@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" @@ -907,6 +983,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" + integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" @@ -939,7 +1020,7 @@ "@babel/helper-environment-visitor" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": +"@babel/plugin-proposal-async-generator-functions@^7.20.1", "@babel/plugin-proposal-async-generator-functions@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== @@ -1613,6 +1694,22 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" + integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.8" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.8" + "@babel/types" "^7.24.8" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.24.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" @@ -1631,6 +1728,15 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@babel/types@^7.24.8", "@babel/types@^7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" + integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@bazel/bazelisk@^1.7.5": version "1.19.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.19.0.tgz#de12b6920b2c5505a776fadc0c9e75daae930c32" @@ -6142,6 +6248,16 @@ browserslist@^4.21.10, browserslist@^4.21.5, browserslist@^4.22.2, browserslist@ node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.23.1: + version "4.23.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" + integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== + dependencies: + caniuse-lite "^1.0.30001640" + electron-to-chromium "^1.4.820" + node-releases "^2.0.14" + update-browserslist-db "^1.1.0" + browserstack@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3" @@ -6329,6 +6445,11 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz#90b6cd85ddc2e9f831de0225f4ca5a130c8d8222" integrity sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA== +caniuse-lite@^1.0.30001640: + version "1.0.30001642" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz#6aa6610eb24067c246d30c57f055a9d0a7f8d05f" + integrity sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA== + canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -8098,6 +8219,11 @@ electron-to-chromium@^1.4.668: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz#2a3a5509593745c5d65d8acd66b308f2a25da041" integrity sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A== +electron-to-chromium@^1.4.820: + version "1.4.828" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.828.tgz#a1ee8cd8847448b2898d3f2d9db02113f9c5b35c" + integrity sha512-QOIJiWpQJDHAVO4P58pwb133Cwee0nbvy/MV1CwzZVGpkH1RX33N3vsaWRCpR6bF63AAq366neZrRTu7Qlsbbw== + elkjs@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" @@ -16257,6 +16383,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.2" picocolors "^1.0.1" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + update-notifier-cjs@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" From aeaf07d7cd8186653cde6eacc9e560f03c9dfd98 Mon Sep 17 00:00:00 2001 From: Salanoid Date: Mon, 22 Jul 2024 15:23:16 +0300 Subject: [PATCH 047/143] docs: fixing dead link (#57077) Fixing guide dead link for issue #57067. PR Close #57077 --- adev/src/content/guide/zoneless.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/guide/zoneless.md b/adev/src/content/guide/zoneless.md index 45f66b6216df..2234be0c2342 100644 --- a/adev/src/content/guide/zoneless.md +++ b/adev/src/content/guide/zoneless.md @@ -42,7 +42,7 @@ These notifications include: ### `OnPush`-compatible components One way to ensure that a component is using the correct notification mechanisms from above is to -use [ChangeDetectionStrategy.OnPush](../best-practices/skipping-subtrees#using-onpush). +use [ChangeDetectionStrategy.OnPush](/adev/src/content/best-practices/runtime-performance/skipping-subtrees#using-onpush). The `OnPush` change detection strategy is not required, but it is a recommended step towards zoneless compatibility for application components. It is not always possible for library components to use `ChangeDetectionStrategy.OnPush`. When a library component is a host for user-components which might use `ChangeDetectionStratey.Default`, it cannot use `OnPush` because that would prevent the child component from being refreshed if it is not `OnPush` compatible and relies on ZoneJS to trigger change detection. Components can use the `Default` strategy as long as they notify Angular when change detection needs to run (calling `markForCheck`, using signals, `AsyncPipe`, etc.). From 21f71315cb0f603fad15369df1ce7f44b3a39e02 Mon Sep 17 00:00:00 2001 From: xpl0siv <105566648+xpl0siv@users.noreply.github.com> Date: Sun, 21 Jul 2024 13:38:24 +0200 Subject: [PATCH 048/143] docs: fix push-notifications.md (#57065) Added missing comma at actions notifications example. SyntaxError: Expected ',' or ']' after array element in JSON at position 255 PR Close #57065 --- .../src/content/ecosystem/service-workers/push-notifications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adev/src/content/ecosystem/service-workers/push-notifications.md b/adev/src/content/ecosystem/service-workers/push-notifications.md index 116d18c0784c..2f1ac6a63de7 100644 --- a/adev/src/content/ecosystem/service-workers/push-notifications.md +++ b/adev/src/content/ecosystem/service-workers/push-notifications.md @@ -69,7 +69,7 @@ In addition, using the `onActionClick` property on the `data` object, you can ti {"action": "foo", "title": "Open new tab"}, {"action": "bar", "title": "Focus last"}, {"action": "baz", "title": "Navigate last"}, - {"action": "qux", "title": "Send request in the background"} + {"action": "qux", "title": "Send request in the background"}, {"action": "other", "title": "Just notify existing clients"} ], "data": { From fe41b11434ad7bdff1c308fc31a6671e67c5ee29 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 18 Jul 2024 11:46:41 +0200 Subject: [PATCH 049/143] fix(core): tree shake dev mode error message (#57035) Adds an `ngDevMode` check before a runtime error message. Fixes #57034. PR Close #57035 --- packages/core/rxjs-interop/src/to_signal.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/core/rxjs-interop/src/to_signal.ts b/packages/core/rxjs-interop/src/to_signal.ts index 79ac8267f8a3..f8060f1f2362 100644 --- a/packages/core/rxjs-interop/src/to_signal.ts +++ b/packages/core/rxjs-interop/src/to_signal.ts @@ -183,10 +183,11 @@ export function toSignal( // "complete". }); - if (ngDevMode && options?.requireSync && state().kind === StateKind.NoValue) { + if (options?.requireSync && state().kind === StateKind.NoValue) { throw new ɵRuntimeError( ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT, - '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.', + (typeof ngDevMode === 'undefined' || ngDevMode) && + '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.', ); } @@ -205,10 +206,10 @@ export function toSignal( throw current.error; case StateKind.NoValue: // This shouldn't really happen because the error is thrown on creation. - // TODO(alxhub): use a RuntimeError when we finalize the error semantics throw new ɵRuntimeError( ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT, - '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.', + (typeof ngDevMode === 'undefined' || ngDevMode) && + '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.', ); } }, From 30aeb81899ea48315a1020629226da3a7f3cb17d Mon Sep 17 00:00:00 2001 From: Rushikesh Kavar Date: Fri, 19 Jul 2024 12:39:07 +0530 Subject: [PATCH 050/143] docs: Adding Router service hierarchical injection level (#57053) PR Close #57053 --- packages/router/src/router.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 0ad5562bbc88..4b63c1277bf4 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -87,7 +87,7 @@ export const subsetMatchOptions: IsActiveMatchOptions = { /** * @description * - * A service that provides navigation among views and URL manipulation capabilities. + * A service that provides navigation among views and URL manipulation capabilities. This service is provided at root level in hierarchical dependency injection. * * @see {@link Route} * @see [Routing and Navigation Guide](guide/routing/common-router-tasks). From 65a0a0329a63a727181caa64d2a9967d48951b4e Mon Sep 17 00:00:00 2001 From: Rushikesh Kavar Date: Fri, 19 Jul 2024 15:23:37 +0530 Subject: [PATCH 051/143] docs: adding reference to RouterModule.forroot method in Router service for better understanding for beginner (#57053) PR Close #57053 --- packages/router/src/router.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 4b63c1277bf4..be31324addf0 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -87,7 +87,8 @@ export const subsetMatchOptions: IsActiveMatchOptions = { /** * @description * - * A service that provides navigation among views and URL manipulation capabilities. This service is provided at root level in hierarchical dependency injection. + * A service that facilitates navigation among views and URL manipulation capabilities. + * This service is provided at root level in hierarchical dependency injection structure by importing module returned from `forRoot` method of [RouterModule](api/router/RouterModule) . * * @see {@link Route} * @see [Routing and Navigation Guide](guide/routing/common-router-tasks). From 4bbdab633dbe6cf74158d642ed4cf6e4de6462b4 Mon Sep 17 00:00:00 2001 From: Rushikesh Kavar Date: Fri, 19 Jul 2024 21:14:04 +0530 Subject: [PATCH 052/143] docs: Update packages/router/src/router.ts (#57053) Co-authored-by: Andrew Scott PR Close #57053 --- packages/router/src/router.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index be31324addf0..b03658b4b5cb 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -88,7 +88,7 @@ export const subsetMatchOptions: IsActiveMatchOptions = { * @description * * A service that facilitates navigation among views and URL manipulation capabilities. - * This service is provided at root level in hierarchical dependency injection structure by importing module returned from `forRoot` method of [RouterModule](api/router/RouterModule) . + * This service is provided in the root scope and configured with [provideRouter](api/router/provideRouter). * * @see {@link Route} * @see [Routing and Navigation Guide](guide/routing/common-router-tasks). From 13bc8d7d81ae1c8a5281522e9c8f4c03ed07fa5f Mon Sep 17 00:00:00 2001 From: Rushikesh Kavar Date: Fri, 19 Jul 2024 21:14:19 +0530 Subject: [PATCH 053/143] docs: Update packages/router/src/router.ts (#57053) Co-authored-by: Andrew Scott PR Close #57053 --- packages/router/src/router.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index b03658b4b5cb..71c052385d8a 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -91,6 +91,7 @@ export const subsetMatchOptions: IsActiveMatchOptions = { * This service is provided in the root scope and configured with [provideRouter](api/router/provideRouter). * * @see {@link Route} + * @see {@link provideRouter} * @see [Routing and Navigation Guide](guide/routing/common-router-tasks). * * @ngModule RouterModule From 08c5977bd53caf7911e48f39fa4f60e5afd813de Mon Sep 17 00:00:00 2001 From: JoostK Date: Sun, 21 Jul 2024 22:21:15 +0200 Subject: [PATCH 054/143] fix(compiler): limit the number of chained instructions (#57069) Some Angular template instructions that follow each other may be chained together in a single expressions statement, containing a deeply nested AST of call expressions. The number of chained instructions wasn't previously limited, so this could result in very deep ASTs that cause stack overflow errors during TypeScript emit. This commit introduces a limit to the number of chained instructions to avoid these problems. Closes #57066 PR Close #57069 --- .../GOLDEN_PARTIAL.js | 548 ++++++++++++++++++ .../r3_view_compiler_template/TEST_CASES.json | 11 + .../create_many_elements.js | 6 + .../create_many_elements.ts | 269 +++++++++ .../template/pipeline/src/phases/chaining.ts | 16 +- 5 files changed, 849 insertions(+), 1 deletion(-) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.js create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.ts diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/GOLDEN_PARTIAL.js index 4458c430feda..c65ce590881c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/GOLDEN_PARTIAL.js @@ -1271,3 +1271,551 @@ export declare class MyComponent { static ɵcmp: i0.ɵɵComponentDeclaration; } +/**************************************************************************************************** + * PARTIAL FILE: create_many_elements.js + ****************************************************************************************************/ +import { Component } from '@angular/core'; +import * as i0 from "@angular/core"; +export class MyComponent { +} +MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); +MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: ` +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `, isInline: true }); +i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, decorators: [{ + type: Component, + args: [{ + selector: 'my-component', + template: ` +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `, + }] + }] }); + +/**************************************************************************************************** + * PARTIAL FILE: create_many_elements.d.ts + ****************************************************************************************************/ +import * as i0 from "@angular/core"; +export declare class MyComponent { + static ɵfac: i0.ɵɵFactoryDeclaration; + static ɵcmp: i0.ɵɵComponentDeclaration; +} + diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json index 4dd2c9508849..9a556531741c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json @@ -398,6 +398,17 @@ "failureMessage": "Incorrect template" } ] + }, + { + "description": "should break large element creation chains", + "inputFiles": [ + "create_many_elements.ts" + ], + "expectations": [ + { + "failureMessage": "Incorrect template" + } + ] } ] } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.js new file mode 100644 index 000000000000..5286f89c7ddd --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.js @@ -0,0 +1,6 @@ +function MyComponent_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵelement(0, "div")(1, "div")(2, "div")…(255, "div"); + $r3$.ɵɵelement(256, "div")(257, "div")(258, "div")(259, "div"); + } +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.ts b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.ts new file mode 100644 index 000000000000..9947c0a79242 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/create_many_elements.ts @@ -0,0 +1,269 @@ +import { Component, NgModule } from '@angular/core'; + +@Component({ + selector: 'my-component', + template: ` +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `, +}) +export class MyComponent { +} diff --git a/packages/compiler/src/template/pipeline/src/phases/chaining.ts b/packages/compiler/src/template/pipeline/src/phases/chaining.ts index 662064ed2e3a..f35a94ae058a 100644 --- a/packages/compiler/src/template/pipeline/src/phases/chaining.ts +++ b/packages/compiler/src/template/pipeline/src/phases/chaining.ts @@ -43,6 +43,13 @@ const CHAINABLE = new Set([ R3.declareLet, ]); +/** + * Chaining results in repeated call expressions, causing a deep AST of receiver expressions. To prevent running out of + * stack depth the maximum number of chained instructions is limited to this threshold, which has been selected + * arbitrarily. + */ +const MAX_CHAIN_LENGTH = 256; + /** * Post-process a reified view compilation and convert sequential calls to chainable instructions * into chain calls. @@ -93,7 +100,7 @@ function chainOperationsInList(opList: ir.OpList): vo // This instruction can be chained. It can either be added on to the previous chain (if // compatible) or it can be the start of a new chain. - if (chain !== null && chain.instruction === instruction) { + if (chain !== null && chain.instruction === instruction && chain.length < MAX_CHAIN_LENGTH) { // This instruction can be added onto the previous chain. const expression = chain.expression.callFn( op.statement.expr.args, @@ -102,6 +109,7 @@ function chainOperationsInList(opList: ir.OpList): vo ); chain.expression = expression; chain.op.statement = expression.toStmt(); + chain.length++; ir.OpList.remove(op as ir.Op); } else { // Leave this instruction alone for now, but consider it the start of a new chain. @@ -109,6 +117,7 @@ function chainOperationsInList(opList: ir.OpList): vo op, instruction, expression: op.statement.expr, + length: 1, }; } } @@ -135,4 +144,9 @@ interface Chain { * The instruction that is being chained. */ instruction: o.ExternalReference; + + /** + * The number of instructions that have been collected into this chain. + */ + length: number; } From fab673a1ddbca19ff9734f92a5ef0cc16be5708c Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 19 Jul 2024 14:50:57 +0200 Subject: [PATCH 055/143] feat(core): add ng generate schematic to convert to inject (#57056) Adds the new `ng generate @angular/core:inject-migration` schematic that will convert existing code from constructor-based injection to injection using the `inject` function. The migration also has a few options that should help reduce compilation errors. This migration is slightly different than our usual ones in that it may have to update entire class or constructor declarations. We don't go through the `ts.factory.update*` APIs for this, because it can cause the entire declaration to be re-formatted. Instead, this migration tries to insert strings in a way that won't affect the user's formatting. PR Close #57056 --- packages/core/schematics/BUILD.bazel | 2 + packages/core/schematics/collection.json | 7 +- .../ng-generate/inject-migration/BUILD.bazel | 38 + .../ng-generate/inject-migration/README.md | 118 ++ .../ng-generate/inject-migration/analysis.ts | 234 ++++ .../ng-generate/inject-migration/index.ts | 81 ++ .../ng-generate/inject-migration/migration.ts | 475 +++++++ .../ng-generate/inject-migration/schema.json | 32 + packages/core/schematics/test/BUILD.bazel | 3 + .../schematics/test/inject_migration_spec.ts | 1111 +++++++++++++++++ 10 files changed, 2100 insertions(+), 1 deletion(-) create mode 100644 packages/core/schematics/ng-generate/inject-migration/BUILD.bazel create mode 100644 packages/core/schematics/ng-generate/inject-migration/README.md create mode 100644 packages/core/schematics/ng-generate/inject-migration/analysis.ts create mode 100644 packages/core/schematics/ng-generate/inject-migration/index.ts create mode 100644 packages/core/schematics/ng-generate/inject-migration/migration.ts create mode 100644 packages/core/schematics/ng-generate/inject-migration/schema.json create mode 100644 packages/core/schematics/test/inject_migration_spec.ts diff --git a/packages/core/schematics/BUILD.bazel b/packages/core/schematics/BUILD.bazel index e7a278fb61dd..eed67befb201 100644 --- a/packages/core/schematics/BUILD.bazel +++ b/packages/core/schematics/BUILD.bazel @@ -13,6 +13,7 @@ pkg_npm( "migrations.json", "package.json", "//packages/core/schematics/ng-generate/control-flow-migration:static_files", + "//packages/core/schematics/ng-generate/inject-migration:static_files", "//packages/core/schematics/ng-generate/standalone-migration:static_files", ], validate = False, @@ -22,6 +23,7 @@ pkg_npm( "//packages/core/schematics/migrations/http-providers:bundle", "//packages/core/schematics/migrations/invalid-two-way-bindings:bundle", "//packages/core/schematics/ng-generate/control-flow-migration:bundle", + "//packages/core/schematics/ng-generate/inject-migration:bundle", "//packages/core/schematics/ng-generate/standalone-migration:bundle", ], ) diff --git a/packages/core/schematics/collection.json b/packages/core/schematics/collection.json index b5dc2135497e..ee13785ab9af 100644 --- a/packages/core/schematics/collection.json +++ b/packages/core/schematics/collection.json @@ -15,6 +15,11 @@ "aliases": [ "control-flow" ] + }, + "inject-migration": { + "description": "Converts usages of constructor-based injection to the inject() function", + "factory": "./ng-generate/inject-migration/bundle", + "schema": "./ng-generate/inject-migration/schema.json" } } -} \ No newline at end of file +} diff --git a/packages/core/schematics/ng-generate/inject-migration/BUILD.bazel b/packages/core/schematics/ng-generate/inject-migration/BUILD.bazel new file mode 100644 index 000000000000..6a884a7ce2b4 --- /dev/null +++ b/packages/core/schematics/ng-generate/inject-migration/BUILD.bazel @@ -0,0 +1,38 @@ +load("//tools:defaults.bzl", "esbuild", "ts_library") + +package( + default_visibility = [ + "//packages/core/schematics:__pkg__", + "//packages/core/schematics/migrations/google3:__pkg__", + "//packages/core/schematics/test:__pkg__", + ], +) + +filegroup( + name = "static_files", + srcs = ["schema.json"], +) + +ts_library( + name = "inject-migration", + srcs = glob(["**/*.ts"]), + tsconfig = "//packages/core/schematics:tsconfig.json", + deps = [ + "//packages/core/schematics/utils", + "@npm//@angular-devkit/schematics", + "@npm//@types/node", + "@npm//typescript", + ], +) + +esbuild( + name = "bundle", + entry_point = ":index.ts", + external = [ + "@angular-devkit/*", + "typescript", + ], + format = "cjs", + platform = "node", + deps = [":inject-migration"], +) diff --git a/packages/core/schematics/ng-generate/inject-migration/README.md b/packages/core/schematics/ng-generate/inject-migration/README.md new file mode 100644 index 000000000000..c7f82b51996d --- /dev/null +++ b/packages/core/schematics/ng-generate/inject-migration/README.md @@ -0,0 +1,118 @@ +## Inject migration +Automated migration that converts classes using constructor-based injection to the `inject` +function. It can be run using: + +```bash +ng generate @angular/core:inject-migration +``` + +**Before:** +```typescript +import { Component, Inject, Optional } from '@angular/core'; +import { MyService } from './service'; +import { DI_TOKEN } from './token'; + +@Component({}) +export class MyComp { + constructor(private service: MyService, @Inject(TOKEN) @Optional() readonly token: string) {} +} +``` + +**After:** +```typescript +import { Component, Inject, Optional, inject } from '@angular/core'; +import { MyService } from './service'; +import { DI_TOKEN } from './token'; + +@Component({}) +export class MyComp { + private service = inject(MyService); + readonly token = inject(DI_TOKEN, { optional: true }); +} +``` + +### Options +The migration includes several options to customize its output. + +#### `path` +Determines which sub-path in your project should be migrated. Pass in `.` or leave it blank to +migrate the entire directory. + +#### `migrateAbstractClasses` +Angular doesn't validate that parameters of abstract classes are injectable. This means that the +migration can't reliably migrate them to `inject` without risking breakages which is why they're +disabled by default. Enable this option if you want abstract classes to be migrated, but note +that you may have to **fix some breakages manually**. + +#### `backwardsCompatibleConstructors` +By default the migration tries to clean up the code as much as it can, which includes deleting +parameters from the constructor, or even the entire constructor if it doesn't include any code. +In some cases this can lead to compilation errors when classes with Angular decorators inherit from +other classes with Angular decorators. If you enable this option, the migration will generate an +additional constructor signature to keep it backwards compatible, at the expense of more code. + +**Before:** +```typescript +import { Component } from '@angular/core'; +import { MyService } from './service'; + +@Component({}) +export class MyComp { + constructor(private service: MyService) {} +} +``` + +**After:** +```typescript +import { Component } from '@angular/core'; +import { MyService } from './service'; + +@Component({}) +export class MyComp { + private service = inject(MyService); + + /** Inserted by Angular inject() migration for backwards compatibility */ + constructor(...args: unknown[]); + + constructor() {} +} +``` + +#### `nonNullableOptional` +If injection fails for a parameter with the `@Optional` decorator, Angular returns `null` which +means that the real type of any `@Optional` parameter will be `| null`. However, because decorators +cannot influence their types, there is a lot of existing code whose type is incorrect. The type is +fixed in `inject()` which can cause new compilation errors to show up. If you enable this option, +the migration will produce a non-null assertion after the `inject()` call to match the old type, +at the expense of potentially hiding type errors. + +**Note:** non-null assertions won't be added to parameters that are already typed to be nullable, +because the code that depends on them likely already accounts for their nullability. + +**Before:** +```typescript +import { Component, Inject, Optional } from '@angular/core'; +import { TOKEN_ONE, TOKEN_TWO } from './token'; + +@Component({}) +export class MyComp { + constructor( + @Inject(TOKEN_ONE) @Optional() private tokenOne: number, + @Inject(TOKEN_TWO) @Optional() private tokenTwo: string | null) {} +} +``` + +**After:** +```typescript +import { Component, Inject, Optional, inject } from '@angular/core'; +import { TOKEN_ONE, TOKEN_TWO } from './token'; + +@Component({}) +export class MyComp { + // Note the `!` at the end. + private tokenOne = inject(TOKEN_ONE, { optional: true })!; + + // Does not have `!` at the end, because the type was already nullable. + private tokenTwo = inject(TOKEN_TWO, { optional: true }); +} +``` diff --git a/packages/core/schematics/ng-generate/inject-migration/analysis.ts b/packages/core/schematics/ng-generate/inject-migration/analysis.ts new file mode 100644 index 000000000000..8d6e72977c09 --- /dev/null +++ b/packages/core/schematics/ng-generate/inject-migration/analysis.ts @@ -0,0 +1,234 @@ +/*! + * @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 ts from 'typescript'; +import {getAngularDecorators} from '../../utils/ng_decorators'; + +/** Names of decorators that enable DI on a class declaration. */ +const DECORATORS_SUPPORTING_DI = new Set([ + 'Component', + 'Directive', + 'Pipe', + 'NgModule', + 'Injectable', +]); + +/** + * Detects the classes within a file that are likely using DI. + * @param sourceFile File in which to search for classes. + * @param localTypeChecker Type checker scoped to the specific file. + */ +export function detectClassesUsingDI(sourceFile: ts.SourceFile, localTypeChecker: ts.TypeChecker) { + const results: { + node: ts.ClassDeclaration; + constructor: ts.ConstructorDeclaration; + superCall: ts.CallExpression | null; + }[] = []; + + sourceFile.forEachChild(function walk(node) { + if (ts.isClassDeclaration(node)) { + const decorators = getAngularDecorators(localTypeChecker, ts.getDecorators(node) || []); + const supportsDI = decorators.some((dec) => DECORATORS_SUPPORTING_DI.has(dec.name)); + const constructorNode = node.members.find( + (member) => + ts.isConstructorDeclaration(member) && + member.body != null && + member.parameters.length > 0, + ) as ts.ConstructorDeclaration | undefined; + + if (supportsDI && constructorNode) { + results.push({ + node, + constructor: constructorNode, + superCall: node.heritageClauses ? findSuperCall(constructorNode) : null, + }); + } + } + + node.forEachChild(walk); + }); + + return results; +} + +/** + * Returns the parameters of a function that aren't used within its body. + * @param declaration Function in which to search for unused parameters. + * @param localTypeChecker Type checker scoped to the file in which the function was declared. + */ +export function getConstructorUnusedParameters( + declaration: ts.ConstructorDeclaration, + localTypeChecker: ts.TypeChecker, +): Set { + const accessedTopLevelParameters = new Set(); + const topLevelParameters = new Set(); + const topLevelParameterNames = new Set(); + const unusedParams = new Set(); + + // Prepare the parameters for quicker checks further down. + for (const param of declaration.parameters) { + if (ts.isIdentifier(param.name)) { + topLevelParameters.add(param); + topLevelParameterNames.add(param.name.text); + } + } + + if (!declaration.body) { + return topLevelParameters; + } + + declaration.body.forEachChild(function walk(node) { + if (!ts.isIdentifier(node) || !topLevelParameterNames.has(node.text)) { + node.forEachChild(walk); + return; + } + + // Don't consider `this.` accesses as being references to + // parameters since they'll be moved to property declarations. + if ( + ts.isPropertyAccessExpression(node.parent) && + node.parent.expression.kind === ts.SyntaxKind.ThisKeyword && + node.parent.name === node + ) { + return; + } + + localTypeChecker.getSymbolAtLocation(node)?.declarations?.forEach((decl) => { + if (ts.isParameter(decl) && topLevelParameters.has(decl)) { + accessedTopLevelParameters.add(decl); + } + }); + }); + + for (const param of topLevelParameters) { + if (!accessedTopLevelParameters.has(param)) { + unusedParams.add(param); + } + } + + return unusedParams; +} + +/** + * Determines which parameters of a function declaration are used within its `super` call. + * @param declaration Function whose parameters to search for. + * @param superCall `super()` call within the function. + * @param localTypeChecker Type checker scoped to the file in which the function is declared. + */ +export function getSuperParameters( + declaration: ts.FunctionLikeDeclaration, + superCall: ts.CallExpression, + localTypeChecker: ts.TypeChecker, +): Set { + const usedParams = new Set(); + const topLevelParameters = new Set(); + const topLevelParameterNames = new Set(); + + // Prepare the parameters for quicker checks further down. + for (const param of declaration.parameters) { + if (ts.isIdentifier(param.name)) { + topLevelParameters.add(param); + topLevelParameterNames.add(param.name.text); + } + } + + superCall.forEachChild(function walk(node) { + if (ts.isIdentifier(node) && topLevelParameterNames.has(node.text)) { + localTypeChecker.getSymbolAtLocation(node)?.declarations?.forEach((decl) => { + if (ts.isParameter(decl) && topLevelParameters.has(decl)) { + usedParams.add(decl); + } + }); + } else { + node.forEachChild(walk); + } + }); + + return usedParams; +} + +/** + * Gets the indentation text of a node. Can be used to + * output text with the same level of indentation. + * @param node Node for which to get the indentation level. + */ +export function getNodeIndentation(node: ts.Node): string { + const fullText = node.getFullText(); + const end = fullText.indexOf(node.getText()); + let result = ''; + + for (let i = end - 1; i > -1; i--) { + // Note: LF line endings are `\n` while CRLF are `\r\n`. This logic should cover both, because + // we start from the beginning of the node and go backwards so will always hit `\n` first. + if (fullText[i] !== '\n') { + result = fullText[i] + result; + } else { + break; + } + } + + return result; +} + +/** Checks whether a parameter node declares a property on its class. */ +export function parameterDeclaresProperty(node: ts.ParameterDeclaration): boolean { + return !!node.modifiers?.some( + ({kind}) => + kind === ts.SyntaxKind.PublicKeyword || + kind === ts.SyntaxKind.PrivateKeyword || + kind === ts.SyntaxKind.ProtectedKeyword || + kind === ts.SyntaxKind.ReadonlyKeyword, + ); +} + +/** Checks whether a type node is nullable. */ +export function isNullableType(node: ts.TypeNode): boolean { + // Apparently `foo: null` is `Parameter>`, + // while `foo: undefined` is `Parameter`... + if (node.kind === ts.SyntaxKind.UndefinedKeyword || node.kind === ts.SyntaxKind.VoidKeyword) { + return true; + } + + if (ts.isLiteralTypeNode(node)) { + return node.literal.kind === ts.SyntaxKind.NullKeyword; + } + + if (ts.isUnionTypeNode(node)) { + return node.types.some(isNullableType); + } + + return false; +} + +/** Checks whether a type node has generic arguments. */ +export function hasGenerics(node: ts.TypeNode): boolean { + if (ts.isTypeReferenceNode(node)) { + return node.typeArguments != null && node.typeArguments.length > 0; + } + + if (ts.isUnionTypeNode(node)) { + return node.types.some(hasGenerics); + } + + return false; +} + +/** Finds a `super` call inside of a specific node. */ +function findSuperCall(root: ts.Node): ts.CallExpression | null { + let result: ts.CallExpression | null = null; + + root.forEachChild(function find(node) { + if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.SuperKeyword) { + result = node; + } else if (result === null) { + node.forEachChild(find); + } + }); + + return result; +} diff --git a/packages/core/schematics/ng-generate/inject-migration/index.ts b/packages/core/schematics/ng-generate/inject-migration/index.ts new file mode 100644 index 000000000000..3e2f80b319df --- /dev/null +++ b/packages/core/schematics/ng-generate/inject-migration/index.ts @@ -0,0 +1,81 @@ +/** + * @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 {Rule, SchematicsException, Tree} from '@angular-devkit/schematics'; +import {join, relative} from 'path'; + +import {normalizePath} from '../../utils/change_tracker'; +import {canMigrateFile, createMigrationProgram} from '../../utils/typescript/compiler_host'; + +import {migrateFile, MigrationOptions} from './migration'; + +interface Options extends MigrationOptions { + path: string; +} + +export default function (options: Options): Rule { + return async (tree: Tree) => { + const basePath = process.cwd(); + const pathToMigrate = normalizePath(join(basePath, options.path)); + let allPaths = []; + if (pathToMigrate.trim() !== '') { + allPaths.push(pathToMigrate); + } + + if (!allPaths.length) { + throw new SchematicsException( + 'Could not find any tsconfig file. Cannot run the inject migration.', + ); + } + + for (const tsconfigPath of allPaths) { + runInjectMigration(tree, tsconfigPath, basePath, pathToMigrate, options); + } + }; +} + +function runInjectMigration( + tree: Tree, + tsconfigPath: string, + basePath: string, + pathToMigrate: string, + schematicOptions: Options, +): void { + if (schematicOptions.path.startsWith('..')) { + throw new SchematicsException('Cannot run inject migration outside of the current project.'); + } + + const program = createMigrationProgram(tree, tsconfigPath, basePath); + const sourceFiles = program + .getSourceFiles() + .filter( + (sourceFile) => + sourceFile.fileName.startsWith(pathToMigrate) && + canMigrateFile(basePath, sourceFile, program), + ); + + if (sourceFiles.length === 0) { + throw new SchematicsException( + `Could not find any files to migrate under the path ${pathToMigrate}. Cannot run the inject migration.`, + ); + } + + for (const sourceFile of sourceFiles) { + const changes = migrateFile(sourceFile, schematicOptions); + const update = tree.beginUpdate(relative(basePath, sourceFile.fileName)); + + changes.forEach((change) => { + if (change.removeLength != null) { + update.remove(change.start, change.removeLength); + } + update.insertRight(change.start, change.text); + }); + + tree.commitUpdate(update); + } +} diff --git a/packages/core/schematics/ng-generate/inject-migration/migration.ts b/packages/core/schematics/ng-generate/inject-migration/migration.ts new file mode 100644 index 000000000000..c37905ab723b --- /dev/null +++ b/packages/core/schematics/ng-generate/inject-migration/migration.ts @@ -0,0 +1,475 @@ +/** + * @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 ts from 'typescript'; +import {PendingChange, ChangeTracker} from '../../utils/change_tracker'; +import { + detectClassesUsingDI, + getNodeIndentation, + getSuperParameters, + getConstructorUnusedParameters, + hasGenerics, + isNullableType, + parameterDeclaresProperty, +} from './analysis'; +import {getAngularDecorators} from '../../utils/ng_decorators'; + +/** + * Placeholder used to represent expressions inside the AST. + * Includes Unicode characters to reduce the chance of collisions. + */ +const PLACEHOLDER = 'ɵɵngGeneratePlaceholderɵɵ'; + +/** Options that can be used to configure the migration. */ +export interface MigrationOptions { + /** Whether to generate code that keeps injectors backwards compatible. */ + backwardsCompatibleConstructors: boolean; + + /** Whether to migrate abstract classes. */ + migrateAbstractClasses: boolean; + + /** Whether to make the return type of `@Optinal()` parameters to be non-nullable. */ + nonNullableOptional: boolean; +} + +/** + * Migrates all of the classes in a `SourceFile` away from constructor injection. + * @param sourceFile File to be migrated. + * @param options Options that configure the migration. + */ +export function migrateFile(sourceFile: ts.SourceFile, options: MigrationOptions): PendingChange[] { + // Note: even though externally we have access to the full program with a proper type + // checker, we create a new one that is local to the file for a couple of reasons: + // 1. Not having to depend on a program makes running the migration internally faster and easier. + // 2. All the necessary information for this migration is local so using a file-specific type + // checker should speed up the lookups. + const localTypeChecker = getLocalTypeChecker(sourceFile); + const printer = ts.createPrinter(); + const tracker = new ChangeTracker(printer); + + detectClassesUsingDI(sourceFile, localTypeChecker).forEach((result) => { + migrateClass( + result.node, + result.constructor, + result.superCall, + options, + localTypeChecker, + printer, + tracker, + ); + }); + + return tracker.recordChanges().get(sourceFile) || []; +} + +/** + * Migrates a class away from constructor injection. + * @param node Class to be migrated. + * @param constructor Reference to the class' constructor node. + * @param superCall Reference to the constructor's `super()` call, if any. + * @param options Options used to configure the migration. + * @param localTypeChecker Type checker set up for the specific file. + * @param printer Printer used to output AST nodes as strings. + * @param tracker Object keeping track of the changes made to the file. + */ +function migrateClass( + node: ts.ClassDeclaration, + constructor: ts.ConstructorDeclaration, + superCall: ts.CallExpression | null, + options: MigrationOptions, + localTypeChecker: ts.TypeChecker, + printer: ts.Printer, + tracker: ChangeTracker, +): void { + const isAbstract = !!node.modifiers?.some((m) => m.kind === ts.SyntaxKind.AbstractKeyword); + + // Don't migrate abstract classes by default, because + // their parameters aren't guaranteed to be injectable. + if (isAbstract && !options.migrateAbstractClasses) { + return; + } + + const sourceFile = node.getSourceFile(); + const unusedParameters = getConstructorUnusedParameters(constructor, localTypeChecker); + const superParameters = superCall + ? getSuperParameters(constructor, superCall, localTypeChecker) + : null; + const memberIndentation = getNodeIndentation(node.members[0]); + const innerReference = superCall || constructor.body?.statements[0] || constructor; + const innerIndentation = getNodeIndentation(innerReference); + const propsToAdd: string[] = []; + const prependToConstructor: string[] = []; + const afterSuper: string[] = []; + const removedMembers = new Set(); + + for (const param of constructor.parameters) { + const usedInSuper = superParameters !== null && superParameters.has(param); + const usedInConstructor = !unusedParameters.has(param); + + migrateParameter( + param, + options, + localTypeChecker, + printer, + tracker, + superCall, + usedInSuper, + usedInConstructor, + memberIndentation, + innerIndentation, + prependToConstructor, + propsToAdd, + afterSuper, + ); + } + + // Delete all of the constructor overloads since below we're either going to + // remove the implementation, or we're going to delete all of the parameters. + for (const member of node.members) { + if (ts.isConstructorDeclaration(member) && member !== constructor) { + removedMembers.add(member); + tracker.replaceText(sourceFile, member.getFullStart(), member.getFullWidth(), ''); + } + } + + if ( + !options.backwardsCompatibleConstructors && + (!constructor.body || constructor.body.statements.length === 0) + ) { + // Drop the constructor if it was empty. + removedMembers.add(constructor); + tracker.replaceText(sourceFile, constructor.getFullStart(), constructor.getFullWidth(), ''); + } else { + // If the constructor contains any statements, only remove the parameters. + // We always do this no matter what is passed into `backwardsCompatibleConstructors`. + stripConstructorParameters(constructor, tracker); + + if (prependToConstructor.length > 0) { + tracker.insertText( + sourceFile, + innerReference.getFullStart(), + `\n${prependToConstructor.join('\n')}\n`, + ); + } + } + + if (afterSuper.length > 0 && superCall !== null) { + tracker.insertText(sourceFile, superCall.getEnd() + 1, `\n${afterSuper.join('\n')}\n`); + } + + // Need to resolve this once all constructor signatures have been removed. + const memberReference = node.members.find((m) => !removedMembers.has(m)) || node.members[0]; + + // If `backwardsCompatibleConstructors` is enabled, we maintain + // backwards compatibility by adding a catch-all signature. + if (options.backwardsCompatibleConstructors) { + const extraSignature = + `\n${memberIndentation}/** Inserted by Angular inject() migration for backwards compatibility */\n` + + `${memberIndentation}constructor(...args: unknown[]);`; + + // The new signature always has to be right before the constructor implementation. + if (memberReference === constructor) { + propsToAdd.push(extraSignature); + } else { + tracker.insertText(sourceFile, constructor.getFullStart(), '\n' + extraSignature); + } + } + + if (propsToAdd.length > 0) { + if (removedMembers.size === node.members.length) { + tracker.insertText(sourceFile, constructor.getEnd() + 1, `${propsToAdd.join('\n')}\n`); + } else { + // Insert the new properties after the first member that hasn't been deleted. + tracker.insertText( + sourceFile, + memberReference.getFullStart(), + `\n${propsToAdd.join('\n')}\n`, + ); + } + } +} + +/** + * Migrates a single parameter to `inject()` DI. + * @param node Parameter to be migrated. + * @param options Options used to configure the migration. + * @param localTypeChecker Type checker set up for the specific file. + * @param printer Printer used to output AST nodes as strings. + * @param tracker Object keeping track of the changes made to the file. + * @param superCall Call to `super()` from the class' constructor. + * @param usedInSuper Whether the parameter is referenced inside of `super`. + * @param usedInConstructor Whether the parameter is referenced inside the body of the constructor. + * @param memberIndentation Indentation string to use when inserting new class members. + * @param innerIndentation Indentation string to use when inserting new constructor statements. + * @param prependToConstructor Statements to be prepended to the constructor. + * @param propsToAdd Properties to be added to the class. + * @param afterSuper Statements to be added after the `super` call. + */ +function migrateParameter( + node: ts.ParameterDeclaration, + options: MigrationOptions, + localTypeChecker: ts.TypeChecker, + printer: ts.Printer, + tracker: ChangeTracker, + superCall: ts.CallExpression | null, + usedInSuper: boolean, + usedInConstructor: boolean, + memberIndentation: string, + innerIndentation: string, + prependToConstructor: string[], + propsToAdd: string[], + afterSuper: string[], +): void { + if (!ts.isIdentifier(node.name)) { + return; + } + + const name = node.name.text; + const replacementCall = createInjectReplacementCall( + node, + options, + localTypeChecker, + printer, + tracker, + ); + const declaresProp = parameterDeclaresProperty(node); + + // If the parameter declares a property, we need to declare it (e.g. `private foo: Foo`). + if (declaresProp) { + const prop = ts.factory.createPropertyDeclaration( + node.modifiers?.filter((modifier) => { + // Strip out the DI decorators, as well as `public` which is redundant. + return !ts.isDecorator(modifier) && modifier.kind !== ts.SyntaxKind.PublicKeyword; + }), + name, + undefined, + // We can't initialize the property if it's referenced within a `super` call. + // See the logic further below for the initialization. + usedInSuper ? node.type : undefined, + usedInSuper ? undefined : ts.factory.createIdentifier(PLACEHOLDER), + ); + + propsToAdd.push( + memberIndentation + + replaceNodePlaceholder(node.getSourceFile(), prop, replacementCall, printer), + ); + } + + // If the parameter is referenced within the constructor, we need to declare it as a variable. + if (usedInConstructor) { + if (usedInSuper) { + // Usages of `this` aren't allowed before `super` calls so we need to + // create a variable which calls `inject()` directly instead... + prependToConstructor.push(`${innerIndentation}const ${name} = ${replacementCall};`); + + // ...then we can initialize the property after the `super` call. + if (declaresProp) { + afterSuper.push(`${innerIndentation}this.${name} = ${name};`); + } + } else if (declaresProp) { + // If the parameter declares a property (`private foo: foo`) and is used inside the class + // at the same time, we need to ensure that it's initialized to the value from the variable + // and that we only reference `this` after the `super` call. + const initializer = `${innerIndentation}const ${name} = this.${name};`; + + if (superCall === null) { + prependToConstructor.push(initializer); + } else { + afterSuper.push(initializer); + } + } else { + // If the parameter is only referenced in the constructor, we + // don't need to declare any new properties. + prependToConstructor.push(`${innerIndentation}const ${name} = ${replacementCall};`); + } + } +} + +/** + * Creates a replacement `inject` call from a function parameter. + * @param param Parameter for which to generate the `inject` call. + * @param options Options used to configure the migration. + * @param localTypeChecker Type checker set up for the specific file. + * @param printer Printer used to output AST nodes as strings. + * @param tracker Object keeping track of the changes made to the file. + */ +function createInjectReplacementCall( + param: ts.ParameterDeclaration, + options: MigrationOptions, + localTypeChecker: ts.TypeChecker, + printer: ts.Printer, + tracker: ChangeTracker, +): string { + const moduleName = '@angular/core'; + const sourceFile = param.getSourceFile(); + const decorators = getAngularDecorators(localTypeChecker, ts.getDecorators(param) || []); + const literalProps: ts.ObjectLiteralElementLike[] = []; + let injectedType = param.type?.getText() || ''; + let typeArguments = param.type && hasGenerics(param.type) ? [param.type] : undefined; + let hasOptionalDecorator = false; + + for (const decorator of decorators) { + if (decorator.moduleName !== moduleName) { + continue; + } + + const firstArg = decorator.node.expression.arguments[0] as ts.Expression | undefined; + + switch (decorator.name) { + case 'Inject': + if (firstArg) { + injectedType = firstArg.getText(); + + // `inject` no longer officially supports string injection so we need + // to cast to any. We maintain the type by passing it as a generic. + if (ts.isStringLiteralLike(firstArg)) { + typeArguments = [ + param.type || ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), + ]; + injectedType += ' as any'; + } + } + break; + + case 'Attribute': + if (firstArg) { + const constructorRef = tracker.addImport(sourceFile, 'HostAttributeToken', moduleName); + const expression = ts.factory.createNewExpression(constructorRef, undefined, [firstArg]); + injectedType = printer.printNode(ts.EmitHint.Unspecified, expression, sourceFile); + typeArguments = undefined; + } + break; + + case 'Optional': + hasOptionalDecorator = true; + literalProps.push(ts.factory.createPropertyAssignment('optional', ts.factory.createTrue())); + break; + + case 'SkipSelf': + literalProps.push(ts.factory.createPropertyAssignment('skipSelf', ts.factory.createTrue())); + break; + + case 'Self': + literalProps.push(ts.factory.createPropertyAssignment('self', ts.factory.createTrue())); + break; + + case 'Host': + literalProps.push(ts.factory.createPropertyAssignment('host', ts.factory.createTrue())); + break; + } + } + + // The injected type might be a `TypeNode` which we can't easily convert into an `Expression`. + // Since the value gets passed through directly anyway, we generate the call using a placeholder + // which we then replace with the raw text of the `TypeNode`. + const injectRef = tracker.addImport(param.getSourceFile(), 'inject', moduleName); + const args: ts.Expression[] = [ts.factory.createIdentifier(PLACEHOLDER)]; + + if (literalProps.length > 0) { + args.push(ts.factory.createObjectLiteralExpression(literalProps)); + } + + let expression: ts.Expression = ts.factory.createCallExpression(injectRef, typeArguments, args); + + if (hasOptionalDecorator && options.nonNullableOptional) { + const hasNullableType = + param.questionToken != null || (param.type != null && isNullableType(param.type)); + + // Only wrap the expression if the type wasn't already nullable. + // If it was, the app was likely accounting for it already. + if (!hasNullableType) { + expression = ts.factory.createNonNullExpression(expression); + } + } + + return replaceNodePlaceholder(param.getSourceFile(), expression, injectedType, printer); +} + +/** + * Removes the parameters from a constructor. This is a bit more complex than just replacing an AST + * node, because `NodeArray.pos` includes any leading whitespace, but `NodeArray.end` does **not** + * include trailing whitespace. Since we want to produce somewhat formatted code, we need to find + * the end of the arguments ourselves. We do it by finding the next parenthesis after the last + * parameter. + * @param node Constructor from which to remove the parameters. + * @param tracker Object keeping track of the changes made to the file. + */ +function stripConstructorParameters(node: ts.ConstructorDeclaration, tracker: ChangeTracker): void { + if (node.parameters.length === 0) { + return; + } + + const constructorText = node.getText(); + const lastParamText = node.parameters[node.parameters.length - 1].getText(); + const lastParamStart = constructorText.indexOf(lastParamText); + const whitespacePattern = /\s/; + let trailingCharacters = 0; + + if (lastParamStart > -1) { + let lastParamEnd = lastParamStart + lastParamText.length; + let closeParenIndex = -1; + + for (let i = lastParamEnd; i < constructorText.length; i++) { + const char = constructorText[i]; + + if (char === ')') { + closeParenIndex = i; + break; + } else if (!whitespacePattern.test(char)) { + // The end of the last parameter won't include + // any trailing commas which we need to account for. + lastParamEnd = i + 1; + } + } + + if (closeParenIndex > -1) { + trailingCharacters = closeParenIndex - lastParamEnd; + } + } + + tracker.replaceText( + node.getSourceFile(), + node.parameters.pos, + node.parameters.end - node.parameters.pos + trailingCharacters, + '', + ); +} + +/** + * Creates a type checker scoped to a specific file. + * @param sourceFile File for which to create the type checker. + */ +function getLocalTypeChecker(sourceFile: ts.SourceFile) { + const options: ts.CompilerOptions = {noEmit: true, skipLibCheck: true}; + const host = ts.createCompilerHost(options); + host.getSourceFile = (fileName) => (fileName === sourceFile.fileName ? sourceFile : undefined); + const program = ts.createProgram({ + rootNames: [sourceFile.fileName], + options, + host, + }); + + return program.getTypeChecker(); +} + +/** + * Prints out an AST node and replaces the placeholder inside of it. + * @param sourceFile File in which the node will be inserted. + * @param node Node to be printed out. + * @param replacement Replacement for the placeholder. + * @param printer Printer used to output AST nodes as strings. + */ +function replaceNodePlaceholder( + sourceFile: ts.SourceFile, + node: ts.Node, + replacement: string, + printer: ts.Printer, +): string { + const result = printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); + return result.replace(PLACEHOLDER, replacement); +} diff --git a/packages/core/schematics/ng-generate/inject-migration/schema.json b/packages/core/schematics/ng-generate/inject-migration/schema.json new file mode 100644 index 000000000000..c7c406a58dd4 --- /dev/null +++ b/packages/core/schematics/ng-generate/inject-migration/schema.json @@ -0,0 +1,32 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "AngularInjectMigration", + "title": "Angular Inject Migration Schema", + "type": "object", + "properties": { + "path": { + "type": "string", + "description": "Path relative to the project root which should be migrated", + "x-prompt": "Which path in your project should be migrated?", + "default": "./" + }, + "migrateAbstractClasses": { + "type": "boolean", + "description": "Whether abstract classes should be migrated", + "x-prompt": "Do you want to migrate abstract classes? Abstract classes are not migrated by default, because their parameters aren't guaranteed to be injectable", + "default": false + }, + "backwardsCompatibleConstructors": { + "type": "boolean", + "description": "Whether to clean up constructors or keep their signatures backwards compatible", + "x-prompt": "Do you want to clean up all constructors or keep them backwards compatible? Enabling this option will include an additional signature of `constructor(...args: unknown[]);` that will avoid errors for sub-classes, but will increase the amount of generated code by the migration", + "default": false + }, + "nonNullableOptional": { + "type": "boolean", + "description": "Whether to cast the optional inject sites to be non-nullable", + "x-prompt": "Do you want optional inject calls to be non-nullable? Enable this option if you want the return type to be identical to @Optional(), at the expense of worse type safety", + "default": false + } + } +} diff --git a/packages/core/schematics/test/BUILD.bazel b/packages/core/schematics/test/BUILD.bazel index 975ea644eaa9..cffd21a21f31 100644 --- a/packages/core/schematics/test/BUILD.bazel +++ b/packages/core/schematics/test/BUILD.bazel @@ -28,6 +28,9 @@ jasmine_node_test( "//packages/core/schematics/ng-generate/control-flow-migration", "//packages/core/schematics/ng-generate/control-flow-migration:bundle", "//packages/core/schematics/ng-generate/control-flow-migration:static_files", + "//packages/core/schematics/ng-generate/inject-migration", + "//packages/core/schematics/ng-generate/inject-migration:bundle", + "//packages/core/schematics/ng-generate/inject-migration:static_files", "//packages/core/schematics/ng-generate/standalone-migration", "//packages/core/schematics/ng-generate/standalone-migration:bundle", "//packages/core/schematics/ng-generate/standalone-migration:static_files", diff --git a/packages/core/schematics/test/inject_migration_spec.ts b/packages/core/schematics/test/inject_migration_spec.ts new file mode 100644 index 000000000000..98bbf2d6db3d --- /dev/null +++ b/packages/core/schematics/test/inject_migration_spec.ts @@ -0,0 +1,1111 @@ +/** + * @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 {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; +import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; +import {HostTree} from '@angular-devkit/schematics'; +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; +import {runfiles} from '@bazel/runfiles'; +import shx from 'shelljs'; + +describe('inject migration', () => { + let runner: SchematicTestRunner; + let host: TempScopedNodeJsSyncHost; + let tree: UnitTestTree; + let tmpDirPath: string; + let previousWorkingDir: string; + + function writeFile(filePath: string, contents: string) { + host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); + } + + function runMigration(options?: { + path?: string; + backwardsCompatibleConstructors?: boolean; + migrateAbstractClasses?: boolean; + nonNullableOptional?: boolean; + }) { + return runner.runSchematic('inject-migration', options, tree); + } + + beforeEach(() => { + runner = new SchematicTestRunner('test', runfiles.resolvePackageRelative('../collection.json')); + host = new TempScopedNodeJsSyncHost(); + tree = new UnitTestTree(new HostTree(host)); + + writeFile('/tsconfig.json', '{}'); + writeFile( + '/angular.json', + JSON.stringify({ + version: 1, + projects: {t: {root: '', architect: {build: {options: {tsConfig: './tsconfig.json'}}}}}, + }), + ); + + previousWorkingDir = shx.pwd(); + tmpDirPath = getSystemPath(host.root); + shx.cd(tmpDirPath); + }); + + afterEach(() => { + shx.cd(previousWorkingDir); + shx.rm('-r', tmpDirPath); + }); + + ['Directive', 'Component', 'Pipe', 'NgModule'].forEach((decorator) => { + it(`should migrate a @${decorator} to use inject()`, async () => { + writeFile( + '/dir.ts', + [ + `import { ${decorator} } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@${decorator}()`, + `class MyClass {`, + ` constructor(private foo: Foo, readonly bar: Bar) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { ${decorator}, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@${decorator}()`, + `class MyClass {`, + ` private foo = inject(Foo);`, + ` readonly bar = inject(Bar);`, + `}`, + ]); + }); + }); + + it('should take the injected type from @Inject()', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { FOO_TOKEN } from './token';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(@Inject(FOO_TOKEN) private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Inject, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { FOO_TOKEN } from './token';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(FOO_TOKEN);`, + `}`, + ]); + }); + + it('should account for string tokens in @Inject()', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Inject } from '@angular/core';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(@Inject('not-officially-supported') private foo: number) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Inject, inject } from '@angular/core';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject('not-officially-supported' as any);`, + `}`, + ]); + }); + + it('should account for injected generic parameters', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Inject, ElementRef } from '@angular/core';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(`, + ` private one: ElementRef`, + ` @Inject(ElementRef) private two: ElementRef | ElementRef`, + ` ) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Inject, ElementRef, inject } from '@angular/core';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private one = inject>(ElementRef);`, + ` private two = inject | ElementRef>(ElementRef);`, + `}`, + ]); + }); + + it('should transform @Attribute() to HostAttributeToken', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Attribute } from '@angular/core';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(@Attribute('foo') private foo: string) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Attribute, HostAttributeToken, inject } from '@angular/core';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(new HostAttributeToken('foo'));`, + `}`, + ]); + }); + + it('should generate the options object if additional decorators are used', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Inject, Optional, Self, Host } from '@angular/core';`, + `import { FOO_TOKEN, BAR_TOKEN, Foo } from './tokens';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(`, + ` @Inject(FOO_TOKEN) @Optional() private a: number`, + ` @Self() @Inject(BAR_TOKEN) protected b: string`, + ` @Optional() @Host() readonly c: Foo`, + ` ) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Inject, Optional, Self, Host, inject } from '@angular/core';`, + `import { FOO_TOKEN, BAR_TOKEN, Foo } from './tokens';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private a = inject(FOO_TOKEN, { optional: true });`, + ` protected b = inject(BAR_TOKEN, { self: true });`, + ` readonly c = inject(Foo, { optional: true, host: true });`, + `}`, + ]); + }); + + it('should migrate an aliased decorator to use inject()', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive as NgDirective } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@NgDirective()`, + `class MyDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive as NgDirective, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@NgDirective()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + `}`, + ]); + }); + + it('should migrate an aliased decorator to use inject()', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive as NgDirective } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@NgDirective()`, + `class MyDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive as NgDirective, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@NgDirective()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + `}`, + ]); + }); + + it('should only migrate classes in the specified directory', async () => { + writeFile( + '/should-migrate/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + writeFile( + '/should-not-migrate/other-dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyOtherDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration({path: '/should-migrate'}); + + expect(tree.readContent('/should-migrate/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + `}`, + ]); + + expect(tree.readContent('/should-not-migrate/other-dir.ts').split('\n')).toEqual([ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyOtherDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ]); + }); + + it('should not migrate classes decorated with a non-Angular decorator', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@not-angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive } from '@not-angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ]); + }); + + it('should migrate a nested class', async () => { + writeFile( + '/comp.spec.ts', + [ + `import { Component } from '@angular/core';`, + `import { TestBed } from '@angular/core/testing';`, + `import { Foo } from 'foo';`, + ``, + `describe('MyComp', () => {`, + ` it('should work', () => {`, + ` @Component({standalone: true})`, + ` class MyComp {`, + ` constructor(private foo: Foo) {}`, + ` }`, + ``, + ` TestBed.createComponent(MyComp);`, + ` });`, + `});`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/comp.spec.ts').split('\n')).toEqual([ + `import { Component, inject } from '@angular/core';`, + `import { TestBed } from '@angular/core/testing';`, + `import { Foo } from 'foo';`, + ``, + `describe('MyComp', () => {`, + ` it('should work', () => {`, + ` @Component({standalone: true})`, + ` class MyComp {`, + ` private foo = inject(Foo);`, + ` }`, + ``, + ` TestBed.createComponent(MyComp);`, + ` });`, + `});`, + ]); + }); + + it('should preserve the constructor if it has other expressions', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo) {`, + ` console.log('hello');`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` constructor() {`, + ` console.log('hello');`, + ` }`, + `}`, + ]); + }); + + it('should declare a variable if an injected parameter without modifiers is referenced in the constructor', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(foo: Foo) {`, + ` console.log(foo.bar + 123);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor() {`, + ` const foo = inject(Foo);`, + ``, + ` console.log(foo.bar + 123);`, + ` }`, + `}`, + ]); + }); + + it('should declare a variable if an injected parameter with modifiers is referenced in the constructor', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(readonly foo: Foo) {`, + ` console.log(foo.bar + 123);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` readonly foo = inject(Foo);`, + ``, + ` constructor() {`, + ` const foo = this.foo;`, + ``, + ` console.log(foo.bar + 123);`, + ` }`, + `}`, + ]); + }); + + it('should not declare a variable in the constructor if the only references to the parameter are shadowed', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo) {`, + ` console.log([1, 2, 3].map(foo => foo * 2));`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` constructor() {`, + ` console.log([1, 2, 3].map(foo => foo * 2));`, + ` }`, + `}`, + ]); + }); + + it('should remove all constructor signatures when deleting its implementation', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(foo: Foo);`, + ` constructor(foo: Foo, bar: Bar);`, + ` constructor(private foo: Foo, bar?: Bar) {}`, + ``, + ` log() {`, + ` console.log(this.foo.bar());`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ``, + ` log() {`, + ` console.log(this.foo.bar());`, + ` }`, + `}`, + ]); + }); + + it('should remove constructor overloads when preserving its implementation', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(foo: Foo);`, + ` constructor(foo: Foo, bar: Bar);`, + ` constructor(private foo: Foo, bar?: Bar) {`, + ` console.log(this.foo.bar);`, + ` }`, + ``, + ` log() {`, + ` console.log(this.foo.bar());`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` constructor() {`, + ` console.log(this.foo.bar);`, + ` }`, + ``, + ` log() {`, + ` console.log(this.foo.bar());`, + ` }`, + `}`, + ]); + }); + + it('should handle multi-line constructor parameters', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + `import { Baz } from './baz';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(`, + ` private foo: Foo,`, + ` readonly bar: Bar,`, + ` readonly baz: Baz`, + ` ) {`, + ` console.log(this.foo, bar.value() + baz.otherValue());`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + `import { Baz } from './baz';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ` readonly bar = inject(Bar);`, + ` readonly baz = inject(Baz);`, + ``, + ` constructor() {`, + ` const bar = this.bar;`, + ` const baz = this.baz;`, + ``, + ` console.log(this.foo, bar.value() + baz.otherValue());`, + ` }`, + `}`, + ]); + }); + + it('should handle multi-line constructor parameters with a trailing comma', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(`, + ` private foo: Foo,`, + ` readonly bar: Bar,`, + ` ) {`, + ` console.log(this.foo, bar.value());`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from 'bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ` readonly bar = inject(Bar);`, + ``, + ` constructor() {`, + ` const bar = this.bar;`, + ``, + ` console.log(this.foo, bar.value());`, + ` }`, + `}`, + ]); + }); + + it('should insert the new class members before any pre-existing ones', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private hello = 1;`, + ` readonly goodbye = 0;`, + ``, + ` constructor(private foo: Foo) {}`, + ``, + ` log() {`, + ` console.log(this.foo, this.hello, this.goodbye);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` private hello = 1;`, + ` readonly goodbye = 0;`, + ``, + ` log() {`, + ` console.log(this.foo, this.hello, this.goodbye);`, + ` }`, + `}`, + ]); + }); + + it('should exclude the public modifier from newly-created members', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(public readonly foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` readonly foo = inject(Foo);`, + `}`, + ]); + }); + + it('should account for super() calls', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Parent } from './parent';`, + `import { A, B, C, D } from './types';`, + ``, + `@Directive()`, + `class MyDir extends Parent {`, + ` constructor(`, + ` readonly usedInSuperAndDeclared: A,`, + ` protected declaredButNotUsedInSuper: B,`, + ` usedInSuperUndeclared: C,`, + ` usedInConstructorUndeclared: D) {`, + ` super(usedInSuperAndDeclared, usedInSuperUndeclared);`, + ` console.log(usedInConstructorUndeclared + 1);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Parent } from './parent';`, + `import { A, B, C, D } from './types';`, + ``, + `@Directive()`, + `class MyDir extends Parent {`, + ` readonly usedInSuperAndDeclared: A;`, + ` protected declaredButNotUsedInSuper = inject(B);`, + ``, + ` constructor() {`, + ` const usedInSuperAndDeclared = inject(A);`, + ` const usedInSuperUndeclared = inject(C);`, + ` const usedInConstructorUndeclared = inject(D);`, + ``, + ` super(usedInSuperAndDeclared, usedInSuperUndeclared);`, + ` this.usedInSuperAndDeclared = usedInSuperAndDeclared;`, + ``, + ` console.log(usedInConstructorUndeclared + 1);`, + ` }`, + `}`, + ]); + }); + + it('should be able to opt into generating backwads-compatible constructors for a class with existing members', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private hello = 1;`, + ` readonly goodbye = 0;`, + ``, + ` constructor(private foo: Foo) {}`, + ``, + ` log() {`, + ` console.log(this.foo, this.hello, this.goodbye);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration({backwardsCompatibleConstructors: true}); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` private hello = 1;`, + ` readonly goodbye = 0;`, + ``, + ` /** Inserted by Angular inject() migration for backwards compatibility */`, + ` constructor(...args: unknown[]);`, + ``, + ` constructor() {}`, + ``, + ` log() {`, + ` console.log(this.foo, this.hello, this.goodbye);`, + ` }`, + `}`, + ]); + }); + + it('should be able to opt into generating backwads-compatible constructors for a class that only has a constructor', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo) {}`, + ``, + ` log() {`, + ` console.log(this.foo, this.hello, this.goodbye);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration({backwardsCompatibleConstructors: true}); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` /** Inserted by Angular inject() migration for backwards compatibility */`, + ` constructor(...args: unknown[]);`, + ``, + ` constructor() {}`, + ``, + ` log() {`, + ` console.log(this.foo, this.hello, this.goodbye);`, + ` }`, + `}`, + ]); + }); + + it('should not migrate abstract classes by default', async () => { + const initialContent = [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `abstract class MyDir {`, + ` constructor(private foo: Foo) {}`, + `}`, + ].join('\n'); + + writeFile('/dir.ts', initialContent); + + await runMigration(); + + expect(tree.readContent('/dir.ts')).toBe(initialContent); + }); + + it('should be able to opt into migrating abstract classes', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `abstract class MyDir {`, + ` constructor(readonly foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration({migrateAbstractClasses: true}); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `abstract class MyDir {`, + ` readonly foo = inject(Foo);`, + `}`, + ]); + }); + + it('should migrate a file that uses tabs for indentation', async () => { + // Note: these strings specifically use tabs for indentation. + // It might not be visible depending on the IDE settings. + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from './bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private hello = 1;`, + ``, + ` constructor(`, + ` protected foo: Foo,`, + ` bar: Bar,`, + ` ) {`, + ` console.log(this.foo, bar);`, + ` }`, + `}`, + ].join('\n'), + ); + + await runMigration(); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from './bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` protected foo = inject(Foo);`, + ``, + ` private hello = 1;`, + ``, + ` constructor() {`, + ` const bar = inject(Bar);`, + ``, + ` console.log(this.foo, bar);`, + ` }`, + `}`, + ]); + }); + + it('should migrate a file that uses CRLF line endings', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from './bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(private foo: Foo, bar: Bar) {`, + ` console.log(this.foo, bar);`, + ` }`, + `}`, + ].join('\r\n'), + ); + + await runMigration(); + + // We also split on `\n`, because the code we insert always uses `\n`. + expect(tree.readContent('/dir.ts').split(/\r\n|\n/g)).toEqual([ + `import { Directive, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + `import { Bar } from './bar';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo);`, + ``, + ` constructor() {`, + ` const bar = inject(Bar);`, + ``, + ` console.log(this.foo, bar);`, + ` }`, + `}`, + ]); + }); + + it('should allow users to opt into generating non-nullable optional calls', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Optional } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(@Optional() private foo: Foo) {}`, + `}`, + ].join('\n'), + ); + + await runMigration({nonNullableOptional: true}); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Optional, inject } from '@angular/core';`, + `import { Foo } from 'foo';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private foo = inject(Foo, { optional: true })!;`, + `}`, + ]); + }); + + it('should not add non-null assertions around sites that were nullable before the migration', async () => { + writeFile( + '/dir.ts', + [ + `import { Directive, Inject, Optional } from '@angular/core';`, + `import { A, B, C, D, E, F, G, H } from './types';`, + ``, + `@Directive()`, + `class MyDir {`, + ` constructor(`, + ` @Optional() private a?: A,`, + ` @Inject(B) @Optional() readonly b: number | null,`, + ` @Inject(C) @Optional() protected c: number | undefined`, + ` @Inject(D) @Optional() public d: null`, + ` @Inject(E) @Optional() private e: string | null | number`, + ` @Inject(F) @Optional() readonly f: string | number | undefined`, + ` @Inject(G) @Optional() protected g: undefined`, + ` @Inject(H) @Optional() public h: number | void`, + ` ) {}`, + `}`, + ].join('\n'), + ); + + await runMigration({nonNullableOptional: true}); + + expect(tree.readContent('/dir.ts').split('\n')).toEqual([ + `import { Directive, Inject, Optional, inject } from '@angular/core';`, + `import { A, B, C, D, E, F, G, H } from './types';`, + ``, + `@Directive()`, + `class MyDir {`, + ` private a = inject(A, { optional: true });`, + ` readonly b = inject(B, { optional: true });`, + ` protected c = inject(C, { optional: true });`, + ` d = inject(D, { optional: true });`, + ` private e = inject(E, { optional: true });`, + ` readonly f = inject(F, { optional: true });`, + ` protected g = inject(G, { optional: true });`, + ` h = inject(H, { optional: true });`, + `}`, + ]); + }); +}); From 4ac39aeea988bd423795bac70d480620f49f2267 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Mon, 22 Jul 2024 15:23:17 -0700 Subject: [PATCH 056/143] Revert "fix(compiler-cli): add warning for unused let declarations (#57033)" (#57088) This reverts commit c76b440ac007128c53699797811bc586220ccbe9. PR Close #57088 --- .../public-api/compiler-cli/error_code.api.md | 1 - .../extended_template_diagnostic_name.api.md | 4 +- .../src/ngtsc/diagnostics/src/error_code.ts | 13 --- .../src/extended_template_diagnostic_name.ts | 1 - .../src/ngtsc/typecheck/extended/BUILD.bazel | 1 - .../checks/unused_let_declaration/BUILD.bazel | 17 --- .../checks/unused_let_declaration/index.ts | 87 --------------- .../src/ngtsc/typecheck/extended/index.ts | 2 - .../checks/unused_let_declaration/BUILD.bazel | 30 ----- .../unused_let_declaration_spec.ts | 103 ------------------ .../test/ngtsc/template_typecheck_spec.ts | 13 +-- .../language-service/test/quick_info_spec.ts | 2 +- 12 files changed, 3 insertions(+), 271 deletions(-) delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel delete mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts diff --git a/goldens/public-api/compiler-cli/error_code.api.md b/goldens/public-api/compiler-cli/error_code.api.md index 7c307e96f2ff..e1ad1d87bde9 100644 --- a/goldens/public-api/compiler-cli/error_code.api.md +++ b/goldens/public-api/compiler-cli/error_code.api.md @@ -105,7 +105,6 @@ export enum ErrorCode { UNDECORATED_PROVIDER = 2005, UNINVOKED_FUNCTION_IN_EVENT_BINDING = 8111, UNSUPPORTED_INITIALIZER_API_USAGE = 8110, - UNUSED_LET_DECLARATION = 8112, // (undocumented) VALUE_HAS_WRONG_TYPE = 1010, // (undocumented) diff --git a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md index 36777b64fa9f..2f57f98462b4 100644 --- a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md +++ b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md @@ -27,9 +27,7 @@ export enum ExtendedTemplateDiagnosticName { // (undocumented) TEXT_ATTRIBUTE_NOT_BINDING = "textAttributeNotBinding", // (undocumented) - UNINVOKED_FUNCTION_IN_EVENT_BINDING = "uninvokedFunctionInEventBinding", - // (undocumented) - UNUSED_LET_DECLARATION = "unusedLetDeclaration" + UNINVOKED_FUNCTION_IN_EVENT_BINDING = "uninvokedFunctionInEventBinding" } // (No @packageDocumentation comment for this package) diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index 14584d91f778..9b3fb28331e5 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -495,19 +495,6 @@ export enum ErrorCode { */ UNINVOKED_FUNCTION_IN_EVENT_BINDING = 8111, - /** - * A `@let` declaration in a template isn't used. - * - * For example: - * ``` - * @let used = 1; - * @let notUsed = 2; - * - * {{used}} - * ``` - */ - UNUSED_LET_DECLARATION = 8112, - /** * The template type-checking engine would need to generate an inline type check block for a * component, but the current type-checking environment doesn't support it. diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts index 1b968e610b13..c04d2b4f9594 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts @@ -27,5 +27,4 @@ export enum ExtendedTemplateDiagnosticName { SKIP_HYDRATION_NOT_STATIC = 'skipHydrationNotStatic', INTERPOLATED_SIGNAL_NOT_INVOKED = 'interpolatedSignalNotInvoked', CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION = 'controlFlowPreventingContentProjection', - UNUSED_LET_DECLARATION = 'unusedLetDeclaration', } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel index f4527da5c181..d49bed313ecf 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel @@ -22,7 +22,6 @@ ts_library( "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/suffix_not_supported", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/text_attribute_not_binding", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/uninvoked_function_in_event_binding", - "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration", "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel deleted file mode 100644 index 75824d705dfb..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel +++ /dev/null @@ -1,17 +0,0 @@ -load("//tools:defaults.bzl", "ts_library") - -ts_library( - name = "unused_let_declaration", - srcs = ["index.ts"], - visibility = [ - "//packages/compiler-cli/src/ngtsc:__subpackages__", - "//packages/compiler-cli/test/ngtsc:__pkg__", - ], - deps = [ - "//packages/compiler", - "//packages/compiler-cli/src/ngtsc/diagnostics", - "//packages/compiler-cli/src/ngtsc/typecheck/api", - "//packages/compiler-cli/src/ngtsc/typecheck/extended/api", - "@npm//typescript", - ], -) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts deleted file mode 100644 index e670f7f34640..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {AST, ASTWithSource, TmplAstLetDeclaration, TmplAstNode} from '@angular/compiler'; -import ts from 'typescript'; - -import {ErrorCode, ExtendedTemplateDiagnosticName} from '../../../../diagnostics'; -import {NgTemplateDiagnostic} from '../../../api'; -import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '../../api'; - -interface ClassAnalysis { - allLetDeclarations: Set; - usedLetDeclarations: Set; -} - -/** - * Ensures that all `@let` declarations in a template are used. - */ -class UnusedLetDeclarationCheck extends TemplateCheckWithVisitor { - override code = ErrorCode.UNUSED_LET_DECLARATION as const; - private analysis = new Map(); - - override run( - ctx: TemplateContext, - component: ts.ClassDeclaration, - template: TmplAstNode[], - ): NgTemplateDiagnostic[] { - super.run(ctx, component, template); - - const diagnostics: NgTemplateDiagnostic[] = []; - const {allLetDeclarations, usedLetDeclarations} = this.getAnalysis(component); - - for (const decl of allLetDeclarations) { - if (!usedLetDeclarations.has(decl)) { - diagnostics.push( - ctx.makeTemplateDiagnostic( - decl.sourceSpan, - `@let ${decl.name} is declared but its value is never read.`, - ), - ); - } - } - - this.analysis.clear(); - return diagnostics; - } - - override visitNode( - ctx: TemplateContext, - component: ts.ClassDeclaration, - node: TmplAstNode | AST, - ): NgTemplateDiagnostic[] { - if (node instanceof TmplAstLetDeclaration) { - this.getAnalysis(component).allLetDeclarations.add(node); - } else if (node instanceof AST) { - const unwrappedNode = node instanceof ASTWithSource ? node.ast : node; - const target = ctx.templateTypeChecker.getExpressionTarget(unwrappedNode, component); - - if (target !== null && target instanceof TmplAstLetDeclaration) { - this.getAnalysis(component).usedLetDeclarations.add(target); - } - } - - return []; - } - - private getAnalysis(node: ts.ClassDeclaration): ClassAnalysis { - if (!this.analysis.has(node)) { - this.analysis.set(node, {allLetDeclarations: new Set(), usedLetDeclarations: new Set()}); - } - return this.analysis.get(node)!; - } -} - -export const factory: TemplateCheckFactory< - ErrorCode.UNUSED_LET_DECLARATION, - ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION -> = { - code: ErrorCode.UNUSED_LET_DECLARATION, - name: ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION, - create: () => new UnusedLetDeclarationCheck(), -}; diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index c56e9d945aa0..0dc597df0502 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -18,7 +18,6 @@ import {factory as optionalChainNotNullableFactory} from './checks/optional_chai import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supported'; import {factory as textAttributeNotBindingFactory} from './checks/text_attribute_not_binding'; import {factory as uninvokedFunctionInEventBindingFactory} from './checks/uninvoked_function_in_event_binding'; -import {factory as unusedLetDeclarationFactory} from './checks/unused_let_declaration'; export {ExtendedTemplateCheckerImpl} from './src/extended_template_checker'; @@ -35,7 +34,6 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< suffixNotSupportedFactory, interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, - unusedLetDeclarationFactory, ]; export const SUPPORTED_DIAGNOSTIC_NAMES = new Set([ diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel deleted file mode 100644 index a194ca517680..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel +++ /dev/null @@ -1,30 +0,0 @@ -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") - -ts_library( - name = "test_lib", - testonly = True, - srcs = ["unused_let_declaration_spec.ts"], - deps = [ - "//packages/compiler", - "//packages/compiler-cli/src/ngtsc/core:api", - "//packages/compiler-cli/src/ngtsc/diagnostics", - "//packages/compiler-cli/src/ngtsc/file_system", - "//packages/compiler-cli/src/ngtsc/file_system/testing", - "//packages/compiler-cli/src/ngtsc/testing", - "//packages/compiler-cli/src/ngtsc/typecheck/extended", - "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration", - "//packages/compiler-cli/src/ngtsc/typecheck/testing", - "@npm//typescript", - ], -) - -jasmine_node_test( - name = "test", - bootstrap = ["//tools/testing:node_no_angular"], - data = [ - "//packages/core:npm_package", - ], - deps = [ - ":test_lib", - ], -) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts deleted file mode 100644 index e41ec168cdf5..000000000000 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import ts from 'typescript'; - -import {ErrorCode, ExtendedTemplateDiagnosticName, ngErrorCode} from '../../../../../diagnostics'; -import {absoluteFrom, getSourceFileOrError} from '../../../../../file_system'; -import {runInEachFileSystem} from '../../../../../file_system/testing'; -import {getSourceCodeForDiagnostic} from '../../../../../testing'; -import {getClass, setup} from '../../../../testing'; -import {factory as unusedLetDeclarationFactory} from '../../../checks/unused_let_declaration/index'; -import {ExtendedTemplateCheckerImpl} from '../../../src/extended_template_checker'; - -runInEachFileSystem(() => { - describe('UnusedLetDeclarationCheck', () => { - function diagnose(template: string) { - const fileName = absoluteFrom('/main.ts'); - const {program, templateTypeChecker} = setup([ - { - fileName, - templates: { - 'TestCmp': template, - }, - source: ` - export class TestCmp { - eventCallback(value: any) {} - } - `, - }, - ]); - const sf = getSourceFileOrError(program, fileName); - const component = getClass(sf, 'TestCmp'); - const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( - templateTypeChecker, - program.getTypeChecker(), - [unusedLetDeclarationFactory], - {}, - ); - return extendedTemplateChecker.getDiagnosticsForComponent(component); - } - - it('binds the error code to its extended template diagnostic name', () => { - expect(unusedLetDeclarationFactory.code).toBe(ErrorCode.UNUSED_LET_DECLARATION); - expect(unusedLetDeclarationFactory.name).toBe( - ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION, - ); - }); - - it('should report a @let declaration that is not used', () => { - const diags = diagnose(` - @let used = 1; - @let unused = 2; - {{used}} - `); - - expect(diags.length).toBe(1); - expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); - expect(diags[0].code).toBe(ngErrorCode(ErrorCode.UNUSED_LET_DECLARATION)); - expect(getSourceCodeForDiagnostic(diags[0])).toBe('@let unused = 2'); - }); - - it('should report a @let declaration that is not used', () => { - const diags = diagnose(` - @let foo = 1; - - @if (true) { - @let foo = 2; - {{foo}} - } - `); - - expect(diags.length).toBe(1); - expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); - expect(diags[0].code).toBe(ngErrorCode(ErrorCode.UNUSED_LET_DECLARATION)); - expect(getSourceCodeForDiagnostic(diags[0])).toBe('@let foo = 1'); - }); - - it('should not report a @let declaration that is only used in other @let declarations', () => { - const diags = diagnose(` - @let one = 1; - @let two = 2; - @let three = one + two; - {{three}} - `); - - expect(diags.length).toBe(0); - }); - - it('should not report a @let declaration that is only used in an event listener', () => { - const diags = diagnose(` - @let foo = 1; - - `); - - expect(diags.length).toBe(0); - }); - }); -}); diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index fd7093d0767d..930844c75cea 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -6611,18 +6611,7 @@ suppress }); describe('@let declarations', () => { - beforeEach(() => - env.tsconfig({ - strictTemplates: true, - extendedDiagnostics: { - checks: { - // Suppress the diagnostic for unused @let since some of the error cases - // we're checking for here also qualify as being unused which adds noise. - unusedLetDeclaration: 'suppress', - }, - }, - }), - ); + beforeEach(() => env.tsconfig({strictTemplates: true})); it('should infer the type of a let declaration', () => { env.write( diff --git a/packages/language-service/test/quick_info_spec.ts b/packages/language-service/test/quick_info_spec.ts index c4183d2b6b35..899fdc40b2ae 100644 --- a/packages/language-service/test/quick_info_spec.ts +++ b/packages/language-service/test/quick_info_spec.ts @@ -708,7 +708,7 @@ describe('quick info', () => { describe('let declarations', () => { it('should get quick info for a let declaration', () => { expectQuickInfo({ - templateOverride: `@let na¦me = 'Frodo'; {{name}}`, + templateOverride: `@let na¦me = 'Frodo';`, expectedSpanText: `@let name = 'Frodo'`, expectedDisplayString: `(let) name: "Frodo"`, }); From 6c2fbda6942adbc7b21f3dfc1db0a42638223a1a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 23 Jul 2024 06:15:31 +0200 Subject: [PATCH 057/143] fix(compiler-cli): extended diagnostic visitor not visiting template attributes (#57033) Fixes that the visitor which is used to implement template diagnostics isn't visiting the template attributes of structural directives. PR Close #57033 --- .../src/ngtsc/typecheck/extended/api/api.ts | 27 ++++++++++++++++--- .../nullish_coalescing_not_nullable/index.ts | 1 + .../optional_chain_not_nullable/index.ts | 1 + 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts index f33da482c24c..31149c33846e 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts @@ -109,6 +109,17 @@ export interface TemplateCheckFactory< export abstract class TemplateCheckWithVisitor implements TemplateCheck { + /** + * When extended diagnostics were first introduced, the visitor wasn't implemented correctly + * which meant that it wasn't visiting the `templateAttrs` of structural directives (e.g. + * the expression of `*ngIf`). Fixing the issue causes a lot of internal breakages and will likely + * need to be done in a major version to avoid external breakages. This flag is used to opt out + * pre-existing diagnostics from the correct behavior until the breakages have been fixed while + * ensuring that newly-written diagnostics are correct from the beginning. + * TODO(crisbeto): remove this flag and fix the internal brekages. + */ + readonly canVisitStructuralAttributes: boolean = true; + abstract code: Code; /** @@ -179,15 +190,23 @@ class TemplateVisitor } visitTemplate(template: TmplAstTemplate) { + const isInlineTemplate = template.tagName === 'ng-template'; this.visitAllNodes(template.attributes); - if (template.tagName === 'ng-template') { - // Only visit input/outputs/templateAttrs if this isn't an inline template node - // generated for a structural directive (like `
`). These nodes - // would be visited when the underlying element of an inline template node is processed. + + if (isInlineTemplate) { + // Only visit input/outputs if this isn't an inline template node generated for a structural + // directive (like `
`). These nodes would be visited when the underlying + // element of an inline template node is processed. this.visitAllNodes(template.inputs); this.visitAllNodes(template.outputs); + } + + // TODO(crisbeto): remove this condition when deleting `canVisitStructuralAttributes`. + if (this.check.canVisitStructuralAttributes || isInlineTemplate) { + // `templateAttrs` aren't transferred over to the inner element so we always have to visit them. this.visitAllNodes(template.templateAttrs); } + this.visitAllNodes(template.variables); this.visitAllNodes(template.references); this.visitAllNodes(template.children); diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.ts index 0393c986bfbe..b7488be8e943 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/nullish_coalescing_not_nullable/index.ts @@ -21,6 +21,7 @@ import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '. * otherwise it would produce inaccurate results. */ class NullishCoalescingNotNullableCheck extends TemplateCheckWithVisitor { + override readonly canVisitStructuralAttributes = false; override code = ErrorCode.NULLISH_COALESCING_NOT_NULLABLE as const; override visitNode( diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/optional_chain_not_nullable/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/optional_chain_not_nullable/index.ts index 9b0f6328cd33..4c76e5c91361 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/optional_chain_not_nullable/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/optional_chain_not_nullable/index.ts @@ -21,6 +21,7 @@ import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '. * otherwise it would produce inaccurate results. */ class OptionalChainNotNullableCheck extends TemplateCheckWithVisitor { + override readonly canVisitStructuralAttributes = false; override code = ErrorCode.OPTIONAL_CHAIN_NOT_NULLABLE as const; override visitNode( From d4ff6bc0b200f0a6bb095ea4a13e52b79e254cca Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 23 Jul 2024 06:19:37 +0200 Subject: [PATCH 058/143] fix(compiler-cli): add warning for unused let declarations (#57033) Adds a new extended diagnostic that will flag `@let` declarations that aren't used within the template. The diagnostic can be turned off through the `extendedDiagnostics` compiler option. PR Close #57033 --- .../public-api/compiler-cli/error_code.api.md | 1 + .../extended_template_diagnostic_name.api.md | 4 +- .../src/ngtsc/diagnostics/src/error_code.ts | 13 ++ .../src/extended_template_diagnostic_name.ts | 1 + .../src/ngtsc/typecheck/extended/BUILD.bazel | 1 + .../checks/unused_let_declaration/BUILD.bazel | 17 +++ .../checks/unused_let_declaration/index.ts | 87 ++++++++++++++ .../src/ngtsc/typecheck/extended/index.ts | 2 + .../checks/unused_let_declaration/BUILD.bazel | 30 +++++ .../unused_let_declaration_spec.ts | 112 ++++++++++++++++++ .../test/ngtsc/template_typecheck_spec.ts | 13 +- .../language-service/test/quick_info_spec.ts | 2 +- 12 files changed, 280 insertions(+), 3 deletions(-) create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts diff --git a/goldens/public-api/compiler-cli/error_code.api.md b/goldens/public-api/compiler-cli/error_code.api.md index e1ad1d87bde9..7c307e96f2ff 100644 --- a/goldens/public-api/compiler-cli/error_code.api.md +++ b/goldens/public-api/compiler-cli/error_code.api.md @@ -105,6 +105,7 @@ export enum ErrorCode { UNDECORATED_PROVIDER = 2005, UNINVOKED_FUNCTION_IN_EVENT_BINDING = 8111, UNSUPPORTED_INITIALIZER_API_USAGE = 8110, + UNUSED_LET_DECLARATION = 8112, // (undocumented) VALUE_HAS_WRONG_TYPE = 1010, // (undocumented) diff --git a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md index 2f57f98462b4..36777b64fa9f 100644 --- a/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md +++ b/goldens/public-api/compiler-cli/extended_template_diagnostic_name.api.md @@ -27,7 +27,9 @@ export enum ExtendedTemplateDiagnosticName { // (undocumented) TEXT_ATTRIBUTE_NOT_BINDING = "textAttributeNotBinding", // (undocumented) - UNINVOKED_FUNCTION_IN_EVENT_BINDING = "uninvokedFunctionInEventBinding" + UNINVOKED_FUNCTION_IN_EVENT_BINDING = "uninvokedFunctionInEventBinding", + // (undocumented) + UNUSED_LET_DECLARATION = "unusedLetDeclaration" } // (No @packageDocumentation comment for this package) diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts index 9b3fb28331e5..14584d91f778 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/error_code.ts @@ -495,6 +495,19 @@ export enum ErrorCode { */ UNINVOKED_FUNCTION_IN_EVENT_BINDING = 8111, + /** + * A `@let` declaration in a template isn't used. + * + * For example: + * ``` + * @let used = 1; + * @let notUsed = 2; + * + * {{used}} + * ``` + */ + UNUSED_LET_DECLARATION = 8112, + /** * The template type-checking engine would need to generate an inline type check block for a * component, but the current type-checking environment doesn't support it. diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts index c04d2b4f9594..1b968e610b13 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts +++ b/packages/compiler-cli/src/ngtsc/diagnostics/src/extended_template_diagnostic_name.ts @@ -27,4 +27,5 @@ export enum ExtendedTemplateDiagnosticName { SKIP_HYDRATION_NOT_STATIC = 'skipHydrationNotStatic', INTERPOLATED_SIGNAL_NOT_INVOKED = 'interpolatedSignalNotInvoked', CONTROL_FLOW_PREVENTING_CONTENT_PROJECTION = 'controlFlowPreventingContentProjection', + UNUSED_LET_DECLARATION = 'unusedLetDeclaration', } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel index d49bed313ecf..f4527da5c181 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/BUILD.bazel @@ -22,6 +22,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/suffix_not_supported", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/text_attribute_not_binding", "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/uninvoked_function_in_event_binding", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration", "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel new file mode 100644 index 000000000000..75824d705dfb --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/BUILD.bazel @@ -0,0 +1,17 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "unused_let_declaration", + srcs = ["index.ts"], + visibility = [ + "//packages/compiler-cli/src/ngtsc:__subpackages__", + "//packages/compiler-cli/test/ngtsc:__pkg__", + ], + deps = [ + "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/typecheck/api", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/api", + "@npm//typescript", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts new file mode 100644 index 000000000000..e670f7f34640 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration/index.ts @@ -0,0 +1,87 @@ +/** + * @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 {AST, ASTWithSource, TmplAstLetDeclaration, TmplAstNode} from '@angular/compiler'; +import ts from 'typescript'; + +import {ErrorCode, ExtendedTemplateDiagnosticName} from '../../../../diagnostics'; +import {NgTemplateDiagnostic} from '../../../api'; +import {TemplateCheckFactory, TemplateCheckWithVisitor, TemplateContext} from '../../api'; + +interface ClassAnalysis { + allLetDeclarations: Set; + usedLetDeclarations: Set; +} + +/** + * Ensures that all `@let` declarations in a template are used. + */ +class UnusedLetDeclarationCheck extends TemplateCheckWithVisitor { + override code = ErrorCode.UNUSED_LET_DECLARATION as const; + private analysis = new Map(); + + override run( + ctx: TemplateContext, + component: ts.ClassDeclaration, + template: TmplAstNode[], + ): NgTemplateDiagnostic[] { + super.run(ctx, component, template); + + const diagnostics: NgTemplateDiagnostic[] = []; + const {allLetDeclarations, usedLetDeclarations} = this.getAnalysis(component); + + for (const decl of allLetDeclarations) { + if (!usedLetDeclarations.has(decl)) { + diagnostics.push( + ctx.makeTemplateDiagnostic( + decl.sourceSpan, + `@let ${decl.name} is declared but its value is never read.`, + ), + ); + } + } + + this.analysis.clear(); + return diagnostics; + } + + override visitNode( + ctx: TemplateContext, + component: ts.ClassDeclaration, + node: TmplAstNode | AST, + ): NgTemplateDiagnostic[] { + if (node instanceof TmplAstLetDeclaration) { + this.getAnalysis(component).allLetDeclarations.add(node); + } else if (node instanceof AST) { + const unwrappedNode = node instanceof ASTWithSource ? node.ast : node; + const target = ctx.templateTypeChecker.getExpressionTarget(unwrappedNode, component); + + if (target !== null && target instanceof TmplAstLetDeclaration) { + this.getAnalysis(component).usedLetDeclarations.add(target); + } + } + + return []; + } + + private getAnalysis(node: ts.ClassDeclaration): ClassAnalysis { + if (!this.analysis.has(node)) { + this.analysis.set(node, {allLetDeclarations: new Set(), usedLetDeclarations: new Set()}); + } + return this.analysis.get(node)!; + } +} + +export const factory: TemplateCheckFactory< + ErrorCode.UNUSED_LET_DECLARATION, + ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION +> = { + code: ErrorCode.UNUSED_LET_DECLARATION, + name: ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION, + create: () => new UnusedLetDeclarationCheck(), +}; diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts index 0dc597df0502..c56e9d945aa0 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/index.ts @@ -18,6 +18,7 @@ import {factory as optionalChainNotNullableFactory} from './checks/optional_chai import {factory as suffixNotSupportedFactory} from './checks/suffix_not_supported'; import {factory as textAttributeNotBindingFactory} from './checks/text_attribute_not_binding'; import {factory as uninvokedFunctionInEventBindingFactory} from './checks/uninvoked_function_in_event_binding'; +import {factory as unusedLetDeclarationFactory} from './checks/unused_let_declaration'; export {ExtendedTemplateCheckerImpl} from './src/extended_template_checker'; @@ -34,6 +35,7 @@ export const ALL_DIAGNOSTIC_FACTORIES: readonly TemplateCheckFactory< suffixNotSupportedFactory, interpolatedSignalNotInvoked, uninvokedFunctionInEventBindingFactory, + unusedLetDeclarationFactory, ]; export const SUPPORTED_DIAGNOSTIC_NAMES = new Set([ diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel new file mode 100644 index 000000000000..a194ca517680 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "test_lib", + testonly = True, + srcs = ["unused_let_declaration_spec.ts"], + deps = [ + "//packages/compiler", + "//packages/compiler-cli/src/ngtsc/core:api", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/compiler-cli/src/ngtsc/file_system/testing", + "//packages/compiler-cli/src/ngtsc/testing", + "//packages/compiler-cli/src/ngtsc/typecheck/extended", + "//packages/compiler-cli/src/ngtsc/typecheck/extended/checks/unused_let_declaration", + "//packages/compiler-cli/src/ngtsc/typecheck/testing", + "@npm//typescript", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["//tools/testing:node_no_angular"], + data = [ + "//packages/core:npm_package", + ], + deps = [ + ":test_lib", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts new file mode 100644 index 000000000000..3afced6bf38a --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/test/checks/unused_let_declaration/unused_let_declaration_spec.ts @@ -0,0 +1,112 @@ +/** + * @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 ts from 'typescript'; + +import {ErrorCode, ExtendedTemplateDiagnosticName, ngErrorCode} from '../../../../../diagnostics'; +import {absoluteFrom, getSourceFileOrError} from '../../../../../file_system'; +import {runInEachFileSystem} from '../../../../../file_system/testing'; +import {getSourceCodeForDiagnostic} from '../../../../../testing'; +import {getClass, setup} from '../../../../testing'; +import {factory as unusedLetDeclarationFactory} from '../../../checks/unused_let_declaration/index'; +import {ExtendedTemplateCheckerImpl} from '../../../src/extended_template_checker'; + +runInEachFileSystem(() => { + describe('UnusedLetDeclarationCheck', () => { + function diagnose(template: string) { + const fileName = absoluteFrom('/main.ts'); + const {program, templateTypeChecker} = setup([ + { + fileName, + templates: { + 'TestCmp': template, + }, + source: ` + export class TestCmp { + eventCallback(value: any) {} + } + `, + }, + ]); + const sf = getSourceFileOrError(program, fileName); + const component = getClass(sf, 'TestCmp'); + const extendedTemplateChecker = new ExtendedTemplateCheckerImpl( + templateTypeChecker, + program.getTypeChecker(), + [unusedLetDeclarationFactory], + {}, + ); + return extendedTemplateChecker.getDiagnosticsForComponent(component); + } + + it('binds the error code to its extended template diagnostic name', () => { + expect(unusedLetDeclarationFactory.code).toBe(ErrorCode.UNUSED_LET_DECLARATION); + expect(unusedLetDeclarationFactory.name).toBe( + ExtendedTemplateDiagnosticName.UNUSED_LET_DECLARATION, + ); + }); + + it('should report a @let declaration that is not used', () => { + const diags = diagnose(` + @let used = 1; + @let unused = 2; + {{used}} + `); + + expect(diags.length).toBe(1); + expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); + expect(diags[0].code).toBe(ngErrorCode(ErrorCode.UNUSED_LET_DECLARATION)); + expect(getSourceCodeForDiagnostic(diags[0])).toBe('@let unused = 2'); + }); + + it('should report a @let declaration that is not used', () => { + const diags = diagnose(` + @let foo = 1; + + @if (true) { + @let foo = 2; + {{foo}} + } + `); + + expect(diags.length).toBe(1); + expect(diags[0].category).toBe(ts.DiagnosticCategory.Warning); + expect(diags[0].code).toBe(ngErrorCode(ErrorCode.UNUSED_LET_DECLARATION)); + expect(getSourceCodeForDiagnostic(diags[0])).toBe('@let foo = 1'); + }); + + it('should not report a @let declaration that is only used in other @let declarations', () => { + const diags = diagnose(` + @let one = 1; + @let two = 2; + @let three = one + two; + {{three}} + `); + + expect(diags.length).toBe(0); + }); + + it('should not report a @let declaration that is only used in an event listener', () => { + const diags = diagnose(` + @let foo = 1; + + `); + + expect(diags.length).toBe(0); + }); + + it('should not report a @let declaration that is only used in a structural directive', () => { + const diags = diagnose(` + @let foo = null; +
+ `); + + expect(diags.length).toBe(0); + }); + }); +}); diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index 930844c75cea..fd7093d0767d 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -6611,7 +6611,18 @@ suppress }); describe('@let declarations', () => { - beforeEach(() => env.tsconfig({strictTemplates: true})); + beforeEach(() => + env.tsconfig({ + strictTemplates: true, + extendedDiagnostics: { + checks: { + // Suppress the diagnostic for unused @let since some of the error cases + // we're checking for here also qualify as being unused which adds noise. + unusedLetDeclaration: 'suppress', + }, + }, + }), + ); it('should infer the type of a let declaration', () => { env.write( diff --git a/packages/language-service/test/quick_info_spec.ts b/packages/language-service/test/quick_info_spec.ts index 899fdc40b2ae..c4183d2b6b35 100644 --- a/packages/language-service/test/quick_info_spec.ts +++ b/packages/language-service/test/quick_info_spec.ts @@ -708,7 +708,7 @@ describe('quick info', () => { describe('let declarations', () => { it('should get quick info for a let declaration', () => { expectQuickInfo({ - templateOverride: `@let na¦me = 'Frodo';`, + templateOverride: `@let na¦me = 'Frodo'; {{name}}`, expectedSpanText: `@let name = 'Frodo'`, expectedDisplayString: `(let) name: "Frodo"`, }); From 8718abce900617275d80ca56141d4e4436481b69 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 17 Jul 2024 13:50:44 -0700 Subject: [PATCH 059/143] fix(core): Deprecate ignoreChangesOutsideZone option (#57029) This option was introduced out of caution as a way for developers to opt out of the new behavior in v18 which schedule change detection for the above events when they occur outside the Zone. After monitoring the results post-release, we have determined that this feature is working as desired and do not believe it should ever be disabled by setting this option to `true`. PR Close #57029 --- goldens/public-api/core/index.api.md | 2 ++ packages/core/src/application/application_ref.ts | 7 ++++++- .../src/change_detection/scheduling/ng_zone_scheduling.ts | 7 ++++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/goldens/public-api/core/index.api.md b/goldens/public-api/core/index.api.md index ae3f7168874d..aa9fd95d73f2 100644 --- a/goldens/public-api/core/index.api.md +++ b/goldens/public-api/core/index.api.md @@ -174,6 +174,7 @@ export function booleanAttribute(value: unknown): boolean; // @public export interface BootstrapOptions { + // @deprecated ignoreChangesOutsideZone?: boolean; ngZone?: NgZone | 'zone.js' | 'noop'; ngZoneEventCoalescing?: boolean; @@ -1246,6 +1247,7 @@ export class NgZone { // @public export interface NgZoneOptions { eventCoalescing?: boolean; + // @deprecated ignoreChangesOutsideZone?: boolean; runCoalescing?: boolean; } diff --git a/packages/core/src/application/application_ref.ts b/packages/core/src/application/application_ref.ts index f518da967680..5178b9d247b5 100644 --- a/packages/core/src/application/application_ref.ts +++ b/packages/core/src/application/application_ref.ts @@ -159,10 +159,15 @@ export interface BootstrapOptions { * - calling `ChangeDetectorRef.markForCheck` * - calling `ComponentRef.setInput` * - updating a signal that is read in a template - * - when bound host or template listeners are triggered * - attaching a view that is marked dirty * - removing a view * - registering a render hook (templates are only refreshed if render hooks do one of the above) + * + * @deprecated This option was introduced out of caution as a way for developers to opt out of the + * new behavior in v18 which schedule change detection for the above events when they occur + * outside the Zone. After monitoring the results post-release, we have determined that this + * feature is working as desired and do not believe it should ever be disabled by setting + * this option to `true`. */ ignoreChangesOutsideZone?: boolean; } diff --git a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts index 85a9bdd594ff..6076f818bd70 100644 --- a/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts +++ b/packages/core/src/change_detection/scheduling/ng_zone_scheduling.ts @@ -223,10 +223,15 @@ export interface NgZoneOptions { * - calling `ChangeDetectorRef.markForCheck` * - calling `ComponentRef.setInput` * - updating a signal that is read in a template - * - when bound host or template listeners are triggered * - attaching a view that is marked dirty * - removing a view * - registering a render hook (templates are only refreshed if render hooks do one of the above) + * + * @deprecated This option was introduced out of caution as a way for developers to opt out of the + * new behavior in v18 which schedule change detection for the above events when they occur + * outside the Zone. After monitoring the results post-release, we have determined that this + * feature is working as desired and do not believe it should ever be disabled by setting + * this option to `true`. */ ignoreChangesOutsideZone?: boolean; } From bf853b7c67b19047bf84de18d6c02f78c7b3c425 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 14:35:52 +0000 Subject: [PATCH 060/143] refactor(compiler): expose information about inputs from `inputs` field (#57082) This commit exposes metadata about inputs that are defined inside the `inputs` field of `@Directive` or `@Component` class decorators This is useful and necessary information for migrations, like the signal inputs migration. PR Close #57082 --- .../src/ngtsc/annotations/component/src/handler.ts | 2 ++ .../src/ngtsc/annotations/component/src/metadata.ts | 2 ++ .../src/ngtsc/annotations/directive/src/handler.ts | 3 +++ .../src/ngtsc/annotations/directive/src/shared.ts | 5 +++++ packages/compiler-cli/src/ngtsc/metadata/src/api.ts | 6 ++++++ packages/compiler-cli/src/ngtsc/metadata/src/dts.ts | 4 ++++ packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts | 1 + packages/compiler-cli/src/ngtsc/typecheck/testing/index.ts | 1 + 8 files changed, 24 insertions(+) diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts index 570b96ebc95b..53642073d89b 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -775,6 +775,7 @@ export class ComponentDecoratorHandler analysis: { baseClass: readBaseClass(node, this.reflector, this.evaluator), inputs, + inputFieldNamesFromMetadataArray: directiveResult.inputFieldNamesFromMetadataArray, outputs, hostDirectives, rawHostDirectives, @@ -861,6 +862,7 @@ export class ComponentDecoratorHandler selector: analysis.meta.selector, exportAs: analysis.meta.exportAs, inputs: analysis.inputs, + inputFieldNamesFromMetadataArray: analysis.inputFieldNamesFromMetadataArray, outputs: analysis.outputs, queries: analysis.meta.queries.map((query) => query.propertyName), isComponent: true, diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/metadata.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/metadata.ts index b44651780071..6754c49777d0 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/metadata.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/metadata.ts @@ -58,6 +58,8 @@ export interface ComponentAnalysisData { classDebugInfo: R3ClassDebugInfo | null; inputs: ClassPropertyMapping; + inputFieldNamesFromMetadataArray: Set; + outputs: ClassPropertyMapping; /** diff --git a/packages/compiler-cli/src/ngtsc/annotations/directive/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/directive/src/handler.ts index c8bee90f20bc..fcf1861a5234 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/directive/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/directive/src/handler.ts @@ -106,6 +106,7 @@ export interface DirectiveHandlerData { classMetadata: R3ClassMetadata | null; providersRequiringFactory: Set> | null; inputs: ClassPropertyMapping; + inputFieldNamesFromMetadataArray: Set; outputs: ClassPropertyMapping; isPoisoned: boolean; isStructural: boolean; @@ -212,6 +213,7 @@ export class DirectiveDecoratorHandler return { analysis: { inputs: directiveResult.inputs, + inputFieldNamesFromMetadataArray: directiveResult.inputFieldNamesFromMetadataArray, outputs: directiveResult.outputs, meta: analysis, hostDirectives: directiveResult.hostDirectives, @@ -255,6 +257,7 @@ export class DirectiveDecoratorHandler selector: analysis.meta.selector, exportAs: analysis.meta.exportAs, inputs: analysis.inputs, + inputFieldNamesFromMetadataArray: analysis.inputFieldNamesFromMetadataArray, outputs: analysis.outputs, queries: analysis.meta.queries.map((query) => query.propertyName), isComponent: false, diff --git a/packages/compiler-cli/src/ngtsc/annotations/directive/src/shared.ts b/packages/compiler-cli/src/ngtsc/annotations/directive/src/shared.ts index 5be841960b5c..b08378e03080 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/directive/src/shared.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/directive/src/shared.ts @@ -125,6 +125,7 @@ export function extractDirectiveMetadata( isStructural: boolean; hostDirectives: HostDirectiveMeta[] | null; rawHostDirectives: ts.Expression | null; + inputFieldNamesFromMetadataArray: Set; } | {jitForced: true} { let directive: Map; @@ -416,6 +417,10 @@ export function extractDirectiveMetadata( isStructural, hostDirectives, rawHostDirectives, + // Track inputs from class metadata. This is useful for migration efforts. + inputFieldNamesFromMetadataArray: new Set( + Object.values(inputsFromMeta).map((i) => i.classPropertyName), + ), }; } diff --git a/packages/compiler-cli/src/ngtsc/metadata/src/api.ts b/packages/compiler-cli/src/ngtsc/metadata/src/api.ts index aa6cdb32b1ca..6cbc25598b4f 100644 --- a/packages/compiler-cli/src/ngtsc/metadata/src/api.ts +++ b/packages/compiler-cli/src/ngtsc/metadata/src/api.ts @@ -199,6 +199,12 @@ export interface DirectiveMeta extends T2DirectiveMeta, DirectiveTypeCheckMeta { */ inputs: ClassPropertyMapping; + /** + * List of input fields that were defined in the class decorator + * metadata. Null for directives extracted from `.d.ts` + */ + inputFieldNamesFromMetadataArray: Set | null; + /** * A mapping of output field names to the property names. */ diff --git a/packages/compiler-cli/src/ngtsc/metadata/src/dts.ts b/packages/compiler-cli/src/ngtsc/metadata/src/dts.ts index ac1ba16d91f6..19f1b0c03860 100644 --- a/packages/compiler-cli/src/ngtsc/metadata/src/dts.ts +++ b/packages/compiler-cli/src/ngtsc/metadata/src/dts.ts @@ -174,6 +174,10 @@ export class DtsMetadataReader implements MetadataReader { ngContentSelectors, isStandalone, isSignal, + // We do not transfer information about inputs from class metadata + // via `.d.ts` declarations. This is fine because this metadata is + // currently only used for classes defined in source files. E.g. in migrations. + inputFieldNamesFromMetadataArray: null, // Imports are tracked in metadata only for template type-checking purposes, // so standalone components from .d.ts files don't have any. imports: null, diff --git a/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts b/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts index 26e1bf8c50a4..6c44f7aa3038 100644 --- a/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts +++ b/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts @@ -354,6 +354,7 @@ function fakeDirective(ref: Reference): DirectiveMeta { preserveWhitespaces: false, isExplicitlyDeferred: false, deferredImports: null, + inputFieldNamesFromMetadataArray: null, }; } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/testing/index.ts b/packages/compiler-cli/src/ngtsc/typecheck/testing/index.ts index 8f3a3a563814..b8ef09260567 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/testing/index.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/testing/index.ts @@ -955,6 +955,7 @@ function makeScope(program: ts.Program, sf: ts.SourceFile, decls: TestDeclaratio ngContentSelectors: decl.ngContentSelectors || null, preserveWhitespaces: decl.preserveWhitespaces ?? false, isExplicitlyDeferred: false, + inputFieldNamesFromMetadataArray: null, hostDirectives: decl.hostDirectives === undefined ? null From a22f1428b7656cc85a8f9dcea0c174ff93002a97 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 14:36:55 +0000 Subject: [PATCH 061/143] refactor(compiler): support use of poisoned data as private compiler option (#57082) This allows use of poisoned data for migrations. Right now, migrations often enable this flag by creating some deeper structures of the Angular compiler, but with this change it's easier to enable as a private compiler option. This is helpful for migrations, specifically the signal input migration as it allows us to generate as much TCB code as possible, for reference resolution. PR Close #57082 --- packages/compiler-cli/src/ngtsc/core/api/src/options.ts | 6 ++++++ packages/compiler-cli/src/ngtsc/core/src/compiler.ts | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/core/api/src/options.ts b/packages/compiler-cli/src/ngtsc/core/api/src/options.ts index b0878179a583..113f16af74f7 100644 --- a/packages/compiler-cli/src/ngtsc/core/api/src/options.ts +++ b/packages/compiler-cli/src/ngtsc/core/api/src/options.ts @@ -37,6 +37,12 @@ export interface TestOnlyOptions { */ _enableTemplateTypeChecker?: boolean; + /** + * Whether components that are poisoned should still be processed. + * E.g. for generation of type check blocks and diagnostics. + */ + _compilePoisedComponents?: boolean; + /** * An option to enable ngtsc's internal performance tracing. * diff --git a/packages/compiler-cli/src/ngtsc/core/src/compiler.ts b/packages/compiler-cli/src/ngtsc/core/src/compiler.ts index 20d03cd60410..97f4be25ff10 100644 --- a/packages/compiler-cli/src/ngtsc/core/src/compiler.ts +++ b/packages/compiler-cli/src/ngtsc/core/src/compiler.ts @@ -454,8 +454,9 @@ export class NgCompiler { private livePerfRecorder: ActivePerfRecorder, ) { this.delegatingPerfRecorder = new DelegatingPerfRecorder(this.perfRecorder); + this.usePoisonedData = usePoisonedData || !!options._compilePoisedComponents; this.enableTemplateTypeChecker = - enableTemplateTypeChecker || (options['_enableTemplateTypeChecker'] ?? false); + enableTemplateTypeChecker || !!options._enableTemplateTypeChecker; // TODO(crisbeto): remove this flag and base `enableBlockSyntax` on the `angularCoreVersion`. this.enableBlockSyntax = options['_enableBlockSyntax'] ?? true; this.enableLetSyntax = options['_enableLetSyntax'] ?? true; From 521a8d287b527a20b25393ead70873268f7443da Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 14:42:50 +0000 Subject: [PATCH 062/143] refactor(migrations): initial flow analysis logic for input migration (#57082) This commit introduces the initial flow analysis logic for the input migration. The flow analysis will allow us to determine which references inside a flow container participate potentially in narrowing. We can then use this information and the proposed restructred accesses to refactor the accesses to use temporary variables where needed. E.g. ``` if (this.input) { this.input.charAt(0); } ``` ``` const input_1 = this.input(); if (input_1) { input_1.charAt(0); } ``` Notably we could easily, naively figure out similar references in a flow container and always use temporary variables, but this approach allows us to minimally introduce such variables and this commonly leaves code very readable when no narrowing was involved (noticable in g3 tests) E.g. simple cases like: ``` this.input.bla(); this.input.bla(); ``` would otherwise result in refactored expressions, leveraging a temporary variable. PR Close #57082 --- .../src/flow_analysis/flow_containers.ts | 61 ++++ .../src/flow_analysis/flow_node_internals.ts | 139 +++++++++ .../src/flow_analysis/flow_node_traversal.ts | 120 ++++++++ .../src/flow_analysis/index.ts | 284 ++++++++++++++++++ 4 files changed, 604 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_containers.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_internals.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_traversal.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/flow_analysis/index.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_containers.ts b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_containers.ts new file mode 100644 index 000000000000..0ed502cf0b16 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_containers.ts @@ -0,0 +1,61 @@ +/** + * @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 ts from 'typescript'; + +/** + * Whether the given node represents a control flow container boundary. + * E.g. variables cannot be narrowed when descending into children of `node`. + */ +export function isControlFlowBoundary(node: ts.Node): boolean { + return ( + (ts.isFunctionLike(node) && !getImmediatelyInvokedFunctionExpression(node)) || + node.kind === ts.SyntaxKind.ModuleBlock || + node.kind === ts.SyntaxKind.SourceFile || + node.kind === ts.SyntaxKind.PropertyDeclaration + ); +} + +/** Determines the current flow container of a given node. */ +export function getControlFlowContainer(node: ts.Node): ts.Node { + return findAncestor(node.parent, (node) => isControlFlowBoundary(node))!; +} + +/** Checks whether the given node refers to an IIFE declaration. */ +function getImmediatelyInvokedFunctionExpression(func: ts.Node): ts.CallExpression | undefined { + if (func.kind === ts.SyntaxKind.FunctionExpression || func.kind === ts.SyntaxKind.ArrowFunction) { + let prev = func; + let parent = func.parent; + while (parent.kind === ts.SyntaxKind.ParenthesizedExpression) { + prev = parent; + parent = parent.parent; + } + if ( + parent.kind === ts.SyntaxKind.CallExpression && + (parent as ts.CallExpression).expression === prev + ) { + return parent as ts.CallExpression; + } + } + return undefined; +} + +/** Traverses up the node chain until the callback is true, returning the node. */ +function findAncestor( + node: ts.Node | undefined, + callback: (element: ts.Node) => boolean, +): ts.Node | undefined { + while (node) { + const result = callback(node); + if (result) { + return node; + } + node = node.parent; + } + return undefined; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_internals.ts b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_internals.ts new file mode 100644 index 000000000000..be41fc82f129 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_internals.ts @@ -0,0 +1,139 @@ +/** + * @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 + */ + +// NOTE: This file contains derived code from original sources +// created by Microsoft, licensed under an Apache License. +// This is the formal `NOTICE` for the modified/copied code. +// Original license: https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt. +// Original ref: https://github.com/microsoft/TypeScript/pull/58036 + +import ts from 'typescript'; + +/** @internal */ +export enum FlowFlags { + Unreachable = 1 << 0, // Unreachable code + Start = 1 << 1, // Start of flow graph + BranchLabel = 1 << 2, // Non-looping junction + LoopLabel = 1 << 3, // Looping junction + Assignment = 1 << 4, // Assignment + TrueCondition = 1 << 5, // Condition known to be true + FalseCondition = 1 << 6, // Condition known to be false + SwitchClause = 1 << 7, // Switch statement clause + ArrayMutation = 1 << 8, // Potential array mutation + Call = 1 << 9, // Potential assertion call + ReduceLabel = 1 << 10, // Temporarily reduce antecedents of label + Referenced = 1 << 11, // Referenced as antecedent once + Shared = 1 << 12, // Referenced as antecedent more than once + + Label = BranchLabel | LoopLabel, + Condition = TrueCondition | FalseCondition, +} + +/** @internal */ +export type FlowNode = + | FlowUnreachable + | FlowStart + | FlowLabel + | FlowAssignment + | FlowCondition + | FlowSwitchClause + | FlowArrayMutation + | FlowCall + | FlowReduceLabel; + +/** @internal */ +export interface FlowNodeBase { + flags: FlowFlags; + id: number; // Node id used by flow type cache in checker + node: unknown; // Node or other data + antecedent: FlowNode | FlowNode[] | undefined; +} + +/** @internal */ +export interface FlowUnreachable extends FlowNodeBase { + node: undefined; + antecedent: undefined; +} + +// FlowStart represents the start of a control flow. For a function expression or arrow +// function, the node property references the function (which in turn has a flowNode +// property for the containing control flow). +/** @internal */ +export interface FlowStart extends FlowNodeBase { + node: + | ts.FunctionExpression + | ts.ArrowFunction + | ts.MethodDeclaration + | ts.GetAccessorDeclaration + | ts.SetAccessorDeclaration + | undefined; + antecedent: undefined; +} + +// FlowLabel represents a junction with multiple possible preceding control flows. +/** @internal */ +export interface FlowLabel extends FlowNodeBase { + node: undefined; + antecedent: FlowNode[] | undefined; +} + +// FlowAssignment represents a node that assigns a value to a narrowable reference, +// i.e. an identifier or a dotted name that starts with an identifier or 'this'. +/** @internal */ +export interface FlowAssignment extends FlowNodeBase { + node: ts.Expression | ts.VariableDeclaration | ts.BindingElement; + antecedent: FlowNode; +} + +/** @internal */ +export interface FlowCall extends FlowNodeBase { + node: ts.CallExpression; + antecedent: FlowNode; +} + +// FlowCondition represents a condition that is known to be true or false at the +// node's location in the control flow. +/** @internal */ +export interface FlowCondition extends FlowNodeBase { + node: ts.Expression; + antecedent: FlowNode; +} + +// dprint-ignore +/** @internal */ +export interface FlowSwitchClause extends FlowNodeBase { + node: FlowSwitchClauseData; + antecedent: FlowNode; +} + +/** @internal */ +export interface FlowSwitchClauseData { + switchStatement: ts.SwitchStatement; + clauseStart: number; // Start index of case/default clause range + clauseEnd: number; // End index of case/default clause range +} + +// FlowArrayMutation represents a node potentially mutates an array, i.e. an +// operation of the form 'x.push(value)', 'x.unshift(value)' or 'x[n] = value'. +/** @internal */ +export interface FlowArrayMutation extends FlowNodeBase { + node: ts.CallExpression | ts.BinaryExpression; + antecedent: FlowNode; +} + +/** @internal */ +export interface FlowReduceLabel extends FlowNodeBase { + node: FlowReduceLabelData; + antecedent: FlowNode; +} + +/** @internal */ +export interface FlowReduceLabelData { + target: FlowLabel; + antecedents: FlowNode[]; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_traversal.ts b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_traversal.ts new file mode 100644 index 000000000000..53933b2371f1 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/flow_node_traversal.ts @@ -0,0 +1,120 @@ +/** + * @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 ts from 'typescript'; +import { + FlowArrayMutation, + FlowAssignment, + FlowCall, + FlowCondition, + FlowFlags, + FlowLabel, + FlowNode, + FlowReduceLabel, + FlowSwitchClause, +} from './flow_node_internals'; + +/** + * Traverses the graph of the TypeScript flow nodes, exploring all possible branches + * and keeps track of interesting nodes that may contribute to "narrowing". + * + * This allows us to figure out which nodes may be narrowed or not, and need + * temporary variables in the migration to allowing narrowing to continue working. + * + * Some resources on flow nodes by TypeScript: + * https://effectivetypescript.com/2024/03/24/flownodes/. + */ +export function traverseFlowForInterestingNodes(flow: FlowNode): ts.Node[] | null { + let flowDepth = 0; + let interestingNodes: ts.Node[] = []; + + const queue: FlowNode[] = [flow]; + + while (queue.length) { + flow = queue.shift()!; + + if (++flowDepth === 2000) { + // We have made 2000 recursive invocations. To avoid overflowing the call stack we report an + // error and disable further control flow analysis in the containing function or module body. + return null; + } + + const flags = flow.flags; + if (flags & FlowFlags.Assignment) { + const assignment = flow as FlowAssignment; + queue.push(assignment.antecedent); + + if (ts.isVariableDeclaration(assignment.node)) { + interestingNodes.push(assignment.node.name); + } else if (ts.isBindingElement(assignment.node)) { + interestingNodes.push(assignment.node.name); + } else { + interestingNodes.push(assignment.node); + } + } else if (flags & FlowFlags.Call) { + queue.push((flow as FlowCall).antecedent); + // Arguments can be narrowed using `FlowCall`s. + // See: node_modules/typescript/stable/src/compiler/checker.ts;l=28786-28810 + interestingNodes.push(...(flow as FlowCall).node.arguments); + } else if (flags & FlowFlags.Condition) { + queue.push((flow as FlowCondition).antecedent); + interestingNodes.push((flow as FlowCondition).node); + } else if (flags & FlowFlags.SwitchClause) { + queue.push((flow as FlowSwitchClause).antecedent); + // The switch expression can be narrowed, so it's an interesting node. + interestingNodes.push((flow as FlowSwitchClause).node.switchStatement.expression); + } else if (flags & FlowFlags.Label) { + // simple label, a single ancestor. + if ((flow as FlowLabel).antecedent?.length === 1) { + queue.push((flow as FlowLabel).antecedent![0]); + continue; + } + + if (flags & FlowFlags.BranchLabel) { + // Normal branches. e.g. switch. + queue.push(...((flow as FlowLabel).antecedent ?? [])); + } else { + // Branch for loops. + // The first antecedent always points to the flow node before the loop + // was entered. All other narrowing expressions, if present, are direct + // antecedents of the starting flow node, so we only need to look at the first. + // See: node_modules/typescript/stable/src/compiler/checker.ts;l=28108-28109 + queue.push((flow as FlowLabel).antecedent![0]); + } + } else if (flags & FlowFlags.ArrayMutation) { + queue.push((flow as FlowArrayMutation).antecedent); + // Array mutations are never interesting for inputs, as we cannot migrate + // assignments to inputs. + } else if (flags & FlowFlags.ReduceLabel) { + // reduce label is a try/catch re-routing. + // visit all possible branches. + // TODO: explore this more. + + // See: node_modules/typescript/stable/src/compiler/binder.ts;l=1636-1649. + queue.push((flow as FlowReduceLabel).antecedent); + queue.push(...(flow as FlowReduceLabel).node.antecedents); + } else if (flags & FlowFlags.Start) { + // Note: TS itself only ever continues with parent control flows, if the pre-determined `flowContainer` + // of the referenced is different. E.g. narrowing might decide to choose a higher flow container if we + // reference a constant. In which case, TS allows escaping the flow container for narrowing. See: + // http://google3/third_party/javascript/node_modules/typescript/stable/src/compiler/checker.ts;l=29399-29414;rcl=623599846. + // and TypeScript's `narrowedConstInMethod` baseline test. + // --> We don't need this as an input cannot be a constant! + return interestingNodes; + } else { + break; + } + } + + return null; +} + +/** Gets the flow node for the given node. */ +export function getFlowNode(node: ts.FlowContainer & {flowNode?: FlowNode}): FlowNode | null { + return node.flowNode ?? null; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/flow_analysis/index.ts b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/index.ts new file mode 100644 index 000000000000..1d98db7e0c28 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/flow_analysis/index.ts @@ -0,0 +1,284 @@ +/** + * @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 ts from 'typescript'; + +import {getControlFlowContainer, isControlFlowBoundary} from './flow_containers'; +import {getFlowNode, traverseFlowForInterestingNodes} from './flow_node_traversal'; +import {unwrapParent} from '../utils/unwrap_parent'; +import assert from 'assert'; + +/** + * Type describing an index of a node inside a control flow + * container. + */ +export type ControlFlowNodeIndex = number; + +/** + * Representation of a reference inside a control flow + * container. + * + * This node structure is used to link multiple nodes together + * that may be narrowed, as an example. + */ +export interface ControlFlowAnalysisNode { + /** Unique id of the node inside the container. */ + id: number; + /** Original TypeScript node of the reference in the container. */ + originalNode: ts.Identifier; + /** + * Recommended node for the reference in the container. For example: + * - may be "preserve" to indicate it's not narrowed. + * - may point to a different flow node. This means they will share for narrowing. + * - may point to a block or source file to indicate at what level this node may be shared. + * I.e. a location where we generate the temporary variable for subsequent sharing. + */ + recommendedNode: ControlFlowNodeIndex | 'preserve' | (ts.Block | ts.SourceFile); + /** Flow container this reference is part of. */ + flowContainer: ts.Node; +} + +/** Type describing a map from reference to its flow information. */ +type ReferenceMetadata = Map< + ts.Identifier, + { + resultIndex: number; + flowContainer: ts.Node; + } +>; + +/** + * Analyzes the control flow of a list of references and returns + * information about which nodes can be shared via a temporary variable + * to enable narrowing. + * + * E.g. consider the following snippet: + * + * ``` + * someMethod() { + * if (this.bla) { + * this.bla.charAt(0); + * } + * } + * ``` + * + * The analysis would inform the caller that `this.bla.charAt` can + * be shared with the `this.bla` of the `if` condition. + * + * This is useful for the signal migration as it allows us to efficiently, + * and minimally transform references into shared variables where needed. + * Needed because signals are not narrowable by default, as they are functions. + */ +export function analyzeControlFlow( + entries: ts.Identifier[], + checker: ts.TypeChecker, +): ControlFlowAnalysisNode[] { + const result: ControlFlowAnalysisNode[] = []; + const referenceToMetadata: ReferenceMetadata = new Map(); + + // Prepare easy lookups for reference nodes to flow info. + for (const [idx, entry] of entries.entries()) { + referenceToMetadata.set(entry, { + flowContainer: getControlFlowContainer(entry), + resultIndex: idx, + }); + } + + for (const entry of entries) { + const {flowContainer, resultIndex} = referenceToMetadata.get(entry)!; + const flowPathInterestingNodes = traverseFlowForInterestingNodes(getFlowNode(entry)!); + + assert( + flowContainer !== null && flowPathInterestingNodes !== null, + 'Expected a flow container to exist.', + ); + + const narrowPartners = getAllMatchingReferencesInFlowPath( + flowPathInterestingNodes, + entry, + referenceToMetadata, + flowContainer, + checker, + ); + + result.push({ + id: resultIndex, + originalNode: entry, + flowContainer, + recommendedNode: 'preserve', + }); + + if (narrowPartners.length !== 0) { + connectSharedReferences(result, narrowPartners, resultIndex); + } + } + + return result; +} + +/** + * Iterates through all partner flow nodes and connects them so that + * the first node will act as the share partner, while all subsequent + * nodes will point to the share node. + */ +function connectSharedReferences( + result: ControlFlowAnalysisNode[], + flowPartners: number[], + refId: number, +) { + const refFlowContainer = result[refId].flowContainer; + + // Inside the list of flow partners (i.e. references to the same target), + // find the node that is the first one in the flow container (via its start pos). + let earliestPartner: ts.Node | null = null; + let earliestPartnerId: number | null = null; + for (const partnerId of flowPartners) { + if ( + earliestPartner === null || + result[partnerId].originalNode.getStart() < earliestPartner.getStart() + ) { + earliestPartner = result[partnerId].originalNode; + earliestPartnerId = partnerId; + } + } + + assert(earliestPartner !== null, 'Expected an earliest partner to be found.'); + assert(earliestPartnerId !== null, 'Expected an earliest partner to be found.'); + + // Then, incorporate all similar references (or flow nodes) in between + // the reference and the earliest partner. References in between can also + // use the shared flow node and not preserve their original reference— as + // this would be rather unreadable and inefficient. + let highestBlock: ts.Block | ts.SourceFile | null = null; + for (let i = earliestPartnerId; i <= refId; i++) { + // Different flow container captured sequentially in result. Ignore. + if (result[i].flowContainer !== refFlowContainer) { + continue; + } + + // Iterate up the block, find the highest block within the flow container. + let block: ts.Node = result[i].originalNode.parent; + while (!ts.isSourceFile(block) && !ts.isBlock(block)) { + block = block.parent; + } + if (highestBlock === null || block.getStart() < highestBlock.getStart()) { + highestBlock = block; + } + + if (i !== earliestPartnerId) { + result[i].recommendedNode = earliestPartnerId; + } + } + + assert(highestBlock, 'Expected a block anchor to be found'); + result[earliestPartnerId].recommendedNode = highestBlock; +} + +/** + * Looks through the flow path and interesting nodes to determine which + * of the potential "interesting" nodes point to the same reference. + * + * These nodes are then considered "partners" and will be returned via + * their IDs (or practically their result indices). + */ +function getAllMatchingReferencesInFlowPath( + flowPathInterestingNodes: ts.Node[], + reference: ts.Identifier, + referenceToMetadata: ReferenceMetadata, + restrainingFlowContainer: ts.Node, + checker: ts.TypeChecker, +): number[] { + const partners: number[] = []; + + for (const flowNode of flowPathInterestingNodes) { + // quick naive perf-optimized check to see if the flow node has a potential + // similar reference. + if (!flowNode.getText().includes(reference.getText())) { + continue; + } + + const similarRefNodeId = findSimilarReferenceNode( + flowNode, + reference, + referenceToMetadata, + restrainingFlowContainer, + checker, + ); + + if (similarRefNodeId !== null) { + partners.push(similarRefNodeId); + } + } + return partners; +} + +/** + * Checks if the given node contains an identifier that + * matches the given reference. If so, returns its flow ID. + */ +function findSimilarReferenceNode( + start: ts.Node, + reference: ts.Identifier, + referenceToMetadata: ReferenceMetadata, + restrainingFlowContainer: ts.Node, + checker: ts.TypeChecker, +): number | null { + return ( + ts.forEachChild<{idx: number}>(start, function visitChild(node: ts.Node) { + // do not descend into control flow boundaries. + // only references sharing the same container are relevant. + // This is a performance optimization. + if (isControlFlowBoundary(node)) { + return; + } + // If this is not a potential matching identifier, check its children. + if ( + !ts.isIdentifier(node) || + referenceToMetadata.get(node)?.flowContainer !== restrainingFlowContainer + ) { + return ts.forEachChild<{idx: number}>(node, visitChild); + } + // If this refers to a different instantiation of the input reference, + // continue looking. + if (!isLexicalSameReference(checker, node, reference)) { + return; + } + return {idx: referenceToMetadata.get(node)!.resultIndex}; + })?.idx ?? null + ); +} + +/** + * Checks whether a given identifier is lexically equivalent. + * e.g. checks that they have similar property receiver accesses. + */ +function isLexicalSameReference( + checker: ts.TypeChecker, + sharePartner: ts.Identifier, + reference: ts.Identifier, +): boolean { + const aParent = unwrapParent(reference.parent); + // If the reference is not part a property access, return true. The references + // are guaranteed symbol matches. + if (!ts.isPropertyAccessExpression(aParent) && !ts.isElementAccessExpression(aParent)) { + return sharePartner.text === reference.text; + } + // If reference parent is part of a property expression, but the share + // partner not, then this cannot be shared. + const bParent = unwrapParent(sharePartner.parent); + if (aParent.kind !== bParent.kind) { + return false; + } + + const aParentExprSymbol = checker.getSymbolAtLocation(aParent.expression); + const bParentExprSymbol = checker.getSymbolAtLocation( + (bParent as ts.PropertyAccessExpression | ts.ElementAccessExpression).expression, + ); + + return aParentExprSymbol === bParentExprSymbol; +} From a196c8d8db7fc3bbc135c50f87d171571fc6a364 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 14:57:13 +0000 Subject: [PATCH 063/143] refactor(migrations): add initial helpers and registry for tracking inputs (#57082) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds the initial set of helpers and registries for tracking inputs discovered in the signal input migration. A few short summary notes: - Every input has an unique key. This key is used for global analysis that may be performed when the migration is executed on a per individual unit basis in Google3 via e.g. go/tsunami — The keys allow us to build a combined global metadata for e.g. references or figuring out which inputs are incompatible or not. - A known input may be _any_ input in an compilation unit/ the program. E.g. even inputs from `d.ts`. We keep track of these inputs so that we can later figure out if a reference `ts.Identifier` points to any of those. In addition it allows us to attach incompatibility metadata to those. I.e. incompatible for migration because "something writes to the input". PR Close #57082 --- .../src/input_detection/directive_info.ts | 52 ++++++++ .../src/input_detection/incompatibility.ts | 46 +++++++ .../src/input_detection/input_node.ts | 28 +++++ .../src/input_detection/known_inputs.ts | 112 ++++++++++++++++++ .../src/input_detection/nodes_to_input.ts | 37 ++++++ .../signal-migration/src/utils/input_id.ts | 62 ++++++++++ 6 files changed, 337 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/directive_info.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/input_node.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/known_inputs.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/nodes_to_input.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/input_id.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/directive_info.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/directive_info.ts new file mode 100644 index 000000000000..5d695fd68212 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/directive_info.ts @@ -0,0 +1,52 @@ +/** + * @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 ts from 'typescript'; +import {ExtractedInput} from './input_decorator'; +import {InputDescriptor, InputUniqueKey} from '../utils/input_id'; +import {ClassIncompatibilityReason, InputMemberIncompatibility} from './incompatibility'; + +/** + * Class that holds information about a given directive and its input fields. + */ +export class DirectiveInfo { + /** + * Map of inputs detected in the given class. + * Maps string-based input ids to the detailed input metadata. + */ + inputFields = new Map(); + + /** Map of input IDs and their incompatibilities. */ + memberIncompatibility = new Map(); + + /** Whether the whole class is incompatible. */ + incompatible: ClassIncompatibilityReason | null = null; + + constructor(public clazz: ts.ClassDeclaration) {} + + /** + * Checks whether the class is skipped for migration because all of + * the inputs are marked as incompatible, or the class itself. + */ + isClassSkippedForMigration(): boolean { + return ( + this.incompatible !== null || + Array.from(this.inputFields.values()).every(({descriptor}) => + this.isInputMemberIncompatible(descriptor), + ) + ); + } + + /** + * Whether the given input member is incompatible. If the class is incompatible, + * then the member is as well. + */ + isInputMemberIncompatible(input: InputDescriptor): boolean { + return this.incompatible !== null || this.memberIncompatibility.has(input.key); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts new file mode 100644 index 000000000000..9cdec9ac7683 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts @@ -0,0 +1,46 @@ +/** + * @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 ts from 'typescript'; + +/** Reasons why an input cannot be migrated. */ +export enum InputIncompatibilityReason { + Accessor, + WriteAssignment, + OverriddenByDerivedClass, + RedeclaredViaDerivedClassDecorator, + TypeConflictWithBaseClass, + ParentIsIncompatible, + SpyOnThatOverwritesField, + NarrowedInTemplateButNotSupportedYetTODO, + IgnoredBecauseOfLanguageServiceRefactoringRange, + RequiredInputButNoGoodExplicitTypeExtractable, +} + +/** Reasons why a whole class and its inputs cannot be migrated. */ +export enum ClassIncompatibilityReason { + ClassManuallyInstantiated, + ClassReferencedInPotentiallyBadLocation, +} + +/** Description of an input incompatibility and some helpful debug context. */ +export interface InputMemberIncompatibility { + reason: InputIncompatibilityReason; + context: ts.Node | null; +} + +/** Whether the given value refers to an input member incompatibility. */ +export function isInputMemberIncompatibility(value: unknown): value is InputMemberIncompatibility { + return ( + (value as Partial).reason !== undefined && + (value as Partial).context !== undefined && + InputIncompatibilityReason.hasOwnProperty( + (value as Partial).reason!, + ) + ); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/input_node.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/input_node.ts new file mode 100644 index 000000000000..e97b7afe6960 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/input_node.ts @@ -0,0 +1,28 @@ +/** + * @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 ts from 'typescript'; +import {getMemberName} from '../utils/class_member_names'; + +/** Variants of input names supported by Angular compiler's input detection. */ +export type InputNameNode = ts.Identifier | ts.StringLiteral | ts.PrivateIdentifier; + +/** Describes a TypeScript node that can be an Angular `@Input()` declaration. */ +export type InputNode = (ts.AccessorDeclaration | ts.PropertyDeclaration) & { + name: InputNameNode; + parent: ts.ClassDeclaration; +}; + +/** Checks whether the given node can be an `@Input()` declaration node. */ +export function isInputContainerNode(node: ts.Node): node is InputNode { + return ( + ((ts.isAccessor(node) && ts.isClassDeclaration(node.parent)) || + ts.isPropertyDeclaration(node)) && + getMemberName(node) !== null + ); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/known_inputs.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/known_inputs.ts new file mode 100644 index 000000000000..412640f79fdf --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/known_inputs.ts @@ -0,0 +1,112 @@ +/** + * @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 ts from 'typescript'; +import {InputDescriptor, InputUniqueKey} from '../utils/input_id'; +import {ExtractedInput} from './input_decorator'; +import {InputNode} from './input_node'; +import {DirectiveInfo} from './directive_info'; +import {ClassIncompatibilityReason, InputMemberIncompatibility} from './incompatibility'; + +/** + * Public interface describing a single known `@Input()` in the + * compilation. + * + * A known `@Input()` may be defined in sources, or inside some `d.ts` files + * loaded into the program. + */ +export type KnownInputInfo = { + metadata: ExtractedInput; + descriptor: InputDescriptor; + container: DirectiveInfo; + isIncompatible: () => boolean; +}; + +/** + * Registry keeping track of all known `@Input()`s in the compilation. + * + * A known `@Input()` may be defined in sources, or inside some `d.ts` files + * loaded into the program. + */ +export class KnownInputs { + /** + * Known inputs from the whole program. + */ + knownInputIds = new Map(); + + /** Known container classes of inputs. */ + private _allClasses = new Set(); + /** Maps classes to their directive info. */ + private _classToDirectiveInfo = new Map(); + + /** Whether the given input exists. */ + has(descr: Pick): boolean { + return this.knownInputIds.has(descr.key); + } + + /** Whether the given class contains `@Input`s. */ + isInputContainingClass(clazz: ts.ClassDeclaration): boolean { + return this._classToDirectiveInfo.has(clazz); + } + + /** Gets precise `@Input()` information for the given class. */ + getDirectiveInfoForClass(clazz: ts.ClassDeclaration): DirectiveInfo | undefined { + return this._classToDirectiveInfo.get(clazz); + } + + /** Gets known input information for the given `@Input()`. */ + get(descr: Pick): KnownInputInfo | undefined { + return this.knownInputIds.get(descr.key); + } + + /** Gets all classes containing `@Input`s in the compilation. */ + getAllInputContainingClasses(): ts.ClassDeclaration[] { + return Array.from(this._allClasses.values()); + } + + /** Registers an `@Input()` in the registry. */ + register(data: {descriptor: InputDescriptor; node: InputNode; metadata: ExtractedInput}) { + if (!this._classToDirectiveInfo.has(data.node.parent)) { + this._classToDirectiveInfo.set(data.node.parent, new DirectiveInfo(data.node.parent)); + } + const directiveInfo = this._classToDirectiveInfo.get(data.node.parent)!; + + directiveInfo.inputFields.set(data.descriptor.key, { + descriptor: data.descriptor, + metadata: data.metadata, + }); + this.knownInputIds.set(data.descriptor.key, { + metadata: data.metadata, + descriptor: data.descriptor, + container: directiveInfo, + isIncompatible: () => directiveInfo.isInputMemberIncompatible(data.descriptor), + }); + this._allClasses.add(data.node.parent); + } + + /** Marks the given input as incompatible for migration. */ + markInputAsIncompatible(input: InputDescriptor, incompatibility: InputMemberIncompatibility) { + if (!this.knownInputIds.has(input.key)) { + throw new Error(`Input cannot be marked as incompatible because it's not registered.`); + } + this.knownInputIds + .get(input.key)! + .container.memberIncompatibility.set(input.key, incompatibility); + } + + /** Marks the given class as incompatible for migration. */ + markDirectiveAsIncompatible( + clazz: ts.ClassDeclaration, + incompatibility: ClassIncompatibilityReason, + ) { + if (!this._classToDirectiveInfo.has(clazz)) { + throw new Error(`Class cannot be marked as incompatible because it's not known.`); + } + this._classToDirectiveInfo.get(clazz)!.incompatible = incompatibility; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/nodes_to_input.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/nodes_to_input.ts new file mode 100644 index 000000000000..91a2038dac44 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/nodes_to_input.ts @@ -0,0 +1,37 @@ +/** + * @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 ts from 'typescript'; +import {MigrationHost} from '../migration_host'; +import {isInputContainerNode} from '../input_detection/input_node'; +import {getInputDescriptor} from '../utils/input_id'; +import {KnownInputInfo, KnownInputs} from './known_inputs'; + +/** + * Attempts to resolve the known `@Input` metadata for the given + * type checking symbol. Returns `null` if it's not for an input. + */ +export function attemptRetrieveInputFromSymbol( + host: MigrationHost, + memberSymbol: ts.Symbol, + knownInputs: KnownInputs, +): KnownInputInfo | null { + // Even for declared classes from `.d.ts`, the value declaration + // should exist and point to the property declaration. + if ( + memberSymbol.valueDeclaration !== undefined && + isInputContainerNode(memberSymbol.valueDeclaration) + ) { + const member = memberSymbol.valueDeclaration; + // If the member itself is an input that is being migrated, we + // do not need to check, as overriding would be fine then— like before. + const memberInputDescr = isInputContainerNode(member) ? getInputDescriptor(host, member) : null; + return memberInputDescr !== null ? knownInputs.get(memberInputDescr) ?? null : null; + } + return null; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/input_id.ts b/packages/core/schematics/migrations/signal-migration/src/utils/input_id.ts new file mode 100644 index 000000000000..04904f9f5a87 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/input_id.ts @@ -0,0 +1,62 @@ +/** + * @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 ts from 'typescript'; +import {MigrationHost} from '../migration_host'; +import {InputNode} from '../input_detection/input_node'; + +/** + * Unique key for an input in a project. + * + * This is the serializable variant, raw string form that + * is serializable and allows for cross-target knowledge + * needed for the batching capability (via e.g. go/tsunami). + */ +export type InputUniqueKey = {__inputUniqueKey: true}; + +/** + * Interface that describes an input recognized in the + * migration and project. + */ +export interface InputDescriptor { + key: InputUniqueKey; + node: InputNode; +} + +/** + * Gets the descriptor for the given input node. + * + * An input descriptor describes a recognized input in the + * whole project (regardless of batching) and allows easy + * access to the associated TypeScript declaration node, while + * also providing a unique key for the input that can be used + * for serializable communication between compilation units + * (e.g. when running via batching; in e.g. go/tsunami). + */ +export function getInputDescriptor(host: MigrationHost, node: InputNode): InputDescriptor { + let className: string; + if (ts.isAccessor(node)) { + className = node.parent.name?.text || ''; + } else { + className = node.parent.name?.text ?? ''; + } + + const fileId = host.fileToId(node.getSourceFile()); + return { + key: `${fileId}@@${className}@@${node.name.text}` as unknown as InputUniqueKey, + node, + }; +} + +/** Whether the given value is an input descriptor. */ +export function isInputDescriptor(v: unknown): v is InputDescriptor { + return ( + (v as Partial).key !== undefined && + (v as Partial).node !== undefined + ); +} From b5d610062b62485ea83e9ee9e3a547947a7eadde Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:11:38 +0000 Subject: [PATCH 064/143] refactor(migrations): phase for recognizing inputs in program (#57082) This introduces the phase for recognizing inputs the migration target program, extracting input metadata. PR Close #57082 --- .../src/input_detection/input_decorator.ts | 193 ++++++++++++++++++ .../src/passes/1_identify_inputs.ts | 90 ++++++++ 2 files changed, 283 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/input_decorator.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/1_identify_inputs.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/input_decorator.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/input_decorator.ts new file mode 100644 index 000000000000..71fa372df703 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/input_decorator.ts @@ -0,0 +1,193 @@ +/** + * @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 ts from 'typescript'; + +import {getAngularDecorators} from '../../../../../../compiler-cli/src/ngtsc/annotations'; +import {parseDecoratorInputTransformFunction} from '../../../../../../compiler-cli/src/ngtsc/annotations/directive'; +import {FatalDiagnosticError} from '../../../../../../compiler-cli/src/ngtsc/diagnostics'; +import {Reference, ReferenceEmitter} from '../../../../../../compiler-cli/src/ngtsc/imports'; +import { + DecoratorInputTransform, + DtsMetadataReader, + InputMapping, +} from '../../../../../../compiler-cli/src/ngtsc/metadata'; +import { + DynamicValue, + PartialEvaluator, + ResolvedValueMap, +} from '../../../../../../compiler-cli/src/ngtsc/partial_evaluator'; +import { + ClassDeclaration, + DecoratorIdentifier, + ReflectionHost, +} from '../../../../../../compiler-cli/src/ngtsc/reflection'; +import {CompilationMode} from '../../../../../../compiler-cli/src/ngtsc/transform'; +import {MigrationHost} from '../migration_host'; +import {InputNode, isInputContainerNode} from '../input_detection/input_node'; + +/** Metadata extracted of an input declaration (in `.ts` or `.d.ts` files). */ +export interface ExtractedInput extends InputMapping { + inSourceFile: boolean; + inputDecoratorRef: DecoratorIdentifier | null; +} + +/** Attempts to extract metadata of a potential TypeScript `@Input()` declaration. */ +export function extractDecoratorInput( + node: ts.Node, + host: MigrationHost, + reflector: ReflectionHost, + metadataReader: DtsMetadataReader, + evaluator: PartialEvaluator, + refEmitter: ReferenceEmitter, +): ExtractedInput | null { + return ( + extractSourceCodeInput(node, host, reflector, evaluator, refEmitter) ?? + extractDtsInput(node, metadataReader) + ); +} + +/** + * Attempts to extract `@Input()` information for the given node, assuming it's + * part of a `.d.ts` file. + */ +function extractDtsInput(node: ts.Node, metadataReader: DtsMetadataReader): ExtractedInput | null { + if ( + !isInputContainerNode(node) || + !ts.isIdentifier(node.name) || + !node.getSourceFile().isDeclarationFile + ) { + return null; + } + // If the potential node is not part of a valid input class, skip. + if ( + !ts.isClassDeclaration(node.parent) || + node.parent.name === undefined || + !ts.isIdentifier(node.parent.name) + ) { + return null; + } + + const directiveMetadata = metadataReader.getDirectiveMetadata( + new Reference(node.parent as ClassDeclaration), + ); + const inputMapping = directiveMetadata?.inputs.getByClassPropertyName(node.name.text); + + // Signal inputs are never tracked and migrated. + if (inputMapping?.isSignal) { + return null; + } + + return inputMapping == null + ? null + : { + ...inputMapping, + inputDecoratorRef: null, + inSourceFile: false, + }; +} + +/** + * Attempts to extract `@Input()` information for the given node, assuming it's + * directly defined inside a source file (`.ts`). + */ +function extractSourceCodeInput( + node: ts.Node, + host: MigrationHost, + reflector: ReflectionHost, + evaluator: PartialEvaluator, + refEmitter: ReferenceEmitter, +): ExtractedInput | null { + if ( + !isInputContainerNode(node) || + !ts.isIdentifier(node.name) || + node.getSourceFile().isDeclarationFile + ) { + return null; + } + const decorators = reflector.getDecoratorsOfDeclaration(node); + if (decorators === null) { + return null; + } + const ngDecorators = getAngularDecorators(decorators, ['Input'], host.isMigratingCore); + if (ngDecorators.length === 0) { + return null; + } + const inputDecorator = ngDecorators[0]; + + let publicName = node.name.text; + let isRequired = false; + let transformResult: DecoratorInputTransform | null = null; + + // Check options object from `@Input()`. + if (inputDecorator.args?.length === 1) { + const evaluatedInputOpts = evaluator.evaluate(inputDecorator.args[0]); + if (typeof evaluatedInputOpts === 'string') { + publicName = evaluatedInputOpts; + } else if (evaluatedInputOpts instanceof Map) { + if (evaluatedInputOpts.has('alias') && typeof evaluatedInputOpts.get('alias') === 'string') { + publicName = evaluatedInputOpts.get('alias')! as string; + } + if ( + evaluatedInputOpts.has('required') && + typeof evaluatedInputOpts.get('required') === 'boolean' + ) { + isRequired = !!evaluatedInputOpts.get('required'); + } + if (evaluatedInputOpts.has('transform') && evaluatedInputOpts.get('transform') != null) { + transformResult = parseTransformOfInput(evaluatedInputOpts, node, reflector, refEmitter); + } + } + } + + return { + bindingPropertyName: publicName, + classPropertyName: node.name.text, + required: isRequired, + isSignal: false, + inSourceFile: true, + transform: transformResult, + inputDecoratorRef: inputDecorator.identifier, + }; +} + +/** + * Gracefully attempts to parse the `transform` option of an `@Input()` + * and extracts its metadata. + */ +function parseTransformOfInput( + evaluatedInputOpts: ResolvedValueMap, + node: InputNode, + reflector: ReflectionHost, + refEmitter: ReferenceEmitter, +): DecoratorInputTransform | null { + const transformValue = evaluatedInputOpts.get('transform'); + if (!(transformValue instanceof DynamicValue) && !(transformValue instanceof Reference)) { + return null; + } + + try { + return parseDecoratorInputTransformFunction( + node.parent as ClassDeclaration, + node.name.text, + transformValue, + reflector, + refEmitter, + CompilationMode.FULL, + ); + } catch (e: unknown) { + if (!(e instanceof FatalDiagnosticError)) { + throw e; + } + + // TODO: implement error handling. + // See failing case: e.g. inherit_definition_feature_spec.ts + console.error(`${e.node.getSourceFile().fileName}: ${e.toString()}`); + return null; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/1_identify_inputs.ts b/packages/core/schematics/migrations/signal-migration/src/passes/1_identify_inputs.ts new file mode 100644 index 000000000000..e0c720d451b4 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/1_identify_inputs.ts @@ -0,0 +1,90 @@ +/** + * @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 assert from 'assert'; +import ts from 'typescript'; +import {ReferenceEmitter} from '../../../../../../compiler-cli/src/ngtsc/imports'; +import {DtsMetadataReader} from '../../../../../../compiler-cli/src/ngtsc/metadata'; +import {PartialEvaluator} from '../../../../../../compiler-cli/src/ngtsc/partial_evaluator'; +import {TypeScriptReflectionHost} from '../../../../../../compiler-cli/src/ngtsc/reflection'; +import {extractDecoratorInput} from '../input_detection/input_decorator'; +import {isInputContainerNode} from '../input_detection/input_node'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {MigrationHost} from '../migration_host'; +import {MigrationResult} from '../result'; +import {getInputDescriptor} from '../utils/input_id'; +import {prepareAndCheckForConversion} from '../convert-input/prepare_and_check'; +import {isInputMemberIncompatibility} from '../input_detection/incompatibility'; + +/** + * Phase where we iterate through all source files of the program (including `.d.ts`) + * and keep track of all `@Input`'s we discover. + */ +export function pass1__IdentifySourceFileAndDeclarationInputs( + sf: ts.SourceFile, + host: MigrationHost, + checker: ts.TypeChecker, + reflector: TypeScriptReflectionHost, + dtsMetadataReader: DtsMetadataReader, + evaluator: PartialEvaluator, + refEmitter: ReferenceEmitter, + knownDecoratorInputs: KnownInputs, + result: MigrationResult, +) { + const visitor = (node: ts.Node) => { + const decoratorInput = extractDecoratorInput( + node, + host, + reflector, + dtsMetadataReader, + evaluator, + refEmitter, + ); + if (decoratorInput !== null) { + assert(isInputContainerNode(node), 'Expected input to be declared on accessor or property.'); + const inputDescr = getInputDescriptor(host, node); + + // track all inputs, even from declarations for reference resolution. + knownDecoratorInputs.register({descriptor: inputDescr, metadata: decoratorInput, node}); + + // track source file inputs in the result of this target. + // these are then later migrated in the migration phase. + if (decoratorInput.inSourceFile && host.isSourceFileForCurrentMigration(sf)) { + const conversionPreparation = prepareAndCheckForConversion(node, decoratorInput, checker); + + if (isInputMemberIncompatibility(conversionPreparation)) { + knownDecoratorInputs.markInputAsIncompatible(inputDescr, conversionPreparation); + result.sourceInputs.set(inputDescr, null); + } else { + result.sourceInputs.set(inputDescr, conversionPreparation); + } + } + } + + // track all imports to `Input` or `input`. + let importName: string | null = null; + if ( + ts.isImportSpecifier(node) && + ((importName = (node.propertyName ?? node.name).text) === 'Input' || + importName === 'input') && + ts.isStringLiteral(node.parent.parent.parent.moduleSpecifier) && + (host.isMigratingCore || node.parent.parent.parent.moduleSpecifier.text === '@angular/core') + ) { + if (!result.inputDecoratorSpecifiers.has(sf)) { + result.inputDecoratorSpecifiers.set(sf, []); + } + result.inputDecoratorSpecifiers.get(sf)!.push({ + kind: importName === 'input' ? 'signal-input-import' : 'decorator-input-import', + node, + }); + } + + ts.forEachChild(node, visitor); + }; + ts.forEachChild(sf, visitor); +} From 9bda2c3fa328e6da552dcbf159b8952d388adcfc Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:13:59 +0000 Subject: [PATCH 065/143] refactor(migrations): initial logic for converting `@Input()` to `input` (#57082) This commit includes the initial logic for converting `@Input()` to `input`. The logic is not fully polished in terms of what use-cases and patterns we want to generate, but it's working pretty stable with testing in Angular Material and some g3 targets. We may improve this and e.g. generate the `input()` shorthand in a couple of cases. The commit also includes some related helpers/parts that are needed for the migration phases. Notably the conversion phase is split up into preparation and migration. That is necessary because as part of analysing we already try to prepare to see if it's "possible". This is necessary for the global metadata analysis, so that we can know that certain references are incompatible across compilation units (e.g. when running as a batch). PR Close #57082 --- .../src/convert-input/convert_to_signal.ts | 158 ++++++++++++++++++ .../src/convert-input/prepare_and_check.ts | 114 +++++++++++++ .../signal-migration/src/migration_host.ts | 53 ++++++ .../signal-migration/src/replacement.ts | 28 ++++ .../migrations/signal-migration/src/result.ts | 46 +++++ .../src/write_replacements.ts | 22 +++ 6 files changed, 421 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/convert-input/convert_to_signal.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/convert-input/prepare_and_check.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/migration_host.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/replacement.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/result.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/write_replacements.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/convert-input/convert_to_signal.ts b/packages/core/schematics/migrations/signal-migration/src/convert-input/convert_to_signal.ts new file mode 100644 index 000000000000..e9c0c107feb5 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/convert-input/convert_to_signal.ts @@ -0,0 +1,158 @@ +/** + * @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 assert from 'assert'; +import ts from 'typescript'; + +import {MigrationHost} from '../migration_host'; +import {ConvertInputPreparation} from './prepare_and_check'; +import {DecoratorInputTransform} from '../../../../../../compiler-cli/src/ngtsc/metadata'; + +const printer = ts.createPrinter({newLine: ts.NewLineKind.LineFeed}); + +/** + * + * Converts an `@Input()` property declaration to a signal input. + * + * @returns The transformed property declaration, printed as a string. + */ +export function convertToSignalInput( + host: MigrationHost, + node: ts.PropertyDeclaration, + {resolvedMetadata: metadata, resolvedType, isResolvedTypeCheckable}: ConvertInputPreparation, + checker: ts.TypeChecker, +): string { + let initialValue = node.initializer; + let optionsLiteral: ts.ObjectLiteralExpression | null = null; + + // We need an options array for the input because: + // - the input is either aliased, + // - or we have a transform. + if (metadata.bindingPropertyName !== metadata.classPropertyName || metadata.transform !== null) { + const properties: ts.ObjectLiteralElementLike[] = []; + if (metadata.bindingPropertyName !== metadata.classPropertyName) { + properties.push( + ts.factory.createPropertyAssignment( + 'alias', + ts.factory.createStringLiteral(metadata.bindingPropertyName), + ), + ); + } + if (metadata.transform !== null) { + properties.push( + extractTransformOfInput(metadata.transform, resolvedType, isResolvedTypeCheckable, checker), + ); + } + + optionsLiteral = ts.factory.createObjectLiteralExpression(properties); + } + + const strictPropertyInitialization = + !!host.tsOptions.strict || !!host.tsOptions.strictPropertyInitialization; + const inputArgs: ts.Expression[] = []; + const typeArguments: ts.TypeNode[] = []; + + if (resolvedType !== undefined) { + typeArguments.push(resolvedType); + + if (metadata.transform !== null) { + typeArguments.push(metadata.transform.type.node); + } + } + + // If we have no initial value but strict property initialization is enabled, we + // need to add an explicit value. Alternatively, if we have an explicit type, we + // need to add an explicit initial value as per the API signature of `input()`. + if (initialValue === undefined && (strictPropertyInitialization || resolvedType !== undefined)) { + // TODO: Consider initializations inside the constructor. Those are not migrated right now + // though, as they are writes. + + // TODO: We can use the `input()` shorthand if there is a question mark? + // We can assume `undefined` is part of the type already, either already was included, or + // we added synthetically as part of the preparation. + initialValue = ts.factory.createIdentifier('undefined'); + } + + // Always add an initial value when the input is optional, and we have one, or we need one + // to be able to pass options as the second argument. + if (!metadata.required && (initialValue !== undefined || optionsLiteral !== null)) { + // TODO: undefined `input()` shorthand support! + inputArgs.push(initialValue ?? ts.factory.createIdentifier('undefined')); + } + + if (optionsLiteral !== null) { + inputArgs.push(optionsLiteral); + } + + const inputFnRef = + metadata.inputDecoratorRef !== null && ts.isPropertyAccessExpression(metadata.inputDecoratorRef) + ? ts.factory.createPropertyAccessExpression(metadata.inputDecoratorRef.expression, 'input') + : ts.factory.createIdentifier('input'); + + const inputInitializerFn = metadata.required + ? ts.factory.createPropertyAccessExpression(inputFnRef, 'required') + : inputFnRef; + + const inputInitializer = ts.factory.createCallExpression( + inputInitializerFn, + typeArguments, + inputArgs, + ); + + // TODO: + // - modifiers (but private does not work) + // - preserve custom decorators etc. + + const result = ts.factory.createPropertyDeclaration( + undefined, + node.name, + undefined, + undefined, + inputInitializer, + ); + + return printer.printNode(ts.EmitHint.Unspecified, result, node.getSourceFile()); +} + +/** + * Extracts the transform for the given input and returns a property assignment + * that works for the new signal `input()` API. + */ +function extractTransformOfInput( + transform: DecoratorInputTransform, + resolvedType: ts.TypeNode | undefined, + isResolvedTypeCheckable: boolean, + checker: ts.TypeChecker, +): ts.PropertyAssignment { + assert(ts.isExpression(transform.node), `Expected transform to be an expression.`); + let transformFn: ts.Expression = transform.node; + + // If there is an explicit type, check if the transform return type actually works. + // In some cases, the transform function is not compatible because with decorator inputs, + // those were not checked. We cast the transform to `any` and add a TODO. + // TODO: Insert a TODO and capture this in the design doc. + if (resolvedType !== undefined && isResolvedTypeCheckable) { + const transformType = checker.getTypeAtLocation(transform.node); + const transformSignature = transformType.getCallSignatures()[0]; + assert(transformSignature !== undefined, 'Expected transform to be an invoke-able.'); + + if ( + !checker.isTypeAssignableTo( + checker.getReturnTypeOfSignature(transformSignature), + checker.getTypeFromTypeNode(resolvedType), + ) + ) { + transformFn = ts.factory.createAsExpression( + ts.factory.createParenthesizedExpression(transformFn), + ts.factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), + ); + } + } + + return ts.factory.createPropertyAssignment('transform', transformFn); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/convert-input/prepare_and_check.ts b/packages/core/schematics/migrations/signal-migration/src/convert-input/prepare_and_check.ts new file mode 100644 index 000000000000..a2a3cbc792cb --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/convert-input/prepare_and_check.ts @@ -0,0 +1,114 @@ +/** + * @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 ts from 'typescript'; +import {ExtractedInput} from '../input_detection/input_decorator'; +import { + InputIncompatibilityReason, + InputMemberIncompatibility, +} from '../input_detection/incompatibility'; +import {InputNode} from '../input_detection/input_node'; + +/** + * Interface describing analysis performed when the input + * was verified to be convert-able. + */ +export interface ConvertInputPreparation { + resolvedType: ts.TypeNode | undefined; + isResolvedTypeCheckable: boolean; + resolvedMetadata: ExtractedInput; +} + +/** + * Prepares a potential migration of the given node by performing + * initial analysis and checking whether it an be migrated. + * + * For example, required inputs that don't have an explicit type may not + * be migrated as we don't have a good type for `input.required`. + * (Note: `typeof Bla` may be usable— but isn't necessarily a good practice + * for complex expressions) + */ +export function prepareAndCheckForConversion( + node: InputNode, + metadata: ExtractedInput, + checker: ts.TypeChecker, +): InputMemberIncompatibility | ConvertInputPreparation { + // Accessor inputs cannot be migrated right now. + if (ts.isAccessor(node)) { + return { + context: node, + reason: InputIncompatibilityReason.Accessor, + }; + } + const initialValue = node.initializer; + + // If an input can be required, due to the non-null assertion on the property, + // make it required if there is no initializer. + if (node.exclamationToken !== undefined && initialValue === undefined) { + metadata.required = true; + } + + let typeToAdd: ts.TypeNode | undefined = node.type; + let isResolvedTypeCheckable = true; + + // If the input was using `@Input() bla?: string;`, then we try to explicitly + // add `undefined` as type, if it's not part of the type already. + if ( + node.type !== undefined && + node.questionToken !== undefined && + !checker.isTypeAssignableTo(checker.getUndefinedType(), checker.getTypeFromTypeNode(node.type)) + ) { + // Synthetic types are never checkable. + isResolvedTypeCheckable = false; + typeToAdd = ts.factory.createUnionTypeNode([ + node.type, + ts.factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword), + ]); + } + + // Attempt to extract type from input initial value. No explicit type, but input is required. + // Hence we need an explicit type, or fall back to `typeof`. + if (typeToAdd === undefined && initialValue !== undefined && metadata.required) { + // Synthetic types are never checkable. + isResolvedTypeCheckable = false; + + const propertyType = checker.getTypeAtLocation(node); + if (propertyType.flags & ts.TypeFlags.Boolean) { + typeToAdd = ts.factory.createKeywordTypeNode(ts.SyntaxKind.BooleanKeyword); + } else if (propertyType.flags & ts.TypeFlags.String) { + typeToAdd = ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword); + } else if (propertyType.flags & ts.TypeFlags.Number) { + typeToAdd = ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); + } else if (ts.isIdentifier(initialValue)) { + // @Input({required: true}) bla = SOME_DEFAULT; + typeToAdd = ts.factory.createTypeQueryNode(initialValue); + } else if ( + ts.isPropertyAccessExpression(initialValue) && + ts.isIdentifier(initialValue.name) && + ts.isIdentifier(initialValue.expression) + ) { + // @Input({required: true}) bla = prop.SOME_DEFAULT; + typeToAdd = ts.factory.createTypeQueryNode( + ts.factory.createQualifiedName(initialValue.name, initialValue.expression), + ); + } else { + // Note that we could use `typeToTypeNode` here but it's likely breaking because + // the generated type might depend on imports that we cannot add here (nor want). + return { + context: node, + reason: InputIncompatibilityReason.RequiredInputButNoGoodExplicitTypeExtractable, + }; + } + } + + return { + resolvedMetadata: metadata, + isResolvedTypeCheckable, + resolvedType: typeToAdd, + }; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/migration_host.ts b/packages/core/schematics/migrations/signal-migration/src/migration_host.ts new file mode 100644 index 000000000000..cdbcc512d5b0 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/migration_host.ts @@ -0,0 +1,53 @@ +/** + * @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 path from 'path'; +import ts from 'typescript'; + +/** + * A migration host is in practice a container object that + * exposes commonly accessed contextual helpers throughout + * the whole migration. + */ +export class MigrationHost { + private _sourceFiles: WeakSet; + + constructor( + public projectDir: string, + public isMigratingCore: boolean, + public tsOptions: ts.CompilerOptions, + sourceFiles: readonly ts.SourceFile[], + ) { + this._sourceFiles = new WeakSet(sourceFiles); + } + + /** Whether the given file is a source file to be migrated. */ + isSourceFileForCurrentMigration(file: ts.SourceFile): boolean { + return this._sourceFiles.has(file); + } + + /** Retrieves a unique serializable ID for the given source file or file path. */ + fileToId(file: ts.SourceFile | string): string { + if (typeof file !== 'string') { + // Assume that declaration files may appear in different workers, + // and in practice e.g. the input is actually part of a `.ts` file. + if (file.isDeclarationFile) { + file = file.fileName.replace(/\.d\.ts$/, '.ts'); + } else { + file = file.fileName; + } + } + + return path.relative(this.projectDir, file); + } + + /** Converts a serialized file ID to an absolute file path. */ + idToFilePath(id: string): string { + return path.join(this.projectDir, id); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/replacement.ts b/packages/core/schematics/migrations/signal-migration/src/replacement.ts new file mode 100644 index 000000000000..2422a0813fde --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/replacement.ts @@ -0,0 +1,28 @@ +/** + * @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 MagicString from 'magic-string'; + +/** Class describing a replacement to be performed. */ +export class Replacement { + constructor( + public pos: number, + public end: number, + public toInsert: string, + ) {} +} + +/** Helper that applies replacements to the given text. */ +export function applyReplacements(input: string, replacements: Replacement[]): string { + const res = new MagicString(input); + for (const replacement of replacements) { + res.remove(replacement.pos, replacement.end); + res.appendLeft(replacement.pos, replacement.toInsert); + } + return res.toString(); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/result.ts b/packages/core/schematics/migrations/signal-migration/src/result.ts new file mode 100644 index 000000000000..159fe12c1bf9 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/result.ts @@ -0,0 +1,46 @@ +/** + * @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 ts from 'typescript'; +import {Replacement} from './replacement'; +import {InputDescriptor} from './utils/input_id'; +import {InputReference} from './utils/input_reference'; +import {ConvertInputPreparation} from './convert-input/prepare_and_check'; + +/** + * State of the migration that is passed between + * the individual phases. + * + * The state/phase captures information like: + * - list of inputs that are defined in `.ts` and need migration. + * - list of references. + * - keeps track of computed replacements. + * - imports that may need to be updated. + */ +export class MigrationResult { + // May be `null` if the input cannot be converted. This is also + // signified by an incompatibility- but the input is tracked here as it + // still is a "source input". + sourceInputs = new Map(); + references: InputReference[] = []; + + // Execution data + replacements = new Map(); + inputDecoratorSpecifiers = new Map< + ts.SourceFile, + {node: ts.ImportSpecifier; kind: 'signal-input-import' | 'decorator-input-import'}[] + >(); + + addReplacement(file: string, replacement: Replacement) { + if (this.replacements.has(file)) { + this.replacements.get(file)!.push(replacement); + } else { + this.replacements.set(file, [replacement]); + } + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/write_replacements.ts b/packages/core/schematics/migrations/signal-migration/src/write_replacements.ts new file mode 100644 index 000000000000..dca34ec9f6ab --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/write_replacements.ts @@ -0,0 +1,22 @@ +/** + * @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 ts from 'typescript'; +import fs from 'fs'; +import {applyReplacements} from './replacement'; +import {MigrationResult} from './result'; + +/** Applies the migration result and applies it to the file system. */ +export function writeMigrationReplacements(tsHost: ts.CompilerHost, result: MigrationResult) { + for (const filePath of result.replacements.keys()) { + const fileText = tsHost.readFile(filePath)!; + const newText = applyReplacements(fileText, result.replacements.get(filePath)!); + + fs.writeFileSync(filePath, newText, 'utf8'); + } +} From 95ef7f41462f186b70ae777b4fa05249f8b4e29f Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:16:49 +0000 Subject: [PATCH 066/143] refactor(migrations): add AST traversal for detecting references in templates and host bindings (#57082) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds logic for AST traversing Angular HTML templates and detecting references to Angular `@Input`s that may be migrated. In addition, the expression visitor logic is built in a generic way so that it can also be used for finding references in host binding expressions— where no type check block information is available. PR Close #57082 --- .../template_reference_visitor.ts | 424 ++++++++++++++++++ 1 file changed, 424 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/input_detection/template_reference_visitor.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/template_reference_visitor.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/template_reference_visitor.ts new file mode 100644 index 000000000000..80161bb5b9ea --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/template_reference_visitor.ts @@ -0,0 +1,424 @@ +/** + * @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 ts from 'typescript'; + +import { + AST, + BindingType, + ImplicitReceiver, + LiteralMap, + ParsedEventType, + PropertyRead, + PropertyWrite, + RecursiveAstVisitor, + ThisReceiver, + TmplAstBoundAttribute, + TmplAstBoundEvent, + TmplAstBoundText, + TmplAstDeferredBlock, + TmplAstForLoopBlock, + TmplAstIfBlockBranch, + TmplAstNode, + TmplAstRecursiveVisitor, + TmplAstSwitchBlock, + TmplAstSwitchBlockCase, + TmplAstTemplate, + tmplAstVisitAll, +} from '../../../../../../compiler'; +import { + SymbolKind, + TemplateTypeChecker, +} from '../../../../../../compiler-cli/src/ngtsc/typecheck/api'; +import {KnownInputs} from './known_inputs'; +import {attemptRetrieveInputFromSymbol} from './nodes_to_input'; +import {MigrationHost} from '../migration_host'; +import {InputDescriptor} from '../utils/input_id'; +import {InputIncompatibilityReason} from './incompatibility'; +import {BoundAttribute, BoundEvent} from '../../../../../../compiler/src/render3/r3_ast'; + +/** + * Interface describing a reference to an input from within + * an Angular template, or host binding "template expression". + */ +export interface TmplInputExpressionReference { + target: ts.Node; + targetInput: InputDescriptor; + read: PropertyRead; + context: ExprContext; + isInsideNarrowingExpression: boolean; + isObjectShorthandExpression: boolean; +} + +/** + * AST visitor that iterates through a template and finds all + * input references. + * + * This resolution is important to be able to migrate references to inputs + * that will be migrated to signal inputs. + */ +export class TemplateReferenceVisitor extends TmplAstRecursiveVisitor { + result: TmplInputExpressionReference[] = []; + + /** + * Whether we are currently descending into HTML AST nodes + * where bound attributes should be considered "narrowed". + * + * TODO: Remove with: https://github.com/angular/angular/pull/55456. + */ + private isAttributeInsideNarrowingExpression = false; + private expressionVisitor: TemplateExpressionReferenceVisitor; + + constructor( + host: MigrationHost, + typeChecker: ts.TypeChecker, + templateTypeChecker: TemplateTypeChecker, + componentClass: ts.ClassDeclaration, + knownInputs: KnownInputs, + ) { + super(); + this.expressionVisitor = new TemplateExpressionReferenceVisitor( + host, + typeChecker, + templateTypeChecker, + componentClass, + knownInputs, + this.result, + ); + } + + override visitTemplate(template: TmplAstTemplate): void { + // Note: We assume all bound expressions for templates may be subject + // to TCB narrowing. This is relevant for now until we support narrowing + // of signal calls in templates. + // TODO: Remove with: https://github.com/angular/angular/pull/55456. + this.isAttributeInsideNarrowingExpression = true; + + tmplAstVisitAll(this, template.attributes); + tmplAstVisitAll(this, template.templateAttrs); + + // If we are dealing with a microsyntax template, do not check + // inputs and outputs as those are already passed to the children. + // Template attributes may contain relevant expressions though. + if (template.tagName === 'ng-template') { + tmplAstVisitAll(this, template.inputs); + tmplAstVisitAll(this, template.outputs); + } + + this.isAttributeInsideNarrowingExpression = false; + + tmplAstVisitAll(this, template.children); + tmplAstVisitAll(this, template.references); + tmplAstVisitAll(this, template.variables); + } + + override visitIfBlockBranch(block: TmplAstIfBlockBranch): void { + if (block.expression) { + this.expressionVisitor.checkTemplateExpression( + block, + /* isInsideNarrowingExpression */ true, + block.expression, + ); + } + super.visitIfBlockBranch(block); + } + + override visitForLoopBlock(block: TmplAstForLoopBlock): void { + this.expressionVisitor.checkTemplateExpression( + block, + /* isInsideNarrowingExpression */ false, + block.expression, + ); + this.expressionVisitor.checkTemplateExpression( + block, + /* isInsideNarrowingExpression */ false, + block.trackBy, + ); + super.visitForLoopBlock(block); + } + + override visitSwitchBlock(block: TmplAstSwitchBlock): void { + this.expressionVisitor.checkTemplateExpression( + block, + /* isInsideNarrowingExpression */ true, + block.expression, + ); + super.visitSwitchBlock(block); + } + + override visitSwitchBlockCase(block: TmplAstSwitchBlockCase): void { + if (block.expression) { + this.expressionVisitor.checkTemplateExpression( + block, + /* isInsideNarrowingExpression */ true, + block.expression, + ); + } + super.visitSwitchBlockCase(block); + } + + override visitDeferredBlock(deferred: TmplAstDeferredBlock): void { + if (deferred.triggers.when) { + this.expressionVisitor.checkTemplateExpression( + deferred, + /* isInsideNarrowingExpression */ false, + deferred.triggers.when.value, + ); + } + if (deferred.prefetchTriggers.when) { + this.expressionVisitor.checkTemplateExpression( + deferred, + /* isInsideNarrowingExpression */ false, + deferred.prefetchTriggers.when.value, + ); + } + super.visitDeferredBlock(deferred); + } + + override visitBoundText(text: TmplAstBoundText): void { + this.expressionVisitor.checkTemplateExpression( + text, + /* isInsideNarrowingExpression */ false, + text.value, + ); + } + + override visitBoundEvent(attribute: TmplAstBoundEvent): void { + this.expressionVisitor.checkTemplateExpression( + attribute, + /* isInsideNarrowingExpression */ false, + attribute.handler, + ); + } + + override visitBoundAttribute(attribute: TmplAstBoundAttribute): void { + this.expressionVisitor.checkTemplateExpression( + attribute, + /* isInsideNarrowingExpression */ this.isAttributeInsideNarrowingExpression, + attribute.value, + ); + } +} + +/** + * Expression AST visitor that checks whether a given expression references + * a known `@Input()`. + * + * This resolution is important to be able to migrate references to inputs + * that will be migrated to signal inputs. + */ +export class TemplateExpressionReferenceVisitor extends RecursiveAstVisitor { + private activeTmplAstNode: ExprContext | null = null; + private isInsideNarrowingExpression = false; + private isInsideObjectShorthandExpression = false; + + constructor( + private host: MigrationHost, + private typeChecker: ts.TypeChecker, + private templateTypeChecker: TemplateTypeChecker | null, + private componentClass: ts.ClassDeclaration, + private knownInputs: KnownInputs, + private result: TmplInputExpressionReference[], + ) { + super(); + } + + /** Checks the given AST expression. */ + checkTemplateExpression( + activeNode: ExprContext, + isInsideNarrowingExpression: boolean, + expressionNode: AST, + ) { + this.activeTmplAstNode = activeNode; + this.isInsideNarrowingExpression = isInsideNarrowingExpression; + + expressionNode.visit(this); + } + + // Keep track when we are inside an object shorthand expression. This is + // necessary as we need to expand the shorthand to invoke a potential new signal. + // E.g. `{bla}` may be transformed to `{bla: bla()}`. + override visitLiteralMap(ast: LiteralMap, context: any) { + for (const [idx, key] of ast.keys.entries()) { + this.isInsideObjectShorthandExpression = !!key.isShorthandInitialized; + (ast.values[idx] as AST).visit(this, context); + this.isInsideObjectShorthandExpression = false; + } + super.visitLiteralMap(ast, context); + } + + // TODO: Consider safe property reads/writes. + + override visitPropertyRead(ast: PropertyRead) { + this._inspectPropertyAccess(ast); + super.visitPropertyRead(ast, null); + } + override visitPropertyWrite(ast: PropertyWrite) { + this._inspectPropertyAccess(ast); + super.visitPropertyWrite(ast, null); + } + + /** + * Inspects the property access and attempts to resolve whether they access + * a known decorator input. If so, the result is captured. + */ + private _inspectPropertyAccess(ast: PropertyRead | PropertyWrite) { + const matchingInputId = + this._checkAccessViaTemplateTypeCheckBlock(ast) ?? + this._checkAccessViaOwningComponentClassType(ast); + + // If the input matched and is a write, mark it as incompatible. + // An input may also be considered written if it's part of a two-way binding syntax. + if ( + matchingInputId !== null && + (ast instanceof PropertyWrite || + (this.activeTmplAstNode && isTwoWayBindingNode(this.activeTmplAstNode))) + ) { + this.knownInputs.markInputAsIncompatible(matchingInputId, { + context: null, + reason: InputIncompatibilityReason.WriteAssignment, + }); + } + } + + /** + * Checks whether the node refers to an input using the TCB information. + * Type check block may not exist for e.g. test components, so this can return `null`. + */ + private _checkAccessViaTemplateTypeCheckBlock( + ast: PropertyRead | PropertyWrite, + ): InputDescriptor | null { + // There might be no template type checker. E.g. if we check host bindings. + if (this.templateTypeChecker === null) { + return null; + } + + const symbol = this.templateTypeChecker.getSymbolOfNode(ast, this.componentClass); + if (symbol?.kind !== SymbolKind.Expression || symbol.tsSymbol === null) { + return null; + } + + // Dangerous: Type checking symbol retrieval is a totally different `ts.Program`, + // than the one where we analyzed `knownInputs`. + // --> Find the input via its input id. + const targetInput = attemptRetrieveInputFromSymbol( + this.host, + symbol.tsSymbol, + this.knownInputs, + ); + + if (targetInput === null) { + return null; + } + + this.result.push({ + target: targetInput.descriptor.node, + targetInput: targetInput.descriptor, + read: ast, + context: this.activeTmplAstNode!, + isInsideNarrowingExpression: this.isInsideNarrowingExpression, + isObjectShorthandExpression: this.isInsideObjectShorthandExpression, + }); + + return targetInput.descriptor; + } + + /** + * Simple resolution checking whether the given AST refers to a known input. + * This is a fallback for when there is no type checking information (e.g. in host bindings). + * + * It attempts to resolve references by traversing accesses of the "component class" type. + * e.g. `this.bla` is resolved via `CompType#bla` and further. + */ + private _checkAccessViaOwningComponentClassType( + ast: PropertyRead | PropertyWrite, + ): InputDescriptor | null { + // We might check host bindings, which can never point to template variables or local refs. + const target = + this.templateTypeChecker === null + ? null + : this.templateTypeChecker.getExpressionTarget(ast, this.componentClass); + + // Skip checking if: + // - the reference resolves to a template variable or local ref. No way to resolve without TCB. + // - the owning component does not have a name (should not happen technically). + if (target !== null || this.componentClass.name === undefined) { + return null; + } + + const property = traverseReceiverAndLookupSymbol( + ast, + this.componentClass as ts.ClassDeclaration & {name: ts.Identifier}, + this.typeChecker, + ); + if (property === null) { + return null; + } + + const matchingTarget = attemptRetrieveInputFromSymbol(this.host, property, this.knownInputs); + if (matchingTarget === null) { + return null; + } + + this.result.push({ + target: matchingTarget.descriptor.node, + targetInput: matchingTarget.descriptor, + read: ast, + context: this.activeTmplAstNode!, + isInsideNarrowingExpression: this.isInsideNarrowingExpression, + isObjectShorthandExpression: this.isInsideObjectShorthandExpression, + }); + return matchingTarget.descriptor; + } +} + +/** + * Emulates an access to a given field using the TypeScript `ts.Type` + * of the given class. The resolved symbol of the access is returned. + */ +function traverseReceiverAndLookupSymbol( + readOrWrite: PropertyRead | PropertyWrite, + componentClass: ts.ClassDeclaration & {name: ts.Identifier}, + checker: ts.TypeChecker, +) { + const path: string[] = [readOrWrite.name]; + let node = readOrWrite; + while (node.receiver instanceof PropertyRead || node.receiver instanceof PropertyWrite) { + node = node.receiver; + path.unshift(node.name); + } + + if (!(node.receiver instanceof ImplicitReceiver || node.receiver instanceof ThisReceiver)) { + return null; + } + + let type = checker.getTypeAtLocation(componentClass.name); + let symbol: ts.Symbol | null = null; + + for (const propName of path) { + // Note: Always assume `NonNullable` for the path, when using the non-TCB lookups. This + // is necessary to support e.g. ternary narrowing in host bindings. The assumption is that + // an input is only accessed if its receivers are all non-nullable anyway. + const propSymbol = type.getNonNullableType().getProperty(propName); + if (propSymbol === undefined) { + return null; + } + symbol = propSymbol; + type = checker.getTypeOfSymbol(propSymbol); + } + + return symbol; +} + +/** Whether the given node refers to a two-way binding AST node. */ +function isTwoWayBindingNode(node: unknown): boolean { + return ( + (node instanceof BoundAttribute && node.type === BindingType.TwoWay) || + (node instanceof BoundEvent && node.type === ParsedEventType.TwoWay) + ); +} From ed4f43cf640029978c4b1f2821bf9ee89f9ab3ea Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:18:44 +0000 Subject: [PATCH 067/143] refactor(migrations): logic for detecting and capturing references to inputs (#57082) This commit adds the logic for detecting and capturing references to Angular `@Input`s. Those references may be migrated to unwrap signals as part of the migration; or are refactored into temporary variables. This commit detects and captures: - host bindings references - template references - TypeScript references PR Close #57082 --- .../passes/2_find_source_file_references.ts | 93 +++++++++ .../references/identify_host_references.ts | 177 ++++++++++++++++++ .../identify_template_references.ts | 69 +++++++ .../references/identify_ts_references.ts | 95 ++++++++++ .../src/utils/input_reference.ts | 125 +++++++++++++ .../src/utils/traverse_access.ts | 33 ++++ .../src/utils/unwrap_parent.ts | 22 +++ .../src/utils/write_operators.ts | 30 +++ 8 files changed, 644 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/2_find_source_file_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/references/identify_host_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/references/identify_template_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/references/identify_ts_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/input_reference.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/traverse_access.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/unwrap_parent.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/write_operators.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/2_find_source_file_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/2_find_source_file_references.ts new file mode 100644 index 000000000000..d0f60f6dfc95 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/2_find_source_file_references.ts @@ -0,0 +1,93 @@ +/** + * @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 ts from 'typescript'; +import {ReflectionHost} from '../../../../../../compiler-cli/src/ngtsc/reflection'; +import {TemplateTypeChecker} from '../../../../../../compiler-cli/src/ngtsc/typecheck/api'; +import {isInputContainerNode} from '../input_detection/input_node'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {MigrationHost} from '../migration_host'; +import {DebugElementComponentInstance} from '../pattern_advisors/debug_element_component_instance'; +import {MigrationResult} from '../result'; +import {identifyHostBindingReferences} from './references/identify_host_references'; +import {identifyTemplateReferences} from './references/identify_template_references'; +import {identifyPotentialTypeScriptReference} from './references/identify_ts_references'; +import {PartialDirectiveTypeInCatalystTests} from '../pattern_advisors/partial_directive_type'; +import {InputReferenceKind} from '../utils/input_reference'; + +/** + * Phase where we iterate through all source file references and + * detect references to inputs. + * + * Such references will need to be migrated to unwrap signals, + * given that the property is no longer a raw container of + * a value, but rather an `InputSignal`. + * + * This phase detects references in all types of locations: + * - TS source files + * - Angular templates (inline or external) + * - Host binding expressions. + */ +export function pass2_IdentifySourceFileReferences( + sf: ts.SourceFile, + host: MigrationHost, + checker: ts.TypeChecker, + reflector: ReflectionHost, + templateTypeChecker: TemplateTypeChecker, + knownInputs: KnownInputs, + result: MigrationResult, +) { + const debugElComponentInstanceTracker = new DebugElementComponentInstance(checker); + const partialDirectiveCatalystTracker = new PartialDirectiveTypeInCatalystTests( + checker, + knownInputs, + ); + + const visitor = (node: ts.Node) => { + if (ts.isClassDeclaration(node)) { + identifyTemplateReferences(node, host, checker, templateTypeChecker, result, knownInputs); + identifyHostBindingReferences(node, host, checker, reflector, result, knownInputs); + } + + // find references, but do not capture: + // (1) input declarations. + // (2) binding element declarations. + if ( + ts.isIdentifier(node) && + !( + (isInputContainerNode(node.parent) && node.parent.name === node) || + ts.isBindingElement(node.parent) + ) + ) { + identifyPotentialTypeScriptReference(node, host, checker, knownInputs, result, { + debugElComponentInstanceTracker, + }); + } + + // Detect `Partial` references. + // Those are relevant to be tracked as they may be updated in Catalyst to + // unwrap signal inputs. Commonly people use `Partial` in Catalyst to type + // some "component initial values". + const partialDirectiveInCatalyst = partialDirectiveCatalystTracker.detect(node); + if (partialDirectiveInCatalyst !== null) { + result.references.push({ + kind: InputReferenceKind.TsInputClassTypeReference, + from: { + fileId: host.fileToId(partialDirectiveInCatalyst.referenceNode.getSourceFile()), + node: partialDirectiveInCatalyst.referenceNode, + }, + isPartialReference: true, + isPartOfCatalystFile: true, + target: partialDirectiveInCatalyst.targetClass, + }); + } + + ts.forEachChild(node, visitor); + }; + ts.forEachChild(sf, visitor); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_host_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_host_references.ts new file mode 100644 index 000000000000..955814afd774 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_host_references.ts @@ -0,0 +1,177 @@ +/** + * @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 ts from 'typescript'; +import {getAngularDecorators} from '../../../../../../../compiler-cli/src/ngtsc/annotations'; +import {unwrapExpression} from '../../../../../../../compiler-cli/src/ngtsc/annotations/common'; +import { + ReflectionHost, + reflectObjectLiteral, +} from '../../../../../../../compiler-cli/src/ngtsc/reflection'; +import { + AST, + ParseLocation, + ParseSourceSpan, + ParsedEvent, + ParsedProperty, + makeBindingParser, +} from '../../../../../../../compiler/public_api'; +import {KnownInputs} from '../../input_detection/known_inputs'; +import { + TemplateExpressionReferenceVisitor, + TmplInputExpressionReference, +} from '../../input_detection/template_reference_visitor'; +import {MigrationHost} from '../../migration_host'; +import {MigrationResult} from '../../result'; +import {InputReferenceKind} from '../../utils/input_reference'; + +/** + * Checks host bindings of the given class and tracks all + * references to inputs within bindings. + */ +export function identifyHostBindingReferences( + node: ts.ClassDeclaration, + host: MigrationHost, + checker: ts.TypeChecker, + reflector: ReflectionHost, + result: MigrationResult, + knownDecoratorInputs: KnownInputs, +) { + if (node.name === undefined) { + return; + } + const decorators = reflector.getDecoratorsOfDeclaration(node); + if (decorators === null) { + return; + } + + const angularDecorators = getAngularDecorators( + decorators, + ['Directive', 'Component'], + host.isMigratingCore, + ); + if (angularDecorators.length === 0) { + return; + } + // Assume only one Angular decorator per class. + const ngDecorator = angularDecorators[0]; + if (ngDecorator.args?.length !== 1) { + return; + } + const metadataNode = unwrapExpression(ngDecorator.args[0]); + if (!ts.isObjectLiteralExpression(metadataNode)) { + return; + } + const metadata = reflectObjectLiteral(metadataNode); + if (!metadata.has('host')) { + return; + } + let hostField: ts.Node | undefined = unwrapExpression(metadata.get('host')!); + + // Special-case in case host bindings are shared via a variable. + // e.g. Material button shares host bindings as a constant in the same target. + if (ts.isIdentifier(hostField)) { + let symbol = checker.getSymbolAtLocation(hostField); + // Plain identifier references can point to alias symbols (e.g. imports). + if (symbol !== undefined && symbol.flags & ts.SymbolFlags.Alias) { + symbol = checker.getAliasedSymbol(symbol); + } + if ( + symbol !== undefined && + symbol.valueDeclaration !== undefined && + ts.isVariableDeclaration(symbol.valueDeclaration) + ) { + hostField = symbol?.valueDeclaration.initializer; + } + } + + if (hostField === undefined || !ts.isObjectLiteralExpression(hostField)) { + return; + } + const hostMap = reflectObjectLiteral(hostField); + const expressionResult: TmplInputExpressionReference[] = []; + const expressionVisitor = new TemplateExpressionReferenceVisitor( + host, + checker, + null, + node, + knownDecoratorInputs, + expressionResult, + ); + + for (const [rawName, expression] of hostMap.entries()) { + if (!ts.isStringLiteralLike(expression)) { + continue; + } + + const isEventBinding = rawName.startsWith('('); + const isPropertyBinding = rawName.startsWith('['); + + // Only migrate property or event bindings. + if (!isPropertyBinding && !isEventBinding) { + continue; + } + + const parser = makeBindingParser(); + const sourceSpan: ParseSourceSpan = new ParseSourceSpan( + // Fake source span to keep parsing offsets zero-based. + // We then later combine these with the expression TS node offsets. + new ParseLocation({content: '', url: ''}, 0, 0, 0), + new ParseLocation({content: '', url: ''}, 0, 0, 0), + ); + const name = rawName.substring(1, rawName.length - 1); + + let parsed: AST | undefined = undefined; + if (isEventBinding) { + const result: ParsedEvent[] = []; + parser.parseEvent( + name.substring(1, name.length - 1), + expression.text, + false, + sourceSpan, + sourceSpan, + [], + result, + sourceSpan, + ); + parsed = result[0].handler; + } else { + const result: ParsedProperty[] = []; + parser.parsePropertyBinding( + name, + expression.text, + true, + /* isTwoWayBinding */ false, + sourceSpan, + 0, + sourceSpan, + [], + result, + sourceSpan, + ); + parsed = result[0].expression; + } + + if (parsed != null) { + expressionVisitor.checkTemplateExpression(expression, false, parsed); + } + } + + for (const ref of expressionResult) { + result.references.push({ + kind: InputReferenceKind.InHostBinding, + from: { + read: ref.read, + isObjectShorthandExpression: ref.isObjectShorthandExpression, + fileId: host.fileToId(ref.context.getSourceFile()), + hostPropertyNode: ref.context, + }, + target: ref.targetInput, + }); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_template_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_template_references.ts new file mode 100644 index 000000000000..7bdfbb4d4535 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_template_references.ts @@ -0,0 +1,69 @@ +/** + * @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 ts from 'typescript'; +import {InputIncompatibilityReason} from '../../input_detection/incompatibility'; +import {KnownInputs} from '../../input_detection/known_inputs'; +import {MigrationHost} from '../../migration_host'; +import {MigrationResult} from '../../result'; +import {InputReferenceKind} from '../../utils/input_reference'; +import {TemplateTypeChecker} from '../../../../../../../compiler-cli/src/ngtsc/typecheck/api'; +import {TemplateReferenceVisitor} from '../../input_detection/template_reference_visitor'; + +/** + * Checks whether the given class has an Angular template, and resolves + * all of the references to inputs. + */ +export function identifyTemplateReferences( + node: ts.ClassDeclaration, + host: MigrationHost, + checker: ts.TypeChecker, + templateTypeChecker: TemplateTypeChecker, + result: MigrationResult, + knownInputs: KnownInputs, +) { + const template = templateTypeChecker.getTemplate(node); + if (template !== null) { + const visitor = new TemplateReferenceVisitor( + host, + checker, + templateTypeChecker, + node, + knownInputs, + ); + template.forEach((node) => node.visit(visitor)); + + for (const res of visitor.result) { + const templateFilePath = res.context.sourceSpan.start.file.url; + + result.references.push({ + kind: InputReferenceKind.InTemplate, + from: { + read: res.read, + node: res.context, + isObjectShorthandExpression: res.isObjectShorthandExpression, + originatingTsFileId: host.fileToId(node.getSourceFile()), + templateFileId: host.fileToId(templateFilePath), + }, + target: res.targetInput, + }); + + // TODO: Remove this when we support signal narrowing in templates. + // https://github.com/angular/angular/pull/55456. + if ( + process.env['MIGRATE_NARROWED_NARROWED_IN_TEMPLATES'] !== '1' && + res.isInsideNarrowingExpression + ) { + knownInputs.markInputAsIncompatible(res.targetInput, { + reason: InputIncompatibilityReason.NarrowedInTemplateButNotSupportedYetTODO, + context: null, + }); + } + } + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_ts_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_ts_references.ts new file mode 100644 index 000000000000..da34c34cdc3a --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/references/identify_ts_references.ts @@ -0,0 +1,95 @@ +/** + * @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 ts from 'typescript'; +import {InputIncompatibilityReason} from '../../input_detection/incompatibility'; +import {KnownInputs} from '../../input_detection/known_inputs'; +import {attemptRetrieveInputFromSymbol} from '../../input_detection/nodes_to_input'; +import {MigrationHost} from '../../migration_host'; +import {DebugElementComponentInstance} from '../../pattern_advisors/debug_element_component_instance'; +import {MigrationResult} from '../../result'; +import {InputReferenceKind} from '../../utils/input_reference'; +import {traverseAccess} from '../../utils/traverse_access'; +import {unwrapParent} from '../../utils/unwrap_parent'; +import {writeBinaryOperators} from '../../utils/write_operators'; + +/** + * Checks whether given TypeScript reference refers to an Angular input, and captures + * the reference if possible. + */ +export function identifyPotentialTypeScriptReference( + node: ts.Identifier, + host: MigrationHost, + checker: ts.TypeChecker, + knownInputs: KnownInputs, + result: MigrationResult, + advisors: { + debugElComponentInstanceTracker: DebugElementComponentInstance; + }, +) { + let target = checker.getSymbolAtLocation(node); + + // Resolve binding elements to their declaration symbol. + // Commonly inputs are accessed via object expansion. e.g. `const {input} = this;`. + if (target?.declarations?.[0] && ts.isBindingElement(target?.declarations[0])) { + const bindingElement = target.declarations[0]; + const bindingParent = bindingElement.parent; + const bindingType = checker.getTypeAtLocation(bindingParent); + const bindingName = bindingElement.propertyName ?? bindingElement.name; + + if (ts.isIdentifier(bindingName) && bindingType.getProperty(bindingName.text)) { + target = bindingType.getProperty(bindingName.text); + } + } + + noTargetSymbolCheck: if (target === undefined) { + if (ts.isPropertyAccessExpression(node.parent) && node.parent.name === node) { + const propAccessSymbol = checker.getSymbolAtLocation(node.parent.expression); + if ( + propAccessSymbol !== undefined && + propAccessSymbol.valueDeclaration !== undefined && + ts.isVariableDeclaration(propAccessSymbol.valueDeclaration) && + propAccessSymbol.valueDeclaration.initializer !== undefined + ) { + target = advisors.debugElComponentInstanceTracker + .detect(propAccessSymbol.valueDeclaration.initializer) + ?.getProperty(node.text); + + // We found a target in the fallback path. Break out. + if (target !== undefined) { + break noTargetSymbolCheck; + } + } + } + return; + } + + let targetInput = attemptRetrieveInputFromSymbol(host, target, knownInputs); + if (targetInput === null) { + return; + } + + // track accesses from source files to inputs. + result.references.push({ + kind: InputReferenceKind.TsInputReference, + from: {fileId: host.fileToId(node.getSourceFile()), node}, + target: targetInput?.descriptor, + }); + + const accessParent = unwrapParent(traverseAccess(node).parent); + + if ( + ts.isBinaryExpression(accessParent) && + writeBinaryOperators.includes(accessParent.operatorToken.kind) + ) { + knownInputs.markInputAsIncompatible(targetInput.descriptor, { + context: accessParent, + reason: InputIncompatibilityReason.WriteAssignment, + }); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/input_reference.ts b/packages/core/schematics/migrations/signal-migration/src/utils/input_reference.ts new file mode 100644 index 000000000000..9eeffd4085a5 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/input_reference.ts @@ -0,0 +1,125 @@ +/** + * @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 ts from 'typescript'; +import {InputDescriptor} from './input_id'; +import {PropertyRead, TmplAstNode} from '@angular/compiler'; + +/** Possible types of references to input detected. */ +export enum InputReferenceKind { + InTemplate, + InHostBinding, + TsInputReference, + TsInputClassTypeReference, +} + +/** Interface describing a template reference to an input. */ +export interface TemplateInputReference { + kind: InputReferenceKind.InTemplate; + /** From where the reference is made. */ + from: { + /** ID of the template file containing the reference. */ + templateFileId: string; + /** ID of the TypeScript file that references, or contains the template. */ + originatingTsFileId: string; + /** HTML AST node that contains the reference. */ + node: TmplAstNode; + /** Expression AST node that represents the reference. */ + read: PropertyRead; + /** Whether the reference is part of an object shorthand expression. */ + isObjectShorthandExpression: boolean; + }; + /** Target input addressed by the reference. */ + target: InputDescriptor; +} + +/** Interface describing a host binding reference to an input. */ +export interface HostBindingInputReference { + kind: InputReferenceKind.InHostBinding; + /** From where the reference is made. */ + from: { + /** ID of the file that contains the host binding reference. */ + fileId: string; + /** TypeScript property node containing the reference. */ + hostPropertyNode: ts.Node; + /** Expression AST node that represents the reference. */ + read: PropertyRead; + /** Whether the reference is part of an object shorthand expression. */ + isObjectShorthandExpression: boolean; + }; + /** Target input addressed by the reference. */ + target: InputDescriptor; +} + +/** Interface describing a TypeScript reference to an input. */ +export interface TsInputReference { + kind: InputReferenceKind.TsInputReference; + /** From where the reference is made. */ + from: { + /** ID of the file that contains the TypeScript reference. */ + fileId: string; + /** TypeScript AST node representing the reference. */ + node: ts.Identifier; + }; + /** Target input addressed by the reference. */ + target: InputDescriptor; +} + +/** + * Interface describing a TypeScript `ts.Type` reference to a + * class containing inputs. + */ +export interface TsInputClassTypeReference { + kind: InputReferenceKind.TsInputClassTypeReference; + /** From where the reference is made. */ + from: { + /** ID of the file that contains the TypeScript reference. */ + fileId: string; + /** TypeScript AST node representing the reference. */ + node: ts.TypeReferenceNode; + }; + /** Whether the reference is using `Partial`. */ + isPartialReference: boolean; + /** Whether the reference is part of a file using Catalyst. */ + isPartOfCatalystFile: boolean; + /** Target class that contains Angular `@Input`s. */ + target: ts.ClassDeclaration; +} + +/** Possible structures representing input references. */ +export type InputReference = + | TsInputReference + | TemplateInputReference + | HostBindingInputReference + | TsInputClassTypeReference; + +/** Whether the given reference is a TypeScript reference. */ +export function isTsInputReference(ref: InputReference): ref is TsInputReference { + return (ref as Partial).kind === InputReferenceKind.TsInputReference; +} + +/** Whether the given reference is a template reference. */ +export function isTemplateInputReference(ref: InputReference): ref is TemplateInputReference { + return (ref as Partial).kind === InputReferenceKind.InTemplate; +} + +/** Whether the given reference is a host binding reference. */ +export function isHostBindingInputReference(ref: InputReference): ref is HostBindingInputReference { + return (ref as Partial).kind === InputReferenceKind.InHostBinding; +} + +/** + * Whether the given reference is a TypeScript `ts.Type` reference to a class + * containing inputs. + */ +export function isTsInputClassTypeReference(ref: InputReference): ref is TsInputClassTypeReference { + return ( + (ref as Partial).kind === + InputReferenceKind.TsInputClassTypeReference + ); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/traverse_access.ts b/packages/core/schematics/migrations/signal-migration/src/utils/traverse_access.ts new file mode 100644 index 000000000000..4914e0bbcb3e --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/traverse_access.ts @@ -0,0 +1,33 @@ +/** + * @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 ts from 'typescript'; + +/** + * Expands the given reference to its containing expression, capturing + * the full context. + * + * E.g. `traverseAccess(ref<`bla`>)` may return `this.bla` + * or `traverseAccess(ref<`bla`>)` may return `this.someObj.a.b.c.bla`. + * + * This helper is useful as we will replace the full access with a temporary + * variable for narrowing. Replacing just the identifier is wrong. + */ +export function traverseAccess( + access: ts.Identifier, +): ts.Identifier | ts.PropertyAccessExpression | ts.ElementAccessExpression { + if (ts.isPropertyAccessExpression(access.parent) && access.parent.name === access) { + return access.parent; + } else if ( + ts.isElementAccessExpression(access.parent) && + access.parent.argumentExpression === access + ) { + return access.parent; + } + return access; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/unwrap_parent.ts b/packages/core/schematics/migrations/signal-migration/src/utils/unwrap_parent.ts new file mode 100644 index 000000000000..77ffed7a1658 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/unwrap_parent.ts @@ -0,0 +1,22 @@ +/** + * @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 ts from 'typescript'; + +/** + * Unwraps the parent of the given node, if it's a + * parenthesized expression or `as` expression. + */ +export function unwrapParent(node: ts.Node): ts.Node { + if (ts.isParenthesizedExpression(node.parent)) { + return unwrapParent(node.parent); + } else if (ts.isAsExpression(node.parent)) { + return unwrapParent(node.parent); + } + return node; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/write_operators.ts b/packages/core/schematics/migrations/signal-migration/src/utils/write_operators.ts new file mode 100644 index 000000000000..7b26f35d6e65 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/write_operators.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import ts from 'typescript'; + +/** + * List of binary operators that indicate a write operation. + * + * Useful for figuring out whether an expression assigns to + * something or not. + */ +export const writeBinaryOperators: ts.BinaryOperator[] = [ + ts.SyntaxKind.EqualsToken, + ts.SyntaxKind.BarBarEqualsToken, + ts.SyntaxKind.BarEqualsToken, + ts.SyntaxKind.AmpersandEqualsToken, + ts.SyntaxKind.AmpersandAmpersandEqualsToken, + ts.SyntaxKind.SlashEqualsToken, + ts.SyntaxKind.MinusEqualsToken, + ts.SyntaxKind.PlusEqualsToken, + ts.SyntaxKind.CaretEqualsToken, + ts.SyntaxKind.PercentEqualsToken, + ts.SyntaxKind.AsteriskEqualsToken, + ts.SyntaxKind.ExclamationEqualsToken, +]; From 466b647917c4bcf8311d9e48e1d21fee7d3e49b3 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:27:35 +0000 Subject: [PATCH 068/143] refactor(migrations): check for incompatible input patterns and inheritance (#57082) Adds logic to the signal input migration for checking incompatible patterns and inheritance. PR Close #57082 --- .../src/input_detection/incompatibility.ts | 2 +- .../passes/3_check_incompatible_patterns.ts | 124 +++++++++++++ .../src/passes/4_check_inheritance.ts | 174 ++++++++++++++++++ .../src/utils/heritage_types.ts | 27 +++ .../src/utils/inheritance_graph.ts | 143 ++++++++++++++ .../src/utils/inheritance_sort.ts | 54 ++++++ 6 files changed, 523 insertions(+), 1 deletion(-) create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/3_check_incompatible_patterns.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/4_check_inheritance.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/heritage_types.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/inheritance_graph.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/inheritance_sort.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts b/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts index 9cdec9ac7683..cbdae911f232 100644 --- a/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts +++ b/packages/core/schematics/migrations/signal-migration/src/input_detection/incompatibility.ts @@ -13,7 +13,7 @@ export enum InputIncompatibilityReason { Accessor, WriteAssignment, OverriddenByDerivedClass, - RedeclaredViaDerivedClassDecorator, + RedeclaredViaDerivedClassInputsArray, TypeConflictWithBaseClass, ParentIsIncompatible, SpyOnThatOverwritesField, diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/3_check_incompatible_patterns.ts b/packages/core/schematics/migrations/signal-migration/src/passes/3_check_incompatible_patterns.ts new file mode 100644 index 000000000000..3d4ac2cb829a --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/3_check_incompatible_patterns.ts @@ -0,0 +1,124 @@ +/** + * @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 assert from 'assert'; +import ts from 'typescript'; +import {unwrapExpression} from '../../../../../../compiler-cli/src/ngtsc/annotations/common'; +import {ClassIncompatibilityReason} from '../input_detection/incompatibility'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {getMemberName} from '../utils/class_member_names'; +import {InheritanceGraph} from '../utils/inheritance_graph'; +import {SpyOnInputPattern} from '../pattern_advisors/spy_on_pattern'; +import {MigrationHost} from '../migration_host'; + +/** + * Phase where problematic patterns are detected and advise + * the migration to skip certain inputs. + * + * For example, detects classes that are instantiated manually. Those + * cannot be migrated as `input()` requires an injection context. + * + * In addition, spying onto an input may be problematic- so we skip migrating + * such. + */ +export function pass3__checkIncompatiblePatterns( + host: MigrationHost, + files: readonly ts.SourceFile[], + inheritanceGraph: InheritanceGraph, + checker: ts.TypeChecker, + knownInputs: KnownInputs, +) { + const inputClassSymbolsToClass = new Map(); + + for (const input of knownInputs.getAllInputContainingClasses()) { + const classSymbol = checker.getTypeAtLocation(input).symbol; + + assert(classSymbol != null, 'Expected a symbol to exist for the container of input.'); + assert(classSymbol.valueDeclaration !== undefined, 'Expected declaration to exist for input.'); + assert( + ts.isClassDeclaration(classSymbol.valueDeclaration), + 'Expected declaration to be a class.', + ); + + // track class symbol for derived class checks. + inputClassSymbolsToClass.set(classSymbol, classSymbol.valueDeclaration); + } + + const incompatibilityPatterns = [new SpyOnInputPattern(host, checker, knownInputs)]; + + let insidePropertyDeclaration: ts.PropertyDeclaration | null = null; + const visitor = (node: ts.Node) => { + // Check for manual class instantiations. + if (ts.isNewExpression(node) && ts.isIdentifier(unwrapExpression(node.expression))) { + let newTarget = checker.getSymbolAtLocation(unwrapExpression(node.expression)); + // Plain identifier references can point to alias symbols (e.g. imports). + if (newTarget !== undefined && newTarget.flags & ts.SymbolFlags.Alias) { + newTarget = checker.getAliasedSymbol(newTarget); + } + if (newTarget && inputClassSymbolsToClass.has(newTarget)) { + knownInputs.markDirectiveAsIncompatible( + inputClassSymbolsToClass.get(newTarget)!, + ClassIncompatibilityReason.ClassManuallyInstantiated, + ); + } + } + + // Detect possible problematic patterns. + incompatibilityPatterns.forEach((p) => p.detect(node)); + + // Check for problematic class references inside property declarations. + // These are likely problematic, causing type conflicts, if the containing + // class inherits a non-input member with the same name. + // Suddenly the derived class changes its signature, but the base class may not. + problematicReferencesCheck: if ( + insidePropertyDeclaration !== null && + ts.isIdentifier(node) && + insidePropertyDeclaration.parent.heritageClauses !== undefined + ) { + let newTarget = checker.getSymbolAtLocation(unwrapExpression(node)); + // Plain identifier references can point to alias symbols (e.g. imports). + if (newTarget !== undefined && newTarget.flags & ts.SymbolFlags.Alias) { + newTarget = checker.getAliasedSymbol(newTarget); + } + if (newTarget && inputClassSymbolsToClass.has(newTarget)) { + const memberName = getMemberName(insidePropertyDeclaration); + if (memberName === null) { + break problematicReferencesCheck; + } + const {derivedMembers, inherited} = inheritanceGraph.checkOverlappingMembers( + insidePropertyDeclaration.parent, + insidePropertyDeclaration, + memberName, + ); + + // Member is not inherited, or derived. + // Hence the reference is unproblematic and is expected to not + // cause any type conflicts. + if (derivedMembers.length === 0 && inherited === undefined) { + break problematicReferencesCheck; + } + + knownInputs.markDirectiveAsIncompatible( + inputClassSymbolsToClass.get(newTarget)!, + ClassIncompatibilityReason.ClassReferencedInPotentiallyBadLocation, + ); + } + } + + if (ts.isPropertyDeclaration(node)) { + const oldPropertyDeclaration = insidePropertyDeclaration; + insidePropertyDeclaration = node; + ts.forEachChild(node, visitor); + insidePropertyDeclaration = oldPropertyDeclaration; + } else { + ts.forEachChild(node, visitor); + } + }; + + files.forEach((f) => ts.forEachChild(f, visitor)); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/4_check_inheritance.ts b/packages/core/schematics/migrations/signal-migration/src/passes/4_check_inheritance.ts new file mode 100644 index 000000000000..f6a909b7baf1 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/4_check_inheritance.ts @@ -0,0 +1,174 @@ +/** + * @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 assert from 'assert'; +import {InputIncompatibilityReason} from '../input_detection/incompatibility'; +import {KnownInputInfo, KnownInputs} from '../input_detection/known_inputs'; +import {attemptRetrieveInputFromSymbol} from '../input_detection/nodes_to_input'; +import {MigrationHost} from '../migration_host'; +import {InheritanceGraph} from '../utils/inheritance_graph'; +import {topologicalSort} from '../utils/inheritance_sort'; +import {getMemberName} from '../utils/class_member_names'; +import ts from 'typescript'; +import {MetadataReader} from '../../../../../../compiler-cli/src/ngtsc/metadata'; +import {Reference} from '../../../../../../compiler-cli/src/ngtsc/imports'; +import {ClassDeclaration} from '../../../../../../compiler-cli/src/ngtsc/reflection'; +import {isInputContainerNode} from '../input_detection/input_node'; +import {getInputDescriptor} from '../utils/input_id'; + +/** + * Phase that propagates incompatibilities to derived classes or + * base classes. For example, consider: + * + * ``` + * class Base { + * bla = true; + * } + * + * class Derived extends Base { + * @Input() bla = false; + * } + * ``` + * + * Whenever we migrate `Derived`, the inheritance would fail + * and result in a build breakage because `Base#bla` is not an Angular input. + * + * The logic here detects such cases and marks `bla` as incompatible. If `Derived` + * would then have other derived classes as well, it would propagate the status. + */ +export function pass4__checkInheritanceOfInputs( + host: MigrationHost, + inheritanceGraph: InheritanceGraph, + metaRegistry: MetadataReader, + knownInputs: KnownInputs, +) { + // Sort topologically and iterate super classes first, so that we can trivially + // propagate incompatibility statuses (and other checks) without having to check + // in both directions (derived classes, or base classes). This simplifies the logic + // further down in this function significantly. + const topologicalSortedClasses = topologicalSort(inheritanceGraph) + .filter((t) => ts.isClassDeclaration(t) && knownInputs.isInputContainingClass(t)) + .reverse(); + + for (const inputClass of topologicalSortedClasses) { + // Note: Class parents of `inputClass` were already checked by + // the previous iterations (given the reverse topological sort)— + // hence it's safe to assume that incompatibility of parent classes will + // not change again, at a later time. + + assert(ts.isClassDeclaration(inputClass), 'Expected input graph node to be always a class.'); + const directiveInfo = knownInputs.getDirectiveInfoForClass(inputClass); + assert(directiveInfo !== undefined, 'Expected directive info to exist for input class.'); + + // Iterate through derived class chains and determine all inputs that are overridden + // via class metadata fields. e.g `@Component#inputs`. This is later used to mark a + // potential similar class input as incompatible— because those cannot be migrated. + const inputFieldNamesFromMetadataArray = new Set(); + for (const derivedClasses of inheritanceGraph.traceDerivedClasses(inputClass)) { + const derivedMeta = + ts.isClassDeclaration(derivedClasses) && derivedClasses.name !== undefined + ? metaRegistry.getDirectiveMetadata(new Reference(derivedClasses as ClassDeclaration)) + : null; + + if (derivedMeta !== null && derivedMeta.inputFieldNamesFromMetadataArray !== null) { + derivedMeta.inputFieldNamesFromMetadataArray.forEach((b) => + inputFieldNamesFromMetadataArray.add(b), + ); + } + } + + // Check inheritance of every input in the given "directive class". + inputCheck: for (const info of directiveInfo.inputFields.values()) { + const inputNode = info.descriptor.node; + const {derivedMembers, inherited} = inheritanceGraph.checkOverlappingMembers( + inputClass, + inputNode, + getMemberName(inputNode)!, + ); + + // If we discover a derived, input re-declared via class metadata, then it + // will cause conflicts as we cannot migrate it/ nor mark it as signal-based. + if (inputFieldNamesFromMetadataArray.has(info.metadata.classPropertyName)) { + knownInputs.markInputAsIncompatible(info.descriptor, { + context: null, + reason: InputIncompatibilityReason.RedeclaredViaDerivedClassInputsArray, + }); + } + + for (const derived of derivedMembers) { + const derivedInput = attemptRetrieveInputFromSymbol(host, derived, knownInputs); + if (derivedInput !== null) { + continue; + } + + // If we discover a derived, non-input member, then it will cause + // conflicts, and we mark the current input as incompatible. + knownInputs.markInputAsIncompatible(info.descriptor, { + context: derived.valueDeclaration ?? inputNode, + reason: InputIncompatibilityReason.OverriddenByDerivedClass, + }); + + continue inputCheck; + } + + // If there is no parent, we are done. Otherwise, check the parent + // to either inherit or check the incompatibility with the inheritance. + if (inherited === undefined) { + continue; + } + const {inheritedMemberInput} = analyzeInheritanceOfMember( + inherited, + inputNode, + host, + knownInputs, + ); + // Parent is not an input, and hence will conflict.. + if (inheritedMemberInput === undefined) { + knownInputs.markInputAsIncompatible(info.descriptor, { + context: inherited.valueDeclaration ?? inputNode, + reason: InputIncompatibilityReason.TypeConflictWithBaseClass, + }); + continue; + } + // Parent is incompatible, so this input also needs to be. + // It cannot be migrated. + if (inheritedMemberInput.isIncompatible()) { + knownInputs.markInputAsIncompatible(info.descriptor, { + context: inheritedMemberInput.descriptor.node, + reason: InputIncompatibilityReason.ParentIsIncompatible, + }); + continue; + } + } + } +} + +function analyzeInheritanceOfMember( + inheritedMember: ts.Symbol, + member: ts.ClassElement, + host: MigrationHost, + knownInputs: KnownInputs, +): {inheritedMemberInput: KnownInputInfo | undefined; memberInput: KnownInputInfo | undefined} { + // If the member itself is an input that is being migrated, we + // do not need to check, as overriding would be fine then— like before. + const memberInputDescr = isInputContainerNode(member) ? getInputDescriptor(host, member) : null; + const memberInput = memberInputDescr !== null ? knownInputs.get(memberInputDescr) : undefined; + + const inheritedMemberInputId = + inheritedMember.valueDeclaration !== undefined && + isInputContainerNode(inheritedMember.valueDeclaration) + ? getInputDescriptor(host, inheritedMember.valueDeclaration) + : null; + const inheritedMemberInput = + inheritedMemberInputId !== null ? knownInputs.get(inheritedMemberInputId) : undefined; + + return { + inheritedMemberInput, + memberInput, + }; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/heritage_types.ts b/packages/core/schematics/migrations/signal-migration/src/utils/heritage_types.ts new file mode 100644 index 000000000000..505811bdbf84 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/heritage_types.ts @@ -0,0 +1,27 @@ +/** + * @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 ts from 'typescript'; + +/** Gets all types that are inherited (implemented or extended). */ +export function getInheritedTypes( + node: ts.ClassLikeDeclaration | ts.InterfaceDeclaration, + checker: ts.TypeChecker, +): ts.Type[] { + if (node.heritageClauses === undefined) { + return []; + } + + const heritageTypes: ts.Type[] = []; + for (const heritageClause of node.heritageClauses) { + for (const typeNode of heritageClause.types) { + heritageTypes.push(checker.getTypeFromTypeNode(typeNode)); + } + } + return heritageTypes; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/inheritance_graph.ts b/packages/core/schematics/migrations/signal-migration/src/utils/inheritance_graph.ts new file mode 100644 index 000000000000..f46a904b1d08 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/inheritance_graph.ts @@ -0,0 +1,143 @@ +/** + * @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 ts from 'typescript'; +import {getInheritedTypes} from './heritage_types'; + +/** + * Node captured in the inheritance graph. + */ +export type GraphNode = ts.ClassDeclaration | ts.ClassExpression | ts.InterfaceDeclaration; + +/** + * Inheritance graph tracks edges between classes that describe + * heritage. + * + * This graph is helpful for efficient lookups whether e.g. an input + * is overridden, or inherited etc. This is helpful when detecting + * and propagating input incompatibility statuses. + */ +export class InheritanceGraph { + /** Maps nodes to their parent nodes. */ + classParents = new Map(); + /** Maps nodes to their derived nodes. */ + parentToChildren = new Map(); + + constructor(private checker: ts.TypeChecker) {} + + /** Registers a given class in the graph. */ + registerClass(clazz: GraphNode, parents: GraphNode[]) { + this.classParents.set(clazz, parents); + + for (const parent of parents) { + if (!this.parentToChildren.has(parent)) { + this.parentToChildren.set(parent, []); + } + this.parentToChildren.get(parent)!.push(clazz); + } + } + + /** + * Checks if the given class has overlapping members, either + * inherited or derived. + * + * @returns Symbols of the inherited or derived members, if they exist. + */ + checkOverlappingMembers( + clazz: GraphNode, + member: ts.ClassElement, + memberName: string, + ): { + inherited: ts.Symbol | undefined; + derivedMembers: ts.Symbol[]; + } { + const inheritedTypes = (this.classParents.get(clazz) ?? []).map((c) => + this.checker.getTypeAtLocation(c), + ); + const derivedLeafs = this._traceDerivedChainToLeafs(clazz).map((c) => + this.checker.getTypeAtLocation(c), + ); + + const inheritedMember = inheritedTypes + .map((t) => t.getProperty(memberName)) + .find((m) => m !== undefined); + const derivedMembers = derivedLeafs + .map((t) => t.getProperty(memberName)) + // Skip members that point back to the current class element. The derived type + // might look up back to our starting point— which we ignore. + .filter((m): m is ts.Symbol => m !== undefined && m.valueDeclaration !== member); + + return {inherited: inheritedMember, derivedMembers}; + } + + /** Gets all leaf derived classes that extend from the given class. */ + private _traceDerivedChainToLeafs(clazz: GraphNode): GraphNode[] { + const queue = [clazz]; + const leafs: GraphNode[] = []; + + while (queue.length) { + const node = queue.shift()!; + if (!this.parentToChildren.has(node)) { + if (node !== clazz) { + leafs.push(node); + } + continue; + } + queue.push(...this.parentToChildren.get(node)!); + } + return leafs; + } + + /** Gets all derived classes of the given node. */ + traceDerivedClasses(clazz: GraphNode): GraphNode[] { + const queue = [clazz]; + const derived: GraphNode[] = []; + while (queue.length) { + const node = queue.shift()!; + if (node !== clazz) { + derived.push(node); + } + if (!this.parentToChildren.has(node)) { + continue; + } + queue.push(...this.parentToChildren.get(node)!); + } + return derived; + } + + /** + * Populates the graph. + * + * NOTE: This is expensive and should be called with caution. + */ + expensivePopulate(files: readonly ts.SourceFile[]) { + for (const file of files) { + const visitor = (node: ts.Node) => { + if ( + (ts.isClassLike(node) || ts.isInterfaceDeclaration(node)) && + node.heritageClauses !== undefined + ) { + const heritageTypes = getInheritedTypes(node, this.checker); + const parents = heritageTypes + // Interfaces participate in the graph and are not "value declarations". + // Also, symbol may be undefined for unresolvable nodes. + .map((t) => (t.symbol ? t.symbol.declarations?.[0] : undefined)) + .filter( + (d): d is GraphNode => + d !== undefined && (ts.isClassLike(d) || ts.isInterfaceDeclaration(d)), + ); + + this.registerClass(node, parents); + } + ts.forEachChild(node, visitor); + }; + ts.forEachChild(file, visitor); + } + return this; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/inheritance_sort.ts b/packages/core/schematics/migrations/signal-migration/src/utils/inheritance_sort.ts new file mode 100644 index 000000000000..e98bbaa33ea1 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/inheritance_sort.ts @@ -0,0 +1,54 @@ +/** + * @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 {GraphNode, InheritanceGraph} from './inheritance_graph'; + +/** + * Sorts the inheritance graph topologically, so that + * classes without incoming edges are returned first. + * + * I.e. The returned list is sorted, so that dependencies + * of a given class are guaranteed to be included at + * an earlier position than the inspected class. + * + * This sort is helpful for detecting inheritance problems + * for the migration in simpler ways, without having to + * check in both directions (base classes, and derived classes). + */ +export function topologicalSort(graph: InheritanceGraph) { + // All classes without incoming edges. + const S = Array.from(graph.classParents.keys()).filter( + (n) => !graph.parentToChildren.has(n) || graph.parentToChildren.get(n)!.length === 0, + ); + const result: GraphNode[] = []; + const classParents = new Map(graph.classParents); + const parentToChildren = new Map(graph.parentToChildren); + + while (S.length) { + const node = S.pop()!; + result.push(node); + for (const next of classParents.get(node) ?? []) { + // Remove edge from "node -> next". + classParents.set( + node, + classParents.get(node)!.filter((n) => n !== next), + ); + // Remove edge from "next -> node". Do not modify original array as it might + // be the one from the original graph + const newParentToChildrenForNext = [...parentToChildren.get(next)!]; + newParentToChildrenForNext.splice(newParentToChildrenForNext.indexOf(node), 1); + parentToChildren.set(next, newParentToChildrenForNext); + + // if there are no incoming edges for `next`. add it to `S`. + if (parentToChildren.get(next)!.length === 0) { + S.push(next); + } + } + } + return result; +} From 4c5081182fad663a4a4eb8d14821ffbe13455067 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:31:01 +0000 Subject: [PATCH 069/143] refactor(migrations): add advisors for problematic patterns (#57082) E.g. detects `spyOn(myComp, 'input')`. This is problematic as `input` no longer provides access to the raw value via property access, but via a getter. The `spyOn` would be effictively a noop, causing tests to fail. We skip such inputs for safety right now. Similarly, we have an advisor for correcting type safety loss with `.componentInstance` in unit tests. This is a common pattern but is typed in Angular core as `any`. This breaks resolution of references and we accidentally miss those. This advisor mitigates that. PR Close #57082 --- .../debug_element_component_instance.ts | 77 +++++++++++++++++++ .../partial_directive_type.ts | 71 +++++++++++++++++ .../src/pattern_advisors/spy_on_pattern.ts | 53 +++++++++++++ 3 files changed, 201 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/pattern_advisors/debug_element_component_instance.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/pattern_advisors/partial_directive_type.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/pattern_advisors/spy_on_pattern.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/debug_element_component_instance.ts b/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/debug_element_component_instance.ts new file mode 100644 index 000000000000..4f1f6d63a202 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/debug_element_component_instance.ts @@ -0,0 +1,77 @@ +/** + * @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 ts from 'typescript'; + +/** + * Detects `query(By.directive(T)).componentInstance` patterns and enhances + * them with information of `T`. This is important because `.componentInstance` + * is currently typed as `any` and may cause runtime test failures after input + * migrations then. + * + * The reference resolution pass leverages information from this pattern + * recognizer. + */ +export class DebugElementComponentInstance { + private cache = new WeakMap(); + + constructor(private checker: ts.TypeChecker) {} + + detect(node: ts.Node): ts.Type | null { + if (this.cache.has(node)) { + return this.cache.get(node)!; + } + if (!ts.isPropertyAccessExpression(node)) { + return null; + } + // Check for `<>.componentInstance`. + if (!ts.isIdentifier(node.name) || node.name.text !== 'componentInstance') { + return null; + } + // Check for `<>.query(..).componentInstance`. + if ( + !ts.isCallExpression(node.expression) || + !ts.isPropertyAccessExpression(node.expression.expression) || + !ts.isIdentifier(node.expression.expression.name) || + node.expression.expression.name.text !== 'query' + ) { + return null; + } + + const queryCall: ts.CallExpression = node.expression; + if (queryCall.arguments.length !== 1) { + return null; + } + + const queryArg = queryCall.arguments[0]; + + // Only detect simple references to directives in `query(...)`. + if ( + !ts.isCallExpression(queryArg) || + queryArg.arguments.length !== 1 || + !ts.isIdentifier(queryArg.arguments[0]) + ) { + return null; + } + + const symbol = this.checker.getSymbolAtLocation(queryArg.arguments[0]); + if ( + symbol?.valueDeclaration === undefined || + !ts.isClassDeclaration(symbol?.valueDeclaration) + ) { + // Cache this as we use the expensive type checker. + this.cache.set(node, null); + return null; + } + + const type = this.checker.getTypeAtLocation(symbol.valueDeclaration); + + this.cache.set(node, type); + return type; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/partial_directive_type.ts b/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/partial_directive_type.ts new file mode 100644 index 000000000000..6dd9b0dbaa45 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/partial_directive_type.ts @@ -0,0 +1,71 @@ +/** + * @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 ts from 'typescript'; +import {KnownInputs} from '../input_detection/known_inputs'; + +/** + * Recognizes `Partial` instances in Catalyst tests. Those type queries + * are likely used for typing property initialization values for the given class `T` + * and we have a few scenarios: + * + * 1. The API does not unwrap signal inputs. In which case, the values are likely no + * longer assignable to an `InputSignal`. + * 2. The API does unwrap signal inputs, in which case we need to unwrap the `Partial` + * because the values are raw initial values, like they were before. + * + * We can enable this heuristic when we detect Catalyst as we know it supports unwrapping. + */ +export class PartialDirectiveTypeInCatalystTests { + constructor( + private checker: ts.TypeChecker, + private knownInputs: KnownInputs, + ) {} + + detect( + node: ts.Node, + ): null | {referenceNode: ts.TypeReferenceNode; targetClass: ts.ClassDeclaration} { + // Detect `Partial<...>` + if ( + !ts.isTypeReferenceNode(node) || + !ts.isIdentifier(node.typeName) || + node.typeName.text !== 'Partial' + ) { + return null; + } + + // Ignore if the source file doesn't reference Catalyst. + if (!node.getSourceFile().text.includes('angular2/testing/catalyst')) { + return null; + } + + // Extract T of `Partial`. + const cmpTypeArg = node.typeArguments?.[0]; + if ( + !cmpTypeArg || + !ts.isTypeReferenceNode(cmpTypeArg) || + !ts.isIdentifier(cmpTypeArg.typeName) + ) { + return null; + } + const cmpType = cmpTypeArg.typeName; + const symbol = this.checker.getSymbolAtLocation(cmpType); + + // Note: Technically the class might be derived of an input-containing class, + // but this is out of scope for now. We can expand if we see it's a common case. + if ( + symbol?.valueDeclaration === undefined || + !ts.isClassDeclaration(symbol.valueDeclaration) || + !this.knownInputs.isInputContainingClass(symbol.valueDeclaration) + ) { + return null; + } + + return {referenceNode: node, targetClass: symbol.valueDeclaration}; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/spy_on_pattern.ts b/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/spy_on_pattern.ts new file mode 100644 index 000000000000..a5c2ff14a036 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/pattern_advisors/spy_on_pattern.ts @@ -0,0 +1,53 @@ +/** + * @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 ts from 'typescript'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {attemptRetrieveInputFromSymbol} from '../input_detection/nodes_to_input'; +import {MigrationHost} from '../migration_host'; +import {InputIncompatibilityReason} from '../input_detection/incompatibility'; + +/** + * Detects `spyOn(dirInstance, 'myInput')` calls that likely modify + * the input signal. There is no way to change the value inside the input signal, + * and hence observing is not possible. + */ +export class SpyOnInputPattern { + constructor( + private host: MigrationHost, + private checker: ts.TypeChecker, + private knownInputs: KnownInputs, + ) {} + + detect(node: ts.Node) { + if ( + ts.isCallExpression(node) && + ts.isIdentifier(node.expression) && + node.expression.text === 'spyOn' && + node.arguments.length === 2 && + ts.isStringLiteralLike(node.arguments[1]) + ) { + const spyTargetType = this.checker.getTypeAtLocation(node.arguments[0]); + const spyProperty = spyTargetType.getProperty(node.arguments[1].text); + + if (spyProperty === undefined) { + return; + } + + const inputTarget = attemptRetrieveInputFromSymbol(this.host, spyProperty, this.knownInputs); + if (inputTarget === null) { + return; + } + + this.knownInputs.markInputAsIncompatible(inputTarget.descriptor, { + context: node, + reason: InputIncompatibilityReason.SpyOnThatOverwritesField, + }); + } + } +} From f1ad9f9893a58ec61e19e2d8409227117edd53a0 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:33:12 +0000 Subject: [PATCH 070/143] refactor(migrations): add phase for migrating inputs and references (#57082) Adds the migration phase for migrating inputs and references. Thise phase may execute as the third step when batching. The migration is intentionally split into three phases: 1. Extract and analyze 2. Inheritance merge / merge of metadata 3. Migrate This allows us to batch the migration in Google3, or for large projects, merge metadata, and then batch-execute migration for computation of replacements. This is compatible with Google's LSC tsunami tool. PR Close #57082 --- .../src/passes/5_migrate_ts_references.ts | 153 ++++++++++++++++++ .../passes/6_migrate_input_declarations.ts | 108 +++++++++++++ .../passes/7_migrate_template_references.ts | 59 +++++++ .../src/passes/8_migrate_host_bindings.ts | 56 +++++++ .../passes/9_migrate_ts_type_references.ts | 108 +++++++++++++ 5 files changed, 484 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/5_migrate_ts_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/6_migrate_input_declarations.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/7_migrate_template_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/8_migrate_host_bindings.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/passes/9_migrate_ts_type_references.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/5_migrate_ts_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/5_migrate_ts_references.ts new file mode 100644 index 000000000000..833be898fbce --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/5_migrate_ts_references.ts @@ -0,0 +1,153 @@ +/** + * @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 ts from 'typescript'; +import {MigrationResult} from '../result'; +import {analyzeControlFlow} from '../flow_analysis'; +import {Replacement} from '../replacement'; +import {InputUniqueKey} from '../utils/input_id'; +import {isTsInputReference} from '../utils/input_reference'; +import {traverseAccess} from '../utils/traverse_access'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {createGenerateUniqueIdentifierHelper} from '../../../../../../compiler-cli/src/ngtsc/translator/src/import_manager/check_unique_identifier_name'; + +/** + * Phase that migrates TypeScript input references to be signal compatible. + * + * The phase takes care of control flow analysis and generates temporary variables + * where needed to ensure narrowing continues to work. E.g. + * + * ``` + * someMethod() { + * if (this.input) { + * this.input.charAt(0); + * } + * } + * ``` + * + * will be transformed into: + * + * ``` + * someMethod() { + * const input_1 = this.input(); + * if (input_1) { + * input_1.charAt(0); + * } + * } + * ``` + */ +export function pass5__migrateTypeScriptReferences( + result: MigrationResult, + checker: ts.TypeChecker, + knownInputs: KnownInputs, +) { + const generateUniqueIdentifier = createGenerateUniqueIdentifierHelper(); + const tsReferences = new Map(); + const seenIdentifiers = new WeakSet(); + + for (const reference of result.references) { + // This pass only deals with TS references. + if (!isTsInputReference(reference)) { + continue; + } + // Skip references to incompatible inputs. + if (knownInputs.get(reference.target)!.isIncompatible()) { + continue; + } + // TODO: Skip references migration for accessor inputs. + if (ts.isAccessor(reference.target.node)) { + continue; + } + // Skip duplicate references. E.g. in batching. + if (seenIdentifiers.has(reference.from.node)) { + continue; + } + seenIdentifiers.add(reference.from.node); + + if (!tsReferences.has(reference.target.key)) { + tsReferences.set(reference.target.key, { + accesses: [], + }); + } + tsReferences.get(reference.target.key)!.accesses.push(reference.from.node); + } + + // TODO: Consider checking/properly handling optional chaining and narrowing. + + for (const reference of tsReferences.values()) { + const controlFlowResult = analyzeControlFlow(reference.accesses, checker); + const idToSharedField = new Map(); + + for (const {id, originalNode, recommendedNode} of controlFlowResult) { + const sf = originalNode.getSourceFile(); + + // Original node is preserved. No narrowing, and hence not shared. + // Unwrap the signal directly. + if (recommendedNode === 'preserve') { + // Append `()` to unwrap the signal. + result.addReplacement( + sf.fileName, + new Replacement(originalNode.getEnd(), originalNode.getEnd(), '()'), + ); + continue; + } + + // This reference is shared with a previous reference. Replace the access + // with the temporary variable. + if (typeof recommendedNode === 'number') { + const replaceNode = traverseAccess(originalNode); + result.addReplacement( + sf.fileName, + new Replacement( + replaceNode.getStart(), + replaceNode.getEnd(), + // Extract the shared field name. + idToSharedField.get(recommendedNode)!, + ), + ); + continue; + } + + // Otherwise, we are creating a "shared reference" at the given node and + // block. + + // Iterate up the original node, until we hit the "recommended block" level. + // We then use the previous child as anchor for inserting. This allows us + // to insert right before the first reference in the container, at the proper + // block level— instead of always inserting at the beginning of the container. + let parent = originalNode.parent; + let previous: ts.Node = originalNode; + while (parent !== recommendedNode) { + previous = parent; + parent = parent.parent; + } + + const leadingSpace = ts.getLineAndCharacterOfPosition(sf, previous.getStart()); + + const replaceNode = traverseAccess(originalNode); + const uniqueFieldName = generateUniqueIdentifier(sf, originalNode.text); + const fieldName = uniqueFieldName === null ? originalNode.text : uniqueFieldName.text; + + idToSharedField.set(id, fieldName); + + result.addReplacement( + sf.fileName, + new Replacement( + previous.getStart(), + previous.getStart(), + `const ${fieldName} = ${replaceNode.getText()}();\n${' '.repeat(leadingSpace.character)}`, + ), + ); + + result.addReplacement( + sf.fileName, + new Replacement(replaceNode.getStart(), replaceNode.getEnd(), fieldName), + ); + } + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/6_migrate_input_declarations.ts b/packages/core/schematics/migrations/signal-migration/src/passes/6_migrate_input_declarations.ts new file mode 100644 index 000000000000..544f1595dedc --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/6_migrate_input_declarations.ts @@ -0,0 +1,108 @@ +/** + * @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 ts from 'typescript'; +import {MigrationResult} from '../result'; +import {Replacement} from '../replacement'; +import {convertToSignalInput} from '../convert-input/convert_to_signal'; +import assert from 'assert'; +import {MigrationHost} from '../migration_host'; +import {KnownInputs} from '../input_detection/known_inputs'; + +/** + * Phase that migrates `@Input()` declarations to signal inputs and + * manages imports within the given file. + */ +export function pass6__migrateInputDeclarations( + host: MigrationHost, + checker: ts.TypeChecker, + result: MigrationResult, + knownInputs: KnownInputs, +) { + let filesWithMigratedInputs = new Set(); + let filesWithIncompatibleInputs = new WeakSet(); + + for (const [input, metadata] of result.sourceInputs) { + const sf = input.node.getSourceFile(); + + // Do not migrate incompatible inputs. + if (knownInputs.get(input)!.isIncompatible() || metadata === null) { + filesWithIncompatibleInputs.add(sf); + continue; + } + + assert(!ts.isAccessor(input.node), 'Accessor inputs are incompatible.'); + + filesWithMigratedInputs.add(sf); + result.addReplacement( + sf.fileName, + new Replacement( + input.node.getStart(), + input.node.getEnd(), + convertToSignalInput(host, input.node, metadata, checker), + ), + ); + } + + // TODO: Consider using import manager for conflicts. but also in `convert_to_signal` then. + + for (const file of filesWithMigratedInputs) { + const specifiers = result.inputDecoratorSpecifiers.get(file); + assert(specifiers !== undefined, `No imports in source file of input: ${file.fileName}`); + + const decoratorInputSpecifier = specifiers.find((s) => s.kind === 'decorator-input-import'); + assert(decoratorInputSpecifier, 'Expected at least one import to "Input"'); + + const signalInputSpecifier = specifiers.find((s) => s.kind === 'signal-input-import'); + + if (filesWithIncompatibleInputs.has(file)) { + // add `input`, but not remove `Input`. Both are needed still. + if (signalInputSpecifier === undefined) { + result.addReplacement( + file.fileName, + new Replacement( + decoratorInputSpecifier.node.getEnd(), + decoratorInputSpecifier.node.getEnd(), + ', input', + ), + ); + } + } else { + // replace `Input` with `input`. All migrated in this file. + if (signalInputSpecifier === undefined) { + result.addReplacement( + file.fileName, + new Replacement( + decoratorInputSpecifier.node.getStart(), + decoratorInputSpecifier.node.getEnd(), + 'input', + ), + ); + } else { + const elements = decoratorInputSpecifier.node.parent.elements; + const indexOfSpecifier = elements.findIndex((c) => c === decoratorInputSpecifier.node); + + let start = decoratorInputSpecifier.node.getStart(); + let end = decoratorInputSpecifier.node.getEnd(); + + // Either collapse (the comman between specifiers) with the preceding element, + // or with the following if present. + if (indexOfSpecifier > 0) { + start = elements[indexOfSpecifier - 1].getEnd(); + } else { + if (elements.length > indexOfSpecifier + 1) { + end = elements[indexOfSpecifier + 1].getStart(); + } + } + + // We already have `input` in source code. Remove `Input` completely. + result.addReplacement(file.fileName, new Replacement(start, end, '')); + } + } + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/7_migrate_template_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/7_migrate_template_references.ts new file mode 100644 index 000000000000..41b04a8892ec --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/7_migrate_template_references.ts @@ -0,0 +1,59 @@ +/** + * @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 {MigrationHost} from '../migration_host'; +import {Replacement} from '../replacement'; +import {MigrationResult} from '../result'; +import {isTemplateInputReference} from '../utils/input_reference'; +import {KnownInputs} from '../input_detection/known_inputs'; + +/** + * Phase that migrates Angular template references to + * unwrap signals. + */ +export function pass7__migrateTemplateReferences( + host: MigrationHost, + result: MigrationResult, + knownInputs: KnownInputs, +) { + const seenFileReferences = new Set(); + + for (const reference of result.references) { + // This pass only deals with HTML template references. + if (!isTemplateInputReference(reference)) { + continue; + } + // Skip references to incompatible inputs. + if (knownInputs.get(reference.target)!.isIncompatible()) { + continue; + } + + // Skip duplicate references. E.g. if a template is shared. + const fileReferenceId = `${reference.from.templateFileId}:${reference.from.read.sourceSpan.end}`; + if (seenFileReferences.has(fileReferenceId)) { + continue; + } + seenFileReferences.add(fileReferenceId); + + // TODO: Control flow, or wait for Joost's PR? + + // Expand shorthands like `{bla}` to `{bla: bla()}`. + const appendText = reference.from.isObjectShorthandExpression + ? `: ${reference.from.read.name}()` + : `()`; + + result.addReplacement( + host.idToFilePath(reference.from.templateFileId), + new Replacement( + reference.from.read.sourceSpan.end, + reference.from.read.sourceSpan.end, + appendText, + ), + ); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/8_migrate_host_bindings.ts b/packages/core/schematics/migrations/signal-migration/src/passes/8_migrate_host_bindings.ts new file mode 100644 index 000000000000..3d06ee4de2aa --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/8_migrate_host_bindings.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 ts from 'typescript'; +import {Replacement} from '../replacement'; +import {MigrationResult} from '../result'; +import {isHostBindingInputReference} from '../utils/input_reference'; +import {KnownInputs} from '../input_detection/known_inputs'; + +/** + * Phase that migrates Angular host binding references to + * unwrap signals. + */ +export function pass8__migrateHostBindings(result: MigrationResult, knownInputs: KnownInputs) { + const seenReferences = new WeakMap>(); + + for (const reference of result.references) { + // This pass only deals with host binding references. + if (!isHostBindingInputReference(reference)) { + continue; + } + // Skip references to incompatible inputs. + if (knownInputs.get(reference.target)!.isIncompatible()) { + continue; + } + + const bindingField = reference.from.hostPropertyNode; + const expressionOffset = bindingField.getStart() + 1; // account for quotes. + const readEndPos = expressionOffset + reference.from.read.sourceSpan.end; + + // Skip duplicate references. Can happen if the host object is shared. + if (seenReferences.get(bindingField)?.has(readEndPos)) { + continue; + } + if (seenReferences.has(bindingField)) { + seenReferences.get(bindingField)!.add(readEndPos); + } else { + seenReferences.set(bindingField, new Set([readEndPos])); + } + + // Expand shorthands like `{bla}` to `{bla: bla()}`. + const appendText = reference.from.isObjectShorthandExpression + ? `: ${reference.from.read.name}()` + : `()`; + + result.addReplacement( + bindingField.getSourceFile().fileName, + new Replacement(readEndPos, readEndPos, appendText), + ); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/passes/9_migrate_ts_type_references.ts b/packages/core/schematics/migrations/signal-migration/src/passes/9_migrate_ts_type_references.ts new file mode 100644 index 000000000000..79a1fe29ce5d --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/passes/9_migrate_ts_type_references.ts @@ -0,0 +1,108 @@ +/** + * @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 ts from 'typescript'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {MigrationResult} from '../result'; +import {isTsInputClassTypeReference} from '../utils/input_reference'; +import {Replacement} from '../replacement'; +import assert from 'assert'; +import {ImportManager} from '../../../../../../compiler-cli/src/ngtsc/translator'; + +/** + * Migrates TypeScript "ts.Type" references. E.g. + + * - `Partial` will be converted to `UnwrapSignalInputs>`. + in Catalyst test files. + */ +export function pass9__migrateTypeScriptTypeReferences( + result: MigrationResult, + knownInputs: KnownInputs, +) { + const seenTypeNodes = new WeakSet(); + const fileNamesToFiles = new Map(); + const importManager = new ImportManager(); + + for (const reference of result.references) { + // This pass only deals with TS input class type references. + if (!isTsInputClassTypeReference(reference)) { + continue; + } + // Skip references to classes that are not migrated. + if (knownInputs.getDirectiveInfoForClass(reference.target)!.isClassSkippedForMigration()) { + continue; + } + // Skip duplicate references. E.g. in batching. + if (seenTypeNodes.has(reference.from.node)) { + continue; + } + seenTypeNodes.add(reference.from.node); + + if (reference.isPartialReference && reference.isPartOfCatalystFile) { + assert(reference.from.node.typeArguments, 'Expected type arguments for partial reference.'); + assert(reference.from.node.typeArguments.length === 1, 'Expected an argument for reference.'); + + const firstArg = reference.from.node.typeArguments[0]; + const sf = firstArg.getSourceFile(); + + fileNamesToFiles.set(sf.fileName, sf); + const unwrapImportExpr = importManager.addImport({ + exportModuleSpecifier: 'google3/javascript/angular2/testing/catalyst', + exportSymbolName: 'UnwrapSignalInputs', + requestedFile: sf, + }); + + result.addReplacement( + sf.fileName, + new Replacement( + firstArg.getStart(), + firstArg.getStart(), + `${ts.createPrinter().printNode(ts.EmitHint.Unspecified, unwrapImportExpr, sf)}<`, + ), + ); + result.addReplacement( + sf.fileName, + new Replacement(firstArg.getEnd(), firstArg.getEnd(), '>'), + ); + } + + // TODO: Formalize import manager support across phases. + const {newImports, updatedImports} = importManager.finalize(); + + // Capture new imports + newImports.forEach((newImports, fileName) => { + newImports.forEach((newImport) => { + result.addReplacement( + fileName, + new Replacement( + 0, + 0, + ts + .createPrinter() + .printNode(ts.EmitHint.Unspecified, newImport, fileNamesToFiles.get(fileName)!) + + '\n', + ), + ); + }); + }); + + // Capture updated imports + for (const [oldBindings, newBindings] of updatedImports.entries()) { + result.addReplacement( + oldBindings.getSourceFile().fileName, + new Replacement( + oldBindings.getStart(), + oldBindings.getEnd(), + ts + .createPrinter() + .printNode(ts.EmitHint.Unspecified, newBindings, oldBindings.getSourceFile()), + ), + ); + } + } +} From 03b4c3b622743673334a1be1e13b5ad307936705 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:35:04 +0000 Subject: [PATCH 071/143] refactor(migrations): add main entry points for signal migration (#57082) Adds the main entrypoint for the signal migration. These invoke the individual phases and expose helpers. PR Close #57082 --- .../signal-migration/src/BUILD.bazel | 45 ++++++ .../signal-migration/src/create_program.ts | 152 ++++++++++++++++++ .../migrations/signal-migration/src/index.ts | 45 ++++++ .../signal-migration/src/phase_analysis.ts | 84 ++++++++++ .../signal-migration/src/phase_migrate.ts | 40 +++++ .../src/utils/class_member_names.ts | 22 +++ 6 files changed, 388 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/BUILD.bazel create mode 100644 packages/core/schematics/migrations/signal-migration/src/create_program.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/index.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/phase_analysis.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/phase_migrate.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/utils/class_member_names.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/BUILD.bazel b/packages/core/schematics/migrations/signal-migration/src/BUILD.bazel new file mode 100644 index 000000000000..fb87ba6dfc23 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/BUILD.bazel @@ -0,0 +1,45 @@ +load("//tools:defaults.bzl", "nodejs_binary", "ts_library") + +ts_library( + name = "src", + srcs = glob( + ["**/*.ts"], + exclude = ["test/**"], + ), + visibility = [ + "//packages/core/schematics/migrations/signal-migration/src/batch:__pkg__", + "//packages/language-service:__subpackages__", + ], + deps = [ + "//packages/compiler", + "//packages/compiler-cli", + "//packages/compiler-cli/src/ngtsc/annotations", + "//packages/compiler-cli/src/ngtsc/annotations/common", + "//packages/compiler-cli/src/ngtsc/annotations/directive", + "//packages/compiler-cli/src/ngtsc/core", + "//packages/compiler-cli/src/ngtsc/diagnostics", + "//packages/compiler-cli/src/ngtsc/file_system", + "//packages/compiler-cli/src/ngtsc/imports", + "//packages/compiler-cli/src/ngtsc/incremental", + "//packages/compiler-cli/src/ngtsc/metadata", + "//packages/compiler-cli/src/ngtsc/partial_evaluator", + "//packages/compiler-cli/src/ngtsc/program_driver", + "//packages/compiler-cli/src/ngtsc/reflection", + "//packages/compiler-cli/src/ngtsc/shims", + "//packages/compiler-cli/src/ngtsc/transform", + "//packages/compiler-cli/src/ngtsc/translator", + "//packages/compiler-cli/src/ngtsc/typecheck", + "//packages/compiler-cli/src/ngtsc/typecheck/api", + "//packages/core/schematics/utils", + "@npm//@types/node", + "@npm//magic-string", + "@npm//typescript", + ], +) + +nodejs_binary( + name = "bin", + data = [":src"], + entry_point = ":index.ts", + visibility = ["//packages/core/schematics/migrations/signal-migration/test:__pkg__"], +) diff --git a/packages/core/schematics/migrations/signal-migration/src/create_program.ts b/packages/core/schematics/migrations/signal-migration/src/create_program.ts new file mode 100644 index 000000000000..2047f682ba0e --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/create_program.ts @@ -0,0 +1,152 @@ +/** + * @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 path from 'path'; +import ts from 'typescript'; + +import {NodeJSFileSystem, setFileSystem} from '../../../../../compiler-cli/src/ngtsc/file_system'; +import {DtsMetadataReader, MetadataReader} from '../../../../../compiler-cli/src/ngtsc/metadata'; +import {PartialEvaluator} from '../../../../../compiler-cli/src/ngtsc/partial_evaluator'; +import {NgtscProgram} from '../../../../../compiler-cli/src/ngtsc/program'; +import {TypeScriptReflectionHost} from '../../../../../compiler-cli/src/ngtsc/reflection'; + +import { + ParsedConfiguration, + readConfiguration, +} from '../../../../../compiler-cli/src/perform_compile'; +import {TemplateTypeChecker} from '../../../../../compiler-cli/src/ngtsc/typecheck/api'; +import {ReferenceEmitter} from '../../../../../compiler-cli/src/ngtsc/imports'; +import {isShim} from '../../../../../compiler-cli/src/ngtsc/shims'; +import {NgCompiler} from '../../../../../compiler-cli/src/ngtsc/core'; +import assert from 'assert'; + +/** + * Interface containing the analysis information + * for an Angular program to be migrated. + */ +export interface AnalysisProgramInfo { + // List of source files in the program. + sourceFiles: readonly ts.SourceFile[]; + // List of all files in the program, including external `d.ts`. + programFiles: readonly ts.SourceFile[]; + reflector: TypeScriptReflectionHost; + typeChecker: ts.TypeChecker; + templateTypeChecker: TemplateTypeChecker; + metaRegistry: MetadataReader; + dtsMetadataReader: DtsMetadataReader; + evaluator: PartialEvaluator; + refEmitter: ReferenceEmitter; +} + +/** Creates and prepares analysis for the given TypeScript project. */ +export function createAndPrepareAnalysisProgram( + absoluteTsconfigPath: string, +): AnalysisProgramInfo & { + tsHost: ts.CompilerHost; + basePath: string; + tsconfig: ParsedConfiguration; +} { + setFileSystem(new NodeJSFileSystem()); + + const basePath = path.dirname(absoluteTsconfigPath); + const tsconfig = readConfiguration(absoluteTsconfigPath, {}, new NodeJSFileSystem()); + + if (tsconfig.errors.length > 0) { + throw new Error( + `Tsconfig could not be parsed or is invalid:\n\n` + + `${tsconfig.errors.map((e) => e.messageText)}`, + ); + } + + const tsHost = ts.createCompilerHost(tsconfig.options, true); + const ngtscProgram = new NgtscProgram( + tsconfig.rootNames, + { + ...tsconfig.options, + _enableTemplateTypeChecker: true, + _compilePoisedComponents: true, + // We want to migrate non-exported classes too. + compileNonExportedClasses: true, + // Avoid checking libraries to speed up the migration. + skipLibCheck: true, + skipDefaultLibCheck: true, + // Always generate as much TCB code as possible. + // This allows us to check references in templates as much as possible. + // Note that this may yield more diagnostics, but we are not collecting these anyway. + strictTemplates: true, + }, + tsHost, + ); + + const userProgram = ngtscProgram.getTsProgram(); + + return { + ...prepareAnalysisInfo(userProgram, ngtscProgram.compiler, tsconfig), + tsconfig, + basePath, + tsHost, + }; +} + +/** + * Prepares migration analysis for the given program. + * + * Unlike {@link createAndPrepareAnalysisProgram} this does not create the program, + * and can be used for integrations with e.g. the language service. + */ +export function prepareAnalysisInfo( + userProgram: ts.Program, + compiler: NgCompiler, + tsconfig?: ParsedConfiguration, +) { + // Get template type checker & analyze sync. + const templateTypeChecker = compiler.getTemplateTypeChecker(); + + // Generate all type check blocks. + templateTypeChecker.generateAllTypeCheckBlocks(); + + const {refEmitter, metaReader} = compiler['ensureAnalyzed'](); + const typeChecker = userProgram.getTypeChecker(); + + const reflector = new TypeScriptReflectionHost(typeChecker); + const evaluator = new PartialEvaluator(reflector, typeChecker, null); + const dtsMetadataReader = new DtsMetadataReader(typeChecker, reflector); + + const limitToRootNamesOnly = process.env['LIMIT_TO_ROOT_NAMES_ONLY'] === '1'; + if (limitToRootNamesOnly) { + assert( + tsconfig !== undefined, + 'Expected a tsconfig to be specified when limiting to root names.', + ); + } + + const programFiles = userProgram.getSourceFiles(); + const sourceFiles = programFiles.filter( + (f) => + !f.isDeclarationFile && + // Note `isShim` will work for the initial program, but for TCB programs, the shims are no longer annotated. + !isShim(f) && + !f.fileName.endsWith('.ngtypecheck.ts') && + // Optional replacement filter. Allows parallel execution in case + // some tsconfig's have overlap due to sharing of TS sources. + // (this is commonly not the case in g3 where deps are `.d.ts` files). + (!limitToRootNamesOnly || tsconfig!.rootNames.includes(f.fileName)), + ); + + return { + programFiles, + sourceFiles, + metaRegistry: metaReader, + dtsMetadataReader, + evaluator, + reflector, + typeChecker, + refEmitter, + templateTypeChecker, + }; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/index.ts b/packages/core/schematics/migrations/signal-migration/src/index.ts new file mode 100644 index 000000000000..302797b95236 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/index.ts @@ -0,0 +1,45 @@ +/** + * @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 path from 'path'; + +import {createAndPrepareAnalysisProgram} from './create_program'; +import {KnownInputs} from './input_detection/known_inputs'; +import {MigrationHost} from './migration_host'; +import {pass4__checkInheritanceOfInputs} from './passes/4_check_inheritance'; +import {executeAnalysisPhase} from './phase_analysis'; +import {executeMigrationPhase} from './phase_migrate'; +import {MigrationResult} from './result'; +import {writeMigrationReplacements} from './write_replacements'; + +main(path.resolve(process.argv[2])); + +/** + * Runs the signal input migration for the given TypeScript project. + */ +export function main(absoluteTsconfigPath: string) { + const analysisDeps = createAndPrepareAnalysisProgram(absoluteTsconfigPath); + const {tsHost, tsconfig, basePath, sourceFiles, metaRegistry} = analysisDeps; + const knownInputs = new KnownInputs(); + const result = new MigrationResult(); + const host = new MigrationHost( + /* projectDir */ tsconfig.options.rootDir ?? basePath, + /* isMigratingCore */ true, + tsconfig.options, + sourceFiles, + ); + + const {inheritanceGraph} = executeAnalysisPhase(host, knownInputs, result, analysisDeps); + + pass4__checkInheritanceOfInputs(host, inheritanceGraph, metaRegistry, knownInputs); + + executeMigrationPhase(host, knownInputs, result, analysisDeps); + + // Apply replacements + writeMigrationReplacements(tsHost, result); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/phase_analysis.ts b/packages/core/schematics/migrations/signal-migration/src/phase_analysis.ts new file mode 100644 index 000000000000..b24ad3f909a7 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/phase_analysis.ts @@ -0,0 +1,84 @@ +/** + * @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 {isShim} from '../../../../../compiler-cli/src/ngtsc/shims'; +import {AnalysisProgramInfo} from './create_program'; +import {KnownInputs} from './input_detection/known_inputs'; +import {MigrationHost} from './migration_host'; +import {pass1__IdentifySourceFileAndDeclarationInputs} from './passes/1_identify_inputs'; +import {pass3__checkIncompatiblePatterns} from './passes/3_check_incompatible_patterns'; +import {pass2_IdentifySourceFileReferences} from './passes/2_find_source_file_references'; +import {MigrationResult} from './result'; +import {InheritanceGraph} from './utils/inheritance_graph'; + +/** + * Executes the analysis phase of the migration. + * + * This includes: + * - finding all inputs + * - finding all references + * - determining incompatible inputs + * - checking inheritance + */ +export function executeAnalysisPhase( + host: MigrationHost, + knownInputs: KnownInputs, + result: MigrationResult, + { + sourceFiles, + programFiles, + reflector, + dtsMetadataReader, + typeChecker, + templateTypeChecker, + evaluator, + refEmitter, + }: AnalysisProgramInfo, +) { + // Pass 1 + programFiles.forEach( + (sf) => + // Shim shim files. Those are unnecessary and might cause unexpected slowness. + // e.g. `ngtypecheck` files. + !isShim(sf) && + pass1__IdentifySourceFileAndDeclarationInputs( + sf, + host, + typeChecker, + reflector, + dtsMetadataReader, + evaluator, + refEmitter, + knownInputs, + result, + ), + ); + + // Pass 2 + sourceFiles.forEach((sf) => + pass2_IdentifySourceFileReferences( + sf, + host, + typeChecker, + reflector, + templateTypeChecker, + knownInputs, + result, + ), + ); + + // Source files is fine. We will resolve into declaration files if a source + // file depends on such. + const inheritanceGraph = new InheritanceGraph(typeChecker).expensivePopulate(sourceFiles); + + // Check pass + // TODO: Combine with source file iterations above for speed up?? + pass3__checkIncompatiblePatterns(host, sourceFiles, inheritanceGraph, typeChecker, knownInputs); + + return {inheritanceGraph}; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/phase_migrate.ts b/packages/core/schematics/migrations/signal-migration/src/phase_migrate.ts new file mode 100644 index 000000000000..c37bb9f1cd20 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/phase_migrate.ts @@ -0,0 +1,40 @@ +/** + * @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 {AnalysisProgramInfo} from './create_program'; +import {KnownInputs} from './input_detection/known_inputs'; +import {MigrationHost} from './migration_host'; +import {pass5__migrateTypeScriptReferences} from './passes/5_migrate_ts_references'; +import {pass6__migrateInputDeclarations} from './passes/6_migrate_input_declarations'; +import {pass7__migrateTemplateReferences} from './passes/7_migrate_template_references'; +import {pass8__migrateHostBindings} from './passes/8_migrate_host_bindings'; +import {pass9__migrateTypeScriptTypeReferences} from './passes/9_migrate_ts_type_references'; +import {MigrationResult} from './result'; + +/** + * Executes the migration phase. + * + * This involves: + * - migrating TS references. + * - migrating `@Input()` declarations. + * - migrating template references. + * - migrating host binding references. + */ +export function executeMigrationPhase( + host: MigrationHost, + knownInputs: KnownInputs, + result: MigrationResult, + {typeChecker}: AnalysisProgramInfo, +) { + // Migrate passes. + pass5__migrateTypeScriptReferences(result, typeChecker, knownInputs); + pass6__migrateInputDeclarations(host, typeChecker, result, knownInputs); + pass7__migrateTemplateReferences(host, result, knownInputs); + pass8__migrateHostBindings(result, knownInputs); + pass9__migrateTypeScriptTypeReferences(result, knownInputs); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/utils/class_member_names.ts b/packages/core/schematics/migrations/signal-migration/src/utils/class_member_names.ts new file mode 100644 index 000000000000..ea8ef7101b5e --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/utils/class_member_names.ts @@ -0,0 +1,22 @@ +/** + * @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 ts from 'typescript'; + +export function getMemberName(member: ts.ClassElement): string | null { + if (member.name === undefined) { + return null; + } + if (ts.isIdentifier(member.name) || ts.isStringLiteralLike(member.name)) { + return member.name.text; + } + if (ts.isPrivateIdentifier(member.name)) { + return `#${member.name.text}`; + } + return null; +} From e0ff4f53862d6682cf743857e8d720a731658287 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:35:53 +0000 Subject: [PATCH 072/143] refactor(migrations): add batching helper for signal migration (#57082) This commit adds the batching logic helpers for running the signal migration as a sharded/parallel action in Google3 and potentially externally. The helpers are the main entry points for go/tsunami. PR Close #57082 --- .../signal-migration/src/batch/BUILD.bazel | 22 ++++ .../signal-migration/src/batch/bin.ts | 30 +++++ .../signal-migration/src/batch/extract.ts | 117 ++++++++++++++++++ .../src/batch/merge_metadata.ts | 73 +++++++++++ .../src/batch/metadata_file.ts | 54 ++++++++ .../src/batch/migrate_target.ts | 72 +++++++++++ 6 files changed, 368 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/src/batch/BUILD.bazel create mode 100644 packages/core/schematics/migrations/signal-migration/src/batch/bin.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/batch/extract.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/batch/merge_metadata.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/batch/metadata_file.ts create mode 100644 packages/core/schematics/migrations/signal-migration/src/batch/migrate_target.ts diff --git a/packages/core/schematics/migrations/signal-migration/src/batch/BUILD.bazel b/packages/core/schematics/migrations/signal-migration/src/batch/BUILD.bazel new file mode 100644 index 000000000000..9861abca7af0 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/batch/BUILD.bazel @@ -0,0 +1,22 @@ +load("//tools:defaults.bzl", "nodejs_binary", "ts_library") + +package(default_visibility = ["//packages/core/schematics/migrations/signal-migration/test:__pkg__"]) + +ts_library( + name = "batch", + srcs = glob( + ["**/*.ts"], + ), + deps = [ + "//packages/compiler", + "//packages/core/schematics/migrations/signal-migration/src", + "@npm//@types/node", + "@npm//typescript", + ], +) + +nodejs_binary( + name = "bin", + data = [":batch"], + entry_point = ":bin.ts", +) diff --git a/packages/core/schematics/migrations/signal-migration/src/batch/bin.ts b/packages/core/schematics/migrations/signal-migration/src/batch/bin.ts new file mode 100644 index 000000000000..ce1b142ff599 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/batch/bin.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {extract} from './extract'; +import path from 'path'; +import fs from 'fs'; +import {mergeMetadataFilesViaPath} from './merge_metadata'; +import {migrateTarget} from './migrate_target'; +import {MetadataFile} from './metadata_file'; + +const [mode, ...args] = process.argv.slice(2); + +if (mode === 'extract') { + process.stdout.write(JSON.stringify(extract(path.resolve(args[0])))); +} else if (mode === 'merge') { + mergeMetadataFilesViaPath(args.map((p) => path.resolve(p))).catch((e) => { + console.error(e); + process.exit(1); + }); +} else if (mode === 'migrate') { + migrateTarget( + path.resolve(args[0]), + JSON.parse(fs.readFileSync(path.resolve(args[1]), 'utf8')) as MetadataFile, + ).apply(); +} diff --git a/packages/core/schematics/migrations/signal-migration/src/batch/extract.ts b/packages/core/schematics/migrations/signal-migration/src/batch/extract.ts new file mode 100644 index 000000000000..316576dc3c79 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/batch/extract.ts @@ -0,0 +1,117 @@ +/** + * @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 {createAndPrepareAnalysisProgram} from '../create_program'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {MigrationHost} from '../migration_host'; +import {pass4__checkInheritanceOfInputs} from '../passes/4_check_inheritance'; +import {executeAnalysisPhase} from '../phase_analysis'; +import {MigrationResult} from '../result'; +import {InputUniqueKey} from '../utils/input_id'; +import { + isHostBindingInputReference, + isTsInputClassTypeReference, + isTsInputReference, +} from '../utils/input_reference'; +import {IncompatibilityType, MetadataFile} from './metadata_file'; + +/** + * Batch mode. + * + * Analyzes and extracts metadata for the given TypeScript target. The + * resolved metadata is returned and can be merged later. + */ +export function extract(absoluteTsconfigPath: string) { + const analysisDeps = createAndPrepareAnalysisProgram(absoluteTsconfigPath); + const {tsconfig, basePath, metaRegistry, sourceFiles} = analysisDeps; + const knownInputs = new KnownInputs(); + const result = new MigrationResult(); + const host = new MigrationHost( + /* projectDir */ tsconfig.options.rootDir ?? basePath, + /* isMigratingCore */ true, + tsconfig.options, + sourceFiles, + ); + + const {inheritanceGraph} = executeAnalysisPhase(host, knownInputs, result, analysisDeps); + pass4__checkInheritanceOfInputs(host, inheritanceGraph, metaRegistry, knownInputs); + + const struct: MetadataFile = { + knownInputs: Array.from(knownInputs.knownInputIds.entries()).reduce( + (res, [inputIdStr, info]) => { + const classIncompatibility = + info.container.incompatible !== null + ? ({kind: IncompatibilityType.VIA_CLASS, reason: info.container.incompatible!} as const) + : null; + const memberIncompatibility = info.container.memberIncompatibility.has(inputIdStr) + ? ({ + kind: IncompatibilityType.VIA_INPUT, + reason: info.container.memberIncompatibility.get(inputIdStr)!.reason, + } as const) + : null; + const incompatibility = classIncompatibility ?? memberIncompatibility ?? null; + + // Note: Trim off the `context` as it cannot be serialized with e.g. TS nodes. + return { + ...res, + [inputIdStr as string & InputUniqueKey]: { + isIncompatible: incompatibility, + }, + }; + }, + {} as MetadataFile['knownInputs'], + ), + references: result.references.map((r) => { + if (isTsInputReference(r)) { + return { + kind: r.kind, + target: r.target.key, + from: { + fileId: r.from.fileId, + node: {positionEndInFile: r.from.node.getEnd()}, + }, + }; + } else if (isHostBindingInputReference(r)) { + return { + kind: r.kind, + target: r.target.key, + from: { + fileId: r.from.fileId, + hostPropertyNode: {positionEndInFile: r.from.hostPropertyNode.getEnd()}, + isObjectShorthandExpression: r.from.isObjectShorthandExpression, + read: {positionEndInFile: r.from.read.sourceSpan.end}, + }, + }; + } else if (isTsInputClassTypeReference(r)) { + return { + kind: r.kind, + target: {positionEndInFile: r.target.getEnd()}, + from: { + fileId: r.from.fileId, + node: {positionEndInFile: r.from.node.getEnd()}, + }, + isPartOfCatalystFile: r.isPartOfCatalystFile, + isPartialReference: r.isPartialReference, + }; + } + return { + kind: r.kind, + target: r.target.key, + from: { + originatingTsFileId: r.from.originatingTsFileId, + templateFileId: r.from.templateFileId, + isObjectShorthandExpression: r.from.isObjectShorthandExpression, + node: {positionEndInFile: r.from.node.sourceSpan.end.offset}, + read: {positionEndInFile: r.from.read.sourceSpan.end}, + }, + }; + }), + }; + + return struct; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/batch/merge_metadata.ts b/packages/core/schematics/migrations/signal-migration/src/batch/merge_metadata.ts new file mode 100644 index 000000000000..c4d0651c8189 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/batch/merge_metadata.ts @@ -0,0 +1,73 @@ +/** + * @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 fs from 'fs'; +import {MetadataFile, SerializableForBatching} from './metadata_file'; +import {InputReference, InputReferenceKind} from '../utils/input_reference'; + +/** Merges a list of metadata files into a combined global file. */ +export async function mergeMetadataFilesViaPath(absoluteMetadataFiles: string[]) { + mergeMetadataFiles( + await Promise.all( + absoluteMetadataFiles.map( + async (filePath) => + JSON.parse(await fs.promises.readFile(filePath, 'utf8')) as MetadataFile, + ), + ), + ); +} + +/** Merges a list of metadata files into a combined global file. */ +export function mergeMetadataFiles(metadataFiles: MetadataFile[]) { + const result: MetadataFile = { + knownInputs: {}, + references: [], + }; + + const seenReferenceFromIds = new Set(); + + for (const file of metadataFiles) { + for (const [key, info] of Object.entries(file.knownInputs)) { + const existing = result.knownInputs[key]; + if (existing === undefined) { + result.knownInputs[key] = info; + } else if (existing.isIncompatible === null && info.isIncompatible) { + // input might not be incompatible in one target, but others might invalidate it. + // merge the incompatibility state. + existing.isIncompatible = info.isIncompatible; + } + } + + for (const reference of file.references) { + const referenceId = computeReferenceId(reference); + if (seenReferenceFromIds.has(referenceId)) { + continue; + } + seenReferenceFromIds.add(referenceId); + result.references.push(reference); + } + } + + process.stdout.write(JSON.stringify(result)); +} + +/** Computes a unique ID for the given reference. */ +function computeReferenceId(reference: SerializableForBatching): string { + if (reference.kind === InputReferenceKind.InTemplate) { + return `${reference.from.templateFileId}@@${reference.from.read.positionEndInFile}`; + } else if (reference.kind === InputReferenceKind.InHostBinding) { + // `read` position is commonly relative to the host property node position— so we need + // to make it absolute by incorporating the host node position. + return ( + `${reference.from.fileId}@@${reference.from.hostPropertyNode.positionEndInFile}` + + `@@${reference.from.read.positionEndInFile}` + ); + } else { + return `${reference.from.fileId}@@${reference.from.node.positionEndInFile}`; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/src/batch/metadata_file.ts b/packages/core/schematics/migrations/signal-migration/src/batch/metadata_file.ts new file mode 100644 index 000000000000..09ecd9a8a994 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/batch/metadata_file.ts @@ -0,0 +1,54 @@ +/** + * @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 ts from 'typescript'; +import {AST, TmplAstNode} from '../../../../../../compiler/public_api'; +import { + ClassIncompatibilityReason, + InputIncompatibilityReason, +} from '../input_detection/incompatibility'; +import {InputReference} from '../utils/input_reference'; +import {InputDescriptor, InputUniqueKey} from '../utils/input_id'; + +/** Helper that ensures given type `T` is serializable. */ +export type SerializableForBatching = { + [K in keyof T]: T[K] extends ts.Node | TmplAstNode | AST + ? {positionEndInFile: number} + : // Input descriptor should only be the serializable string. + T[K] extends InputDescriptor + ? InputUniqueKey + : // If no known type, recursively step into it. + SerializableForBatching; +}; + +/** Type of incompatibility. */ +export enum IncompatibilityType { + VIA_CLASS, + VIA_INPUT, +} + +/** + * Type describing a serializable metadata file. + * + * The metadata files are built for every compilation unit in batching + * mode, and can be merged later, and then used as global analysis metadata + * when migrating. + */ +export interface MetadataFile { + knownInputs: { + // Use `string` here so that it's a usable index key. + [inputIdKey: string]: { + isIncompatible: + | {kind: IncompatibilityType.VIA_CLASS; reason: ClassIncompatibilityReason} + | {kind: IncompatibilityType.VIA_INPUT; reason: InputIncompatibilityReason} + | null; + }; + }; + + references: SerializableForBatching[]; +} diff --git a/packages/core/schematics/migrations/signal-migration/src/batch/migrate_target.ts b/packages/core/schematics/migrations/signal-migration/src/batch/migrate_target.ts new file mode 100644 index 000000000000..6c46d9e040bf --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/src/batch/migrate_target.ts @@ -0,0 +1,72 @@ +/** + * @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 {createAndPrepareAnalysisProgram} from '../create_program'; +import {KnownInputs} from '../input_detection/known_inputs'; +import {MigrationHost} from '../migration_host'; +import {pass4__checkInheritanceOfInputs} from '../passes/4_check_inheritance'; +import {executeAnalysisPhase} from '../phase_analysis'; +import {executeMigrationPhase} from '../phase_migrate'; +import {MigrationResult} from '../result'; +import {InputUniqueKey} from '../utils/input_id'; +import {writeMigrationReplacements} from '../write_replacements'; +import {IncompatibilityType, MetadataFile} from './metadata_file'; + +/** + * Batch mode. + * + * Migrates the given compilation unit, leveraging the global analysis metadata + * that was created as the merge of all individual project units. + */ +export function migrateTarget(absoluteTsconfigPath: string, mergedMetadata: MetadataFile) { + const analysisDeps = createAndPrepareAnalysisProgram(absoluteTsconfigPath); + const {tsHost, tsconfig, basePath, sourceFiles, metaRegistry} = analysisDeps; + const knownInputs = new KnownInputs(); + const result = new MigrationResult(); + const host = new MigrationHost( + /* projectDir */ tsconfig.options.rootDir ?? basePath, + /* isMigratingCore */ true, + tsconfig.options, + sourceFiles, + ); + + const {inheritanceGraph} = executeAnalysisPhase(host, knownInputs, result, analysisDeps); + + // Populate from batch metadata. + for (const [_key, info] of Object.entries(mergedMetadata.knownInputs)) { + const key = _key as unknown as InputUniqueKey; + + // irrelevant for this compilation unit. + if (!knownInputs.has({key})) { + continue; + } + + const inputMetadata = knownInputs.get({key})!; + if (!inputMetadata.isIncompatible() && info.isIncompatible) { + if (info.isIncompatible.kind === IncompatibilityType.VIA_CLASS) { + knownInputs.markDirectiveAsIncompatible( + inputMetadata.container.clazz, + info.isIncompatible.reason, + ); + } else { + knownInputs.markInputAsIncompatible(inputMetadata.descriptor, { + context: null, // No context serializable. + reason: info.isIncompatible.reason, + }); + } + } + } + + pass4__checkInheritanceOfInputs(host, inheritanceGraph, metaRegistry, knownInputs); + executeMigrationPhase(host, knownInputs, result, analysisDeps); + + return { + replacements: result.replacements, + apply: () => writeMigrationReplacements(tsHost, result), + }; +} From ad230630d622558ab33b73e1294f6f3768fe7907 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 22 Jul 2024 15:36:50 +0000 Subject: [PATCH 073/143] test(migrations): adds golden tests for the signal input migration (#57082) This commit adds golden tests for the signal input migration, along with a tool to execute and automatically test the migration via the batch mode, treating a single file as compilation unit. PR Close #57082 --- .../signal-migration/test/BUILD.bazel | 82 ++ .../signal-migration/test/batch_runner.ts | 112 +++ .../test/golden-test/BUILD.bazel | 12 + .../test/golden-test/any_test.ts | 23 + .../test/golden-test/base_class.ts | 32 + .../test/golden-test/both_input_imports.ts | 14 + .../test/golden-test/catalyst_test.ts | 21 + .../test/golden-test/cross_references.ts | 25 + .../test/golden-test/derived_class.ts | 18 + .../derived_class_meta_input_alias.ts | 14 + .../derived_class_separate_file.ts | 7 + .../different_instantiations_of_reference.ts | 47 + .../golden-test/existing_signal_import.ts | 8 + .../test/golden-test/getters.ts | 20 + .../test/golden-test/host_bindings.ts | 43 + .../test/golden-test/index.ts | 129 +++ .../test/golden-test/index_access_input.ts | 14 + .../test/golden-test/index_spec.ts | 39 + .../test/golden-test/inline_template.ts | 13 + .../test/golden-test/loop_labels.ts | 26 + .../test/golden-test/manual_instantiations.ts | 5 + .../manual_instantiations_external.ts | 8 + .../test/golden-test/mutate.ts | 17 + .../nested_template_prop_access.ts | 18 + .../test/golden-test/object_expansion.ts | 14 + .../test/golden-test/optimize_test.ts | 13 + .../test/golden-test/optional_inputs.ts | 8 + .../golden-test/problematic_type_reference.ts | 24 + .../required-no-explicit-type-extra.ts | 7 + .../golden-test/required-no-explicit-type.ts | 15 + .../test/golden-test/required.ts | 7 + .../test/golden-test/scope_sharing.ts | 19 + .../golden-test/shared_incompatible_scopes.ts | 47 + .../test/golden-test/spy_on.ts | 9 + .../test/golden-test/template.html | 5 + .../test/golden-test/template_ng_if.ts | 24 + .../golden-test/template_object_shorthand.ts | 16 + .../test/golden-test/template_writes.ts | 20 + .../test/golden-test/transform_functions.ts | 22 + .../transform_incompatible_types.ts | 11 + .../test/golden-test/tsconfig.json | 16 + .../test/golden-test/with_getters.ts | 25 + .../golden-test/with_getters_reference.ts | 13 + .../test/golden-test/with_jsdoc.ts | 12 + .../signal-migration/test/golden.txt | 948 ++++++++++++++++++ .../test/golden_test_runner.ts | 64 ++ 46 files changed, 2086 insertions(+) create mode 100644 packages/core/schematics/migrations/signal-migration/test/BUILD.bazel create mode 100644 packages/core/schematics/migrations/signal-migration/test/batch_runner.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/BUILD.bazel create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/any_test.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/base_class.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/both_input_imports.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/catalyst_test.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/cross_references.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_meta_input_alias.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_separate_file.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/different_instantiations_of_reference.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/existing_signal_import.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/getters.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/host_bindings.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/index.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/index_access_input.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/index_spec.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/inline_template.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/loop_labels.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations_external.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/mutate.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/nested_template_prop_access.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/object_expansion.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/optimize_test.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/optional_inputs.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/problematic_type_reference.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type-extra.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/required.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/scope_sharing.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/shared_incompatible_scopes.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/spy_on.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/template.html create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_if.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/template_object_shorthand.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/template_writes.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/transform_functions.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/transform_incompatible_types.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/tsconfig.json create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters_reference.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden-test/with_jsdoc.ts create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden.txt create mode 100644 packages/core/schematics/migrations/signal-migration/test/golden_test_runner.ts diff --git a/packages/core/schematics/migrations/signal-migration/test/BUILD.bazel b/packages/core/schematics/migrations/signal-migration/test/BUILD.bazel new file mode 100644 index 000000000000..1aee0436dc9d --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/BUILD.bazel @@ -0,0 +1,82 @@ +load("@npm//@angular/build-tooling/bazel/integration:index.bzl", "integration_test") +load("//tools:defaults.bzl", "nodejs_binary", "ts_library") + +ts_library( + name = "test_runners_lib", + testonly = True, + srcs = [ + "batch_runner.ts", + "golden_test_runner.ts", + ], + deps = [ + "@npm//@types/diff", + "@npm//chalk", + "@npm//diff", + "@npm//fast-glob", + ], +) + +nodejs_binary( + name = "golden_test_runner", + testonly = True, + data = [":test_runners_lib"], + entry_point = ":golden_test_runner.ts", +) + +nodejs_binary( + name = "batch_runner", + testonly = True, + data = [":test_runners_lib"], + entry_point = ":batch_runner.ts", +) + +integration_test( + name = "test", + srcs = [ + "golden.txt", + "//packages/core/schematics/migrations/signal-migration/test/golden-test:test_files", + ], + commands = [ + "$(rootpath //packages/core/schematics/migrations/signal-migration/src:bin) ./golden-test/tsconfig.json", + "$(rootpath :golden_test_runner) ./golden-test ./golden.txt", + ], + data = [ + ":golden_test_runner", + "//packages/core/schematics/migrations/signal-migration/src:bin", + ], + environment = { + "FORCE_COLOR": "3", + }, +) + +integration_test( + name = "test_batch", + size = "large", + srcs = [ + "golden.txt", + "//packages/core/schematics/migrations/signal-migration/test/golden-test:test_files", + ], + commands = [ + "$(rootpath :batch_runner) analyze ./golden-test", + "$(rootpath :batch_runner) merge ./golden-test", + "$(rootpath :batch_runner) migrate ./golden-test", + "$(rootpath :golden_test_runner) ./golden-test ./golden.txt", + ], + data = [ + ":batch_runner", + ":golden_test_runner", + "//packages/core/schematics/migrations/signal-migration/src:bin", + "//packages/core/schematics/migrations/signal-migration/src/batch:bin", + ], + environment = { + "FORCE_COLOR": "3", + }, + tags = [ + # Only used for manual verification at this point. + # The test is extremely expensive due to no caching between units. + "manual", + ], + tool_mappings = { + "//packages/core/schematics/migrations/signal-migration/src/batch:bin": "migration", + }, +) diff --git a/packages/core/schematics/migrations/signal-migration/test/batch_runner.ts b/packages/core/schematics/migrations/signal-migration/test/batch_runner.ts new file mode 100644 index 000000000000..450a0a07a708 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/batch_runner.ts @@ -0,0 +1,112 @@ +/** + * @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 + */ + +/** + * @fileoverview Executes the given migration phase in batch mode. + * + * I.e. The tsconfig of the project is updated to only consider a single + * file. Then the migration is invoked. + */ + +import * as childProcess from 'child_process'; +import glob from 'fast-glob'; +import path from 'path'; +import fs from 'fs'; +import os from 'os'; + +const maxParallel = os.cpus().length; + +main().catch((e) => { + console.error(e); + process.exitCode = 1; +}); + +async function main() { + const [mode, sourceDir] = process.argv.slice(2); + const files = glob.sync('**/*', {cwd: sourceDir}).filter((f) => f.endsWith('.ts')); + + if (mode === 'analyze') { + const tsconfig = path.join(sourceDir, 'tsconfig.json'); + const baseConfig = JSON.parse(fs.readFileSync(tsconfig, 'utf8')) as any; + + schedule(files, maxParallel, async (fileName) => { + const tmpTsconfigName = path.join(sourceDir, `${fileName}.tsconfig.json`); + const extractResultFile = path.join(sourceDir, `${fileName}.extract.json`); + + // update tsconfig. + await fs.promises.writeFile( + tmpTsconfigName, + JSON.stringify({...baseConfig, include: [fileName]}), + ); + + // execute command. + const extractResult = await promiseExec( + `migration extract ${path.resolve(tmpTsconfigName)}`, + {env: {...process.env, 'LIMIT_TO_ROOT_NAMES_ONLY': '1'}}, + ); + + // write individual result. + await fs.promises.writeFile(extractResultFile, extractResult); + }); + } else if (mode === 'merge') { + const metadataFiles = files.map((f) => path.resolve(path.join(sourceDir, `${f}.extract.json`))); + const mergeResult = await promiseExec(`migration merge ${metadataFiles.join(' ')}`); + + // write merge result. + await fs.promises.writeFile(path.join(sourceDir, 'merged.json'), mergeResult); + } else if (mode === 'migrate') { + schedule(files, maxParallel, async (fileName) => { + const filePath = path.join(sourceDir, fileName); + // tsconfig should exist from analyze phase. + const tmpTsconfigName = path.join(sourceDir, `${fileName}.tsconfig.json`); + const mergeMetadataFile = path.join(sourceDir, 'merged.json'); + + // migrate in parallel. + await promiseExec( + `migration migrate ${path.resolve(tmpTsconfigName)} ${mergeMetadataFile} ${path.resolve(filePath)}`, + {env: {...process.env, 'LIMIT_TO_ROOT_NAMES_ONLY': '1'}}, + ); + }); + } +} + +function promiseExec(command: string, opts?: childProcess.ExecOptions): Promise { + return new Promise((resolve, reject) => { + const proc = childProcess.exec(command, opts); + let stdout = ''; + proc.stdout?.on('data', (d) => (stdout += d.toString('utf8'))); + proc.stderr?.on('data', (d) => process.stderr.write(d.toString('utf8'))); + + proc.on('close', (code, signal) => { + if (code === 0 && signal === null) { + resolve(stdout); + } else { + reject(); + } + }); + }); +} + +async function schedule( + items: T[], + maxParallel: number, + doFn: (v: T) => Promise, +): Promise { + let idx = 0; + let tasks: Promise[] = []; + + while (idx < items.length) { + tasks = []; + while (idx < items.length && tasks.length < maxParallel) { + tasks.push(doFn(items[idx])); + idx++; + } + + await Promise.all(tasks); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/BUILD.bazel b/packages/core/schematics/migrations/signal-migration/test/golden-test/BUILD.bazel new file mode 100644 index 000000000000..3e261fb6bd01 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/BUILD.bazel @@ -0,0 +1,12 @@ +package( + default_visibility = + ["//packages/core/schematics/migrations/signal-migration/test:__pkg__"], +) + +filegroup( + name = "test_files", + srcs = glob( + ["*"], + exclude = ["BUILD.bazel"], + ), +) diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/any_test.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/any_test.ts new file mode 100644 index 000000000000..68dad7969b2e --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/any_test.ts @@ -0,0 +1,23 @@ +// tslint:disable + +import {Input} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; + +function it(msg: string, fn: () => void) {} + +class SubDir { + @Input() name = 'John'; +} + +class MyComp { + @Input() hello = ''; +} + +it('should work', () => { + const fixture = TestBed.createComponent(MyComp); + // `.componentInstance` is using `any` :O + const sub = fixture.debugElement.query(By.directive(SubDir)).componentInstance; + + expect(sub.name).toBe('John'); +}); diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/base_class.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/base_class.ts new file mode 100644 index 000000000000..6183440bcb43 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/base_class.ts @@ -0,0 +1,32 @@ +// tslint:disable + +import {Directive, Input} from '@angular/core'; + +class BaseNonAngular { + disabled: string = ''; +} + +@Directive() +class Sub implements BaseNonAngular { + // should not be migrated because of the interface. + @Input() disabled = ''; +} + +class BaseWithAngular { + @Input() disabled: string = ''; +} + +@Directive() +class Sub2 extends BaseWithAngular { + @Input() disabled = ''; +} + +interface BaseNonAngularInterface { + disabled: string; +} + +@Directive() +class Sub3 implements BaseNonAngularInterface { + // should not be migrated because of the interface. + @Input() disabled = ''; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/both_input_imports.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/both_input_imports.ts new file mode 100644 index 000000000000..141998c3c66b --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/both_input_imports.ts @@ -0,0 +1,14 @@ +// tslint:disable + +import {input, Input} from '@angular/core'; + +class BothInputImported { + @Input() decoratorInput = true; + signalInput = input(); + + @Input() thisCanBeMigrated = true; + + __makeDecoratorInputNonMigratable() { + this.decoratorInput = false; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/catalyst_test.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/catalyst_test.ts new file mode 100644 index 000000000000..8a78a3cec676 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/catalyst_test.ts @@ -0,0 +1,21 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +// angular2/testing/catalyst +// ^^ this allows the advisor to even consider this file. + +function it(msg: string, fn: () => void) {} +function bootstrapTemplate(tmpl: string, inputs: unknown) {} + +class MyComp { + @Input() hello = ''; +} + +it('should work', () => { + const inputs = { + hello: 'Damn', + // TODO: + } as Partial; + bootstrapTemplate('', inputs); +}); diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/cross_references.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/cross_references.ts new file mode 100644 index 000000000000..6b485d0868fc --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/cross_references.ts @@ -0,0 +1,25 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` + {{label}} + `, +}) +class Group { + @Input() label!: string; +} + +@Component({ + template: ` + @if (true) { + {{group.label}} + } + + {{group.label}} + `, +}) +class Option { + constructor(public group: Group) {} +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class.ts new file mode 100644 index 000000000000..97d3d4edf3b6 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class.ts @@ -0,0 +1,18 @@ +// tslint:disable + +import {Input, Directive} from '@angular/core'; + +@Directive() +class Base { + @Input() bla = true; +} + +class Derived extends Base { + override bla = false; +} + +// overridden in separate file +@Directive() +export class Base2 { + @Input() bla = true; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_meta_input_alias.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_meta_input_alias.ts new file mode 100644 index 000000000000..f7d34b27ec3d --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_meta_input_alias.ts @@ -0,0 +1,14 @@ +// tslint:disable + +import {Input, Directive} from '@angular/core'; + +@Directive() +class Base { + // should not be migrated. + @Input() bla = true; +} + +@Directive({ + inputs: [{name: 'bla', alias: 'matDerivedBla'}], +}) +class Derived extends Base {} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_separate_file.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_separate_file.ts new file mode 100644 index 000000000000..19b818e94ae4 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/derived_class_separate_file.ts @@ -0,0 +1,7 @@ +// tslint:disable + +import {Base2} from './derived_class'; + +class DerivedExternal extends Base2 { + override bla = false; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/different_instantiations_of_reference.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/different_instantiations_of_reference.ts new file mode 100644 index 000000000000..45acd13efbcd --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/different_instantiations_of_reference.ts @@ -0,0 +1,47 @@ +// tslint:disable + +import {Input, Directive, Component} from '@angular/core'; + +// Material form field test case + +let nextUniqueId = 0; + +@Directive() +export class MatHint { + align: string = ''; + @Input() id = `mat-hint-${nextUniqueId++}`; +} + +@Component({ + template: ``, +}) +export class MatFormFieldTest { + private declare _hintChildren: MatHint[]; + private _control = true; + private _somethingElse = false; + + private _syncDescribedByIds() { + if (this._control) { + let ids: string[] = []; + + const startHint = this._hintChildren + ? this._hintChildren.find((hint) => hint.align === 'start') + : null; + const endHint = this._hintChildren + ? this._hintChildren.find((hint) => hint.align === 'end') + : null; + + if (startHint) { + ids.push(startHint.id); + } else if (this._somethingElse) { + ids.push(`val:${this._somethingElse}`); + } + + if (endHint) { + // Same input reference `MatHint#id`, but different instantiation! + // Should not be shared!. + ids.push(endHint.id); + } + } + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/existing_signal_import.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/existing_signal_import.ts new file mode 100644 index 000000000000..4f8f3127f9c0 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/existing_signal_import.ts @@ -0,0 +1,8 @@ +// tslint:disable + +import {input, Input} from '@angular/core'; + +class ExistingSignalImport { + signalInput = input(); + @Input() thisCanBeMigrated = true; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/getters.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/getters.ts new file mode 100644 index 000000000000..f7ad6a299fc4 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/getters.ts @@ -0,0 +1,20 @@ +// tslint:disable + +import {Directive, Input} from '@angular/core'; + +@Directive({}) +export class WithGetters { + @Input() + get disabled() { + return this._disabled; + } + set disabled(value: boolean | string) { + this._disabled = typeof value === 'string' ? value === '' : !!value; + } + + private _disabled: boolean = false; + + bla() { + console.log(this._disabled); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/host_bindings.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/host_bindings.ts new file mode 100644 index 000000000000..a8c4edc75c17 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/host_bindings.ts @@ -0,0 +1,43 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: '', + host: { + '[id]': 'id', + '[nested]': 'nested.id', + '[receiverNarrowing]': 'receiverNarrowing ? receiverNarrowing.id', + // normal narrowing is irrelevant as we don't type check host bindings. + }, +}) +class HostBindingTestCmp { + @Input() id = 'works'; + + // for testing nested expressions. + nested = this; + + declare receiverNarrowing: this | undefined; +} + +const SHARED = { + '(click)': 'id', + '(mousedown)': 'id2', +}; + +@Component({ + template: '', + host: SHARED, +}) +class HostBindingsShared { + @Input() id = false; +} + +@Component({ + template: '', + host: SHARED, +}) +class HostBindingsShared2 { + @Input() id = false; + @Input() id2 = false; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/index.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/index.ts new file mode 100644 index 000000000000..c393d365db9d --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/index.ts @@ -0,0 +1,129 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +interface Vehicle {} +interface Car extends Vehicle { + __car: true; +} +interface Audi extends Car { + __audi: true; +} + +@Component({ + selector: 'app-component', + templateUrl: './template.html', +}) +export class AppComponent { + @Input() input: string | null = null; + @Input({transform: disabledTransform, required: true}) bla: boolean = false; + @Input() narrowableMultipleTimes: Vehicle | null = null; + @Input() withUndefinedInput: string | undefined; + @Input() incompatible: string | null = null; + + private _bla: any; + @Input() + set ngSwitch(newValue: any) { + this._bla = newValue; + if (newValue === 0) { + console.log('test'); + } + } + + someControlFlowCase() { + if (this.input) { + this.input.charAt(0); + } + } + + moreComplexControlFlowCase() { + if (!this.input) { + return; + } + + this.doSomething(); + + (() => { + // might be a different input value now?! + // No! it can't because we don't allow writes to "input"!!. + // TODO: This assumption may change if we have a "best effort" mode where we still + // migrate e.g. `"input" even if we see writes. + console.log(this.input.substring(0)); + })(); + } + + doSomething() { + this.incompatible = 'some other value'; + } + + vsd() { + if (!this.input && this.narrowableMultipleTimes !== null) { + return this.narrowableMultipleTimes; + } + return this.input ? 'eager' : 'lazy'; + } + + allTheSameNoNarrowing() { + console.log(this.input); + console.log(this.input); + } + + test() { + if (this.narrowableMultipleTimes) { + console.log(); + + const x = () => { + // @ts-expect-error + if (isCar(this.narrowableMultipleTimes)) { + } + }; + + console.log(); + console.log(); + x(); + x(); + } + } + + extremeNarrowingNested() { + if (this.narrowableMultipleTimes && isCar(this.narrowableMultipleTimes)) { + this.narrowableMultipleTimes.__car; + + let car = this.narrowableMultipleTimes; + let ctx = this; + + function nestedFn() { + if (isAudi(car)) { + console.log(car.__audi); + } + if (!isCar(ctx.narrowableMultipleTimes!) || !isAudi(ctx.narrowableMultipleTimes)) { + return; + } + + ctx.narrowableMultipleTimes.__audi; + } + + // iife + (() => { + if (isAudi(this.narrowableMultipleTimes)) { + this.narrowableMultipleTimes.__audi; + } + })(); + } + } +} + +function disabledTransform(bla: string | boolean): boolean { + return true; +} + +function isCar(v: Vehicle): v is Car { + return true; +} + +function isAudi(v: Car): v is Audi { + return true; +} + +const x: AppComponent = null!; +x.incompatible = null; diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/index_access_input.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/index_access_input.ts new file mode 100644 index 000000000000..fb0d715eb021 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/index_access_input.ts @@ -0,0 +1,14 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({template: ''}) +class IndexAccessInput { + @Input() items: string[] = []; + + bla() { + const {items} = this; + + items[0].charAt(0); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/index_spec.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/index_spec.ts new file mode 100644 index 000000000000..88109a414281 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/index_spec.ts @@ -0,0 +1,39 @@ +// tslint:disable + +import {NgIf} from '@angular/common'; +import {Component, input} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; + +import {AppComponent} from '.'; + +describe('bla', () => { + it('should work', () => { + @Component({ + template: ` + + {{ref.input.ok}} + `, + }) + class TestCmp {} + TestBed.configureTestingModule({ + imports: [AppComponent], + }); + const fixture = TestBed.createComponent(TestCmp); + fixture.detectChanges(); + }); + + it('', () => { + it('', () => { + // Define `Ng2Component` + @Component({ + selector: 'ng2', + standalone: true, + template: '
|
', + imports: [NgIf], + }) + class Ng2Component { + show = input(false); + } + }); + }); +}); diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/inline_template.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/inline_template.ts new file mode 100644 index 000000000000..a3575b802718 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/inline_template.ts @@ -0,0 +1,13 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` +
+
+ `, +}) +export class InlineTmpl { + @Input() justify: 'start' | 'end' = 'end'; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/loop_labels.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/loop_labels.ts new file mode 100644 index 000000000000..81d224685f82 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/loop_labels.ts @@ -0,0 +1,26 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +class MyTestCmp { + @Input({required: true}) someInput!: boolean | string; + + tmpValue = false; + + test() { + for (let i = 0, cell = null; i < Number.MIN_SAFE_INTEGER; i++) { + this.tmpValue = !!this.someInput; + this.tmpValue = !this.someInput; + } + } + + test2() { + while (isBla(this.someInput)) { + this.tmpValue = this.someInput.includes('someText'); + } + } +} + +function isBla(value: any): value is string { + return true; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations.ts new file mode 100644 index 000000000000..94ea5f2239c2 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations.ts @@ -0,0 +1,5 @@ +// tslint:disable + +import {ManualInstantiation} from './manual_instantiations_external'; + +new ManualInstantiation(); diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations_external.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations_external.ts new file mode 100644 index 000000000000..bdee8b4cd18a --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/manual_instantiations_external.ts @@ -0,0 +1,8 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({}) +export class ManualInstantiation { + @Input() bla: string = ''; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/mutate.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/mutate.ts new file mode 100644 index 000000000000..6b9b6655a600 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/mutate.ts @@ -0,0 +1,17 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +export class TestCmp { + @Input() shared: {x: string} = {x: ''}; + + bla() { + this.shared.x = this.doSmth(this.shared); + + this.doSmth(this.shared); + } + + doSmth(v: typeof this.shared): string { + return v.x; + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/nested_template_prop_access.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/nested_template_prop_access.ts new file mode 100644 index 000000000000..de94c17856a7 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/nested_template_prop_access.ts @@ -0,0 +1,18 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +interface Config { + bla?: string; +} + +@Component({ + template: ` + + Test + + `, +}) +export class NestedTemplatePropAccess { + @Input() config: Config = {}; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/object_expansion.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/object_expansion.ts new file mode 100644 index 000000000000..adf8adb76610 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/object_expansion.ts @@ -0,0 +1,14 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({}) +export class ObjectExpansion { + @Input() bla: string = ''; + + expansion() { + const {bla} = this; + + bla.charAt(0); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/optimize_test.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/optimize_test.ts new file mode 100644 index 000000000000..dbd0a3c82224 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/optimize_test.ts @@ -0,0 +1,13 @@ +// tslint:disable + +import {AppComponent} from './index'; + +function assertValidLoadingInput(dir: AppComponent) { + if (dir.withUndefinedInput && dir.narrowableMultipleTimes) { + throw new Error(``); + } + const validInputs = ['auto', 'eager', 'lazy']; + if (typeof dir.withUndefinedInput === 'string' && !validInputs.includes(dir.withUndefinedInput)) { + throw new Error(); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/optional_inputs.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/optional_inputs.ts new file mode 100644 index 000000000000..2124e84f42c6 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/optional_inputs.ts @@ -0,0 +1,8 @@ +// tslint:disable + +import {Directive, Input} from '@angular/core'; + +@Directive() +class OptionalInput { + @Input() bla?: string; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/problematic_type_reference.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/problematic_type_reference.ts new file mode 100644 index 000000000000..da5eadd2a35b --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/problematic_type_reference.ts @@ -0,0 +1,24 @@ +// tslint:disable + +import {Component, Directive, QueryList, Input} from '@angular/core'; + +@Component({ + template: ` + {{label}} + `, +}) +class Group { + @Input() label!: string; +} + +@Directive() +class Base { + _items = new QueryList<{ + label: string; + }>(); +} + +@Directive({}) +class Option extends Base { + _items = new QueryList(); +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type-extra.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type-extra.ts new file mode 100644 index 000000000000..dc78becd7592 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type-extra.ts @@ -0,0 +1,7 @@ +// tslint:disable + +import {ComponentMirror} from '@angular/core'; + +export const COMPLEX_VAR = { + x: null! as ComponentMirror, +}; diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type.ts new file mode 100644 index 000000000000..97c50db3893a --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/required-no-explicit-type.ts @@ -0,0 +1,15 @@ +// tslint:disable + +import {Input} from '@angular/core'; +import {COMPLEX_VAR} from './required-no-explicit-type-extra'; + +export const CONST = {field: true}; + +export class RequiredNoExplicitType { + @Input({required: true}) someInputNumber = 0; + @Input({required: true}) someInput = true; + @Input({required: true}) withConstInitialVal = CONST; + + // typing this explicitly now would require same imports as from the `-extra` file. + @Input({required: true}) complexVal = COMPLEX_VAR; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/required.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/required.ts new file mode 100644 index 000000000000..15994d2c61de --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/required.ts @@ -0,0 +1,7 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +class Required { + @Input() simpleInput!: string; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/scope_sharing.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/scope_sharing.ts new file mode 100644 index 000000000000..d03ed1711880 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/scope_sharing.ts @@ -0,0 +1,19 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +export class TestCmp { + @Input() shared = false; + + bla() { + if (TestCmp.arguments) { + this.someFn(this.shared); + } else { + this.shared.valueOf(); + } + + this.someFn(this.shared); + } + + someFn(bla: boolean): asserts bla is true {} +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/shared_incompatible_scopes.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/shared_incompatible_scopes.ts new file mode 100644 index 000000000000..80b501e6bd67 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/shared_incompatible_scopes.ts @@ -0,0 +1,47 @@ +// tslint:disable + +import {Input, Directive, Component} from '@angular/core'; + +@Directive() +class SomeDir { + @Input({required: true}) bla!: RegExp; +} + +@Component({ + template: ``, +}) +export class ScopeMismatchTest { + eachScopeRedeclared() { + const regexs: RegExp[] = []; + + if (global.console) { + const dir: SomeDir = null!; + regexs.push(dir.bla); + } + + const dir: SomeDir = null!; + regexs.push(dir.bla); + } + + nestedButSharedLocal() { + const regexs: RegExp[] = []; + const dir: SomeDir = null!; + + if (global.console) { + regexs.push(dir.bla); + } + + regexs.push(dir.bla); + } + + dir: SomeDir = null!; + nestedButSharedInClassInstance() { + const regexs: RegExp[] = []; + + if (global.console) { + regexs.push(this.dir.bla); + } + + regexs.push(this.dir.bla); + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/spy_on.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/spy_on.ts new file mode 100644 index 000000000000..184d1d452560 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/spy_on.ts @@ -0,0 +1,9 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +class MyComp { + @Input() myInput = () => {}; +} + +spyOn(new MyComp(), 'myInput').and.returnValue(); diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/template.html b/packages/core/schematics/migrations/signal-migration/test/golden-test/template.html new file mode 100644 index 000000000000..319b4923b7cc --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/template.html @@ -0,0 +1,5 @@ + + {{ input }} + + + diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_if.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_if.ts new file mode 100644 index 000000000000..a6c6e733a0b1 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_ng_if.ts @@ -0,0 +1,24 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` + @if (first) { + {{first}} + } + + + {{second}} + + +
+ {{third}} +
+ `, +}) +export class MyComp { + @Input() first = true; + @Input() second = false; + @Input() third = true; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/template_object_shorthand.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_object_shorthand.ts new file mode 100644 index 000000000000..f484712a3300 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_object_shorthand.ts @@ -0,0 +1,16 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` +
+
+ `, + host: { + '[style]': '{myInput}', + }, +}) +export class TemplateObjectShorthand { + @Input() myInput = true; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/template_writes.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_writes.ts new file mode 100644 index 000000000000..91cf882297f1 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/template_writes.ts @@ -0,0 +1,20 @@ +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` + +
+
+ `, + host: { + '(click)': 'inputC = true', + }, +}) +class TwoWayBinding { + @Input() inputA = ''; + @Input() inputB = true; + @Input() inputC = false; + @Input() inputD = false; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/transform_functions.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/transform_functions.ts new file mode 100644 index 000000000000..01a4d45c4cbe --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/transform_functions.ts @@ -0,0 +1,22 @@ +// tslint:disable + +import {Input} from '@angular/core'; +import {COMPLEX_VAR} from './required-no-explicit-type-extra'; + +function x(v: string | undefined): string | undefined { + return v; +} + +export class TransformFunctions { + // We can check this, and expect `as any` due to transform incompatibility. + @Input({required: true, transform: (v: string | undefined) => ''}) withExplicitTypeWorks: { + ok: true; + } = null!; + + // This will be a synthetic type because we add `undefined` to `boolean`. + @Input({required: true, transform: x}) synthetic1?: boolean; + // Synthetic as we infer a full type from the initial value. Cannot be checked. + @Input({required: true, transform: (v: string | undefined) => ''}) synthetic2 = { + infer: COMPLEX_VAR, + }; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/transform_incompatible_types.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/transform_incompatible_types.ts new file mode 100644 index 000000000000..61f82b0fa98b --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/transform_incompatible_types.ts @@ -0,0 +1,11 @@ +// tslint:disable + +import {Directive, Input} from '@angular/core'; + +// see: button-base Material. + +@Directive() +class TransformIncompatibleTypes { + // @ts-ignore Simulate `--strictPropertyInitialization=false`. + @Input({transform: (v: unknown) => (v === null ? undefined : !!v)}) disabled: boolean; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/tsconfig.json b/packages/core/schematics/migrations/signal-migration/test/golden-test/tsconfig.json new file mode 100644 index 000000000000..f7ba220adb7d --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Node10", + "experimentalDecorators": true, + "strict": true, + "skipLibCheck": true, + "paths": { + "@angular/core": ["../../../../../index.ts"], + "@angular/platform-browser": ["../../../../../../platform-browser/index.ts"] + } + }, + "angularCompilerOptions": {}, + "include": ["**/*.ts"] +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters.ts new file mode 100644 index 000000000000..9af63bc32cb6 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters.ts @@ -0,0 +1,25 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +export class WithSettersAndGetters { + @Input() + set onlySetter(newValue: any) { + this._bla = newValue; + if (newValue === 0) { + console.log('test'); + } + } + private _bla: any; + + @Input() + get accessor(): string { + return ''; + } + set accessor(newValue: string) { + this._accessor = newValue; + } + private _accessor: string = ''; + + @Input() simpleInput!: string; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters_reference.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters_reference.ts new file mode 100644 index 000000000000..fd7ecd4c5143 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/with_getters_reference.ts @@ -0,0 +1,13 @@ +// tslint:disable + +import {WithSettersAndGetters} from './with_getters'; + +class WithGettersExternalRef { + instance: WithSettersAndGetters = null!; + + test() { + if (this.instance.accessor) { + console.log(this.instance.accessor); + } + } +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden-test/with_jsdoc.ts b/packages/core/schematics/migrations/signal-migration/test/golden-test/with_jsdoc.ts new file mode 100644 index 000000000000..3014e23e4873 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden-test/with_jsdoc.ts @@ -0,0 +1,12 @@ +// tslint:disable + +import {Input} from '@angular/core'; + +class WithJsdoc { + /** + * Works + */ + @Input() simpleInput!: string; + + @Input() withCommentInside?: /* intended */ boolean; +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden.txt b/packages/core/schematics/migrations/signal-migration/test/golden.txt new file mode 100644 index 000000000000..1325b6352f11 --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden.txt @@ -0,0 +1,948 @@ +@@@@@@ any_test.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; + +function it(msg: string, fn: () => void) {} + +class SubDir { + name = input('John'); +} + +class MyComp { + hello = input(''); +} + +it('should work', () => { + const fixture = TestBed.createComponent(MyComp); + // `.componentInstance` is using `any` :O + const sub = fixture.debugElement.query(By.directive(SubDir)).componentInstance; + + expect(sub.name()).toBe('John'); +}); +@@@@@@ base_class.ts @@@@@@ + +// tslint:disable + +import {Directive, Input, input} from '@angular/core'; + +class BaseNonAngular { + disabled: string = ''; +} + +@Directive() +class Sub implements BaseNonAngular { + // should not be migrated because of the interface. + @Input() disabled = ''; +} + +class BaseWithAngular { + disabled = input(''); +} + +@Directive() +class Sub2 extends BaseWithAngular { + disabled = input(''); +} + +interface BaseNonAngularInterface { + disabled: string; +} + +@Directive() +class Sub3 implements BaseNonAngularInterface { + // should not be migrated because of the interface. + @Input() disabled = ''; +} +@@@@@@ both_input_imports.ts @@@@@@ + +// tslint:disable + +import {input, Input} from '@angular/core'; + +class BothInputImported { + @Input() decoratorInput = true; + signalInput = input(); + + thisCanBeMigrated = input(true); + + __makeDecoratorInputNonMigratable() { + this.decoratorInput = false; + } +} +@@@@@@ catalyst_test.ts @@@@@@ + +import { UnwrapSignalInputs } from "google3/javascript/angular2/testing/catalyst"; +// tslint:disable + +import {input} from '@angular/core'; + +// angular2/testing/catalyst +// ^^ this allows the advisor to even consider this file. + +function it(msg: string, fn: () => void) {} +function bootstrapTemplate(tmpl: string, inputs: unknown) {} + +class MyComp { + hello = input(''); +} + +it('should work', () => { + const inputs = { + hello: 'Damn', + // TODO: + } as Partial>; + bootstrapTemplate('', inputs); +}); +@@@@@@ cross_references.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({ + template: ` + {{label()}} + `, +}) +class Group { + label = input.required(); +} + +@Component({ + template: ` + @if (true) { + {{group.label()}} + } + + {{group.label()}} + `, +}) +class Option { + constructor(public group: Group) {} +} +@@@@@@ derived_class.ts @@@@@@ + +// tslint:disable + +import {Input, Directive} from '@angular/core'; + +@Directive() +class Base { + @Input() bla = true; +} + +class Derived extends Base { + override bla = false; +} + +// overridden in separate file +@Directive() +export class Base2 { + @Input() bla = true; +} +@@@@@@ derived_class_meta_input_alias.ts @@@@@@ + +// tslint:disable + +import {Input, Directive} from '@angular/core'; + +@Directive() +class Base { + // should not be migrated. + @Input() bla = true; +} + +@Directive({ + inputs: [{name: 'bla', alias: 'matDerivedBla'}], +}) +class Derived extends Base {} +@@@@@@ derived_class_separate_file.ts @@@@@@ + +// tslint:disable + +import {Base2} from './derived_class'; + +class DerivedExternal extends Base2 { + override bla = false; +} +@@@@@@ different_instantiations_of_reference.ts @@@@@@ + +// tslint:disable + +import {input, Directive, Component} from '@angular/core'; + +// Material form field test case + +let nextUniqueId = 0; + +@Directive() +export class MatHint { + align: string = ''; + id = input(`mat-hint-${nextUniqueId++}`); +} + +@Component({ + template: ``, +}) +export class MatFormFieldTest { + private declare _hintChildren: MatHint[]; + private _control = true; + private _somethingElse = false; + + private _syncDescribedByIds() { + if (this._control) { + let ids: string[] = []; + + const startHint = this._hintChildren + ? this._hintChildren.find((hint) => hint.align === 'start') + : null; + const endHint = this._hintChildren + ? this._hintChildren.find((hint) => hint.align === 'end') + : null; + + if (startHint) { + ids.push(startHint.id()); + } else if (this._somethingElse) { + ids.push(`val:${this._somethingElse}`); + } + + if (endHint) { + // Same input reference `MatHint#id`, but different instantiation! + // Should not be shared!. + ids.push(endHint.id()); + } + } + } +} +@@@@@@ existing_signal_import.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; + +class ExistingSignalImport { + signalInput = input(); + thisCanBeMigrated = input(true); +} +@@@@@@ getters.ts @@@@@@ + +// tslint:disable + +import {Directive, Input} from '@angular/core'; + +@Directive({}) +export class WithGetters { + @Input() + get disabled() { + return this._disabled; + } + set disabled(value: boolean | string) { + this._disabled = typeof value === 'string' ? value === '' : !!value; + } + + private _disabled: boolean = false; + + bla() { + console.log(this._disabled); + } +} +@@@@@@ host_bindings.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({ + template: '', + host: { + '[id]': 'id()', + '[nested]': 'nested.id()', + '[receiverNarrowing]': 'receiverNarrowing ? receiverNarrowing.id()', + // normal narrowing is irrelevant as we don't type check host bindings. + }, +}) +class HostBindingTestCmp { + id = input('works'); + + // for testing nested expressions. + nested = this; + + declare receiverNarrowing: this | undefined; +} + +const SHARED = { + '(click)': 'id()', + '(mousedown)': 'id2()', +}; + +@Component({ + template: '', + host: SHARED, +}) +class HostBindingsShared { + id = input(false); +} + +@Component({ + template: '', + host: SHARED, +}) +class HostBindingsShared2 { + id = input(false); + id2 = input(false); +} +@@@@@@ index.ts @@@@@@ + +// tslint:disable + +import {Component, Input, input} from '@angular/core'; + +interface Vehicle {} +interface Car extends Vehicle { + __car: true; +} +interface Audi extends Car { + __audi: true; +} + +@Component({ + selector: 'app-component', + templateUrl: './template.html', +}) +export class AppComponent { + input = input(null); + bla = input.required({ transform: disabledTransform }); + narrowableMultipleTimes = input(null); + withUndefinedInput = input(undefined); + @Input() incompatible: string | null = null; + + private _bla: any; + @Input() + set ngSwitch(newValue: any) { + this._bla = newValue; + if (newValue === 0) { + console.log('test'); + } + } + + someControlFlowCase() { + const input_1 = this.input(); + if (input_1) { + input_1.charAt(0); + } + } + + moreComplexControlFlowCase() { + const input_2 = this.input(); + if (!input_2) { + return; + } + + this.doSomething(); + + (() => { + // might be a different input value now?! + // No! it can't because we don't allow writes to "input"!!. + // TODO: This assumption may change if we have a "best effort" mode where we still + // migrate e.g. `"input" even if we see writes. + console.log(input_2.substring(0)); + })(); + } + + doSomething() { + this.incompatible = 'some other value'; + } + + vsd() { + const input_3 = this.input(); + const narrowableMultipleTimes_1 = this.narrowableMultipleTimes(); + if (!input_3 && narrowableMultipleTimes_1 !== null) { + return narrowableMultipleTimes_1; + } + return input_3 ? 'eager' : 'lazy'; + } + + allTheSameNoNarrowing() { + const input_4 = this.input(); + console.log(input_4); + console.log(input_4); + } + + test() { + if (this.narrowableMultipleTimes()) { + console.log(); + + const x = () => { + // @ts-expect-error + if (isCar(this.narrowableMultipleTimes())) { + } + }; + + console.log(); + console.log(); + x(); + x(); + } + } + + extremeNarrowingNested() { + const narrowableMultipleTimes_2 = this.narrowableMultipleTimes(); + if (narrowableMultipleTimes_2 && isCar(narrowableMultipleTimes_2)) { + narrowableMultipleTimes_2.__car; + + let car = narrowableMultipleTimes_2; + let ctx = this; + + function nestedFn() { + if (isAudi(car)) { + console.log(car.__audi); + } + const narrowableMultipleTimes_3 = ctx.narrowableMultipleTimes(); + if (!isCar(narrowableMultipleTimes_3!) || !isAudi(narrowableMultipleTimes_3)) { + return; + } + + narrowableMultipleTimes_3.__audi; + } + + // iife + (() => { + if (isAudi(narrowableMultipleTimes_2)) { + narrowableMultipleTimes_2.__audi; + } + })(); + } + } +} + +function disabledTransform(bla: string | boolean): boolean { + return true; +} + +function isCar(v: Vehicle): v is Car { + return true; +} + +function isAudi(v: Car): v is Audi { + return true; +} + +const x: AppComponent = null!; +x.incompatible = null; +@@@@@@ index_access_input.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({template: ''}) +class IndexAccessInput { + items = input([]); + + bla() { + const {items} = this; + + items()[0].charAt(0); + } +} +@@@@@@ index_spec.ts @@@@@@ + +// tslint:disable + +import {NgIf} from '@angular/common'; +import {Component, input} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; + +import {AppComponent} from '.'; + +describe('bla', () => { + it('should work', () => { + @Component({ + template: ` + + {{ref.input.ok}} + `, + }) + class TestCmp {} + TestBed.configureTestingModule({ + imports: [AppComponent], + }); + const fixture = TestBed.createComponent(TestCmp); + fixture.detectChanges(); + }); + + it('', () => { + it('', () => { + // Define `Ng2Component` + @Component({ + selector: 'ng2', + standalone: true, + template: '
|
', + imports: [NgIf], + }) + class Ng2Component { + show = input(false); + } + }); + }); +}); +@@@@@@ inline_template.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({ + template: ` +
+
+ `, +}) +export class InlineTmpl { + justify = input<'start' | 'end'>('end'); +} +@@@@@@ loop_labels.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; + +class MyTestCmp { + someInput = input.required(); + + tmpValue = false; + + test() { + for (let i = 0, cell = null; i < Number.MIN_SAFE_INTEGER; i++) { + this.tmpValue = !!this.someInput(); + this.tmpValue = !this.someInput(); + } + } + + test2() { + const someInput_1 = this.someInput(); + while (isBla(someInput_1)) { + this.tmpValue = someInput_1.includes('someText'); + } + } +} + +function isBla(value: any): value is string { + return true; +} +@@@@@@ manual_instantiations.ts @@@@@@ + +// tslint:disable + +import {ManualInstantiation} from './manual_instantiations_external'; + +new ManualInstantiation(); +@@@@@@ manual_instantiations_external.ts @@@@@@ + +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({}) +export class ManualInstantiation { + @Input() bla: string = ''; +} +@@@@@@ mutate.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; + +export class TestCmp { + shared = input<{ + x: string; +}>({ x: '' }); + + bla() { + const shared_1 = this.shared(); + shared_1.x = this.doSmth(shared_1); + + this.doSmth(shared_1); + } + + doSmth(v: typeof this.shared()): string { + return v.x; + } +} +@@@@@@ nested_template_prop_access.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +interface Config { + bla?: string; +} + +@Component({ + template: ` + + Test + + `, +}) +export class NestedTemplatePropAccess { + config = input({}); +} +@@@@@@ object_expansion.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({}) +export class ObjectExpansion { + bla = input(''); + + expansion() { + const {bla} = this; + + bla().charAt(0); + } +} +@@@@@@ optimize_test.ts @@@@@@ + +// tslint:disable + +import {AppComponent} from './index'; + +function assertValidLoadingInput(dir: AppComponent) { + const withUndefinedInput_1 = dir.withUndefinedInput(); + if (withUndefinedInput_1 && dir.narrowableMultipleTimes()) { + throw new Error(``); + } + const validInputs = ['auto', 'eager', 'lazy']; + if (typeof withUndefinedInput_1 === 'string' && !validInputs.includes(withUndefinedInput_1)) { + throw new Error(); + } +} +@@@@@@ optional_inputs.ts @@@@@@ + +// tslint:disable + +import {Directive, input} from '@angular/core'; + +@Directive() +class OptionalInput { + bla = input(undefined); +} +@@@@@@ problematic_type_reference.ts @@@@@@ + +// tslint:disable + +import {Component, Directive, QueryList, Input} from '@angular/core'; + +@Component({ + template: ` + {{label}} + `, +}) +class Group { + @Input() label!: string; +} + +@Directive() +class Base { + _items = new QueryList<{ + label: string; + }>(); +} + +@Directive({}) +class Option extends Base { + _items = new QueryList(); +} +@@@@@@ required-no-explicit-type-extra.ts @@@@@@ + +// tslint:disable + +import {ComponentMirror} from '@angular/core'; + +export const COMPLEX_VAR = { + x: null! as ComponentMirror, +}; +@@@@@@ required-no-explicit-type.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; +import {COMPLEX_VAR} from './required-no-explicit-type-extra'; + +export const CONST = {field: true}; + +export class RequiredNoExplicitType { + someInputNumber = input.required(); + someInput = input.required(); + withConstInitialVal = input.required(); + + // typing this explicitly now would require same imports as from the `-extra` file. + complexVal = input.required(); +} +@@@@@@ required.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; + +class Required { + simpleInput = input.required(); +} +@@@@@@ scope_sharing.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; + +export class TestCmp { + shared = input(false); + + bla() { + const shared_1 = this.shared(); + if (TestCmp.arguments) { + this.someFn(shared_1); + } else { + shared_1.valueOf(); + } + + this.someFn(shared_1); + } + + someFn(bla: boolean): asserts bla is true {} +} +@@@@@@ shared_incompatible_scopes.ts @@@@@@ + +// tslint:disable + +import {input, Directive, Component} from '@angular/core'; + +@Directive() +class SomeDir { + bla = input.required(); +} + +@Component({ + template: ``, +}) +export class ScopeMismatchTest { + eachScopeRedeclared() { + const regexs: RegExp[] = []; + + if (global.console) { + const dir: SomeDir = null!; + regexs.push(dir.bla()); + } + + const dir: SomeDir = null!; + regexs.push(dir.bla()); + } + + nestedButSharedLocal() { + const regexs: RegExp[] = []; + const dir: SomeDir = null!; + + const bla_1 = dir.bla(); + if (global.console) { + regexs.push(bla_1); + } + + regexs.push(bla_1); + } + + dir: SomeDir = null!; + nestedButSharedInClassInstance() { + const regexs: RegExp[] = []; + + const bla_2 = this.dir.bla(); + if (global.console) { + regexs.push(bla_2); + } + + regexs.push(bla_2); + } +} +@@@@@@ spy_on.ts @@@@@@ + +// tslint:disable + +import {Input} from '@angular/core'; + +class MyComp { + @Input() myInput = () => {}; +} + +spyOn(new MyComp(), 'myInput').and.returnValue(); +@@@@@@ template.html @@@@@@ + + + {{ input() }} + + + +@@@@@@ template_ng_if.ts @@@@@@ + +// tslint:disable + +import {Component, Input} from '@angular/core'; + +@Component({ + template: ` + @if (first) { + {{first}} + } + + + {{second}} + + +
+ {{third}} +
+ `, +}) +export class MyComp { + @Input() first = true; + @Input() second = false; + @Input() third = true; +} +@@@@@@ template_object_shorthand.ts @@@@@@ + +// tslint:disable + +import {Component, input} from '@angular/core'; + +@Component({ + template: ` +
+
+ `, + host: { + '[style]': '{myInput: myInput()}', + }, +}) +export class TemplateObjectShorthand { + myInput = input(true); +} +@@@@@@ template_writes.ts @@@@@@ + +// tslint:disable + +import {Component, Input, input} from '@angular/core'; + +@Component({ + template: ` + +
+
+ `, + host: { + '(click)': 'inputC = true', + }, +}) +class TwoWayBinding { + @Input() inputA = ''; + @Input() inputB = true; + @Input() inputC = false; + inputD = input(false); +} +@@@@@@ transform_functions.ts @@@@@@ + +// tslint:disable + +import {Input, input} from '@angular/core'; +import {COMPLEX_VAR} from './required-no-explicit-type-extra'; + +function x(v: string | undefined): string | undefined { + return v; +} + +export class TransformFunctions { + // We can check this, and expect `as any` due to transform incompatibility. + withExplicitTypeWorks = input.required<{ + ok: true; +}, string | undefined>({ transform: ((v: string | undefined) => '') as any }); + + // This will be a synthetic type because we add `undefined` to `boolean`. + synthetic1 = input.required({ transform: x }); + // Synthetic as we infer a full type from the initial value. Cannot be checked. + @Input({required: true, transform: (v: string | undefined) => ''}) synthetic2 = { + infer: COMPLEX_VAR, + }; +} +@@@@@@ transform_incompatible_types.ts @@@@@@ + +// tslint:disable + +import {Directive, input} from '@angular/core'; + +// see: button-base Material. + +@Directive() +class TransformIncompatibleTypes { + // @ts-ignore Simulate `--strictPropertyInitialization=false`. + disabled = input(undefined, { transform: ((v: unknown) => (v === null ? undefined : !!v)) as any }); +} +@@@@@@ with_getters.ts @@@@@@ + +// tslint:disable + +import {Input, input} from '@angular/core'; + +export class WithSettersAndGetters { + @Input() + set onlySetter(newValue: any) { + this._bla = newValue; + if (newValue === 0) { + console.log('test'); + } + } + private _bla: any; + + @Input() + get accessor(): string { + return ''; + } + set accessor(newValue: string) { + this._accessor = newValue; + } + private _accessor: string = ''; + + simpleInput = input.required(); +} +@@@@@@ with_getters_reference.ts @@@@@@ + +// tslint:disable + +import {WithSettersAndGetters} from './with_getters'; + +class WithGettersExternalRef { + instance: WithSettersAndGetters = null!; + + test() { + if (this.instance.accessor) { + console.log(this.instance.accessor); + } + } +} +@@@@@@ with_jsdoc.ts @@@@@@ + +// tslint:disable + +import {input} from '@angular/core'; + +class WithJsdoc { + /** + * Works + */ + simpleInput = input.required(); + + withCommentInside = input(undefined); +} diff --git a/packages/core/schematics/migrations/signal-migration/test/golden_test_runner.ts b/packages/core/schematics/migrations/signal-migration/test/golden_test_runner.ts new file mode 100644 index 000000000000..231c7896eebd --- /dev/null +++ b/packages/core/schematics/migrations/signal-migration/test/golden_test_runner.ts @@ -0,0 +1,64 @@ +/** + * @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 + */ + +/** + * @fileoverview Verifies that the contents of the given migration + * directory match the given golden. + */ + +import fs from 'fs'; +import glob from 'fast-glob'; +import * as diff from 'diff'; +import chalk from 'chalk'; +import path from 'path'; + +const [migratedDir, goldenPath] = process.argv.slice(2); +const files = glob.sync('**/*', {cwd: migratedDir}); + +let golden = ''; +for (const filePath of files) { + if (!filePath.endsWith('.ts') && !filePath.endsWith('.html')) { + continue; + } + + const migrateContent = fs.readFileSync(path.join(migratedDir, filePath), 'utf-8'); + golden += `@@@@@@ ${filePath} @@@@@@\n\n${migrateContent}`; +} + +const diskGolden = fs.readFileSync(goldenPath, 'utf8'); +if (diskGolden !== golden) { + if (process.env['BUILD_WORKING_DIRECTORY']) { + fs.writeFileSync( + path.join( + process.env['BUILD_WORKING_DIRECTORY'], + 'packages/core/schematics/migrations/signal-migration/test/golden.txt', + ), + golden, + ); + console.info('Golden updated.'); + process.exit(0); + } + + const goldenDiff = diff.diffChars(diskGolden, golden); + + goldenDiff.forEach((part) => { + // green for additions, red for deletions + let text = part.added + ? chalk.green(part.value) + : part.removed + ? chalk.red(part.value) + : part.value; + + process.stderr.write(text); + }); + + console.error(); + console.error(); + console.error(chalk.red('Golden does not match.')); + process.exit(1); +} From a50a81cb1aa51f0374e398d79e6cdfa2c6caffc4 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 23 Jul 2024 05:05:19 +0000 Subject: [PATCH 074/143] build: update github/codeql-action action to v3.25.13 (#57091) See associated pull request for more information. PR Close #57091 --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 0e10728f05ec..2cd2654da096 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@4fa2a7953630fd2f3fb380f21be14ede0169dd4f # v3.25.12 + uses: github/codeql-action/upload-sarif@2d790406f505036ef40ecba973cc774a50395aac # v3.25.13 with: sarif_file: results.sarif From 6cbcef237edb42689c6801ac67bd553ea6a08ac0 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 23 Jul 2024 13:57:50 +0200 Subject: [PATCH 075/143] refactor(compiler-cli): add alias option to the import manager (#57096) Updates the import manager to allow for a specific alias to be passed in. This is a prerequisite for switching schematics to the new import manager. Note that passing in an alias disables identifier conflict resolution in order to avoid rewriting the alias that was passed in explicitly. For now this is fine since we have a very narrow use case for it, but we may want to revisit it in the future. PR Close #57096 --- .../translator/src/api/import_generator.ts | 11 ++ .../src/import_manager/import_manager.ts | 23 ++- .../import_manager/reuse_generated_imports.ts | 2 +- .../reuse_source_file_imports.ts | 22 ++- .../translator/test/import_manager_spec.ts | 175 ++++++++++++++++++ 5 files changed, 220 insertions(+), 13 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/translator/src/api/import_generator.ts b/packages/compiler-cli/src/ngtsc/translator/src/api/import_generator.ts index d61b776bb752..79a6bb70c647 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/api/import_generator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/api/import_generator.ts @@ -30,6 +30,17 @@ export interface ImportRequest { * imports are never re-used. E.g. in the linker generator. */ requestedFile: TFile; + + /** + * Specifies an alias under which the symbol can be referenced within + * the file (e.g. `import { symbol as alias } from 'module'`). + * + * !!!Warning!!! passing in this alias is considered unsafe, because the import manager won't + * try to avoid conflicts with existing identifiers in the file if it is specified. As such, + * this option should only be used if the caller has verified that the alias won't conflict + * with anything in the file. + */ + unsafeAliasOverride?: string; } /** diff --git a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts index e0d0858481e3..0d25a3b98201 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts @@ -212,12 +212,23 @@ export class ImportManager } const exportSymbolName = ts.factory.createIdentifier(request.exportSymbolName); - const fileUniqueName = this.config.generateUniqueIdentifier( - sourceFile, - request.exportSymbolName, - ); - const needsAlias = fileUniqueName !== null; - const specifierName = needsAlias ? fileUniqueName : exportSymbolName; + const fileUniqueName = request.unsafeAliasOverride + ? null + : this.config.generateUniqueIdentifier(sourceFile, request.exportSymbolName); + + let needsAlias: boolean; + let specifierName: ts.Identifier; + + if (request.unsafeAliasOverride) { + needsAlias = true; + specifierName = ts.factory.createIdentifier(request.unsafeAliasOverride); + } else if (fileUniqueName !== null) { + needsAlias = true; + specifierName = fileUniqueName; + } else { + needsAlias = false; + specifierName = exportSymbolName; + } namedImports .get(request.exportModuleSpecifier as ModuleName)! diff --git a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_generated_imports.ts b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_generated_imports.ts index 1f1b98a29f8d..ff49dacb462f 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_generated_imports.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_generated_imports.ts @@ -76,5 +76,5 @@ export function captureGeneratedImport( /** Generates a unique hash for the given import request. */ function hashImportRequest(req: ImportRequest): ImportRequestHash { - return `${req.requestedFile.fileName}:${req.exportModuleSpecifier}:${req.exportSymbolName}` as ImportRequestHash; + return `${req.requestedFile.fileName}:${req.exportModuleSpecifier}:${req.exportSymbolName}${req.unsafeAliasOverride ? ':' + req.unsafeAliasOverride : ''}` as ImportRequestHash; } diff --git a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_source_file_imports.ts b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_source_file_imports.ts index 34ce5491a54a..6bfaa48c8d81 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_source_file_imports.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/reuse_source_file_imports.ts @@ -91,12 +91,20 @@ export function attemptToReuseExistingSourceFileImports( if (ts.isNamedImports(namedBindings) && request.exportSymbolName !== null) { const existingElement = namedBindings.elements.find((e) => { // TODO: Consider re-using type-only imports efficiently. - return ( - !e.isTypeOnly && - (e.propertyName + let nameMatches: boolean; + + if (request.unsafeAliasOverride) { + // If a specific alias is passed, both the original name and alias have to match. + nameMatches = + e.propertyName?.text === request.exportSymbolName && + e.name.text === request.unsafeAliasOverride; + } else { + nameMatches = e.propertyName ? e.propertyName.text === request.exportSymbolName - : e.name.text === request.exportSymbolName) - ); + : e.name.text === request.exportSymbolName; + } + + return !e.isTypeOnly && nameMatches; }); if (existingElement !== undefined) { @@ -122,7 +130,9 @@ export function attemptToReuseExistingSourceFileImports( } const symbolsToBeImported = tracker.updatedImports.get(candidateImportToBeUpdated)!; const propertyName = ts.factory.createIdentifier(request.exportSymbolName); - const fileUniqueAlias = tracker.generateUniqueIdentifier(sourceFile, request.exportSymbolName); + const fileUniqueAlias = request.unsafeAliasOverride + ? ts.factory.createIdentifier(request.unsafeAliasOverride) + : tracker.generateUniqueIdentifier(sourceFile, request.exportSymbolName); // Since it can happen that multiple classes need to be imported within the // specified source file and we want to add the identifiers to the existing diff --git a/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts b/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts index 8aafe005599c..ea7847fc7125 100644 --- a/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts +++ b/packages/compiler-cli/src/ngtsc/translator/test/import_manager_spec.ts @@ -716,6 +716,181 @@ describe('import manager', () => { `), ); }); + + it('should allow for a specific alias to be passed in', () => { + const {testFile, emit} = createTestProgram(` + import { input } from "@angular/core"; + + input(); + `); + const manager = new ImportManager(); + + const fooRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'bar', + requestedFile: testFile, + }); + + const res = emit(manager, [ts.factory.createExpressionStatement(fooRef)]); + + expect(res).toBe( + omitLeadingWhitespace(` + import { input, foo as bar } from "@angular/core"; + bar; + input(); + `), + ); + }); + + it('should allow for a specific alias to be passed in when reuse is disabled', () => { + const {testFile, emit} = createTestProgram(` + import { input } from "@angular/core"; + + input(); + `); + const manager = new ImportManager({ + disableOriginalSourceFileReuse: true, + }); + + const fooRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'bar', + requestedFile: testFile, + }); + + const res = emit(manager, [ts.factory.createExpressionStatement(fooRef)]); + + expect(res).toBe( + omitLeadingWhitespace(` + import { input } from "@angular/core"; + import { foo as bar } from "@angular/core"; + bar; + input(); + `), + ); + }); + + it('should reuse a pre-existing import that has the same name and alias', () => { + const {testFile, emit} = createTestProgram(` + import { foo as bar } from "@angular/core"; + bar(); + `); + const manager = new ImportManager(); + + const fooRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'bar', + requestedFile: testFile, + }); + + const res = emit(manager, [ts.factory.createExpressionStatement(fooRef)]); + + expect(res).toBe( + omitLeadingWhitespace(` + import { foo as bar } from "@angular/core"; + bar; + bar(); + `), + ); + }); + + it('should reuse import if both the name and alias are the same when added through `addImport`', () => { + const {testFile, emit} = createTestProgram(''); + const manager = new ImportManager(); + + const firstRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'bar', + requestedFile: testFile, + }); + + const secondRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'bar', + requestedFile: testFile, + }); + + const res = emit(manager, [ + ts.factory.createExpressionStatement(firstRef), + ts.factory.createExpressionStatement(secondRef), + ]); + + expect(res).toBe( + omitLeadingWhitespace(` + import { foo as bar } from "@angular/core"; + bar; + bar; + `), + ); + }); + + it('should not reuse import if symbol is imported under a different alias', () => { + const {testFile, emit} = createTestProgram(''); + const manager = new ImportManager(); + + const barRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'bar', + requestedFile: testFile, + }); + + const bazRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + unsafeAliasOverride: 'baz', + requestedFile: testFile, + }); + + const res = emit(manager, [ + ts.factory.createExpressionStatement(barRef), + ts.factory.createExpressionStatement(bazRef), + ]); + + expect(res).toBe( + omitLeadingWhitespace(` + import { foo as bar, foo as baz } from "@angular/core"; + bar; + baz; + `), + ); + }); + + it('should not attempt to de-duplicate imports with an explicit alias', () => { + const {testFile, emit} = createTestProgram(''); + const manager = new ImportManager(); + + const fooRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'foo', + requestedFile: testFile, + }); + + const barRef = manager.addImport({ + exportModuleSpecifier: '@angular/core', + exportSymbolName: 'bar', + unsafeAliasOverride: 'foo', + requestedFile: testFile, + }); + + const res = emit(manager, [ + ts.factory.createExpressionStatement(fooRef), + ts.factory.createExpressionStatement(barRef), + ]); + + expect(res).toBe( + omitLeadingWhitespace(` + import { foo, bar as foo } from "@angular/core"; + foo; + foo; + `), + ); + }); }); function createTestProgram(text: string): { From b464c3d786b853dd6b6d26363a68c682dfbcf59c Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 23 Jul 2024 14:44:39 +0200 Subject: [PATCH 076/143] refactor(compiler-cli): import manager not picking up some options (#57096) Fixes that the `ImportManager` wasn't picking up some of its configuration options. PR Close #57096 --- .../src/import_manager/import_manager.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts index 0d25a3b98201..0ab55e1b613c 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/import_manager/import_manager.ts @@ -84,16 +84,15 @@ export class ImportManager namespaceImportReuseCache: new Map(), }; - constructor(private _config: Partial = {}) { + constructor(config: Partial = {}) { this.config = { - shouldUseSingleQuotes: () => false, - rewriter: null, - disableOriginalSourceFileReuse: false, - forceGenerateNamespacesForNewImports: false, - namespaceImportPrefix: 'i', + shouldUseSingleQuotes: config.shouldUseSingleQuotes ?? (() => false), + rewriter: config.rewriter ?? null, + disableOriginalSourceFileReuse: config.disableOriginalSourceFileReuse ?? false, + forceGenerateNamespacesForNewImports: config.forceGenerateNamespacesForNewImports ?? false, + namespaceImportPrefix: config.namespaceImportPrefix ?? 'i', generateUniqueIdentifier: - this._config.generateUniqueIdentifier ?? createGenerateUniqueIdentifierHelper(), - ...this._config, + config.generateUniqueIdentifier ?? createGenerateUniqueIdentifierHelper(), }; this.reuseSourceFileImportsTracker = { generateUniqueIdentifier: this.config.generateUniqueIdentifier, From bb977e0ba91b786b99bc2350d1331a2b81616022 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 23 Jul 2024 14:45:15 +0200 Subject: [PATCH 077/143] refactor(migrations): use common import manager for schematics (#57096) Updates the schematics to reuse the common `ImportManager`, instead of having to maintain a separate one. PR Close #57096 --- packages/compiler-cli/private/BUILD.bazel | 1 + packages/compiler-cli/private/migrations.ts | 1 + .../standalone-bootstrap.ts | 2 +- .../test/standalone_migration_spec.ts | 90 ++-- .../core/schematics/utils/change_tracker.ts | 100 +++- .../core/schematics/utils/import_manager.ts | 429 ------------------ 6 files changed, 126 insertions(+), 497 deletions(-) delete mode 100644 packages/core/schematics/utils/import_manager.ts diff --git a/packages/compiler-cli/private/BUILD.bazel b/packages/compiler-cli/private/BUILD.bazel index feaf378c495d..3df6d9441e6f 100644 --- a/packages/compiler-cli/private/BUILD.bazel +++ b/packages/compiler-cli/private/BUILD.bazel @@ -15,6 +15,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/sourcemaps", "//packages/compiler-cli/src/ngtsc/transform/jit", + "//packages/compiler-cli/src/ngtsc/translator", "//packages/compiler-cli/src/ngtsc/typecheck/api", "@npm//typescript", ], diff --git a/packages/compiler-cli/private/migrations.ts b/packages/compiler-cli/private/migrations.ts index 5a11053812e5..9af16069a874 100644 --- a/packages/compiler-cli/private/migrations.ts +++ b/packages/compiler-cli/private/migrations.ts @@ -27,3 +27,4 @@ export { PotentialImportMode, TemplateTypeChecker, } from '../src/ngtsc/typecheck/api'; +export {ImportManager} from '../src/ngtsc/translator'; diff --git a/packages/core/schematics/ng-generate/standalone-migration/standalone-bootstrap.ts b/packages/core/schematics/ng-generate/standalone-migration/standalone-bootstrap.ts index e87fa89db8e2..71989a7ab242 100644 --- a/packages/core/schematics/ng-generate/standalone-migration/standalone-bootstrap.ts +++ b/packages/core/schematics/ng-generate/standalone-migration/standalone-bootstrap.ts @@ -670,7 +670,7 @@ function addNodesToCopy( const symbolName = importSpecifier.propertyName ? importSpecifier.propertyName.text : importSpecifier.name.text; - const alias = importSpecifier.propertyName ? importSpecifier.name.text : null; + const alias = importSpecifier.propertyName ? importSpecifier.name.text : undefined; tracker.addImport(targetFile, symbolName, moduleName, alias); continue; } diff --git a/packages/core/schematics/test/standalone_migration_spec.ts b/packages/core/schematics/test/standalone_migration_spec.ts index 361ea71aeed2..39e9f7567f2d 100644 --- a/packages/core/schematics/test/standalone_migration_spec.ts +++ b/packages/core/schematics/test/standalone_migration_spec.ts @@ -3370,9 +3370,9 @@ describe('standalone migration', () => { expect(stripWhitespace(tree.readContent('main.ts'))).toBe( stripWhitespace(` import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {importProvidersFrom} from '@angular/core'; - import {AppComponent} from './app/app.component'; import {CommonModule} from '@angular/common'; + import {AppComponent} from './app/app.component'; + import {importProvidersFrom} from '@angular/core'; bootstrapApplication(AppComponent, { providers: [importProvidersFrom(CommonModule)] @@ -3383,8 +3383,8 @@ describe('standalone migration', () => { expect(stripWhitespace(tree.readContent('./app/app.component.ts'))).toBe( stripWhitespace(` import {Component} from '@angular/core'; - import {Dir} from './dir'; import {NgIf} from '@angular/common'; + import {Dir} from './dir'; @Component({ template: '
hello
', @@ -3545,11 +3545,11 @@ describe('standalone migration', () => { stripWhitespace(` import {exportedToken, exportedExtraProviders, ExportedClass, exportedFactory, AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {ExternalInterface} from '@external/interfaces'; - import {externalToken as aliasedExternalToken} from './app/externals/other-token'; - import {externalToken} from './app/externals/token'; - import {InternalInterface} from './app/interfaces/internal-interface'; import {InjectionToken} from '@angular/core'; + import {InternalInterface} from './app/interfaces/internal-interface'; + import {externalToken} from './app/externals/token'; + import {externalToken as aliasedExternalToken} from './app/externals/other-token'; + import {ExternalInterface} from '@external/interfaces'; const internalToken = new InjectionToken('internalToken'); const unexportedExtraProviders = [ @@ -3774,10 +3774,10 @@ describe('standalone migration', () => { stripWhitespace(` import {SameFileModule, AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {token} from './token'; - import {NgModule, importProvidersFrom} from '@angular/core'; - import {InternalModule} from './modules/internal.module'; import {CommonModule} from '@angular/common'; + import {InternalModule} from './modules/internal.module'; + import {NgModule, importProvidersFrom} from '@angular/core'; + import {token} from './token'; bootstrapApplication(AppComponent, { providers: [importProvidersFrom(CommonModule, InternalModule, SameFileModule)] @@ -3874,8 +3874,8 @@ describe('standalone migration', () => { stripWhitespace(` import {AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {APP_ROUTES} from './app/routes'; import {provideRouter} from '@angular/router'; + import {APP_ROUTES} from './app/routes'; bootstrapApplication(AppComponent, { providers: [provideRouter(APP_ROUTES)] @@ -3922,8 +3922,8 @@ describe('standalone migration', () => { stripWhitespace(` import {AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {of} from 'rxjs'; import {withPreloading, provideRouter} from '@angular/router'; + import {of} from 'rxjs'; bootstrapApplication(AppComponent, { providers: [provideRouter([], withPreloading(() => of(true)))] @@ -4349,8 +4349,8 @@ describe('standalone migration', () => { stripWhitespace(` import {AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {importProvidersFrom} from '@angular/core'; import {RouterModule} from '@angular/router'; + import {importProvidersFrom} from '@angular/core'; const extraOptions = {useHash: true}; @@ -4443,8 +4443,8 @@ describe('standalone migration', () => { stripWhitespace(` import {AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {importProvidersFrom} from '@angular/core'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; + import {importProvidersFrom} from '@angular/core'; bootstrapApplication(AppComponent, { providers: [importProvidersFrom(BrowserAnimationsModule.withConfig({disableAnimations: true}))] @@ -4575,8 +4575,8 @@ describe('standalone migration', () => { stripWhitespace(` import {AppComponent} from './app/app.module'; import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {importProvidersFrom} from '@angular/core'; import {CommonModule} from '@angular/common'; + import {importProvidersFrom} from '@angular/core'; bootstrapApplication(AppComponent, { providers: [importProvidersFrom(CommonModule)] @@ -4596,44 +4596,44 @@ describe('standalone migration', () => { writeFile( 'main.ts', ` - import {AppModule} from './app/app.module'; - import {platformBrowser} from '@angular/platform-browser'; + import {AppModule} from './app/app.module'; + import {platformBrowser} from '@angular/platform-browser'; - platformBrowser().bootstrapModule(AppModule).catch(e => console.error(e)); - `, + platformBrowser().bootstrapModule(AppModule).catch(e => console.error(e)); + `, ); writeFile( './app/root.module.ts', ` - import {NgModule, Component, InjectionToken} from '@angular/core'; + import {NgModule, Component, InjectionToken} from '@angular/core'; - const token = new InjectionToken('token'); + const token = new InjectionToken('token'); - @Component({selector: 'root-comp', template: '', standalone: true}) - export class Root {} + @Component({selector: 'root-comp', template: '', standalone: true}) + export class Root {} - @NgModule({ - imports: [Root], - exports: [Root], - providers: [{provide: token, useValue: 'hello'}] - }) - export class RootModule {} - `, + @NgModule({ + imports: [Root], + exports: [Root], + providers: [{provide: token, useValue: 'hello'}] + }) + export class RootModule {} + `, ); writeFile( './app/app.module.ts', ` - import {NgModule, Component} from '@angular/core'; - import {RootModule, Root} from './root.module'; + import {NgModule, Component} from '@angular/core'; + import {RootModule, Root} from './root.module'; - @NgModule({ - imports: [RootModule], - bootstrap: [Root] - }) - export class AppModule {} - `, + @NgModule({ + imports: [RootModule], + bootstrap: [Root] + }) + export class AppModule {} + `, ); await runMigration('standalone-bootstrap'); @@ -4641,14 +4641,14 @@ describe('standalone migration', () => { expect(tree.exists('./app/app.module.ts')).toBe(false); expect(stripWhitespace(tree.readContent('main.ts'))).toBe( stripWhitespace(` - import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; - import {importProvidersFrom} from '@angular/core'; - import {RootModule, Root} from './app/root.module'; + import {platformBrowser, bootstrapApplication} from '@angular/platform-browser'; + import {RootModule, Root} from './app/root.module'; + import {importProvidersFrom} from '@angular/core'; - bootstrapApplication(Root, { - providers: [importProvidersFrom(RootModule)] - }).catch(e => console.error(e)); - `), + bootstrapApplication(Root, { + providers: [importProvidersFrom(RootModule)] + }).catch(e => console.error(e)); + `), ); }); diff --git a/packages/core/schematics/utils/change_tracker.ts b/packages/core/schematics/utils/change_tracker.ts index c6e860aa53ae..a6081ced32f6 100644 --- a/packages/core/schematics/utils/change_tracker.ts +++ b/packages/core/schematics/utils/change_tracker.ts @@ -7,8 +7,7 @@ */ import ts from 'typescript'; - -import {ImportManager} from './import_manager'; +import {ImportManager} from '@angular/compiler-cli/private/migrations'; /** Function that can be used to remap a generated import. */ export type ImportRemapper = (moduleName: string, inFile: string) => string; @@ -29,23 +28,25 @@ export interface PendingChange { text: string; } +/** Supported quotes for generated imports. */ +const enum QuoteKind { + SINGLE, + DOUBLE, +} + /** Tracks changes that have to be made for specific files. */ export class ChangeTracker { private readonly _changes = new Map(); private readonly _importManager: ImportManager; + private readonly _quotesCache = new WeakMap(); constructor( private _printer: ts.Printer, private _importRemapper?: ImportRemapper, ) { - this._importManager = new ImportManager( - (currentFile) => ({ - addNewImport: (start, text) => this.insertText(currentFile, start, text), - updateExistingImport: (namedBindings, text) => - this.replaceText(currentFile, namedBindings.getStart(), namedBindings.getWidth(), text), - }), - this._printer, - ); + this._importManager = new ImportManager({ + shouldUseSingleQuotes: (file) => this._getQuoteKind(file) === QuoteKind.SINGLE, + }); } /** @@ -111,14 +112,12 @@ export class ChangeTracker { * @param symbolName Symbol being imported. * @param moduleName Module from which the symbol is imported. * @param alias Alias to use for the import. - * @param keepSymbolName Whether to keep the symbol name in the import. */ addImport( sourceFile: ts.SourceFile, symbolName: string, moduleName: string, - alias: string | null = null, - keepSymbolName = false, + alias?: string, ): ts.Expression { if (this._importRemapper) { moduleName = this._importRemapper(moduleName, sourceFile.fileName); @@ -129,14 +128,16 @@ export class ChangeTracker { // paths will also cause TS to escape the forward slashes. moduleName = normalizePath(moduleName); - return this._importManager.addImportToSourceFile( - sourceFile, - symbolName, - moduleName, - alias, - false, - keepSymbolName, - ); + if (!this._changes.has(sourceFile)) { + this._changes.set(sourceFile, []); + } + + return this._importManager.addImport({ + requestedFile: sourceFile, + exportSymbolName: symbolName, + exportModuleSpecifier: moduleName, + unsafeAliasOverride: alias, + }); } /** @@ -144,7 +145,7 @@ export class ChangeTracker { * The changes are sorted in the order in which they should be applied. */ recordChanges(): ChangesByFile { - this._importManager.recordChanges(); + this._recordImports(); return this._changes; } @@ -178,6 +179,61 @@ export class ChangeTracker { this._changes.set(file, [change]); } } + + /** Determines what kind of quotes to use for a specific file. */ + private _getQuoteKind(sourceFile: ts.SourceFile): QuoteKind { + if (this._quotesCache.has(sourceFile)) { + return this._quotesCache.get(sourceFile)!; + } + + let kind = QuoteKind.SINGLE; + + for (const statement of sourceFile.statements) { + if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) { + kind = statement.moduleSpecifier.getText()[0] === '"' ? QuoteKind.DOUBLE : QuoteKind.SINGLE; + this._quotesCache.set(sourceFile, kind); + break; + } + } + + return kind; + } + + /** Records the pending import changes from the import manager. */ + private _recordImports(): void { + const {newImports, updatedImports} = this._importManager.finalize(); + + for (const [original, replacement] of updatedImports) { + this.replaceNode(original, replacement); + } + + for (const [sourceFile] of this._changes) { + const importsToAdd = newImports.get(sourceFile.fileName); + + if (!importsToAdd) { + continue; + } + + const importLines: string[] = []; + let lastImport: ts.ImportDeclaration | null = null; + + for (const statement of sourceFile.statements) { + if (ts.isImportDeclaration(statement)) { + lastImport = statement; + } + } + + for (const decl of importsToAdd) { + importLines.push(this._printer.printNode(ts.EmitHint.Unspecified, decl, sourceFile)); + } + + this.insertText( + sourceFile, + lastImport ? lastImport.getEnd() : 0, + (lastImport ? '\n' : '') + importLines.join('\n'), + ); + } + } } /** Normalizes a path to use posix separators. */ diff --git a/packages/core/schematics/utils/import_manager.ts b/packages/core/schematics/utils/import_manager.ts deleted file mode 100644 index 282c577dc128..000000000000 --- a/packages/core/schematics/utils/import_manager.ts +++ /dev/null @@ -1,429 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {dirname, resolve} from 'path'; -import ts from 'typescript'; - -/** Update recorder for managing imports. */ -export interface ImportManagerUpdateRecorder { - addNewImport(start: number, importText: string): void; - updateExistingImport(namedBindings: ts.NamedImports, newNamedBindings: string): void; -} - -/** Possible types of quotes for imports. */ -const enum QuoteStyle { - Single, - Double, -} - -/** - * Import manager that can be used to add TypeScript imports to given source - * files. The manager ensures that multiple transformations are applied properly - * without shifted offsets and that similar existing import declarations are re-used. - */ -export class ImportManager { - /** Map of import declarations that need to be updated to include the given symbols. */ - private updatedImports = new Map< - ts.ImportDeclaration, - {propertyName?: ts.Identifier; importName: ts.Identifier}[] - >(); - /** Map of source-files and their previously used identifier names. */ - private usedIdentifierNames = new Map(); - /** Map of source files and the new imports that have to be added to them. */ - private newImports: Map< - ts.SourceFile, - { - importStartIndex: number; - defaultImports: Map; - namedImports: Map; - } - > = new Map(); - /** Map between a file and the implied quote style for imports. */ - private quoteStyles: Record = {}; - - /** - * Array of previously resolved symbol imports. Cache can be re-used to return - * the same identifier without checking the source-file again. - */ - private importCache: { - sourceFile: ts.SourceFile; - symbolName: string | null; - alias: string | null; - moduleName: string; - identifier: ts.Identifier; - }[] = []; - - constructor( - private getUpdateRecorder: (sf: ts.SourceFile) => ImportManagerUpdateRecorder, - private printer: ts.Printer, - ) {} - - /** - * Adds an import to the given source-file and returns the TypeScript - * identifier that can be used to access the newly imported symbol. - */ - addImportToSourceFile( - sourceFile: ts.SourceFile, - symbolName: string | null, - moduleName: string, - alias: string | null = null, - typeImport = false, - keepSymbolName = false, - ): ts.Expression { - const sourceDir = dirname(sourceFile.fileName); - let importStartIndex = 0; - let existingImport: ts.ImportDeclaration | null = null; - - // In case the given import has been already generated previously, we just return - // the previous generated identifier in order to avoid duplicate generated imports. - const cachedImport = this.importCache.find( - (c) => - c.sourceFile === sourceFile && - c.symbolName === symbolName && - c.moduleName === moduleName && - c.alias === alias, - ); - if (cachedImport) { - return cachedImport.identifier; - } - - // Walk through all source-file top-level statements and search for import declarations - // that already match the specified "moduleName" and can be updated to import the - // given symbol. If no matching import can be found, the last import in the source-file - // will be used as starting point for a new import that will be generated. - for (let i = sourceFile.statements.length - 1; i >= 0; i--) { - const statement = sourceFile.statements[i]; - - if ( - !ts.isImportDeclaration(statement) || - !ts.isStringLiteral(statement.moduleSpecifier) || - !statement.importClause - ) { - continue; - } - - if (importStartIndex === 0) { - importStartIndex = this._getEndPositionOfNode(statement); - } - - const moduleSpecifier = statement.moduleSpecifier.text; - - if ( - (moduleSpecifier.startsWith('.') && - resolve(sourceDir, moduleSpecifier) !== resolve(sourceDir, moduleName)) || - moduleSpecifier !== moduleName - ) { - continue; - } - - if (statement.importClause.namedBindings) { - const namedBindings = statement.importClause.namedBindings; - - // In case a "Type" symbol is imported, we can't use namespace imports - // because these only export symbols available at runtime (no types) - if (ts.isNamespaceImport(namedBindings) && !typeImport) { - return ts.factory.createPropertyAccessExpression( - ts.factory.createIdentifier(namedBindings.name.text), - ts.factory.createIdentifier(alias || symbolName || 'default'), - ); - } else if (ts.isNamedImports(namedBindings) && symbolName) { - const existingElement = namedBindings.elements.find((e) => { - // TODO(crisbeto): if an alias conflicts with an existing import, it may cause invalid - // code to be generated. This is unlikely, but we may want to revisit it in the future. - if (alias) { - return e.propertyName && e.name.text === alias && e.propertyName.text === symbolName; - } - return e.propertyName ? e.propertyName.text === symbolName : e.name.text === symbolName; - }); - - if (existingElement) { - return ts.factory.createIdentifier(existingElement.name.text); - } - - // In case the symbol could not be found in an existing import, we - // keep track of the import declaration as it can be updated to include - // the specified symbol name without having to create a new import. - existingImport = statement; - } - } else if (statement.importClause.name && !symbolName) { - return ts.factory.createIdentifier(statement.importClause.name.text); - } - } - - if (existingImport) { - const {propertyName, name} = this._getImportParts( - sourceFile, - symbolName!, - alias, - keepSymbolName, - ); - - // Since it can happen that multiple classes need to be imported within the - // specified source file and we want to add the identifiers to the existing - // import declaration, we need to keep track of the updated import declarations. - // We can't directly update the import declaration for each identifier as this - // would throw off the recorder offsets. We need to keep track of the new identifiers - // for the import and perform the import transformation as batches per source-file. - this.updatedImports.set( - existingImport, - (this.updatedImports.get(existingImport) || []).concat({propertyName, importName: name}), - ); - - // Keep track of all updated imports so that we don't generate duplicate - // similar imports as these can't be statically analyzed in the source-file yet. - this.importCache.push({sourceFile, moduleName, symbolName, alias, identifier: name}); - - return name; - } - - let identifier: ts.Identifier | null = null; - - if (!this.newImports.has(sourceFile)) { - this.newImports.set(sourceFile, { - importStartIndex, - defaultImports: new Map(), - namedImports: new Map(), - }); - } - - if (symbolName) { - const {propertyName, name} = this._getImportParts( - sourceFile, - symbolName, - alias, - keepSymbolName, - ); - const importMap = this.newImports.get(sourceFile)!.namedImports; - identifier = name; - - if (!importMap.has(moduleName)) { - importMap.set(moduleName, []); - } - - importMap.get(moduleName)!.push(ts.factory.createImportSpecifier(false, propertyName, name)); - } else { - const importMap = this.newImports.get(sourceFile)!.defaultImports; - identifier = this._getUniqueIdentifier(sourceFile, 'defaultExport'); - importMap.set(moduleName, identifier); - } - - // Keep track of all generated imports so that we don't generate duplicate - // similar imports as these can't be statically analyzed in the source-file yet. - this.importCache.push({sourceFile, symbolName, moduleName, alias, identifier}); - - return identifier; - } - - /** - * Stores the collected import changes within the appropriate update recorders. The - * updated imports can only be updated *once* per source-file because previous updates - * could otherwise shift the source-file offsets. - */ - recordChanges() { - this.updatedImports.forEach((expressions, importDecl) => { - const sourceFile = importDecl.getSourceFile(); - const recorder = this.getUpdateRecorder(sourceFile); - const namedBindings = importDecl.importClause!.namedBindings as ts.NamedImports; - const newNamedBindings = ts.factory.updateNamedImports( - namedBindings, - namedBindings.elements.concat( - expressions.map(({propertyName, importName}) => - ts.factory.createImportSpecifier(false, propertyName, importName), - ), - ), - ); - - const newNamedBindingsText = this.printer.printNode( - ts.EmitHint.Unspecified, - newNamedBindings, - sourceFile, - ); - recorder.updateExistingImport(namedBindings, newNamedBindingsText); - }); - - this.newImports.forEach(({importStartIndex, defaultImports, namedImports}, sourceFile) => { - const recorder = this.getUpdateRecorder(sourceFile); - const useSingleQuotes = this._getQuoteStyle(sourceFile) === QuoteStyle.Single; - - defaultImports.forEach((identifier, moduleName) => { - const newImport = ts.factory.createImportDeclaration( - undefined, - ts.factory.createImportClause(false, identifier, undefined), - ts.factory.createStringLiteral(moduleName, useSingleQuotes), - ); - - recorder.addNewImport( - importStartIndex, - this._getNewImportText(importStartIndex, newImport, sourceFile), - ); - }); - - namedImports.forEach((specifiers, moduleName) => { - const newImport = ts.factory.createImportDeclaration( - undefined, - ts.factory.createImportClause( - false, - undefined, - ts.factory.createNamedImports(specifiers), - ), - ts.factory.createStringLiteral(moduleName, useSingleQuotes), - ); - - recorder.addNewImport( - importStartIndex, - this._getNewImportText(importStartIndex, newImport, sourceFile), - ); - }); - }); - } - - /** Gets an unique identifier with a base name for the given source file. */ - private _getUniqueIdentifier(sourceFile: ts.SourceFile, baseName: string): ts.Identifier { - if (this.isUniqueIdentifierName(sourceFile, baseName)) { - this._recordUsedIdentifier(sourceFile, baseName); - return ts.factory.createIdentifier(baseName); - } - - let name = null; - let counter = 1; - do { - name = `${baseName}_${counter++}`; - } while (!this.isUniqueIdentifierName(sourceFile, name)); - - this._recordUsedIdentifier(sourceFile, name!); - return ts.factory.createIdentifier(name!); - } - - /** - * Checks whether the specified identifier name is used within the given - * source file. - */ - private isUniqueIdentifierName(sourceFile: ts.SourceFile, name: string) { - if ( - this.usedIdentifierNames.has(sourceFile) && - this.usedIdentifierNames.get(sourceFile)!.indexOf(name) !== -1 - ) { - return false; - } - - // Walk through the source file and search for an identifier matching - // the given name. In that case, it's not guaranteed that this name - // is unique in the given declaration scope and we just return false. - const nodeQueue: ts.Node[] = [sourceFile]; - while (nodeQueue.length) { - const node = nodeQueue.shift()!; - if ( - ts.isIdentifier(node) && - node.text === name && - // Identifiers that are aliased in an import aren't - // problematic since they're used under a different name. - (!ts.isImportSpecifier(node.parent) || node.parent.propertyName !== node) - ) { - return false; - } - nodeQueue.push(...node.getChildren()); - } - return true; - } - - private _recordUsedIdentifier(sourceFile: ts.SourceFile, identifierName: string) { - this.usedIdentifierNames.set( - sourceFile, - (this.usedIdentifierNames.get(sourceFile) || []).concat(identifierName), - ); - } - - /** - * Determines the full end of a given node. By default the end position of a node is - * before all trailing comments. This could mean that generated imports shift comments. - */ - private _getEndPositionOfNode(node: ts.Node) { - const nodeEndPos = node.getEnd(); - const commentRanges = ts.getTrailingCommentRanges(node.getSourceFile().text, nodeEndPos); - if (!commentRanges || !commentRanges.length) { - return nodeEndPos; - } - return commentRanges[commentRanges.length - 1]!.end; - } - - /** Gets the text that should be added to the file for a newly-created import declaration. */ - private _getNewImportText( - importStartIndex: number, - newImport: ts.ImportDeclaration, - sourceFile: ts.SourceFile, - ): string { - const text = this.printer.printNode(ts.EmitHint.Unspecified, newImport, sourceFile); - - // If the import is generated at the start of the source file, we want to add - // a new-line after the import. Otherwise if the import is generated after an - // existing import, we need to prepend a new-line so that the import is not on - // the same line as the existing import anchor - return importStartIndex === 0 ? `${text}\n` : `\n${text}`; - } - - /** - * Gets the different parts necessary to construct an import specifier. - * @param sourceFile File in which the import is being inserted. - * @param symbolName Name of the symbol. - * @param alias Alias that the symbol may be available under. - * @returns Object containing the different parts. E.g. `{name: 'alias', propertyName: 'name'}` - * would correspond to `import {name as alias}` while `{name: 'name', propertyName: undefined}` - * corresponds to `import {name}`. - */ - private _getImportParts( - sourceFile: ts.SourceFile, - symbolName: string, - alias: string | null, - keepSymbolName: boolean, - ) { - const symbolIdentifier = ts.factory.createIdentifier(symbolName); - const aliasIdentifier = alias ? ts.factory.createIdentifier(alias) : null; - const generatedUniqueIdentifier = this._getUniqueIdentifier(sourceFile, alias || symbolName); - const needsGeneratedUniqueName = generatedUniqueIdentifier.text !== (alias || symbolName); - let propertyName: ts.Identifier | undefined; - let name: ts.Identifier; - - if (needsGeneratedUniqueName && !keepSymbolName) { - propertyName = symbolIdentifier; - name = generatedUniqueIdentifier; - } else if (aliasIdentifier) { - propertyName = symbolIdentifier; - name = aliasIdentifier; - } else { - name = symbolIdentifier; - } - - return {propertyName, name}; - } - - /** Gets the quote style that is used for a file's imports. */ - private _getQuoteStyle(sourceFile: ts.SourceFile): QuoteStyle { - if (!this.quoteStyles.hasOwnProperty(sourceFile.fileName)) { - let quoteStyle: QuoteStyle | undefined; - - // Walk through the top-level imports and try to infer the quotes. - for (const statement of sourceFile.statements) { - if ( - ts.isImportDeclaration(statement) && - ts.isStringLiteralLike(statement.moduleSpecifier) - ) { - // Use `getText` instead of the actual text since it includes the quotes. - quoteStyle = statement.moduleSpecifier.getText().trim().startsWith('"') - ? QuoteStyle.Double - : QuoteStyle.Single; - break; - } - } - - // Otherwise fall back to single quotes. - this.quoteStyles[sourceFile.fileName] = quoteStyle ?? QuoteStyle.Single; - } - - return this.quoteStyles[sourceFile.fileName]; - } -} From d7860a5a138640b5eb7c1aa398e1af02a711f4e6 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 23 Jul 2024 05:05:27 +0000 Subject: [PATCH 078/143] build: update all non-major dependencies (#57092) See associated pull request for more information. PR Close #57092 --- .../first-app/common/package-lock.json | 8 ++-- .../tutorials/first-app/common/package.json | 2 +- package.json | 6 +-- yarn.lock | 43 ++++++++++++------- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/adev/src/content/tutorials/first-app/common/package-lock.json b/adev/src/content/tutorials/first-app/common/package-lock.json index 979dfab2447a..8d1dca44aa79 100644 --- a/adev/src/content/tutorials/first-app/common/package-lock.json +++ b/adev/src/content/tutorials/first-app/common/package-lock.json @@ -26,7 +26,7 @@ "@types/jasmine": "~5.1.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", - "jasmine-core": "~5.1.0", + "jasmine-core": "~5.2.0", "jasmine-marbles": "~0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", @@ -8831,9 +8831,9 @@ } }, "node_modules/jasmine-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz", - "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.2.0.tgz", + "integrity": "sha512-tSAtdrvWybZkQmmaIoDgnvHG8ORUNw5kEVlO5CvrXj02Jjr9TZrmjFq7FUiOUzJiOP2wLGYT6PgrQgQF4R1xiw==", "dev": true }, "node_modules/jasmine-marbles": { diff --git a/adev/src/content/tutorials/first-app/common/package.json b/adev/src/content/tutorials/first-app/common/package.json index 624e9d4c1425..76c403ff4309 100644 --- a/adev/src/content/tutorials/first-app/common/package.json +++ b/adev/src/content/tutorials/first-app/common/package.json @@ -27,7 +27,7 @@ "@types/jasmine": "~5.1.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", - "jasmine-core": "~5.1.0", + "jasmine-core": "~5.2.0", "jasmine-marbles": "~0.9.2", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.0", diff --git a/package.json b/package.json index 6fa8a0fad7df..00e560253463 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "domino": "https://github.com/angular/domino.git#8f228f8862540c6ccd14f76b5a1d9bb5458618af", "hammerjs": "~2.0.8", "http-server": "^14.0.0", - "jasmine": "~5.1.0", + "jasmine": "~5.2.0", "jasmine-ajax": "^4.0.0", "jasmine-core": "^5.0.0", "karma": "~6.4.0", @@ -134,7 +134,7 @@ "rollup-plugin-sourcemaps": "^0.6.3", "rxjs": "^7.0.0", "selenium-webdriver": "3.5.0", - "selenium-webdriver4": "npm:selenium-webdriver@4.22.0", + "selenium-webdriver4": "npm:selenium-webdriver@4.23.0", "semver-dsl": "^1.0.1", "shelljs": "^0.8.5", "source-map": "0.7.4", @@ -199,7 +199,7 @@ "gsap": "^3.12.3", "gulp": "^5.0.0", "gulp-conventional-changelog": "^5.0.0", - "husky": "9.0.11", + "husky": "9.1.1", "inquirer": "^10.0.0", "jsdom": "^24.0.0", "karma-coverage": "^2.2.1", diff --git a/yarn.lock b/yarn.lock index 92180c24e178..33f1b5784bb0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1791,7 +1791,7 @@ dependencies: "@bazel/worker" "5.8.1" -"@bazel/runfiles@5.8.1": +"@bazel/runfiles@5.8.1", "@bazel/runfiles@^5.8.1": version "5.8.1" resolved "https://registry.yarnpkg.com/@bazel/runfiles/-/runfiles-5.8.1.tgz#737d5b3dc9739767054820265cfe432a80564c82" integrity sha512-NDdfpdQ6rZlylgv++iMn5FkObC/QlBQvipinGLSOguTYpRywmieOyJ29XHvUilspwTFSILWpoE9CqMGkHXug1g== @@ -10137,10 +10137,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -husky@9.0.11: - version "9.0.11" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" - integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== +husky@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.1.tgz#73f8f1b58329f377654293148c1a6458f54ca224" + integrity sha512-fCqlqLXcBnXa/TJXmT93/A36tJsjdJkibQ1MuIiFyCCYUlpYpIaj2mv1w+3KR6Rzu1IC3slFTje5f6DUp2A2rg== hyperdyperid@^1.2.0: version "1.2.0" @@ -10900,7 +10900,7 @@ jasmine-core@^4.1.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.1.tgz#5ebb8afa07282078f8d7b15871737a83b74e58f2" integrity sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ== -jasmine-core@^5.0.0, jasmine-core@~5.1.0: +jasmine-core@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.1.2.tgz#8f2789faa79ef1ffad7abab6bff8d4bd661094f7" integrity sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA== @@ -10910,6 +10910,11 @@ jasmine-core@~2.8.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" integrity sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ== +jasmine-core@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-5.2.0.tgz#7d0aa4c26cb3dbaed201d0505489baf1e48faeca" + integrity sha512-tSAtdrvWybZkQmmaIoDgnvHG8ORUNw5kEVlO5CvrXj02Jjr9TZrmjFq7FUiOUzJiOP2wLGYT6PgrQgQF4R1xiw== + jasmine-reporters@~2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/jasmine-reporters/-/jasmine-reporters-2.5.2.tgz#b5dfa1d9c40b8020c5225e0e1e2b9953d66a4d69" @@ -10927,13 +10932,13 @@ jasmine@2.8.0: glob "^7.0.6" jasmine-core "~2.8.0" -jasmine@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-5.1.0.tgz#a3218fd425ff35aec12f3dc6cf70d8cebbf0042a" - integrity sha512-prmJlC1dbLhti4nE4XAPDWmfJesYO15sjGXVp7Cs7Ym5I9Xtwa/hUHxxJXjnpfLO72+ySttA0Ztf8g/RiVnUKw== +jasmine@~5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-5.2.0.tgz#caa318ac1ccf966b2768e092137337621cdd3ca9" + integrity sha512-il+noV96N1BGU9/FMmc8QtAMxC8lPnXUiAvgb0o9MDZATRdxglTQe9wo6UdL049ropQL6MopDYwDlludKR6wJQ== dependencies: glob "^10.2.2" - jasmine-core "~5.1.0" + jasmine-core "~5.2.0" jasminewd2@^2.1.0: version "2.2.0" @@ -14638,14 +14643,15 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -"selenium-webdriver4@npm:selenium-webdriver@4.22.0": - version "4.22.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.22.0.tgz#da9426aed5004ef16532010224b41a3a8b8dd132" - integrity sha512-GNbrkCHmy249ai885wgXqTfqL2lZnclUH/P8pwTDIqzyFxU3YhDiN7p/c9tMFA4NhgRdEBO2QCG+CWmG7xr/Mw== +"selenium-webdriver4@npm:selenium-webdriver@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.23.0.tgz#6d9d219a560dffff1fbbc0f2c8a115d81d279a21" + integrity sha512-DdvtInpnMt95Td8VApvmAw7oSydBD9twIRXqoMyRoGMvL1dAnMFxdrwnW6L0d/pF/uoNTjbVUarwGZ9wIGNStA== dependencies: + "@bazel/runfiles" "^5.8.1" jszip "^3.10.1" tmp "^0.2.3" - ws ">=8.16.0" + ws "^8.17.1" selenium-webdriver@3.5.0: version "3.5.0" @@ -17089,6 +17095,11 @@ ws@^7.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== +ws@^8.17.1: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + ws@~8.11.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" From c578239d6ce39273f010541c70cc9fbcdf43dd34 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 23 Jul 2024 09:24:50 -0700 Subject: [PATCH 079/143] test(docs-infra): update adev tests to be zoneless (#57100) Updates adev tests to use zoneless and remove fakeAsync/waitForAsync/tick PR Close #57100 --- adev/BUILD.bazel | 1 + adev/angular.json | 2 +- .../progress-bar.component.spec.ts | 8 +++--- .../code-mirror-editor.service.spec.ts | 12 +++++---- .../node-runtime-sandbox.service.spec.ts | 3 ++- .../editor/preview/preview.component.spec.ts | 8 +++--- .../terminal/terminal.component.spec.ts | 8 +++--- ...i-reference-details-page.component.spec.ts | 10 +++---- adev/test-main.ts | 26 +++++++++++++++++++ adev/tsconfig.spec.json | 2 +- 10 files changed, 55 insertions(+), 25 deletions(-) create mode 100644 adev/test-main.ts diff --git a/adev/BUILD.bazel b/adev/BUILD.bazel index a1db50e081da..f89d6dd33cd6 100644 --- a/adev/BUILD.bazel +++ b/adev/BUILD.bazel @@ -26,6 +26,7 @@ APPLICATION_FILES = [ TEST_FILES = APPLICATION_FILES + [ "karma.conf.js", + "test-main.ts", "tsconfig.spec.json", ] + glob( ["**/*.spec.ts"], diff --git a/adev/angular.json b/adev/angular.json index 696f80b6be04..cda2ce2a5ca5 100644 --- a/adev/angular.json +++ b/adev/angular.json @@ -84,10 +84,10 @@ "test": { "builder": "@angular-devkit/build-angular:karma", "options": { - "polyfills": ["zone.js", "zone.js/testing"], "tsConfig": "tsconfig.spec.json", "include": ["src/app"], "karmaConfig": "karma.conf.js", + "main": "test-main.ts", "inlineStyleLanguage": "scss", "assets": ["src/favicon.ico", "src/assets"], "styles": ["@angular/docs/styles/global-styles.scss"], diff --git a/adev/src/app/core/layout/progress-bar/progress-bar.component.spec.ts b/adev/src/app/core/layout/progress-bar/progress-bar.component.spec.ts index cfbac712a013..317d3cfa1d7f 100644 --- a/adev/src/app/core/layout/progress-bar/progress-bar.component.spec.ts +++ b/adev/src/app/core/layout/progress-bar/progress-bar.component.spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {PROGRESS_BAR_DELAY, ProgressBarComponent} from './progress-bar.component'; import {RouterTestingHarness, RouterTestingModule} from '@angular/router/testing'; @@ -25,13 +25,13 @@ describe('ProgressBarComponent', () => { fixture.detectChanges(); }); - it('should call progressBar.complete() on route change', fakeAsync(async () => { + it('should call progressBar.complete() on route change', async () => { const progressBarCompleteSpy = spyOn(component.progressBar, 'complete'); const harness = await RouterTestingHarness.create(); await harness.navigateByUrl('/'); - tick(PROGRESS_BAR_DELAY); + await new Promise((resolve) => setTimeout(resolve, PROGRESS_BAR_DELAY)); expect(progressBarCompleteSpy).toHaveBeenCalled(); - })); + }); }); diff --git a/adev/src/app/editor/code-editor/code-mirror-editor.service.spec.ts b/adev/src/app/editor/code-editor/code-mirror-editor.service.spec.ts index b13f3c48965b..2e58dcb06e59 100644 --- a/adev/src/app/editor/code-editor/code-mirror-editor.service.spec.ts +++ b/adev/src/app/editor/code-editor/code-mirror-editor.service.spec.ts @@ -7,7 +7,7 @@ */ import {signal} from '@angular/core'; -import {TestBed, fakeAsync, tick} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import {BehaviorSubject, Subject} from 'rxjs'; import {EditorState} from '@codemirror/state'; import type {FileSystemTree} from '@webcontainer/api'; @@ -142,17 +142,19 @@ describe('CodeMirrorEditor', () => { expect(service.currentFile().content).toBe(newContent); }); - it('should write the changed file content to the sandbox filesystem', fakeAsync(() => { + it('should write the changed file content to the sandbox filesystem', () => { + jasmine.clock().install(); + jasmine.clock().mockDate(); const newContent = 'new content'; const nodeRuntimeSandboxSpy = spyOn(fakeNodeRuntimeSandbox, 'writeFile'); dispatchDocumentChange(newContent); - - tick(EDITOR_CONTENT_CHANGE_DELAY_MILLIES); + jasmine.clock().tick(EDITOR_CONTENT_CHANGE_DELAY_MILLIES); expect(nodeRuntimeSandboxSpy).toHaveBeenCalledWith(service.currentFile().filename, newContent); - })); + jasmine.clock().uninstall(); + }); it('should add created file to code editor', async () => { const newFile = 'new-component.component.ts'; diff --git a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts index 43d7af5b26d7..11ad6bea8747 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts @@ -240,7 +240,8 @@ describe('NodeRuntimeSandbox', () => { expect(cleanupSpy).toHaveBeenCalledOnceWith(); }); - it("should set the error state when an out of memory message is received from the web container's output", async () => { + // TODO: fix this test + xit("should set the error state when an out of memory message is received from the web container's output", async () => { service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); setValuesToCatchOutOfMemoryError(); diff --git a/adev/src/app/editor/preview/preview.component.spec.ts b/adev/src/app/editor/preview/preview.component.spec.ts index c8e8420839dc..ca7ac36cfb92 100644 --- a/adev/src/app/editor/preview/preview.component.spec.ts +++ b/adev/src/app/editor/preview/preview.component.spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {TestBed, fakeAsync, tick} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import {DebugElement, signal} from '@angular/core'; import {By} from '@angular/platform-browser'; import {of} from 'rxjs'; @@ -64,16 +64,16 @@ describe('Preview', () => { }; }; - it('should set iframe src on init', fakeAsync(() => { + it('should set iframe src on init', async () => { const {component, PREVIEW_URL} = beforeEach(); component.ngAfterViewInit(); - tick(100); + await new Promise((resolve) => setTimeout(resolve, 100)); expect(component.previewIframe?.nativeElement).toBeTruthy(); expect(component.previewIframe?.nativeElement?.src).toBe(PREVIEW_URL); - })); + }); it('should not render loading elements if the loadingStep is READY or ERROR', () => { const {fixture, fakeNodeRuntimeState, getLoadingElementsWrapper} = beforeEach(); diff --git a/adev/src/app/editor/terminal/terminal.component.spec.ts b/adev/src/app/editor/terminal/terminal.component.spec.ts index f327f1a26505..3656f570845c 100644 --- a/adev/src/app/editor/terminal/terminal.component.spec.ts +++ b/adev/src/app/editor/terminal/terminal.component.spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ComponentFixture, TestBed, fakeAsync, tick} from '@angular/core/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; import {Terminal} from './terminal.component'; @@ -61,12 +61,12 @@ describe('Terminal', () => { ); }); - it('should call resizeToFitParent on window resize', fakeAsync(() => { + it('should call resizeToFitParent on window resize', async () => { fakeWindow.dispatchEvent(new Event('resize')); // debounce time - tick(50); + await new Promise((resolve) => setTimeout(resolve, 50)); expect(terminalHandlerSpy.resizeToFitParent).toHaveBeenCalled(); - })); + }); }); diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts index 568f3e1f32f5..8c57874ce9e9 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.spec.ts @@ -8,7 +8,7 @@ import {HarnessLoader} from '@angular/cdk/testing'; import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {TestBed, waitForAsync} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import {MatTabGroupHarness} from '@angular/material/tabs/testing'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {ReferenceScrollHandler} from '../services/reference-scroll-handler.service'; @@ -68,15 +68,15 @@ describe('ApiReferenceDetailsPage', () => { expect(component).toBeTruthy(); }); - it('should render tabs for all elements with tab attribute', waitForAsync(async () => { + it('should render tabs for all elements with tab attribute', async () => { const matTabGroup = await loader.getHarness(MatTabGroupHarness); const tabs = await matTabGroup.getTabs(); expect(tabs.length).toBe(4); - })); + }); - it('should display members cards when API tab is active', waitForAsync(async () => { + it('should display members cards when API tab is active', async () => { const matTabGroup = await loader.getHarness(MatTabGroupHarness); const tabs = await matTabGroup.getTabs(); @@ -94,7 +94,7 @@ describe('ApiReferenceDetailsPage', () => { membersCard = harness.fixture.debugElement.query(By.css('.docs-reference-members-container')); expect(membersCard).toBeTruthy(); - })); + }); it('should setup scroll listeners when API members are loaded', () => { const setupListenersSpy = spyOn(fakeApiReferenceScrollHandler, 'setupListeners'); diff --git a/adev/test-main.ts b/adev/test-main.ts new file mode 100644 index 000000000000..329e6eedf7fc --- /dev/null +++ b/adev/test-main.ts @@ -0,0 +1,26 @@ +import {ErrorHandler, NgModule, provideExperimentalZonelessChangeDetection} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; + +@NgModule({ + providers: [ + provideExperimentalZonelessChangeDetection(), + { + provide: ErrorHandler, + useValue: { + handleError: (e: any) => { + throw e; + }, + }, + }, + ], +}) +export class TestModule {} + +TestBed.initTestEnvironment( + [BrowserDynamicTestingModule, TestModule], + platformBrowserDynamicTesting(), +); diff --git a/adev/tsconfig.spec.json b/adev/tsconfig.spec.json index 887ce71dba87..9c4e7b55d673 100644 --- a/adev/tsconfig.spec.json +++ b/adev/tsconfig.spec.json @@ -5,5 +5,5 @@ "outDir": "../../out-tsc/spec", "types": ["jasmine"] }, - "include": ["src/app/**/*.spec.ts", "src/app/**/*.d.ts"] + "include": ["src/app/**/*.spec.ts", "src/app/**/*.d.ts", "test-main.ts"] } From 43515a38d0f68aa5df2a91d019c8a13ee917942d Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 23 Jul 2024 15:28:36 -0700 Subject: [PATCH 080/143] test(docs-infra): fix test with slight adjustment to error handling (#57104) The test was broken because multiple errors happen and the last error would be the displayed message. However, in this case, those errors happen because the initial one already terminated the container so the follow-up errors are a result of the service being in an unexpected state PR Close #57104 --- adev/src/app/editor/node-runtime-sandbox.service.spec.ts | 3 +-- adev/src/app/editor/node-runtime-sandbox.service.ts | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts index 11ad6bea8747..43d7af5b26d7 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts @@ -240,8 +240,7 @@ describe('NodeRuntimeSandbox', () => { expect(cleanupSpy).toHaveBeenCalledOnceWith(); }); - // TODO: fix this test - xit("should set the error state when an out of memory message is received from the web container's output", async () => { + it("should set the error state when an out of memory message is received from the web container's output", async () => { service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); setValuesToCatchOutOfMemoryError(); diff --git a/adev/src/app/editor/node-runtime-sandbox.service.ts b/adev/src/app/editor/node-runtime-sandbox.service.ts index cb6c8e24009c..a540e4e15e46 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.ts @@ -107,7 +107,10 @@ export class NodeRuntimeSandbox { console.timeEnd('Load time'); } catch (error: any) { - this.setErrorState(error.message); + // If we're already in an error state, throw away the most recent error which may have happened because + // we were in the error state already and tried to do more things after terminating. + const message = this.nodeRuntimeState.error()?.message ?? error.message; + this.setErrorState(message); } } From 83117f1a0d4039f89f50a458e6c62ad3e2bee584 Mon Sep 17 00:00:00 2001 From: Tom Wilkinson Date: Tue, 23 Jul 2024 15:29:47 -0500 Subject: [PATCH 081/143] refactor(core): Switch to using concat rather than spread operator for events. (#57103) Internally, the JSCompiler does not dead code eliminate this code when its using spread. PR Close #57103 --- packages/core/primitives/event-dispatch/src/event_type.ts | 2 +- packages/core/test/bundling/defer/bundle.golden_symbols.json | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/core/primitives/event-dispatch/src/event_type.ts b/packages/core/primitives/event-dispatch/src/event_type.ts index a09db405a20d..f32d55b8f9a2 100644 --- a/packages/core/primitives/event-dispatch/src/event_type.ts +++ b/packages/core/primitives/event-dispatch/src/event_type.ts @@ -372,7 +372,7 @@ export const isCaptureEventType = (eventType: string) => CAPTURE_EVENT_TYPES.indexOf(eventType) >= 0; /** All event types that are registered early. */ -const EARLY_EVENT_TYPES = [...BUBBLE_EVENT_TYPES, ...CAPTURE_EVENT_TYPES]; +const EARLY_EVENT_TYPES = BUBBLE_EVENT_TYPES.concat(CAPTURE_EVENT_TYPES); /** * Whether or not an event type is registered in the early contract. diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index f93e29b4e981..bb1fd6dc807b 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -206,9 +206,6 @@ { "name": "EventManagerPlugin" }, - { - "name": "EventType" - }, { "name": "GLOBAL_EVENT_DELEGATION" }, From 0e439d78c2465602b9d439f7d4ba1a9b5450ca9c Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 24 Jul 2024 07:43:57 -0700 Subject: [PATCH 082/143] Revert "fix(router): Scroller should scroll as soon as change detection completes (#55105)" (#57115) This reverts commit 66ffeca2dea1eed5f88a81d8ef167da87796f3f8. It looks like nuxt encountered the same issue with scrolling when waiting for Vue's `nextTick`, which is a microtask. This would have similar timing to ZoneJS's rendering in the microtask queue. This reverts to a `setTimeout` alone, though recreates the problem in #53985. This was also mentioned in one of the comments in the Nuxt issue and the solution would be `rAF`. In order to address #53985, we'd likely want to use the `race(rAF, setTimeout)` that we use in the zoneless and coalescing schedulers. This would have effectively the same timing as the `afterNextRender` implementation here with zoneless, but quite different timing to `afterNextRender` with ZoneJS. fixes #57109 PR Close #57115 --- packages/router/src/router_scroller.ts | 46 ++++++++------------------ 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/packages/router/src/router_scroller.ts b/packages/router/src/router_scroller.ts index a6cb22801f29..8aee665c9d71 100644 --- a/packages/router/src/router_scroller.ts +++ b/packages/router/src/router_scroller.ts @@ -7,15 +7,7 @@ */ import {ViewportScroller} from '@angular/common'; -import { - EnvironmentInjector, - Injectable, - InjectionToken, - NgZone, - OnDestroy, - afterNextRender, - inject, -} from '@angular/core'; +import {Injectable, InjectionToken, NgZone, OnDestroy} from '@angular/core'; import {Unsubscribable} from 'rxjs'; import { @@ -39,7 +31,6 @@ export class RouterScroller implements OnDestroy { private lastSource: 'imperative' | 'popstate' | 'hashchange' | undefined = 'imperative'; private restoredId = 0; private store: {[key: string]: [number, number]} = {}; - private readonly environmentInjector = inject(EnvironmentInjector); /** @nodoc */ constructor( @@ -114,32 +105,21 @@ export class RouterScroller implements OnDestroy { routerEvent: NavigationEnd | NavigationSkipped, anchor: string | null, ): void { - this.zone.runOutsideAngular(async () => { - // The scroll event needs to be delayed until after change detection. Otherwise we may + this.zone.runOutsideAngular(() => { + // The scroll event needs to be delayed until after change detection. Otherwise, we may // attempt to restore the scroll position before the router outlet has fully rendered the // component by executing its update block of the template function. - await new Promise((resolve) => { - // TODO(atscott): Attempt to remove the setTimeout in a future PR. - setTimeout(() => { - resolve(); + setTimeout(() => { + this.zone.run(() => { + this.transitions.events.next( + new Scroll( + routerEvent, + this.lastSource === 'popstate' ? this.store[this.restoredId] : null, + anchor, + ), + ); }); - afterNextRender( - () => { - resolve(); - }, - {injector: this.environmentInjector}, - ); - }); - - this.zone.run(() => { - this.transitions.events.next( - new Scroll( - routerEvent, - this.lastSource === 'popstate' ? this.store[this.restoredId] : null, - anchor, - ), - ); - }); + }, 0); }); } From d5fbe11e406e42106bc4e0c1a2eaa6ffcddaa4bb Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 4 Jun 2024 15:40:48 +0200 Subject: [PATCH 083/143] docs(docs-infra): disable experimental decorators (#56257) Also enable useDefineForClassFields and disable downlevelIteration PR Close #56257 --- .../app/core/services/errors-handling/error-snack-bar.ts | 8 +++----- adev/tsconfig.json | 3 --- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/adev/src/app/core/services/errors-handling/error-snack-bar.ts b/adev/src/app/core/services/errors-handling/error-snack-bar.ts index 935a0102afd4..d9779d71b74c 100644 --- a/adev/src/app/core/services/errors-handling/error-snack-bar.ts +++ b/adev/src/app/core/services/errors-handling/error-snack-bar.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.dev/license */ -import {ChangeDetectionStrategy, Component, Inject} from '@angular/core'; +import {ChangeDetectionStrategy, Component, Inject, inject} from '@angular/core'; import {MAT_SNACK_BAR_DATA, MatSnackBarAction, MatSnackBarRef} from '@angular/material/snack-bar'; export interface ErrorSnackBarData { @@ -37,10 +37,8 @@ export class ErrorSnackBar { protected message: string; protected actionText?: string; - constructor( - protected snackBarRef: MatSnackBarRef, - @Inject(MAT_SNACK_BAR_DATA) public data: ErrorSnackBarData, - ) { + constructor(protected snackBarRef: MatSnackBarRef) { + const data = inject(MAT_SNACK_BAR_DATA) as ErrorSnackBarData; this.message = data.message; this.actionText = data.actionText; } diff --git a/adev/tsconfig.json b/adev/tsconfig.json index 09ad4f9cb78c..4b6aa23dd9b7 100644 --- a/adev/tsconfig.json +++ b/adev/tsconfig.json @@ -16,13 +16,10 @@ "noFallthroughCasesInSwitch": true, "sourceMap": true, "declaration": false, - "downlevelIteration": true, - "experimentalDecorators": true, "moduleResolution": "node", "importHelpers": true, "target": "ES2022", "module": "ES2022", - "useDefineForClassFields": false, "lib": ["ES2022", "dom"], "esModuleInterop": true, "resolveJsonModule": true, From a7b973eac57bbe4d7590dc84ca81900e97f4b704 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 22 Jul 2024 17:37:24 +0200 Subject: [PATCH 084/143] docs(docs-infra): Use shiki for code highlighting (#57059) PR Close #57059 --- WORKSPACE | 2 +- .../api-reference-details-page.component.scss | 5 +- .../cli-reference-details-page.component.scss | 10 +- .../api-reference-prerender.constants.ts | 4 +- .../reference-scroll-handler.service.ts | 7 +- adev/src/content/best-practices/a11y.md | 2 +- .../guide/animations/complex-sequences.md | 2 +- .../guide/components/content-projection.md | 22 +- .../content/guide/components/host-elements.md | 6 +- adev/src/content/guide/components/inputs.md | 6 +- .../guide/components/output-function.md | 2 +- adev/src/content/guide/components/outputs.md | 6 +- .../components/programmatic-rendering.md | 2 +- adev/src/content/guide/defer.md | 32 +- .../directives/directive-composition-api.md | 4 +- .../guide/directives/structural-directives.md | 6 +- adev/src/content/guide/hydration.md | 2 +- .../guide/routing/common-router-tasks.md | 22 +- .../content/guide/routing/router-tutorial.md | 4 +- adev/src/content/guide/signals/inputs.md | 4 +- .../content/guide/templates/control-flow.md | 16 +- .../content/guide/templates/event-binding.md | 6 +- .../guide/templates/let-template-variables.md | 9 +- .../guide/templates/reference-variables.md | 6 +- .../guide/templates/two-way-binding.md | 4 +- .../introduction/essentials/components.md | 2 +- .../essentials/conditionals-and-loops.md | 2 +- .../essentials/handling-user-interaction.md | 4 +- .../essentials/rendering-dynamic-templates.md | 4 +- adev/src/content/reference/errors/NG05104.md | 4 +- adev/src/content/reference/errors/NG0910.md | 8 +- .../steps/10-deferrable-views/README.md | 2 +- .../learn-angular/steps/15-forms/README.md | 2 +- .../steps/17-reactive-forms/README.md | 4 +- .../steps/18-forms-validation/README.md | 2 +- .../learn-angular/steps/9-output/README.md | 2 +- package.json | 4 +- packages/animations/src/animation_metadata.ts | 4 +- ...6c19bafaac67cf44e605ed8c2c0e45b0a51.patch} | 57 +- tools/manual_api_docs/blocks/defer.md | 4 +- tools/manual_api_docs/blocks/for.md | 4 +- tools/manual_api_docs/blocks/if.md | 4 +- tools/manual_api_docs/blocks/let.md | 4 +- tools/manual_api_docs/blocks/switch.md | 2 +- yarn.lock | 658 +++++++++++++++--- 45 files changed, 707 insertions(+), 261 deletions(-) rename tools/esm-interop/patches/npm/{@angular+build-tooling+0.0.0-239d56b71911f9fa1eeefb6e4505dbe7b0cd81a7.patch => @angular+build-tooling+0.0.0-d30a56c19bafaac67cf44e605ed8c2c0e45b0a51.patch} (95%) diff --git a/WORKSPACE b/WORKSPACE index b0d5663dd28b..c2d8364029cc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -75,7 +75,7 @@ yarn_install( "//:.yarnrc", "//:tools/npm-patches/@bazel+jasmine+5.8.1.patch", "//tools:postinstall-patches.js", - "//tools/esm-interop:patches/npm/@angular+build-tooling+0.0.0-239d56b71911f9fa1eeefb6e4505dbe7b0cd81a7.patch", + "//tools/esm-interop:patches/npm/@angular+build-tooling+0.0.0-d30a56c19bafaac67cf44e605ed8c2c0e45b0a51.patch", "//tools/esm-interop:patches/npm/@bazel+concatjs+5.8.1.patch", "//tools/esm-interop:patches/npm/@bazel+esbuild+5.7.1.patch", "//tools/esm-interop:patches/npm/@bazel+protractor+5.7.1.patch", diff --git a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss index f8fa9bf27055..3facf2e5e6ad 100644 --- a/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss +++ b/adev/src/app/features/references/api-reference-details-page/api-reference-details-page.component.scss @@ -70,7 +70,6 @@ .docs-code { pre { margin-block: 0; - padding-block: 1rem; } } @@ -120,13 +119,13 @@ transition: background-color 0.3s ease; font-family: monospace; - &.hljs-ln-line { + &.line { font-weight: 400; text-align: left; padding-block: 0.25rem; } - &.hljs-ln-line-highlighted { + &.shiki-ln-line-highlighted { background-color: var(--senary-contrast); } &:hover { diff --git a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss index 2da507040c93..a47eb078a0fc 100644 --- a/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss +++ b/adev/src/app/features/references/cli-reference-details-page/cli-reference-details-page.component.scss @@ -81,7 +81,7 @@ z-index: 0; } - &:has(.hljs-ln-line-highlighted) { + &:has(.shiki-ln-line-highlighted) { &::before { background: var(--red-to-pink-to-purple-horizontal-gradient); } @@ -95,8 +95,8 @@ } } - .hljs-ln-line-argument, - .hljs-ln-line-option { + .shiki-ln-line-argument, + .shiki-ln-line-option { padding: 0.1rem 0.2rem 0.2rem; margin-inline: 0.1rem; color: var(--quaternary-contrast); @@ -110,12 +110,12 @@ background: var(--septenary-contrast); } - &.hljs-ln-line-highlighted { + &.shiki-ln-line-highlighted { color: var(--primary-contrast); background: var(--senary-contrast); } } - .hljs-ln-line-argument { + .shiki-ln-line-argument { margin-inline-start: 0.2rem; } } diff --git a/adev/src/app/features/references/constants/api-reference-prerender.constants.ts b/adev/src/app/features/references/constants/api-reference-prerender.constants.ts index 0a19ad602895..7ec2777028d5 100644 --- a/adev/src/app/features/references/constants/api-reference-prerender.constants.ts +++ b/adev/src/app/features/references/constants/api-reference-prerender.constants.ts @@ -16,6 +16,6 @@ export const API_REFERENCE_TAB_API_LABEL = 'API'; export const API_REFERENCE_TAB_QUERY_PARAM = 'tab'; export const API_TAB_CLASS_NAME = '.docs-reference-api-tab'; export const API_REFERENCE_MEMBER_CARD_CLASS_NAME = '.docs-reference-member-card'; -export const API_TAB_ACTIVE_CODE_LINE = 'hljs-ln-line-highlighted'; -export const HIGHLIGHT_JS_CODE_LINE_CLASS_NAME = 'hljs-ln-line'; +export const API_TAB_ACTIVE_CODE_LINE = 'shiki-ln-line-highlighted'; +export const HIGHLIGHT_JS_CODE_LINE_CLASS_NAME = 'shiki-ln-line'; export const MEMBER_ID_ATTRIBUTE = 'member-id'; diff --git a/adev/src/app/features/references/services/reference-scroll-handler.service.ts b/adev/src/app/features/references/services/reference-scroll-handler.service.ts index 0508c1195fb6..cdcb101a8574 100644 --- a/adev/src/app/features/references/services/reference-scroll-handler.service.ts +++ b/adev/src/app/features/references/services/reference-scroll-handler.service.ts @@ -18,7 +18,7 @@ import { } from '@angular/core'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {fromEvent} from 'rxjs'; -import {auditTime} from 'rxjs/operators'; +import {auditTime, skipWhile} from 'rxjs/operators'; import { API_REFERENCE_DETAILS_PAGE_MEMBERS_CLASS_NAME, API_REFERENCE_MEMBER_CARD_CLASS_NAME, @@ -114,7 +114,10 @@ export class ReferenceScrollHandler implements OnDestroy, ReferenceScrollHandler this.getAllMemberCards().forEach((card) => { this.cardOffsetTop.set(card.id, card.offsetTop); fromEvent(card, 'click') - .pipe(takeUntilDestroyed(this.destroyRef)) + .pipe( + skipWhile((event) => event.target instanceof HTMLAnchorElement), + takeUntilDestroyed(this.destroyRef), + ) .subscribe(() => { this.router.navigate([], {fragment: card.id, replaceUrl: true}); }); diff --git a/adev/src/content/best-practices/a11y.md b/adev/src/content/best-practices/a11y.md index d110d5a24cb8..135f988f79b9 100644 --- a/adev/src/content/best-practices/a11y.md +++ b/adev/src/content/best-practices/a11y.md @@ -127,7 +127,7 @@ The `RouterLinkActive` directive provides the `ariaCurrentWhenActive` input whic The following example shows how to apply the `active-page` class to active links as well as setting their `aria-current` attribute to `"page"` when they are active: -```html +```angular-html
+ `; + }, +}; diff --git a/adev/shared-docs/pipeline/guides/extensions/docs-pill/docs-pill.ts b/adev/shared-docs/pipeline/guides/extensions/docs-pill/docs-pill.ts new file mode 100644 index 000000000000..42ee838e09dd --- /dev/null +++ b/adev/shared-docs/pipeline/guides/extensions/docs-pill/docs-pill.ts @@ -0,0 +1,62 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Token, Tokens, RendererThis, TokenizerThis} from 'marked'; +import {anchorTarget, isExternalLink} from '../../helpers'; + +interface DocsPillToken extends Tokens.Generic { + type: 'docs-pill'; + title: string; + href: string; + tokens: Token[]; +} + +// Capture group 1: all attributes on the docs-pill tag +const pillRule = /^\s*/s; + +const titleRule = /title="([^"]*)"/; +const hrefRule = /href="([^"]*)"/; + +export const docsPillExtension = { + name: 'docs-pill', + level: 'inline' as const, + start(src: string) { + return src.indexOf(' + ${this.parser.parseInline(token.tokens)}${ + isExternalLink(token.href) + ? 'open_in_new' + : '' + } + + `; + }, +}; diff --git a/adev/shared-docs/pipeline/guides/extensions/docs-video.ts b/adev/shared-docs/pipeline/guides/extensions/docs-video.ts new file mode 100644 index 000000000000..610f06123268 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/extensions/docs-video.ts @@ -0,0 +1,70 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Tokens, TokenizerThis, RendererThis} from 'marked'; + +interface DocsVideoToken extends Tokens.Generic { + type: 'docs-video'; + src: string; + title: string | undefined; +} + +// Capture group 1: all attributes on the opening tag +const videoRule = /^]*)\/>/s; + +const srcRule = /src="([^"]*)"/; +const titleRule = /title="([^"]*)"/; +const validYTUrlPrefix = 'https://www.youtube.com/embed/'; + +export const docsVideoExtension = { + name: 'docs-video', + level: 'block' as const, + start(src: string) { + return src.match(/^\s* cannot load: ${token.src}. YouTube Player API expects src to begin with ${validYTUrlPrefix}.\n`, + ); + } + + return ` +
+ +
+ `; + }, +}; diff --git a/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts new file mode 100644 index 000000000000..efd64d6eef8c --- /dev/null +++ b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-step.ts @@ -0,0 +1,59 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Token, Tokens, RendererThis, TokenizerThis} from 'marked'; +import {headingRender} from '../../tranformations/heading'; + +interface DocsStepToken extends Tokens.Generic { + type: 'docs-step'; + title: string; + body: string; + tokens: Token[]; +} + +// Capture group 1: all attributes on the opening tag +// Capture group 2: all content between the open and close tags +const stepRule = /^\s*]*)>((?:.(?!\/docs-step))*)<\/docs-step>/s; +const titleRule = /title="([^"]*)"/; + +export const docsStepExtension = { + name: 'docs-step', + level: 'block' as const, + start(src: string) { + return src.match(/^\s* + + ${headingRender(token.title, 3, token.title)} + ${this.parser.parse(token.tokens)} + + `; + }, +}; diff --git a/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-workflow.ts b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-workflow.ts new file mode 100644 index 000000000000..a6be14022b4f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/extensions/docs-workflow/docs-workflow.ts @@ -0,0 +1,50 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Token, Tokens, RendererThis, TokenizerThis} from 'marked'; + +interface DocsWorkflowToken extends Tokens.Generic { + type: 'docs-workflow'; + steps: string; + tokens: Token[]; +} + +// Capture group 1: all content between the open and close tags +const workflowRule = /^(.*?)<\/docs-workflow>/s; + +export const docsWorkflowExtension = { + name: 'docs-workflow', + level: 'block' as const, + start(src: string) { + return src.match(/^\s* + ${this.parser.parse(token.tokens)} + + `; + }, +}; diff --git a/adev/shared-docs/pipeline/guides/helpers.ts b/adev/shared-docs/pipeline/guides/helpers.ts new file mode 100644 index 000000000000..a7b4fdb4963a --- /dev/null +++ b/adev/shared-docs/pipeline/guides/helpers.ts @@ -0,0 +1,17 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +/** Whether the link provided is external to the application. */ +export function isExternalLink(href: string | undefined | null) { + return href?.startsWith('http') ?? false; +} + +/** Provide the correct target for the anchor tag based on the link provided. */ +export function anchorTarget(href: string | undefined | null) { + return isExternalLink(href) ? ` target="_blank"` : ''; +} diff --git a/adev/shared-docs/pipeline/guides/hooks.ts b/adev/shared-docs/pipeline/guides/hooks.ts new file mode 100644 index 000000000000..a5a2b967a816 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/hooks.ts @@ -0,0 +1,23 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {MarkedExtension} from 'marked'; +import {resetHeaderIdsOfCurrentDocument} from './state'; + +/** + * Custom hooks for marked that will be used to post-transform markdown files with parent styles for docs. + */ +export const hooks: MarkedExtension['hooks'] = { + preprocess(html: string): string { + resetHeaderIdsOfCurrentDocument(); + return html; + }, + postprocess(html: string): string { + return html; + }, +}; diff --git a/adev/shared-docs/pipeline/guides/index.d.ts b/adev/shared-docs/pipeline/guides/index.d.ts new file mode 100644 index 000000000000..773a9d3bdb10 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/index.d.ts @@ -0,0 +1,12 @@ +// This definition file is a temporary workaround until the toolchain is able to read d.mts definition files +// TODO: delete this file when the toolchains supports .d.mts files +declare module 'shiki' { + function createHighlighter(params: { + themes: any[]; + langs: string[]; + cssVariablePrefix?: string; + defaultColor?: boolean; + }): unknown; + + type HighlighterGeneric = any; +} diff --git a/adev/shared-docs/pipeline/guides/index.ts b/adev/shared-docs/pipeline/guides/index.ts new file mode 100644 index 000000000000..effa5057ca42 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/index.ts @@ -0,0 +1,39 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {readFileSync, writeFileSync} from 'fs'; +import path from 'path'; +import {parseMarkdown} from './parse'; +import {initHighlighter} from './extensions/docs-code/format/highlight'; + +async function main() { + const [paramFilePath] = process.argv.slice(2); + const rawParamLines = readFileSync(paramFilePath, {encoding: 'utf8'}).split('\n'); + const [srcs, outputFilenameExecRootRelativePath] = rawParamLines; + + // The highlighter needs to be setup asynchronously + // so we're doing it at the start of the pipeline + await initHighlighter(); + + for (const filePath of srcs.split(',')) { + if (!filePath.endsWith('.md')) { + throw new Error(`Input file "${filePath}" does not end in a ".md" file extension.`); + } + + const markdownContent = readFileSync(filePath, {encoding: 'utf8'}); + const htmlOutputContent = await parseMarkdown(markdownContent, {markdownFilePath: filePath}); + + // The expected file name structure is the [name of the file].md.html. + const htmlFileName = filePath + '.html'; + const htmlOutputPath = path.join(outputFilenameExecRootRelativePath, htmlFileName); + + writeFileSync(htmlOutputPath, htmlOutputContent, {encoding: 'utf8'}); + } +} + +main(); diff --git a/adev/shared-docs/pipeline/guides/mermaid/index.ts b/adev/shared-docs/pipeline/guides/mermaid/index.ts new file mode 100644 index 000000000000..99dda3c376a9 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/mermaid/index.ts @@ -0,0 +1,71 @@ +import {DocsCodeToken} from '../extensions/docs-code/docs-code'; +import {chromium} from 'playwright-core'; +import {Mermaid, MermaidConfig} from 'mermaid'; +import {runfiles} from '@bazel/runfiles'; + +// Declare mermarid in the context of this file so that typescript doesn't get upset when we +// access it within the `page.evaluate` function. At runtime the context in with the method +// is run difference than this file, but this makes typescript happy. +declare const mermaid: Mermaid; + +/** Mermaid configuration to use when creating mermaid svgs. */ +const mermaidConfig: MermaidConfig = { + // The `base` theme is the only configurable theme provided by mermaid. + theme: 'base', +}; + +/** The full path to the mermaid script. */ +let mermaidScriptTagData: {path: string} | undefined; + +/** Get the mermaid script file path, resolving it if necessary first. */ +function getMermaidScriptTagData() { + if (mermaidScriptTagData) { + return mermaidScriptTagData; + } + + return (mermaidScriptTagData = { + path: runfiles.resolveWorkspaceRelative('node_modules/mermaid/dist/mermaid.js'), + }); +} + +/** Replace the code block content with the mermaid generated SVG element string in place. */ +export async function processMermaidCodeBlock(token: DocsCodeToken) { + /** + * The diagram source code contents. Marked reuses the token object, causing the need for + * extracting the value before async actions occur in the function. + */ + const diagram = token.code; + // TODO(josephperrott): Determine if we can reuse the browser across token processing. + /** Browser instance to run mermaid within. */ + const browser = await chromium.launch({ + headless: true, + // The browser binary needs to be discoverable in a build and test environment, which seems to only + // work when provided at the execroot path. We choose to resolve it using the runfiles helper due + // to this requirement. + executablePath: runfiles.resolveWorkspaceRelative(process.env['CHROME_BIN']!), + args: ['--no-sandbox'], + }); + /** Page to run mermaid in. */ + const page = await browser.newPage(); + + try { + // We goto a data URI so that we don't have to manage an html file and loading an html file. + await page.goto(`data:text/html,`); + await page.addScriptTag(getMermaidScriptTagData()); + + /** The generated SVG element string for the provided token's code. */ + let {svg} = await page.evaluate( + ({diagram, config}) => { + mermaid.initialize(config); + + return mermaid.render('mermaid-generated-diagram', diagram); + }, + {diagram, config: mermaidConfig}, + ); + + // Replace the token's code content with the generated SVG. + token.code = svg; + } finally { + await browser.close(); + } +} diff --git a/adev/shared-docs/pipeline/guides/parse.ts b/adev/shared-docs/pipeline/guides/parse.ts new file mode 100644 index 000000000000..ac377f34060d --- /dev/null +++ b/adev/shared-docs/pipeline/guides/parse.ts @@ -0,0 +1,59 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {marked} from 'marked'; +import {hooks} from './hooks'; +import {renderer} from './renderer'; +import {docsAlertExtension} from './extensions/docs-alert'; +import {docsCalloutExtension} from './extensions/docs-callout'; +import {docsPillExtension} from './extensions/docs-pill/docs-pill'; +import {docsPillRowExtension} from './extensions/docs-pill/docs-pill-row'; +import {docsVideoExtension} from './extensions/docs-video'; +import {docsWorkflowExtension} from './extensions/docs-workflow/docs-workflow'; +import {docsStepExtension} from './extensions/docs-workflow/docs-step'; +import {docsCardExtension} from './extensions/docs-card/docs-card'; +import {docsCardContainerExtension} from './extensions/docs-card/docs-card-container'; +import {docsDecorativeHeaderExtension} from './extensions/docs-decorative-header'; +import {docsCodeBlockExtension} from './extensions/docs-code/docs-code-block'; +import {docsCodeExtension} from './extensions/docs-code/docs-code'; +import {docsCodeMultifileExtension} from './extensions/docs-code/docs-code-multifile'; +import {ParserContext, setContext} from './utils'; +import {walkTokens} from './walk-tokens'; + +export async function parseMarkdown( + markdownContent: string, + context: ParserContext, +): Promise { + setContext(context); + + marked.use({ + hooks, + renderer, + extensions: [ + docsAlertExtension, + docsCalloutExtension, + docsPillExtension, + docsPillRowExtension, + docsVideoExtension, + docsWorkflowExtension, + docsStepExtension, + docsCardExtension, + docsCardContainerExtension, + docsDecorativeHeaderExtension, + docsCodeBlockExtension, + docsCodeExtension, + docsCodeMultifileExtension, + ], + walkTokens, + // The async option causes marked to await walkTokens functions before parsing the tokens and returning an HTML string. + // We leverage this to allow us to use async libraries like mermaid and building stackblitz examples. + async: true, + }); + + return marked.parse(markdownContent); +} diff --git a/adev/shared-docs/pipeline/guides/renderer.ts b/adev/shared-docs/pipeline/guides/renderer.ts new file mode 100644 index 000000000000..8fe1379f80d7 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/renderer.ts @@ -0,0 +1,20 @@ +import {RendererObject} from 'marked'; +import {linkRender} from './tranformations/link'; +import {tableRender} from './tranformations/table'; +import {listRender} from './tranformations/list'; +import {imageRender} from './tranformations/image'; +import {textRender} from './tranformations/text'; +import {headingRender} from './tranformations/heading'; + +/** + * Custom renderer for marked that will be used to transform markdown files to HTML + * files that can be used in the Angular docs. + */ +export const renderer: RendererObject = { + link: linkRender, + table: tableRender, + list: listRender, + image: imageRender, + text: textRender, + heading: headingRender, +}; diff --git a/adev/shared-docs/pipeline/guides/state.ts b/adev/shared-docs/pipeline/guides/state.ts new file mode 100644 index 000000000000..988f8004d95a --- /dev/null +++ b/adev/shared-docs/pipeline/guides/state.ts @@ -0,0 +1,43 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +const headerIds = new Map(); + +export const getHeaderId = (heading: string): string => { + const numberOfHeaderOccurrencesInTheDocument = headerIds.get(heading) ?? 0; + headerIds.set(heading, numberOfHeaderOccurrencesInTheDocument + 1); + + // extract the extended markdown heading id + // ex: ## MyHeading {# myId} + const match = heading.match(/{#([\w-]+)}/); + + let extractedId: string; + if (match) { + extractedId = match[1]; + } else { + extractedId = heading + .toLowerCase() + .replace(/(.*?)<\/code>/g, '$1') // remove + .replace(/(.*?)<\/strong>/g, '$1') // remove + .replace(/(.*?)<\/em>/g, '$1') // remove + .replace(/\s|\//g, '-') // remove spaces and slashes + .replace(/gt;|lt;/g, '') // remove escaped < and > + .replace(/&#\d+;/g, '') // remove HTML entities + .replace(/[^\p{L}\d\-]/gu, ''); // only keep letters, digits & dashes + } + + const headerId = numberOfHeaderOccurrencesInTheDocument + ? `${extractedId}-${numberOfHeaderOccurrencesInTheDocument}` + : extractedId; + + return headerId; +}; + +export const resetHeaderIdsOfCurrentDocument = (): void => { + headerIds.clear(); +}; diff --git a/adev/shared-docs/pipeline/guides/testing/BUILD.bazel b/adev/shared-docs/pipeline/guides/testing/BUILD.bazel new file mode 100644 index 000000000000..3db4cfa1646e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/BUILD.bazel @@ -0,0 +1,38 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "unit_test_lib", + testonly = True, + srcs = glob([ + "**/*.spec.ts", + ]), + deps = [ + "//adev/shared-docs/pipeline/guides", + "@npm//@bazel/runfiles", + "@npm//@types/jsdom", + "@npm//jsdom", + ], +) + +ts_library( + name = "bootstrap", + testonly = True, + srcs = [ + "bootstrap.init.ts", + ], +) + +jasmine_node_test( + name = "unit_tests", + bootstrap = [ + ":bootstrap", + ], + data = [ + "@npm//jsdom", + ] + glob([ + "**/*.md", + "**/*.svg", + "**/*.ts", + ]), + deps = [":unit_test_lib"], +) diff --git a/adev/shared-docs/pipeline/guides/testing/bootstrap.init.ts b/adev/shared-docs/pipeline/guides/testing/bootstrap.init.ts new file mode 100644 index 000000000000..546d8e4052ef --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/bootstrap.init.ts @@ -0,0 +1,2 @@ +// Set HANDLE_MERMAID to false as unit testing does not handle mermaid. +(global as any).HANDLE_MERMAID = false; diff --git a/adev/shared-docs/pipeline/guides/testing/docs-alert/docs-alert.md b/adev/shared-docs/pipeline/guides/testing/docs-alert/docs-alert.md new file mode 100644 index 000000000000..56ea9fa35e2f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-alert/docs-alert.md @@ -0,0 +1,18 @@ +Note: Use Note for ancillary/additional information that's not _essential_ to the main text. +This is a multiline note + +Tip: Use Tip to call out a specific task/action users can perform, or a fact that plays directly into a task/action. + +TODO: Use TODO for incomplete documentation that you plan to expand soon. You can also assign the TODO, e.g. TODO(emmatwersky): Text. + +QUESTION: Use Question to pose a question to the reader, kind of like a mini-quiz that they should be able to answer. + +Summary: Use Summary to provide a two- or three-sentence synopsis of the page or section content, so readers can figure out whether this is the right place for them. + +TLDR: Use TLDR if you can provide the essential information about a page or section in a sentence or two. + +CRITICAL: Use Critical to call out potential bad stuff or alert the reader they ought to be careful before doing something. For example, Warning: Running `rm` with the `-f` option will delete write-protected files or directories without prompting you. + +IMPORTANT: Use Important for information that's crucial to comprehending the text or to completing some task. + +HELPFUL: Use Best practice to call out practices that are known to be successful or better than alternatives. diff --git a/adev/shared-docs/pipeline/guides/testing/docs-alert/docs-alert.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-alert/docs-alert.spec.ts new file mode 100644 index 000000000000..504081e5a142 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-alert/docs-alert.spec.ts @@ -0,0 +1,36 @@ +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +import {AlertSeverityLevel} from '../../../guides/extensions/docs-alert'; +import {parseMarkdown} from '../../../guides/parse'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-alert/docs-alert.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + for (let level in AlertSeverityLevel) { + it(`should create a docs-alert for ${level}:`, () => { + const noteEl = markdownDocument.querySelector(`.docs-alert-${level.toLowerCase()}`); + // TLDR is written without a semi colon in the markdown, but is rendered + // with a colon, as such we have to adjust our expectation here. + if (level === AlertSeverityLevel.TLDR) { + level = 'TL;DR'; + } + expect(noteEl?.textContent?.trim()).toMatch(`^${level}:`); + }); + } + + it(`should handle multi-line alerts`, () => { + const noteEl = markdownDocument.querySelector(`.docs-alert-note`); + + expect(noteEl?.textContent?.trim()).toContain(`This is a multiline note`); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-callout/docs-callout.md b/adev/shared-docs/pipeline/guides/testing/docs-callout/docs-callout.md new file mode 100644 index 000000000000..c329eb6298d3 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-callout/docs-callout.md @@ -0,0 +1,16 @@ + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-callout/docs-callout.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-callout/docs-callout.spec.ts new file mode 100644 index 000000000000..bc325f42d3ab --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-callout/docs-callout.spec.ts @@ -0,0 +1,22 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-callout/docs-callout.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it(`defaults to a helpful callout`, () => { + const calloutDiv = + markdownDocument.querySelector('#default-marker')!.parentElement?.parentElement; + calloutDiv?.classList.contains('docs-callout-helpful'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-card-container/angular.svg b/adev/shared-docs/pipeline/guides/testing/docs-card-container/angular.svg new file mode 100644 index 000000000000..57d353b2643c --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-card-container/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-card-container/docs-card-container.md b/adev/shared-docs/pipeline/guides/testing/docs-card-container/docs-card-container.md new file mode 100644 index 000000000000..b2cc295f7e41 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-card-container/docs-card-container.md @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-card-container/docs-card-container.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-card-container/docs-card-container.spec.ts new file mode 100644 index 000000000000..1263ec531a10 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-card-container/docs-card-container.spec.ts @@ -0,0 +1,23 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-card-container/docs-card-container.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('creates card containers containing multiple cards', () => { + const containerEl = markdownDocument.querySelector('.docs-card-grid'); + + expect(containerEl!.children.length).toBe(2); + expect(containerEl!.classList.contains('docs-card-grid')).toBeTrue(); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-card/angular.svg b/adev/shared-docs/pipeline/guides/testing/docs-card/angular.svg new file mode 100644 index 000000000000..57d353b2643c --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-card/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-card/docs-card.md b/adev/shared-docs/pipeline/guides/testing/docs-card/docs-card.md new file mode 100644 index 000000000000..3752044a5281 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-card/docs-card.md @@ -0,0 +1,5 @@ +Card Content + + Card Content + + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-card/docs-card.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-card/docs-card.spec.ts new file mode 100644 index 000000000000..93c5522d9ec6 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-card/docs-card.spec.ts @@ -0,0 +1,39 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-card/docs-card.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('creates cards with no links', () => { + const cardEl = markdownDocument.querySelectorAll('.docs-card')[0]; + + expect(cardEl.querySelector('h3')?.textContent?.trim()).toBe('No Link Card'); + expect(cardEl.tagName).not.toBe('A'); + }); + + it('creates cards withs links', () => { + const cardEl = markdownDocument.querySelectorAll('.docs-card')[1]; + + expect(cardEl.querySelector('h3')?.textContent?.trim()).toBe('Link Card'); + expect(cardEl.tagName).toBe('A'); + + expect(cardEl.getAttribute('href')).toBe('in/app/link'); + }); + + it('creates cards with svg images', () => { + const cardEl = markdownDocument.querySelectorAll('.docs-card')[2]; + + expect(cardEl.querySelector('h3')?.textContent?.trim()).toBe('Image Card'); + expect(cardEl.querySelector('svg')).toBeTruthy(); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code-block/docs-code-block.md b/adev/shared-docs/pipeline/guides/testing/docs-code-block/docs-code-block.md new file mode 100644 index 000000000000..6896608fd142 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code-block/docs-code-block.md @@ -0,0 +1,3 @@ +```typescript +this is a code block +``` \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code-block/docs-code-block.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-code-block/docs-code-block.spec.ts new file mode 100644 index 000000000000..d680c1cb701e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code-block/docs-code-block.spec.ts @@ -0,0 +1,24 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; +import {initHighlighter} from '../../extensions/docs-code/format/highlight'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + await initHighlighter(); + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-code-block/docs-code-block.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('converts triple ticks into a code block', () => { + const codeBlock = markdownDocument.querySelector('code'); + expect(codeBlock).toBeTruthy(); + expect(codeBlock?.textContent?.trim()).toBe('this is a code block'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code-multifile/docs-code-multifile.md b/adev/shared-docs/pipeline/guides/testing/docs-code-multifile/docs-code-multifile.md new file mode 100644 index 000000000000..af1c4329b15f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code-multifile/docs-code-multifile.md @@ -0,0 +1,4 @@ + +this is code +this is also code + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code-multifile/docs-code-multifile.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-code-multifile/docs-code-multifile.spec.ts new file mode 100644 index 000000000000..5e451194254e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code-multifile/docs-code-multifile.spec.ts @@ -0,0 +1,31 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; +import {initHighlighter} from '../../extensions/docs-code/format/highlight'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + await initHighlighter(); + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-code-multifile/docs-code-multifile.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('converts triple ticks into a code block', () => { + const multiFileEl = markdownDocument.querySelector('.docs-code-multifile'); + expect(multiFileEl).toBeTruthy(); + + const codeBlockOne = multiFileEl!.children[0]!; + expect(codeBlockOne).toBeTruthy(); + expect(codeBlockOne?.textContent?.trim()).toBe('this is code'); + + const codeBlockTwo = multiFileEl!.children[1]!; + expect(codeBlockTwo).toBeTruthy(); + expect(codeBlockTwo?.textContent?.trim()).toBe('this is also code'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code/docs-code.md b/adev/shared-docs/pipeline/guides/testing/docs-code/docs-code.md new file mode 100644 index 000000000000..fdf3ed5bb90d --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code/docs-code.md @@ -0,0 +1,10 @@ + +this is code + + + + + + + diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code/docs-code.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-code/docs-code.spec.ts new file mode 100644 index 000000000000..0c874ab268a8 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code/docs-code.spec.ts @@ -0,0 +1,55 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; +import {initHighlighter} from '../../extensions/docs-code/format/highlight'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + await initHighlighter(); + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-code/docs-code.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('converts docs-code elements into a code block', () => { + const codeBlock = markdownDocument.querySelectorAll('code')[0]; + expect(codeBlock).toBeTruthy(); + expect(codeBlock?.textContent?.trim()).toBe('this is code'); + }); + + it('removes eslint comments from the code', () => { + const codeBlock = markdownDocument.querySelectorAll('code')[1]; + expect(codeBlock).toBeTruthy(); + expect(codeBlock?.textContent?.trim()).not.toContain('// eslint'); + }); + + it('extract regions from the code', () => { + // This unit test is sensible to additional node, like text nodes between the lines. + // The specific index here makes sure there is no space/linebreak between the code lines + const codeBlock = markdownDocument.querySelectorAll('code')[2]; + expect(codeBlock).toBeTruthy(); + + expect(codeBlock?.textContent?.trim()).toContain(`const x = 'within the region';`); + expect(codeBlock?.textContent?.trim()).not.toContain('docregion'); + }); + + it('properly shows the diff of two provided file paths', () => { + const codeBlock = markdownDocument.querySelectorAll('code')[3]; + expect(codeBlock).toBeTruthy(); + + const codeLines = codeBlock.querySelectorAll('.line'); + expect(codeLines[0].textContent).toContain('oldFuncName'); + expect(codeLines[0].classList.contains('remove')).toBeTrue(); + + expect(codeLines[1].textContent).toContain('newName'); + expect(codeLines[1].classList.contains('add')).toBeTrue(); + + expect(codeLines[2].classList.contains('add')).toBeFalse(); + expect(codeLines[2].classList.contains('remove')).toBeFalse(); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code/example-with-eslint-comment.ts b/adev/shared-docs/pipeline/guides/testing/docs-code/example-with-eslint-comment.ts new file mode 100644 index 000000000000..b1b743d87a29 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code/example-with-eslint-comment.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line +const x = 1; diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code/example-with-region.ts b/adev/shared-docs/pipeline/guides/testing/docs-code/example-with-region.ts new file mode 100644 index 000000000000..54423ecdc001 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code/example-with-region.ts @@ -0,0 +1,3 @@ +// #docregion something +const x = 'within the region'; +// #enddocregion something diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code/new-code.ts b/adev/shared-docs/pipeline/guides/testing/docs-code/new-code.ts new file mode 100644 index 000000000000..489da8bfa5a2 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code/new-code.ts @@ -0,0 +1,6 @@ +function newName(param: boolean) { + if (param) { + return false; + } + return true; +} diff --git a/adev/shared-docs/pipeline/guides/testing/docs-code/old-code.ts b/adev/shared-docs/pipeline/guides/testing/docs-code/old-code.ts new file mode 100644 index 000000000000..8eff6f07668f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-code/old-code.ts @@ -0,0 +1,6 @@ +function oldFuncName(param: boolean) { + if (param) { + return false; + } + return 'yay!'; +} diff --git a/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/decoration.svg b/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/decoration.svg new file mode 100644 index 000000000000..73f6e51ac27c --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/decoration.svg @@ -0,0 +1,435 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/docs-decorative-header.md b/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/docs-decorative-header.md new file mode 100644 index 000000000000..b1483621ab6e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/docs-decorative-header.md @@ -0,0 +1,3 @@ + +This is header text + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/docs-decorative-header.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/docs-decorative-header.spec.ts new file mode 100644 index 000000000000..2039e8204a2d --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-decorative-header/docs-decorative-header.spec.ts @@ -0,0 +1,28 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-decorative-header/docs-decorative-header.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('sets the custom title in the header', () => { + expect(markdownDocument.querySelector('h1')?.textContent).toBe('Custom Title'); + }); + + it('includes provided svgs', () => { + expect(markdownDocument.querySelector('svg')).toBeTruthy(); + }); + + it('passes the header text to the content', () => { + expect(markdownDocument.querySelector('p')?.textContent?.trim()).toBe('This is header text'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-pill-row/docs-pill-row.md b/adev/shared-docs/pipeline/guides/testing/docs-pill-row/docs-pill-row.md new file mode 100644 index 000000000000..f0a36fa2b371 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-pill-row/docs-pill-row.md @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-pill-row/docs-pill-row.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-pill-row/docs-pill-row.spec.ts new file mode 100644 index 000000000000..7b1f2a4f6d91 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-pill-row/docs-pill-row.spec.ts @@ -0,0 +1,22 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-pill-row/docs-pill-row.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should create a nav container with all of the docs pills inside', () => { + const navEl = markdownDocument.querySelector('nav'); + expect(navEl?.children.length).toBe(2); + expect(navEl?.classList.contains('docs-pill-row')).toBeTrue(); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-pill/docs-pill.md b/adev/shared-docs/pipeline/guides/testing/docs-pill/docs-pill.md new file mode 100644 index 000000000000..14dfb4bb7bb5 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-pill/docs-pill.md @@ -0,0 +1,4 @@ +Text to force this as inline. + + + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-pill/docs-pill.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-pill/docs-pill.spec.ts new file mode 100644 index 000000000000..04170f616cd8 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-pill/docs-pill.spec.ts @@ -0,0 +1,33 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-pill/docs-pill.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should render links to anchors on the same page', () => { + const samePageEl = markdownDocument.querySelectorAll('a.docs-pill')[0]; + expect(samePageEl.textContent?.trim()).toBe('Same Page'); + }); + + it('should render external links with _blank target and iconography', () => { + const samePageEl = markdownDocument.querySelectorAll('a.docs-pill')[1]; + expect(samePageEl.getAttribute('target')).toBe('_blank'); + expect(samePageEl.textContent?.trim()).toContain('External Page'); + expect(samePageEl.querySelector('docs-icon')?.textContent).toBe('open_in_new'); + }); + + it('should render internal links that are relative paths', () => { + const samePageEl = markdownDocument.querySelectorAll('a.docs-pill')[2]; + expect(samePageEl.textContent?.trim()).toBe('Another Page'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-step/docs-step.md b/adev/shared-docs/pipeline/guides/testing/docs-step/docs-step.md new file mode 100644 index 000000000000..7c46f019a653 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-step/docs-step.md @@ -0,0 +1,6 @@ + + Do the first thing. + + + Do another thing after that. + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-step/docs-step.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-step/docs-step.spec.ts new file mode 100644 index 000000000000..c477c7653e5b --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-step/docs-step.spec.ts @@ -0,0 +1,53 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-step/docs-step.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should create a list item for each step', () => { + const stepEls = markdownDocument.querySelectorAll('li')!; + expect(stepEls.length).toBe(2); + }); + + it('should render each step with the provided information', () => { + const [firstStepEl, secondStepEl] = markdownDocument.querySelectorAll('li'); + + const firstStepAEl = firstStepEl.querySelector('a')!; + const firstStepTextContentEl = firstStepEl.querySelector('p')!; + const firstStepHeadingEl = firstStepEl.querySelector('h3')!; + + expect(firstStepHeadingEl.textContent?.trim()).toBe('Step 1'); + expect(firstStepTextContentEl.textContent).toContain('first thing'); + expect(firstStepAEl.getAttribute('href')).toBe(`#${firstStepHeadingEl.getAttribute('id')}`); + expect(firstStepAEl.getAttribute('tabindex')).toBe('-1'); + + expect(secondStepEl.querySelector('h3')?.textContent?.trim()).toBe('Step B'); + expect(secondStepEl.querySelector('p')?.textContent).toContain('another thing'); + }); + + it('should create a self referencial anchor for the step', () => { + const firstStepEl = markdownDocument.querySelector('li')!; + const firstStepAEl = firstStepEl.querySelector('a')!; + const firstStepHeadingEl = firstStepEl.querySelector('h3')!; + + expect(firstStepAEl.getAttribute('href')).toBe(`#${firstStepHeadingEl.getAttribute('id')}`); + expect(firstStepAEl.getAttribute('tabindex')).toBe('-1'); + }); + + it('should create a a link that is not reachable via tab', () => { + const firstStepEl = markdownDocument.querySelector('li')!; + const firstStepAEl = firstStepEl.querySelector('a')!; + + expect(firstStepAEl.getAttribute('tabindex')).toBe('-1'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-video/docs-video.md b/adev/shared-docs/pipeline/guides/testing/docs-video/docs-video.md new file mode 100644 index 000000000000..a1f4f87d8e62 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-video/docs-video.md @@ -0,0 +1,2 @@ +This is a video: + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-video/docs-video.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-video/docs-video.spec.ts new file mode 100644 index 000000000000..22d6eae6c160 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-video/docs-video.spec.ts @@ -0,0 +1,28 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-video/docs-video.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should create an iframe in a container', () => { + const videoContainerEl = markdownDocument.querySelector('.docs-video-container')!; + const iframeEl = videoContainerEl.children[0]; + + expect(videoContainerEl.children.length).toBe(1); + + expect(iframeEl.nodeName).toBe('IFRAME'); + expect(iframeEl.getAttribute('src')).toBeTruthy(); + expect(iframeEl.classList.contains('docs-video')).toBeTrue(); + expect(iframeEl.getAttribute('title')).toBeTruthy(); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/docs-workflow/docs-workflow.md b/adev/shared-docs/pipeline/guides/testing/docs-workflow/docs-workflow.md new file mode 100644 index 000000000000..e5e74a90ab70 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-workflow/docs-workflow.md @@ -0,0 +1,8 @@ + + + Do the first thing. + + + Do another thing after that. + + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/docs-workflow/docs-workflow.spec.ts b/adev/shared-docs/pipeline/guides/testing/docs-workflow/docs-workflow.spec.ts new file mode 100644 index 000000000000..94b5afa3162f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/docs-workflow/docs-workflow.spec.ts @@ -0,0 +1,22 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile( + runfiles.resolvePackageRelative('docs-workflow/docs-workflow.md'), + {encoding: 'utf-8'}, + ); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('create an ordered list container around the docs-steps', () => { + const docsWorkflowEl = markdownDocument.querySelector('.docs-steps')!; + expect(docsWorkflowEl.tagName).toBe('OL'); + expect(docsWorkflowEl.children.length).toBe(2); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/heading/heading.md b/adev/shared-docs/pipeline/guides/testing/heading/heading.md new file mode 100644 index 000000000000..1307a212f158 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/heading/heading.md @@ -0,0 +1,12 @@ +# Top Header (h1) +## Headers (h2) +### Smaller headers (h3) +#### Even smaller (h4) +##### Even more smaller (h5) +###### The smallest! (h6) +##### Another "more smaller" (h5) +## Duplicate Anchor +## Duplicate Anchor +## `myClass.myMethod` is the best +## ステップ 2 - アプリケーションのレイアウトに新しいコンポーネントを追加 +## My heading {# my-custom-id } \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/heading/heading.spec.ts b/adev/shared-docs/pipeline/guides/testing/heading/heading.spec.ts new file mode 100644 index 000000000000..40da4ab15b77 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/heading/heading.spec.ts @@ -0,0 +1,86 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('heading/heading.md'), { + encoding: 'utf-8', + }); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should treat # as document headers', () => { + const header = markdownDocument.querySelector('header'); + expect(header?.classList.contains('docs-header')).toBeTrue(); + }); + + it('should create a self referential link for non document headers', () => { + const h2 = markdownDocument.querySelector('h2'); + const h2Anchor = h2?.firstElementChild; + + const h2HeaderId = h2?.getAttribute('id'); + const h2AnchorHref = h2Anchor?.getAttribute('href'); + + expect(h2HeaderId).toContain('headers-h2'); + expect(h2AnchorHref).toBe(`#${h2HeaderId}`); + }); + + it('should make the docs anchors unreachable by tab', () => { + const docsAnchors = markdownDocument.querySelectorAll('.docs-anchor'); + for (const anchor of docsAnchors) { + expect(anchor.getAttribute('tabindex')).toBe('-1'); + } + }); + + it('increments when multiple duplicate header names are found', () => { + const headers = markdownDocument.querySelectorAll('a.docs-anchor'); + const knownRefs = new Set(); + for (const el of headers) { + const href = el.getAttribute('href'); + expect(knownRefs.has(href!)).toBeFalse(); + knownRefs.add(href!); + } + }); + + it('should remove code block markups', () => { + const h2List = markdownDocument.querySelectorAll('h2'); + const h2 = h2List[3]; + const h2Anchor = h2?.firstElementChild; + + const h2HeaderId = h2?.getAttribute('id'); + const h2AnchorHref = h2Anchor?.getAttribute('href'); + + expect(h2HeaderId).toContain('myclassmymethod-is-the-best'); + expect(h2AnchorHref).toBe(`#${h2HeaderId}`); + }); + + it('should be able to extract non-ascii ids', () => { + const h2List = markdownDocument.querySelectorAll('h2'); + const h2 = h2List[4]; + const h2Anchor = h2?.firstElementChild; + + const h2HeaderId = h2?.getAttribute('id'); + const h2AnchorHref = h2Anchor?.getAttribute('href'); + + expect(h2HeaderId).toContain( + 'ステップ-2---アプリケーションのレイアウトに新しいコンポーネントを追加', + ); + expect(h2AnchorHref).toBe(`#${h2HeaderId}`); + }); + + it('should be able to extract custom ids', () => { + const h2List = markdownDocument.querySelectorAll('h2'); + const h2 = h2List[5]; + const h2Anchor = h2?.firstElementChild; + + const h2HeaderId = h2?.getAttribute('id'); + const h2AnchorHref = h2Anchor?.getAttribute('href'); + + expect(h2HeaderId).toContain('my-custom-id'); + expect(h2AnchorHref).toBe(`#${h2HeaderId}`); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/image/image.md b/adev/shared-docs/pipeline/guides/testing/image/image.md new file mode 100644 index 000000000000..f8e9bcee3728 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/image/image.md @@ -0,0 +1,2 @@ +![New Logo!](https://angular.dev/favicon.ico 'Our new icon') +![New Logo!](./some-image.png 'Local Image') \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/image/image.spec.ts b/adev/shared-docs/pipeline/guides/testing/image/image.spec.ts new file mode 100644 index 000000000000..a8d82100ad2f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/image/image.spec.ts @@ -0,0 +1,25 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('image/image.md'), { + encoding: 'utf-8', + }); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should wrap images in custom classes', () => { + const image = markdownDocument.querySelector('img'); + expect(image?.classList.contains('docs-image')).toBeTrue(); + }); + + it('should handle images hosted internal to the application', () => { + const image = markdownDocument.querySelector('img[title="Local Image"]'); + expect(image?.getAttribute('src')).toBe('unknown/some-image.png'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/link/link.md b/adev/shared-docs/pipeline/guides/testing/link/link.md new file mode 100644 index 000000000000..a25130fef56e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/link/link.md @@ -0,0 +1,3 @@ +[Angular Site](https://angular.dev) +[same page](#test) +[same site](../other/page) \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/link/link.spec.ts b/adev/shared-docs/pipeline/guides/testing/link/link.spec.ts new file mode 100644 index 000000000000..05d5bd5a285c --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/link/link.spec.ts @@ -0,0 +1,27 @@ +import {readFile} from 'fs/promises'; +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; + +describe('markdown to html', () => { + let parsedMarkdown: string; + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('link/link.md'), { + encoding: 'utf-8', + }); + parsedMarkdown = await parseMarkdown(markdownContent, {}); + }); + + it('should render external links with _blank target', () => { + expect(parsedMarkdown).toContain( + 'Angular Site', + ); + }); + + it('should render links to anchors on the same page', () => { + expect(parsedMarkdown).toContain('same page'); + }); + + it('should render internal links that are relative paths', () => { + expect(parsedMarkdown).toContain('same site'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/list/list.md b/adev/shared-docs/pipeline/guides/testing/list/list.md new file mode 100644 index 000000000000..2e6b9ffc4064 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/list/list.md @@ -0,0 +1,10 @@ +# Ordered List +1. First Item +2. Another Item +3. Last in order + +# Unordered List +- Order +- here +- matter +- doesn't \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/list/list.spec.ts b/adev/shared-docs/pipeline/guides/testing/list/list.spec.ts new file mode 100644 index 000000000000..fb1ffb9a9d2e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/list/list.spec.ts @@ -0,0 +1,27 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('list/list.md'), { + encoding: 'utf-8', + }); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should wrap lists in custom classes', () => { + const orderedList = markdownDocument.querySelector('ol'); + expect(orderedList?.className).toBe('docs-ordered-list'); + expect(orderedList?.childElementCount).toBe(3); + expect(orderedList?.textContent).toContain('First Item'); + + const unorderedList = markdownDocument.querySelector('ul'); + expect(unorderedList?.className).toBe('docs-list'); + expect(unorderedList?.childElementCount).toBe(4); + expect(unorderedList?.textContent).toContain('matter'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/BUILD.bazel b/adev/shared-docs/pipeline/guides/testing/mermaid/BUILD.bazel new file mode 100644 index 000000000000..295f34d8c734 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/mermaid/BUILD.bazel @@ -0,0 +1,51 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "unit_test_lib", + testonly = True, + srcs = glob([ + "*.spec.ts", + ]), + deps = [ + "//adev/shared-docs/pipeline/guides", + "@npm//@bazel/runfiles", + "@npm//@types/jsdom", + "@npm//jsdom", + "@npm//marked", + ], +) + +ts_library( + name = "bootstrap", + testonly = True, + srcs = [ + "bootstrap.init.ts", + ], +) + +jasmine_node_test( + name = "unit_tests", + bootstrap = [ + ":bootstrap", + ], + data = [ + "@npm//@angular/build-tooling/bazel/browsers/chromium:chromium-for-generation", + "@npm//jsdom", + "@npm//mermaid", + "@npm//playwright-core", + ] + glob([ + "**/*.md", + "**/*.svg", + "**/*.ts", + ]), + env = { + "CHROME_BIN": "$(CHROMIUM)", + }, + tags = [ + "no-remote-exec", + ], + toolchains = [ + "@npm//@angular/build-tooling/bazel/browsers/chromium:toolchain_alias", + ], + deps = [":unit_test_lib"], +) diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/bootstrap.init.ts b/adev/shared-docs/pipeline/guides/testing/mermaid/bootstrap.init.ts new file mode 100644 index 000000000000..cf34cd255508 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/mermaid/bootstrap.init.ts @@ -0,0 +1,2 @@ +// Set HANDLE_MERMAID to true to test mermaid usage. +(global as any).HANDLE_MERMAID = true; diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md new file mode 100644 index 000000000000..56daf4428210 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.md @@ -0,0 +1,14 @@ +```mermaid + graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +``` + +```mermaid + pie title Pets adopted by volunteers + "Dogs" : 386 + "Cats" : 85 + "Rats" : 15 +``` \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts new file mode 100644 index 000000000000..9229018a53e7 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/mermaid/mermaid.spec.ts @@ -0,0 +1,28 @@ +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; +import {marked} from 'marked'; +import {docsCodeBlockExtension} from '../../extensions/docs-code/docs-code-block'; +import {walkTokens} from '../../walk-tokens'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('./mermaid.md'), { + encoding: 'utf-8', + }); + + marked.use({ + async: true, + extensions: [docsCodeBlockExtension], + walkTokens, + }); + markdownDocument = JSDOM.fragment(await marked.parse(markdownContent)); + }); + + it('should create an svg for each mermaid code block', () => { + const svgs = markdownDocument.querySelectorAll('svg'); + expect(svgs.length).toBe(2); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/table/table.md b/adev/shared-docs/pipeline/guides/testing/table/table.md new file mode 100644 index 000000000000..d4dce00341a9 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/table/table.md @@ -0,0 +1,5 @@ +| Sports | Season | +| ---------------- | ------ | +| Skiing | Winter | +| Baseball | Summer | +| Running | Year Round | \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/table/table.spec.ts b/adev/shared-docs/pipeline/guides/testing/table/table.spec.ts new file mode 100644 index 000000000000..b1448a0601d8 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/table/table.spec.ts @@ -0,0 +1,27 @@ +import {readFile} from 'fs/promises'; +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; + +describe('markdown to html', () => { + let parsedMarkdown: string; + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('table/table.md'), { + encoding: 'utf-8', + }); + parsedMarkdown = await parseMarkdown(markdownContent, {}); + }); + + it('should wrap the table in custom div', () => { + expect(parsedMarkdown).toContain('
'); + }); + + it('should place the initial row as table header cells', () => { + expect(parsedMarkdown).toContain('Sports'); + expect(parsedMarkdown).toContain('Season'); + }); + + it('should place the subsequent rows as regular table cells', () => { + expect(parsedMarkdown).toContain('Baseball'); + expect(parsedMarkdown).toContain('Year Round'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/testing/text/text.md b/adev/shared-docs/pipeline/guides/testing/text/text.md new file mode 100644 index 000000000000..1960b2d29f70 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/text/text.md @@ -0,0 +1,5 @@ +This is a string that contains an emoji, 😎. See there it was; + +# This header causes there to be two text areas + +This is a string without an emoji. \ No newline at end of file diff --git a/adev/shared-docs/pipeline/guides/testing/text/text.spec.ts b/adev/shared-docs/pipeline/guides/testing/text/text.spec.ts new file mode 100644 index 000000000000..744e97559aa5 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/testing/text/text.spec.ts @@ -0,0 +1,27 @@ +import {parseMarkdown} from '../../../guides/parse'; +import {runfiles} from '@bazel/runfiles'; +import {readFile} from 'fs/promises'; +import {JSDOM} from 'jsdom'; + +describe('markdown to html', () => { + let markdownDocument: DocumentFragment; + + beforeAll(async () => { + const markdownContent = await readFile(runfiles.resolvePackageRelative('text/text.md'), { + encoding: 'utf-8', + }); + markdownDocument = JSDOM.fragment(await parseMarkdown(markdownContent, {})); + }); + + it('should wrap emoji in custom classes', () => { + const emoji = markdownDocument.querySelector('span.docs-emoji'); + expect(emoji).toBeTruthy(); + expect(emoji?.textContent).toContain('😎'); + }); + + it('should not apply a custom class if no emoji is present', () => { + const [, noemoji] = markdownDocument.querySelectorAll('p'); + expect(noemoji).toBeTruthy(); + expect(noemoji?.textContent).not.toContain('😎'); + }); +}); diff --git a/adev/shared-docs/pipeline/guides/tranformations/heading.ts b/adev/shared-docs/pipeline/guides/tranformations/heading.ts new file mode 100644 index 000000000000..56965c2f202a --- /dev/null +++ b/adev/shared-docs/pipeline/guides/tranformations/heading.ts @@ -0,0 +1,39 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {RendererApi} from 'marked'; + +import {getHeaderId} from '../state'; +import {getPageTitle} from '../utils'; + +export const headingRender: RendererApi['heading'] = (text, level, raw) => { + if (level === 1) { + return ` +
+ + + ${getPageTitle(text)} +
+ `; + } + + // Nested anchor elements are invalid in HTML + // They might happen when we have a code block in a heading + // regex aren't perfect for that but this one should be "good enough" + const regex = /]*?\s+)?href.*?>(.*?)<\/a>/gi; + const anchorLessText = text.replace(regex, '$1'); + + const link = getHeaderId(anchorLessText); + const label = anchorLessText.replace(/`(.*?)`/g, '$1'); + + return ` + + ${label} + + `; +}; diff --git a/adev/shared-docs/pipeline/guides/tranformations/image.ts b/adev/shared-docs/pipeline/guides/tranformations/image.ts new file mode 100644 index 000000000000..5346a024a2d1 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/tranformations/image.ts @@ -0,0 +1,21 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {normalize} from 'path'; +import {RendererApi} from 'marked'; + +// TODO(josephperrott): Determine how we can define/know the image content base path. +const imageContentBasePath = 'unknown'; + +export const imageRender: RendererApi['image'] = (href, title, text) => { + const isRelativeSrc = href?.startsWith('./'); + const src = isRelativeSrc ? `${imageContentBasePath}/${normalize(href)}` : href; + return ` + ${text} + `; +}; diff --git a/adev/shared-docs/pipeline/guides/tranformations/link.ts b/adev/shared-docs/pipeline/guides/tranformations/link.ts new file mode 100644 index 000000000000..41b292ff26c1 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/tranformations/link.ts @@ -0,0 +1,15 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {anchorTarget} from '../helpers'; +import {RendererApi} from 'marked'; + +export const linkRender: RendererApi['link'] = (href, title, text) => { + const titleAttribute = title ? ` title=${title}` : ''; + return `${text}`; +}; diff --git a/adev/shared-docs/pipeline/guides/tranformations/list.ts b/adev/shared-docs/pipeline/guides/tranformations/list.ts new file mode 100644 index 000000000000..a41e8f9d7cf9 --- /dev/null +++ b/adev/shared-docs/pipeline/guides/tranformations/list.ts @@ -0,0 +1,24 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {RendererApi} from 'marked'; + +export const listRender: RendererApi['list'] = (body, ordered, start) => { + if (ordered) { + return ` +
    + ${body} +
+ `; + } + return ` +
    + ${body} +
+ `; +}; diff --git a/adev/shared-docs/pipeline/guides/tranformations/table.ts b/adev/shared-docs/pipeline/guides/tranformations/table.ts new file mode 100644 index 000000000000..b4a1ab945b6f --- /dev/null +++ b/adev/shared-docs/pipeline/guides/tranformations/table.ts @@ -0,0 +1,24 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {RendererApi} from 'marked'; + +export const tableRender: RendererApi['table'] = (header, body) => { + return ` +
+ + + ${header} + + + ${body} + +
+
+ `; +}; diff --git a/adev/shared-docs/pipeline/guides/tranformations/text.ts b/adev/shared-docs/pipeline/guides/tranformations/text.ts new file mode 100644 index 000000000000..7366c9e27c1d --- /dev/null +++ b/adev/shared-docs/pipeline/guides/tranformations/text.ts @@ -0,0 +1,22 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {RendererApi} from 'marked'; +import emojiRegex from 'emoji-regex'; + +/** Regex to find unicode emojis. */ +const UNICODE_EMOJI_REGEX = /&#x[\dA-Fa-f]+;/g; + +/** Regex to find emojis. */ +const regex = emojiRegex(); + +export const textRender: RendererApi['text'] = (text) => { + return regex.test(text) || UNICODE_EMOJI_REGEX.test(text) + ? `${text}` + : text; +}; diff --git a/adev/shared-docs/pipeline/guides/utils.ts b/adev/shared-docs/pipeline/guides/utils.ts new file mode 100644 index 000000000000..f7e74033931c --- /dev/null +++ b/adev/shared-docs/pipeline/guides/utils.ts @@ -0,0 +1,50 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {existsSync, readFileSync} from 'fs'; +import {join} from 'path'; +import {cwd} from 'process'; + +// TODO(josephperrott): Set edit content url based on the owner, repo and branch. + +/** The base url for edting the a file in the repository. */ +const GITHUB_EDIT_CONTENT_URL = 'https://github.com/angular/angular/edit/main'; + +/** Get the page title with edit button to modify the page source. */ +export function getPageTitle(text: string): string { + return ` + +
+

${text}

+ + + edit + +
`; +} + +/** Configuration using environment for parser, providing context. */ +export interface ParserContext { + markdownFilePath?: string; +} + +let context: ParserContext = {}; +export function setContext(envContext: Partial) { + context = envContext; +} + +/** The base directory of the workspace the script is running in. */ +const WORKSPACE_DIR = cwd(); + +export function loadWorkspaceRelativeFile(filePath: string): string { + const fullFilePath = join(WORKSPACE_DIR, filePath); + if (!existsSync(fullFilePath)) { + throw Error(`Cannot find: ${filePath}`); + } + return readFileSync(fullFilePath, {encoding: 'utf-8'}); +} diff --git a/adev/shared-docs/pipeline/guides/walk-tokens.ts b/adev/shared-docs/pipeline/guides/walk-tokens.ts new file mode 100644 index 000000000000..12e8ff878f5e --- /dev/null +++ b/adev/shared-docs/pipeline/guides/walk-tokens.ts @@ -0,0 +1,28 @@ +import {Token} from 'marked'; +import {DocsCodeToken} from './extensions/docs-code/docs-code'; + +/** + * Describe a HANDLE_MERMAID value which esbuild will use at build time to determine if the mermaid + * related code should be included in the bundle. + * THIS VALUE IS NOT AVAILABLE AT RUNTIME. + */ +export declare const HANDLE_MERMAID: boolean; + +/** Type guard for if a provided token is the DocsCodeToken. */ +function isDocsCodeToken(token: Token): token is DocsCodeToken { + return !!(token as DocsCodeToken).language; +} + +/** + * Handle the provided token based on the token itself replacing its content/data in place + * as appropriate. + */ +export async function walkTokens(token: Token): Promise { + if (!isDocsCodeToken(token) || token.language !== 'mermaid') { + return; + } + + if (HANDLE_MERMAID) { + return (await import('./mermaid')).processMermaidCodeBlock(token); + } +} diff --git a/adev/shared-docs/pipeline/tutorials/BUILD.bazel b/adev/shared-docs/pipeline/tutorials/BUILD.bazel new file mode 100644 index 000000000000..40e1384f93c0 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/BUILD.bazel @@ -0,0 +1,53 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "editor", + srcs = glob( + [ + "*.ts", + ], + exclude = [ + "playground.ts", + "tutorial.ts", + ], + ), + deps = [ + "//adev/shared-docs/interfaces", + "@npm//@types/node", + "@npm//@webcontainer/api", + "@npm//fast-glob", + ], +) + +ts_library( + name = "playground", + srcs = [ + "playground.ts", + ], + visibility = [ + "//adev/shared-docs:__subpackages__", + ], + deps = [ + ":editor", + "//adev/shared-docs/interfaces", + "@npm//@types/node", + "@npm//fast-glob", + ], +) + +ts_library( + name = "tutorials", + srcs = [ + "tutorial.ts", + ], + visibility = [ + "//adev/shared-docs:__subpackages__", + ], + deps = [ + ":editor", + "//adev/shared-docs/interfaces", + "@npm//@types/node", + ], +) diff --git a/adev/shared-docs/pipeline/tutorials/common/.gitignore b/adev/shared-docs/pipeline/tutorials/common/.gitignore new file mode 100644 index 000000000000..0711527ef9d5 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/.gitignore @@ -0,0 +1,42 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings + +# System files +.DS_Store +Thumbs.db diff --git a/adev/shared-docs/pipeline/tutorials/common/BUILD.bazel b/adev/shared-docs/pipeline/tutorials/common/BUILD.bazel new file mode 100644 index 000000000000..706e35dbb1c7 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/BUILD.bazel @@ -0,0 +1,5 @@ +filegroup( + name = "files", + srcs = glob(["**/*"]), + visibility = ["//visibility:public"], +) diff --git a/adev/shared-docs/pipeline/tutorials/common/angular.json b/adev/shared-docs/pipeline/tutorials/common/angular.json new file mode 100644 index 000000000000..b9d216be0bd3 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/angular.json @@ -0,0 +1,99 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "first-app": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "inlineTemplate": true, + "inlineStyle": true, + "style": "scss", + "skipTests": true + }, + "@schematics/angular:class": { + "skipTests": true + }, + "@schematics/angular:directive": { + "skipTests": true + }, + "@schematics/angular:guard": { + "skipTests": true + }, + "@schematics/angular:interceptor": { + "skipTests": true + }, + "@schematics/angular:pipe": { + "skipTests": true + }, + "@schematics/angular:resolver": { + "skipTests": true + }, + "@schematics/angular:service": { + "skipTests": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": "dist/first-app", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": ["src/favicon.ico", "src/assets"], + "styles": ["src/styles.css"], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "first-app:build:production" + }, + "development": { + "buildTarget": "first-app:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "first-app:build" + } + } + } + } + } +} diff --git a/adev/shared-docs/pipeline/tutorials/common/package-lock.json b/adev/shared-docs/pipeline/tutorials/common/package-lock.json new file mode 100644 index 000000000000..a7ddd37c4f8b --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/package-lock.json @@ -0,0 +1,12426 @@ +{ + "name": "angular.dev", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "angular.dev", + "version": "0.0.0", + "dependencies": { + "@angular/common": "^17.0.0-rc.1", + "@angular/compiler": "^17.0.0-rc.1", + "@angular/core": "^17.0.0-rc.1", + "@angular/platform-browser": "^17.0.0-rc.1", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.0.0-rc.2", + "@angular/cli": "^17.0.0-rc.2", + "@angular/compiler-cli": "^17.0.0-rc.1", + "typescript": "~5.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1700.0-rc.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1700.0-rc.2.tgz", + "integrity": "sha512-+1GpG59fHgHNdqnDxXDa801vunrxSHDQohtS2s9ltuWDrl29vptdHLXCAWpP7OD+MD7+gab5jQqIDNCXats8gw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.0.0-rc.2", + "rxjs": "7.8.1" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular": { + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.0.0-rc.2.tgz", + "integrity": "sha512-lRWtwbZtk1VQ0XhJ97M0ijzLld5aAlx/CyxK1CBveP05i3FjdhQ4sH0MFf/bqkDr7kDc9WhDikryKEIdpcKE5w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1700.0-rc.2", + "@angular-devkit/build-webpack": "0.1700.0-rc.2", + "@angular-devkit/core": "17.0.0-rc.2", + "@babel/core": "7.23.2", + "@babel/generator": "7.23.0", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-transform-async-generator-functions": "7.23.2", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.23.2", + "@babel/preset-env": "7.23.2", + "@babel/runtime": "7.23.2", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "17.0.0-rc.2", + "@vitejs/plugin-basic-ssl": "1.0.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.16", + "babel-loader": "9.1.3", + "babel-plugin-istanbul": "6.1.1", + "browser-sync": "2.29.3", + "browserslist": "^4.21.5", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild-wasm": "0.19.5", + "fast-glob": "3.3.1", + "http-proxy-middleware": "2.0.6", + "https-proxy-agent": "7.0.2", + "inquirer": "9.2.11", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.2.0", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.30.5", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "4.1.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.69.5", + "sass-loader": "13.3.2", + "semver": "7.5.4", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.22.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.6.2", + "vite": "4.5.0", + "webpack": "5.89.0", + "webpack-dev-middleware": "6.1.1", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.10.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.19.5" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", + "@angular/localize": "^17.0.0 || ^17.0.0-next.0", + "@angular/platform-server": "^17.0.0 || ^17.0.0-next.0", + "@angular/service-worker": "^17.0.0 || ^17.0.0-next.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^17.0.0 || ^17.0.0-next.1", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.2 <5.3" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1700.0-rc.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-rc.2.tgz", + "integrity": "sha512-yOI3cXXpkLnTlqMqXik1ATFWCgPZdR7Rv3eG67mD8QaMIShubFb82HQLKcb34SQJxf6HntYw7X6d5xnKbHwnvQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1700.0-rc.2", + "rxjs": "7.8.1" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.0.0-rc.2.tgz", + "integrity": "sha512-z68Y+JhcDsTv9TVOX5tmuR7bRrTMLCP/3AxUeJ9kZW4UdCeZA77ya0k7F1XpkyCb2JTM/5+yYXTigxMh6Jhr8g==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.0.0-rc.2.tgz", + "integrity": "sha512-WW4mQdCGZ2YA6g2r10571hKxCMwkiVEoOF69GjBzLfIr4YBF6bcXcczqgGyeOtbTT3xy7FbTcdNZ7/l9K4XLDQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.0.0-rc.2", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.5", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli": { + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.0.0-rc.2.tgz", + "integrity": "sha512-2Xl2e5PzD3MyNpf3Urbs1esHBqY5faPcqsRwFvHC2yo+X0M1n64D6uuKQ5+gbPnEbUc5KKi04QiFEsCbPIW/mw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1700.0-rc.2", + "@angular-devkit/core": "17.0.0-rc.2", + "@angular-devkit/schematics": "17.0.0-rc.2", + "@schematics/angular": "17.0.0-rc.2", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "4.1.1", + "inquirer": "9.2.11", + "jsonc-parser": "3.2.0", + "npm-package-arg": "11.0.1", + "npm-pick-manifest": "9.0.0", + "open": "8.4.2", + "ora": "5.4.1", + "pacote": "17.0.4", + "resolve": "1.22.8", + "semver": "7.5.4", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.0.0-rc.1.tgz", + "integrity": "sha512-E51n8DdHY6WvP2OCBK9saIeGOjqCsekTxJ9Dx52kD/ZSI5JyQHUmxnCiGbp6rbxPBSli/0CS/6OabX7tVYq2Mg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18.13.0" + }, + "peerDependencies": { + "@angular/core": "17.0.0-rc.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.0.0-rc.1.tgz", + "integrity": "sha512-h1HNvTNbroMo2YUtn6K/i0LKQUlAPQJb/Bq+nz1TyxnDI5nYGbRJ8WycQyGwRVrfvLkghkkCGzQqIHEUmZ3rSw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18.13.0" + }, + "peerDependencies": { + "@angular/core": "17.0.0-rc.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.0.0-rc.1.tgz", + "integrity": "sha512-qGom6m5NXj8mB2laXm/xv5th2Vo5iwR0eSOW5VbvU7mCAhwx6WwlWd/jNaf58w1GygrU9p0ay8CHOv4yIK26Kw==", + "dev": true, + "dependencies": { + "@babel/core": "7.23.2", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": ">=18.13.0" + }, + "peerDependencies": { + "@angular/compiler": "17.0.0-rc.1", + "typescript": ">=5.2 <5.3" + } + }, + "node_modules/@angular/core": { + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.0.0-rc.1.tgz", + "integrity": "sha512-qz5Xjye2XkmBp+4vSxpPVM6yXs/36oXx/FUQa6PDP/DrW9wrCxSELf2g9PHT84xDgq6BhBqca0a4fq+QFURTqg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18.13.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.0.0-rc.1.tgz", + "integrity": "sha512-y1YzN36AmvWMKNjJ0P8OVcnymCuc16xt/hHmEgDDu7ky5TfBO5OTm26DVySdGVuJdkz0M1sTbyyRuGDrhxRu7A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=18.13.0" + }, + "peerDependencies": { + "@angular/animations": "17.0.0-rc.1", + "@angular/common": "17.0.0-rc.1", + "@angular/core": "17.0.0-rc.1" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "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" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@ljharb/through": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz", + "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@ngtools/webpack": { + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.0.0-rc.2.tgz", + "integrity": "sha512-V/FEtXh0tnoUQsdY9Q7QrkjSF9tvKFhm5mTC/qj2WMq+e53cT/HbeAcUvZMyKsNmr/1SWm6xv4BhIwPHPIq7yg==", + "dev": true, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^17.0.0 || ^17.0.0-next.0", + "typescript": ">=5.2 <5.3", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.0.tgz", + "integrity": "sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/agent/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.3.tgz", + "integrity": "sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz", + "integrity": "sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==", + "dev": true, + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.1.tgz", + "integrity": "sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@schematics/angular": { + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.0.0-rc.2.tgz", + "integrity": "sha512-ZkQiiz2r8onJJEZlxJl9j2X12Tm7ZJaZlnxmbSryT8vkHX8g6xtB9RgLfSAoojrHj0n/io314fFnu9C0tBWsRQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.0.0-rc.2", + "@angular-devkit/schematics": "17.0.0-rc.2", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": ">=18.13.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.1.0.tgz", + "integrity": "sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.1.0.tgz", + "integrity": "sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.2.0.tgz", + "integrity": "sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.0.tgz", + "integrity": "sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.12.tgz", + "integrity": "sha512-ky0kWSqXVxSqgqJvPIkgFkcn4C8MnRog308Ou8xBBIVo39OmUFy+jqNe0nPwLCDFxUpmT9EvT91YzOJgkDRcFg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", + "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.15.tgz", + "integrity": "sha512-n91JxbNLD8eQIuXDIChAN1tCKNWCEgpceU9b7ZMbFA+P+Q4yIeh80jizFLEvolRPc1ES0VdwFlGv+kJTSirogw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.6.tgz", + "integrity": "sha512-P6bY56TVmX8y9J87jHNgQh43h6VVU+6H7oN7hgvivV81K2XY8qJZ5vqPy/HdUoVIelii2kChYVzQanlswPWVFw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.39", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", + "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.13", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", + "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz", + "integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.3.tgz", + "integrity": "sha512-4KG+yMEuvDPRrYq5fyVm/I2uqAJSAwZK9VSa+Zf+zUq9/oxSSvy3kkIqyL+jjStv6UCVi8/Aho0NHtB1Fwosrg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", + "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.35", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.35.tgz", + "integrity": "sha512-tIF57KB+ZvOBpAQwSaACfEu7htponHXaFzP7RfKYgsOS0NoYnn+9+jzp7bbq4fWerizI3dTB4NfAZoyeQKWJLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.8.tgz", + "integrity": "sha512-flUksGIQCnJd6sZ1l5dqCEG/ksaoAg/eUwiLAGTJQcfgvZJKF++Ta4bJA6A5aPSJmsr+xlseHn4KLgVlNnvPTg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.29.3.tgz", + "integrity": "sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==", + "dev": true, + "dependencies": { + "browser-sync-client": "^2.29.3", + "browser-sync-ui": "^2.29.3", + "bs-recipes": "1.3.4", + "chalk": "4.1.2", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "^4.0.1", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.2.0", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "^4.4.1", + "ua-parser-js": "^1.0.33", + "yargs": "^17.3.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.29.3.tgz", + "integrity": "sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==", + "dev": true, + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz", + "integrity": "sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==", + "dev": true, + "dependencies": { + "async-each-series": "0.1.1", + "chalk": "4.1.2", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^4.4.1", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync-ui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync-ui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync-ui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/browser-sync-ui/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync-ui/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/browser-sync/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/browser-sync/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/browser-sync/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-sync/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==", + "dev": true + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.0.tgz", + "integrity": "sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001551", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", + "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", + "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", + "dev": true, + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/critters": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==", + "dev": true + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "dev": true, + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-4.0.1.tgz", + "integrity": "sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eazy-logger/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eazy-logger/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eazy-logger/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eazy-logger/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eazy-logger/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.559", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.559.tgz", + "integrity": "sha512-iS7KhLYCSJbdo3rUSkhDTVuFNCV34RKs2UaB9Ecr7VlqzjjWW//0nfsFF5dtDmyXlZQaDYYtID5fjtC/6lpRug==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", + "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-client": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", + "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", + "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.5.tgz", + "integrity": "sha512-7zmLLn2QCj93XfMmHtzrDJ1UBuOHB2CZz1ghoCEZiRajxjUvHsF40PnbzFIY/pmesqPRaEtEWii0uzsTbnAgrA==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/express/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", + "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/inquirer": { + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", + "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/localtunnel/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/localtunnel/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache/node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-fetch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^11.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.0.tgz", + "integrity": "sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz", + "integrity": "sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz", + "integrity": "sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-17.0.4.tgz", + "integrity": "sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==", + "dev": true, + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.1.0.tgz", + "integrity": "sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "dependencies": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.0.tgz", + "integrity": "sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==", + "dev": true, + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==", + "dev": true + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sass/node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true, + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.1.0.tgz", + "integrity": "sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^2.1.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.1.0", + "@sigstore/tuf": "^2.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", + "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dev": true, + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-client": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", + "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/ssri": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dev": true, + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/terser": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tuf-js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.1.0.tgz", + "integrity": "sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==", + "dev": true, + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz", + "integrity": "sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==", + "dev": true, + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.36", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.36.tgz", + "integrity": "sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.0.tgz", + "integrity": "sha512-Sz0G0TjMuyApIcuTJeK742+xLLKEPjYtkdBEazBlYePHkICVp9DPKqI/4dJt3LCtQBd52sCxz23uAFJ2OJa6Ow==", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/adev/shared-docs/pipeline/tutorials/common/package.json.template b/adev/shared-docs/pipeline/tutorials/common/package.json.template new file mode 100644 index 000000000000..ec3ac40c8a6c --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/package.json.template @@ -0,0 +1,26 @@ +{ + "name": "angular.dev", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "NG_BUILD_PARALLEL_TS=0 ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development" + }, + "private": true, + "dependencies": { + "@angular/common": "^17.0.0-rc.1", + "@angular/compiler": "^17.0.0-rc.1", + "@angular/core": "^17.0.0-rc.1", + "@angular/platform-browser": "^17.0.0-rc.1", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.14.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^17.0.0-rc.2", + "@angular/cli": "^17.0.0-rc.2", + "@angular/compiler-cli": "^17.0.0-rc.1", + "typescript": "~5.2.0" + } +} diff --git a/adev/shared-docs/pipeline/tutorials/common/src/app/app.config.ts b/adev/shared-docs/pipeline/tutorials/common/src/app/app.config.ts new file mode 100644 index 000000000000..56bb7c8e971e --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/src/app/app.config.ts @@ -0,0 +1,13 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {ApplicationConfig} from '@angular/core'; + +export const appConfig: ApplicationConfig = { + providers: [], +}; diff --git a/adev/shared-docs/pipeline/tutorials/common/src/assets/.gitkeep b/adev/shared-docs/pipeline/tutorials/common/src/assets/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/adev/shared-docs/pipeline/tutorials/common/src/assets/angular.svg b/adev/shared-docs/pipeline/tutorials/common/src/assets/angular.svg new file mode 100644 index 000000000000..57d353b2643c --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/src/assets/angular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/adev/shared-docs/pipeline/tutorials/common/src/favicon.ico b/adev/shared-docs/pipeline/tutorials/common/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..997406ad22c29aae95893fb3d666c30258a09537 GIT binary patch literal 948 zcmV;l155mgP)CBYU7IjCFmI-B}4sMJt3^s9NVg!P0 z6hDQy(L`XWMkB@zOLgN$4KYz;j0zZxq9KKdpZE#5@k0crP^5f9KO};h)ZDQ%ybhht z%t9#h|nu0K(bJ ztIkhEr!*UyrZWQ1k2+YkGqDi8Z<|mIN&$kzpKl{cNP=OQzXHz>vn+c)F)zO|Bou>E z2|-d_=qY#Y+yOu1a}XI?cU}%04)zz%anD(XZC{#~WreV!a$7k2Ug`?&CUEc0EtrkZ zL49MB)h!_K{H(*l_93D5tO0;BUnvYlo+;yss%n^&qjt6fZOa+}+FDO(~2>G z2dx@=JZ?DHP^;b7*Y1as5^uphBsh*s*z&MBd?e@I>-9kU>63PjP&^#5YTOb&x^6Cf z?674rmSHB5Fk!{Gv7rv!?qX#ei_L(XtwVqLX3L}$MI|kJ*w(rhx~tc&L&xP#?cQow zX_|gx$wMr3pRZIIr_;;O|8fAjd;1`nOeu5K(pCu7>^3E&D2OBBq?sYa(%S?GwG&_0-s%_v$L@R!5H_fc)lOb9ZoOO#p`Nn`KU z3LTTBtjwo`7(HA6 z7gmO$yTR!5L>Bsg!X8616{JUngg_@&85%>W=mChTR;x4`P=?PJ~oPuy5 zU-L`C@_!34D21{fD~Y8NVnR3t;aqZI3fIhmgmx}$oc-dKDC6Ap$Gy>a!`A*x2L1v0 WcZ@i?LyX}70000 + + + + Common + + + + + + + + diff --git a/adev/shared-docs/pipeline/tutorials/common/src/main.ts b/adev/shared-docs/pipeline/tutorials/common/src/main.ts new file mode 100644 index 000000000000..0ff1c273f4cf --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/src/main.ts @@ -0,0 +1,13 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {bootstrapApplication} from '@angular/platform-browser'; +import {appConfig} from './app/app.config'; +import {AppComponent} from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err)); diff --git a/adev/shared-docs/pipeline/tutorials/common/src/styles.css b/adev/shared-docs/pipeline/tutorials/common/src/styles.css new file mode 100644 index 000000000000..2a37a8dfc705 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/src/styles.css @@ -0,0 +1,4 @@ +/* You can add global styles to this file, and also import other style files */ +body { + font-family: 'Be Vietnam Pro', sans-serif; +} \ No newline at end of file diff --git a/adev/shared-docs/pipeline/tutorials/common/tsconfig.app.json b/adev/shared-docs/pipeline/tutorials/common/tsconfig.app.json new file mode 100644 index 000000000000..f64f655d52d1 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/tsconfig.app.json @@ -0,0 +1,10 @@ +/* To learn more about this file see: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"] +} diff --git a/adev/shared-docs/pipeline/tutorials/common/tsconfig.json b/adev/shared-docs/pipeline/tutorials/common/tsconfig.json new file mode 100644 index 000000000000..bc12e24b138b --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/common/tsconfig.json @@ -0,0 +1,31 @@ +/* To learn more about this file see: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": ["ES2022", "dom"] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true, + "_enabledBlockTypes": ["if", "for"] + } +} diff --git a/adev/shared-docs/pipeline/tutorials/metadata.ts b/adev/shared-docs/pipeline/tutorials/metadata.ts new file mode 100644 index 000000000000..fd860845c516 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/metadata.ts @@ -0,0 +1,73 @@ +import {join, dirname} from 'path'; +import {glob} from 'fast-glob'; +import { + FileAndContentRecord, + PackageJson, + TutorialConfig, + TutorialMetadata, +} from '../../interfaces'; +import {getFileContents} from './utils'; + +/** Generate the metadata.json content for a provided tutorial config. */ +export async function generateMetadata( + path: string, + config: TutorialConfig, + files: FileAndContentRecord, +): Promise { + const tutorialFiles: FileAndContentRecord = {}; + const {dependencies, devDependencies} = JSON.parse(files['package.json']) as PackageJson; + + config.openFiles?.forEach((file) => (tutorialFiles[file] = files[file])); + + return { + type: config.type, + openFiles: config.openFiles || [], + allFiles: Object.keys(files), + tutorialFiles, + answerFiles: await getAnswerFiles(path, config, files), + hiddenFiles: config.openFiles + ? Object.keys(files).filter((filename) => !config.openFiles!.includes(filename)) + : [], + dependencies: { + ...dependencies, + ...devDependencies, + }, + }; +} + +/** Generate the answer files for the metadata.json. */ +async function getAnswerFiles( + path: string, + config: TutorialConfig, + files: FileAndContentRecord, +): Promise { + const answerFiles: FileAndContentRecord = {}; + const answerPrefix = 'answer/'; + + if (config.answerSrc) { + const answersDir = join(path, config.answerSrc); + const answerFilePaths = await glob('**/*', { + cwd: answersDir, + onlyFiles: true, + absolute: true, + }); + answerFilePaths.forEach((absolutePath) => { + // We use the absolute file in order to read the content, but the key + // needs to be a relative path within the project. + const parentDir = dirname(answersDir) + '/'; + const pathStart = absolutePath.indexOf(parentDir); + if (pathStart === -1) { + throw new Error('Invalid state: could not find start of answers path'); + } + answerFiles[absolutePath.slice(pathStart + parentDir.length)] = getFileContents(absolutePath); + }); + } else { + Object.keys(files).forEach((file) => { + if (file.includes(answerPrefix)) { + answerFiles[file.replace(answerPrefix, '')] = files[file]; + } + }); + } + + return answerFiles; +} diff --git a/adev/shared-docs/pipeline/tutorials/playground.ts b/adev/shared-docs/pipeline/tutorials/playground.ts new file mode 100644 index 000000000000..a6188ea29af4 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/playground.ts @@ -0,0 +1,75 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {join} from 'path'; +import {FileAndContentRecord} from '../../interfaces'; +import {existsSync, mkdirSync, writeFileSync} from 'fs'; +import {addDirectoryToFilesRecord, findAllConfigs} from './utils'; +import {generateMetadata} from './metadata'; +import {generateSourceCode} from './source-code'; +import {generatePlaygroundRoutes} from './routes'; + +/** + * Generates the playground files for the playground directory. + * + * Creates a routes file for the overall playground, and metadata and soure-code files for + * each of the plaground entries. + */ +async function generatePlaygroundFiles( + playgroundDir: string, + commonDir: string, + outputDir: string, +) { + /** All files available in the playground entries. */ + const files: FileAndContentRecord = {}; + /** All of the configs, one for each playground entry. */ + const configs = await findAllConfigs(playgroundDir); + + // Add all of the files from the common directory into the files record. + await addDirectoryToFilesRecord(files, commonDir); + + // If the playground directory provides additional common files, add them to the files record. + const commonPlaygroundDir = join(playgroundDir, 'common'); + if (existsSync(commonPlaygroundDir)) { + await addDirectoryToFilesRecord(files, commonPlaygroundDir); + } + + // For each playground entry, generate the metadata and source-code files. + for (const [path, config] of Object.entries(configs)) { + /** Duplication of the common shared files to add the playground entry files in. */ + const itemFiles = {...files}; + /** Directory of the current config. */ + const configDir = join(playgroundDir, path); + + await addDirectoryToFilesRecord(itemFiles, configDir); + + // Ensure the directory for the playground entry exists, then write the metadata + // and source-code files. + mkdirSync(join(outputDir, path), {recursive: true}); + writeFileSync( + join(outputDir, path, 'metadata.json'), + JSON.stringify(await generateMetadata(configDir, config, itemFiles)), + ); + writeFileSync( + join(outputDir, path, 'source-code.json'), + JSON.stringify(await generateSourceCode(config, itemFiles)), + ); + } + + // Generate the playground routes, and write the file. + writeFileSync( + join(outputDir, 'routes.json'), + JSON.stringify(await generatePlaygroundRoutes(configs)), + ); +} + +// Immediately invoke the generation. +(async () => { + const [playgroundDir, commonDir, outputDir] = process.argv.slice(2); + await generatePlaygroundFiles(playgroundDir, commonDir, outputDir); +})(); diff --git a/adev/shared-docs/pipeline/tutorials/routes.ts b/adev/shared-docs/pipeline/tutorials/routes.ts new file mode 100644 index 000000000000..2506e081c858 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/routes.ts @@ -0,0 +1,73 @@ +import { + PlaygroundRouteData, + TutorialConfig, + TutorialNavigationItemWithStep, + TutorialNavigationItem, +} from '../../interfaces'; + +export async function generatePlaygroundRoutes( + configs: Record, +): Promise { + const templates = Object.entries(configs).map(([path, config]) => ({ + path: `playground/${path}`, + label: config.title, + })); + + return { + templates, + defaultTemplate: templates[0], + starterTemplate: templates[templates.length - 1], + }; +} + +export async function generateTutorialRoutes( + tutorialName: string, + introConfig: TutorialConfig, + stepConfigs: Record, +): Promise { + const children: TutorialNavigationItem[] = Object.entries(stepConfigs) + // Sort using the number prefix from the step directory name. + .sort(([pathA], [pathB]) => + Number(pathA.split('-')[0]) > Number(pathB.split('-')[0]) ? 1 : -1, + ) + .map(([path, config], idx) => { + return { + label: config.title, + path: `tutorials/${tutorialName}/${path}`, + contentPath: `tutorials/${tutorialName}/steps/${path}/README`, + tutorialData: { + title: config.title, + type: config.type, + step: idx + 1, + }, + }; + }); + + children.forEach((child, idx, childrenArr) => { + if (idx > 0) { + const prevStep = childrenArr.at(idx - 1); + if (prevStep) { + child.tutorialData.previousStep = prevStep.path; + } + } + if (idx < childrenArr.length - 1) { + const nextStep = childrenArr.at(idx + 1); + if (nextStep) { + child.tutorialData.nextStep = nextStep.path; + } + } + }); + + return { + path: `tutorials/${tutorialName}`, + label: introConfig.title, + contentPath: `tutorials/${tutorialName}/intro/README`, + tutorialData: { + step: 0, + title: introConfig.title, + type: introConfig.type, + nextStep: children[0].path, + }, + children: children, + }; +} diff --git a/adev/shared-docs/pipeline/tutorials/source-code.ts b/adev/shared-docs/pipeline/tutorials/source-code.ts new file mode 100644 index 000000000000..63b6ddfc5990 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/source-code.ts @@ -0,0 +1,13 @@ +import {FileSystemTree} from '@webcontainer/api'; +import {FileAndContentRecord, TutorialConfig} from '../../interfaces'; +import {getFileSystemTree} from './webcontainers'; + +/** Generate the source-code.json content for a provided tutorial config. */ +export async function generateSourceCode( + config: TutorialConfig, + files: FileAndContentRecord, +): Promise { + // TODO(josephperrott): figure out if filtering is needed for this. + const allFiles = Object.keys(files); + return getFileSystemTree(allFiles, files); +} diff --git a/adev/shared-docs/pipeline/tutorials/tutorial.ts b/adev/shared-docs/pipeline/tutorials/tutorial.ts new file mode 100644 index 000000000000..7d568d930136 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/tutorial.ts @@ -0,0 +1,92 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {basename, join} from 'path'; +import {FileAndContentRecord} from '../../interfaces'; +import {existsSync, mkdirSync, writeFileSync} from 'fs'; +import {addDirectoryToFilesRecord, findAllConfigs, findConfig} from './utils'; +import {generateMetadata} from './metadata'; +import {generateSourceCode} from './source-code'; +import {generateTutorialRoutes} from './routes'; + +/** + * Generates the files for the provided tutorial directory. + * + * Creates a routes file for the tutorial, and metadata and soure-code files for + * each of the tutorial steps. + */ +async function generateTutorialFiles(tutorialDir: string, commonDir: string, outputDir: string) { + /** All files available in the tutorial entries. */ + const files: FileAndContentRecord = {}; + /** List of configs for each step in the tutorial. */ + const stepConfigs = await findAllConfigs(join(tutorialDir, 'steps')); + /** Directory of the intro. */ + const introDir = join(tutorialDir, 'intro'); + /** The configuration for the intro (landing page) of the tutorial. */ + const introConfig = await findConfig(introDir); + /** The name of the tutorial, as determined by the tutorial directory name. */ + const tutorialName = basename(tutorialDir); + + // Add all of the files from the common directory into the files record + await addDirectoryToFilesRecord(files, commonDir); + + // If the tutorial directory provides additional common files, add them to the files record. + const commonTutorialDir = join(tutorialDir, 'common'); + if (existsSync(commonTutorialDir)) { + await addDirectoryToFilesRecord(files, commonTutorialDir); + } + + /** Duplication of the common shared files to add the tutorial intro files in. */ + const introFiles = {...files}; + await addDirectoryToFilesRecord(introFiles, introDir); + + // Ensure the directory for the tutorial exists, then write the metadata and source-code + // files for the intro. + mkdirSync(join(outputDir), {recursive: true}); + writeFileSync( + join(outputDir, 'metadata.json'), + JSON.stringify(await generateMetadata(introDir, introConfig, introFiles)), + ); + writeFileSync( + join(outputDir, 'source-code.json'), + JSON.stringify(await generateSourceCode(introConfig, introFiles)), + ); + + // For each tutorial step, generate the metadata and source-code files. + for (const [path, config] of Object.entries(stepConfigs)) { + /** Duplication of the common shared files to add the tutorial step files in. */ + const itemFiles = {...files}; + /** Directory of the current step. */ + const stepDir = join(tutorialDir, 'steps', path); + + await addDirectoryToFilesRecord(itemFiles, stepDir); + + // Ensure the directory for the tutorial step exists, then write the metadata + // and source-code files. + mkdirSync(join(outputDir, path), {recursive: true}); + writeFileSync( + join(outputDir, path, 'metadata.json'), + JSON.stringify(await generateMetadata(stepDir, config, itemFiles)), + ); + writeFileSync( + join(outputDir, path, 'source-code.json'), + JSON.stringify(await generateSourceCode(config, itemFiles)), + ); + } + + // Generate the tutorial routes, and write the file. + writeFileSync( + join(outputDir, 'routes.json'), + JSON.stringify(await generateTutorialRoutes(tutorialName, introConfig, stepConfigs)), + ); +} + +(async () => { + const [tutorialDir, commonDir, outputDir] = process.argv.slice(2); + await generateTutorialFiles(tutorialDir, commonDir, outputDir); +})(); diff --git a/adev/shared-docs/pipeline/tutorials/utils.ts b/adev/shared-docs/pipeline/tutorials/utils.ts new file mode 100644 index 000000000000..e92754599d94 --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/utils.ts @@ -0,0 +1,94 @@ +import {glob} from 'fast-glob'; +import {FileAndContentRecord, TutorialConfig} from '../../interfaces'; +import {dirname, join} from 'path'; +import {existsSync, readFileSync} from 'fs'; + +// See https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files for details +// on identifying file types with initial bytes. +/** Initial bytes of the buffer(aka magic numbers) to see if it's a JPG file. */ +const jpgSignature = [0xff, 0xd8, 0xff]; +/** Initial bytes of the buffer(aka magic numbers) to see if it's a GIF file. */ +const gifSignature = [0x47, 0x49, 0x46]; +/** Initial bytes of the buffer(aka magic numbers) to see if it's a PNG file. */ +const pngSignature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]; + +/** List of initial bytes to check for matching files. */ +const SIGNATURES = [jpgSignature, gifSignature, pngSignature]; + +/** + * Get the contents for the provided file, returning a string or Buffer as appropriate. + */ +export function getFileContents(path: string): T; +export function getFileContents(path: string): string | Uint8Array { + const fileBuffer = readFileSync(path); + + if (checkBufferMatchForSignatures(fileBuffer)) { + return fileBuffer; + } + + return fileBuffer.toString(); +} + +/** + * Determine if the initial bytes of a buffer matches the expected bytes. + */ +function checkBufferMatchForSignatures(buffer: Uint8Array): boolean { + for (const initialByes of SIGNATURES) { + for (const [index, byte] of initialByes.entries()) { + if (buffer[index] !== byte) return false; + } + } + + return true; +} + +/** + * Add all files found in the provided directory into the provided object of file and contents. + * This overwrite already existing files in the object when encountered. + */ +export async function addDirectoryToFilesRecord( + files: FileAndContentRecord, + dir: string, +): Promise { + const exampleFilePaths = await glob('**/*', { + cwd: dir, + onlyFiles: true, + }); + + for (let path of exampleFilePaths) { + files[path] = await getFileContents(join(dir, path)); + } +} + +/** + * Collect all of the config.json files in the provided directory and subdirectories. + */ +export async function findAllConfigs(dir: string): Promise> { + const configs: Record = {}; + + const paths = await glob('**/config.json', { + cwd: dir, + onlyFiles: true, + }); + + for (const path of paths) { + const content = await getFileContents(join(dir, path)); + configs[dirname(path)] = JSON.parse(content) as TutorialConfig; + } + + return configs; +} + +/** + * Collect a single of the config.json file at the provided directory. + */ +export async function findConfig(dir: string): Promise { + const configPath = join(dir, 'config.json'); + + if (!existsSync(configPath)) { + throw Error(`Unable config.json file found at: ${dir}`); + } + + const content = await getFileContents(configPath); + return JSON.parse(content) as TutorialConfig; +} diff --git a/adev/shared-docs/pipeline/tutorials/webcontainers.ts b/adev/shared-docs/pipeline/tutorials/webcontainers.ts new file mode 100644 index 000000000000..6c15043c2e7c --- /dev/null +++ b/adev/shared-docs/pipeline/tutorials/webcontainers.ts @@ -0,0 +1,86 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {basename, dirname, extname} from 'path'; +import type {DirectoryNode, FileNode, FileSystemTree} from '@webcontainer/api'; +import {FileAndContent, FileAndContentRecord} from '../../interfaces'; + +/** + * Create a WebContainer's FileSystemTree from a list of files and its contents + */ +export function getFileSystemTree(files: string[], filesContents: FileAndContentRecord) { + const fileSystemTree: FileSystemTree = {}; + + for (let filepath of files) { + const dir = dirname(filepath); + const filename = basename(filepath); + + if (dir === '.') { + const fileNode: FileNode = {file: {contents: filesContents[filepath]}}; + + fileSystemTree[filename] = fileNode; + } else { + const dirParts = dir.split('/'); + + buildFileSystemTree(fileSystemTree, dirParts, filename, filesContents[filepath]); + } + } + + return fileSystemTree; +} + +/** + * Builds a WebContainer's file system tree object recursively, mutating the + * `fileSystemTree` parameter. + * + * @see https://webcontainers.io/api#filesystemtree + */ +function buildFileSystemTree( + fileSystemTree: FileSystemTree, + fileDirectories: string[], + filename: FileAndContent['path'], + fileContents: FileAndContent['content'], +): void { + if (fileDirectories.length === 1) { + const directory = fileDirectories[0]; + + const fileNode: FileNode = {file: {contents: fileContents}}; + + fileSystemTree[directory] = { + ...fileSystemTree[directory], + + directory: { + ...(fileSystemTree[directory] + ? (fileSystemTree[directory] as DirectoryNode).directory + : undefined), + + [filename]: fileNode, + }, + }; + + return; + } + + const nextDirectory = fileDirectories.shift(); + if (!nextDirectory) return; + + if (!fileSystemTree[nextDirectory]) { + fileSystemTree[nextDirectory] = {directory: {}}; + } + + buildFileSystemTree( + (fileSystemTree[nextDirectory] as DirectoryNode).directory, + fileDirectories, + filename, + fileContents, + ); +} + +export function shouldUseFileInWebContainer(filename: string) { + return ['.md', '.png', '.jpg'].includes(extname(filename)) === false; +} diff --git a/adev/shared-docs/pipes/BUILD.bazel b/adev/shared-docs/pipes/BUILD.bazel new file mode 100644 index 000000000000..0650f6c56317 --- /dev/null +++ b/adev/shared-docs/pipes/BUILD.bazel @@ -0,0 +1,32 @@ +load("//tools:defaults.bzl", "ng_module", "ts_library") + +package(default_visibility = ["//visibility:private"]) + +ts_library( + name = "pipes", + srcs = [ + "index.ts", + ], + visibility = ["//adev/shared-docs:__subpackages__"], + deps = [ + ":lib", + ], +) + +ng_module( + name = "lib", + srcs = glob( + [ + "**/*.ts", + ], + exclude = [ + "index.ts", + "**/*.spec.ts", + ], + ), + deps = [ + "//adev/shared-docs/interfaces", + "//adev/shared-docs/utils", + "//packages/core", + ], +) diff --git a/adev/shared-docs/pipes/index.ts b/adev/shared-docs/pipes/index.ts new file mode 100644 index 000000000000..f32b2d8c9a0d --- /dev/null +++ b/adev/shared-docs/pipes/index.ts @@ -0,0 +1,2 @@ +export * from './is-active-navigation-item.pipe'; +export * from './relative-link.pipe'; diff --git a/adev/shared-docs/pipes/is-active-navigation-item.pipe.spec.ts b/adev/shared-docs/pipes/is-active-navigation-item.pipe.spec.ts new file mode 100644 index 000000000000..9688899fe982 --- /dev/null +++ b/adev/shared-docs/pipes/is-active-navigation-item.pipe.spec.ts @@ -0,0 +1,66 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {NavigationItem} from '../interfaces'; +import {IsActiveNavigationItem} from './is-active-navigation-item.pipe'; + +describe('IsActiveNavigationItem', () => { + let pipe: IsActiveNavigationItem; + + beforeEach(() => { + pipe = new IsActiveNavigationItem(); + }); + + it('should return true when itemToCheck is parent of the activeItem', () => { + const result = pipe.transform(parent, activeItem); + expect(result).toBe(true); + }); + + it('should return true when itemToCheck is any kind of the ancestor of the activeItem', () => { + const result = pipe.transform(grandparent, activeItem); + expect(result).toBe(true); + }); + + it('should return false when itemToCheck is not ancestor of the activeItem', () => { + const result = pipe.transform(notRelatedItem, activeItem); + expect(result).toBe(false); + }); + + it('should return false when activeItem is null', () => { + const result = pipe.transform(notRelatedItem, null); + expect(result).toBe(false); + }); + + it('should return false when activeItem is parent of the itemToCheck', () => { + const result = pipe.transform(child, activeItem); + expect(result).toBe(false); + }); +}); + +const notRelatedItem: NavigationItem = { + label: 'Example', +}; + +const grandparent: NavigationItem = { + label: 'Grandparent', +}; + +const parent: NavigationItem = { + label: 'Parent', + parent: grandparent, +}; + +const activeItem: NavigationItem = { + label: 'Active Item', + parent: parent, +}; + +const child: NavigationItem = { + label: 'Child', + parent: activeItem, +}; diff --git a/adev/shared-docs/pipes/is-active-navigation-item.pipe.ts b/adev/shared-docs/pipes/is-active-navigation-item.pipe.ts new file mode 100644 index 000000000000..69e7d0521bde --- /dev/null +++ b/adev/shared-docs/pipes/is-active-navigation-item.pipe.ts @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Pipe, PipeTransform} from '@angular/core'; +import {NavigationItem} from '../interfaces/index'; + +@Pipe({ + name: 'isActiveNavigationItem', + standalone: true, +}) +export class IsActiveNavigationItem implements PipeTransform { + // Check whether provided item: `itemToCheck` should be marked as active, based on `activeItem`. + // In addition to `activeItem`, we should mark all its parents, grandparents, etc. as active. + transform(itemToCheck: NavigationItem, activeItem: NavigationItem | null): boolean { + let node = activeItem?.parent; + + while (node) { + if (node === itemToCheck) { + return true; + } + + node = node.parent; + } + + return false; + } +} diff --git a/adev/shared-docs/pipes/relative-link.pipe.spec.ts b/adev/shared-docs/pipes/relative-link.pipe.spec.ts new file mode 100644 index 000000000000..38f828f25fa3 --- /dev/null +++ b/adev/shared-docs/pipes/relative-link.pipe.spec.ts @@ -0,0 +1,41 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {RelativeLink} from './relative-link.pipe'; + +describe('RelativeLink', () => { + let pipe: RelativeLink; + + beforeEach(() => { + pipe = new RelativeLink(); + }); + + it('should transform absolute url to relative', () => { + const absoluteUrl = 'https://angular.dev/guide/directives#test'; + + const result = pipe.transform(absoluteUrl); + + expect(result).toBe('guide/directives#test'); + }); + + it('should return fragment once result param is equal to `hash`', () => { + const absoluteUrl = 'https://angular.dev/guide/directives#test'; + + const result = pipe.transform(absoluteUrl, 'hash'); + + expect(result).toBe('test'); + }); + + it('should return relative url without fragment once result param is equal to `pathname`', () => { + const absoluteUrl = 'https://angular.dev/guide/directives#test'; + + const result = pipe.transform(absoluteUrl, 'pathname'); + + expect(result).toBe('guide/directives'); + }); +}); diff --git a/adev/shared-docs/pipes/relative-link.pipe.ts b/adev/shared-docs/pipes/relative-link.pipe.ts new file mode 100644 index 000000000000..8e11ed699767 --- /dev/null +++ b/adev/shared-docs/pipes/relative-link.pipe.ts @@ -0,0 +1,28 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Pipe, PipeTransform} from '@angular/core'; +import {normalizePath, removeTrailingSlash} from '../utils/index'; + +@Pipe({ + name: 'relativeLink', + standalone: true, +}) +export class RelativeLink implements PipeTransform { + transform(absoluteUrl: string, result: 'relative' | 'pathname' | 'hash' = 'relative'): string { + const url = new URL(normalizePath(absoluteUrl)); + + if (result === 'hash') { + return url.hash?.substring(1) ?? ''; + } + if (result === 'pathname') { + return `${removeTrailingSlash(normalizePath(url.pathname))}`; + } + return `${removeTrailingSlash(normalizePath(url.pathname))}${url.hash ?? ''}`; + } +} diff --git a/adev/shared-docs/providers/BUILD.bazel b/adev/shared-docs/providers/BUILD.bazel new file mode 100644 index 000000000000..c1711540b22e --- /dev/null +++ b/adev/shared-docs/providers/BUILD.bazel @@ -0,0 +1,33 @@ +load("//tools:defaults.bzl", "ng_module", "ts_library") + +package(default_visibility = ["//visibility:private"]) + +ts_library( + name = "providers", + srcs = [ + "index.ts", + ], + visibility = ["//adev/shared-docs:__subpackages__"], + deps = [ + ":lib", + ], +) + +ng_module( + name = "lib", + srcs = glob( + [ + "**/*.ts", + ], + exclude = [ + "index.ts", + "**/*.spec.ts", + ], + ), + deps = [ + "//adev/shared-docs/interfaces", + "//packages/common", + "//packages/core", + "//packages/router", + ], +) diff --git a/adev/shared-docs/providers/docs-content-loader.ts b/adev/shared-docs/providers/docs-content-loader.ts new file mode 100644 index 000000000000..a11e3b7fff0f --- /dev/null +++ b/adev/shared-docs/providers/docs-content-loader.ts @@ -0,0 +1,17 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken, inject} from '@angular/core'; +import {ResolveFn} from '@angular/router'; +import {DocContent, DocsContentLoader} from '../interfaces/index'; + +export const DOCS_CONTENT_LOADER = new InjectionToken('DOCS_CONTENT_LOADER'); + +export function contentResolver(contentPath: string): ResolveFn { + return () => inject(DOCS_CONTENT_LOADER).getContent(contentPath); +} diff --git a/adev/shared-docs/providers/environment.ts b/adev/shared-docs/providers/environment.ts new file mode 100644 index 000000000000..09b3a5b14077 --- /dev/null +++ b/adev/shared-docs/providers/environment.ts @@ -0,0 +1,12 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken} from '@angular/core'; +import {Environment} from '../interfaces/index'; + +export const ENVIRONMENT = new InjectionToken('ENVIRONMENT'); diff --git a/adev/shared-docs/providers/example-viewer-content-loader.ts b/adev/shared-docs/providers/example-viewer-content-loader.ts new file mode 100644 index 000000000000..3028f7d31d3f --- /dev/null +++ b/adev/shared-docs/providers/example-viewer-content-loader.ts @@ -0,0 +1,14 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken} from '@angular/core'; +import {ExampleViewerContentLoader} from '../interfaces/index'; + +export const EXAMPLE_VIEWER_CONTENT_LOADER = new InjectionToken( + 'EXAMPLE_VIEWER_CONTENT_LOADER', +); diff --git a/adev/shared-docs/providers/index.ts b/adev/shared-docs/providers/index.ts new file mode 100644 index 000000000000..a9b4a001685f --- /dev/null +++ b/adev/shared-docs/providers/index.ts @@ -0,0 +1,15 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export * from './docs-content-loader'; +export * from './environment'; +export * from './example-viewer-content-loader'; +export * from './is-search-dialog-open'; +export * from './local-storage'; +export * from './previews-components'; +export * from './window'; diff --git a/adev/shared-docs/providers/is-search-dialog-open.ts b/adev/shared-docs/providers/is-search-dialog-open.ts new file mode 100644 index 000000000000..ccf2ff1a6aac --- /dev/null +++ b/adev/shared-docs/providers/is-search-dialog-open.ts @@ -0,0 +1,14 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken, signal} from '@angular/core'; + +export const IS_SEARCH_DIALOG_OPEN = new InjectionToken('', { + providedIn: 'root', + factory: () => signal(false), +}); diff --git a/adev/shared-docs/providers/local-storage.ts b/adev/shared-docs/providers/local-storage.ts new file mode 100644 index 000000000000..c5ac69e5cd31 --- /dev/null +++ b/adev/shared-docs/providers/local-storage.ts @@ -0,0 +1,68 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {isPlatformBrowser} from '@angular/common'; +import {InjectionToken, PLATFORM_ID, inject} from '@angular/core'; + +export const LOCAL_STORAGE = new InjectionToken('LOCAL_STORAGE', { + providedIn: 'root', + factory: () => getStorage(inject(PLATFORM_ID)), +}); + +const getStorage = (platformId: Object): Storage | null => { + // Prerendering: localStorage is undefined for prerender build + return isPlatformBrowser(platformId) ? new LocalStorage() : null; +}; + +/** + * LocalStorage is wrapper class for localStorage, operations can fail due to various reasons, + * such as browser restrictions or storage limits being exceeded. A wrapper is providing error handling. + */ +class LocalStorage implements Storage { + get length(): number { + try { + return localStorage.length; + } catch { + return 0; + } + } + + clear(): void { + try { + localStorage.clear(); + } catch {} + } + + getItem(key: string): string | null { + try { + return localStorage.getItem(key); + } catch { + return null; + } + } + + key(index: number): string | null { + try { + return localStorage.key(index); + } catch { + return null; + } + } + + removeItem(key: string): void { + try { + localStorage.removeItem(key); + } catch {} + } + + setItem(key: string, value: string): void { + try { + localStorage.setItem(key, value); + } catch {} + } +} diff --git a/adev/shared-docs/providers/previews-components.ts b/adev/shared-docs/providers/previews-components.ts new file mode 100644 index 000000000000..aea833454b64 --- /dev/null +++ b/adev/shared-docs/providers/previews-components.ts @@ -0,0 +1,12 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken} from '@angular/core'; +import {CodeExamplesMap} from '../interfaces/index'; + +export const PREVIEWS_COMPONENTS = new InjectionToken('PREVIEWS_COMPONENTS'); diff --git a/adev/shared-docs/providers/window.ts b/adev/shared-docs/providers/window.ts new file mode 100644 index 000000000000..155bca31ce2c --- /dev/null +++ b/adev/shared-docs/providers/window.ts @@ -0,0 +1,18 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {InjectionToken} from '@angular/core'; + +// Providing window using injection token could increase testability and portability (i.e SSR don't have a real browser environment). +export const WINDOW = new InjectionToken('WINDOW'); + +// The project uses prerendering, to resolve issue: 'window is not defined', we should get window from DOCUMENT. +// As it is recommended here: https://github.com/angular/universal/blob/main/docs/gotchas.md#strategy-1-injection +export function windowProvider(document: Document) { + return document.defaultView; +} diff --git a/adev/shared-docs/services/BUILD.bazel b/adev/shared-docs/services/BUILD.bazel new file mode 100644 index 000000000000..f4d0819533e4 --- /dev/null +++ b/adev/shared-docs/services/BUILD.bazel @@ -0,0 +1,60 @@ +load("//tools:defaults.bzl", "karma_web_test_suite", "ng_module", "ts_library") + +package(default_visibility = ["//visibility:private"]) + +ts_library( + name = "services", + srcs = [ + "index.ts", + ], + visibility = ["//adev/shared-docs:__subpackages__"], + deps = [ + ":lib", + ], +) + +ng_module( + name = "lib", + srcs = glob( + [ + "**/*.ts", + ], + exclude = [ + "index.ts", + "**/*.spec.ts", + ], + ), + deps = [ + "//adev/shared-docs/constants", + "//adev/shared-docs/interfaces", + "//adev/shared-docs/providers", + "//adev/shared-docs/utils", + "//packages/common", + "//packages/core", + "//packages/core/rxjs-interop", + "//packages/router", + "@npm//algoliasearch", + "@npm//rxjs", + ], +) + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob( + ["*.spec.ts"], + ), + deps = [ + ":lib", + "//adev/shared-docs/interfaces", + "//adev/shared-docs/providers", + "//packages/common", + "//packages/core", + "//packages/core/testing", + ], +) + +karma_web_test_suite( + name = "test", + deps = [":test_lib"], +) diff --git a/adev/shared-docs/services/index.ts b/adev/shared-docs/services/index.ts new file mode 100644 index 000000000000..0d08b34b0e69 --- /dev/null +++ b/adev/shared-docs/services/index.ts @@ -0,0 +1,13 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export * from './navigation-state.service'; +export {TOC_SKIP_CONTENT_MARKER, TableOfContentsLoader} from './table-of-contents-loader.service'; +export {TableOfContentsScrollSpy} from './table-of-contents-scroll-spy.service'; +export * from './search.service'; +export * from './inject-async.service'; diff --git a/adev/shared-docs/services/inject-async.service.ts b/adev/shared-docs/services/inject-async.service.ts new file mode 100644 index 000000000000..88ca3a6787a0 --- /dev/null +++ b/adev/shared-docs/services/inject-async.service.ts @@ -0,0 +1,92 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + DestroyRef, + ENVIRONMENT_INITIALIZER, + EnvironmentInjector, + Injectable, + Injector, + Provider, + ProviderToken, + Type, + createEnvironmentInjector, + inject, +} from '@angular/core'; + +/** + * Convience method for lazy loading an injection token. + */ +export async function injectAsync( + injector: Injector, + providerLoader: () => Promise>, +): Promise { + const injectImpl = injector.get(InjectAsyncImpl); + return injectImpl.get(injector, providerLoader); +} + +@Injectable({providedIn: 'root'}) +class InjectAsyncImpl { + private overrides = new WeakMap(); // no need to cleanup + override(type: Type, mock: Type) { + this.overrides.set(type, mock); + } + + async get(injector: Injector, providerLoader: () => Promise>): Promise { + const type = await providerLoader(); + + // Check if we have overrides, O(1), low overhead + if (this.overrides.has(type)) { + const override = this.overrides.get(type); + return new override(); + } + + if (!(injector instanceof EnvironmentInjector)) { + // this is the DestroyRef of the component + const destroyRef = injector.get(DestroyRef); + + // This is the parent injector of the injector we're creating + const environmentInjector = injector.get(EnvironmentInjector); + + // Creating an environment injector to destroy it afterwards + const newInjector = createEnvironmentInjector([type as Provider], environmentInjector); + + // Destroy the injector to trigger DestroyRef.onDestroy on our service + destroyRef.onDestroy(() => { + newInjector.destroy(); + }); + + // We want to create the new instance of our service with our new injector + injector = newInjector; + } + + return injector.get(type)!; + } +} + +/** + * Helper function to mock the lazy loaded module in `injectAsync` + * + * @usage + * TestBed.configureTestingModule({ + * providers: [ + * mockAsyncProvider(SandboxService, fakeSandboxService) + * ] + * }); + */ +export function mockAsyncProvider(type: Type, mock: Type) { + return [ + { + provide: ENVIRONMENT_INITIALIZER, + multi: true, + useValue: () => { + inject(InjectAsyncImpl).override(type, mock); + }, + }, + ]; +} diff --git a/adev/shared-docs/services/navigation-state.service.ts b/adev/shared-docs/services/navigation-state.service.ts new file mode 100644 index 000000000000..5bcebe3b339b --- /dev/null +++ b/adev/shared-docs/services/navigation-state.service.ts @@ -0,0 +1,115 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Injectable, inject, signal} from '@angular/core'; +import {NavigationItem} from '../interfaces/index'; +import {Router} from '@angular/router'; + +@Injectable({ + providedIn: 'root', +}) +export class NavigationState { + private readonly router = inject(Router); + + private readonly _activeNavigationItem = signal(null); + private readonly _expandedItems = signal([]); + private readonly _isMobileNavVisible = signal(false); + + primaryActiveRouteItem = signal(null); + activeNavigationItem = this._activeNavigationItem.asReadonly(); + expandedItems = this._expandedItems.asReadonly(); + isMobileNavVisible = this._isMobileNavVisible.asReadonly(); + + async toggleItem(item: NavigationItem): Promise { + if (!item.children) { + return; + } + + if (item.isExpanded) { + this.collapse(item); + } else if (item.children && item.children.length > 0 && item.children[0].path) { + // It resolves false, when the user has displayed the page, then changed the slide to a secondary navigation component + // and wants to reopen the slide, where the first item is the currently displayed page + const navigationSucceeds = await this.navigateToFirstPageOfTheCategory(item.children[0].path); + + if (!navigationSucceeds) { + this.expand(item); + } + } + } + + cleanExpandedState(): void { + this._expandedItems.set([]); + } + + expandItemHierarchy( + item: NavigationItem, + shouldExpand: (item: NavigationItem) => boolean, + skipExpandPredicateFn?: (item: NavigationItem) => boolean, + ): void { + if (skipExpandPredicateFn && skipExpandPredicateFn(item)) { + // When `skipExpandPredicateFn` returns `true` then we should trigger `cleanExpandedState` + // to be sure that first navigation slide will be displayed. + this.cleanExpandedState(); + return; + } + // Returns item when parent node was already expanded + const parentItem = this._expandedItems().find( + (expandedItem) => + item.parent?.label === expandedItem.label && item.parent?.path === expandedItem.path, + ); + + if (parentItem) { + // If the parent item is expanded, then we should display all expanded items up to the active item level. + // This provides us with an appropriate list of expanded elements also when the user navigates using browser buttons. + this._expandedItems.update((expandedItems) => + expandedItems.filter( + (item) => + item.level !== undefined && + parentItem.level !== undefined && + item.level <= parentItem.level, + ), + ); + } else { + let itemsToExpand: NavigationItem[] = []; + + let node = item.parent; + + while (node && shouldExpand(node)) { + itemsToExpand.push({...node, isExpanded: true}); + node = node.parent; + } + + this._expandedItems.set(itemsToExpand.reverse()); + } + } + + setActiveNavigationItem(item: NavigationItem | null): void { + this._activeNavigationItem.set(item); + } + + setMobileNavigationListVisibility(isVisible: boolean): void { + this._isMobileNavVisible.set(isVisible); + } + + private expand(item: NavigationItem): void { + // Add item to the expanded items list + this._expandedItems.update((expandedItems) => { + return [...(expandedItems ?? []), {...item, isExpanded: true}]; + }); + } + + private collapse(item: NavigationItem): void { + item.isExpanded = false; + this._expandedItems.update((expandedItems) => expandedItems.slice(0, -1)); + } + + private async navigateToFirstPageOfTheCategory(path: string): Promise { + return this.router.navigateByUrl(path); + } +} diff --git a/adev/shared-docs/services/search.service.ts b/adev/shared-docs/services/search.service.ts new file mode 100644 index 000000000000..d0ae5a2b0e85 --- /dev/null +++ b/adev/shared-docs/services/search.service.ts @@ -0,0 +1,88 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {Injectable, afterNextRender, inject, signal} from '@angular/core'; +import {ENVIRONMENT} from '../providers/index'; +import {SearchResult} from '../interfaces/index'; +import {toObservable} from '@angular/core/rxjs-interop'; +import {debounceTime, filter, from, of, switchMap} from 'rxjs'; +import algoliasearch, {SearchClient} from 'algoliasearch/lite'; +import {NavigationEnd, Router} from '@angular/router'; + +export const SEARCH_DELAY = 200; +// Maximum number of facet values to return for each facet during a regular search. +export const MAX_VALUE_PER_FACET = 5; + +@Injectable({ + providedIn: 'root', +}) +export class Search { + private readonly _searchQuery = signal(''); + private readonly _searchResults = signal(undefined); + + private readonly router = inject(Router); + private readonly config = inject(ENVIRONMENT); + private readonly client: SearchClient = (algoliasearch as any)( + this.config.algolia.appId, + this.config.algolia.apiKey, + ); + private readonly index = this.client.initIndex(this.config.algolia.indexName); + + searchQuery = this._searchQuery.asReadonly(); + searchResults = this._searchResults.asReadonly(); + + searchResults$ = toObservable(this.searchQuery).pipe( + debounceTime(SEARCH_DELAY), + switchMap((query) => { + return !!query + ? from( + this.index.search(query, { + maxValuesPerFacet: MAX_VALUE_PER_FACET, + }), + ) + : of(undefined); + }), + ); + + constructor() { + afterNextRender(() => { + this.listenToSearchResults(); + this.resetSearchQueryOnNavigationEnd(); + }); + } + + updateSearchQuery(query: string): void { + this._searchQuery.set(query); + } + + private listenToSearchResults(): void { + this.searchResults$.subscribe((response: any) => { + this._searchResults.set( + response ? this.getUniqueSearchResultItems(response.hits) : undefined, + ); + }); + } + + private getUniqueSearchResultItems(items: SearchResult[]): SearchResult[] { + const uniqueUrls = new Set(); + + return items.filter((item) => { + if (item.url && !uniqueUrls.has(item.url)) { + uniqueUrls.add(item.url); + return true; + } + return false; + }); + } + + private resetSearchQueryOnNavigationEnd(): void { + this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => { + this.updateSearchQuery(''); + }); + } +} diff --git a/adev/shared-docs/services/table-of-contents-loader.service.spec.ts b/adev/shared-docs/services/table-of-contents-loader.service.spec.ts new file mode 100644 index 000000000000..a1b33704b875 --- /dev/null +++ b/adev/shared-docs/services/table-of-contents-loader.service.spec.ts @@ -0,0 +1,118 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {TestBed} from '@angular/core/testing'; + +import {TOC_SKIP_CONTENT_MARKER, TableOfContentsLoader} from './table-of-contents-loader.service'; + +describe('TableOfContentsLoader', () => { + let service: TableOfContentsLoader; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [TableOfContentsLoader], + }); + service = TestBed.inject(TableOfContentsLoader); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should create empty table of content list when there is no headings in content', () => { + const element = createElement('element-without-headings'); + + service.buildTableOfContent(element); + + expect(service.tableOfContentItems()).toEqual([]); + }); + + it('should create empty table of content list when there is only h1 elements', () => { + const element = createElement('element-with-only-h1'); + + service.buildTableOfContent(element); + + expect(service.tableOfContentItems()).toEqual([]); + }); + + it('should create table of content list with h2 and h3 when h2 and h3 headings exists', () => { + const element = createElement('element-with-h1-h2-h3-h4'); + + service.buildTableOfContent(element); + + expect(service.tableOfContentItems().length).toEqual(5); + expect(service.tableOfContentItems()[0].id).toBe('item-2'); + expect(service.tableOfContentItems()[1].id).toBe('item-3'); + expect(service.tableOfContentItems()[2].id).toBe('item-5'); + expect(service.tableOfContentItems()[3].id).toBe('item-6'); + expect(service.tableOfContentItems()[4].id).toBe('item-7'); + + expect(service.tableOfContentItems()[0].level).toBe('h2'); + expect(service.tableOfContentItems()[1].level).toBe('h3'); + expect(service.tableOfContentItems()[2].level).toBe('h3'); + expect(service.tableOfContentItems()[3].level).toBe('h2'); + expect(service.tableOfContentItems()[4].level).toBe('h3'); + + expect(service.tableOfContentItems()[0].title).toBe('H2 - first'); + expect(service.tableOfContentItems()[1].title).toBe('H3 - first'); + expect(service.tableOfContentItems()[2].title).toBe('H3 - second'); + expect(service.tableOfContentItems()[3].title).toBe('H2 - second'); + expect(service.tableOfContentItems()[4].title).toBe('H3 - third'); + }); + + it('should not display in ToC h2,h3 without ids', () => { + const element = createElement('element-with-h2-h3-without-id'); + + service.buildTableOfContent(element); + + expect(service.tableOfContentItems().length).toBe(0); + }); + + it('should not display in ToC h2,h3 which are childrens of docs-example-viewer', () => { + const element = createElement('headings-inside-docs-example-viewer'); + + service.buildTableOfContent(element); + + expect(service.tableOfContentItems().length).toBe(0); + }); + + it(`should not display in ToC heading with ${TOC_SKIP_CONTENT_MARKER} attr`, () => { + const element = createElement('headings-inside-toc-skip-content'); + + service.buildTableOfContent(element); + + expect(service.tableOfContentItems().length).toBe(1); + expect(service.tableOfContentItems()[0].id).toBe('item-1'); + }); +}); + +function createElement(id: string): HTMLElement { + const div = document.createElement('div'); + div.innerHTML = fakeElementHtml[id]; + return div; +} + +const fakeHeadings = `

H1

+

H2 - first

+

H3 - first

+

H4

+

H3 - second

+

H2 - second

+

H3 - third

`; + +const fakeElementHtml: Record = { + 'element-without-headings': `
content
`, + 'element-with-only-h1': `

heading

`, + 'element-with-h1-h2-h3-h4': `
+ ${fakeHeadings} +
+ `, + 'element-with-h2-h3-without-id': `

heading

heading

`, + 'headings-inside-docs-example-viewer': `${fakeHeadings}`, + 'headings-inside-toc-skip-content': `

heading

skip heading

`, +}; diff --git a/adev/shared-docs/services/table-of-contents-loader.service.ts b/adev/shared-docs/services/table-of-contents-loader.service.ts new file mode 100644 index 000000000000..40b76424ff6a --- /dev/null +++ b/adev/shared-docs/services/table-of-contents-loader.service.ts @@ -0,0 +1,91 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {DOCUMENT, isPlatformBrowser} from '@angular/common'; +import {inject, signal, Injectable, PLATFORM_ID} from '@angular/core'; + +import {TableOfContentsItem, TableOfContentsLevel} from '../interfaces/index'; + +/** + * Name of an attribute that is set on an element that should be + * excluded from the `TableOfContentsLoader` lookup. This is needed + * to exempt SSR'ed content of the `TableOfContents` component from + * being inspected and accidentally pulling more content into ToC. + */ +export const TOC_SKIP_CONTENT_MARKER = 'toc-skip-content'; + +@Injectable({providedIn: 'root'}) +export class TableOfContentsLoader { + // There are some cases when default browser anchor scrolls a little above the + // heading In that cases wrong item was selected. The value found by trial and + // error. + readonly toleranceThreshold = 40; + + readonly tableOfContentItems = signal([] as TableOfContentsItem[]); + + private readonly document = inject(DOCUMENT); + private readonly platformId = inject(PLATFORM_ID); + + buildTableOfContent(docElement: Element): void { + const headings = this.getHeadings(docElement); + const tocList: TableOfContentsItem[] = headings.map((heading) => ({ + id: heading.id, + level: heading.tagName.toLowerCase() as TableOfContentsLevel, + title: this.getHeadingTitle(heading), + top: this.calculateTop(heading), + })); + + this.tableOfContentItems.set(tocList); + } + + // Update top value of heading, it should be executed after window resize + updateHeadingsTopValue(element: HTMLElement): void { + const headings = this.getHeadings(element); + const updatedTopValues = new Map(); + + for (const heading of headings) { + const parentTop = heading.parentElement?.offsetTop ?? 0; + const top = Math.floor(parentTop + heading.offsetTop - this.toleranceThreshold); + updatedTopValues.set(heading.id, top); + } + + this.tableOfContentItems.update((oldItems) => { + let newItems = [...oldItems]; + for (const item of newItems) { + item.top = updatedTopValues.get(item.id) ?? 0; + } + return newItems; + }); + } + + private getHeadingTitle(heading: HTMLHeadingElement): string { + const div: HTMLDivElement = this.document.createElement('div'); + div.innerHTML = heading.innerHTML; + + return (div.textContent || '').trim(); + } + + // Get all headings (h2 and h3) with ids, which are not children of the + // docs-example-viewer component. + private getHeadings(element: Element): HTMLHeadingElement[] { + return Array.from( + element.querySelectorAll( + `h2[id]:not(docs-example-viewer h2):not([${TOC_SKIP_CONTENT_MARKER}]),` + + `h3[id]:not(docs-example-viewer h3):not([${TOC_SKIP_CONTENT_MARKER}])`, + ), + ); + } + + private calculateTop(heading: HTMLHeadingElement): number { + if (!isPlatformBrowser(this.platformId)) return 0; + return ( + Math.floor(heading.offsetTop > 0 ? heading.offsetTop : heading.getClientRects()[0]?.top) - + this.toleranceThreshold + ); + } +} diff --git a/adev/shared-docs/services/table-of-contents-scroll-spy.service.spec.ts b/adev/shared-docs/services/table-of-contents-scroll-spy.service.spec.ts new file mode 100644 index 000000000000..d4ec27cb0de4 --- /dev/null +++ b/adev/shared-docs/services/table-of-contents-scroll-spy.service.spec.ts @@ -0,0 +1,146 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {TestBed, discardPeriodicTasks, fakeAsync, tick} from '@angular/core/testing'; + +import {WINDOW} from '../providers'; + +import {TableOfContentsLoader} from './table-of-contents-loader.service'; +import {SCROLL_EVENT_DELAY, TableOfContentsScrollSpy} from './table-of-contents-scroll-spy.service'; +import {DOCUMENT, ViewportScroller} from '@angular/common'; +import {TableOfContentsLevel} from '../interfaces'; + +describe('TableOfContentsScrollSpy', () => { + let service: TableOfContentsScrollSpy; + const fakeWindow = { + addEventListener: () => {}, + removeEventListener: () => {}, + scrollY: 0, + }; + const fakeToCItems = [ + { + id: 'h2', + level: TableOfContentsLevel.H2, + title: 'h2', + top: 100, + }, + { + id: 'first', + level: TableOfContentsLevel.H3, + title: 'first', + top: 400, + }, + { + id: 'second', + level: TableOfContentsLevel.H3, + title: 'second', + top: 900, + }, + { + id: 'third', + level: TableOfContentsLevel.H3, + title: 'third', + top: 1200, + }, + { + id: 'fourth', + level: TableOfContentsLevel.H3, + title: 'fourth', + top: 1900, + }, + ]; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + TableOfContentsScrollSpy, + { + provide: WINDOW, + useValue: fakeWindow, + }, + ], + }); + const tableOfContentsLoaderSpy = TestBed.inject(TableOfContentsLoader); + tableOfContentsLoaderSpy.tableOfContentItems.set(fakeToCItems); + service = TestBed.inject(TableOfContentsScrollSpy); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + it('should activeItemId be null by default', () => { + expect(service.activeItemId()).toBeNull(); + }); + + it('should call scrollToPosition([0, 0]) once scrollToTop was invoked', () => { + const scrollToPositionSpy = spyOn( + service['viewportScroller'], + 'scrollToPosition', + ); + + service.scrollToTop(); + + expect(scrollToPositionSpy).toHaveBeenCalledOnceWith([0, 0]); + }); + + it(`should only fire setActiveItemId every ${SCROLL_EVENT_DELAY}ms when scrolling`, fakeAsync(() => { + const doc = TestBed.inject(DOCUMENT); + const scrollableContainer = doc; + const setActiveItemIdSpy = spyOn(service as any, 'setActiveItemId'); + + service.startListeningToScroll(doc.querySelector('fake-selector')); + + scrollableContainer.dispatchEvent(new Event('scroll')); + tick(SCROLL_EVENT_DELAY - 2); + + expect(setActiveItemIdSpy).not.toHaveBeenCalled(); + + scrollableContainer.dispatchEvent(new Event('scroll')); + tick(1); + + expect(setActiveItemIdSpy).not.toHaveBeenCalled(); + + scrollableContainer.dispatchEvent(new Event('scroll')); + tick(1); + + expect(setActiveItemIdSpy).toHaveBeenCalled(); + + discardPeriodicTasks(); + })); + + it(`should set active item when window scrollY is greater than calculated section top value`, fakeAsync(() => { + const doc = TestBed.inject(DOCUMENT); + const scrollableContainer = doc; + + service.startListeningToScroll(doc.querySelector('fake-selector')); + + fakeWindow.scrollY = 1238; + scrollableContainer.dispatchEvent(new Event('scroll')); + tick(SCROLL_EVENT_DELAY); + + expect(service.activeItemId()).toEqual('third'); + + discardPeriodicTasks(); + })); + + it(`should set null as active item when window scrollY is lesser than the top value of the first section`, fakeAsync(() => { + const doc = TestBed.inject(DOCUMENT); + const scrollableContainer = doc; + + service.startListeningToScroll(doc.querySelector('fake-selector')); + + fakeWindow.scrollY = 99; + scrollableContainer.dispatchEvent(new Event('scroll')); + tick(SCROLL_EVENT_DELAY); + + expect(service.activeItemId()).toEqual(null); + + discardPeriodicTasks(); + })); +}); diff --git a/adev/shared-docs/services/table-of-contents-scroll-spy.service.ts b/adev/shared-docs/services/table-of-contents-scroll-spy.service.ts new file mode 100644 index 000000000000..f104d89f724f --- /dev/null +++ b/adev/shared-docs/services/table-of-contents-scroll-spy.service.ts @@ -0,0 +1,167 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {DOCUMENT, ViewportScroller} from '@angular/common'; +import { + DestroyRef, + EnvironmentInjector, + Injectable, + afterNextRender, + inject, + signal, + NgZone, +} from '@angular/core'; +import {RESIZE_EVENT_DELAY} from '../constants/index'; +import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; +import {auditTime, debounceTime, fromEvent, startWith} from 'rxjs'; +import {WINDOW} from '../providers/index'; +import {shouldReduceMotion} from '../utils/index'; +import {TableOfContentsLoader} from './table-of-contents-loader.service'; + +export const SCROLL_EVENT_DELAY = 20; +export const SCROLL_FINISH_DELAY = SCROLL_EVENT_DELAY * 2; + +@Injectable({providedIn: 'root'}) +// The service is responsible for listening for scrolling and resizing, +// thanks to which it sets the active item in the Table of contents +export class TableOfContentsScrollSpy { + private readonly destroyRef = inject(DestroyRef); + private readonly tableOfContentsLoader = inject(TableOfContentsLoader); + private readonly document = inject(DOCUMENT); + private readonly window = inject(WINDOW); + private readonly ngZone = inject(NgZone); + private readonly viewportScroller = inject(ViewportScroller); + private readonly injector = inject(EnvironmentInjector); + private contentSourceElement: HTMLElement | null = null; + private lastContentWidth = 0; + + activeItemId = signal(null); + scrollbarThumbOnTop = signal(true); + + startListeningToScroll(contentSourceElement: HTMLElement | null): void { + this.contentSourceElement = contentSourceElement; + this.lastContentWidth = this.getContentWidth(); + + this.setScrollEventHandlers(); + this.setResizeEventHandlers(); + } + + scrollToTop(): void { + this.viewportScroller.scrollToPosition([0, 0]); + } + + scrollToSection(id: string): void { + if (shouldReduceMotion()) { + this.offsetToSection(id); + } else { + const section = this.document.getElementById(id); + section?.scrollIntoView({behavior: 'smooth', block: 'start'}); + // We don't want to set the active item here, it would mess up the animation + // The scroll event handler will handle it for us + } + } + + private offsetToSection(id: string): void { + const section = this.document.getElementById(id); + section?.scrollIntoView({block: 'start'}); + // Here we need to set the active item manually because scroll events might not be fired + this.activeItemId.set(id); + } + + // After window resize, we should update top value of each table content item + private setResizeEventHandlers() { + fromEvent(this.window, 'resize') + .pipe(debounceTime(RESIZE_EVENT_DELAY), takeUntilDestroyed(this.destroyRef), startWith()) + .subscribe(() => { + this.updateHeadingsTopAfterResize(); + }); + + // We need to observe the height of the docs-viewer because it may change after the + // assets (fonts, images) are loaded. They can (and will) change the y-position of the headings. + const docsViewer = this.document.querySelector('docs-viewer'); + if (docsViewer) { + afterNextRender( + () => { + const resizeObserver = new ResizeObserver(() => this.updateHeadingsTopAfterResize()); + resizeObserver.observe(docsViewer); + this.destroyRef.onDestroy(() => resizeObserver.disconnect()); + }, + {injector: this.injector}, + ); + } + } + + private updateHeadingsTopAfterResize(): void { + this.lastContentWidth = this.getContentWidth(); + + const contentElement = this.contentSourceElement; + if (contentElement) { + this.tableOfContentsLoader.updateHeadingsTopValue(contentElement); + this.setActiveItemId(); + } + } + + private setScrollEventHandlers(): void { + const scroll$ = fromEvent(this.document, 'scroll').pipe( + auditTime(SCROLL_EVENT_DELAY), + takeUntilDestroyed(this.destroyRef), + ); + + this.ngZone.runOutsideAngular(() => { + scroll$.subscribe(() => this.setActiveItemId()); + }); + } + + private setActiveItemId(): void { + const tableOfContentItems = this.tableOfContentsLoader.tableOfContentItems(); + + if (tableOfContentItems.length === 0) return; + + // Resize could emit scroll event, in that case we could stop setting active item until resize will be finished + if (this.lastContentWidth !== this.getContentWidth()) { + return; + } + + const scrollOffset = this.getScrollOffset(); + if (scrollOffset === null) return; + + for (const [i, currentLink] of tableOfContentItems.entries()) { + const nextLink = tableOfContentItems[i + 1]; + + // A link is considered active if the page is scrolled past the + // anchor without also being scrolled passed the next link. + const isActive = + scrollOffset >= currentLink.top && (!nextLink || nextLink.top >= scrollOffset); + + // When active item was changed then trigger change detection + if (isActive && this.activeItemId() !== currentLink.id) { + this.activeItemId.set(currentLink.id); + return; + } + } + + if (scrollOffset < tableOfContentItems[0].top && this.activeItemId() !== null) { + this.activeItemId.set(null); + } + + const scrollOffsetZero = scrollOffset === 0; + if (scrollOffsetZero !== this.scrollbarThumbOnTop()) { + // we want to trigger change detection only when the value changes + this.scrollbarThumbOnTop.set(scrollOffsetZero); + } + } + + // Gets the scroll offset of the scroll container + private getScrollOffset(): number { + return this.window.scrollY; + } + + private getContentWidth(): number { + return this.document.body.clientWidth || Number.MAX_SAFE_INTEGER; + } +} diff --git a/adev/shared-docs/styles/BUILD.bazel b/adev/shared-docs/styles/BUILD.bazel new file mode 100644 index 000000000000..dd4b0f072c38 --- /dev/null +++ b/adev/shared-docs/styles/BUILD.bazel @@ -0,0 +1,12 @@ +load("@io_bazel_rules_sass//:defs.bzl", "sass_library") + +package(default_visibility = ["//visibility:private"]) + +sass_library( + name = "styles", + srcs = glob(["**/*.scss"]), + visibility = [ + "//adev/shared-docs:__pkg__", + "//adev/shared-docs/components:__subpackages__", + ], +) diff --git a/adev/shared-docs/styles/_anchor.scss b/adev/shared-docs/styles/_anchor.scss new file mode 100644 index 000000000000..91bcec189f0f --- /dev/null +++ b/adev/shared-docs/styles/_anchor.scss @@ -0,0 +1,19 @@ +@mixin docs-anchor() { + &::after { + content: '\e157'; // codepoint for "link" + font-family: 'Material Symbols Outlined'; + + opacity: 0; + margin-left: 8px; + vertical-align: middle; + + color: var(--quaternary-contrast); + font-size: clamp(18px, 1.25em, 30px); + transition: opacity 0.3s ease; + } + &:hover { + &::after { + opacity: 1; + } + } +} diff --git a/adev/shared-docs/styles/_api-item-label.scss b/adev/shared-docs/styles/_api-item-label.scss new file mode 100644 index 000000000000..dfadc46b5015 --- /dev/null +++ b/adev/shared-docs/styles/_api-item-label.scss @@ -0,0 +1,102 @@ +@mixin api-item-label() { + .docs-api-item-label { + --label-theme: var(--symbolic-purple); + + display: flex; + justify-content: center; + align-items: center; + font-weight: 500; + color: var(--label-theme); + background: color-mix(in srgb, var(--label-theme) 10%, white); + border-radius: 0.25rem; + transition: + color 0.3s ease, + background-color 0.3s ease; + text-transform: capitalize; + + &[data-mode='short'] { + height: 22px; + width: 22px; + } + + &[data-mode='full'] { + font-size: 0.75rem; + padding: 0.25rem 0.5rem; + } + + a { + color: var(--label-theme); + + &:hover { + text-decoration: underline; + } + } + + @media screen and (prefers-color-scheme: dark) { + background: color-mix(in srgb, var(--label-theme) 17%, #272727); + } + + .docs-dark-mode & { + background: color-mix(in srgb, var(--label-theme) 17%, #272727); + } + + .docs-light-mode & { + background: color-mix(in srgb, var(--label-theme) 10%, white); + } + + &[data-type='undecorated_class'], + &[data-type='class'] { + --label-theme: var(--symbolic-purple); + } + + &[data-type='constant'], + &[data-type='const'] { + --label-theme: var(--symbolic-gray); + } + + &[data-type='decorator'] { + --label-theme: var(--symbolic-blue); + } + + &[data-type='directive'] { + --label-theme: var(--symbolic-pink); + } + + &[data-type='element'] { + --label-theme: var(--symbolic-orange); + } + + &[data-type='enum'] { + --label-theme: var(--symbolic-yellow); + } + + &[data-type='function'] { + --label-theme: var(--symbolic-green); + } + + &[data-type='interface'] { + --label-theme: var(--symbolic-cyan); + } + + &[data-type='pipe'] { + --label-theme: var(--symbolic-teal); + } + + &[data-type='ng_module'] { + --label-theme: var(--symbolic-brown); + } + + &[data-type='type_alias'] { + --label-theme: var(--symbolic-lime); + } + + &[data-type='block'] { + --label-theme: var(--vivid-pink); + } + + &[data-type='developer_preview'], + &[data-type='deprecated'] { + --label-theme: var(--hot-red); + } + } +} diff --git a/adev/shared-docs/styles/_button.scss b/adev/shared-docs/styles/_button.scss new file mode 100644 index 000000000000..6f3b04ebe14c --- /dev/null +++ b/adev/shared-docs/styles/_button.scss @@ -0,0 +1,148 @@ +@mixin button() { + button { + font-family: var(--inter-font); + background: transparent; + -webkit-appearance: none; + border: 0; + font-weight: 600; + + // Remove excess padding and border in Firefox 4+ + &::-moz-focus-inner { + border: 0; + padding: 0; + } + + &:disabled { + cursor: not-allowed; + } + } + + @property --angle { + syntax: ''; + initial-value: 90deg; + inherits: false; + } + + @keyframes spin-gradient { + 0% { + --angle: 90deg; + } + 100% { + --angle: 450deg; + } + } + + .docs-primary-btn { + cursor: pointer; + border: none; + outline: none; + position: relative; + border-radius: 0.25rem; + padding: 0.75rem 1.5rem; + width: max-content; + color: transparent; + + // border gradient / background + --angle: 90deg; + background: linear-gradient( + var(--angle), + var(--orange-red) 0%, + var(--vivid-pink) 50%, + var(--electric-violet) 100% + ); + + docs-icon { + z-index: var(--z-index-content); + position: relative; + } + + // text & radial gradient + &::before { + content: attr(text); + position: absolute; + inset: 1px; + background: var(--page-bg-radial-gradient); + border-radius: 0.2rem; + display: flex; + align-items: center; + justify-content: center; + transition: opacity 0.3s ease, background 0.3s ease; + color: var(--primary-contrast); + } + + // solid color negative space - CSS transition supported + &::after { + content: attr(text); + position: absolute; + inset: 1px; + background: var(--page-background); + border-radius: 0.2rem; + display: flex; + align-items: center; + justify-content: center; + transition: opacity 0.3s ease, background 0.3s ease; + color: var(--primary-contrast); + } + + &:hover { + animation: spin-gradient 4s linear infinite forwards; + &::before { + background-color: var(--page-background); + background: var(--soft-pink-radial-gradient); + opacity: 0.9; + } + &::after { + opacity: 0; + } + } + + &:active { + &::before { + opacity: 0.8; + } + } + + &:disabled { + //gradient stroke + background: var(--quinary-contrast); + color: var(--quinary-contrast); + + &::before { + background-color: var(--page-background); + background: var(--page-bg-radial-gradient); + opacity: 1; + } + + docs-icon { + color: var(--quinary-contrast); + } + } + + docs-icon { + z-index: var(--z-index-icon); + color: var(--primary-contrast); + } + } + + .docs-secondary-btn { + border: 1px solid var(--senary-contrast); + background: var(--page-background); + padding: 0.75rem 1.5rem; + border-radius: 0.25rem; + color: var(--primary-contrast); + transition: background 0.3s ease; + + docs-icon { + color: var(--quaternary-contrast); + transition: color 0.3s ease; + } + + &:hover { + background: var(--septenary-contrast); + + docs-icon { + color: var(--primary-contrast); + } + } + } +} diff --git a/adev/shared-docs/styles/_colors.scss b/adev/shared-docs/styles/_colors.scss new file mode 100644 index 000000000000..019b18b1833f --- /dev/null +++ b/adev/shared-docs/styles/_colors.scss @@ -0,0 +1,297 @@ +// Colors +// Using OKLCH color space for better color reproduction on P3 displays, +// as well as better human-readability +// --> https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/oklch + +@mixin root-definitions() { + // PRIMITIVES + // Colors + --bright-blue: oklch(51.01% 0.274 263.83); // #0546ff + --indigo-blue: oklch(51.64% 0.229 281.65); // #5c44e4 + --electric-violet: oklch(53.18% 0.28 296.97); // #8514f5 + --french-violet: oklch(47.66% 0.246 305.88); // #8001c6 + --vivid-pink: oklch(69.02% 0.277 332.77); // #f637e3 + --hot-pink: oklch(59.91% 0.239 8.14); // #e90464 + --hot-red: oklch(61.42% 0.238 15.34); // #f11653 + --orange-red: oklch(63.32% 0.24 31.68); // #fa2c04 + --super-green: oklch(79.12% 0.257 155.13); // #00c572 // Used for success, merge additions, etc. + + // subtle-purple is used for inline-code bg, docs-card hover bg & docs-code header bg + --subtle-purple: color-mix(in srgb, var(--bright-blue) 5%, white 10%); + --light-blue: color-mix(in srgb, var(--bright-blue), white 50%); + --light-violet: color-mix(in srgb, var(--electric-violet), white 65%); + --light-orange: color-mix(in srgb, var(--orange-red), white 50%); + --light-pink: color-mix(in srgb, var(--vivid-pink) 10%, white 80%); + + // SYMBOLIC COLORS + // Used for Type Labels + --symbolic-purple: oklch(42.86% 0.29 266.4); //#1801ea + --symbolic-gray: oklch(66.98% 0 0); // #959595 + --symbolic-blue: oklch(42.45% 0.223 263.38); // #0037c5; + --symbolic-pink: oklch(63.67% 0.254 13.47); // #ff025c + --symbolic-orange: oklch(64.73% 0.23769984683784018 33.18328352127882); // #fe3700 + --symbolic-yellow: oklch(78.09% 0.163 65.69); // #fd9f28 + --symbolic-green: oklch(67.83% 0.229 142.73); // #00b80a + --symbolic-cyan: oklch(67.05% 0.1205924489987394 181.34025902203868); // #00ad9a + --symbolic-magenta: oklch(51.74% 0.25453048882711515 315.26261625862725); // #9c00c8 + --symbolic-teal: oklch(57.59% 0.083 230.58); // #3f82a1 + --symbolic-brown: oklch(49.06% 0.128 46.41); // #994411 + --symbolic-lime: oklch(70.33% 0.2078857836035299 135.66843631046476); // #5dba00 + + // Grays + --gray-1000: oklch(16.93% 0.004 285.95); // #0f0f11 + --gray-900: oklch(19.37% 0.006 300.98); // #151417 + --gray-800: oklch(25.16% 0.008 308.11); // #232125 + --gray-700: oklch(36.98% 0.014 302.71); // #413e46 + --gray-600: oklch(44% 0.019 306.08); // #55505b + --gray-500: oklch(54.84% 0.023 304.99); // #746e7c + --gray-400: oklch(70.9% 0.015 304.04); // #a39fa9 + --gray-300: oklch(84.01% 0.009 308.34); // #ccc9cf + --gray-200: oklch(91.75% 0.004 301.42); // #e4e3e6 + --gray-100: oklch(97.12% 0.002 325.59); // #f6f5f6 + --gray-50: oklch(98.81% 0 0); // #fbfbfb + + // GRADIENTS + --red-to-pink-horizontal-gradient: linear-gradient( + 90deg, + var(--hot-pink) 11.42%, + var(--hot-red) 34.83%, + var(--vivid-pink) 60.69% + ); + + --red-to-pink-to-purple-horizontal-gradient: linear-gradient( + 90deg, + var(--orange-red) 0%, + var(--vivid-pink) 50%, + var(--electric-violet) 100% + ); + + --pink-to-highlight-to-purple-to-blue-horizontal-gradient: linear-gradient( + 140deg, + var(--vivid-pink) 0%, + var(--vivid-pink) 15%, + color-mix(in srgb, var(--vivid-pink), var(--electric-violet) 50%) 25%, + color-mix(in srgb, var(--vivid-pink), var(--electric-violet) 10%) 35%, + color-mix(in srgb, var(--vivid-pink), var(--orange-red) 50%) 42%, + color-mix(in srgb, var(--vivid-pink), var(--orange-red) 50%) 44%, + color-mix(in srgb, var(--vivid-pink), var(--page-background) 70%) 47%, + var(--electric-violet) 48%, + var(--bright-blue) 60% + ); + + --purple-to-blue-horizontal-gradient: linear-gradient( + 90deg, + var(--electric-violet) 0%, + var(--bright-blue) 100% + ); + --purple-to-blue-vertical-gradient: linear-gradient( + 0deg, + var(--electric-violet) 0%, + var(--bright-blue) 100% + ); + + --red-to-orange-horizontal-gradient: linear-gradient( + 90deg, + var(--hot-pink) 0%, + var(--orange-red) 100% + ); + --red-to-orange-vertical-gradient: linear-gradient( + 0deg, + var(--hot-pink) 0%, + var(--orange-red) 100% + ); + + --pink-to-purple-horizontal-gradient: linear-gradient( + 90deg, + var(--vivid-pink) 0%, + var(--electric-violet) 100% + ); + --pink-to-purple-vertical-gradient: linear-gradient( + 0deg, + var(--electric-violet) 0%, + var(--vivid-pink) 100% + ); + + --purple-to-light-purple-vertical-gradient: linear-gradient( + 0deg, + var(--french-violet) 0%, + var(--light-violet) 100% + ); + + --green-to-cyan-vertical-gradient: linear-gradient( + 0deg, + var(--symbolic-cyan) 0%, + var(--super-green) 100% + ); + + --blue-to-teal-vertical-gradient: linear-gradient( + 0deg, + var(--bright-blue) 0%, + var(--light-blue) 100% + ); + + --blue-to-cyan-vertical-gradient: linear-gradient( + 0deg, + var(--bright-blue) 0%, + var(--symbolic-cyan) 100% + ); + + --black-to-gray-vertical-gradient: linear-gradient( + 0deg, + var(--primary-contrast) 0%, + var(--gray-400) 100% + ); + + --red-to-pink-vertical-gradient: linear-gradient(0deg, var(--hot-red) 0%, var(--vivid-pink) 100%); + --orange-to-pink-vertical-gradient: linear-gradient( + 0deg, + var(--vivid-pink) 0%, + var(--light-orange) 100% + ); + + // Radial Gradients + --page-bg-radial-gradient: radial-gradient(circle, white 0%, white 100%); + --soft-pink-radial-gradient: radial-gradient( + circle at center bottom, + var(--light-pink) 0%, + white 80% + ); + + // ABSTRACTIONS light - dark + // --full-contrast: black - white + // --primary-constrast: gray-900 - gray-100 + // --secondary-contrast: gray-800 - gray-300 + // --tertiary-contrast: gray-700 - gray-300 + // --quaternary-contrast: gray-500 - gray-400 + // --quinary-contrast: gray-300 - gray-500 + // --senary-contrast: gray-200 - gray-700 + // --septenary-contrast: gray-100 - gray-800 + // --octonary-contrast: gray-50 - gray-900 + // --page-background white - gray-1000 + + // LIGHT MODE is default + // contrast - light mode + --full-contrast: black; + --primary-contrast: var(--gray-900); + --secondary-contrast: var(--gray-800); + --tertiary-contrast: var(--gray-700); + --quaternary-contrast: var(--gray-500); + --quinary-contrast: var(--gray-300); + --senary-contrast: var(--gray-200); + --septenary-contrast: var(--gray-100); + --octonary-contrast: var(--gray-50); + --page-background: white; + + // Home page + // for the "unfilled" portion of the word that hasn't + // been highlighted by the gradient + --gray-unfilled: var(--gray-400); + // TODO: convert oklch to hex at build time + --webgl-page-background: #ffffff; + --webgl-gray-unfilled: #a39fa9; +} + +@mixin dark-mode-definitions() { + // Contrasts + --full-contrast: white; + --primary-contrast: var(--gray-50); + --secondary-contrast: var(--gray-300); + --tertiary-contrast: var(--gray-300); + --quaternary-contrast: var(--gray-400); + --quinary-contrast: var(--gray-500); + --senary-contrast: var(--gray-700); + --septenary-contrast: var(--gray-800); + --octonary-contrast: var(--gray-900); + --page-background: var(--gray-1000); + + --bright-blue: color-mix(in srgb, oklch(51.01% 0.274 263.83), var(--full-contrast) 60%); + --indigo-blue: color-mix(in srgb, oklch(51.64% 0.229 281.65), var(--full-contrast) 70%); + --electric-violet: color-mix(in srgb, oklch(53.18% 0.28 296.97), var(--full-contrast) 70%); + --french-violet: color-mix(in srgb, oklch(47.66% 0.246 305.88), var(--full-contrast) 70%); + --vivid-pink: color-mix(in srgb, oklch(69.02% 0.277 332.77), var(--full-contrast) 70%); + --hot-pink: color-mix(in srgb, oklch(59.91% 0.239 8.14), var(--full-contrast) 70%); + --hot-red: color-mix(in srgb, oklch(61.42% 0.238 15.34), var(--full-contrast) 70%); + --orange-red: color-mix(in srgb, oklch(63.32% 0.24 31.68), var(--full-contrast) 60%); + --super-green: color-mix(in srgb, oklch(79.12% 0.257 155.13), var(--full-contrast) 70%); + + --light-pink: color-mix(in srgb, var(--vivid-pink) 5%, var(--page-background) 75%); + + --symbolic-purple: color-mix(in srgb, oklch(42.86% 0.29 266.4), var(--full-contrast) 65%); + --symbolic-gray: color-mix(in srgb, oklch(66.98% 0 0), var(--full-contrast) 65%); + --symbolic-blue: color-mix(in srgb, oklch(42.45% 0.223 263.38), var(--full-contrast) 65%); + --symbolic-pink: color-mix(in srgb, oklch(63.67% 0.254 13.47), var(--full-contrast) 65%); + --symbolic-orange: color-mix( + in srgb, + oklch(64.73% 0.23769984683784018 33.18328352127882), + var(--full-contrast) 65% + ); + --symbolic-yellow: color-mix(in srgb, oklch(78.09% 0.163 65.69), var(--full-contrast) 65%); + --symbolic-green: color-mix(in srgb, oklch(67.83% 0.229 142.73), var(--full-contrast) 65%); + --symbolic-cyan: color-mix( + in srgb, + oklch(67.05% 0.1205924489987394 181.34025902203868), + var(--full-contrast) 65% + ); + --symbolic-magenta: color-mix( + in srgb, + oklch(51.74% 0.25453048882711515 315.26261625862725), + var(--full-contrast) 65% + ); + --symbolic-teal: color-mix(in srgb, oklch(57.59% 0.083 230.58), var(--full-contrast) 65%); + --symbolic-brown: color-mix(in srgb, oklch(49.06% 0.128 46.41), var(--full-contrast) 65%); + --symbolic-lime: color-mix( + in srgb, + oklch(70.33% 0.2078857836035299 135.66843631046476), + var(--full-contrast) 65% + ); + + --page-bg-radial-gradient: radial-gradient(circle, black 0%, black 100%); + --soft-pink-radial-gradient: radial-gradient( + circle at center bottom, + var(--light-pink) 0%, + color-mix(in srgb, black, transparent 15%) 80% + ); + + // Home page - dark mode + --gray-unfilled: var(--gray-700); + // TODO: convert oklch to hex at build time + --webgl-page-background: #0f0f11; + --webgl-gray-unfilled: #413e46; + + .docs-toggle { + input { + &:checked + .docs-slider { + background: var(--pink-to-purple-horizontal-gradient) !important; + } + } + } +} + +@mixin mdc-definitions() { + --mdc-snackbar-container-shape: 0.25rem; + --mdc-snackbar-container-color: var(--page-background); + --mdc-snackbar-supporting-text-color: var(--primary-contrast); +} + +// LIGHT MODE (Explicit) +.docs-light-mode { + background-color: #ffffff; + @include root-definitions(); + @include mdc-definitions(); + .docs-invert-mode { + @include dark-mode-definitions(); + @include mdc-definitions(); + } +} + +// DARK MODE (Explicit) +.docs-dark-mode { + background-color: oklch(16.93% 0.004 285.95); + @include root-definitions(); + @include dark-mode-definitions(); + @include mdc-definitions(); + .docs-invert-mode { + @include root-definitions(); + @include mdc-definitions(); + } +} diff --git a/adev/shared-docs/styles/_faceted-list.scss b/adev/shared-docs/styles/_faceted-list.scss new file mode 100644 index 000000000000..8d1681d1e9af --- /dev/null +++ b/adev/shared-docs/styles/_faceted-list.scss @@ -0,0 +1,56 @@ +@mixin faceted-list() { + .docs-faceted-list { + --faceted-list-border-width: 2px; + list-style: none; + padding: 0; + margin: 0; + border-inline-start: calc(var(--faceted-list-border-width) - 1px) solid var(--senary-contrast); + } + .docs-faceted-list-item { + a, + button:not(.docs-expanded-button) { + position: relative; + background-color: var(--quaternary-contrast); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + transition: background-color 0.3s ease; + line-height: 1.1rem; + + &::before { + content: ''; + position: absolute; + top: 0; + left: calc(var(--faceted-list-border-width) * -1); + width: var(--faceted-list-border-width); + height: 100%; + background: var(--primary-contrast); + opacity: 0; + transform: scaleY(0.7); + transition: transform 0.3s ease, opacity 0.3s ease; + } + &:hover { + background-color: var(--primary-contrast); + &::before { + opacity: 0.3; + } + } + &.docs-faceted-list-item-active { + // font gradient + background-image: var(--pink-to-purple-vertical-gradient); + &::before { + opacity: 1; + transform: scaleY(1); + background: var(--pink-to-purple-vertical-gradient); + } + &:hover { + &::before { + opacity: 1; + transform: scaleY(1.1); + } + } + } + } + } + // a or button +} diff --git a/adev/shared-docs/styles/_kbd.scss b/adev/shared-docs/styles/_kbd.scss new file mode 100644 index 000000000000..367b51a4a85b --- /dev/null +++ b/adev/shared-docs/styles/_kbd.scss @@ -0,0 +1,33 @@ +@mixin kbd() { + // We only target non-nested kbd elements + kbd:not(:has(kbd)) { + position: relative; + color: var(---tertiary-contrast); + border: 1px solid var(--quinary-contrast); + + box-shadow: + 0 1px 0 rgba(0, 0, 0, 0.2), + 0 0 0 2px var(--octonary-contrast) inset; + // NOTE: This line (in addition to others) prevents proper contrast checking in Lighthouse + text-shadow: 0 1px 0 var(--octonary-contrast); + border-radius: 3px; + display: inline-block; + font-family: sans-serif; + line-height: 1.5; + margin: 0 0.1em; + padding: 1px 0.4em; + min-width: 14px; + min-height: 20px; + vertical-align: middle; + text-align: center; + + @media (prefers-reduced-motion: no-preference) { + *:hover > & { + box-shadow: + 0 0.5px 0 rgba(0, 0, 0, 0.2), + 0 0 0 2px var(--octonary-contrast) inset; + top: 1px; + } + } + } +} diff --git a/adev/shared-docs/styles/_links.scss b/adev/shared-docs/styles/_links.scss new file mode 100644 index 000000000000..7c463eaf8221 --- /dev/null +++ b/adev/shared-docs/styles/_links.scss @@ -0,0 +1,9 @@ +@mixin external-link-with-icon() { + &::after { + display: inline-block; + content: '\e89e'; // codepoint for "open_in_new" + font-family: 'Material Symbols Outlined'; + margin-left: 0.2rem; + vertical-align: middle; + } +} diff --git a/adev/shared-docs/styles/_media-queries.scss b/adev/shared-docs/styles/_media-queries.scss new file mode 100644 index 000000000000..8416fb2c8dcc --- /dev/null +++ b/adev/shared-docs/styles/_media-queries.scss @@ -0,0 +1,64 @@ +$screen-xs: 700px; +$screen-sm: 775px; +$screen-md: 900px; +$screen-lg: 1200px; +$screen-xl: 1800px; + +@mixin for-phone-only { + @media (max-width: $screen-xs) { + @content; + } +} +@mixin for-tablet-portrait-up { + @media (min-width: $screen-xs) { + @content; + } +} + +@mixin for-tablet { + @media (min-width: $screen-xs) and (max-width: $screen-md) { + @content; + } +} + +@mixin for-tablet-up { + @media (min-width: $screen-sm) { + @content; + } +} + +@mixin for-tablet-landscape-up { + @media (min-width: $screen-md) { + @content; + } +} + +@mixin for-desktop-up { + @media (min-width: $screen-lg) { + @content; + } +} + +@mixin for-big-desktop-up { + @media (min-width: $screen-xl) { + @content; + } +} + +@mixin for-desktop-down { + @media (max-width: $screen-lg) { + @content; + } +} + +@mixin for-tablet-landscape-down { + @media (max-width: $screen-md) { + @content; + } +} + +@mixin for-tablet-down { + @media (max-width: $screen-sm) { + @content; + } +} diff --git a/adev/shared-docs/styles/_resets.scss b/adev/shared-docs/styles/_resets.scss new file mode 100644 index 000000000000..f4e368bffea6 --- /dev/null +++ b/adev/shared-docs/styles/_resets.scss @@ -0,0 +1,377 @@ +@use './media-queries' as mq; + +@mixin resets() { + :root { + --fallback-font-stack: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', + Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --page-width: 80ch; + --layout-padding: 3.12rem; // a common padding value throughout the layout + --primary-nav-width: 110px; + --secondary-nav-width: 16.25rem; + --fixed-content-height: calc(100vh - var(--layout-padding) * 2); + + @include mq.for-tablet-landscape-down { + --layout-padding: 2rem; + } + @include mq.for-phone-only { + --layout-padding: 1rem; + } + } + + html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + // Define the default font for the document + font-family: var(--inter-font); + font-size: 16px; + background-color: var(--page-background); + color: var(--primary-contrast); + transition: + color 0.3s ease, + background-color 0.3s ease; + scroll-behavior: smooth; + } + + @media (prefers-reduced-motion) { + html { + scroll-behavior: auto; + } + } + + body { + margin: 0; + overflow-y: auto; + overflow-x: hidden; + } + + html, + body { + // Ensures that these elements extend to the full height of the viewport + height: 100vh; + min-height: 100vh; + + @supports (height: 100svh) { + height: 100svh; + } + } + + button { + cursor: pointer; + } + + img { + width: 100%; + border-radius: 0.25rem; + overflow: hidden; + margin: 1rem 0; + + &[src$='#small'] { + max-width: 250px; + } + + &[src$='#medium'] { + max-width: 450px; + } + } + + abbr[title] { + text-decoration: none; + } + + // Select & Input + .docs-form-element { + display: flex; + align-items: center; + gap: 0.5rem; + border: 1px solid var(--senary-contrast); + border-radius: 0.25rem; + padding: 0.5rem; + background-color: var(--page-background); + transition: + color 0.3s ease, + background-color 0.3s ease, + border-color 0.3s ease; + + docs-icon, + label { + color: var(--quinary-contrast); + transition: color 0.3s ease; + } + + label { + font-size: 0.875rem; + } + + select, + input { + width: 16rem; + -webkit-appearance: none; + display: flex; + flex: 1; + font-size: 0.875rem; + border: none; + outline: none; + height: 100%; + background-color: var(--page-background); + color: var(--tertiary-contrast); + transition: + color 0.3s ease, + background-color 0.3s ease; + } + + select { + width: 10rem; + background-image: url('../icons/chevron.svg'); + background-size: 0.7rem; + background-repeat: no-repeat; + background-position: right center; + margin-inline-end: 0.3rem; + } + + &:focus-within { + border: 1px solid var(--french-violet); + docs-icon { + color: var(--tertiary-contrast); + } + } + } + + // Progress bar styling + .ng-spinner { + display: none !important; + } + + .ng-progress-bar { + .ng-bar { + background: var(--red-to-pink-to-purple-horizontal-gradient) !important; + } + } + + // Material tab styling + .mat-mdc-tab-header { + --mat-tab-header-disabled-ripple-color: transparent; + --mat-tab-header-pagination-icon-color: var(--secondary-contrast); + --mat-tab-header-inactive-label-text-color: var(--secondary-contrast); + --mat-tab-header-inactive-ripple-color: transparent; + --mat-tab-header-inactive-hover-label-text-color: var(--tertiary-contrast); + --mat-tab-header-inactive-focus-label-text-color: var(--secondary-contrast); + --mat-tab-header-active-label-text-color: var(--primary-contrast); + --mat-tab-header-active-ripple-color: transparent; + --mdc-tab-indicator-active-indicator-color: color-mix(in srgb, var(--bright-blue) 40%, white); + --mat-tab-header-active-focus-label-text-color: var(--primary-contrast); + --mat-tab-header-active-hover-label-text-color: var(--primary-contrast); + --mat-tab-header-active-focus-indicator-color: var(--bright-blue); + --mat-tab-header-active-hover-indicator-color: color-mix( + in srgb, + var(--bright-blue) 40%, + white + ); + + .mdc-tab { + --mat-tab-header-label-text-font: Inter, sans-serif; + --mat-tab-header-label-text-letter-spacing: -0.00875rem; + --mat-tab-header-label-text-size: 0.875rem; + --mat-tab-header-label-text-weight: 500; + } + + .mdc-tab__text-label { + user-select: none; + letter-spacing: -0.00875rem; + } + + .mdc-tab--active { + --mat-tab-header-label-text-weight: 500; + } + } + + // Material tab styling on Reference page + .docs-reference-tabs { + .mat-mdc-tab-labels { + gap: 20px; + border-bottom: 1px solid var(--senary-contrast); + transition: border-color 0.3s ease; + } + .mdc-tab__text-label { + letter-spacing: -0.00875rem; + } + + .mdc-tab { + min-width: min-content !important; + padding-inline: 2px !important; + } + } + + // Tabs on Tutorials page, Tutorials Playground + .docs-tutorial-editor, + .docs-code-editor-tabs, + .docs-editor-tabs { + .mat-mdc-tab-header { + --mdc-tab-indicator-active-indicator-color: transparent; + --mat-tab-header-active-focus-indicator-color: transparent; + --mat-tab-header-active-hover-indicator-color: transparent; + --mat-tab-header-label-text-font: InterTight, sans-serif; + --mat-tab-header-label-text-tracking: -0.00875rem; + --mat-tab-header-label-text-size: 0.8125rem; + + .mat-mdc-tab-labels { + gap: 0; + transition: border-color 0.3s ease; + width: 100%; + } + + .mdc-tab { + padding-inline: 18px !important; + } + + .mdc-tab--active { + border: 0; + border-block-end-width: 2px; + border-style: solid; + border-image: var(--pink-to-purple-horizontal-gradient) 1; + + &.cdk-keyboard-focused { + border-image: var(--blue-to-cyan-vertical-gradient) 1; + } + + &:has(.docs-delete-file) { + padding-inline-start: 18px !important; + padding-inline-end: 0.5px !important; + } + } + } + } + + .docs-editor-tabs { + .mat-mdc-tab-header { + border-block-end: 1px solid var(--senary-contrast); + } + } + + .docs-code-editor-tabs { + .mat-mdc-tab-group { + // adjust width for + (add file) button + max-width: calc(100% - 40px); + } + } + + .docs-editor-tabs, + .docs-code-editor-tabs { + .mat-mdc-tab-header { + background-color: var(--octonary-contrast); + transition: + background-color 0.3s ease, + border-color 0.3s ease; + } + + .mdc-tab__text-label { + i { + color: var(--bright-blue); + margin-inline-start: 0.5rem; + margin-inline-end: 0.25rem; + font-size: 1.25rem; + } + span { + color: var(--primary-contrast); + } + } + } + + // Tabs inside Example Viewer Header + .docs-example-viewer-actions { + .mat-mdc-tab-labels { + width: 100%; + } + + .mat-mdc-tab-header { + --mdc-tab-indicator-active-indicator-color: transparent; + --mat-tab-header-active-focus-indicator-color: transparent; + --mat-tab-header-active-hover-indicator-color: transparent; + --mat-tab-header-active-focus-label-text-color: transparent; + --mat-tab-header-active-hover-label-text-color: transparent; + --mat-tab-header-active-label-text-color: transparent; + --mat-tab-header-label-text-font: InterTight, sans-serif; + --mat-tab-header-label-text-letter-spacing: -0.00875rem; + --mat-tab-header-label-text-size: 0.8125rem; + + .mat-mdc-tab-labels { + gap: 0; + border-bottom: 0; + } + + .mdc-tab { + padding-inline: 15px !important; + } + + .mdc-tab--active { + border: 0; + border-block-end-width: 2px; + border-style: solid; + border-image: var(--purple-to-blue-horizontal-gradient) 1; + + span { + background-image: var(--purple-to-blue-horizontal-gradient); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + } + } + } + } +} + +.cm-editor, +.ͼ3 .cm-gutters, +.cm-scroller { + background-color: var(--page-background); + transition: background-color 0.3s ease; + font-size: 0.875rem; +} + +.ͼ1.cm-focused { + outline: none; +} + +.ͼ2u { + .cm-line.cm-activeLine, + .cm-activeLineGutter { + background-color: color-mix(in srgb, var(--primary-contrast) 5%, transparent); + transition: background-color 0.3s ease; + } +} + +.ͼ1 .cm-button { + background-image: linear-gradient(var(--octonary-contrast), var(--page-background)); + + &:focus { + background-image: linear-gradient(var(--senary-contrast), var(--page-background)); + } +} + +.cm-scroller { + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + cursor: pointer; + margin: 2px; + } + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--senary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quaternary-contrast); + } +} + +[docs-breadcrumb] { + height: 2.5625rem; +} diff --git a/adev/shared-docs/styles/_scroll-track.scss b/adev/shared-docs/styles/_scroll-track.scss new file mode 100644 index 000000000000..3650d12a7f21 --- /dev/null +++ b/adev/shared-docs/styles/_scroll-track.scss @@ -0,0 +1,78 @@ +@mixin scroll-track { + // used on secondary nav + .docs-scroll-hide { + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + } + &::-webkit-scrollbar { + width: 0; + } + } + + // used for main page scroll + .docs-scroll-track-transparent-large { + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + cursor: pointer; + } + + &::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--quinary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quaternary-contrast); + } + } + + // used on table & secondary navigation + .docs-scroll-track-transparent { + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + cursor: pointer; + } + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--senary-contrast); + border-radius: 10px; + transition: background-color 0.3s ease; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quaternary-contrast); + } + } + + // used on docs-code blocks + .docs-mini-scroll-track { + &::-webkit-scrollbar-track { + background: transparent; + } + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--senary-contrast); + border-radius: 10px; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quinary-contrast); + } + } +} diff --git a/adev/shared-docs/styles/_split.scss b/adev/shared-docs/styles/_split.scss new file mode 100644 index 000000000000..635d93fcce78 --- /dev/null +++ b/adev/shared-docs/styles/_split.scss @@ -0,0 +1,27 @@ +$gutter-border: 1px solid var(--senary-contrast) !important; + +as-split { + ::ng-deep .as-split-gutter { + flex-basis: 5px !important; + background-color: inherit !important; + position: relative; + } + + &.as-horizontal.docs-editor { + ::ng-deep .as-split-gutter { + border-inline: $gutter-border; + } + } + + &.as-vertical.docs-editor { + ::ng-deep .as-split-gutter { + border-block-start: $gutter-border; + } + } + + &.as-vertical.docs-right-side { + ::ng-deep .as-split-gutter { + border-block-start: $gutter-border; + } + } +} diff --git a/adev/shared-docs/styles/_typography.scss b/adev/shared-docs/styles/_typography.scss new file mode 100644 index 000000000000..a8492e28f891 --- /dev/null +++ b/adev/shared-docs/styles/_typography.scss @@ -0,0 +1,110 @@ +// Base Typography styles + +@mixin typography() { + :root { + --code-font: 'DM Mono', monospace; + --inter-font: 'Inter', var(--fallback-font-stack); + --inter-tight-font: 'Inter Tight', var(--fallback-font-stack); + --icons: 'Material Symbols Outlined'; + + --selection-background: var(--vivid-pink); + --selection-color: var(--vivid-pink); + } + + :nth-child(6n + 1) { + --selection-color: var(--vivid-pink); + } + :nth-child(6n + 2) { + --selection-background: var(--hot-pink); + --selection-color: var(--hot-pink); + } + :nth-child(6n + 3) { + --selection-background: var(--electric-violet); + --selection-color: var(--electric-violet); + } + :nth-child(6n + 4) { + --selection-background: var(--french-violet); + --selection-color: var(--french-violet); + } + :nth-child(6n + 5) { + --selection-background: var(--indigo-blue); + --selection-color: var(--indigo-blue); + } + :nth-child(6n + 6) { + --selection-background: var(--bright-blue); + --selection-color: var(--bright-blue); + } + + ::selection { + // Added fallback color due to browser idiosyncrasies with color-mix and ::selection + background: color-mix(in srgb, var(--selection-background) 10%, var(--octonary-contrast)); + color: color-mix(in srgb, var(--selection-color) 40%, var(--primary-contrast)); + } + + h1, + h2, + h3, + h4, + h5, + h6 { + font-family: var(--inter-tight-font); + font-weight: 500; + text-wrap: balance; + } + + p { + font-size: 0.875rem; + line-height: 1.4rem; + font-weight: 400; + letter-spacing: -0.00875rem; + } + + p ~ ul, + p ~ ol { + margin-block-start: 0; + } + + ul, + ol { + font-size: 0.875rem; + line-height: 1.4rem; + font-weight: 400; + letter-spacing: -0.01rem; + } + + a { + text-decoration: none; + font-weight: 500; + transition: color 0.3s ease; + } + + p > a, + td > a, + div > a:not(.docs-card), + li:not(.docs-faceted-list *) a { + color: var(--bright-blue); + &:hover { + color: var(--vivid-pink); + } + &:active { + color: var(--hot-red); + } + } + + p > a, + .docs-list a, + .docs-card a { + margin-block: 0; + text-decoration: underline; + } + + hr { + border: 0; + border-block-start-width: 1px; + border-style: solid; + border-color: var(--senary-contrast); + width: 100%; + margin-block: 1rem; + transition: border-color 0.3s ease; + } +} diff --git a/adev/shared-docs/styles/_z-index.scss b/adev/shared-docs/styles/_z-index.scss new file mode 100644 index 000000000000..8d7bb4566385 --- /dev/null +++ b/adev/shared-docs/styles/_z-index.scss @@ -0,0 +1,7 @@ +:root { + --z-index-mini-menu: 200; + --z-index-nav: 100; + --z-index-cookie-consent: 60; + --z-index-content: 50; + --z-index-icon: 10; +} diff --git a/adev/shared-docs/styles/docs/_alert.scss b/adev/shared-docs/styles/docs/_alert.scss new file mode 100644 index 000000000000..0bc4f6faffbf --- /dev/null +++ b/adev/shared-docs/styles/docs/_alert.scss @@ -0,0 +1,117 @@ +// Alert + +@mixin docs-alert() { + .docs-alert { + // Default theme is purple to blue + --alert-gradient: var(--purple-to-blue-vertical-gradient); + --alert-accent: var(--bright-blue); + border-width: 0; + border-inline-start-width: 3px; + border-style: solid; + background: color-mix(in srgb, var(--alert-accent) 5%, transparent); + color: var(--primary-contrast); + border-image: var(--alert-gradient) 1; + padding: 1.5rem; + font-weight: 400; + transition: color 0.3s ease; + margin-block: 1rem; + position: relative; + + &::before { + font-family: var(--icons); + // content: icon is defined in each docs-alert class below... + position: absolute; + margin-top: -0.05rem; + color: var(--alert-accent); + font-size: 1.3rem; + } + + p { + margin-inline-start: 1.65rem; + } + + .docs-dark-mode & { + background: color-mix(in srgb, var(--alert-accent) 10%, transparent); + } + + .docs-pill-row { + margin-block-end: 0; + } + } + + .docs-viewer .docs-alert p { + margin-block: 0; + } + + .docs-alert-note { + --alert-gradient: var(--blue-to-teal-vertical-gradient); + --alert-accent: var(--bright-blue); + &::before { + content: 'bookmark'; + } + } + + .docs-alert-tip { + --alert-gradient: var(--green-to-cyan-vertical-gradient); + --alert-accent: var(--symbolic-cyan); + &::before { + content: 'star'; + } + } + + .docs-alert-todo { + --alert-gradient: var(--black-to-gray-vertical-gradient); + --alert-accent: var(--quaternary-contrast); + &::before { + content: 'error'; + } + } + + .docs-alert-question { + --alert-gradient: var(--blue-to-cyan-vertical-gradient); + --alert-accent: var(--symbolic-cyan); + &::before { + content: 'help'; + } + } + + .docs-alert-summary { + --alert-gradient: var(--purple-to-light-purple-vertical-gradient); + --alert-accent: var(--electric-violet); + &::before { + content: 'sms'; + } + } + + .docs-alert-tldr { + --alert-gradient: var(--pink-to-purple-vertical-gradient); + --alert-accent: var(--vivid-pink); + &::before { + content: 'speaker_notes'; + } + } + + .docs-alert-critical { + --alert-gradient: var(--red-to-orange-vertical-gradient); + --alert-accent: var(--orange-red); + &::before { + content: 'warning'; + } + } + + .docs-alert-important { + --alert-gradient: var(--red-to-pink-vertical-gradient); + --alert-accent: var(--hot-red); + &::before { + content: 'priority_high'; + } + } + + .docs-alert-helpful { + --alert-gradient: var(--orange-to-pink-vertical-gradient); + --alert-accent: var(--vivid-pink); + &::before { + content: 'check_circle'; + } + } +} diff --git a/adev/shared-docs/styles/docs/_callout.scss b/adev/shared-docs/styles/docs/_callout.scss new file mode 100644 index 000000000000..91a8e46ba7ea --- /dev/null +++ b/adev/shared-docs/styles/docs/_callout.scss @@ -0,0 +1,72 @@ +// Callout + +@mixin docs-callout() { + .docs-callout { + // Default theme is purple to blue + --callout-theme: var(--purple-to-blue-horizontal-gradient); + border-width: 0; + border-block-start-width: 2px; + border-block-end-width: 1px; + border-style: solid; + margin-block: 1.5rem; + border-image: var(--callout-theme) 1; + position: relative; + + // Removes bottom line if followed by another callout + // Prevents too many lines/visual noise + &:has(+ .docs-callout) { + border-block-end-width: 0; + } + + &::before { + font-family: var(--icons); + // content: icon is defined in each docs-alert class below... + position: absolute; + right: 0; + margin-top: 1.35rem; + color: var(--alert-accent); + font-size: 1.3rem; + } + + // Callout heading + h2, + h3, + h4, + h5, + h6 { + background-image: var(--callout-theme); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + max-width: fit-content; + } + } + .docs-viewer .docs-callout h3 { + font-size: 0.875rem; + margin-block: 1.6rem; + } + + .docs-callout-helpful { + --callout-theme: var(--purple-to-blue-horizontal-gradient); + &::before { + content: 'check_circle'; + color: var(--bright-blue); + } + } + + .docs-callout-critical { + --callout-theme: var(--red-to-orange-horizontal-gradient); + &::before { + content: 'warning'; + color: var(--orange-red); + } + } + + .docs-callout-important { + --callout-theme: var(--pink-to-purple-horizontal-gradient); + &::before { + content: 'priority_high'; + color: var(--electric-violet); + } + } +} diff --git a/adev/shared-docs/styles/docs/_card.scss b/adev/shared-docs/styles/docs/_card.scss new file mode 100644 index 000000000000..e50c1ff65457 --- /dev/null +++ b/adev/shared-docs/styles/docs/_card.scss @@ -0,0 +1,100 @@ +// Card Grid + +@mixin docs-card() { + .docs-card-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + @container docs-content (max-width: 450px) { + grid-template-columns: 1fr; + } + grid-gap: 1.25rem; + margin-block: 1rem; + } + + .docs-card { + display: flex; + flex-direction: column; + justify-content: space-between; + color: var(--primary-contrast); + padding: 1.5rem; + border: 1px solid var(--senary-contrast); + border-radius: 0.25rem; + overflow: hidden; + transition: border-color 0.3s ease, background-color 0.3s ease; + + p:first-of-type { + margin-block-start: 1.5rem; + } + + p:last-of-type { + margin-block-end: 1.5rem; + } + + span { + font-size: 0.875rem; + font-weight: 500; + margin-block: 0; + + position: relative; + } + + * + *:not(a):not(code):not(span) { + margin-block: 1.5rem; + } + + &.docs-card-with-svg { + padding: 0; + + .docs-card-text-content { + flex-grow: 1; + margin-block-start: 0; + padding-inline: 1.5rem; + display: flex; + flex-direction: column; + justify-content: space-between; + border-block-start: 1px solid var(--senary-contrast); + h3 { + margin-bottom: 0; + margin-block-start: 1rem; + font-size: 1rem; + } + p { + margin-block-start: 0; + } + } + } + } + + // docs-card with link + a.docs-card { + display: flex; + flex-direction: column; + justify-content: space-between; + + span { + background: var(--pink-to-highlight-to-purple-to-blue-horizontal-gradient); + -webkit-background-clip: text; + background-clip: text; + color: transparent; + font-size: 0.875rem; + margin-block: 0; + + transition: background-position 1.8s ease-out; + background-size: 200% 100%; + background-position: 100% 0%; + position: relative; + } + + &:hover { + span { + background-position: 0% 0%; + } + background: var(--subtle-purple); + } + } + + .docs-viewer .docs-card h3 { + margin-block-start: 0; + font-size: 1rem; + } +} diff --git a/adev/shared-docs/styles/docs/_code.scss b/adev/shared-docs/styles/docs/_code.scss new file mode 100644 index 000000000000..4257fcf31a5e --- /dev/null +++ b/adev/shared-docs/styles/docs/_code.scss @@ -0,0 +1,377 @@ +// TODO: Working on refactoring all code components & syntax highlighting + +/* stylelint-disable */ + +@mixin docs-code-block { + // code across docs, inline, blocks, shell, example viewer, etc. + code { + font-family: var(--code-font); + border-radius: 0.25rem; + font-weight: 400; + // Create a new stacking context to allow for the psuedo element content to be placed behind the + // text so that the text is properly selectable by the user. + isolation: isolate; + + // Inline code only + &:not(pre *) { + position: relative; + padding: 0 0.3rem; + // Fallback for older browsers + background: #e62600; + background: var(--red-to-orange-horizontal-gradient); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + max-width: max-content; + width: 100%; + display: inline-block; + + &::before { + content: ''; + position: absolute; + inset: 0; + width: 100%; + height: 100%; + background: var(--subtle-purple); + border-radius: 0.25rem; + z-index: -1; + } + + a:not(.docs-anchor) > & { + position: relative; + padding: 0 0.3rem; + white-space: nowrap; + background: var(--purple-to-blue-horizontal-gradient); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + max-width: max-content; + + &::before { + content: ''; + position: absolute; + inset: 0; + width: 100%; + height: 100%; + background: var(--subtle-purple); + border-radius: 0.25rem; + transition: background 0.3s ease; + z-index: -1; + } + + &:hover { + background: var(--vivid-pink); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + max-width: max-content; + } + } + } + + // render inline code emjois without gradient + .docs-emoji { + color: initial; + } + } + + pre { + white-space: pre; + } + + // render inline code emjois without gradient + .docs-emoji { + color: inherit; + } + + // docs-code shell, multifile, mermaid diagrams + .docs-code { + .docs-viewer & { + margin-block: 1rem; + } + display: block; + position: relative; + border: 1px solid var(--senary-contrast); + border-radius: 0.25rem; + background: var(--octonary-contrast); + transition: + background 0.3s ease, + border-color 0.3s ease; + container: codeblock / inline-size; + + pre { + overflow-x: auto; + } + + code { + display: flex; + flex-direction: column; + font-size: 0.875rem; + counter-reset: line; + } + } + + // shell doesn't have a header, for commands only + .shell { + border: 1px solid var(--quinary-contrast); + + pre { + white-space: nowrap; + } + + .shiki .line { + &::before { + content: '$'; + padding-inline-end: 0.5rem; + } + display: block; + + &.hidden { + display: none; + } + } + + button[docs-copy-source-code] { + background-color: var(--quaternary-contrast); + border: 1px solid var(--quinary-contrast); + + @container codeblock (min-width: 400px) { + border: 1px solid transparent; + } + + .docs-copy { + path { + fill: var(--quinary-contrast); + } + } + .docs-check { + color: var(--page-background); + } + &:hover { + .docs-copy { + path { + fill: var(--octonary-contrast); + } + } + } + } + } + + // copy code button + button[docs-copy-source-code] { + padding: 0.375rem 0.4rem 0.15rem 0.5rem; + position: absolute; + top: 3.1rem; + right: 0.2rem; + border-radius: 0.25rem; + cursor: pointer; + z-index: var(--z-index-icon); + background-color: var(--octonary-contrast); + border: 1px solid var(--senary-contrast); + transition: + background-color 0.3s ease, + border-color 0.3s ease; + + @container codeblock (min-width: 400px) { + border: 1px solid transparent; + } + + .docs-icon { + transition: opacity 0.3s ease-out; + } + .docs-copy { + opacity: 1; + path { + transition: fill 0.3s ease; + fill: var(--gray-400); + } + } + .docs-check { + opacity: 0; + color: var(--primary-contrast); + position: absolute; + inset: 0; + top: 0.35rem; + path { + transition: fill 0.3s ease; + } + } + + &.docs-copy-source-code-button-success { + .docs-copy { + opacity: 0; + } + .docs-check { + opacity: 1; + } + } + + &:hover { + .docs-copy { + path { + fill: var(--primary-contrast); + } + } + } + } + + .docs-code .docs-code-header { + position: relative; + h3 { + background-image: var(--purple-to-blue-horizontal-gradient); + background-clip: text; + -webkit-background-clip: text; + color: transparent; + font-size: 0.875rem; + font-style: normal; + font-weight: 400; + line-height: 1.4rem; + letter-spacing: -0.00875rem; + margin: 0; + word-wrap: break-word; + width: fit-content; + } + } + + .docs-code-header { + padding: 0.75rem; + + // docs header background + &::before { + content: ''; + position: absolute; + inset: 0; + width: 100%; + height: 100%; + background: var(--subtle-purple); + border-radius: 0.25rem 0.25rem 0 0; + transition: background 0.3s ease; + } + } + + // Single line docs-code elements, without headers, shell code + .docs-code:not(:has(.docs-code-header)) { + button[docs-copy-source-code] { + top: 0.2rem; + right: 0.2rem; + } + } + + .docs-code[mermaid] { + border: 0; + width: 100%; + background-color: transparent; + } + + // Line numbers styling: Add a grid, if there are line numbers + .docs-code:not([mermaid]), + .docs-example-viewer-code-wrapper { + code:has(.shiki-ln-number) { + display: grid; + grid-template-columns: min-content 1fr; + height: 100%; + } + + pre { + overflow-x: auto; + display: flex; + flex-direction: column; + } + } + + .docs-example-viewer-code-wrapper { + .docs-code-header { + display: none; + } + } + + .shiki-ln-number { + border-inline-end: 1px solid var(--senary-contrast); + padding-inline-start: 0.75rem; + padding-inline-end: 0.5rem; + color: var(--quaternary-contrast); + font-size: 0.875rem; + text-align: right; + } + + .highlighted { + background: color-mix(in srgb, var(--bright-blue) 9%, var(--page-background)); + color: color-mix(in srgb, var(--bright-blue) 60%, var(--full-contrast)); + } + .remove { + background: color-mix(in srgb, var(--orange-red) 10%, var(--page-background)); + color: color-mix(in srgb, var(--hot-red) 80%, var(--full-contrast)); + } + .add { + background: color-mix(in srgb, oklch(68.82% 0.224 155.13) 12%, var(--page-background)); + color: color-mix(in srgb, var(--super-green), var(--full-contrast) 50%); + } + .hidden { + display: none; + } +} + +@mixin docs-syntax-highlighting { + .shiki .line { + min-height: 1.375em; + padding-inline: 1rem; + color: var(--tertiary-contrast); + + display: block; + &.hidden { + display: none; + } + + span:last-child { + margin-inline-end: 4rem; + } + } + + .shiki-ln-group { + display: flex; + flex-direction: column; + margin: 1rem 0; + } + + .shiki-deprecated { + text-decoration: line-through; + } + + .gap { + color: var(--quaternary-contrast); + } + + .hljs-constructor { + color: var(--symbolic-cyan); + } + + .hljs-params { + color: var(--bright-blue); + } +} + +@mixin docs-code-editor { + .cm-tooltip-hover { + display: flex; + flex-direction: column-reverse; + padding: 0.75rem; + + &::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0); + } + + &::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + &::-webkit-scrollbar-thumb { + background-color: var(--senary-contrast); + border-radius: 10px; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: var(--quinary-contrast); + } + } +} diff --git a/adev/shared-docs/styles/docs/_decorative-header.scss b/adev/shared-docs/styles/docs/_decorative-header.scss new file mode 100644 index 000000000000..b26f982a81a6 --- /dev/null +++ b/adev/shared-docs/styles/docs/_decorative-header.scss @@ -0,0 +1,100 @@ +@mixin docs-decorative-header() { + .docs-decorative-header-container { + container: header / inline-size; + } + + .docs-decorative-header { + border-radius: 0.625rem; + background: var(--septenary-contrast); + max-width: var(--page-width); + overflow: hidden; + display: flex; + position: relative; + transition: background 0.3s ease; + + @container header (max-width: 550px) { + flex-direction: column-reverse; + } + + .docs-header-content { + box-sizing: border-box; + padding: 1.5rem; + padding-inline-end: 0; + flex-grow: 1; + + @container header (max-width: 550px) { + width: 100%; + padding-block-end: 1.5rem; + } + + h1, + p, + span { + color: var(--primary-contrast); + transition: color 0.3s ease; + } + + a { + position: absolute; + top: 1.5rem; + right: 1.5rem; + z-index: 20; + i { + color: var(--quaternary-contrast); + } + + &:hover { + i { + color: var(--primary-contrast); + } + } + } + + docs-breadcrumb { + padding-block-end: 1rem; + } + + .docs-breadcrumb { + font-size: 0.875rem; + span { + color: var(--primary-contrast) !important; + } + } + } + + svg { + margin: 0; + margin-block: auto; + padding-inline: 1rem 3.5rem; + padding-block: 2rem; + min-width: 150px; + max-width: 250px; + max-height: 125px; + z-index: 0; + + &.docs-what-is-angular-svg { + max-height: 125px; + min-width: 175px; + padding-block-end: 0.5rem; + } + + &.docs-directives-svg { + max-height: 150px; + } + + &.docs-roadmap-svg { + padding-block-end: 0.5rem; + } + + @container header (max-width: 550px) { + padding: 2rem; + padding-block-end: 0; + padding-inline-start: 1.5rem; + width: fit-content; + min-width: auto; + max-width: 80%; + max-height: 125px; + } + } + } +} diff --git a/adev/shared-docs/styles/docs/_icon.scss b/adev/shared-docs/styles/docs/_icon.scss new file mode 100644 index 000000000000..06477d299db7 --- /dev/null +++ b/adev/shared-docs/styles/docs/_icon.scss @@ -0,0 +1,13 @@ +// Icon styles, primarily for docs + +@mixin docs-icon { + .docs-icon { + color: var(--quinary-contrast); + font-size: 1.5rem; + transition: color 0.3s ease; + } + + .docs-icon-small { + font-size: 1rem; + } +} diff --git a/adev/shared-docs/styles/docs/_mermaid.scss b/adev/shared-docs/styles/docs/_mermaid.scss new file mode 100644 index 000000000000..4181763e405e --- /dev/null +++ b/adev/shared-docs/styles/docs/_mermaid.scss @@ -0,0 +1,65 @@ +#mermaid-generated-diagram { + --fontFamily: 'sans-serif'; + --primaryColor: '#fff'; + --primaryBorderColor: '#000'; + --pie1: '#0546ff'; + --pie2: '#f637e3'; + --pie3: '#f11653'; + --pie4: '#8001c6'; + --pie5: '#00c572'; + --pie6: '#fe3700'; + + background-color: var(--page-background) !important; // svg background color + g { + rect { + stroke: black !important; // border around the rectangles, same for dark/light theme + filter: drop-shadow(5px 5px 0px var(--vivid-pink)); + } + } + .messageText, + .pieTitleText { + fill: var(--primary-contrast) !important; // pie chart title text and line labels + } + .pieOuterCircle { + stroke-width: 1px; + } + .pieCircle { + stroke-width: 1.5px; + } + .legend { + rect { + filter: none; + opacity: 0.7; + } + text { + fill: var(--primary-contrast) !important; // legend label text color + } + } + .slice { + // e.g. text on the pie charts + fill: var(--primary-contrast) !important; + } + .flowchart-link, + line { + // lines + stroke: var(--primary-contrast) !important; + } + .marker, + #statediagram-barbEnd, + .transition, + #arrowhead path { + // arrows + stroke: var(--primary-contrast) !important; + fill: var(--primary-contrast) !important; + } + .cluster rect, + .nodes rect { + stroke: var(--primary-contrast) !important; + fill: var(--page-background) !important; + } + + .nodeLabel { + fill: var(--primary-contrast) !important; + color: var(--primary-contrast) !important; + } +} diff --git a/adev/shared-docs/styles/docs/_pill.scss b/adev/shared-docs/styles/docs/_pill.scss new file mode 100644 index 000000000000..60dd1f49c0ad --- /dev/null +++ b/adev/shared-docs/styles/docs/_pill.scss @@ -0,0 +1,72 @@ +// Pill + +@mixin docs-pill() { + .docs-pill { + display: flex; + align-items: center; + // Default blue + --pill-accent: var(--bright-blue); + background: color-mix(in srgb, var(--pill-accent) 5%, transparent); + // Darken the text a bit for contrast + color: color-mix(in srgb, var(--pill-accent) 70%, var(--full-contrast)); + padding-inline: 0.75rem; + padding-block: 0.375rem; + border-radius: 2.75rem; + border: 0; + transition: background 0.3s ease; + + font-family: var(--inter-font); + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 1.4rem; + letter-spacing: -0.00875rem; + + &:hover { + background: color-mix(in srgb, var(--pill-accent) 15%, transparent); + } + + .docs-icon-small { + margin-inline-start: 0.25rem; + } + + .docs-dark-mode & { + // Lighten the text a bit for contrast + color: color-mix(in srgb, var(--pill-accent) 60%, white 70%); + background: color-mix(in srgb, var(--pill-accent) 10%, white 2%); + &:hover { + background: color-mix(in srgb, var(--pill-accent) 20%, white 10%); + } + } + } + + .docs-pill-row { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.5rem; + margin-block: 0.75rem; + .docs-pill { + // TODO: This gradient supports longer rows + // we may want to refine it + &:nth-child(6n + 1) { + --pill-accent: var(--hot-red); + } + &:nth-child(6n + 2) { + --pill-accent: var(--hot-pink); + } + &:nth-child(6n + 3) { + --pill-accent: var(--electric-violet); + } + &:nth-child(6n + 4) { + --pill-accent: var(--french-violet); + } + &:nth-child(6n + 5) { + --pill-accent: var(--indigo-blue); + } + &:nth-child(6n + 6) { + --pill-accent: var(--bright-blue); + } + } + } +} diff --git a/adev/shared-docs/styles/docs/_steps.scss b/adev/shared-docs/styles/docs/_steps.scss new file mode 100644 index 000000000000..a074fd92d716 --- /dev/null +++ b/adev/shared-docs/styles/docs/_steps.scss @@ -0,0 +1,81 @@ +// Doc Steps/Ordered Doc section +// Did somebody order a doc? +@use '../media-queries' as mq; + +@mixin docs-steps() { + .docs-steps { + --gutter: 4rem; + padding-inline-start: var(--gutter); + counter-reset: code-steps-list; + list-style-type: none; + li { + position: relative; + } + } + .docs-steps li h3 { + font-size: 1.75rem; + margin-block-start: 0; + margin-block-end: 0.5rem; + line-height: 2.5rem; + } + .docs-step-number { + counter-increment: code-steps-list; + display: block; + pointer-events: none; + position: absolute; + left: calc(var(--gutter) * -1); + top: 2.7rem; + bottom: 0; + &::before { + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + content: counter(code-steps-list); + border-radius: 50%; + aspect-ratio: 1 / 1; + border: 1px solid transparent; + background-image: linear-gradient(var(--page-background), var(--page-background)), + var(--pink-to-purple-horizontal-gradient); + background-origin: border-box; + background-clip: content-box, border-box; + position: sticky; + top: 2rem; + // adjust for tablet nav bar height + @include mq.for-tablet-landscape-down { + top: calc(1rem + 75px); + } + // adjust for mobile nav bar height + @include mq.for-phone-only { + top: calc(1rem + 55px); + } + } + + .docs-tutorial-content & { + &::before { + // calc(1rem + sticky tutorial nav height) + top: calc(1rem + 120px); + + // adjust for tablet nav bar height + @include mq.for-tablet-landscape-down { + top: calc(1rem + 165px); + } + + // adjust for mobile nav bar height + @include mq.for-phone-only { + top: calc(1rem + 140px); + } + } + } + + .docs-tutorial-content:has(.docs-reveal-answer-button) & { + &::before { + // calc(1rem + sticky tutorial nav height + // + reveal answer button height when on smaller screens) + @container tutorial-content (max-width: 430px) { + top: calc(1rem + 175px); + } + } + } + } +} diff --git a/adev/shared-docs/styles/docs/_table.scss b/adev/shared-docs/styles/docs/_table.scss new file mode 100644 index 000000000000..ff3c033f31fe --- /dev/null +++ b/adev/shared-docs/styles/docs/_table.scss @@ -0,0 +1,43 @@ +// Table + +@mixin docs-table { + .docs-table { + overflow-x: auto; + + table { + width: 100%; + border-collapse: collapse; + margin-block: 1rem; + font-size: 0.875rem; + line-height: 160%; + letter-spacing: -0.00875rem; + } + + th { + text-align: left; + padding-block: 0.4rem; + padding-inline-end: 1.5rem; + border-block: 1px solid var(--senary-contrast); + font-size: 0.75rem; + font-weight: 600; + } + + tr { + td { + padding-block: 0.85rem; + vertical-align: top; + &:not(:last-child) { + padding-inline-end: 1rem; + } + } + td:first-child { + padding-inline-end: 1.62rem; + vertical-align: top; + min-width: 10ch; + } + &:not(:last-child) { + border-block-end: 1px solid var(--senary-contrast); + } + } + } +} diff --git a/adev/shared-docs/styles/docs/_video.scss b/adev/shared-docs/styles/docs/_video.scss new file mode 100644 index 000000000000..c20a6bb8e2b9 --- /dev/null +++ b/adev/shared-docs/styles/docs/_video.scss @@ -0,0 +1,11 @@ +@mixin docs-video() { + .docs-video-container { + iframe { + border: 0; + width: 100%; + border-radius: 0.25rem; + overflow: hidden; + aspect-ratio: 16 / 9; + } + } +} diff --git a/adev/shared-docs/styles/global-styles.scss b/adev/shared-docs/styles/global-styles.scss new file mode 100644 index 000000000000..876100d89e78 --- /dev/null +++ b/adev/shared-docs/styles/global-styles.scss @@ -0,0 +1,136 @@ +// TODO: Continue organizing and refactoring this file +@use '@angular/material' as mat; + +// Using disable-next-line to avoid stylelint errors - these imports are necessary +// TODO: Is there another way to prevent these linting errors? +// stylelint-disable-next-line @angular/no-unused-import +@use '_colors'; +// stylelint-disable-next-line @angular/no-unused-import +@use '_z-index'; + +// Global +@use 'resets'; +@use 'typography'; +@use 'scroll-track'; +@use 'button'; +@use 'kbd'; +@use 'api-item-label'; +@use 'faceted-list'; +@use 'media-queries' as mq; + +// Docs +@use 'docs/alert'; +@use 'docs/callout'; +@use 'docs/card'; +@use 'docs/code'; +@use 'docs/decorative-header'; +@use 'docs/icon'; +@use 'docs/pill'; +@use 'docs/steps'; +@use 'docs/table'; +@use 'docs/video'; +@use 'docs/mermaid'; + +// Global +@include resets.resets(); +@include typography.typography(); +@include scroll-track.scroll-track(); +@include button.button(); +@include kbd.kbd(); +@include api-item-label.api-item-label(); +@include faceted-list.faceted-list(); + +@include mq.for-phone-only(); +@include mq.for-tablet-portrait-up(); +@include mq.for-tablet-landscape-up(); +@include mq.for-desktop-up(); +@include mq.for-big-desktop-up(); +@include mq.for-tablet-landscape-down(); + +// temporary just to show different options of code component UI. +$primary: mat.m2-define-palette(mat.$m2-indigo-palette); +$accent: mat.m2-define-palette(mat.$m2-pink-palette, A200, A100, A400); +$theme: mat.m2-define-light-theme( + ( + color: ( + primary: $primary, + accent: $accent, + ), + typography: mat.m2-define-typography-config(), + ) +); + +// Include material core styles. +@include mat.core(); +@include mat.tabs-theme($theme); +@include mat.button-toggle-theme($theme); + +// Include custom docs styles +@include alert.docs-alert(); +@include callout.docs-callout(); +@include card.docs-card(); +@include code.docs-code-block(); +@include code.docs-code-editor(); +@include decorative-header.docs-decorative-header(); +@include icon.docs-icon(); +@include pill.docs-pill(); +@include steps.docs-steps(); +@include code.docs-syntax-highlighting(); +@include table.docs-table(); +@include video.docs-video(); + +// Include custom angular.dev styles + +// Disable view transitions when reduced motion is requested. +@media (prefers-reduced-motion) { + ::view-transition-group(*), + ::view-transition-old(*), + ::view-transition-new(*) { + animation: none !important; + } +} + + +.docs-dark-mode .shiki { + color: var(--shiki-dark) ; + background-color: var(--shiki-dark-bg) ; + + span { + color: var(--shiki-dark) ; + background-color: var(--shiki-dark-bg) ; + /* Optional, if you also want font styles */ + font-style: var(--shiki-dark-font-style) ; + font-weight: var(--shiki-dark-font-weight) ; + text-decoration: var(--shiki-dark-text-decoration) ; + } + + .shiki-ln-line-highlighted, button:hover { + span { + background-color: inherit; + } + } +} + +.shiki { + padding-block: 1rem; +} + +.docs-light-mode .shiki { + color: var(--shiki-light); + background-color: var(--shiki-light-bg) ; + + span { + color: var(--shiki-light) ; + background-color: var(--shiki-light-bg) ; + /* Optional, if you also want font styles */ + font-style: var(--shiki-light-font-style) ; + font-weight: var(--shiki-light-font-weight) ; + text-decoration: var(--shiki-light-text-decoration) ; + } + + .shiki-ln-line-highlighted, button:hover { + span { + background-color: inherit; + } + } +} \ No newline at end of file diff --git a/adev/shared-docs/testing/BUILD.bazel b/adev/shared-docs/testing/BUILD.bazel new file mode 100644 index 000000000000..abda97666268 --- /dev/null +++ b/adev/shared-docs/testing/BUILD.bazel @@ -0,0 +1,30 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:private"]) + +ts_library( + name = "testing", + srcs = [ + "index.ts", + ], + visibility = ["//adev/shared-docs:__subpackages__"], + deps = [ + ":lib", + ], +) + +ts_library( + name = "lib", + srcs = glob( + [ + "*.ts", + ], + exclude = [ + "index.ts", + ], + ), + deps = [ + "//packages/core", + "@npm//@webcontainer/api", + ], +) diff --git a/adev/shared-docs/testing/index.ts b/adev/shared-docs/testing/index.ts new file mode 100644 index 000000000000..cd47c7f7e6b2 --- /dev/null +++ b/adev/shared-docs/testing/index.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.dev/license + */ + +export * from './testing-helper'; diff --git a/adev/shared-docs/testing/testing-helper.ts b/adev/shared-docs/testing/testing-helper.ts new file mode 100644 index 000000000000..b7beaba1ea53 --- /dev/null +++ b/adev/shared-docs/testing/testing-helper.ts @@ -0,0 +1,199 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {ChangeDetectorRef} from '@angular/core'; +import { + DirEnt, + ErrorListener, + FSWatchCallback, + FSWatchOptions, + FileSystemAPI, + FileSystemTree, + IFSWatcher, + PortListener, + ServerReadyListener, + Unsubscribe, + WebContainer, + WebContainerProcess, +} from '@webcontainer/api'; + +export class FakeEventTarget implements EventTarget { + listeners: Map = new Map(); + + addEventListener(type: string, listener: EventListenerOrEventListenerObject): void { + const listeners = this.listeners.get(type) || []; + listeners.push(listener); + this.listeners.set(type, listeners); + } + + removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void { + const listeners = this.listeners.get(type); + if (listeners) { + const index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + } + } + + dispatchEvent(event: Event): boolean { + const listeners = this.listeners.get(event.type); + if (listeners) { + for (const listener of listeners) { + if (typeof listener === 'function') { + listener.call(this, event); + } else { + listener.handleEvent(event); + } + } + } + return true; + } +} + +export class MockLocalStorage implements Pick { + private items = new Map(); + + getItem(key: string): string | null { + return this.items.get(key) ?? null; + } + + setItem(key: string, value: string | null): void { + this.items.set(key, value); + } +} + +export class FakeChangeDetectorRef implements ChangeDetectorRef { + markForCheck(): void {} + detach(): void {} + checkNoChanges(): void {} + reattach(): void {} + detectChanges(): void {} +} + +export class FakeWebContainer extends WebContainer { + fakeSpawn: FakeWebContainerProcess | undefined = undefined; + + constructor(fakeOptions?: {spawn: FakeWebContainerProcess}) { + super(); + if (fakeOptions?.spawn) this.fakeSpawn = fakeOptions.spawn; + } + + override spawn( + command: unknown, + args?: unknown, + options?: unknown, + ): Promise { + if (this.fakeSpawn) return Promise.resolve(this.fakeSpawn); + + const fakeProcess = new FakeWebContainerProcess(); + + return Promise.resolve(fakeProcess); + } + override on(event: 'port', listener: PortListener): Unsubscribe; + override on(event: 'server-ready', listener: ServerReadyListener): Unsubscribe; + override on(event: 'error', listener: ErrorListener): Unsubscribe; + override on(event: unknown, listener: unknown): Unsubscribe { + return () => {}; + } + override mount( + tree: FileSystemTree, + options?: {mountPoint?: string | undefined} | undefined, + ): Promise { + return Promise.resolve(); + } + override get path() { + return '/fake-path'; + } + override get workdir() { + return '/fake-workdir'; + } + + override teardown() {} + + override fs: FakeFileSystemAPI = new FakeFileSystemAPI(); +} + +class FakeFileSystemAPI implements FileSystemAPI { + readdir( + path: string, + options: 'buffer' | {encoding: 'buffer'; withFileTypes?: false | undefined}, + ): Promise; + readdir( + path: string, + options?: + | string + | {encoding?: string | null | undefined; withFileTypes?: false | undefined} + | null + | undefined, + ): Promise; + readdir( + path: string, + options: {encoding: 'buffer'; withFileTypes: true}, + ): Promise[]>; + readdir( + path: string, + options: {encoding?: string | null | undefined; withFileTypes: true}, + ): Promise[]>; + readdir( + path: unknown, + options?: unknown, + ): + | Promise + | Promise + | Promise[]> + | Promise[]> { + return Promise.resolve(['/fake-dirname']); + } + + readFile(path: string, encoding?: null | undefined): Promise; + readFile(path: string, encoding: string): Promise; + readFile(path: unknown, encoding?: unknown): Promise | Promise { + return Promise.resolve('fake file content'); + } + writeFile( + path: string, + data: string | Uint8Array, + options?: string | {encoding?: string | null | undefined} | null | undefined, + ): Promise { + return Promise.resolve(); + } + mkdir(path: string, options?: {recursive?: false | undefined} | undefined): Promise; + mkdir(path: string, options: {recursive: true}): Promise; + mkdir(path: unknown, options?: unknown): Promise | Promise { + return Promise.resolve(); + } + rm( + path: string, + options?: {force?: boolean | undefined; recursive?: boolean | undefined} | undefined, + ): Promise { + return Promise.resolve(); + } + + rename(oldPath: string, newPath: string): Promise { + throw Error('Not implemented'); + } + watch( + filename: string, + options?: FSWatchOptions | undefined, + listener?: FSWatchCallback | undefined, + ): IFSWatcher; + watch(filename: string, listener?: FSWatchCallback | undefined): IFSWatcher; + watch(filename: unknown, options?: unknown, listener?: unknown): IFSWatcher { + throw Error('Not implemented'); + } +} + +export class FakeWebContainerProcess implements WebContainerProcess { + exit: Promise = Promise.resolve(0); + input: WritableStream = new WritableStream(); + output: ReadableStream = new ReadableStream(); + + kill(): void {} + resize(dimensions: {cols: number; rows: number}): void {} +} diff --git a/adev/shared-docs/utils/BUILD.bazel b/adev/shared-docs/utils/BUILD.bazel new file mode 100644 index 000000000000..133d2d0b348f --- /dev/null +++ b/adev/shared-docs/utils/BUILD.bazel @@ -0,0 +1,36 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:private"]) + +ts_library( + name = "utils", + srcs = [ + "index.ts", + ], + visibility = ["//adev/shared-docs:__subpackages__"], + deps = [ + ":lib", + ], +) + +ts_library( + name = "lib", + srcs = glob( + [ + "**/*.ts", + ], + exclude = [ + "index.ts", + "**/*.spec.ts", + ], + ), + deps = [ + "//adev/shared-docs/interfaces", + "//adev/shared-docs/providers", + "//packages/core", + "//packages/router", + "@npm//@types/node", + "@npm//@webcontainer/api", + "@npm//fflate", + ], +) diff --git a/adev/shared-docs/utils/analytics.utils.ts b/adev/shared-docs/utils/analytics.utils.ts new file mode 100644 index 000000000000..dd3b7796090e --- /dev/null +++ b/adev/shared-docs/utils/analytics.utils.ts @@ -0,0 +1,43 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +declare global { + interface Window { + gtag: (...args: any[]) => void; + } +} + +export const setCookieConsent = (state: 'denied' | 'granted'): void => { + try { + if (window.gtag) { + const consentOptions = { + ad_user_data: state, + ad_personalization: state, + ad_storage: state, + analytics_storage: state, + }; + + if (state === 'denied') { + window.gtag('consent', 'default', { + ...consentOptions, + wait_for_update: 500, + }); + } else if (state === 'granted') { + window.gtag('consent', 'update', { + ...consentOptions, + }); + } + } + } catch { + if (state === 'denied') { + console.error('Unable to set default cookie consent.'); + } else if (state === 'granted') { + console.error('Unable to grant cookie consent.'); + } + } +}; diff --git a/adev/shared-docs/utils/animations.utils.ts b/adev/shared-docs/utils/animations.utils.ts new file mode 100644 index 000000000000..29a0589e9b4e --- /dev/null +++ b/adev/shared-docs/utils/animations.utils.ts @@ -0,0 +1,11 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export const shouldReduceMotion = () => + typeof window !== 'undefined' && + window.matchMedia(`(prefers-reduced-motion: reduce)`).matches === true; diff --git a/adev/shared-docs/utils/device.utils.ts b/adev/shared-docs/utils/device.utils.ts new file mode 100644 index 000000000000..dfdd2a94c2d6 --- /dev/null +++ b/adev/shared-docs/utils/device.utils.ts @@ -0,0 +1,25 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export const isMobile = + typeof window !== 'undefined' && window.navigator.userAgent.toLowerCase().includes('mobi'); + +export const isApple = + typeof window !== 'undefined' && + (/iPad|iPhone/.test(window.navigator.userAgent) || window.navigator.userAgent.includes('Mac')); + +export const isIpad = + typeof window !== 'undefined' && + isApple && + !!window.navigator.maxTouchPoints && + window.navigator.maxTouchPoints > 1; + +export const isIos = (isMobile && isApple) || isIpad; + +export const isFirefox = + typeof window !== 'undefined' && window.navigator.userAgent.includes('Firefox/'); diff --git a/adev/shared-docs/utils/filesystem.utils.ts b/adev/shared-docs/utils/filesystem.utils.ts new file mode 100644 index 000000000000..f4e13381fac8 --- /dev/null +++ b/adev/shared-docs/utils/filesystem.utils.ts @@ -0,0 +1,61 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {normalizePath} from './navigation.utils'; +import {FileAndContent} from '../interfaces'; + +interface DirEnt { + name: T; + isFile(): boolean; + isDirectory(): boolean; +} + +interface FileSystemAPI { + readdir( + path: string, + options: { + encoding?: + | 'ascii' + | 'utf8' + | 'utf-8' + | 'utf16le' + | 'ucs2' + | 'ucs-2' + | 'base64' + | 'base64url' + | 'latin1' + | 'binary' + | 'hex' + | null; + withFileTypes: true; + }, + ): Promise[]>; + readFile(path: string, encoding?: string): Promise; +} + +export const checkFilesInDirectory = async ( + dir: string, + fs: FileSystemAPI, + filterFoldersPredicate: (path?: string) => boolean = () => true, + files: FileAndContent[] = [], +) => { + const entries = (await fs.readdir(dir, {withFileTypes: true})) ?? []; + + for (const entry of entries) { + const fullPath = normalizePath(`${dir}/${entry.name}`); + + if (entry.isFile()) { + const content = await fs.readFile(fullPath, 'utf-8'); + files.push({content, path: fullPath}); + } else if (entry.isDirectory() && filterFoldersPredicate(entry.name)) { + await checkFilesInDirectory(fullPath, fs, filterFoldersPredicate, files); + } + } + + return files; +}; diff --git a/adev/shared-docs/utils/index.ts b/adev/shared-docs/utils/index.ts new file mode 100644 index 000000000000..2bdd30eeb6ae --- /dev/null +++ b/adev/shared-docs/utils/index.ts @@ -0,0 +1,15 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export * from './analytics.utils'; +export * from './animations.utils'; +export * from './device.utils'; +export * from './filesystem.utils'; +export * from './navigation.utils'; +export * from './url.utils'; +export * from './zip.utils'; diff --git a/adev/shared-docs/utils/navigation.utils.ts b/adev/shared-docs/utils/navigation.utils.ts new file mode 100644 index 000000000000..853ca5fad3cf --- /dev/null +++ b/adev/shared-docs/utils/navigation.utils.ts @@ -0,0 +1,156 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {inject} from '@angular/core'; +import {ActivatedRouteSnapshot, Route, Router} from '@angular/router'; +import {NavigationItem} from '../interfaces/index'; +import {DOCS_CONTENT_LOADER} from '../providers/index'; + +export const flatNavigationData = (tree: NavigationItem[]) => { + const result: NavigationItem[] = []; + + const traverse = (node: NavigationItem, level: number) => { + node.level = level; + if (node.path) { + result.push(node); + } + if (node.children) { + for (const child of node.children) { + child.parent = node; + traverse(child, level + 1); + } + } + }; + + for (const node of tree) { + traverse(node, 1); + } + + return result; +}; + +export const getNavigationItemsTree = ( + tree: NavigationItem[], + mapFn: (item: NavigationItem) => void, +) => { + const traverse = (node: NavigationItem) => { + mapFn(node); + if (node.children) { + for (const child of node.children) { + traverse(child); + } + } + }; + + for (const node of tree) { + traverse(node); + } + + return tree; +}; + +export const findNavigationItem = ( + items: NavigationItem[], + predicate: (item: NavigationItem) => boolean, +): NavigationItem | null => { + let result: NavigationItem | null = null; + + const traverse = (node: NavigationItem) => { + if (predicate(node)) { + result = node; + } + if (node.children && !result) { + for (const child of node.children) { + traverse(child); + } + } + }; + + for (const node of items) { + traverse(node); + } + + return result; +}; + +export const isExternalLink = (link: string, windowOrigin: string) => + new URL(link).origin !== windowOrigin; + +export const markExternalLinks = (item: NavigationItem, origin: string): void => { + if (item.path) { + try { + item.isExternal = isExternalLink(item.path, origin); + } catch (err) {} + } +}; + +export const mapNavigationItemsToRoutes = ( + navigationItems: NavigationItem[], + additionalRouteProperties: Partial, +): Route[] => + navigationItems + .filter((route): route is NavigationItem & {path: string} => Boolean(route.path)) + .map((navigationItem) => { + const route = { + path: navigationItem.path, + ...additionalRouteProperties, + }; + + route.data = { + ...navigationItem, + ...route.data, + }; + + route.resolve = { + 'docContent': (snapshot: ActivatedRouteSnapshot) => { + return snapshot.data['contentPath'] !== undefined + ? inject(DOCS_CONTENT_LOADER).getContent(snapshot.data['contentPath']) + : undefined; + }, + ...route.resolve, + }; + return route; + }); + +export const normalizePath = (path: string): string => { + if (path[0] === '/') { + return path.substring(1); + } + return path; +}; + +export const getBaseUrlAfterRedirects = (url: string, router: Router): string => { + const route = router.parseUrl(url); + route.fragment = null; + route.queryParams = {}; + return normalizePath(route.toString()); +}; + +export function handleHrefClickEventWithRouter(e: Event, router: Router, relativeUrl: string) { + const pointerEvent = e as PointerEvent; + if ( + pointerEvent.ctrlKey || + pointerEvent.shiftKey || + pointerEvent.altKey || + pointerEvent.metaKey + ) { + return; + } + + e.preventDefault(); + router.navigateByUrl(relativeUrl); +} + +export function getActivatedRouteSnapshotFromRouter(router: Router): ActivatedRouteSnapshot { + let route = router.routerState.root.snapshot; + + while (route.firstChild) { + route = route.firstChild; + } + return route; +} diff --git a/adev/shared-docs/utils/url.utils.ts b/adev/shared-docs/utils/url.utils.ts new file mode 100644 index 000000000000..14bee4d5411c --- /dev/null +++ b/adev/shared-docs/utils/url.utils.ts @@ -0,0 +1,14 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export const removeTrailingSlash = (url: string): string => { + if (url.endsWith('/')) { + return url.slice(0, -1); + } + return url; +}; diff --git a/adev/shared-docs/utils/zip.utils.ts b/adev/shared-docs/utils/zip.utils.ts new file mode 100644 index 000000000000..ee005aa21e27 --- /dev/null +++ b/adev/shared-docs/utils/zip.utils.ts @@ -0,0 +1,29 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import {FileAndContent} from '../interfaces'; + +// TODO(josephperrott): Determine how we can load the fflate package dynamically again. +import {zip, strToU8} from 'fflate'; + +export async function generateZip(files: FileAndContent[]): Promise { + const filesObj: Record = {}; + files.forEach(({path, content}) => { + filesObj[path] = typeof content === 'string' ? strToU8(content) : content; + }); + + return new Promise((resolve, reject) => { + zip(filesObj, (err, data) => { + if (err) { + reject(err); + } else { + resolve(data); + } + }); + }); +} diff --git a/adev/src/app/core/services/header.service.spec.ts b/adev/src/app/core/services/header.service.spec.ts index c9033b6733ea..73e822d15389 100644 --- a/adev/src/app/core/services/header.service.spec.ts +++ b/adev/src/app/core/services/header.service.spec.ts @@ -9,7 +9,6 @@ import {TestBed} from '@angular/core/testing'; import {HeaderService} from './header.service'; -import {link} from 'fs'; describe('HeaderService', () => { let service: HeaderService; diff --git a/adev/src/app/editor/embedded-tutorial-manager.service.ts b/adev/src/app/editor/embedded-tutorial-manager.service.ts index 1a768ac14790..1dcfa872f564 100644 --- a/adev/src/app/editor/embedded-tutorial-manager.service.ts +++ b/adev/src/app/editor/embedded-tutorial-manager.service.ts @@ -11,7 +11,7 @@ import {FileSystemTree} from '@webcontainer/api'; import {BehaviorSubject} from 'rxjs'; import {TutorialMetadata} from '@angular/docs'; -import {TUTORIALS_COMMON_DIRECTORY, TUTORIALS_ASSETS_WEB_PATH} from './constants'; +import {TUTORIALS_ASSETS_WEB_PATH} from './constants'; /** * A service responsible for the current tutorial, retrieving and providing diff --git a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts index 43d7af5b26d7..5c38d2d2d812 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.spec.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.spec.ts @@ -60,7 +60,9 @@ describe('NodeRuntimeSandbox', () => { const setValuesToInitializeAngularCLI = () => { service['embeddedTutorialManager'].type.set(TutorialType.CLI); - service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); }; const setValuesToInitializeProject = () => { @@ -75,7 +77,7 @@ describe('NodeRuntimeSandbox', () => { } as any; service['webContainerPromise'] = Promise.resolve( - new FakeWebContainer({spawn: fakeSpawnProcess}), + new FakeWebContainer({spawn: fakeSpawnProcess}) as unknown as WebContainer, ); }; @@ -91,7 +93,7 @@ describe('NodeRuntimeSandbox', () => { } as any; service['webContainerPromise'] = Promise.resolve( - new FakeWebContainer({spawn: fakeSpawnProcess}), + new FakeWebContainer({spawn: fakeSpawnProcess}) as unknown as WebContainer, ); }; @@ -140,7 +142,9 @@ describe('NodeRuntimeSandbox', () => { it('should set error message when install dependencies resolve exitCode not equal to 0', async () => { const EXPECTED_ERROR = 'Installation failed'; - service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); const fakeSpawn = new FakeWebContainerProcess(); fakeSpawn.exit = Promise.resolve(10); @@ -167,7 +171,7 @@ describe('NodeRuntimeSandbox', () => { setValuesToInitializeProject(); const fakeWebContainer = new FakeWebContainer(); - service['webContainerPromise'] = Promise.resolve(fakeWebContainer); + service['webContainerPromise'] = Promise.resolve(fakeWebContainer as unknown as WebContainer); const writeFileSpy = spyOn(fakeWebContainer.fs, 'writeFile'); const path = 'path'; @@ -181,7 +185,7 @@ describe('NodeRuntimeSandbox', () => { setValuesToInitializeProject(); const fakeWebContainer = new FakeWebContainer(); - service['webContainerPromise'] = Promise.resolve(fakeWebContainer); + service['webContainerPromise'] = Promise.resolve(fakeWebContainer as unknown as WebContainer); const renameFileSpy = spyOn(fakeWebContainer.fs, 'rename'); const oldPath = 'oldPath'; @@ -202,7 +206,9 @@ describe('NodeRuntimeSandbox', () => { }); it('should initialize a project based on the tutorial config', async () => { - service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); setValuesToInitializeProject(); const initProjectSpy = spyOn(service, 'initProject' as any); @@ -241,7 +247,9 @@ describe('NodeRuntimeSandbox', () => { }); it("should set the error state when an out of memory message is received from the web container's output", async () => { - service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); setValuesToCatchOutOfMemoryError(); await service.init(); @@ -266,7 +274,9 @@ describe('NodeRuntimeSandbox', () => { }); it('should delete files on project change', async () => { - service['webContainerPromise'] = Promise.resolve(new FakeWebContainer()); + service['webContainerPromise'] = Promise.resolve( + new FakeWebContainer() as unknown as WebContainer, + ); setValuesToInitializeProject(); await service.init(); diff --git a/adev/src/app/editor/node-runtime-sandbox.service.ts b/adev/src/app/editor/node-runtime-sandbox.service.ts index a540e4e15e46..0f79be3c1993 100644 --- a/adev/src/app/editor/node-runtime-sandbox.service.ts +++ b/adev/src/app/editor/node-runtime-sandbox.service.ts @@ -253,7 +253,7 @@ export class NodeRuntimeSandbox { this.setLoading(LoadingStep.READY); } - async writeFile(path: string, content: string | Buffer): Promise { + async writeFile(path: string, content: string | Uint8Array): Promise { const webContainer = await this.webContainerPromise!; try { diff --git a/adev/src/app/features/tutorial/tutorial.component.ts b/adev/src/app/features/tutorial/tutorial.component.ts index a254df6d8090..74c3793f2c83 100644 --- a/adev/src/app/features/tutorial/tutorial.component.ts +++ b/adev/src/app/features/tutorial/tutorial.component.ts @@ -143,7 +143,7 @@ export default class Tutorial implements AfterViewInit { await Promise.all( Object.entries(this.embeddedTutorialManager.answerFiles()).map(([path, contents]) => - nodeRuntimeSandbox.writeFile(path, contents as string | Buffer), + nodeRuntimeSandbox.writeFile(path, contents as string | Uint8Array), ), ); @@ -161,7 +161,7 @@ export default class Tutorial implements AfterViewInit { await Promise.all( Object.entries(this.embeddedTutorialManager.tutorialFiles()).map(([path, contents]) => - nodeRuntimeSandbox.writeFile(path, contents as string | Buffer), + nodeRuntimeSandbox.writeFile(path, contents as string | Uint8Array), ), ); diff --git a/adev/src/content/BUILD.bazel b/adev/src/content/BUILD.bazel index 7dce3e559eb8..6de43a09b811 100644 --- a/adev/src/content/BUILD.bazel +++ b/adev/src/content/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "content", diff --git a/adev/src/content/best-practices/BUILD.bazel b/adev/src/content/best-practices/BUILD.bazel index 8eb88bc03965..9e6cbdead43e 100644 --- a/adev/src/content/best-practices/BUILD.bazel +++ b/adev/src/content/best-practices/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "best-practices", diff --git a/adev/src/content/best-practices/runtime-performance/BUILD.bazel b/adev/src/content/best-practices/runtime-performance/BUILD.bazel index 34939928e78c..76ea32eff702 100644 --- a/adev/src/content/best-practices/runtime-performance/BUILD.bazel +++ b/adev/src/content/best-practices/runtime-performance/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "runtime-performance", diff --git a/adev/src/content/ecosystem/BUILD.bazel b/adev/src/content/ecosystem/BUILD.bazel index 4c8f20a77abb..fc869b67ad8f 100644 --- a/adev/src/content/ecosystem/BUILD.bazel +++ b/adev/src/content/ecosystem/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "ecosystem", diff --git a/adev/src/content/ecosystem/service-workers/BUILD.bazel b/adev/src/content/ecosystem/service-workers/BUILD.bazel index 9a540c399b89..f3c109a333ca 100644 --- a/adev/src/content/ecosystem/service-workers/BUILD.bazel +++ b/adev/src/content/ecosystem/service-workers/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "service-workers", diff --git a/adev/src/content/guide/BUILD.bazel b/adev/src/content/guide/BUILD.bazel index 6a69ce0cd8f7..712ea843ff61 100644 --- a/adev/src/content/guide/BUILD.bazel +++ b/adev/src/content/guide/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "guide", diff --git a/adev/src/content/guide/animations/BUILD.bazel b/adev/src/content/guide/animations/BUILD.bazel index 6d14f0f2e812..a1b7b528054c 100644 --- a/adev/src/content/guide/animations/BUILD.bazel +++ b/adev/src/content/guide/animations/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "animations", diff --git a/adev/src/content/guide/components/BUILD.bazel b/adev/src/content/guide/components/BUILD.bazel index e17934d63834..a829bf726403 100644 --- a/adev/src/content/guide/components/BUILD.bazel +++ b/adev/src/content/guide/components/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "components", diff --git a/adev/src/content/guide/di/BUILD.bazel b/adev/src/content/guide/di/BUILD.bazel index 61af7bc13447..a4e039501aca 100644 --- a/adev/src/content/guide/di/BUILD.bazel +++ b/adev/src/content/guide/di/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "di", diff --git a/adev/src/content/guide/directives/BUILD.bazel b/adev/src/content/guide/directives/BUILD.bazel index e9dffa9828bd..f987e7f3f0f5 100644 --- a/adev/src/content/guide/directives/BUILD.bazel +++ b/adev/src/content/guide/directives/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "directives", diff --git a/adev/src/content/guide/forms/BUILD.bazel b/adev/src/content/guide/forms/BUILD.bazel index 1fd26759b540..68cc9611c7ba 100644 --- a/adev/src/content/guide/forms/BUILD.bazel +++ b/adev/src/content/guide/forms/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "forms", diff --git a/adev/src/content/guide/http/BUILD.bazel b/adev/src/content/guide/http/BUILD.bazel index 42c82e3257bc..2099955305d7 100644 --- a/adev/src/content/guide/http/BUILD.bazel +++ b/adev/src/content/guide/http/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "http", diff --git a/adev/src/content/guide/i18n/BUILD.bazel b/adev/src/content/guide/i18n/BUILD.bazel index 35ab545a04c0..b3d124e1ee63 100644 --- a/adev/src/content/guide/i18n/BUILD.bazel +++ b/adev/src/content/guide/i18n/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "i18n", diff --git a/adev/src/content/guide/ngmodules/BUILD.bazel b/adev/src/content/guide/ngmodules/BUILD.bazel index a31a3e22561d..52abb97fde44 100644 --- a/adev/src/content/guide/ngmodules/BUILD.bazel +++ b/adev/src/content/guide/ngmodules/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "ngmodules", diff --git a/adev/src/content/guide/performance/BUILD.bazel b/adev/src/content/guide/performance/BUILD.bazel index 6df8d48d5422..c2a80708eea0 100644 --- a/adev/src/content/guide/performance/BUILD.bazel +++ b/adev/src/content/guide/performance/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "performance", diff --git a/adev/src/content/guide/pipes/BUILD.bazel b/adev/src/content/guide/pipes/BUILD.bazel index ceb742e58294..794cba9db68c 100644 --- a/adev/src/content/guide/pipes/BUILD.bazel +++ b/adev/src/content/guide/pipes/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "pipes", diff --git a/adev/src/content/guide/routing/BUILD.bazel b/adev/src/content/guide/routing/BUILD.bazel index 17de257bc73c..2873629196b8 100644 --- a/adev/src/content/guide/routing/BUILD.bazel +++ b/adev/src/content/guide/routing/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "routing", diff --git a/adev/src/content/guide/routing/router-tutorial.md b/adev/src/content/guide/routing/router-tutorial.md index 1c05260b3bde..9b0bd462c620 100644 --- a/adev/src/content/guide/routing/router-tutorial.md +++ b/adev/src/content/guide/routing/router-tutorial.md @@ -153,7 +153,7 @@ You should see only the application title. To view the `crisis-list` component, add `crisis-list` to the end of the path in your browser's address bar. For example: - + http://localhost:4200/crisis-list @@ -161,7 +161,7 @@ Notice that the `crisis-list` component displays. Angular is using the route you defined to dynamically load the component. You can load the `heroes-list` component the same way: - + http://localhost:4200/heroes-list diff --git a/adev/src/content/guide/signals/BUILD.bazel b/adev/src/content/guide/signals/BUILD.bazel index 161bdff12110..a52dbe5d4d41 100644 --- a/adev/src/content/guide/signals/BUILD.bazel +++ b/adev/src/content/guide/signals/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "signals", diff --git a/adev/src/content/guide/templates/BUILD.bazel b/adev/src/content/guide/templates/BUILD.bazel index 4449d16f0a07..f56632d67e1b 100644 --- a/adev/src/content/guide/templates/BUILD.bazel +++ b/adev/src/content/guide/templates/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "templates", diff --git a/adev/src/content/guide/testing/BUILD.bazel b/adev/src/content/guide/testing/BUILD.bazel index 2cbc03de634d..b775514ac1fe 100644 --- a/adev/src/content/guide/testing/BUILD.bazel +++ b/adev/src/content/guide/testing/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "testing", diff --git a/adev/src/content/introduction/BUILD.bazel b/adev/src/content/introduction/BUILD.bazel index cec021c685d1..7e9414282270 100644 --- a/adev/src/content/introduction/BUILD.bazel +++ b/adev/src/content/introduction/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "introduction", diff --git a/adev/src/content/introduction/essentials/BUILD.bazel b/adev/src/content/introduction/essentials/BUILD.bazel index fa7db6de01f3..2a51f05d1b12 100644 --- a/adev/src/content/introduction/essentials/BUILD.bazel +++ b/adev/src/content/introduction/essentials/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "essentials", diff --git a/adev/src/content/reference/BUILD.bazel b/adev/src/content/reference/BUILD.bazel index 6ed0be35fd38..569863d4e2f5 100644 --- a/adev/src/content/reference/BUILD.bazel +++ b/adev/src/content/reference/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "reference", diff --git a/adev/src/content/reference/concepts/BUILD.bazel b/adev/src/content/reference/concepts/BUILD.bazel index a06fd031234d..a04a563c0baf 100644 --- a/adev/src/content/reference/concepts/BUILD.bazel +++ b/adev/src/content/reference/concepts/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "concepts", diff --git a/adev/src/content/reference/configs/BUILD.bazel b/adev/src/content/reference/configs/BUILD.bazel index a4a0f37c9d2d..5d4413fe8874 100644 --- a/adev/src/content/reference/configs/BUILD.bazel +++ b/adev/src/content/reference/configs/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "configs", diff --git a/adev/src/content/reference/errors/BUILD.bazel b/adev/src/content/reference/errors/BUILD.bazel index 2aefbbcae228..c347eea407fc 100644 --- a/adev/src/content/reference/errors/BUILD.bazel +++ b/adev/src/content/reference/errors/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "errors", diff --git a/adev/src/content/reference/extended-diagnostics/BUILD.bazel b/adev/src/content/reference/extended-diagnostics/BUILD.bazel index c0fd878aaa8d..b5f6f83e522e 100644 --- a/adev/src/content/reference/extended-diagnostics/BUILD.bazel +++ b/adev/src/content/reference/extended-diagnostics/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "extended-diagnostics", diff --git a/adev/src/content/reference/migrations/BUILD.bazel b/adev/src/content/reference/migrations/BUILD.bazel index 0fc396e809a5..5a09012e2390 100644 --- a/adev/src/content/reference/migrations/BUILD.bazel +++ b/adev/src/content/reference/migrations/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "migrations", diff --git a/adev/src/content/tools/BUILD.bazel b/adev/src/content/tools/BUILD.bazel index d7905e6680e2..936a6848958b 100644 --- a/adev/src/content/tools/BUILD.bazel +++ b/adev/src/content/tools/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "tools", diff --git a/adev/src/content/tools/cli/BUILD.bazel b/adev/src/content/tools/cli/BUILD.bazel index 5f5ef4206e25..3fc182482967 100644 --- a/adev/src/content/tools/cli/BUILD.bazel +++ b/adev/src/content/tools/cli/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "cli", diff --git a/adev/src/content/tools/libraries/BUILD.bazel b/adev/src/content/tools/libraries/BUILD.bazel index 7eaac82a89f5..a94c52cbba5e 100644 --- a/adev/src/content/tools/libraries/BUILD.bazel +++ b/adev/src/content/tools/libraries/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "libraries", diff --git a/adev/src/content/tutorials/BUILD.bazel b/adev/src/content/tutorials/BUILD.bazel index d7107e503467..3a3ce7177730 100644 --- a/adev/src/content/tutorials/BUILD.bazel +++ b/adev/src/content/tutorials/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides") +load("//adev/shared-docs:index.bzl", "generate_guides") generate_guides( name = "tutorials", diff --git a/adev/src/content/tutorials/first-app/BUILD.bazel b/adev/src/content/tutorials/first-app/BUILD.bazel index 7bb2de4ced59..9e3a5f42340a 100644 --- a/adev/src/content/tutorials/first-app/BUILD.bazel +++ b/adev/src/content/tutorials/first-app/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides", "generate_tutorial") +load("//adev/shared-docs:index.bzl", "generate_guides", "generate_tutorial") package(default_visibility = ["//adev:__subpackages__"]) diff --git a/adev/src/content/tutorials/homepage/BUILD.bazel b/adev/src/content/tutorials/homepage/BUILD.bazel index 673204c816ad..9c1e57861228 100644 --- a/adev/src/content/tutorials/homepage/BUILD.bazel +++ b/adev/src/content/tutorials/homepage/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_playground") +load("//adev/shared-docs:index.bzl", "generate_playground") package(default_visibility = ["//adev:__subpackages__"]) diff --git a/adev/src/content/tutorials/learn-angular/BUILD.bazel b/adev/src/content/tutorials/learn-angular/BUILD.bazel index 52c5f436d0aa..f18a95b69e46 100644 --- a/adev/src/content/tutorials/learn-angular/BUILD.bazel +++ b/adev/src/content/tutorials/learn-angular/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_guides", "generate_tutorial") +load("//adev/shared-docs:index.bzl", "generate_guides", "generate_tutorial") package(default_visibility = ["//adev:__subpackages__"]) diff --git a/adev/src/content/tutorials/playground/BUILD.bazel b/adev/src/content/tutorials/playground/BUILD.bazel index e59dc0774fb9..a0537c05140d 100644 --- a/adev/src/content/tutorials/playground/BUILD.bazel +++ b/adev/src/content/tutorials/playground/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm//@angular/docs:index.bzl", "generate_playground") +load("//adev/shared-docs:index.bzl", "generate_playground") package(default_visibility = ["//adev:__subpackages__"]) diff --git a/adev/tools/local_deps/index.bzl b/adev/tools/local_deps/index.bzl index 8db7d7e213e9..cb6f31da4bf5 100644 --- a/adev/tools/local_deps/index.bzl +++ b/adev/tools/local_deps/index.bzl @@ -44,7 +44,9 @@ def link_local_packages(all_deps): # dependencies on external npm packages. This help the rules_nodejs linker, # which fails to link local packages into transitive dependencies of npm deps. for dep in all_deps: - target = dep + # Ignore deps that are not coming from npm. + if not dep.startswith("@npm//"): + continue if dep in local_angular_deps: pkg_name = _angular_dep_to_pkg_name(dep) @@ -58,7 +60,7 @@ def link_local_packages(all_deps): else: filter_external_npm_deps( name = _filtered_transitives_name(dep), - target = target, + target = dep, testonly = True if dep in testonly_deps else False, angular_packages = local_angular_package_names, tags = ["manual"], diff --git a/adev/tsconfig.json b/adev/tsconfig.json index 4b6aa23dd9b7..ec79520df1e2 100644 --- a/adev/tsconfig.json +++ b/adev/tsconfig.json @@ -21,6 +21,7 @@ "target": "ES2022", "module": "ES2022", "lib": ["ES2022", "dom"], + "types": ["node"], "esModuleInterop": true, "resolveJsonModule": true, "jsx": "react", diff --git a/package.json b/package.json index 2e1585832941..85d98b4e67f0 100644 --- a/package.json +++ b/package.json @@ -188,6 +188,7 @@ "@types/inquirer": "^9.0.3", "@types/jsdom": "^21.1.5", "@typescript/vfs": "^1.5.0", + "@webcontainer/api": "^1.3.0-internal.2", "@yarnpkg/lockfile": "^1.1.0", "adm-zip": "^0.5.10", "angular-split": "^17.1.1", @@ -195,11 +196,14 @@ "cldr": "7.5.0", "cldrjs": "0.5.5", "conventional-changelog": "^6.0.0", + "emoji-regex": "^10.3.0", "fast-glob": "3.3.2", + "fflate": "^0.8.2", "firebase-tools": "^13.0.0", "gsap": "^3.12.3", "gulp": "^5.0.0", "gulp-conventional-changelog": "^5.0.0", + "html-entities": "^2.5.2", "husky": "9.1.1", "inquirer": "^10.0.0", "jsdom": "^24.0.0", @@ -208,11 +212,13 @@ "karma-sauce-launcher": "^4.3.6", "madge": "^7.0.0", "marked": "^12.0.0", + "mermaid": "^10.9.1", "ogl": "^1.0.3", "patch-package": "^7.0.0", "playwright-core": "^1.41.2", "prettier": "^3.0.0", "semver": "^7.3.5", + "shiki": "^1.11.1", "tmp": "^0.2.3", "ts-node": "^10.9.1", "tsec": "0.2.8", diff --git a/packages.bzl b/packages.bzl index a6e91c55ba8e..950bdb0f3e17 100644 --- a/packages.bzl +++ b/packages.bzl @@ -9,6 +9,9 @@ def to_package_label(package_name): if package_name == "angular-in-memory-web-api": return "//packages/misc/angular-in-memory-web-api:npm_package" + if package_name == "@angular/docs": + return "//adev/shared-docs:npm_package" + return "//packages/{package_name}:npm_package".format(package_name = package_name.replace("@angular/", "")) def _exclude_pkgs(packages, *args): diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index 6ee76307c9e8..87e5c23bc233 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -47,6 +47,7 @@ ng_package( # Dependencies on the full npm_package cause long re-builds. visibility = [ "//adev:__pkg__", + "//adev/shared-docs:__subpackages__", "//integration:__subpackages__", "//packages/bazel/test/ng_package:__pkg__", "//packages/compiler-cli/integrationtest:__pkg__", diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index 451b5431f1aa..eaf55a1caece 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -65,6 +65,7 @@ ng_package( # Dependencies on the full npm_package cause long re-builds. visibility = [ "//adev:__pkg__", + "//adev/shared-docs:__subpackages__", "//integration:__subpackages__", "//packages/bazel/test/ng_package:__pkg__", "//packages/compiler-cli/src/ngtsc/metadata/test:__subpackages__", diff --git a/packages/router/BUILD.bazel b/packages/router/BUILD.bazel index 027146b3a37f..b183feb0cf04 100644 --- a/packages/router/BUILD.bazel +++ b/packages/router/BUILD.bazel @@ -32,6 +32,7 @@ ng_package( # Dependencies on the full npm_package cause long re-builds. visibility = [ "//adev:__pkg__", + "//adev/shared-docs:__subpackages__", "//integration:__subpackages__", "//packages/compiler-cli/integrationtest:__pkg__", "//packages/compiler-cli/test:__pkg__", diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 9d21e4f053e7..98f475b3067b 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -14,7 +14,7 @@ load("@npm//@angular/build-tooling/bazel/karma:index.bzl", _karma_web_test = "ka load("@npm//@angular/build-tooling/bazel/api-golden:index.bzl", _api_golden_test = "api_golden_test", _api_golden_test_npm_package = "api_golden_test_npm_package") load("@npm//@angular/build-tooling/bazel:extract_js_module_output.bzl", "extract_js_module_output") load("@npm//@angular/build-tooling/bazel:extract_types.bzl", _extract_types = "extract_types") -load("@npm//@angular/build-tooling/bazel/esbuild:index.bzl", "esbuild_esm_bundle", _esbuild = "esbuild", _esbuild_config = "esbuild_config") +load("@npm//@angular/build-tooling/bazel/esbuild:index.bzl", _esbuild = "esbuild", _esbuild_config = "esbuild_config", _esbuild_esm_bundle = "esbuild_esm_bundle") load("@npm//@angular/build-tooling/bazel/spec-bundling:spec-entrypoint.bzl", "spec_entrypoint") load("@npm//@angular/build-tooling/bazel/spec-bundling:index.bzl", "spec_bundle") load("@npm//tsec:index.bzl", _tsec_test = "tsec_test") @@ -30,6 +30,7 @@ _INTERNAL_NG_PACKAGE_DEFAULT_ROLLUP_CONFIG_TMPL = "//packages/bazel/src/ng_packa _INTERNAL_NG_PACKAGE_DEFAULT_ROLLUP = "//packages/bazel/src/ng_package/rollup" esbuild_config = _esbuild_config +esbuild_esm_bundle = _esbuild_esm_bundle http_server = _http_server extract_types = _extract_types diff --git a/yarn.lock b/yarn.lock index 66ead5fa2a14..ee6d53cc2601 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4398,13 +4398,6 @@ "@angular-devkit/schematics" "18.1.0-next.1" jsonc-parser "3.2.1" -"@shikijs/core@1.10.3": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.10.3.tgz#f01763b36f08ad3d2ef46cea7e61858d9d9947d6" - integrity sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg== - dependencies: - "@types/hast" "^3.0.4" - "@shikijs/core@1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.11.0.tgz#a07a55037ba74f13b860698149bda03382b74cc1" @@ -4412,6 +4405,13 @@ dependencies: "@types/hast" "^3.0.4" +"@shikijs/core@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.11.1.tgz#a102cf56f32fa8cf3ceb9f918f2da5511782efe7" + integrity sha512-Qsn8h15SWgv5TDRoDmiHNzdQO2BxDe86Yq6vIHf5T0cCvmfmccJKIzHtep8bQO9HMBZYCtCBzaXdd1MnxZBPSg== + dependencies: + "@types/hast" "^3.0.4" + "@sigstore/bundle@^2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.3.2.tgz#ad4dbb95d665405fd4a7a02c8a073dbd01e4e95e" @@ -5569,9 +5569,14 @@ "@xtuc/long" "4.2.2" "@webcontainer/api@^1.1.8": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@webcontainer/api/-/api-1.1.9.tgz#b546bc71f06740975d15c8dbf9b8287f51f92a9b" - integrity sha512-Sp6PV0K9D/3f8fSbCubqhfmBFH8XbngZCBOCF+aExyGqnz2etmw+KYvbQ/JxYvYX5KPaSxM+asFQwoP2RHl5cg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webcontainer/api/-/api-1.2.0.tgz#bdaa59d2b50bd7951eeedf08624dab91e5937d6c" + integrity sha512-tzoKBd4lLdhHy5GHFpUkl+ndoSba8JqmB7x0ZQFnWfjbcbQOvKQfxA8MEMUYhgqjWHnbrWdAfnBEHz5f5lYG5A== + +"@webcontainer/api@^1.3.0-internal.2": + version "1.3.0-internal.2" + resolved "https://registry.yarnpkg.com/@webcontainer/api/-/api-1.3.0-internal.2.tgz#26afa0548bcf468b74f03dc56993ba287ebfb0e8" + integrity sha512-lLSlSehbuYc9E7ecK+tMRX4BbWETNX1OgRlS+NerQh3X3sHNbxLD86eScEMAiA5VBnUeSnLtLe7eC/ftM8fR3Q== "@xmldom/xmldom@^0.8.0", "@xmldom/xmldom@^0.8.5": version "0.8.10" @@ -10312,7 +10317,7 @@ html-encoding-sniffer@^4.0.0: dependencies: whatwg-encoding "^3.1.1" -html-entities@^2.4.0, html-entities@~2.5.2: +html-entities@^2.4.0, html-entities@^2.5.2, html-entities@~2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== @@ -10453,7 +10458,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@7.0.4, https-proxy-agent@7.0.5, 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, https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.4: +https-proxy-agent@7.0.4, https-proxy-agent@7.0.5, 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, https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== @@ -11381,9 +11386,9 @@ jsdom@^24.0.0: xml-name-validator "^5.0.0" jsdom@~24.1.0: - version "24.1.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.0.tgz#0cffdabd42c506788bfecd160e8ac22d4387f971" - integrity sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA== + version "24.1.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.1.tgz#f41df8f4f3b2fbfa7e1bdc5df62c9804fd14a9d0" + integrity sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ== dependencies: cssstyle "^4.0.1" data-urls "^5.0.0" @@ -11391,11 +11396,11 @@ jsdom@~24.1.0: form-data "^4.0.0" html-encoding-sniffer "^4.0.0" http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.4" + https-proxy-agent "^7.0.5" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.10" + nwsapi "^2.2.12" parse5 "^7.1.2" - rrweb-cssom "^0.7.0" + rrweb-cssom "^0.7.1" saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^4.1.4" @@ -11404,7 +11409,7 @@ jsdom@~24.1.0: whatwg-encoding "^3.1.1" whatwg-mimetype "^4.0.0" whatwg-url "^14.0.0" - ws "^8.17.0" + ws "^8.18.0" xml-name-validator "^5.0.0" jsesc@^2.5.1: @@ -12360,7 +12365,7 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@^10.8.0: +mermaid@^10.8.0, mermaid@^10.9.1: version "10.9.1" resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.9.1.tgz#5f582c23f3186c46c6aa673e59eeb46d741b2ea6" integrity sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA== @@ -13167,10 +13172,10 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nwsapi@^2.2.10: - version "2.2.10" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8" - integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== +nwsapi@^2.2.12: + version "2.2.12" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8" + integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w== nwsapi@^2.2.7: version "2.2.9" @@ -14877,10 +14882,10 @@ rrweb-cssom@^0.6.0: resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== -rrweb-cssom@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.0.tgz#51cc1e7f4c20dd81218545b5092939bc6fd81bcd" - integrity sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g== +rrweb-cssom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" + integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== run-applescript@^7.0.0: version "7.0.0" @@ -15380,12 +15385,12 @@ shelljs@^0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shiki@^1.10.3: - version "1.10.3" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.10.3.tgz#2276fb21a07043b28c5b16001e6a04fef99dbb8f" - integrity sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ== +shiki@^1.10.3, shiki@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.11.1.tgz#6c06c5fcf55f1dac2db2596af935fef6a41a209d" + integrity sha512-VHD3Q0EBXaaa245jqayBe5zQyMQUdXBFjmGr9MpDaDpAKRMYn7Ff00DM5MLk26UyKjnml3yQ0O2HNX7PtYVNFQ== dependencies: - "@shikijs/core" "1.10.3" + "@shikijs/core" "1.11.1" "@types/hast" "^3.0.4" shiki@^1.11.0: @@ -17551,7 +17556,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@8.17.0, ws@>=8.16.0, ws@^8.15.0, ws@^8.16.0, ws@^8.17.0: +ws@8.17.0, ws@>=8.16.0, ws@^8.15.0, ws@^8.16.0: version "8.17.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== @@ -17561,7 +17566,7 @@ ws@^7.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.17.1: +ws@^8.17.1, ws@^8.18.0: version "8.18.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== From d7864e0fb8e9e4c37fa3fdc4aa0c1ed8e268771e Mon Sep 17 00:00:00 2001 From: David LJ Date: Sat, 27 Jul 2024 20:40:42 +0200 Subject: [PATCH 111/143] docs: update `ng generate` command references (#57161) PR Close #57161 --- adev/src/content/ecosystem/service-workers/app-shell.md | 2 +- adev/src/content/tools/cli/build.md | 2 +- adev/src/content/tools/cli/environments.md | 2 +- .../tutorials/first-app/steps/02-HomeComponent/README.md | 2 +- .../content/tutorials/first-app/steps/04-interfaces/README.md | 2 +- .../src/content/tutorials/first-app/steps/09-services/README.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/adev/src/content/ecosystem/service-workers/app-shell.md b/adev/src/content/ecosystem/service-workers/app-shell.md index 6088bbcf47da..6072e3cd77b7 100644 --- a/adev/src/content/ecosystem/service-workers/app-shell.md +++ b/adev/src/content/ecosystem/service-workers/app-shell.md @@ -28,7 +28,7 @@ ng generate app-shell -For more information about this command, see [App shell command](cli/generate#app-shell-command). +For more information about this command, see [App shell command](cli/generate/app-shell). The command updates the application code and adds extra files to the project structure. diff --git a/adev/src/content/tools/cli/build.md b/adev/src/content/tools/cli/build.md index f3a75945fe82..91bfbbabbb01 100644 --- a/adev/src/content/tools/cli/build.md +++ b/adev/src/content/tools/cli/build.md @@ -145,7 +145,7 @@ Firefox ESR -To override the internal configuration, run [`ng generate config browserslist`](cli/generate#config-command), which generates a `.browserslistrc` configuration file in the project directory. +To override the internal configuration, run [`ng generate config browserslist`](cli/generate/config), which generates a `.browserslistrc` configuration file in the project directory. See the [browserslist repository](https://github.com/browserslist/browserslist) for more examples of how to target specific browsers and versions. Avoid expanding this list to more browsers. Even if your application code more broadly compatible, Angular itself might not be. diff --git a/adev/src/content/tools/cli/environments.md b/adev/src/content/tools/cli/environments.md index 8f50ba372cd7..a9a667acd770 100644 --- a/adev/src/content/tools/cli/environments.md +++ b/adev/src/content/tools/cli/environments.md @@ -57,7 +57,7 @@ ng build --configuration debug,production,customer-facing `@angular-devkit/build-angular:browser` supports file replacements, an option for substituting source files before executing a build. Using this in combination with `--configuration` provides a mechanism for configuring environment-specific data in your application. -Start by [generating environments](cli/generate#environments-command) to create the `src/environments/` directory and configure the project to use file replacements. +Start by [generating environments](cli/generate/environments) to create the `src/environments/` directory and configure the project to use file replacements. diff --git a/adev/src/content/tutorials/first-app/steps/02-HomeComponent/README.md b/adev/src/content/tutorials/first-app/steps/02-HomeComponent/README.md index 576ac3fc8151..cf80ad5ac661 100644 --- a/adev/src/content/tutorials/first-app/steps/02-HomeComponent/README.md +++ b/adev/src/content/tutorials/first-app/steps/02-HomeComponent/README.md @@ -122,7 +122,7 @@ Summary: In this lesson, you created a new component for your app and gave it a For more information about the topics covered in this lesson, visit: - + diff --git a/adev/src/content/tutorials/first-app/steps/04-interfaces/README.md b/adev/src/content/tutorials/first-app/steps/04-interfaces/README.md index e131eac23a08..46a6774093ab 100644 --- a/adev/src/content/tutorials/first-app/steps/04-interfaces/README.md +++ b/adev/src/content/tutorials/first-app/steps/04-interfaces/README.md @@ -94,6 +94,6 @@ This new data type also makes it possible for your IDE and the TypeScript compil For more information about the topics covered in this lesson, visit: - + diff --git a/adev/src/content/tutorials/first-app/steps/09-services/README.md b/adev/src/content/tutorials/first-app/steps/09-services/README.md index da436da636b9..08480fcb62b1 100644 --- a/adev/src/content/tutorials/first-app/steps/09-services/README.md +++ b/adev/src/content/tutorials/first-app/steps/09-services/README.md @@ -105,6 +105,6 @@ For more information about the topics covered in this lesson, visit: - + From 49884518a0391668f4e20a27b371513431917562 Mon Sep 17 00:00:00 2001 From: Sheik Althaf Date: Thu, 18 Jul 2024 23:51:31 +0530 Subject: [PATCH 112/143] refactor(devtools): use signal apis in injection and router tree (#57047) Refactor the injection and router tree components to use signal apis, in future we can make the components onPush and zoneless PR Close #57047 --- .../resolution-path.component.ts | 68 ++++++---- .../component-metadata.component.html | 8 +- .../component-metadata.component.ts | 28 ++-- .../property-tab-header.component.html | 11 +- .../property-tab-header.component.ts | 5 +- .../property-tab/property-tab.component.html | 4 +- .../property-tab/property-tab.component.ts | 8 +- .../injector-providers.component.ts | 36 +++-- .../injector-tree.component.html | 8 +- .../injector-tree/injector-tree.component.ts | 123 ++++++++++-------- .../router-tree/router-tree.component.html | 4 +- .../router-tree/router-tree.component.ts | 61 +++++---- 12 files changed, 199 insertions(+), 165 deletions(-) diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection/resolution-path.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection/resolution-path.component.ts index b861a486d886..6fa3cb893a99 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection/resolution-path.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/dependency-injection/resolution-path.component.ts @@ -6,7 +6,16 @@ * found in the LICENSE file at https://angular.io/license */ -import {AfterViewInit, Component, ElementRef, Input, OnDestroy, ViewChild} from '@angular/core'; +import { + afterNextRender, + Component, + computed, + effect, + ElementRef, + input, + OnDestroy, + viewChild, +} from '@angular/core'; import {SerializedInjector} from 'protocol'; import {InjectorTreeNode, InjectorTreeVisualizer} from './injector-tree-visualizer'; @@ -29,17 +38,17 @@ import {InjectorTreeNode, InjectorTreeVisualizer} from './injector-tree-visualiz ], standalone: true, }) -export class ResolutionPathComponent implements OnDestroy, AfterViewInit { - @ViewChild('svgContainer', {static: true}) private svgContainer!: ElementRef; - @ViewChild('mainGroup', {static: true}) private g!: ElementRef; +export class ResolutionPathComponent implements OnDestroy { + private svgContainer = viewChild.required('svgContainer'); + private g = viewChild.required('mainGroup'); - @Input() orientation: 'horizontal' | 'vertical' = 'horizontal'; + readonly orientation = input<'horizontal' | 'vertical'>('horizontal'); private injectorTree!: InjectorTreeVisualizer; - private pathNode!: InjectorTreeNode; - @Input() - set path(path: SerializedInjector[]) { + readonly path = input([]); + private readonly pathNode = computed(() => { + const path = this.path(); const serializedInjectors = path.slice().reverse(); const injectorTreeNodes: InjectorTreeNode[] = []; @@ -57,30 +66,35 @@ export class ResolutionPathComponent implements OnDestroy, AfterViewInit { } } - this.pathNode = injectorTreeNodes[0]; - this.injectorTree?.render?.(this.pathNode); - } + return injectorTreeNodes[0]; + }); - ngOnInit(): void { - this.injectorTree = new InjectorTreeVisualizer( - this.svgContainer.nativeElement, - this.g.nativeElement, - { - orientation: this.orientation, - }, - ); + constructor() { + afterNextRender({ + read: () => { + this.injectorTree = new InjectorTreeVisualizer( + this.svgContainer().nativeElement, + this.g().nativeElement, + { + orientation: this.orientation(), + }, + ); - if (this.pathNode) { - this.injectorTree.render(this.pathNode); - } + if (this.pathNode()) { + this.injectorTree.render(this.pathNode()); + } + + this.injectorTree.onNodeClick((_, node) => { + this.injectorTree.snapToNode(node); + }); - this.injectorTree.onNodeClick((_, node) => { - this.injectorTree.snapToNode(node); + this.injectorTree.snapToRoot(0.7); + }, }); - } - ngAfterViewInit(): void { - this.injectorTree.snapToRoot(0.7); + effect(() => { + this.injectorTree?.render?.(this.pathNode()); + }); } ngOnDestroy(): void { diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.html index 8a0977e9d9a0..46e030f5b4e8 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.html @@ -1,22 +1,22 @@ diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.ts index e6cc06ea21b1..75fb2f04d2ee 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/component-metadata.component.ts @@ -6,10 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectionStrategy, Component, Input} from '@angular/core'; +import {ChangeDetectionStrategy, Component, computed, inject, input} from '@angular/core'; import {ComponentType} from 'protocol'; -import {DirectivePropertyResolver} from '../property-resolver/directive-property-resolver'; import {ElementPropertyResolver} from '../property-resolver/element-property-resolver'; import {MatButton} from '@angular/material/button'; @@ -22,29 +21,30 @@ import {MatButton} from '@angular/material/button'; imports: [MatButton], }) export class ComponentMetadataComponent { - @Input({required: true}) currentSelectedComponent!: ComponentType; + readonly currentSelectedComponent = input.required(); - constructor(private _nestedProps: ElementPropertyResolver) {} + private _nestedProps = inject(ElementPropertyResolver); viewEncapsulationModes = ['Emulated', 'Native', 'None', 'ShadowDom']; - get controller(): DirectivePropertyResolver | undefined { - if (!this.currentSelectedComponent) { + readonly controller = computed(() => { + const comp = this.currentSelectedComponent(); + if (!comp) { return; } - return this._nestedProps.getDirectiveController(this.currentSelectedComponent.name); - } + return this._nestedProps.getDirectiveController(comp.name); + }); - get viewEncapsulation(): string | undefined { - const encapsulationIndex = this?.controller?.directiveViewEncapsulation; + readonly viewEncapsulation = computed(() => { + const encapsulationIndex = this.controller()?.directiveViewEncapsulation; if (encapsulationIndex !== undefined) { return this.viewEncapsulationModes[encapsulationIndex]; } return undefined; - } + }); - get changeDetectionStrategy(): string | undefined { - const onPush = this?.controller?.directiveHasOnPushStrategy; + readonly changeDetectionStrategy = computed(() => { + const onPush = this.controller()?.directiveHasOnPushStrategy; return onPush ? 'OnPush' : onPush !== undefined ? 'Default' : undefined; - } + }); } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.html index 2921e01defeb..4cf38ab6faee 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.html @@ -1,22 +1,23 @@ -@if (currentSelectedElement) { - @if (currentSelectedElement.component) { +@if (currentSelectedElement()) { + @let comp = currentSelectedElement().component; + @if (comp) {
-
{{ currentSelectedElement.component.name }}
+
{{ comp.name }}
- +
} @else {
-
{{ currentSelectedElement.element }}
+
{{ currentSelectedElement().element }}
} } @else { diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts index 02c63f2eba5e..2e09ca5ff7b3 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectionStrategy, Component, Input} from '@angular/core'; +import {ChangeDetectionStrategy, Component, input} from '@angular/core'; import {IndexedNode} from '../directive-forest/index-forest'; import {ComponentMetadataComponent} from './component-metadata.component'; @@ -21,6 +21,5 @@ import {MatExpansionModule} from '@angular/material/expansion'; imports: [MatExpansionModule, ComponentMetadataComponent], }) export class PropertyTabHeaderComponent { - @Input({required: true}) currentSelectedElement!: IndexedNode; - @Input() currentDirectives: string[] | undefined; + currentSelectedElement = input.required(); } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.html index 8d2213eae64e..e1568cadba19 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.html @@ -1,4 +1,4 @@ - + - + diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.ts index 982838dfaa02..d25b0ed5ffb4 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, input, output} from '@angular/core'; import {DirectivePosition} from 'protocol'; import {IndexedNode} from '../directive-forest/index-forest'; @@ -21,7 +21,7 @@ import {PropertyTabHeaderComponent} from './property-tab-header.component'; imports: [PropertyTabHeaderComponent, PropertyTabBodyComponent], }) export class PropertyTabComponent { - @Input({required: true}) currentSelectedElement!: IndexedNode; - @Output() viewSource = new EventEmitter(); - @Output() inspect = new EventEmitter<{node: FlatNode; directivePosition: DirectivePosition}>(); + readonly currentSelectedElement = input.required(); + readonly viewSource = output(); + readonly inspect = output<{node: FlatNode; directivePosition: DirectivePosition}>(); } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts index 058deeb1d6a6..6903f6a6a2bd 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-providers.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, computed, inject, Input, signal} from '@angular/core'; +import {Component, computed, inject, input, signal} from '@angular/core'; import {MatOption} from '@angular/material/core'; import {MatFormField, MatLabel} from '@angular/material/form-field'; import {MatIcon} from '@angular/material/icon'; @@ -19,8 +19,8 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' @Component({ selector: 'ng-injector-providers', template: ` -

Providers for {{ injector?.name }}

- @if (injector) { +

Providers for {{ injector()?.name }}

+ @if (injector()) {
Search by token @@ -42,8 +42,8 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' } - @if (providers.length > 0) { - + @if (visibleProviders().length > 0) { +
@@ -155,12 +155,12 @@ import {Events, MessageBus, SerializedInjector, SerializedProviderRecord} from ' ], }) export class InjectorProvidersComponent { - @Input({required: true}) injector!: SerializedInjector; - @Input() providers: SerializedProviderRecord[] = []; + readonly injector = input.required(); + readonly providers = input([]); - searchToken = signal(''); - searchType = signal(''); - visibleProviders = computed(() => { + readonly searchToken = signal(''); + readonly searchType = signal(''); + readonly visibleProviders = computed(() => { const searchToken = this.searchToken().toLowerCase(); const searchType = this.searchType(); @@ -169,7 +169,7 @@ export class InjectorProvidersComponent { predicates.push((provider) => provider.token.toLowerCase().includes(searchToken)); searchType && predicates.push((provider) => provider.type === searchType); - return this.providers.filter((provider) => + return this.providers().filter((provider) => predicates.every((predicate) => predicate(provider)), ); }); @@ -184,21 +184,15 @@ export class InjectorProvidersComponent { providerTypes = Object.keys(this.providerTypeToLabel); - messageBus = inject(MessageBus); + messageBus = inject>(MessageBus); select(row: SerializedProviderRecord) { - this.messageBus.emit('logProvider', [ - { - id: this.injector.id, - type: this.injector.type, - name: this.injector.name, - }, - row, - ]); + const {id, type, name} = this.injector(); + this.messageBus.emit('logProvider', [{id, type, name}, row]); } get displayedColumns(): string[] { - if (this.injector?.type === 'element') { + if (this.injector()?.type === 'element') { return ['token', 'type', 'isViewProvider', 'log']; } return ['token', 'type', 'log']; diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html index 7e4058b06110..7b2c4a41b910 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.html @@ -1,9 +1,9 @@ -@if (!diDebugAPIsAvailable) { +@if (!diDebugAPIsAvailable()) {

This feature is only available on version 17.0.0 or higher of Angular.

} - + - @if (selectedNode && providers.length > 0) { + @if (selectedNode() && providers().length > 0) { - + } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.ts index 1715c6032e7d..31c8824ea7aa 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/injector-tree/injector-tree.component.ts @@ -6,7 +6,15 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, ElementRef, inject, NgZone, ViewChild} from '@angular/core'; +import { + afterNextRender, + Component, + ElementRef, + inject, + NgZone, + signal, + viewChild, +} from '@angular/core'; import {MatButton} from '@angular/material/button'; import {MatCheckbox} from '@angular/material/checkbox'; import {MatExpansionPanel} from '@angular/material/expansion'; @@ -57,36 +65,41 @@ import { styleUrls: ['./injector-tree.component.scss'], }) export class InjectorTreeComponent { - @ViewChild('svgContainer', {static: false}) private svgContainer!: ElementRef; - @ViewChild('mainGroup', {static: false}) private g!: ElementRef; + private svgContainer = viewChild.required('svgContainer'); + private g = viewChild.required('mainGroup'); - @ViewChild('elementSvgContainer', {static: false}) private elementSvgContainer!: ElementRef; - @ViewChild('elementMainGroup', {static: false}) private elementG!: ElementRef; + private elementSvgContainer = viewChild.required('elementSvgContainer'); + private elementG = viewChild.required('elementMainGroup'); private _messageBus = inject(MessageBus) as MessageBus; zone = inject(NgZone); firstRender = true; - selectedNode: InjectorTreeD3Node | null = null; + readonly selectedNode = signal(null); rawDirectiveForest: DevToolsNode[] = []; injectorTreeGraph!: InjectorTreeVisualizer; elementInjectorTreeGraph!: InjectorTreeVisualizer; - diDebugAPIsAvailable = false; - providers: SerializedProviderRecord[] = []; + readonly diDebugAPIsAvailable = signal(false); + readonly providers = signal([]); elementToEnvironmentPath: Map = new Map(); hideInjectorsWithNoProviders = false; hideFrameworkInjectors = false; - ngAfterViewInit() { - this.setUpEnvironmentInjectorVisualizer(); - this.setUpElementInjectorVisualizer(); + constructor() { + afterNextRender({ + write: () => { + this.init(); + this.setUpEnvironmentInjectorVisualizer(); + this.setUpElementInjectorVisualizer(); + }, + }); } - ngOnInit() { + private init() { this._messageBus.on('latestComponentExplorerView', (view: ComponentExplorerView) => { if (view.forest[0].resolutionPath !== undefined) { - this.diDebugAPIsAvailable = true; + this.diDebugAPIsAvailable.set(true); this.rawDirectiveForest = view.forest; this.updateInjectorTreeVisualization(view.forest); } @@ -95,9 +108,11 @@ export class InjectorTreeComponent { this._messageBus.on( 'latestInjectorProviders', (_: SerializedInjector, providers: SerializedProviderRecord[]) => { - this.providers = Array.from(providers).sort((a, b) => { - return a.token.localeCompare(b.token); - }); + this.providers.set( + Array.from(providers).sort((a, b) => { + return a.token.localeCompare(b.token); + }), + ); }, ); @@ -124,12 +139,12 @@ export class InjectorTreeComponent { private refreshVisualizer(): void { this.updateInjectorTreeVisualization(this.rawDirectiveForest); - if (this.selectedNode?.data?.injector?.type === 'environment') { + if (this.selectedNode()?.data?.injector?.type === 'environment') { this.snapToRoot(this.elementInjectorTreeGraph); } - if (this.selectedNode) { - this.selectInjectorByNode(this.selectedNode); + if (this.selectedNode()) { + this.selectInjectorByNode(this.selectedNode()!); } } @@ -209,18 +224,19 @@ export class InjectorTreeComponent { } checkIfSelectedNodeStillExists(): void { - if (this.selectedNode === null) { + const selectedNode = this.selectedNode(); + if (selectedNode === null) { this.snapToRoot(this.injectorTreeGraph); this.snapToRoot(this.elementInjectorTreeGraph); return; } - const injector = this.selectedNode.data.injector; + const injector = selectedNode.data.injector; if (injector.type === 'element') { const node = this.elementInjectorTreeGraph.getNodeById(injector.id); if (node) { - this.selectedNode = node; + this.selectedNode.set(node); return; } } @@ -228,12 +244,12 @@ export class InjectorTreeComponent { if (injector.type === 'environment') { const node = this.injectorTreeGraph.getNodeById(injector.id); if (node) { - this.selectedNode = node; + this.selectedNode.set(node); return; } } - this.selectedNode = null; + this.selectedNode.set(null); this.snapToRoot(this.injectorTreeGraph); this.snapToRoot(this.elementInjectorTreeGraph); } @@ -254,60 +270,57 @@ export class InjectorTreeComponent { } setUpEnvironmentInjectorVisualizer(): void { - if (!this.svgContainer?.nativeElement || !this.g?.nativeElement) { + const svg = this.svgContainer()?.nativeElement; + const g = this.g()?.nativeElement; + if (!svg || !g) { return; } this.injectorTreeGraph?.cleanup?.(); - this.injectorTreeGraph = new InjectorTreeVisualizer( - this.svgContainer.nativeElement, - this.g.nativeElement, - ); + this.injectorTreeGraph = new InjectorTreeVisualizer(svg, g); } setUpElementInjectorVisualizer(): void { - if (!this.elementSvgContainer?.nativeElement || !this.elementG?.nativeElement) { + const svg = this.elementSvgContainer()?.nativeElement; + const g = this.elementG()?.nativeElement; + if (!svg || !g) { return; } this.elementInjectorTreeGraph?.cleanup?.(); - this.elementInjectorTreeGraph = new InjectorTreeVisualizer( - this.elementSvgContainer.nativeElement, - this.elementG.nativeElement, - {nodeSeparation: () => 1}, - ); + this.elementInjectorTreeGraph = new InjectorTreeVisualizer(svg, g, {nodeSeparation: () => 1}); } highlightPathFromSelectedInjector(): void { - this.unhighlightAllEdges(this.elementG); - this.unhighlightAllNodes(this.elementG); - this.unhighlightAllEdges(this.g); - this.unhighlightAllNodes(this.g); + this.unhighlightAllEdges(this.elementG()); + this.unhighlightAllNodes(this.elementG()); + this.unhighlightAllEdges(this.g()); + this.unhighlightAllNodes(this.g()); this.checkIfSelectedNodeStillExists(); - if (this.selectedNode === null) { + if (this.selectedNode() === null) { return; } - if (this.selectedNode.data.injector.type === 'element') { - const idsToRoot = getInjectorIdsToRootFromNode(this.selectedNode); - idsToRoot.forEach((id) => this.highlightNodeById(this.elementG, id)); + if (this.selectedNode()!.data.injector.type === 'element') { + const idsToRoot = getInjectorIdsToRootFromNode(this.selectedNode()!); + idsToRoot.forEach((id) => this.highlightNodeById(this.elementG(), id)); const edgeIds = generateEdgeIdsFromNodeIds(idsToRoot); - edgeIds.forEach((edgeId) => this.highlightEdgeById(this.elementG, edgeId)); + edgeIds.forEach((edgeId) => this.highlightEdgeById(this.elementG(), edgeId)); const environmentPath = - this.elementToEnvironmentPath.get(this.selectedNode.data.injector.id) ?? []; - environmentPath.forEach((injector) => this.highlightNodeById(this.g, injector.id)); + this.elementToEnvironmentPath.get(this.selectedNode()!.data.injector.id) ?? []; + environmentPath.forEach((injector) => this.highlightNodeById(this.g(), injector.id)); const environmentEdgeIds = generateEdgeIdsFromNodeIds( environmentPath.map((injector) => injector.id), ); - environmentEdgeIds.forEach((edgeId) => this.highlightEdgeById(this.g, edgeId)); + environmentEdgeIds.forEach((edgeId) => this.highlightEdgeById(this.g(), edgeId)); } else { - const idsToRoot = getInjectorIdsToRootFromNode(this.selectedNode); - idsToRoot.forEach((id) => this.highlightNodeById(this.g, id)); + const idsToRoot = getInjectorIdsToRootFromNode(this.selectedNode()!); + idsToRoot.forEach((id) => this.highlightNodeById(this.g(), id)); const edgeIds = generateEdgeIdsFromNodeIds(idsToRoot); - edgeIds.forEach((edgeId) => this.highlightEdgeById(this.g, edgeId)); + edgeIds.forEach((edgeId) => this.highlightEdgeById(this.g(), edgeId)); } } @@ -316,7 +329,7 @@ export class InjectorTreeComponent { if (!node) { return; } - if (this.selectedNode!.data.injector.id === id) { + if (this.selectedNode()!.data.injector.id === id) { node.classList.add('selected'); } node.classList.add('highlighted'); @@ -347,17 +360,17 @@ export class InjectorTreeComponent { } selectInjectorByNode(node: InjectorTreeD3Node): void { - this.selectedNode = node; + this.selectedNode.set(node); this.highlightPathFromSelectedInjector(); - this.snapToNode(this.selectedNode); + this.snapToNode(this.selectedNode()!); this.getProviders(); } getProviders() { - if (this.selectedNode === null) { + if (this.selectedNode() === null) { return; } - const injector = this.selectedNode.data.injector; + const injector = this.selectedNode()!.data.injector; this._messageBus.emit('getInjectorProviders', [ { id: injector.id, diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.html b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.html index be00efd495df..8b8270a299e9 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.html +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.html @@ -1,8 +1,8 @@
-
+

There are no routes to display.

- +
diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.ts index 389efe05b7eb..933bd0a23b26 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/router-tree/router-tree.component.ts @@ -6,7 +6,15 @@ * found in the LICENSE file at https://angular.io/license */ -import {AfterViewInit, Component, ElementRef, Input, ViewChild} from '@angular/core'; +import { + afterNextRender, + Component, + effect, + ElementRef, + inject, + input, + viewChild, +} from '@angular/core'; import * as d3 from 'd3'; import {Events, MessageBus, Route} from 'protocol'; @@ -16,47 +24,52 @@ import {Events, MessageBus, Route} from 'protocol'; styleUrls: ['./router-tree.component.scss'], standalone: true, }) -export class RouterTreeComponent implements AfterViewInit { - @ViewChild('svgContainer', {static: true}) private svgContainer!: ElementRef; - @ViewChild('mainGroup', {static: true}) private g!: ElementRef; - - @Input() - set routes(routes: Route[]) { - this._routes = routes; - this.render(); - } +export class RouterTreeComponent { + private svgContainer = viewChild.required('svgContainer'); + private g = viewChild.required('mainGroup'); + + routes = input([]); - private _routes: Route[] = []; private tree!: d3.TreeLayout<{}>; private tooltip: any; - - constructor(private _messageBus: MessageBus) {} - - ngAfterViewInit(): void { - this._messageBus.emit('getRoutes'); + private _messageBus = inject>(MessageBus); + + constructor() { + effect(() => { + this.render(); + }); + + afterNextRender({ + read: () => { + this._messageBus.emit('getRoutes'); + }, + }); } - render(): void { - if (this._routes.length === 0 || !this.g) { + private render(): void { + const routes = this.routes(); + const gEl = this.g()?.nativeElement; + const svgContainerEl = this.svgContainer()?.nativeElement; + if (routes.length === 0 || !this.g) { return; } // cleanup old render this.tooltip?.remove?.(); - d3.select(this.g.nativeElement).selectAll('*').remove(); + d3.select(gEl).selectAll('*').remove(); this.tree = d3.tree(); - const svg = d3.select(this.svgContainer.nativeElement); + const svg = d3.select(svgContainerEl); svg.attr('height', 500).attr('width', 500); - const g = d3.select(this.g.nativeElement); + const g = d3.select(gEl); const svgPadding = 20; // Compute the new tree layout. this.tree.nodeSize([75, 200]); - const root: any = this._routes[0]; + const root: any = routes; const nodes = this.tree( d3.hierarchy( @@ -138,8 +151,8 @@ export class RouterTreeComponent implements AfterViewInit { // reset transform g.attr('transform', 'translate(0, 0)'); - const svgRect = this.svgContainer.nativeElement.getBoundingClientRect(); - const gElRect = this.g.nativeElement.getBoundingClientRect(); + const svgRect = svgContainerEl.getBoundingClientRect(); + const gElRect = gEl.getBoundingClientRect(); g.attr( 'transform', From a752178f28b836acfc55c4dfa7cd4d18e99ca7c4 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 29 Jul 2024 06:48:22 +0200 Subject: [PATCH 113/143] fix(core): hydration error in some let declaration setups (#57173) Fixes that we were throwing an assertion error during hydration if a `@let` declaration is used before and immediately inside of a container. Fixes #57160. PR Close #57173 --- .../core/src/render3/node_manipulation.ts | 8 ++- .../platform-server/test/hydration_spec.ts | 66 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index ce41d38f3bf4..7c5aba96c652 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -864,7 +864,11 @@ export function getFirstNativeNode(lView: LView, tNode: TNode | null): RNode | n ngDevMode && assertTNodeType( tNode, - TNodeType.AnyRNode | TNodeType.AnyContainer | TNodeType.Icu | TNodeType.Projection, + TNodeType.AnyRNode | + TNodeType.AnyContainer | + TNodeType.Icu | + TNodeType.Projection | + TNodeType.LetDeclaration, ); const tNodeType = tNode.type; @@ -884,6 +888,8 @@ export function getFirstNativeNode(lView: LView, tNode: TNode | null): RNode | n return unwrapRNode(rNodeOrLContainer); } } + } else if (tNodeType & TNodeType.LetDeclaration) { + return getFirstNativeNode(lView, tNode.next); } else if (tNodeType & TNodeType.Icu) { let nextRNode = icuContainerIterate(tNode as TIcuContainerNode, lView); let rNode: RNode | null = nextRNode(); diff --git a/packages/platform-server/test/hydration_spec.ts b/packages/platform-server/test/hydration_spec.ts index 5480fc9fa24d..3e609436043b 100644 --- a/packages/platform-server/test/hydration_spec.ts +++ b/packages/platform-server/test/hydration_spec.ts @@ -7643,6 +7643,72 @@ describe('platform-server hydration integration', () => { verifyClientAndSSRContentsMatch(ssrContents, clientRootNode); expect(clientRootNode.innerHTML).toContain(`${expectedContent}`); }); + + it('should handle let declaration before and directly inside of an embedded view', async () => { + @Component({ + standalone: true, + selector: 'app', + template: ` + @let before = 'before'; + @if (true) { + @let inside = 'inside'; + {{before}}|{{inside}} + } + `, + }) + class SimpleComponent {} + + const html = await ssr(SimpleComponent); + const ssrContents = getAppContents(html); + + expect(ssrContents).toContain('(appRef); + appRef.tick(); + + const clientRootNode = compRef.location.nativeElement; + verifyAllNodesClaimedForHydration(clientRootNode); + verifyClientAndSSRContentsMatch(ssrContents, clientRootNode); + expect(clientRootNode.textContent).toContain('before|inside'); + }); + + it('should handle let declaration before, directly inside of and after an embedded view', async () => { + @Component({ + standalone: true, + selector: 'app', + template: ` + @let before = 'before'; + @if (true) { + @let inside = 'inside'; + {{inside}} + } + @let after = 'after'; + {{before}}|{{after}} + `, + }) + class SimpleComponent {} + + const html = await ssr(SimpleComponent); + const ssrContents = getAppContents(html); + + expect(ssrContents).toContain(' before|after'); + + resetTViewsFor(SimpleComponent); + + const appRef = await renderAndHydrate(doc, html, SimpleComponent); + const compRef = getComponentRef(appRef); + appRef.tick(); + + const clientRootNode = compRef.location.nativeElement; + verifyAllNodesClaimedForHydration(clientRootNode); + verifyClientAndSSRContentsMatch(ssrContents, clientRootNode); + expect(clientRootNode.textContent).toContain('inside before|after'); + }); }); describe('Router', () => { From 165973bfbce1a316c37eef6215313704a2972664 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 30 Jul 2024 16:05:35 +0000 Subject: [PATCH 114/143] build: update all non-major dependencies (#57178) See associated pull request for more information. PR Close #57178 --- package.json | 4 ++-- yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 85d98b4e67f0..b647221fd336 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@types/babel__core": "7.20.5", "@types/babel__generator": "7.6.8", "@types/bluebird": "^3.5.27", - "@types/chrome": "^0.0.268", + "@types/chrome": "^0.0.269", "@types/convert-source-map": "^2.0.0", "@types/diff": "^5.0.0", "@types/dom-view-transitions": "^1.0.1", @@ -204,7 +204,7 @@ "gulp": "^5.0.0", "gulp-conventional-changelog": "^5.0.0", "html-entities": "^2.5.2", - "husky": "9.1.1", + "husky": "9.1.4", "inquirer": "^10.0.0", "jsdom": "^24.0.0", "karma-coverage": "^2.2.1", diff --git a/yarn.lock b/yarn.lock index ee6d53cc2601..11c645754186 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4618,10 +4618,10 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== -"@types/chrome@^0.0.268": - version "0.0.268" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.268.tgz#d5855546f30c83e181cadd77127a162c25b480d2" - integrity sha512-7N1QH9buudSJ7sI8Pe4mBHJr5oZ48s0hcanI9w3wgijAlv1OZNUZve9JR4x42dn5lJ5Sm87V1JNfnoh10EnQlA== +"@types/chrome@^0.0.269": + version "0.0.269" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.269.tgz#5bc2a536bb72a3332119742f31b42b5250d39905" + integrity sha512-vF7x8YywnhXX2F06njQ/OE7a3Qeful43C5GUOsUksXWk89WoSFUU3iLeZW8lDpVO9atm8iZIEiLQTRC3H7NOXQ== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -10471,10 +10471,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -husky@9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.1.tgz#73f8f1b58329f377654293148c1a6458f54ca224" - integrity sha512-fCqlqLXcBnXa/TJXmT93/A36tJsjdJkibQ1MuIiFyCCYUlpYpIaj2mv1w+3KR6Rzu1IC3slFTje5f6DUp2A2rg== +husky@9.1.4: + version "9.1.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.4.tgz#926fd19c18d345add5eab0a42b2b6d9a80259b34" + integrity sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA== hyperdyperid@^1.2.0: version "1.2.0" From 79ab8c486a0346808cb68f81be5e8bf17c3786fc Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Thu, 18 Jul 2024 20:50:56 -0700 Subject: [PATCH 115/143] docs: More updates to components scenarios guide (#57052) PR Close #57052 --- .../app/dashboard/dashboard.component.spec.ts | 15 ++++------ .../app/hero/hero-detail.component.spec.ts | 1 + .../guide/testing/components-scenarios.md | 28 +++---------------- 3 files changed, 11 insertions(+), 33 deletions(-) diff --git a/adev/src/content/examples/testing/src/app/dashboard/dashboard.component.spec.ts b/adev/src/content/examples/testing/src/app/dashboard/dashboard.component.spec.ts index da4608b34548..47c3f06ffe47 100755 --- a/adev/src/content/examples/testing/src/app/dashboard/dashboard.component.spec.ts +++ b/adev/src/content/examples/testing/src/app/dashboard/dashboard.component.spec.ts @@ -65,7 +65,7 @@ describe('DashboardComponent (shallow)', () => { /** Add TestBed providers, compile, and create DashboardComponent */ function compileAndCreate() { - beforeEach(waitForAsync(() => { + beforeEach(async () => { // #docregion router-harness TestBed.configureTestingModule( Object.assign({}, appConfig, { @@ -77,15 +77,12 @@ function compileAndCreate() { HeroService, ], }), - ) - .compileComponents() - .then(async () => { - harness = await RouterTestingHarness.create(); - comp = await harness.navigateByUrl('/', DashboardComponent); - TestBed.inject(HttpTestingController).expectOne('api/heroes').flush(getTestHeroes()); - }); + ); + harness = await RouterTestingHarness.create(); + comp = await harness.navigateByUrl('/', DashboardComponent); + TestBed.inject(HttpTestingController).expectOne('api/heroes').flush(getTestHeroes()); // #enddocregion router-harness - })); + }); } /** diff --git a/adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts b/adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts index 63ab2f863e76..d41cba411969 100755 --- a/adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts +++ b/adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts @@ -115,6 +115,7 @@ function overrideSetup() { expect(TestBed.inject(Router).url).toEqual('/heroes'); })); } +// #enddocregion override-tests //////////////////// import {getTestHeroes} from '../model/testing/test-hero.service'; diff --git a/adev/src/content/guide/testing/components-scenarios.md b/adev/src/content/guide/testing/components-scenarios.md index c0e3d55693ac..14b3bfb5b6da 100644 --- a/adev/src/content/guide/testing/components-scenarios.md +++ b/adev/src/content/guide/testing/components-scenarios.md @@ -515,21 +515,13 @@ Here's the previous test, rewritten using the click helper. - ## Component inside a test host The previous tests played the role of the host `DashboardComponent` themselves. But does the `DashboardHeroComponent` work correctly when properly data-bound to a host component? -You could test with the actual `DashboardComponent`. -But doing so could require a lot of setup, especially when its template features an `*ngFor` repeater, other components, layout HTML, additional bindings, a constructor that injects multiple services, and it starts interacting with those services right away. - -Imagine the effort to disable these distractions, just to prove a point that can be made satisfactorily with a *test host* like this one: - -This test host binds to `DashboardHeroComponent` as the `DashboardComponent` would but without the noise of the `Router`, the `HeroService`, or the `*ngFor` repeater. - The test host sets the component's `hero` input property with its test hero. It binds the component's `selected` event with its `onSelected` handler, which records the emitted hero in its `selectedHero` property. @@ -541,7 +533,7 @@ The setup for the `test-host` tests is similar to the setup for the stand-alone This testing module configuration shows three important differences: -* It *declares* both the `DashboardHeroComponent` and the `TestHostComponent` +* It *imports* both the `DashboardHeroComponent` and the `TestHostComponent` * It *creates* the `TestHostComponent` instead of the `DashboardHeroComponent` * The `TestHostComponent` sets the `DashboardHeroComponent.hero` with a binding @@ -562,14 +554,7 @@ It confirms that the selected `DashboardHeroComponent` hero really does find its A *routing component* is a component that tells the `Router` to navigate to another component. The `DashboardComponent` is a *routing component* because the user can navigate to the `HeroDetailComponent` by clicking on one of the *hero buttons* on the dashboard. -Routing is pretty complicated. -Testing the `DashboardComponent` seemed daunting in part because it involves the `Router`, which it injects together with the `HeroService`. - - - - - -Angular provides test helpers to reduce boilerplate and more effectively test code which depends on the Router and HttpClient. +Angular provides test helpers to reduce boilerplate and more effectively test code which depends HttpClient. The `provideRouter` function can be used directly in the test module as well. @@ -624,13 +609,13 @@ This test expects the component to try to navigate to the `HeroListComponent`. Component templates often have nested components, whose templates might contain more components. -The component tree can be very deep and, most of the time, the nested components play no role in testing the component at the top of the tree. +The component tree can be very deep and sometimes the nested components play no role in testing the component at the top of the tree. The `AppComponent`, for example, displays a navigation bar with anchors and their `RouterLink` directives. -To validate the links, you don't need the `Router` to navigate and you don't need the `` to mark where the `Router` inserts *routed components*. +To validate the links but not the navigation, you don't need the `Router` to navigate and you don't need the `` to mark where the `Router` inserts *routed components*. The `BannerComponent` and `WelcomeComponent` \(indicated by `` and ``\) are also irrelevant. @@ -640,8 +625,6 @@ If you neglect to declare them, the Angular compiler won't recognize the ` - But there's plenty of template complexity even in this simple form. Date: Fri, 26 Jul 2024 14:43:29 +0200 Subject: [PATCH 116/143] docs: fix formatting and highlighting issues (#57144) PR Close #57144 --- adev/src/content/best-practices/a11y.md | 34 ++++----- .../router/src/app/app.component.1.html | 2 +- .../components/advanced-configuration.md | 2 +- .../guide/components/anatomy-of-components.md | 10 +-- .../guide/components/content-projection.md | 6 +- .../content/guide/components/host-elements.md | 8 +- .../src/content/guide/components/importing.md | 2 +- .../content/guide/components/inheritance.md | 2 +- .../components/programmatic-rendering.md | 9 ++- adev/src/content/guide/components/queries.md | 19 +++-- .../src/content/guide/components/selectors.md | 12 +-- adev/src/content/guide/components/styling.md | 6 +- .../guide/directives/attribute-directives.md | 4 +- adev/src/content/guide/forms/typed-forms.md | 20 ++--- adev/src/content/guide/image-optimization.md | 46 ++++++++---- adev/src/content/guide/pipes/template.md | 6 +- .../guide/routing/common-router-tasks.md | 23 +++--- adev/src/content/guide/signals/model.md | 10 +-- adev/src/content/guide/signals/queries.md | 74 +++++++++---------- .../guide/templates/attribute-binding.md | 2 +- .../content/guide/templates/control-flow.md | 2 +- .../guide/templates/reference-variables.md | 4 +- .../introduction/essentials/components.md | 10 +-- .../essentials/conditionals-and-loops.md | 6 +- .../essentials/handling-user-interaction.md | 9 ++- .../essentials/managing-dynamic-data.md | 4 +- .../essentials/rendering-dynamic-templates.md | 8 +- .../introduction/essentials/sharing-logic.md | 4 +- .../steps/10-deferrable-views/README.md | 8 +- .../steps/11-optimizing-images/README.md | 9 ++- .../steps/12-enable-routing/README.md | 2 +- .../steps/13-define-a-route/README.md | 10 +-- .../steps/14-routerLink/README.md | 2 +- .../steps/16-form-control-values/README.md | 4 +- .../steps/17-reactive-forms/README.md | 4 +- .../learn-angular/steps/22-pipes/README.md | 2 +- .../steps/24-create-a-pipe/README.md | 2 +- .../steps/4-control-flow-if/README.md | 4 +- .../steps/5-control-flow-for/README.md | 4 +- .../steps/6-property-binding/README.md | 4 +- .../steps/7-event-handling/README.md | 4 +- .../learn-angular/steps/8-input/README.md | 4 +- 42 files changed, 216 insertions(+), 191 deletions(-) diff --git a/adev/src/content/best-practices/a11y.md b/adev/src/content/best-practices/a11y.md index 135f988f79b9..2672002a2571 100644 --- a/adev/src/content/best-practices/a11y.md +++ b/adev/src/content/best-practices/a11y.md @@ -128,23 +128,23 @@ The `RouterLinkActive` directive provides the `ariaCurrentWhenActive` input whic The following example shows how to apply the `active-page` class to active links as well as setting their `aria-current` attribute to `"page"` when they are active: ```angular-html - + ``` diff --git a/adev/src/content/examples/router/src/app/app.component.1.html b/adev/src/content/examples/router/src/app/app.component.1.html index 3dd3293f6d60..b3cf92403136 100644 --- a/adev/src/content/examples/router/src/app/app.component.1.html +++ b/adev/src/content/examples/router/src/app/app.component.1.html @@ -4,4 +4,4 @@

Angular Router

Crisis Center Heroes - \ No newline at end of file + diff --git a/adev/src/content/guide/components/advanced-configuration.md b/adev/src/content/guide/components/advanced-configuration.md index 3ded4e4d51d1..55d2644df80b 100644 --- a/adev/src/content/guide/components/advanced-configuration.md +++ b/adev/src/content/guide/components/advanced-configuration.md @@ -34,7 +34,7 @@ By default, Angular throws an error when it encounters an unknown HTML element. disable this behavior for a component by including `CUSTOM_ELEMENTS_SCHEMA` in the `schemas` property in your component metadata. -```ts +```angular-ts import {Component, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core'; @Component({ diff --git a/adev/src/content/guide/components/anatomy-of-components.md b/adev/src/content/guide/components/anatomy-of-components.md index 587cc5067ce7..c26d74939f56 100644 --- a/adev/src/content/guide/components/anatomy-of-components.md +++ b/adev/src/content/guide/components/anatomy-of-components.md @@ -11,7 +11,7 @@ Every component must have: You provide Angular-specific information for a component by adding a `@Component` [decorator](https://www.typescriptlang.org/docs/handbook/decorators.html) on top of the TypeScript class: - + @Component({ selector: 'profile-photo', template: `Your profile photo`, @@ -25,7 +25,7 @@ The object passed to the `@Component` decorator is called the component's **meta Components can optionally include a list of CSS styles that apply to that component's DOM: - + @Component({ selector: 'profile-photo', template: `Your profile photo`, @@ -38,7 +38,7 @@ By default, a component's styles only affect elements defined in that component' You can alternatively choose to write your template and styles in separate files: - + @Component({ selector: 'profile-photo', templateUrl: 'profile-photo.html', @@ -55,7 +55,7 @@ Both `templateUrl` and `styleUrl` are relative to the directory in which the com Every component defines a [CSS selector](https://developer.mozilla.org/docs/Learn/CSS/Building_blocks/Selectors): - + @Component({ selector: 'profile-photo', ... @@ -67,7 +67,7 @@ See [Component Selectors](guide/components/selectors) for details about which ty You use a component by creating a matching HTML element in the template of _other_ components: - + @Component({ selector: 'user-profile', template: ` diff --git a/adev/src/content/guide/components/content-projection.md b/adev/src/content/guide/components/content-projection.md index 914772b06856..22d8caffc42e 100644 --- a/adev/src/content/guide/components/content-projection.md +++ b/adev/src/content/guide/components/content-projection.md @@ -5,7 +5,7 @@ Tip: This guide assumes you've already read the [Essentials Guide](essentials). You often need to create components that act as containers for different types of content. For example, you may want to create a custom card component: -```ts +```angular-ts @Component({ selector: 'custom-card', template: '
', @@ -15,7 +15,7 @@ export class CustomCard {/* ... */} **You can use the `` element as a placeholder to mark where content should go**: -```ts +```angular-ts @Component({ selector: 'custom-card', template: '
', @@ -30,7 +30,7 @@ but with some Angular-specific functionality. When you use a component with ``, any children of the component host element are rendered, or **projected**, at the location of that ``: -```ts +```angular-ts // Component source @Component({ selector: 'custom-card', diff --git a/adev/src/content/guide/components/host-elements.md b/adev/src/content/guide/components/host-elements.md index b6284d3bb935..5bd53bccca8b 100644 --- a/adev/src/content/guide/components/host-elements.md +++ b/adev/src/content/guide/components/host-elements.md @@ -6,7 +6,7 @@ Angular creates an instance of a component for every HTML element that matches t selector. The DOM element that matches a component's selector is that component's **host element**. The contents of a component's template are rendered inside its host element. -```ts +```angular-ts // Component source @Component({ selector: 'profile-photo', @@ -41,7 +41,7 @@ A component can bind properties, attributes, and events to its host element. Thi identically to bindings on elements inside the component's template, but instead defined with the `host` property in the `@Component` decorator: -```ts +```angular-ts @Component({ ..., host: { @@ -68,7 +68,7 @@ decorator to class members. `@HostBinding` lets you bind host properties and attributes to properties and methods: -```ts +```angular-ts @Component({ /* ... */ }) @@ -105,7 +105,7 @@ decorators exist exclusively for backwards compatibility. When you use a component in a template, you can add bindings to that component instance's element. The component may _also_ define host bindings for the same properties or attributes. -```ts +```angular-ts @Component({ ..., host: { diff --git a/adev/src/content/guide/components/importing.md b/adev/src/content/guide/components/importing.md index a3bbf85b1ade..7978df771dbc 100644 --- a/adev/src/content/guide/components/importing.md +++ b/adev/src/content/guide/components/importing.md @@ -10,7 +10,7 @@ A **standalone component** is a component that sets `standalone: true` in its co Standalone components directly import other components, directives, and pipes used in their templates: - + @Component({ standalone: true, selector: 'profile-photo', diff --git a/adev/src/content/guide/components/inheritance.md b/adev/src/content/guide/components/inheritance.md index 3bed268a769b..150c54007a0a 100644 --- a/adev/src/content/guide/components/inheritance.md +++ b/adev/src/content/guide/components/inheritance.md @@ -24,7 +24,7 @@ When a component extends another component or a directive, it inherits all the m the base class's decorator and the base class's decorated members. This includes the selector, template, styles, host bindings, inputs, outputs, lifecycle methods, and any other settings. -```ts +```angular-ts @Component({ selector: 'base-listbox', template: ` diff --git a/adev/src/content/guide/components/programmatic-rendering.md b/adev/src/content/guide/components/programmatic-rendering.md index 36e270bf9525..52eb65267d5f 100644 --- a/adev/src/content/guide/components/programmatic-rendering.md +++ b/adev/src/content/guide/components/programmatic-rendering.md @@ -11,7 +11,7 @@ or in your TypeScript code with `ViewContainerRef`. `NgComponentOutlet` is a structural directive that dynamically renders a given component in a template. -```ts +```angular-ts @Component({ ... }) export class AdminBio { /* ... */ } @@ -46,7 +46,7 @@ You can use the `createComponent`method on `ViewContainerRef` to dynamically cre component. When you create a new component with a `ViewContainerRef`, Angular appends it into the DOM as the next sibling of the component or directive that injected the `ViewContainerRef`. -```ts +```angular-ts @Component({ selector: 'leaf-content', template: ` @@ -99,7 +99,7 @@ You can use both of the approaches described above, `NgComponentOutlet` and `Vie render components that are lazy-loaded with a standard JavaScript [dynamic import](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/import). -```ts +```angular-ts @Component({ ..., template: ` @@ -113,7 +113,8 @@ JavaScript [dynamic import](https://developer.mozilla.org/docs/Web/JavaScript/Re Load advanced settings - ` + + ` }) export class AdminSettings { advancedSettings: {new(): AdminSettings} | undefined; diff --git a/adev/src/content/guide/components/queries.md b/adev/src/content/guide/components/queries.md index 9fd9ceba58cb..bbb27f62311c 100644 --- a/adev/src/content/guide/components/queries.md +++ b/adev/src/content/guide/components/queries.md @@ -12,7 +12,7 @@ There are two categories of query: **view queries** and **content queries.** View queries retrieve results from the elements in the component's _view_ — the elements defined in the component's own template. You can query for a single result with the `@ViewChild` decorator. - + @Component({ selector: 'custom-card-header', ... @@ -42,7 +42,7 @@ If the query does not find a result, its value is `undefined`. This may occur if You can also query for multiple results with the `@ViewChildren` decorator. - + @Component({ selector: 'custom-card-action', ..., @@ -77,7 +77,7 @@ export class CustomCard { Content queries retrieve results from the elements in the component's _content_— the elements nested inside the component in the template where it's used. You can query for a single result with the `@ContentChild` decorator. - + @Component({ selector: 'custom-toggle', ... @@ -106,6 +106,7 @@ export class CustomExpando { ` }) +export class UserProfile { } In this example, the `CustomExpando` component queries for a child `CustomToggle` and accesses the result in `ngAfterContentInit`. @@ -118,7 +119,7 @@ By default, content queries find only _direct_ children of the component and do You can also query for multiple results with the `@ContentChildren` decorator. - + @Component({ selector: 'custom-menu-item', ... @@ -150,6 +151,7 @@ export class CustomMenu { ` }) +export class UserProfile { } `@ContentChildren` creates a `QueryList` object that contains the query results. You can subscribe to changes to the query results over time via the `changes` property. @@ -165,7 +167,7 @@ Most of the time, you want to use a component or directive as your locator. You can alternatively specify a string locator corresponding to a [template reference variable](guide/templates/reference-variables). -```ts +```angular-ts @Component({ ..., template: ` @@ -188,7 +190,7 @@ Tip: See [Dependency Injection](guide/di) for background on providers and Angula For more advanced cases, you can use any `ProviderToken` as a locator. This lets you locate elements based on component and directive providers. -```ts +```angular-ts const SUB_ITEM = new InjectionToken('sub-item'); @Component({ @@ -213,7 +215,7 @@ All query decorators accept an options object as a second parameter. These optio `@ViewChild` and `@ContentChild` queries accept the `static` option. -```ts +```angular-ts @Component({ selector: 'custom-card', template: 'Visit sunny California!', @@ -237,7 +239,7 @@ The `static` option is not available for `@ViewChildren` and `@ContentChildren` By default, content queries find only _direct_ children of the component and do not traverse into descendants. - + @Component({ selector: 'custom-expando', ... @@ -257,6 +259,7 @@ export class CustomExpando { ` }) +export class UserProfile { } In the example above, `CustomExpando` cannot find `` because it is not a direct child of ``. By setting `descendants: true`, you configure the query to traverse all descendants in the same template. Queries, however, _never_ pierce into components to traverse elements in other templates. diff --git a/adev/src/content/guide/components/selectors.md b/adev/src/content/guide/components/selectors.md index 73862ba3a5bf..6bc8c20d417d 100644 --- a/adev/src/content/guide/components/selectors.md +++ b/adev/src/content/guide/components/selectors.md @@ -6,7 +6,7 @@ Every component defines a [CSS selector](https://developer.mozilla.org/docs/Web/CSS/CSS_selectors) that determines how the component is used: - + @Component({ selector: 'profile-photo', ... @@ -16,7 +16,7 @@ export class ProfilePhoto { } You use a component by creating a matching HTML element in the templates of _other_ components: - + @Component({ template: ` @@ -63,7 +63,7 @@ You can append this pseudo-class to any other selector to narrow which elements selector matches. For example, you could define a `[dropzone]` attribute selector and prevent matching `textarea` elements: - + @Component({ selector: '[dropzone]:not(textarea)', ... @@ -78,7 +78,7 @@ Angular does not support any other pseudo-classes or pseudo-elements in componen You can combine multiple selectors by concatenating them. For example, you can match `

Token

{{ provider.token }}