diff --git a/change/@azure-msal-angular-34f593f3-625c-453f-bd2b-4793cf05757f.json b/change/@azure-msal-angular-34f593f3-625c-453f-bd2b-4793cf05757f.json deleted file mode 100644 index e4e55810e3..0000000000 --- a/change/@azure-msal-angular-34f593f3-625c-453f-bd2b-4793cf05757f.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Fix circular dependency", - "packageName": "@azure/msal-angular", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-angular-e155bbbe-72d8-41ce-862f-2787cbf9727d.json b/change/@azure-msal-angular-e155bbbe-72d8-41ce-862f-2787cbf9727d.json new file mode 100644 index 0000000000..13c1707299 --- /dev/null +++ b/change/@azure-msal-angular-e155bbbe-72d8-41ce-862f-2787cbf9727d.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "Merge dev changes to v5 branch #7748", + "packageName": "@azure/msal-angular", + "email": "joarroyo@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@azure-msal-browser-3ef5a999-873c-4c3c-adac-ece031405cc6.json b/change/@azure-msal-browser-3ef5a999-873c-4c3c-adac-ece031405cc6.json deleted file mode 100644 index a33f967ffe..0000000000 --- a/change/@azure-msal-browser-3ef5a999-873c-4c3c-adac-ece031405cc6.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Fix circular type imports", - "packageName": "@azure/msal-browser", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-browser-a202c777-7916-40aa-a0fe-81b7a800d1c7.json b/change/@azure-msal-browser-a202c777-7916-40aa-a0fe-81b7a800d1c7.json new file mode 100644 index 0000000000..ea379c11b0 --- /dev/null +++ b/change/@azure-msal-browser-a202c777-7916-40aa-a0fe-81b7a800d1c7.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "Add support for new platform broker flow via DOM API #7632", + "packageName": "@azure/msal-browser", + "email": "lalimasharda@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@azure-msal-browser-86f9da8f-a58b-4f89-bc6b-d89c970890af.json b/change/@azure-msal-browser-a89035fd-6a43-418a-84a0-1d7477a93437.json similarity index 61% rename from change/@azure-msal-browser-86f9da8f-a58b-4f89-bc6b-d89c970890af.json rename to change/@azure-msal-browser-a89035fd-6a43-418a-84a0-1d7477a93437.json index 31c6ba66e6..ac6de61d4c 100644 --- a/change/@azure-msal-browser-86f9da8f-a58b-4f89-bc6b-d89c970890af.json +++ b/change/@azure-msal-browser-a89035fd-6a43-418a-84a0-1d7477a93437.json @@ -1,6 +1,6 @@ { - "type": "patch", - "comment": "Deprecate cache options #7707", + "type": "none", + "comment": "Merge dev changes to v5 branch #7748", "packageName": "@azure/msal-browser", "email": "joarroyo@microsoft.com", "dependentChangeType": "none" diff --git a/change/@azure-msal-common-589fd386-e7e6-432e-8aee-2bf17430df4c.json b/change/@azure-msal-common-589fd386-e7e6-432e-8aee-2bf17430df4c.json deleted file mode 100644 index 1e0556b2f2..0000000000 --- a/change/@azure-msal-common-589fd386-e7e6-432e-8aee-2bf17430df4c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Fix circular type imports", - "packageName": "@azure/msal-common", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-common-895a7c22-36eb-4f34-9299-55de6ce5e4bc.json b/change/@azure-msal-common-d8993326-cd38-413f-96ce-aaca3c422b26.json similarity index 61% rename from change/@azure-msal-common-895a7c22-36eb-4f34-9299-55de6ce5e4bc.json rename to change/@azure-msal-common-d8993326-cd38-413f-96ce-aaca3c422b26.json index 14667d85a1..b579dbf1b0 100644 --- a/change/@azure-msal-common-895a7c22-36eb-4f34-9299-55de6ce5e4bc.json +++ b/change/@azure-msal-common-d8993326-cd38-413f-96ce-aaca3c422b26.json @@ -1,6 +1,6 @@ { - "type": "patch", - "comment": "Deprecate cache options #7707", + "type": "none", + "comment": "Merge dev changes to v5 branch #7748", "packageName": "@azure/msal-common", "email": "joarroyo@microsoft.com", "dependentChangeType": "none" diff --git a/change/@azure-msal-node-0769ef3b-d9ec-4ad6-8e8c-50130f005b44.json b/change/@azure-msal-node-0769ef3b-d9ec-4ad6-8e8c-50130f005b44.json new file mode 100644 index 0000000000..b264b953b8 --- /dev/null +++ b/change/@azure-msal-node-0769ef3b-d9ec-4ad6-8e8c-50130f005b44.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "Merge dev changes to v5 branch #7748", + "packageName": "@azure/msal-node", + "email": "joarroyo@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@azure-msal-node-50ccabcc-b72f-496a-bc19-28502ee3dbf3.json b/change/@azure-msal-node-50ccabcc-b72f-496a-bc19-28502ee3dbf3.json deleted file mode 100644 index 3c7113c439..0000000000 --- a/change/@azure-msal-node-50ccabcc-b72f-496a-bc19-28502ee3dbf3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Fix circular type imports", - "packageName": "@azure/msal-node", - "email": "thomas.norling@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@azure-msal-node-extensions-729c85ed-4b41-479f-9d01-248965df7581.json b/change/@azure-msal-node-extensions-729c85ed-4b41-479f-9d01-248965df7581.json new file mode 100644 index 0000000000..0163e626be --- /dev/null +++ b/change/@azure-msal-node-extensions-729c85ed-4b41-479f-9d01-248965df7581.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "Merge dev changes to v5 branch #7748", + "packageName": "@azure/msal-node-extensions", + "email": "joarroyo@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@azure-msal-react-ba796a27-f78f-4c79-95a1-5b5650262b5c.json b/change/@azure-msal-react-ba796a27-f78f-4c79-95a1-5b5650262b5c.json new file mode 100644 index 0000000000..ceb783510a --- /dev/null +++ b/change/@azure-msal-react-ba796a27-f78f-4c79-95a1-5b5650262b5c.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "Merge dev changes to v5 branch #7748", + "packageName": "@azure/msal-react", + "email": "joarroyo@microsoft.com", + "dependentChangeType": "none" +} diff --git a/extensions/msal-node-extensions/CHANGELOG.json b/extensions/msal-node-extensions/CHANGELOG.json index b8a09a637c..5e9a628a7d 100644 --- a/extensions/msal-node-extensions/CHANGELOG.json +++ b/extensions/msal-node-extensions/CHANGELOG.json @@ -1,6 +1,80 @@ { "name": "@azure/msal-node-extensions", "entries": [ + { + "date": "Tue, 06 May 2025 22:47:43 GMT", + "version": "1.5.13", + "tag": "@azure/msal-node-extensions_v1.5.13", + "comments": { + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-node-extensions", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "New dev dependency" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump @azure/msal-common to v15.6.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, + { + "date": "Tue, 29 Apr 2025 20:25:48 GMT", + "version": "1.5.12", + "tag": "@azure/msal-node-extensions_v1.5.12", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump @azure/msal-common to v15.5.2", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node-extensions", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, { "date": "Tue, 15 Apr 2025 23:34:14 GMT", "version": "1.5.11", diff --git a/extensions/msal-node-extensions/CHANGELOG.md b/extensions/msal-node-extensions/CHANGELOG.md index db1fc04db1..0b4ad11e84 100644 --- a/extensions/msal-node-extensions/CHANGELOG.md +++ b/extensions/msal-node-extensions/CHANGELOG.md @@ -1,9 +1,31 @@ # Change Log - @azure/msal-node-extensions - + +## 1.5.13 + +Tue, 06 May 2025 22:47:43 GMT + +### Patches + +- Bump @azure/msal-common to v15.6.0 +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 +- Bump rollup-msal to v0.0.0 + +## 1.5.12 + +Tue, 29 Apr 2025 20:25:48 GMT + +### Patches + +- Bump @azure/msal-common to v15.5.2 +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 +- Bump rollup-msal to v0.0.0 + ## 1.5.11 Tue, 15 Apr 2025 23:34:14 GMT diff --git a/extensions/msal-node-extensions/package.json b/extensions/msal-node-extensions/package.json index b071ca95a7..4af6f93539 100644 --- a/extensions/msal-node-extensions/package.json +++ b/extensions/msal-node-extensions/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-node-extensions", - "version": "1.5.11", + "version": "1.5.13", "repository": { "type": "git", "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git" @@ -64,7 +64,7 @@ ] }, "dependencies": { - "@azure/msal-common": "15.5.1", + "@azure/msal-common": "15.6.0", "@azure/msal-node-runtime": "^0.18.1", "keytar": "^7.8.0" }, @@ -75,6 +75,7 @@ "@types/node": "^20.3.1", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", + "jest-junit": "^16.0.0", "msal-test-utils": "file:../../shared-test-utils", "node-addon-api": "^6.1.0", "rollup": "^4.22.4", diff --git a/extensions/msal-node-extensions/src/packageMetadata.ts b/extensions/msal-node-extensions/src/packageMetadata.ts index f70765b814..96c12a6877 100644 --- a/extensions/msal-node-extensions/src/packageMetadata.ts +++ b/extensions/msal-node-extensions/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-node-extensions"; -export const version = "1.5.11"; +export const version = "1.5.13"; diff --git a/lib/msal-angular/CHANGELOG.json b/lib/msal-angular/CHANGELOG.json index db5a9c3425..10ebdf4c18 100644 --- a/lib/msal-angular/CHANGELOG.json +++ b/lib/msal-angular/CHANGELOG.json @@ -1,6 +1,54 @@ { "name": "@azure/msal-angular", "entries": [ + { + "date": "Tue, 06 May 2025 22:47:43 GMT", + "version": "4.0.12", + "tag": "@azure/msal-angular_v4.0.12", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@azure/msal-angular", + "comment": "Bump @azure/msal-browser to v4.12.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-angular", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, + { + "date": "Tue, 29 Apr 2025 20:25:48 GMT", + "version": "4.0.11", + "tag": "@azure/msal-angular_v4.0.11", + "comments": { + "patch": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-angular", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Fix circular dependency" + }, + { + "author": "beachball", + "package": "@azure/msal-angular", + "comment": "Bump @azure/msal-browser to v4.11.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-angular", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, { "date": "Tue, 15 Apr 2025 23:34:14 GMT", "version": "4.0.10", diff --git a/lib/msal-angular/CHANGELOG.md b/lib/msal-angular/CHANGELOG.md index f7438ac6e9..1eed73c98c 100644 --- a/lib/msal-angular/CHANGELOG.md +++ b/lib/msal-angular/CHANGELOG.md @@ -1,9 +1,28 @@ # Change Log - @azure/msal-angular - + +## 4.0.12 + +Tue, 06 May 2025 22:47:43 GMT + +### Patches + +- Bump @azure/msal-browser to v4.12.0 +- Bump eslint-config-msal to v0.0.0 + +## 4.0.11 + +Tue, 29 Apr 2025 20:25:48 GMT + +### Patches + +- Fix circular dependency (thomas.norling@microsoft.com) +- Bump @azure/msal-browser to v4.11.1 +- Bump eslint-config-msal to v0.0.0 + ## 4.0.10 Tue, 15 Apr 2025 23:34:14 GMT diff --git a/lib/msal-angular/package.json b/lib/msal-angular/package.json index d80cafc8ac..b23c0b2d17 100644 --- a/lib/msal-angular/package.json +++ b/lib/msal-angular/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-angular", - "version": "4.0.10", + "version": "4.0.12", "author": { "name": "Microsoft", "email": "nugetaad@microsoft.com", @@ -48,7 +48,7 @@ "@angular/platform-browser": "^19.2.2", "@angular/platform-browser-dynamic": "^19.2.2", "@angular/router": "^19.2.2", - "@azure/msal-browser": "^4.10.0", + "@azure/msal-browser": "^4.12.0", "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", @@ -69,7 +69,7 @@ "zone.js": "~0.15.0" }, "peerDependencies": { - "@azure/msal-browser": "^4.11.0", + "@azure/msal-browser": "^4.12.0", "rxjs": "^7.0.0" } } \ No newline at end of file diff --git a/lib/msal-angular/src/packageMetadata.ts b/lib/msal-angular/src/packageMetadata.ts index cc758b0916..93a10aadd3 100644 --- a/lib/msal-angular/src/packageMetadata.ts +++ b/lib/msal-angular/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-angular"; -export const version = "4.0.10"; +export const version = "4.0.12"; diff --git a/lib/msal-browser/CHANGELOG.json b/lib/msal-browser/CHANGELOG.json index 3a1377d911..f48f860389 100644 --- a/lib/msal-browser/CHANGELOG.json +++ b/lib/msal-browser/CHANGELOG.json @@ -1,6 +1,118 @@ { "name": "@azure/msal-browser", "entries": [ + { + "date": "Tue, 06 May 2025 22:47:42 GMT", + "version": "4.12.0", + "tag": "@azure/msal-browser_v4.12.0", + "comments": { + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-browser", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "New dev dependency" + } + ], + "patch": [ + { + "author": "kshabelko@microsoft.com", + "package": "@azure/msal-browser", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "Gracefully handle old interaction format #7731" + } + ], + "minor": [ + { + "author": "shylasummers@microsoft.com", + "package": "@azure/msal-browser", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "Multi-instance detection" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump @azure/msal-common to v15.6.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, + { + "date": "Tue, 29 Apr 2025 20:25:47 GMT", + "version": "4.11.1", + "tag": "@azure/msal-browser_v4.11.1", + "comments": { + "patch": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-browser", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Fix throw when attempting to getAccount before initialization #7720" + }, + { + "author": "sameera.gajjarapu@microsoft.com", + "package": "@azure/msal-browser", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Add error messaging and change type for get/post failures #7721" + }, + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-browser", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Fix circular type imports" + }, + { + "author": "joarroyo@microsoft.com", + "package": "@azure/msal-browser", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Deprecate cache options #7707" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump @azure/msal-common to v15.5.2", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-browser", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, { "date": "Tue, 15 Apr 2025 23:34:14 GMT", "version": "4.11.0", diff --git a/lib/msal-browser/CHANGELOG.md b/lib/msal-browser/CHANGELOG.md index 669b225fd7..6c07e0fd52 100644 --- a/lib/msal-browser/CHANGELOG.md +++ b/lib/msal-browser/CHANGELOG.md @@ -1,9 +1,40 @@ # Change Log - @azure/msal-browser - + +## 4.12.0 + +Tue, 06 May 2025 22:47:42 GMT + +### Minor changes + +- Multi-instance detection (shylasummers@microsoft.com) +- Bump @azure/msal-common to v15.6.0 +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 +- Bump rollup-msal to v0.0.0 + +### Patches + +- Gracefully handle old interaction format #7731 (kshabelko@microsoft.com) + +## 4.11.1 + +Tue, 29 Apr 2025 20:25:47 GMT + +### Patches + +- Fix throw when attempting to getAccount before initialization #7720 (thomas.norling@microsoft.com) +- Add error messaging and change type for get/post failures #7721 (sameera.gajjarapu@microsoft.com) +- Fix circular type imports (thomas.norling@microsoft.com) +- Deprecate cache options #7707 (joarroyo@microsoft.com) +- Bump @azure/msal-common to v15.5.2 +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 +- Bump rollup-msal to v0.0.0 + ## 4.11.0 Tue, 15 Apr 2025 23:34:14 GMT diff --git a/lib/msal-browser/apiReview/msal-browser.api.md b/lib/msal-browser/apiReview/msal-browser.api.md index 355eecb7d8..e183c9577c 100644 --- a/lib/msal-browser/apiReview/msal-browser.api.md +++ b/lib/msal-browser/apiReview/msal-browser.api.md @@ -711,7 +711,7 @@ export interface IController { // (undocumented) hydrateCache(result: AuthenticationResult, request: SilentRequest | SsoSilentRequest | RedirectRequest | PopupRequest): Promise; // (undocumented) - initialize(request?: InitializeApplicationRequest): Promise; + initialize(request?: InitializeApplicationRequest, isBroker?: boolean): Promise; // (undocumented) initializeWrapperLibrary(sku: WrapperSKU, version: string): void; // @internal (undocumented) @@ -897,6 +897,13 @@ function isInIframe(): boolean; // @public function isInPopup(): boolean; +// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen +// Warning: (ae-missing-release-tag) "isPlatformBrokerAvailable" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export function isPlatformBrokerAvailable(loggerOptions?: LoggerOptions, perfClient?: IPerformanceClient, correlationId?: string): Promise; + // Warning: (ae-missing-release-tag) "ITokenCache" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1205,6 +1212,8 @@ export class PublicClientApplication implements IPublicClientApplication { // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen initializeWrapperLibrary(sku: WrapperSKU, version: string): void; + // (undocumented) + protected isBroker: boolean; // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen loginPopup(request?: PopupRequest | undefined): Promise; // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen @@ -1461,7 +1470,7 @@ const userCancelled = "user_cancelled"; // Warning: (ae-missing-release-tag) "version" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const version = "4.11.0"; +export const version = "4.12.0"; // Warning: (ae-missing-release-tag) "WrapperSKU" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // Warning: (ae-missing-release-tag) "WrapperSKU" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -1491,7 +1500,7 @@ export type WrapperSKU = (typeof WrapperSKU)[keyof typeof WrapperSKU]; // src/cache/LocalStorage.ts:296:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/cache/LocalStorage.ts:354:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/cache/LocalStorage.ts:385:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen -// src/config/Configuration.ts:256:5 - (ae-forgotten-export) The symbol "InternalAuthOptions" needs to be exported by the entry point index.d.ts +// src/config/Configuration.ts:231:5 - (ae-forgotten-export) The symbol "InternalAuthOptions" needs to be exported by the entry point index.d.ts // src/event/EventHandler.ts:113:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/event/EventHandler.ts:139:8 - (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // src/index.ts:8:12 - (tsdoc-characters-after-block-tag) The token "@azure" looks like a TSDoc tag but contains an invalid character "/"; if it is not a tag, use a backslash to escape the "@" diff --git a/lib/msal-browser/docs/logout.md b/lib/msal-browser/docs/logout.md index 4fcfb506b5..4583a88741 100644 --- a/lib/msal-browser/docs/logout.md +++ b/lib/msal-browser/docs/logout.md @@ -119,7 +119,7 @@ await msalInstance.logoutRedirect({ account: currentAccount}); ### Option 2: Manually set the logoutHint option in the logout request -Alternatively, if you prefer to manually set the `logoutHint`, you can extract the `login_hint` claim in your app and set it as the `logoutHint` in the logout request: +Alternatively, if you prefer to manually set the `logoutHint`, you can extract the `login_hint` claim in your app and set it as the `logoutHint` in the logout request: ```javascript const currentAccount = msalInstance.getAccountByHomeId(homeAccountId); @@ -185,7 +185,7 @@ Events will be emitted when logout succeeds or fails and when the popup is opene ## Important Notes -- If no account is passed to the logout API, or no EndSessionRequest object, it will log out of all accounts. +- If no account is passed to the logout API, or no EndSessionRequest object, all accounts will be removed from the cache and the server will prompt the user to select the account they wish to sign out of. - If an account is passed to the logout API, MSAL will only clear tokens related to that account. - Server signout is a convenience feature and, as such, is done with best effort. Logout APIs will resolve successfully as long as the local application cache has been successfully cleared, regardless of whether or not server signout is successful. diff --git a/lib/msal-browser/package.json b/lib/msal-browser/package.json index be8330fff9..7d44b9db91 100644 --- a/lib/msal-browser/package.json +++ b/lib/msal-browser/package.json @@ -10,7 +10,7 @@ "type": "git", "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git" }, - "version": "4.11.0", + "version": "4.12.0", "description": "Microsoft Authentication Library for js", "keywords": [ "implicit", @@ -88,6 +88,7 @@ "fake-indexeddb": "^3.1.3", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", + "jest-junit": "^16.0.0", "msal-test-utils": "file:../../shared-test-utils", "prettier": "^2.8.7", "rimraf": "^3.0.0", @@ -101,6 +102,6 @@ "typescript": "^4.9.5" }, "dependencies": { - "@azure/msal-common": "15.5.1" + "@azure/msal-common": "15.6.0" } } \ No newline at end of file diff --git a/lib/msal-browser/src/app/PublicClientApplication.ts b/lib/msal-browser/src/app/PublicClientApplication.ts index 4eaba01099..65155b2ac7 100644 --- a/lib/msal-browser/src/app/PublicClientApplication.ts +++ b/lib/msal-browser/src/app/PublicClientApplication.ts @@ -42,6 +42,7 @@ import { EventType } from "../event/EventType.js"; */ export class PublicClientApplication implements IPublicClientApplication { protected controller: IController; + protected isBroker: boolean = false; /** * Creates StandardController and passes it to the PublicClientApplication @@ -92,7 +93,7 @@ export class PublicClientApplication implements IPublicClientApplication { * @param request {?InitializeApplicationRequest} */ async initialize(request?: InitializeApplicationRequest): Promise { - return this.controller.initialize(request); + return this.controller.initialize(request, this.isBroker); } /** diff --git a/lib/msal-browser/src/broker/nativeBroker/IPlatformAuthHandler.ts b/lib/msal-browser/src/broker/nativeBroker/IPlatformAuthHandler.ts new file mode 100644 index 0000000000..91d25aefdf --- /dev/null +++ b/lib/msal-browser/src/broker/nativeBroker/IPlatformAuthHandler.ts @@ -0,0 +1,19 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { PlatformBrokerRequest } from "./PlatformBrokerRequest.js"; +import { PlatformBrokerResponse } from "./PlatformBrokerResponse.js"; + +/** + * Interface for the Platform Broker Handlers + */ +export interface IPlatformAuthHandler { + getExtensionId(): string | undefined; + getExtensionVersion(): string | undefined; + getExtensionName(): string | undefined; + sendMessage( + request: PlatformBrokerRequest + ): Promise; +} diff --git a/lib/msal-browser/src/broker/nativeBroker/PlatformAuthDOMHandler.ts b/lib/msal-browser/src/broker/nativeBroker/PlatformAuthDOMHandler.ts new file mode 100644 index 0000000000..85aea2070d --- /dev/null +++ b/lib/msal-browser/src/broker/nativeBroker/PlatformAuthDOMHandler.ts @@ -0,0 +1,241 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + Logger, + createAuthError, + AuthErrorCodes, + IPerformanceClient, + StringDict, +} from "@azure/msal-common/browser"; +import { + PlatformBrokerRequest, + PlatformDOMTokenRequest, +} from "./PlatformBrokerRequest.js"; +import { PlatformAuthConstants } from "../../utils/BrowserConstants.js"; +import { + PlatformBrokerResponse, + PlatformDOMTokenResponse, +} from "./PlatformBrokerResponse.js"; +import { createNativeAuthError } from "../../error/NativeAuthError.js"; +import { IPlatformAuthHandler } from "./IPlatformAuthHandler.js"; + +export class PlatformAuthDOMHandler implements IPlatformAuthHandler { + protected logger: Logger; + protected performanceClient: IPerformanceClient; + protected correlationId: string; + platformAuthType: string; + + constructor( + logger: Logger, + performanceClient: IPerformanceClient, + correlationId: string + ) { + this.logger = logger; + this.performanceClient = performanceClient; + this.correlationId = correlationId; + this.platformAuthType = PlatformAuthConstants.PLATFORM_DOM_PROVIDER; + } + + static async createProvider( + logger: Logger, + performanceClient: IPerformanceClient, + correlationId: string + ): Promise { + logger.trace("PlatformAuthDOMHandler: createProvider called"); + + // @ts-ignore + if (window.navigator?.platformAuthentication) { + const supportedContracts = + // @ts-ignore + await window.navigator.platformAuthentication.getSupportedContracts( + PlatformAuthConstants.MICROSOFT_ENTRA_BROKERID + ); + if ( + supportedContracts?.includes( + PlatformAuthConstants.PLATFORM_DOM_APIS + ) + ) { + logger.trace("Platform auth api available in DOM"); + return new PlatformAuthDOMHandler( + logger, + performanceClient, + correlationId + ); + } + } + return undefined; + } + + /** + * Returns the Id for the broker extension this handler is communicating with + * @returns + */ + getExtensionId(): string { + return PlatformAuthConstants.MICROSOFT_ENTRA_BROKERID; + } + + getExtensionVersion(): string | undefined { + return ""; + } + + getExtensionName(): string | undefined { + return PlatformAuthConstants.DOM_API_NAME; + } + + /** + * Send token request to platform broker via browser DOM API + * @param request + * @returns + */ + async sendMessage( + request: PlatformBrokerRequest + ): Promise { + this.logger.trace( + this.platformAuthType + " - Sending request to browser DOM API" + ); + + try { + const platformDOMRequest: PlatformDOMTokenRequest = + this.initializePlatformDOMRequest(request); + const response: object = + // @ts-ignore + await window.navigator.platformAuthentication.executeGetToken( + platformDOMRequest + ); + return this.validatePlatformBrokerResponse(response); + } catch (e) { + this.logger.error( + this.platformAuthType + " - executeGetToken DOM API error" + ); + throw e; + } + } + + private initializePlatformDOMRequest( + request: PlatformBrokerRequest + ): PlatformDOMTokenRequest { + this.logger.trace( + this.platformAuthType + " - initializeNativeDOMRequest called" + ); + + const { + accountId, + clientId, + authority, + scope, + redirectUri, + correlationId, + state, + storeInCache, + embeddedClientId, + extraParameters, + ...remainingProperties + } = request; + + const validExtraParameters = + this.stringifyExtraParameters(remainingProperties); + + const platformDOMRequest: PlatformDOMTokenRequest = { + accountId: accountId, + brokerId: this.getExtensionId(), + authority: authority, + clientId: clientId, + correlationId: correlationId || this.correlationId, + extraParameters: { ...extraParameters, ...validExtraParameters }, + isSecurityTokenService: false, + redirectUri: redirectUri, + scope: scope, + state: state, + storeInCache: storeInCache, + embeddedClientId: embeddedClientId, + }; + + return platformDOMRequest; + } + + private validatePlatformBrokerResponse( + response: object + ): PlatformBrokerResponse { + if (response.hasOwnProperty("isSuccess")) { + if ( + response.hasOwnProperty("accessToken") && + response.hasOwnProperty("idToken") && + response.hasOwnProperty("clientInfo") && + response.hasOwnProperty("account") && + response.hasOwnProperty("scopes") && + response.hasOwnProperty("expiresIn") + ) { + this.logger.trace( + this.platformAuthType + + " - platform broker returned successful and valid response" + ); + return this.convertToPlatformBrokerResponse( + response as PlatformDOMTokenResponse + ); + } else if (response.hasOwnProperty("error")) { + const errorResponse = response as PlatformDOMTokenResponse; + if ( + errorResponse.isSuccess === false && + errorResponse.error && + errorResponse.error.code + ) { + this.logger.trace( + this.platformAuthType + + " - platform broker returned error response" + ); + throw createNativeAuthError( + errorResponse.error.code, + errorResponse.error.description, + { + error: parseInt(errorResponse.error.errorCode), + protocol_error: errorResponse.error.protocolError, + status: errorResponse.error.status, + properties: errorResponse.error.properties, + } + ); + } + } + } + throw createAuthError( + AuthErrorCodes.unexpectedError, + "Response missing expected properties." + ); + } + + private convertToPlatformBrokerResponse( + response: PlatformDOMTokenResponse + ): PlatformBrokerResponse { + this.logger.trace( + this.platformAuthType + " - convertToNativeResponse called" + ); + const nativeResponse: PlatformBrokerResponse = { + access_token: response.accessToken, + id_token: response.idToken, + client_info: response.clientInfo, + account: response.account, + expires_in: response.expiresIn, + scope: response.scopes, + state: response.state || "", + properties: response.properties || {}, + extendedLifetimeToken: response.extendedLifetimeToken ?? false, + shr: response.proofOfPossessionPayload, + }; + + return nativeResponse; + } + + private stringifyExtraParameters( + extraParameters: Record + ): StringDict { + return Object.entries(extraParameters).reduce( + (record, [key, value]) => { + record[key] = String(value); + return record; + }, + {} as StringDict + ); + } +} diff --git a/lib/msal-browser/src/broker/nativeBroker/NativeMessageHandler.ts b/lib/msal-browser/src/broker/nativeBroker/PlatformAuthExtensionHandler.ts similarity index 75% rename from lib/msal-browser/src/broker/nativeBroker/NativeMessageHandler.ts rename to lib/msal-browser/src/broker/nativeBroker/PlatformAuthExtensionHandler.ts index 3314601734..411b34512a 100644 --- a/lib/msal-browser/src/broker/nativeBroker/NativeMessageHandler.ts +++ b/lib/msal-browser/src/broker/nativeBroker/PlatformAuthExtensionHandler.ts @@ -4,7 +4,7 @@ */ import { - NativeConstants, + PlatformAuthConstants, NativeExtensionMethod, } from "../../utils/BrowserConstants.js"; import { @@ -12,7 +12,6 @@ import { AuthError, createAuthError, AuthErrorCodes, - AuthenticationScheme, InProgressPerformanceEvent, PerformanceEvents, IPerformanceClient, @@ -20,14 +19,16 @@ import { import { NativeExtensionRequest, NativeExtensionRequestBody, -} from "./NativeRequest.js"; + PlatformBrokerRequest, +} from "./PlatformBrokerRequest.js"; import { createNativeAuthError } from "../../error/NativeAuthError.js"; import { createBrowserAuthError, BrowserAuthErrorCodes, } from "../../error/BrowserAuthError.js"; -import { BrowserConfiguration } from "../../config/Configuration.js"; import { createNewGuid } from "../../crypto/BrowserCrypto.js"; +import { PlatformBrokerResponse } from "./PlatformBrokerResponse.js"; +import { IPlatformAuthHandler } from "./IPlatformAuthHandler.js"; type ResponseResolvers = { resolve: (value: T | PromiseLike) => void; @@ -36,7 +37,7 @@ type ResponseResolvers = { ) => void; }; -export class NativeMessageHandler { +export class PlatformAuthExtensionHandler implements IPlatformAuthHandler { private extensionId: string | undefined; private extensionVersion: string | undefined; private logger: Logger; @@ -48,6 +49,7 @@ export class NativeMessageHandler { private readonly windowListener: (event: MessageEvent) => void; private readonly performanceClient: IPerformanceClient; private readonly handshakeEvent: InProgressPerformanceEvent; + platformAuthType: string; constructor( logger: Logger, @@ -66,34 +68,51 @@ export class NativeMessageHandler { this.handshakeEvent = performanceClient.startMeasurement( PerformanceEvents.NativeMessageHandlerHandshake ); + this.platformAuthType = + PlatformAuthConstants.PLATFORM_EXTENSION_PROVIDER; } /** * Sends a given message to the extension and resolves with the extension response - * @param body + * @param request */ - async sendMessage(body: NativeExtensionRequestBody): Promise { - this.logger.trace("NativeMessageHandler - sendMessage called."); + async sendMessage( + request: PlatformBrokerRequest + ): Promise { + this.logger.trace(this.platformAuthType + " - sendMessage called."); + + // fall back to native calls + const messageBody: NativeExtensionRequestBody = { + method: NativeExtensionMethod.GetToken, + request: request, + }; + const req: NativeExtensionRequest = { - channel: NativeConstants.CHANNEL_ID, + channel: PlatformAuthConstants.CHANNEL_ID, extensionId: this.extensionId, responseId: createNewGuid(), - body: body, + body: messageBody, }; this.logger.trace( - "NativeMessageHandler - Sending request to browser extension" + this.platformAuthType + " - Sending request to browser extension" ); this.logger.tracePii( - `NativeMessageHandler - Sending request to browser extension: ${JSON.stringify( - req - )}` + this.platformAuthType + + ` - Sending request to browser extension: ${JSON.stringify( + req + )}` ); this.messageChannel.port1.postMessage(req); - return new Promise((resolve, reject) => { + const response: object = await new Promise((resolve, reject) => { this.resolvers.set(req.responseId, { resolve, reject }); }); + + const validatedResponse: PlatformBrokerResponse = + this.validatePlatformBrokerResponse(response); + + return validatedResponse; } /** @@ -107,20 +126,21 @@ export class NativeMessageHandler { logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient - ): Promise { - logger.trace("NativeMessageHandler - createProvider called."); + ): Promise { + logger.trace("PlatformAuthExtensionHandler - createProvider called."); + try { - const preferredProvider = new NativeMessageHandler( + const preferredProvider = new PlatformAuthExtensionHandler( logger, handshakeTimeoutMs, performanceClient, - NativeConstants.PREFERRED_EXTENSION_ID + PlatformAuthConstants.PREFERRED_EXTENSION_ID ); await preferredProvider.sendHandshakeRequest(); return preferredProvider; } catch (e) { // If preferred extension fails for whatever reason, fallback to using any installed extension - const backupProvider = new NativeMessageHandler( + const backupProvider = new PlatformAuthExtensionHandler( logger, handshakeTimeoutMs, performanceClient @@ -135,13 +155,13 @@ export class NativeMessageHandler { */ private async sendHandshakeRequest(): Promise { this.logger.trace( - "NativeMessageHandler - sendHandshakeRequest called." + this.platformAuthType + " - sendHandshakeRequest called." ); // Register this event listener before sending handshake window.addEventListener("message", this.windowListener, false); // false is important, because content script message processing should work first const req: NativeExtensionRequest = { - channel: NativeConstants.CHANNEL_ID, + channel: PlatformAuthConstants.CHANNEL_ID, extensionId: this.extensionId, responseId: createNewGuid(), body: { @@ -192,7 +212,7 @@ export class NativeMessageHandler { * @param event */ private onWindowMessage(event: MessageEvent): void { - this.logger.trace("NativeMessageHandler - onWindowMessage called"); + this.logger.trace(this.platformAuthType + " - onWindowMessage called"); // We only accept messages from ourselves if (event.source !== window) { return; @@ -202,7 +222,7 @@ export class NativeMessageHandler { if ( !request.channel || - request.channel !== NativeConstants.CHANNEL_ID + request.channel !== PlatformAuthConstants.CHANNEL_ID ) { return; } @@ -221,7 +241,8 @@ export class NativeMessageHandler { */ if (!handshakeResolver) { this.logger.trace( - `NativeMessageHandler.onWindowMessage - resolver can't be found for request ${request.responseId}` + this.platformAuthType + + `.onWindowMessage - resolver can't be found for request ${request.responseId}` ); return; } @@ -253,7 +274,9 @@ export class NativeMessageHandler { * @param event */ private onChannelMessage(event: MessageEvent): void { - this.logger.trace("NativeMessageHandler - onChannelMessage called."); + this.logger.trace( + this.platformAuthType + " - onChannelMessage called." + ); const request = event.data; const resolver = this.resolvers.get(request.responseId); @@ -270,12 +293,14 @@ export class NativeMessageHandler { } const response = request.body.response; this.logger.trace( - "NativeMessageHandler - Received response from browser extension" + this.platformAuthType + + " - Received response from browser extension" ); this.logger.tracePii( - `NativeMessageHandler - Received response from browser extension: ${JSON.stringify( - response - )}` + this.platformAuthType + + ` - Received response from browser extension: ${JSON.stringify( + response + )}` ); if (response.status !== "Success") { resolver.reject( @@ -310,7 +335,8 @@ export class NativeMessageHandler { } else if (method === NativeExtensionMethod.HandshakeResponse) { if (!handshakeResolver) { this.logger.trace( - `NativeMessageHandler.onChannelMessage - resolver can't be found for request ${request.responseId}` + this.platformAuthType + + `.onChannelMessage - resolver can't be found for request ${request.responseId}` ); return; } @@ -323,7 +349,8 @@ export class NativeMessageHandler { this.extensionId = request.extensionId; this.extensionVersion = request.body.version; this.logger.verbose( - `NativeMessageHandler - Received HandshakeResponse from extension: ${this.extensionId}` + this.platformAuthType + + ` - Received HandshakeResponse from extension: ${this.extensionId}` ); this.handshakeEvent.end({ extensionInstalled: true, @@ -349,6 +376,30 @@ export class NativeMessageHandler { } } + /** + * Validates native platform response before processing + * @param response + */ + private validatePlatformBrokerResponse( + response: object + ): PlatformBrokerResponse { + if ( + response.hasOwnProperty("access_token") && + response.hasOwnProperty("id_token") && + response.hasOwnProperty("client_info") && + response.hasOwnProperty("account") && + response.hasOwnProperty("scope") && + response.hasOwnProperty("expires_in") + ) { + return response as PlatformBrokerResponse; + } else { + throw createAuthError( + AuthErrorCodes.unexpectedError, + "Response missing expected properties." + ); + } + } + /** * Returns the Id for the browser extension this handler is communicating with * @returns @@ -365,52 +416,12 @@ export class NativeMessageHandler { return this.extensionVersion; } - /** - * Returns boolean indicating whether or not the request should attempt to use native broker - * @param logger - * @param config - * @param nativeExtensionProvider - * @param authenticationScheme - */ - static isPlatformBrokerAvailable( - config: BrowserConfiguration, - logger: Logger, - nativeExtensionProvider?: NativeMessageHandler, - authenticationScheme?: AuthenticationScheme - ): boolean { - logger.trace("isPlatformBrokerAvailable called"); - if (!config.system.allowPlatformBroker) { - logger.trace( - "isPlatformBrokerAvailable: allowPlatformBroker is not enabled, returning false" - ); - // Developer disabled WAM - return false; - } - - if (!nativeExtensionProvider) { - logger.trace( - "isPlatformBrokerAvailable: Platform extension provider is not initialized, returning false" - ); - // Extension is not available - return false; - } - - if (authenticationScheme) { - switch (authenticationScheme) { - case AuthenticationScheme.BEARER: - case AuthenticationScheme.POP: - logger.trace( - "isPlatformBrokerAvailable: authenticationScheme is supported, returning true" - ); - return true; - default: - logger.trace( - "isPlatformBrokerAvailable: authenticationScheme is not supported, returning false" - ); - return false; - } - } - - return true; + getExtensionName(): string | undefined { + return this.getExtensionId() === + PlatformAuthConstants.PREFERRED_EXTENSION_ID + ? "chrome" + : this.getExtensionId()?.length + ? "unknown" + : undefined; } } diff --git a/lib/msal-browser/src/broker/nativeBroker/PlatformAuthProvider.ts b/lib/msal-browser/src/broker/nativeBroker/PlatformAuthProvider.ts new file mode 100644 index 0000000000..d5b054ee22 --- /dev/null +++ b/lib/msal-browser/src/broker/nativeBroker/PlatformAuthProvider.ts @@ -0,0 +1,164 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { + LoggerOptions, + IPerformanceClient, + Logger, + AuthenticationScheme, + StubPerformanceClient, +} from "@azure/msal-common/browser"; +import { name, version } from "../../packageMetadata.js"; +import { + BrowserConfiguration, + DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS, +} from "../../config/Configuration.js"; +import { PlatformAuthExtensionHandler } from "./PlatformAuthExtensionHandler.js"; +import { IPlatformAuthHandler } from "./IPlatformAuthHandler.js"; +import { PlatformAuthDOMHandler } from "./PlatformAuthDOMHandler.js"; +import { createNewGuid } from "../../crypto/BrowserCrypto.js"; +import { + BrowserCacheLocation, + PLATFORM_AUTH_DOM_SUPPORT, +} from "../../utils/BrowserConstants.js"; + +/** + * Checks if the platform broker is available in the current environment. + * @param loggerOptions + * @param perfClient + * @returns + */ +export async function isPlatformBrokerAvailable( + loggerOptions?: LoggerOptions, + perfClient?: IPerformanceClient, + correlationId?: string +): Promise { + const logger = new Logger(loggerOptions || {}, name, version); + + logger.trace("isPlatformBrokerAvailable called"); + + const performanceClient = perfClient || new StubPerformanceClient(); + + if (typeof window === "undefined") { + logger.trace("Non-browser environment detected, returning false"); + return false; + } + + return !!(await getPlatformAuthProvider( + logger, + performanceClient, + correlationId || createNewGuid() + )); +} + +export async function getPlatformAuthProvider( + logger: Logger, + performanceClient: IPerformanceClient, + correlationId: string, + nativeBrokerHandshakeTimeout?: number +): Promise { + logger.trace("getPlatformAuthProvider called", correlationId); + + const enablePlatformBrokerDOMSupport = isDomEnabledForPlatformAuth(); + + logger.trace( + "Has client allowed platform auth via DOM API: " + + enablePlatformBrokerDOMSupport + ); + let platformAuthProvider: IPlatformAuthHandler | undefined; + try { + if (enablePlatformBrokerDOMSupport) { + // Check if DOM platform API is supported first + platformAuthProvider = await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + correlationId + ); + } + if (!platformAuthProvider) { + logger.trace( + "Platform auth via DOM API not available, checking for extension" + ); + /* + * If DOM APIs are not available, check if browser extension is available. + * Platform authentication via DOM APIs is preferred over extension APIs. + */ + platformAuthProvider = + await PlatformAuthExtensionHandler.createProvider( + logger, + nativeBrokerHandshakeTimeout || + DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS, + performanceClient + ); + } + } catch (e) { + logger.trace("Platform auth not available", e as string); + } + return platformAuthProvider; +} + +/** + * Returns true if the DOM API support for platform auth is enabled in session storage + * @returns boolean + * @deprecated + */ +export function isDomEnabledForPlatformAuth(): boolean { + let sessionStorage: Storage | undefined; + try { + sessionStorage = window[BrowserCacheLocation.SessionStorage]; + // Mute errors if it's a non-browser environment or cookies are blocked. + return sessionStorage?.getItem(PLATFORM_AUTH_DOM_SUPPORT) === "true"; + } catch (e) { + return false; + } +} + +/** + * Returns boolean indicating whether or not the request should attempt to use native broker + * @param logger + * @param config + * @param platformAuthProvider + * @param authenticationScheme + */ +export function isBrokerAvailable( + config: BrowserConfiguration, + logger: Logger, + platformAuthProvider?: IPlatformAuthHandler, + authenticationScheme?: AuthenticationScheme +): boolean { + logger.trace("isBrokerAvailable called"); + if (!config.system.allowPlatformBroker) { + logger.trace( + "isBrokerAvailable: allowPlatformBroker is not enabled, returning false" + ); + // Developer disabled WAM + return false; + } + + if (!platformAuthProvider) { + logger.trace( + "isBrokerAvailable: Platform auth provider is not initialized, returning false" + ); + // Platform broker auth providers are not available + return false; + } + + if (authenticationScheme) { + switch (authenticationScheme) { + case AuthenticationScheme.BEARER: + case AuthenticationScheme.POP: + logger.trace( + "isBrokerAvailable: authenticationScheme is supported, returning true" + ); + return true; + default: + logger.trace( + "isBrokerAvailable: authenticationScheme is not supported, returning false" + ); + return false; + } + } + return true; +} diff --git a/lib/msal-browser/src/broker/nativeBroker/NativeRequest.ts b/lib/msal-browser/src/broker/nativeBroker/PlatformBrokerRequest.ts similarity index 64% rename from lib/msal-browser/src/broker/nativeBroker/NativeRequest.ts rename to lib/msal-browser/src/broker/nativeBroker/PlatformBrokerRequest.ts index 8402d57805..7aa143f156 100644 --- a/lib/msal-browser/src/broker/nativeBroker/NativeRequest.ts +++ b/lib/msal-browser/src/broker/nativeBroker/PlatformBrokerRequest.ts @@ -9,7 +9,7 @@ import { StoreInCache, StringDict } from "@azure/msal-common/browser"; /** * Token request which native broker will use to acquire tokens */ -export type NativeTokenRequest = { +export type PlatformBrokerRequest = { accountId: string; // WAM specific account id used for identification of WAM account. This can be any broker-id eventually clientId: string; authority: string; @@ -40,7 +40,7 @@ export type NativeTokenRequest = { */ export type NativeExtensionRequestBody = { method: NativeExtensionMethod; - request?: NativeTokenRequest; + request?: PlatformBrokerRequest; }; /** @@ -52,3 +52,24 @@ export type NativeExtensionRequest = { extensionId?: string; body: NativeExtensionRequestBody; }; + +export type PlatformDOMTokenRequest = { + brokerId: string; + accountId?: string; + clientId: string; + authority: string; + scope: string; + redirectUri: string; + correlationId: string; + isSecurityTokenService: boolean; + state?: string; + /* + * Known optional parameters will go into extraQueryParameters. + * List of known parameters is: + * "prompt", "nonce", "claims", "loginHint", "instanceAware", "windowTitleSubstring", "extendedExpiryToken", "storeInCache", + * ProofOfPossessionParams: "reqCnf", "keyId", "tokenType", "shrClaims", "shrNonce", "resourceRequestMethod", "resourceRequestUri", "signPopToken" + */ + extraParameters?: StringDict; + embeddedClientId?: string; + storeInCache?: StoreInCache; // Object of booleans indicating whether to store tokens in the cache or not (default is true) +}; diff --git a/lib/msal-browser/src/broker/nativeBroker/NativeResponse.ts b/lib/msal-browser/src/broker/nativeBroker/PlatformBrokerResponse.ts similarity index 70% rename from lib/msal-browser/src/broker/nativeBroker/NativeResponse.ts rename to lib/msal-browser/src/broker/nativeBroker/PlatformBrokerResponse.ts index 79392395df..fb2e87f96f 100644 --- a/lib/msal-browser/src/broker/nativeBroker/NativeResponse.ts +++ b/lib/msal-browser/src/broker/nativeBroker/PlatformBrokerResponse.ts @@ -15,7 +15,7 @@ export type NativeAccountInfo = { /** * Token response returned by Native Platform */ -export type NativeResponse = { +export type PlatformBrokerResponse = { access_token: string; account: NativeAccountInfo; client_info: string; @@ -54,3 +54,27 @@ export type MATS = { http_status?: number; http_event_count?: number; }; + +export type PlatformDOMTokenResponse = { + isSuccess: boolean; + state?: string; + accessToken: string; + expiresIn: number; + account: NativeAccountInfo; + clientInfo: string; + idToken: string; + scopes: string; + proofOfPossessionPayload?: string; + extendedLifetimeToken?: boolean; + error: ErrorResult; + properties?: Record; +}; + +export type ErrorResult = { + code: string; + description?: string; + errorCode: string; + protocolError?: string; + status: string; + properties?: object; +}; diff --git a/lib/msal-browser/src/cache/BrowserCacheManager.ts b/lib/msal-browser/src/cache/BrowserCacheManager.ts index 7014364435..0f271f56dd 100644 --- a/lib/msal-browser/src/cache/BrowserCacheManager.ts +++ b/lib/msal-browser/src/cache/BrowserCacheManager.ts @@ -54,7 +54,7 @@ import { LocalStorage } from "./LocalStorage.js"; import { SessionStorage } from "./SessionStorage.js"; import { MemoryStorage } from "./MemoryStorage.js"; import { IWindowStorage } from "./IWindowStorage.js"; -import { NativeTokenRequest } from "../broker/nativeBroker/NativeRequest.js"; +import { PlatformBrokerRequest } from "../broker/nativeBroker/PlatformBrokerRequest.js"; import { AuthenticationResult } from "../response/AuthenticationResult.js"; import { SilentRequest } from "../request/SilentRequest.js"; import { SsoSilentRequest } from "../request/SsoSilentRequest.js"; @@ -66,6 +66,7 @@ import { CookieStorage } from "./CookieStorage.js"; import { getAccountKeys, getTokenKeys } from "./CacheHelpers.js"; import { EventType } from "../event/EventType.js"; import { EventHandler } from "../event/EventHandler.js"; +import { clearHash } from "../utils/BrowserUtils.js"; /** * This class implements the cache storage interface for MSAL through browser local or session storage. @@ -1160,7 +1161,7 @@ export class BrowserCacheManager extends CacheManager { /** * Gets cached native request for redirect flows */ - getCachedNativeRequest(): NativeTokenRequest | null { + getCachedNativeRequest(): PlatformBrokerRequest | null { this.logger.trace("BrowserCacheManager.getCachedNativeRequest called"); const cachedRequest = this.getTemporaryCache( TemporaryCacheKeys.NATIVE_REQUEST, @@ -1175,7 +1176,7 @@ export class BrowserCacheManager extends CacheManager { const parsedRequest = this.validateAndParseJson( cachedRequest - ) as NativeTokenRequest; + ) as PlatformBrokerRequest; if (!parsedRequest) { this.logger.error( "BrowserCacheManager.getCachedNativeRequest: Unable to parse native request" @@ -1202,7 +1203,18 @@ export class BrowserCacheManager extends CacheManager { } | null { const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`; const value = this.getTemporaryCache(key, false); - return value ? JSON.parse(value) : null; + try { + return value ? JSON.parse(value) : null; + } catch (e) { + // Remove interaction and other temp keys if interaction status can't be parsed + this.logger.error( + `Cannot parse interaction status. Removing temporary cache items and clearing url hash. Retrying interaction should fix the error` + ); + this.removeTemporaryItem(key); + this.resetRequestCache(); + clearHash(window); + return null; + } } setInteractionInProgress( diff --git a/lib/msal-browser/src/cache/LocalStorage.ts b/lib/msal-browser/src/cache/LocalStorage.ts index e55fcf3e18..c1f225ece4 100644 --- a/lib/msal-browser/src/cache/LocalStorage.ts +++ b/lib/msal-browser/src/cache/LocalStorage.ts @@ -77,8 +77,6 @@ export class LocalStorage implements IWindowStorage { } async initialize(correlationId: string): Promise { - this.initialized = true; - const cookies = new CookieStorage(); const cookieString = cookies.getItem(ENCRYPTION_KEY); let parsedCookie = { key: "", id: "" }; @@ -158,6 +156,8 @@ export class LocalStorage implements IWindowStorage { // Register listener for cache updates in other tabs this.broadcast.addEventListener("message", this.updateCache.bind(this)); + + this.initialized = true; } getItem(key: string): string | null { diff --git a/lib/msal-browser/src/controllers/IController.ts b/lib/msal-browser/src/controllers/IController.ts index cc86d3ce97..334de761dc 100644 --- a/lib/msal-browser/src/controllers/IController.ts +++ b/lib/msal-browser/src/controllers/IController.ts @@ -29,7 +29,10 @@ import { EventType } from "../event/EventType.js"; export interface IController { // TODO: Make request mandatory in the next major version? - initialize(request?: InitializeApplicationRequest): Promise; + initialize( + request?: InitializeApplicationRequest, + isBroker?: boolean + ): Promise; acquireTokenPopup(request: PopupRequest): Promise; diff --git a/lib/msal-browser/src/controllers/NestedAppAuthController.ts b/lib/msal-browser/src/controllers/NestedAppAuthController.ts index 87a6cb6376..f0cd3d69ee 100644 --- a/lib/msal-browser/src/controllers/NestedAppAuthController.ts +++ b/lib/msal-browser/src/controllers/NestedAppAuthController.ts @@ -159,7 +159,11 @@ export class NestedAppAuthController implements IController { * Specific implementation of initialize function for NestedAppAuthController * @returns */ - async initialize(request?: InitializeApplicationRequest): Promise { + async initialize( + request?: InitializeApplicationRequest, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isBroker?: boolean + ): Promise { const initCorrelationId = request?.correlationId || createNewGuid(); await this.browserStorage.initialize(initCorrelationId); return Promise.resolve(); diff --git a/lib/msal-browser/src/controllers/StandardController.ts b/lib/msal-browser/src/controllers/StandardController.ts index 67987ded3d..5952b15b1c 100644 --- a/lib/msal-browser/src/controllers/StandardController.ts +++ b/lib/msal-browser/src/controllers/StandardController.ts @@ -63,8 +63,7 @@ import { SilentIframeClient } from "../interaction_client/SilentIframeClient.js" import { SilentRefreshClient } from "../interaction_client/SilentRefreshClient.js"; import { TokenCache } from "../cache/TokenCache.js"; import { ITokenCache } from "../cache/ITokenCache.js"; -import { NativeInteractionClient } from "../interaction_client/NativeInteractionClient.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthInteractionClient } from "../interaction_client/PlatformAuthInteractionClient.js"; import { SilentRequest } from "../request/SilentRequest.js"; import { NativeAuthError, @@ -77,7 +76,7 @@ import { BrowserAuthErrorCodes, } from "../error/BrowserAuthError.js"; import { AuthorizationCodeRequest } from "../request/AuthorizationCodeRequest.js"; -import { NativeTokenRequest } from "../broker/nativeBroker/NativeRequest.js"; +import { PlatformBrokerRequest } from "../broker/nativeBroker/PlatformBrokerRequest.js"; import { StandardOperatingContext } from "../operatingcontext/StandardOperatingContext.js"; import { BaseOperatingContext } from "../operatingcontext/BaseOperatingContext.js"; import { IController } from "./IController.js"; @@ -87,6 +86,12 @@ import { createNewGuid } from "../crypto/BrowserCrypto.js"; import { initializeSilentRequest } from "../request/RequestHelpers.js"; import { InitializeApplicationRequest } from "../request/InitializeApplicationRequest.js"; import { generatePkceCodes } from "../crypto/PkceGenerator.js"; +import { + getPlatformAuthProvider, + isBrokerAvailable, +} from "../broker/nativeBroker/PlatformAuthProvider.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; +import { collectInstanceStats } from "../utils/MsalFrameStatsUtils.js"; function getAccountType( account?: AccountInfo @@ -156,7 +161,7 @@ export class StandardController implements IController { >; // Native Extension Provider - protected nativeExtensionProvider: NativeMessageHandler | undefined; + protected platformAuthProvider: IPlatformAuthHandler | undefined; // Hybrid auth code responses private hybridAuthCodeResponses: Map>; @@ -312,7 +317,10 @@ export class StandardController implements IController { * Initializer function to perform async startup tasks such as connecting to WAM extension * @param request {?InitializeApplicationRequest} correlation id */ - async initialize(request?: InitializeApplicationRequest): Promise { + async initialize( + request?: InitializeApplicationRequest, + isBroker?: boolean + ): Promise { this.logger.trace("initialize called"); if (this.initialized) { this.logger.info( @@ -337,6 +345,13 @@ export class StandardController implements IController { ); this.eventHandler.emitEvent(EventType.INITIALIZE_START); + // Broker applications are initialized twice, so we avoid double-counting it + if (!isBroker) { + try { + this.logMultipleInstances(initMeasurement); + } catch {} + } + await invokeAsync( this.browserStorage.initialize.bind(this.browserStorage), PerformanceEvents.InitializeCache, @@ -347,12 +362,13 @@ export class StandardController implements IController { if (allowPlatformBroker) { try { - this.nativeExtensionProvider = - await NativeMessageHandler.createProvider( - this.logger, - this.config.system.nativeBrokerHandshakeTimeout, - this.performanceClient - ); + // check if platform authentication is available via DOM or browser extension and create relevant handlers + this.platformAuthProvider = await getPlatformAuthProvider( + this.logger, + this.performanceClient, + initCorrelationId, + this.config.system.nativeBrokerHandshakeTimeout + ); } catch (e) { this.logger.verbose(e as string); } @@ -461,18 +477,13 @@ export class StandardController implements IController { } const loggedInAccounts = this.getAllAccounts(); - const platformBrokerRequest: NativeTokenRequest | null = + const platformBrokerRequest: PlatformBrokerRequest | null = this.browserStorage.getCachedNativeRequest(); const useNative = - platformBrokerRequest && - NativeMessageHandler.isPlatformBrokerAvailable( - this.config, - this.logger, - this.nativeExtensionProvider - ) && - this.nativeExtensionProvider && - !hash; + platformBrokerRequest && this.platformAuthProvider && !hash; + let rootMeasurement: InProgressPerformanceEvent; + this.eventHandler.emitEvent( EventType.HANDLE_REDIRECT_START, InteractionType.Redirect @@ -480,7 +491,7 @@ export class StandardController implements IController { let redirectResponse: Promise; try { - if (useNative && this.nativeExtensionProvider) { + if (useNative && this.platformAuthProvider) { rootMeasurement = this.performanceClient.startMeasurement( PerformanceEvents.AcquireTokenRedirect, platformBrokerRequest?.correlationId || "" @@ -488,7 +499,7 @@ export class StandardController implements IController { this.logger.trace( "handleRedirectPromise - acquiring token from native platform" ); - const nativeClient = new NativeInteractionClient( + const nativeClient = new PlatformAuthInteractionClient( this.config, this.browserStorage, this.browserCrypto, @@ -497,7 +508,7 @@ export class StandardController implements IController { this.navigationClient, ApiId.handleRedirectPromise, this.performanceClient, - this.nativeExtensionProvider, + this.platformAuthProvider, platformBrokerRequest.accountId, this.nativeInternalStorage, platformBrokerRequest.correlationId @@ -683,10 +694,10 @@ export class StandardController implements IController { let result: Promise; if ( - this.nativeExtensionProvider && + this.platformAuthProvider && this.canUsePlatformBroker(request) ) { - const nativeClient = new NativeInteractionClient( + const nativeClient = new PlatformAuthInteractionClient( this.config, this.browserStorage, this.browserCrypto, @@ -695,7 +706,7 @@ export class StandardController implements IController { this.navigationClient, ApiId.acquireTokenRedirect, this.performanceClient, - this.nativeExtensionProvider, + this.platformAuthProvider, this.getNativeAccountId(request), this.nativeInternalStorage, correlationId @@ -707,7 +718,7 @@ export class StandardController implements IController { e instanceof NativeAuthError && isFatalNativeAuthError(e) ) { - this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt + this.platformAuthProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt const redirectClient = this.createRedirectClient(correlationId); return redirectClient.acquireToken(request); @@ -824,7 +835,7 @@ export class StandardController implements IController { e instanceof NativeAuthError && isFatalNativeAuthError(e) ) { - this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt + this.platformAuthProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt const popupClient = this.createPopupClient(correlationId); return popupClient.acquireToken(request, pkce); @@ -983,7 +994,7 @@ export class StandardController implements IController { ).catch((e: AuthError) => { // If native token acquisition fails for availability reasons fallback to standard flow if (e instanceof NativeAuthError && isFatalNativeAuthError(e)) { - this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt + this.platformAuthProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt const silentIframeClient = this.createSilentIframeClient( validRequest.correlationId ); @@ -1140,7 +1151,7 @@ export class StandardController implements IController { e instanceof NativeAuthError && isFatalNativeAuthError(e) ) { - this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt + this.platformAuthProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt } throw e; }); @@ -1534,13 +1545,13 @@ export class StandardController implements IController { cacheLookupPolicy?: CacheLookupPolicy ): Promise { this.logger.trace("acquireTokenNative called"); - if (!this.nativeExtensionProvider) { + if (!this.platformAuthProvider) { throw createBrowserAuthError( BrowserAuthErrorCodes.nativeConnectionNotEstablished ); } - const nativeClient = new NativeInteractionClient( + const nativeClient = new PlatformAuthInteractionClient( this.config, this.browserStorage, this.browserCrypto, @@ -1549,7 +1560,7 @@ export class StandardController implements IController { this.navigationClient, apiId, this.performanceClient, - this.nativeExtensionProvider, + this.platformAuthProvider, accountId || this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId @@ -1567,16 +1578,23 @@ export class StandardController implements IController { accountId?: string ): boolean { this.logger.trace("canUsePlatformBroker called"); + if (!this.platformAuthProvider) { + this.logger.trace( + "canUsePlatformBroker: platform broker unavilable, returning false" + ); + return false; + } + if ( - !NativeMessageHandler.isPlatformBrokerAvailable( + !isBrokerAvailable( this.config, this.logger, - this.nativeExtensionProvider, + this.platformAuthProvider, request.authenticationScheme ) ) { this.logger.trace( - "canUsePlatformBroker: isPlatformBrokerAvailable returned false, returning false" + "canUsePlatformBroker: isBrokerAvailable returned false, returning false" ); return false; } @@ -1641,7 +1659,7 @@ export class StandardController implements IController { this.navigationClient, this.performanceClient, this.nativeInternalStorage, - this.nativeExtensionProvider, + this.platformAuthProvider, correlationId ); } @@ -1660,7 +1678,7 @@ export class StandardController implements IController { this.navigationClient, this.performanceClient, this.nativeInternalStorage, - this.nativeExtensionProvider, + this.platformAuthProvider, correlationId ); } @@ -1682,7 +1700,7 @@ export class StandardController implements IController { ApiId.ssoSilent, this.performanceClient, this.nativeInternalStorage, - this.nativeExtensionProvider, + this.platformAuthProvider, correlationId ); } @@ -1701,7 +1719,7 @@ export class StandardController implements IController { this.eventHandler, this.navigationClient, this.performanceClient, - this.nativeExtensionProvider, + this.platformAuthProvider, correlationId ); } @@ -1720,7 +1738,7 @@ export class StandardController implements IController { this.eventHandler, this.navigationClient, this.performanceClient, - this.nativeExtensionProvider, + this.platformAuthProvider, correlationId ); } @@ -1740,7 +1758,7 @@ export class StandardController implements IController { this.navigationClient, ApiId.acquireTokenByCode, this.performanceClient, - this.nativeExtensionProvider, + this.platformAuthProvider, correlationId ); } @@ -2216,10 +2234,10 @@ export class StandardController implements IController { ): Promise { // if the cache policy is set to access_token only, we should not be hitting the native layer yet if ( - NativeMessageHandler.isPlatformBrokerAvailable( + isBrokerAvailable( this.config, this.logger, - this.nativeExtensionProvider, + this.platformAuthProvider, silentRequest.authenticationScheme ) && silentRequest.account.nativeAccountId @@ -2238,8 +2256,7 @@ export class StandardController implements IController { this.logger.verbose( "acquireTokenSilent - native platform unavailable, falling back to web flow" ); - this.nativeExtensionProvider = undefined; // Prevent future requests from continuing to attempt - + this.platformAuthProvider = undefined; // Prevent future requests from continuing to attempt // Cache will not contain tokens, given that previous WAM requests succeeded. Skip cache and RT renewal and go straight to iframe renewal throw createClientAuthError( ClientAuthErrorCodes.tokenRefreshRequired @@ -2322,6 +2339,30 @@ export class StandardController implements IController { ); return res; } + + private logMultipleInstances( + performanceEvent: InProgressPerformanceEvent + ): void { + const clientId = this.config.auth.clientId; + + if (!window) return; + // @ts-ignore + window.msal = window.msal || {}; + // @ts-ignore + window.msal.clientIds = window.msal.clientIds || []; + + // @ts-ignore + const clientIds: string[] = window.msal.clientIds; + + if (clientIds.length > 0) { + this.logger.verbose( + "There is already an instance of MSAL.js in the window." + ); + } + // @ts-ignore + window.msal.clientIds.push(clientId); + collectInstanceStats(clientId, performanceEvent, this.logger); + } } /** diff --git a/lib/msal-browser/src/index.ts b/lib/msal-browser/src/index.ts index 18a96c2b30..0d4222d58b 100644 --- a/lib/msal-browser/src/index.ts +++ b/lib/msal-browser/src/index.ts @@ -154,3 +154,5 @@ export { } from "@azure/msal-common/browser"; export { version } from "./packageMetadata.js"; + +export { isPlatformBrokerAvailable } from "./broker/nativeBroker/PlatformAuthProvider.js"; diff --git a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts index 51bccf5055..722819ce40 100644 --- a/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/BaseInteractionClient.ts @@ -34,10 +34,10 @@ import { version } from "../packageMetadata.js"; import { BrowserConstants } from "../utils/BrowserConstants.js"; import * as BrowserUtils from "../utils/BrowserUtils.js"; import { INavigationClient } from "../navigation/INavigationClient.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; import { AuthenticationResult } from "../response/AuthenticationResult.js"; import { ClearCacheRequest } from "../request/ClearCacheRequest.js"; import { createNewGuid } from "../crypto/BrowserCrypto.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; export abstract class BaseInteractionClient { protected config: BrowserConfiguration; @@ -47,7 +47,7 @@ export abstract class BaseInteractionClient { protected logger: Logger; protected eventHandler: EventHandler; protected navigationClient: INavigationClient; - protected nativeMessageHandler: NativeMessageHandler | undefined; + protected platformAuthProvider: IPlatformAuthHandler | undefined; protected correlationId: string; protected performanceClient: IPerformanceClient; @@ -59,7 +59,7 @@ export abstract class BaseInteractionClient { eventHandler: EventHandler, navigationClient: INavigationClient, performanceClient: IPerformanceClient, - nativeMessageHandler?: NativeMessageHandler, + platformAuthProvider?: IPlatformAuthHandler, correlationId?: string ) { this.config = config; @@ -68,7 +68,7 @@ export abstract class BaseInteractionClient { this.networkClient = this.config.system.networkClient; this.eventHandler = eventHandler; this.navigationClient = navigationClient; - this.nativeMessageHandler = nativeMessageHandler; + this.platformAuthProvider = platformAuthProvider; this.correlationId = correlationId || createNewGuid(); this.logger = logger.clone( BrowserConstants.MSAL_SKU, diff --git a/lib/msal-browser/src/interaction_client/NativeInteractionClient.ts b/lib/msal-browser/src/interaction_client/PlatformAuthInteractionClient.ts similarity index 83% rename from lib/msal-browser/src/interaction_client/NativeInteractionClient.ts rename to lib/msal-browser/src/interaction_client/PlatformAuthInteractionClient.ts index a51eae8545..fd5ae100e6 100644 --- a/lib/msal-browser/src/interaction_client/NativeInteractionClient.ts +++ b/lib/msal-browser/src/interaction_client/PlatformAuthInteractionClient.ts @@ -30,8 +30,6 @@ import { createClientAuthError, ClientAuthErrorCodes, invokeAsync, - createAuthError, - AuthErrorCodes, updateAccountTenantProfileData, CacheHelpers, buildAccountToCache, @@ -46,20 +44,21 @@ import { EventHandler } from "../event/EventHandler.js"; import { PopupRequest } from "../request/PopupRequest.js"; import { SilentRequest } from "../request/SilentRequest.js"; import { SsoSilentRequest } from "../request/SsoSilentRequest.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; import { - NativeExtensionMethod, ApiId, TemporaryCacheKeys, - NativeConstants, + PlatformAuthConstants, BrowserConstants, CacheLookupPolicy, } from "../utils/BrowserConstants.js"; import { - NativeExtensionRequestBody, - NativeTokenRequest, -} from "../broker/nativeBroker/NativeRequest.js"; -import { MATS, NativeResponse } from "../broker/nativeBroker/NativeResponse.js"; + PlatformBrokerRequest, + PlatformDOMTokenRequest, +} from "../broker/nativeBroker/PlatformBrokerRequest.js"; +import { + MATS, + PlatformBrokerResponse, +} from "../broker/nativeBroker/PlatformBrokerResponse.js"; import { NativeAuthError, NativeAuthErrorCodes, @@ -77,11 +76,12 @@ import { SilentCacheClient } from "./SilentCacheClient.js"; import { AuthenticationResult } from "../response/AuthenticationResult.js"; import { base64Decode } from "../encode/Base64Decode.js"; import { version } from "../packageMetadata.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; -export class NativeInteractionClient extends BaseInteractionClient { +export class PlatformAuthInteractionClient extends BaseInteractionClient { protected apiId: ApiId; protected accountId: string; - protected nativeMessageHandler: NativeMessageHandler; + protected platformAuthProvider: IPlatformAuthHandler; protected silentCacheClient: SilentCacheClient; protected nativeStorageManager: BrowserCacheManager; protected skus: string; @@ -95,7 +95,7 @@ export class NativeInteractionClient extends BaseInteractionClient { navigationClient: INavigationClient, apiId: ApiId, performanceClient: IPerformanceClient, - provider: NativeMessageHandler, + provider: IPlatformAuthHandler, accountId: string, nativeStorageImpl: BrowserCacheManager, correlationId?: string @@ -113,7 +113,7 @@ export class NativeInteractionClient extends BaseInteractionClient { ); this.apiId = apiId; this.accountId = accountId; - this.nativeMessageHandler = provider; + this.platformAuthProvider = provider; this.nativeStorageManager = nativeStorageImpl; this.silentCacheClient = new SilentCacheClient( config, @@ -127,27 +127,24 @@ export class NativeInteractionClient extends BaseInteractionClient { correlationId ); - const extensionName = - this.nativeMessageHandler.getExtensionId() === - NativeConstants.PREFERRED_EXTENSION_ID - ? "chrome" - : this.nativeMessageHandler.getExtensionId()?.length - ? "unknown" - : undefined; + const extensionName = this.platformAuthProvider.getExtensionName(); + this.skus = ServerTelemetryManager.makeExtraSkuString({ libraryName: BrowserConstants.MSAL_SKU, libraryVersion: version, extensionName: extensionName, - extensionVersion: this.nativeMessageHandler.getExtensionVersion(), + extensionVersion: this.platformAuthProvider.getExtensionVersion(), }); } /** * Adds SKUs to request extra query parameters - * @param request {NativeTokenRequest} + * @param request {PlatformBrokerRequest} * @private */ - private addRequestSKUs(request: NativeTokenRequest) { + private addRequestSKUs( + request: PlatformBrokerRequest | PlatformDOMTokenRequest + ): void { request.extraParameters = { ...request.extraParameters, [AADServerParamKeys.X_CLIENT_EXTRA_SKU]: this.skus, @@ -178,6 +175,7 @@ export class NativeInteractionClient extends BaseInteractionClient { const serverTelemetryManager = this.initializeServerTelemetryManager( this.apiId ); + try { // initialize native request const nativeRequest = await this.initializeNativeRequest(request); @@ -207,18 +205,8 @@ export class NativeInteractionClient extends BaseInteractionClient { ); } - const { ...nativeTokenRequest } = nativeRequest; - - // fall back to native calls - const messageBody: NativeExtensionRequestBody = { - method: NativeExtensionMethod.GetToken, - request: nativeTokenRequest, - }; - - const response: object = - await this.nativeMessageHandler.sendMessage(messageBody); - const validatedResponse: NativeResponse = - this.validateNativeResponse(response); + const validatedResponse: PlatformBrokerResponse = + await this.platformAuthProvider.sendMessage(nativeRequest); return await this.handleNativeResponse( validatedResponse, @@ -258,7 +246,7 @@ export class NativeInteractionClient extends BaseInteractionClient { * @returns CommonSilentFlowRequest */ private createSilentCacheRequest( - request: NativeTokenRequest, + request: PlatformBrokerRequest, cachedAccount: AccountInfo ): CommonSilentFlowRequest { return { @@ -278,7 +266,7 @@ export class NativeInteractionClient extends BaseInteractionClient { */ protected async acquireTokensFromCache( nativeAccountId: string, - request: NativeTokenRequest + request: PlatformBrokerRequest ): Promise { if (!nativeAccountId) { this.logger.warning( @@ -335,15 +323,8 @@ export class NativeInteractionClient extends BaseInteractionClient { const nativeRequest = await this.initializeNativeRequest(request); - const messageBody: NativeExtensionRequestBody = { - method: NativeExtensionMethod.GetToken, - request: nativeRequest, - }; - try { - const response: object = - await this.nativeMessageHandler.sendMessage(messageBody); - this.validateNativeResponse(response); + await this.platformAuthProvider.sendMessage(nativeRequest); } catch (e) { // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise if (e instanceof NativeAuthError) { @@ -423,30 +404,24 @@ export class NativeInteractionClient extends BaseInteractionClient { ) ); - const messageBody: NativeExtensionRequestBody = { - method: NativeExtensionMethod.GetToken, - request: request, - }; - const reqTimestamp = TimeUtils.nowSeconds(); try { this.logger.verbose( "NativeInteractionClient - handleRedirectPromise sending message to native broker." ); - const response: object = - await this.nativeMessageHandler.sendMessage(messageBody); - this.validateNativeResponse(response); - const result = this.handleNativeResponse( - response as NativeResponse, + const response: PlatformBrokerResponse = + await this.platformAuthProvider.sendMessage(request); + const authResult = await this.handleNativeResponse( + response, request, reqTimestamp ); - const res = await result; + const serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId); serverTelemetryManager.clearNativeBrokerErrorCode(); - return res; + return authResult; } catch (e) { throw e; } @@ -468,8 +443,8 @@ export class NativeInteractionClient extends BaseInteractionClient { * @param reqTimestamp */ protected async handleNativeResponse( - response: NativeResponse, - request: NativeTokenRequest, + response: PlatformBrokerResponse, + request: PlatformBrokerRequest, reqTimestamp: number ): Promise { this.logger.trace( @@ -562,7 +537,7 @@ export class NativeInteractionClient extends BaseInteractionClient { * @returns */ protected createHomeAccountIdentifier( - response: NativeResponse, + response: PlatformBrokerResponse, idTokenClaims: TokenClaims ): string { // Save account in browser storage @@ -583,13 +558,10 @@ export class NativeInteractionClient extends BaseInteractionClient { * @param request * @returns */ - generateScopes( - response: NativeResponse, - request: NativeTokenRequest - ): ScopeSet { - return response.scope - ? ScopeSet.fromString(response.scope) - : ScopeSet.fromString(request.scope); + generateScopes(requestScopes: string, responseScopes?: string): ScopeSet { + return responseScopes + ? ScopeSet.fromString(responseScopes) + : ScopeSet.fromString(requestScopes); } /** @@ -598,8 +570,8 @@ export class NativeInteractionClient extends BaseInteractionClient { * @param response */ async generatePopAccessToken( - response: NativeResponse, - request: NativeTokenRequest + response: PlatformBrokerResponse, + request: PlatformBrokerRequest ): Promise { if ( request.tokenType === AuthenticationScheme.POP && @@ -657,20 +629,23 @@ export class NativeInteractionClient extends BaseInteractionClient { * @returns */ protected async generateAuthenticationResult( - response: NativeResponse, - request: NativeTokenRequest, + response: PlatformBrokerResponse, + request: PlatformBrokerRequest, idTokenClaims: TokenClaims, accountEntity: AccountEntity, authority: string, reqTimestamp: number ): Promise { // Add Native Broker fields to Telemetry - const mats = this.addTelemetryFromNativeResponse(response); + const mats = this.addTelemetryFromNativeResponse( + response.properties.MATS + ); // If scopes not returned in server response, use request scopes - const responseScopes = response.scope - ? ScopeSet.fromString(response.scope) - : ScopeSet.fromString(request.scope); + const responseScopes = this.generateScopes( + request.scope, + response.scope + ); const accountProperties = response.account.properties || {}; const uid = @@ -758,8 +733,8 @@ export class NativeInteractionClient extends BaseInteractionClient { * @param reqTimestamp */ cacheNativeTokens( - response: NativeResponse, - request: NativeTokenRequest, + response: PlatformBrokerResponse, + request: PlatformBrokerRequest, homeAccountIdentifier: string, idTokenClaims: TokenClaims, responseAccessToken: string, @@ -783,7 +758,10 @@ export class NativeInteractionClient extends BaseInteractionClient { ? parseInt(response.expires_in, 10) : response.expires_in) || 0; const tokenExpirationSeconds = reqTimestamp + expiresIn; - const responseScopes = this.generateScopes(response, request); + const responseScopes = this.generateScopes( + response.scope, + request.scope + ); const cachedAccessToken: AccessTokenEntity | null = CacheHelpers.createAccessTokenEntity( @@ -814,10 +792,21 @@ export class NativeInteractionClient extends BaseInteractionClient { ); } + getExpiresInValue( + tokenType: string, + expiresIn: string | number | undefined + ): number { + return tokenType === AuthenticationScheme.POP + ? Constants.SHR_NONCE_VALIDITY + : (typeof expiresIn === "string" + ? parseInt(expiresIn, 10) + : expiresIn) || 0; + } + protected addTelemetryFromNativeResponse( - response: NativeResponse + matsResponse?: string ): MATS | null { - const mats = this.getMATSFromResponse(response); + const mats = this.getMATSFromResponse(matsResponse); if (!mats) { return null; @@ -825,9 +814,9 @@ export class NativeInteractionClient extends BaseInteractionClient { this.performanceClient.addFields( { - extensionId: this.nativeMessageHandler.getExtensionId(), + extensionId: this.platformAuthProvider.getExtensionId(), extensionVersion: - this.nativeMessageHandler.getExtensionVersion(), + this.platformAuthProvider.getExtensionVersion(), matsBrokerVersion: mats.broker_version, matsAccountJoinOnStart: mats.account_join_on_start, matsAccountJoinOnEnd: mats.account_join_on_end, @@ -848,37 +837,15 @@ export class NativeInteractionClient extends BaseInteractionClient { return mats; } - /** - * Validates native platform response before processing - * @param response - */ - private validateNativeResponse(response: object): NativeResponse { - if ( - response.hasOwnProperty("access_token") && - response.hasOwnProperty("id_token") && - response.hasOwnProperty("client_info") && - response.hasOwnProperty("account") && - response.hasOwnProperty("scope") && - response.hasOwnProperty("expires_in") - ) { - return response as NativeResponse; - } else { - throw createAuthError( - AuthErrorCodes.unexpectedError, - "Response missing expected properties." - ); - } - } - /** * Gets MATS telemetry from native response * @param response * @returns */ - private getMATSFromResponse(response: NativeResponse): MATS | null { - if (response.properties.MATS) { + private getMATSFromResponse(matsResponse: string | undefined): MATS | null { + if (matsResponse) { try { - return JSON.parse(response.properties.MATS); + return JSON.parse(matsResponse); } catch (e) { this.logger.error( "NativeInteractionClient - Error parsing MATS telemetry, returning null instead" @@ -911,79 +878,26 @@ export class NativeInteractionClient extends BaseInteractionClient { */ protected async initializeNativeRequest( request: PopupRequest | SsoSilentRequest - ): Promise { + ): Promise { this.logger.trace( "NativeInteractionClient - initializeNativeRequest called" ); - const requestAuthority = - request.authority || this.config.auth.authority; - - if (request.account) { - // validate authority - await this.getDiscoveredAuthority({ - requestAuthority, - requestAzureCloudOptions: request.azureCloudOptions, - account: request.account, - }); - } - - const canonicalAuthority = new UrlString(requestAuthority); - canonicalAuthority.validateAsUri(); + const canonicalAuthority = await this.getCanonicalAuthority(request); // scopes are expected to be received by the native broker as "scope" and will be added to the request below. Other properties that should be dropped from the request to the native broker can be included in the object destructuring here. const { scopes, ...remainingProperties } = request; const scopeSet = new ScopeSet(scopes || []); scopeSet.appendScopes(OIDC_DEFAULT_SCOPES); - const getPrompt = () => { - // If request is silent, prompt is always none - switch (this.apiId) { - case ApiId.ssoSilent: - case ApiId.acquireTokenSilent_silentFlow: - this.logger.trace( - "initializeNativeRequest: silent request sets prompt to none" - ); - return PromptValue.NONE; - default: - break; - } - - // Prompt not provided, request may proceed and native broker decides if it needs to prompt - if (!request.prompt) { - this.logger.trace( - "initializeNativeRequest: prompt was not provided" - ); - return undefined; - } - - // If request is interactive, check if prompt provided is allowed to go directly to native broker - switch (request.prompt) { - case PromptValue.NONE: - case PromptValue.CONSENT: - case PromptValue.LOGIN: - this.logger.trace( - "initializeNativeRequest: prompt is compatible with native flow" - ); - return request.prompt; - default: - this.logger.trace( - `initializeNativeRequest: prompt = ${request.prompt} is not compatible with native flow` - ); - throw createBrowserAuthError( - BrowserAuthErrorCodes.nativePromptNotSupported - ); - } - }; - - const validatedRequest: NativeTokenRequest = { + const validatedRequest: PlatformBrokerRequest = { ...remainingProperties, accountId: this.accountId, clientId: this.config.auth.clientId, authority: canonicalAuthority.urlString, scope: scopeSet.printScopes(), redirectUri: this.getRedirectUri(request.redirectUri), - prompt: getPrompt(), + prompt: this.getPrompt(request.prompt), correlationId: this.correlationId, tokenType: request.authenticationScheme, windowTitleSubstring: document.title, @@ -1006,7 +920,7 @@ export class NativeInteractionClient extends BaseInteractionClient { validatedRequest.extraParameters = validatedRequest.extraParameters || {}; validatedRequest.extraParameters.telemetry = - NativeConstants.MATS_TELEMETRY; + PlatformAuthConstants.MATS_TELEMETRY; if (request.authenticationScheme === AuthenticationScheme.POP) { // add POP request type @@ -1047,12 +961,74 @@ export class NativeInteractionClient extends BaseInteractionClient { return validatedRequest; } + private async getCanonicalAuthority( + request: PopupRequest | SsoSilentRequest + ): Promise { + const requestAuthority = + request.authority || this.config.auth.authority; + + if (request.account) { + // validate authority + await this.getDiscoveredAuthority({ + requestAuthority, + requestAzureCloudOptions: request.azureCloudOptions, + account: request.account, + }); + } + + const canonicalAuthority = new UrlString(requestAuthority); + canonicalAuthority.validateAsUri(); + return canonicalAuthority; + } + + private getPrompt(prompt?: string): string | undefined { + // If request is silent, prompt is always none + switch (this.apiId) { + case ApiId.ssoSilent: + case ApiId.acquireTokenSilent_silentFlow: + this.logger.trace( + "initializeNativeRequest: silent request sets prompt to none" + ); + return PromptValue.NONE; + default: + break; + } + + // Prompt not provided, request may proceed and native broker decides if it needs to prompt + if (!prompt) { + this.logger.trace( + "initializeNativeRequest: prompt was not provided" + ); + return undefined; + } + + // If request is interactive, check if prompt provided is allowed to go directly to native broker + switch (prompt) { + case PromptValue.NONE: + case PromptValue.CONSENT: + case PromptValue.LOGIN: + this.logger.trace( + "initializeNativeRequest: prompt is compatible with native flow" + ); + return prompt; + default: + this.logger.trace( + `initializeNativeRequest: prompt = ${prompt} is not compatible with native flow` + ); + throw createBrowserAuthError( + BrowserAuthErrorCodes.nativePromptNotSupported + ); + } + } + /** * Handles extra broker request parameters - * @param request {NativeTokenRequest} + * @param request {PlatformBrokerRequest} * @private */ - private handleExtraBrokerParams(request: NativeTokenRequest): void { + private handleExtraBrokerParams( + request: PlatformBrokerRequest | PlatformDOMTokenRequest + ): void { const hasExtraBrokerParams = request.extraParameters && request.extraParameters.hasOwnProperty( diff --git a/lib/msal-browser/src/interaction_client/PopupClient.ts b/lib/msal-browser/src/interaction_client/PopupClient.ts index cfc08c2d13..f28de1f910 100644 --- a/lib/msal-browser/src/interaction_client/PopupClient.ts +++ b/lib/msal-browser/src/interaction_client/PopupClient.ts @@ -31,7 +31,6 @@ import { EndSessionPopupRequest } from "../request/EndSessionPopupRequest.js"; import { NavigationOptions } from "../navigation/NavigationOptions.js"; import * as BrowserUtils from "../utils/BrowserUtils.js"; import { PopupRequest } from "../request/PopupRequest.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; import { createBrowserAuthError, BrowserAuthErrorCodes, @@ -46,7 +45,9 @@ import { AuthenticationResult } from "../response/AuthenticationResult.js"; import * as ResponseHandler from "../response/ResponseHandler.js"; import * as Authorize from "../protocol/Authorize.js"; import { generatePkceCodes } from "../crypto/PkceGenerator.js"; +import { isBrokerAvailable } from "../broker/nativeBroker/PlatformAuthProvider.js"; import { generateEarKey } from "../crypto/BrowserCrypto.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; export type PopupParams = { popup?: Window | null; @@ -68,7 +69,7 @@ export class PopupClient extends StandardInteractionClient { navigationClient: INavigationClient, performanceClient: IPerformanceClient, nativeStorageImpl: BrowserCacheManager, - nativeMessageHandler?: NativeMessageHandler, + platformAuthHandler?: IPlatformAuthHandler, correlationId?: string ) { super( @@ -79,7 +80,7 @@ export class PopupClient extends StandardInteractionClient { eventHandler, navigationClient, performanceClient, - nativeMessageHandler, + platformAuthHandler, correlationId ); // Properly sets this reference for the unload event. @@ -222,10 +223,10 @@ export class PopupClient extends StandardInteractionClient { BrowserUtils.preconnect(validRequest.authority); } - const isPlatformBroker = NativeMessageHandler.isPlatformBrokerAvailable( + const isPlatformBroker = isBrokerAvailable( this.config, this.logger, - this.nativeMessageHandler, + this.platformAuthProvider, request.authenticationScheme ); validRequest.platformBroker = isPlatformBroker; @@ -348,7 +349,7 @@ export class PopupClient extends StandardInteractionClient { this.eventHandler, this.logger, this.performanceClient, - this.nativeMessageHandler + this.platformAuthProvider ); } catch (e) { // Close the synchronous popup if an error is thrown before the window unload event is registered @@ -447,7 +448,7 @@ export class PopupClient extends StandardInteractionClient { this.eventHandler, this.logger, this.performanceClient, - this.nativeMessageHandler + this.platformAuthProvider ); } diff --git a/lib/msal-browser/src/interaction_client/RedirectClient.ts b/lib/msal-browser/src/interaction_client/RedirectClient.ts index 620b6b7285..b1c93f4b61 100644 --- a/lib/msal-browser/src/interaction_client/RedirectClient.ts +++ b/lib/msal-browser/src/interaction_client/RedirectClient.ts @@ -37,7 +37,6 @@ import { BrowserAuthErrorCodes, } from "../error/BrowserAuthError.js"; import { RedirectRequest } from "../request/RedirectRequest.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; import { BrowserConfiguration } from "../config/Configuration.js"; import { BrowserCacheManager } from "../cache/BrowserCacheManager.js"; import { EventHandler } from "../event/EventHandler.js"; @@ -47,7 +46,9 @@ import { AuthenticationResult } from "../response/AuthenticationResult.js"; import * as ResponseHandler from "../response/ResponseHandler.js"; import * as Authorize from "../protocol/Authorize.js"; import { generatePkceCodes } from "../crypto/PkceGenerator.js"; +import { isBrokerAvailable } from "../broker/nativeBroker/PlatformAuthProvider.js"; import { generateEarKey } from "../crypto/BrowserCrypto.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; function getNavigationType(): NavigationTimingType | undefined { if ( @@ -77,7 +78,7 @@ export class RedirectClient extends StandardInteractionClient { navigationClient: INavigationClient, performanceClient: IPerformanceClient, nativeStorageImpl: BrowserCacheManager, - nativeMessageHandler?: NativeMessageHandler, + platformAuthHandler?: IPlatformAuthHandler, correlationId?: string ) { super( @@ -88,7 +89,7 @@ export class RedirectClient extends StandardInteractionClient { eventHandler, navigationClient, performanceClient, - nativeMessageHandler, + platformAuthHandler, correlationId ); this.nativeStorage = nativeStorageImpl; @@ -107,13 +108,12 @@ export class RedirectClient extends StandardInteractionClient { this.correlationId )(request, InteractionType.Redirect); - validRequest.platformBroker = - NativeMessageHandler.isPlatformBrokerAvailable( - this.config, - this.logger, - this.nativeMessageHandler, - request.authenticationScheme - ); + validRequest.platformBroker = isBrokerAvailable( + this.config, + this.logger, + this.platformAuthProvider, + request.authenticationScheme + ); const handleBackButton = (event: PageTransitionEvent) => { // Clear temporary cache if the back button is clicked during the redirect flow. @@ -546,7 +546,7 @@ export class RedirectClient extends StandardInteractionClient { this.eventHandler, this.logger, this.performanceClient, - this.nativeMessageHandler + this.platformAuthProvider ); } @@ -575,7 +575,7 @@ export class RedirectClient extends StandardInteractionClient { this.eventHandler, this.logger, this.performanceClient, - this.nativeMessageHandler + this.platformAuthProvider ); } diff --git a/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts b/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts index 701fda5d3d..53da018ba4 100644 --- a/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts +++ b/lib/msal-browser/src/interaction_client/SilentAuthCodeClient.ts @@ -25,9 +25,9 @@ import { import { InteractionType, ApiId } from "../utils/BrowserConstants.js"; import { AuthorizationCodeRequest } from "../request/AuthorizationCodeRequest.js"; import { HybridSpaAuthorizationCodeClient } from "./HybridSpaAuthorizationCodeClient.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; import { AuthenticationResult } from "../response/AuthenticationResult.js"; import { InteractionHandler } from "../interaction_handler/InteractionHandler.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; export class SilentAuthCodeClient extends StandardInteractionClient { private apiId: ApiId; @@ -41,7 +41,7 @@ export class SilentAuthCodeClient extends StandardInteractionClient { navigationClient: INavigationClient, apiId: ApiId, performanceClient: IPerformanceClient, - nativeMessageHandler?: NativeMessageHandler, + platformAuthProvider?: IPlatformAuthHandler, correlationId?: string ) { super( @@ -52,7 +52,7 @@ export class SilentAuthCodeClient extends StandardInteractionClient { eventHandler, navigationClient, performanceClient, - nativeMessageHandler, + platformAuthProvider, correlationId ); this.apiId = apiId; diff --git a/lib/msal-browser/src/interaction_client/SilentIframeClient.ts b/lib/msal-browser/src/interaction_client/SilentIframeClient.ts index a8a130680d..1f6b238030 100644 --- a/lib/msal-browser/src/interaction_client/SilentIframeClient.ts +++ b/lib/msal-browser/src/interaction_client/SilentIframeClient.ts @@ -36,13 +36,14 @@ import { monitorIframeForHash, } from "../interaction_handler/SilentHandler.js"; import { SsoSilentRequest } from "../request/SsoSilentRequest.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; import { AuthenticationResult } from "../response/AuthenticationResult.js"; import * as BrowserUtils from "../utils/BrowserUtils.js"; import * as ResponseHandler from "../response/ResponseHandler.js"; import * as Authorize from "../protocol/Authorize.js"; import { generatePkceCodes } from "../crypto/PkceGenerator.js"; +import { isBrokerAvailable } from "../broker/nativeBroker/PlatformAuthProvider.js"; import { generateEarKey } from "../crypto/BrowserCrypto.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; export class SilentIframeClient extends StandardInteractionClient { protected apiId: ApiId; @@ -58,7 +59,7 @@ export class SilentIframeClient extends StandardInteractionClient { apiId: ApiId, performanceClient: IPerformanceClient, nativeStorageImpl: BrowserCacheManager, - nativeMessageHandler?: NativeMessageHandler, + platformAuthProvider?: IPlatformAuthHandler, correlationId?: string ) { super( @@ -69,7 +70,7 @@ export class SilentIframeClient extends StandardInteractionClient { eventHandler, navigationClient, performanceClient, - nativeMessageHandler, + platformAuthProvider, correlationId ); this.apiId = apiId; @@ -122,13 +123,12 @@ export class SilentIframeClient extends StandardInteractionClient { this.performanceClient, request.correlationId )(inputRequest, InteractionType.Silent); - silentRequest.platformBroker = - NativeMessageHandler.isPlatformBrokerAvailable( - this.config, - this.logger, - this.nativeMessageHandler, - silentRequest.authenticationScheme - ); + silentRequest.platformBroker = isBrokerAvailable( + this.config, + this.logger, + this.platformAuthProvider, + silentRequest.authenticationScheme + ); BrowserUtils.preconnect(silentRequest.authority); if (this.config.system.protocolMode === ProtocolMode.EAR) { @@ -294,7 +294,7 @@ export class SilentIframeClient extends StandardInteractionClient { this.eventHandler, this.logger, this.performanceClient, - this.nativeMessageHandler + this.platformAuthProvider ); } @@ -404,7 +404,7 @@ export class SilentIframeClient extends StandardInteractionClient { this.eventHandler, this.logger, this.performanceClient, - this.nativeMessageHandler + this.platformAuthProvider ); } } diff --git a/lib/msal-browser/src/network/FetchClient.ts b/lib/msal-browser/src/network/FetchClient.ts index 7121694d84..9aaa5d5498 100644 --- a/lib/msal-browser/src/network/FetchClient.ts +++ b/lib/msal-browser/src/network/FetchClient.ts @@ -39,10 +39,15 @@ export class FetchClient implements INetworkModule { headers: reqHeaders, }); } catch (e) { - throw createBrowserAuthError( - window.navigator.onLine - ? BrowserAuthErrorCodes.getRequestFailed - : BrowserAuthErrorCodes.noNetworkConnectivity + throw createNetworkError( + createBrowserAuthError( + window.navigator.onLine + ? BrowserAuthErrorCodes.getRequestFailed + : BrowserAuthErrorCodes.noNetworkConnectivity + ), + undefined, + undefined, + e as Error ); } @@ -60,7 +65,8 @@ export class FetchClient implements INetworkModule { BrowserAuthErrorCodes.failedToParseResponse ), responseStatus, - responseHeaders + responseHeaders, + e as Error ); } } @@ -88,10 +94,15 @@ export class FetchClient implements INetworkModule { body: reqBody, }); } catch (e) { - throw createBrowserAuthError( - window.navigator.onLine - ? BrowserAuthErrorCodes.postRequestFailed - : BrowserAuthErrorCodes.noNetworkConnectivity + throw createNetworkError( + createBrowserAuthError( + window.navigator.onLine + ? BrowserAuthErrorCodes.postRequestFailed + : BrowserAuthErrorCodes.noNetworkConnectivity + ), + undefined, + undefined, + e as Error ); } @@ -109,7 +120,8 @@ export class FetchClient implements INetworkModule { BrowserAuthErrorCodes.failedToParseResponse ), responseStatus, - responseHeaders + responseHeaders, + e as Error ); } } @@ -131,8 +143,11 @@ function getFetchHeaders(options?: NetworkRequestOptions): Headers { }); return headers; } catch (e) { - throw createBrowserAuthError( - BrowserAuthErrorCodes.failedToBuildHeaders + throw createNetworkError( + createBrowserAuthError(BrowserAuthErrorCodes.failedToBuildHeaders), + undefined, + undefined, + e as Error ); } } diff --git a/lib/msal-browser/src/packageMetadata.ts b/lib/msal-browser/src/packageMetadata.ts index 102495760b..3b48dddc64 100644 --- a/lib/msal-browser/src/packageMetadata.ts +++ b/lib/msal-browser/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-browser"; -export const version = "4.11.0"; +export const version = "4.12.0"; diff --git a/lib/msal-browser/src/protocol/Authorize.ts b/lib/msal-browser/src/protocol/Authorize.ts index 626314cefa..b68d07a072 100644 --- a/lib/msal-browser/src/protocol/Authorize.ts +++ b/lib/msal-browser/src/protocol/Authorize.ts @@ -40,10 +40,10 @@ import { import { AuthenticationResult } from "../response/AuthenticationResult.js"; import { InteractionHandler } from "../interaction_handler/InteractionHandler.js"; import { BrowserCacheManager } from "../cache/BrowserCacheManager.js"; -import { NativeInteractionClient } from "../interaction_client/NativeInteractionClient.js"; -import { NativeMessageHandler } from "../broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthInteractionClient } from "../interaction_client/PlatformAuthInteractionClient.js"; import { EventHandler } from "../event/EventHandler.js"; import { decryptEarResponse } from "../crypto/BrowserCrypto.js"; +import { IPlatformAuthHandler } from "../broker/nativeBroker/IPlatformAuthHandler.js"; /** * Returns map of parameters that are applicable to all calls to /authorize whether using PKCE or EAR @@ -253,15 +253,17 @@ export async function handleResponsePlatformBroker( eventHandler: EventHandler, logger: Logger, performanceClient: IPerformanceClient, - nativeMessageHandler?: NativeMessageHandler + platformAuthProvider?: IPlatformAuthHandler ): Promise { - if (!nativeMessageHandler) { + logger.verbose("Account id found, calling WAM for token"); + + if (!platformAuthProvider) { throw createBrowserAuthError( BrowserAuthErrorCodes.nativeConnectionNotEstablished ); } const browserCrypto = new CryptoOps(logger, performanceClient); - const nativeInteractionClient = new NativeInteractionClient( + const nativeInteractionClient = new PlatformAuthInteractionClient( config, browserStorage, browserCrypto, @@ -270,7 +272,7 @@ export async function handleResponsePlatformBroker( config.system.navigationClient, apiId, performanceClient, - nativeMessageHandler, + platformAuthProvider, accountId, nativeStorage, request.correlationId @@ -315,7 +317,7 @@ export async function handleResponseCode( eventHandler: EventHandler, logger: Logger, performanceClient: IPerformanceClient, - nativeMessageHandler?: NativeMessageHandler + platformAuthProvider?: IPlatformAuthHandler ): Promise { // Remove throttle if it exists ThrottlingUtils.removeThrottle( @@ -340,7 +342,7 @@ export async function handleResponseCode( eventHandler, logger, performanceClient, - nativeMessageHandler + platformAuthProvider ); } const authCodeRequest: CommonAuthorizationCodeRequest = { @@ -394,7 +396,7 @@ export async function handleResponseEAR( eventHandler: EventHandler, logger: Logger, performanceClient: IPerformanceClient, - nativeMessageHandler?: NativeMessageHandler + platformAuthProvider?: IPlatformAuthHandler ): Promise { // Remove throttle if it exists ThrottlingUtils.removeThrottle( @@ -441,7 +443,7 @@ export async function handleResponseEAR( eventHandler, logger, performanceClient, - nativeMessageHandler + platformAuthProvider ); } diff --git a/lib/msal-browser/src/utils/BrowserConstants.ts b/lib/msal-browser/src/utils/BrowserConstants.ts index 686e8271b9..750c5318fc 100644 --- a/lib/msal-browser/src/utils/BrowserConstants.ts +++ b/lib/msal-browser/src/utils/BrowserConstants.ts @@ -41,10 +41,15 @@ export const BrowserConstants = { MSAL_SKU: "msal.js.browser", }; -export const NativeConstants = { +export const PlatformAuthConstants = { CHANNEL_ID: "53ee284d-920a-4b59-9d30-a60315b26836", PREFERRED_EXTENSION_ID: "ppnbnpeolgkicgegkbkbjmhlideopiji", MATS_TELEMETRY: "MATS", + MICROSOFT_ENTRA_BROKERID: "MicrosoftEntra", + DOM_API_NAME: "DOM API", + PLATFORM_DOM_APIS: "get-token-and-sign-out", + PLATFORM_DOM_PROVIDER: "PlatformAuthDOMHandler", + PLATFORM_EXTENSION_PROVIDER: "PlatformAuthExtensionHandler", }; export const NativeExtensionMethod = { @@ -248,3 +253,5 @@ export const LOG_LEVEL_CACHE_KEY = "msal.browser.log.level"; export const LOG_PII_CACHE_KEY = "msal.browser.log.pii"; export const BROWSER_PERF_ENABLED_KEY = "msal.browser.performance.enabled"; + +export const PLATFORM_AUTH_DOM_SUPPORT = "msal.browser.platform.auth.dom"; diff --git a/lib/msal-browser/src/utils/MsalFrameStatsUtils.ts b/lib/msal-browser/src/utils/MsalFrameStatsUtils.ts new file mode 100644 index 0000000000..cc71305004 --- /dev/null +++ b/lib/msal-browser/src/utils/MsalFrameStatsUtils.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */ + +import { InProgressPerformanceEvent, Logger } from "@azure/msal-common/browser"; + +export function collectInstanceStats( + currentClientId: string, + performanceEvent: InProgressPerformanceEvent, + logger: Logger +): void { + const frameInstances: string[] = + // @ts-ignore + window.msal?.clientIds || []; + + const msalInstanceCount = frameInstances.length; + + const sameClientIdInstanceCount = frameInstances.filter( + (i) => i === currentClientId + ).length; + + if (sameClientIdInstanceCount > 1) { + logger.warning( + "There is already an instance of MSAL.js in the window with the same client id." + ); + } + performanceEvent.add({ + msalInstanceCount: msalInstanceCount, + sameClientIdInstanceCount: sameClientIdInstanceCount, + }); +} diff --git a/lib/msal-browser/test/app/PublicClientApplication.spec.ts b/lib/msal-browser/test/app/PublicClientApplication.spec.ts index cdc6f94243..0d875bcba0 100644 --- a/lib/msal-browser/test/app/PublicClientApplication.spec.ts +++ b/lib/msal-browser/test/app/PublicClientApplication.spec.ts @@ -60,7 +60,7 @@ import { BrowserConstants, CacheLookupPolicy, InteractionType, - NativeConstants, + PlatformAuthConstants, TemporaryCacheKeys, WrapperSKU, } from "../../src/utils/BrowserConstants.js"; @@ -95,9 +95,10 @@ import { } from "../../src/index.js"; import { SilentAuthCodeClient } from "../../src/interaction_client/SilentAuthCodeClient.js"; import { BrowserCacheManager } from "../../src/cache/BrowserCacheManager.js"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; -import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient.js"; -import { NativeTokenRequest } from "../../src/broker/nativeBroker/NativeRequest.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; +import * as PlatformAuthProvider from "../../src/broker/nativeBroker/PlatformAuthProvider.js"; +import { PlatformAuthInteractionClient } from "../../src/interaction_client/PlatformAuthInteractionClient.js"; +import { PlatformBrokerRequest } from "../../src/broker/nativeBroker/PlatformBrokerRequest.js"; import { NativeAuthError } from "../../src/error/NativeAuthError.js"; import { StandardController } from "../../src/controllers/StandardController.js"; import { AuthenticationResult } from "../../src/response/AuthenticationResult.js"; @@ -116,6 +117,9 @@ import { TestTimeUtils, } from "msal-test-utils"; import { INTERACTION_TYPE } from "../../src/utils/BrowserConstants.js"; +import { BaseOperatingContext } from "../../src/operatingcontext/BaseOperatingContext.js"; +import { PlatformAuthDOMHandler } from "../../src/broker/nativeBroker/PlatformAuthDOMHandler.js"; +import { config } from "process"; const cacheConfig = { temporaryCacheLocation: BrowserCacheLocation.SessionStorage, @@ -135,7 +139,7 @@ let testAppConfig = { }, }; -function stubProvider(config: Configuration) { +function stubExtensionProvider(config: Configuration) { const browserEnvironment = typeof window !== "undefined"; const newConfig = buildConfiguration(config, browserEnvironment); @@ -145,11 +149,10 @@ function stubProvider(config: Configuration) { "unittest" ); const performanceClient = newConfig.telemetry.client; - return jest - .spyOn(NativeMessageHandler, "createProvider") + .spyOn(PlatformAuthExtensionHandler, "createProvider") .mockImplementation(async () => { - return new NativeMessageHandler( + return new PlatformAuthExtensionHandler( logger, 2000, performanceClient, @@ -158,6 +161,27 @@ function stubProvider(config: Configuration) { }); } +function stubDOMProvider(config: Configuration) { + const browserEnvironment = typeof window !== "undefined"; + + const newConfig = buildConfiguration(config, browserEnvironment); + const logger = new Logger( + newConfig.system.loggerOptions, + "unittest", + "unittest" + ); + const performanceClient = newConfig.telemetry.client; + return jest + .spyOn(PlatformAuthDOMHandler, "createProvider") + .mockImplementation(async () => { + return new PlatformAuthDOMHandler( + logger, + performanceClient, + "test-correlation-id" + ); + }); +} + const testRequest: CommonAuthorizationUrlRequest = { redirectUri: `${TEST_URIS.DEFAULT_INSTANCE}/`, scopes: TEST_CONFIG.DEFAULT_SCOPES, @@ -239,6 +263,17 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(pca instanceof PublicClientApplication).toBeTruthy(); done(); }); + + it("Sets isBroker to false", () => { + const config = { + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + }; + pca = new PublicClientApplication(config); + // @ts-ignore + expect(pca.isBroker).toBe(false); + }); }); describe("initialize tests", () => { @@ -274,7 +309,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { ); // @ts-ignore const handshakeSpy: jest.SpyInstance = jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, // @ts-ignore "sendHandshakeRequest" ); @@ -287,8 +322,9 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { event.stopImmediatePropagation(); const request = event.data; const req = { - channel: NativeConstants.CHANNEL_ID, - extensionId: NativeConstants.PREFERRED_EXTENSION_ID, + channel: PlatformAuthConstants.CHANNEL_ID, + extensionId: + PlatformAuthConstants.PREFERRED_EXTENSION_ID, responseId: request.responseId, body: { method: "HandshakeResponse", @@ -327,7 +363,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { // @ts-ignore expect( (apps[i] as any).controller.getNativeExtensionProvider() - ).toBeInstanceOf(NativeMessageHandler); + ).toBeInstanceOf(PlatformAuthExtensionHandler); } } finally { for (const port of ports) { @@ -364,7 +400,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { ); // @ts-ignore const createProviderSpy: jest.SpyInstance = jest.spyOn( - NativeMessageHandler, + PlatformAuthExtensionHandler, "createProvider" ); @@ -376,8 +412,9 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { event.stopImmediatePropagation(); const request = event.data; const req = { - channel: NativeConstants.CHANNEL_ID, - extensionId: NativeConstants.PREFERRED_EXTENSION_ID, + channel: PlatformAuthConstants.CHANNEL_ID, + extensionId: + PlatformAuthConstants.PREFERRED_EXTENSION_ID, responseId: request.responseId, body: { method: "HandshakeResponse", @@ -435,7 +472,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { } }); - it("creates extension provider if allowPlatformBroker is true", async () => { + it("creates platform auth extension handler if allowPlatformBroker is true", async () => { const config = { auth: { clientId: TEST_CONFIG.MSAL_CLIENT_ID, @@ -444,9 +481,22 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { allowPlatformBroker: true, }, }; + + jest.spyOn( + PlatformAuthProvider, + "isDomEnabledForPlatformAuth" + ).mockImplementation(() => { + return false; + }); + + const getPlatformAuthProviderSpy = jest.spyOn( + PlatformAuthProvider, + "getPlatformAuthProvider" + ); + pca = new PublicClientApplication(config); - const createProviderSpy = stubProvider(config); + const createExtensionProviderSpy = stubExtensionProvider(config); await pca.initialize(); @@ -454,39 +504,82 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any pca = (pca as any).controller; - expect(createProviderSpy).toHaveBeenCalled(); + expect(getPlatformAuthProviderSpy).toHaveBeenCalled(); + expect(createExtensionProviderSpy).toHaveBeenCalled(); // @ts-ignore - expect(pca.nativeExtensionProvider).toBeInstanceOf( - NativeMessageHandler + expect(pca.platformAuthProvider).toBeInstanceOf( + PlatformAuthExtensionHandler ); }); it("does not create extension provider if allowPlatformBroker is false", async () => { - const createProviderSpy = jest.spyOn( - NativeMessageHandler, - "createProvider" + const getPlatformAuthProviderSpy = jest.spyOn( + PlatformAuthProvider, + "getPlatformAuthProvider" ); - pca = new PublicClientApplication({ + + const config = { auth: { clientId: TEST_CONFIG.MSAL_CLIENT_ID, }, system: { allowPlatformBroker: false, }, - }); + }; + + pca = new PublicClientApplication(config); + const createProviderSpy = stubExtensionProvider(config); + await pca.initialize(); //Implementation of PCA was moved to controller. pca = (pca as any).controller; expect(createProviderSpy).toHaveBeenCalledTimes(0); + expect(getPlatformAuthProviderSpy).not.toHaveBeenCalled(); + // @ts-ignore + expect(pca.platformAuthProvider).toBeUndefined(); + }); + + it("creates platform auth dom handler if allowPlatformBroker is true and dom APIs are present", async () => { + const getPlatformAuthProviderSpy = jest.spyOn( + PlatformAuthProvider, + "getPlatformAuthProvider" + ); + + const config = { + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowPlatformBroker: true, + }, + }; + + pca = new PublicClientApplication(config); + window.sessionStorage.setItem( + "msal.browser.platform.auth.dom", + "true" + ); + + const createDOMProviderSpy = stubDOMProvider(config); + await pca.initialize(); + + // Implementation of PCA was moved to controller. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + pca = (pca as any).controller; + + expect(getPlatformAuthProviderSpy).toHaveBeenCalled(); + expect(createDOMProviderSpy).toHaveBeenCalled(); // @ts-ignore - expect(pca.nativeExtensionProvider).toBeUndefined(); + expect(pca.platformAuthProvider).toBeInstanceOf( + PlatformAuthDOMHandler + ); }); it("catches error if extension provider fails to initialize", async () => { const createProviderSpy = jest - .spyOn(NativeMessageHandler, "createProvider") + .spyOn(PlatformAuthExtensionHandler, "createProvider") .mockRejectedValue(new Error("testError")); pca = new PublicClientApplication({ auth: { @@ -503,7 +596,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(createProviderSpy).toHaveBeenCalled(); // @ts-ignore - expect(pca.nativeExtensionProvider).toBeUndefined(); + expect(pca.platformAuthProvider).toBeUndefined(); }); it("reports telemetry event using provided correlation id", (done) => { @@ -581,6 +674,26 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(preGenerateSpy).toHaveBeenCalledTimes(1); }); + + it("passes in isBroker in request", async () => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowPlatformBroker: false, + }, + }); + const initializeControllerSpy = jest.spyOn( + StandardController.prototype, + "initialize" + ); + await pca.initialize(); + expect(initializeControllerSpy).toHaveBeenCalledWith( + undefined, + false + ); + }); }); describe("handleRedirectPromise", () => { @@ -734,7 +847,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); // Implementation of PCA was moved to controller. @@ -770,7 +883,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { "isInteractionInProgress" ).mockReturnValue(true); - const nativeRequest: NativeTokenRequest = { + const nativeRequest: PlatformBrokerRequest = { authority: TEST_CONFIG.validAuthority, clientId: TEST_CONFIG.MSAL_CLIENT_ID, scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), @@ -787,7 +900,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { ); const redirectClientSpy: jest.SpyInstance = jest .spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "handleRedirectPromise" ) .mockImplementation(() => { @@ -828,7 +941,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }, }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); pca.initialize().then(() => { const callbackId = pca.addPerformanceCallback((events) => { @@ -889,7 +1002,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { "getCachedRequest" ).mockReturnValue([testRequest, TEST_CONFIG.TEST_VERIFIER]); - const nativeRequest: NativeTokenRequest = { + const nativeRequest: PlatformBrokerRequest = { authority: TEST_CONFIG.validAuthority, clientId: TEST_CONFIG.MSAL_CLIENT_ID, scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), @@ -908,7 +1021,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { testAccount, ]); jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "handleRedirectPromise" ).mockResolvedValue(testTokenResponse); @@ -927,12 +1040,12 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); //@ts-ignore pca.controller.browserStorage.setInteractionInProgress(true); - const nativeRequest: NativeTokenRequest = { + const nativeRequest: PlatformBrokerRequest = { authority: TEST_CONFIG.validAuthority, clientId: TEST_CONFIG.MSAL_CLIENT_ID, scope: TEST_CONFIG.DEFAULT_SCOPES.join(" "), @@ -949,7 +1062,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { ); const redirectClientSpy: jest.SpyInstance = jest .spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "handleRedirectPromise" ) .mockRejectedValue(new Error("testerror")); @@ -1527,7 +1640,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -1548,7 +1661,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { const nativeAcquireTokenSpy = jest .spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireTokenRedirect" ) .mockResolvedValue(); @@ -1582,7 +1695,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); const callbackId = pca.addPerformanceCallback((events) => { expect(events.length).toBeGreaterThanOrEqual(1); @@ -1621,7 +1734,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { pca = new PublicClientApplication(config); await pca.initialize(); - stubProvider(config); + stubExtensionProvider(config); //Implementation of PCA was moved to controller. pca = (pca as any).controller; @@ -1636,7 +1749,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy = jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireTokenRedirect" ); const redirectSpy: jest.SpyInstance = jest @@ -1663,7 +1776,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); // Implementation of PCA was moved to controller. @@ -1681,7 +1794,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { const nativeAcquireTokenSpy: jest.SpyInstance = jest .spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireTokenRedirect" ) .mockRejectedValue( @@ -1710,7 +1823,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); // Implementation of PCA was moved to controller. @@ -1728,7 +1841,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { const nativeAcquireTokenSpy: jest.SpyInstance = jest .spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireTokenRedirect" ) .mockRejectedValue( @@ -1759,7 +1872,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //PCA implementation moved to controller @@ -1776,7 +1889,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { const nativeAcquireTokenSpy: jest.SpyInstance = jest .spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireTokenRedirect" ) .mockRejectedValue(new Error("testError")); @@ -2062,7 +2175,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }, }; - stubProvider(config); + stubExtensionProvider(config); pca = new PublicClientApplication({ ...config, telemetry: { @@ -2466,7 +2579,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -2500,7 +2613,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { ); const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockImplementation(async (request) => { expect(request.correlationId).toBe(RANDOM_TEST_GUID); return testTokenResponse; @@ -2529,7 +2642,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); const testAccount: AccountInfo = { @@ -2556,7 +2669,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ); const popupSpy: jest.SpyInstance = jest @@ -2584,7 +2697,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -2614,7 +2727,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue( new NativeAuthError("ContentError", "error in extension") ); @@ -2642,7 +2755,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -2672,7 +2785,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockImplementation(() => { throw createInteractionRequiredAuthError( InteractionRequiredAuthErrorCodes.nativeAccountUnavailable @@ -2702,7 +2815,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //PCA implementation moved to controller @@ -2718,7 +2831,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue(new Error("testError")); const popupSpy: jest.SpyInstance = jest .spyOn(PopupClient.prototype, "acquireToken") @@ -3255,7 +3368,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -3285,7 +3398,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockResolvedValue(testTokenResponse); const silentSpy: jest.SpyInstance = jest .spyOn(SilentIframeClient.prototype, "acquireToken") @@ -3312,7 +3425,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -3342,7 +3455,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue( new NativeAuthError("ContentError", "error in extension") ); @@ -3370,7 +3483,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -3386,7 +3499,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue(new Error("testError")); const silentSpy: jest.SpyInstance = jest .spyOn(SilentIframeClient.prototype, "acquireToken") @@ -3661,7 +3774,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -3691,7 +3804,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockResolvedValue(testTokenResponse); const response = await pca.acquireTokenByCode({ scopes: ["User.Read"], @@ -3713,14 +3826,14 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. pca = (pca as any).controller; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue( new NativeAuthError( "ContentError", @@ -3751,7 +3864,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { await pca.initialize(); const nativeAcquireTokenSpy = jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ); @@ -4159,7 +4272,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -4189,7 +4302,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockResolvedValue(testTokenResponse); const silentSpy: jest.SpyInstance = jest .spyOn(SilentIframeClient.prototype, "acquireToken") @@ -4216,7 +4329,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -4246,7 +4359,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue( new NativeAuthError("ContentError", "error in extension") ); @@ -4276,7 +4389,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. pca = (pca as any).controller; @@ -4291,7 +4404,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn(PlatformAuthInteractionClient.prototype, "acquireToken") .mockRejectedValue(new Error("testError")); const silentSpy: jest.SpyInstance = jest .spyOn(SilentIframeClient.prototype, "acquireToken") @@ -6121,7 +6234,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(silentIframeSpy).toHaveBeenCalledTimes(0); }); - it("Calls SilentCacheClient.acquireToken, and calls NativeInteractionClient.acquireToken when CacheLookupPolicy is set to AccessToken", async () => { + it("Calls SilentCacheClient.acquireToken, and calls PlatformAuthInteractionClient.acquireToken when CacheLookupPolicy is set to AccessToken", async () => { const silentCacheSpy: jest.SpyInstance = jest .spyOn(SilentCacheClient.prototype, "acquireToken") .mockRejectedValue(refreshRequiredCacheError); @@ -6132,11 +6245,14 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { .spyOn(SilentIframeClient.prototype, "acquireToken") .mockImplementation(); - const isPlatformBrokerAvailableSpy = jest - .spyOn(NativeMessageHandler, "isPlatformBrokerAvailable") + const isBrokerAvailableSpy = jest + .spyOn(PlatformAuthProvider, "isBrokerAvailable") .mockReturnValue(true); const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn( + PlatformAuthInteractionClient.prototype, + "acquireToken" + ) .mockImplementation(); const cacheAccount = testAccount; cacheAccount.nativeAccountId = "nativeAccountId"; @@ -6160,7 +6276,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(nativeAcquireTokenSpy).toHaveBeenCalledTimes(0); nativeAcquireTokenSpy.mockRestore(); - isPlatformBrokerAvailableSpy.mockRestore(); + isBrokerAvailableSpy.mockRestore(); }); it("Calls SilentRefreshClient.acquireToken, and does not call SilentCacheClient.acquireToken or SilentIframeClient.acquireToken if refresh token is expired when CacheLookupPolicy is set to RefreshToken", async () => { @@ -6197,13 +6313,16 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { .spyOn(SilentIframeClient.prototype, "acquireToken") .mockImplementation(); const nativeAcquireTokenSpy: jest.SpyInstance = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn( + PlatformAuthInteractionClient.prototype, + "acquireToken" + ) .mockImplementation(); const cacheAccount = testAccount; cacheAccount.nativeAccountId = "nativeAccountId"; - const isPlatformBrokerAvailableSpy = jest - .spyOn(NativeMessageHandler, "isPlatformBrokerAvailable") + const isBrokerAvailableSpy = jest + .spyOn(PlatformAuthProvider, "isBrokerAvailable") .mockReturnValue(true); testAccount.nativeAccountId = "nativeAccountId"; @@ -6226,7 +6345,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(silentIframeSpy).toHaveBeenCalledTimes(0); expect(nativeAcquireTokenSpy).toHaveBeenCalledTimes(0); nativeAcquireTokenSpy.mockRestore(); - isPlatformBrokerAvailableSpy.mockRestore(); + isBrokerAvailableSpy.mockRestore(); }); it("Calls SilentRefreshClient.acquireToken, and does not call SilentCacheClient.acquireToken or SilentIframeClient.acquireToken if refresh token is expired when CacheLookupPolicy is set to RefreshToken", async () => { @@ -6553,12 +6672,70 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(accounts).toEqual([]); }); + it("getAllAccounts throws if called before initialize", (done) => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + cache: { + cacheLocation: "localStorage", + }, + }); + + window.localStorage.setItem( + "msal.account.keys", + JSON.stringify([ + AccountEntityUtils.generateAccountKey(testAccount1), + ]) + ); + + try { + pca.getAllAccounts(); + } catch (e) { + expect(e).toEqual( + createBrowserAuthError( + BrowserAuthErrorCodes.uninitializedPublicClientApplication + ) + ); + done(); + } + }); + describe("getAccount", () => { it("getAccount returns null if empty filter is passed in", () => { const account = pca.getAccount({}); expect(account).toBe(null); }); + it("getAccount throws if called before initialize", (done) => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + cache: { + cacheLocation: "localStorage", + }, + }); + + window.localStorage.setItem( + "msal.account.keys", + JSON.stringify([ + AccountEntityUtils.generateAccountKey(testAccount1), + ]) + ); + + try { + pca.getAccount({ username: testAccount1.username }); + } catch (e) { + expect(e).toEqual( + createBrowserAuthError( + BrowserAuthErrorCodes.uninitializedPublicClientApplication + ) + ); + done(); + } + }); + describe("loginHint filter", () => { it("getAccount returns account specified using login_hint", () => { const account = pca.getAccount({ @@ -6689,6 +6866,42 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(pca.getActiveAccount()).toBe(null); }); + it("getActiveAccount throws if called before initialize", (done) => { + pca = new PublicClientApplication({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + cache: { + cacheLocation: "localStorage", + }, + }); + + window.localStorage.setItem( + `msal.${TEST_CONFIG.MSAL_CLIENT_ID}.active-account-filters`, + JSON.stringify({ + homeAccountId: testAccount1.homeAccountId, + localAccountId: testAccount1.localAccountId, + }) + ); + window.localStorage.setItem( + "msal.account.keys", + JSON.stringify([ + AccountEntityUtils.generateAccountKey(testAccount1), + ]) + ); + + try { + pca.getActiveAccount(); + } catch (e) { + expect(e).toEqual( + createBrowserAuthError( + BrowserAuthErrorCodes.uninitializedPublicClientApplication + ) + ); + done(); + } + }); + it("setActiveAccount() sets the active account local id value correctly", () => { expect(pca.getActiveAccount()).toBe(null); pca.setActiveAccount(testAccountInfo1); @@ -6973,7 +7186,7 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { }; pca = new PublicClientApplication(config); - stubProvider(config); + stubExtensionProvider(config); await pca.initialize(); //Implementation of PCA was moved to controller. @@ -7434,4 +7647,123 @@ describe("PublicClientApplication.ts Class Unit Tests", () => { expect(pkce1?.challenge !== pkce2?.challenge).toBeTruthy(); }); }); + describe("Multi-instance tests", () => { + afterEach(() => { + // @ts-ignore + window.msal.clientIds = []; + // @ts-ignore + window.msal = {}; + }); + it("Logs warning if there are two applications with the same client id in the same frame", async () => { + const msalConfig: Configuration = { + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowPlatformBroker: false, + loggerOptions: { + logLevel: LogLevel.Verbose, + loggerCallback: jest.fn(), + }, + }, + }; + pca = new PublicClientApplication(msalConfig); + await pca.initialize(); + const pca2 = new PublicClientApplication(msalConfig); + const logger = pca2.getLogger(); + const loggerCallbackStub = jest + .spyOn(logger, "executeCallback") + .mockImplementation(); + await pca2.initialize(); + expect(loggerCallbackStub).toHaveBeenCalledWith( + LogLevel.Warning, + expect.stringContaining( + "There is already an instance of MSAL.js in the window with the same client id." + ), + false + ); + }); + + it("Logs verbose if there are two applications with different client ids in the same frame", async () => { + const msalConfig: Configuration = { + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + system: { + allowPlatformBroker: false, + loggerOptions: { + logLevel: LogLevel.Verbose, + loggerCallback: jest.fn(), + }, + }, + }; + pca = new PublicClientApplication(msalConfig); + await pca.initialize(); + const pca2 = new PublicClientApplication({ + ...msalConfig, + auth: { clientId: "differentClientId" }, + }); + const logger = pca2.getLogger(); + const loggerCallbackStub = jest + .spyOn(logger, "executeCallback") + .mockImplementation(); + await pca2.initialize(); + expect(loggerCallbackStub).toHaveBeenCalledWith( + LogLevel.Verbose, + expect.stringContaining( + "There is already an instance of MSAL.js in the window." + ), + false + ); + }); + + it("Reports in telemetry the number of applications in the same frame (different client ids)", async () => { + await pca.initialize(); + + const pca2 = new PublicClientApplication({ + ...pca.getConfiguration(), + auth: { clientId: "different-client-id" }, + }); + + const telemetryPromise = new Promise((resolve) => { + const callbackId = pca2.addPerformanceCallback((events) => { + expect(events.length).toEqual(1); + const event = events[0]; + expect(event.name).toBe( + PerformanceEvents.InitializeClientApplication + ); + expect(event.msalInstanceCount).toEqual(2); + expect(event.sameClientIdInstanceCount).toEqual(1); + pca.removePerformanceCallback(callbackId); + resolve(); + }); + }); + + await pca2.initialize(); + await telemetryPromise; + }); + + it("Reports in telemetry the number of applications in the same frame (same client ids)", async () => { + await pca.initialize(); + + const pca2 = new PublicClientApplication(pca.getConfiguration()); + + const telemetryPromise = new Promise((resolve) => { + const callbackId = pca2.addPerformanceCallback((events) => { + expect(events.length).toEqual(1); + const event = events[0]; + expect(event.name).toBe( + PerformanceEvents.InitializeClientApplication + ); + expect(event.msalInstanceCount).toEqual(2); + expect(event.sameClientIdInstanceCount).toEqual(2); + pca.removePerformanceCallback(callbackId); + resolve(); + }); + }); + + await pca2.initialize(); + await telemetryPromise; + }); + }); }); diff --git a/lib/msal-browser/test/broker/PlatformAuthDOMHandler.spec.ts b/lib/msal-browser/test/broker/PlatformAuthDOMHandler.spec.ts new file mode 100644 index 0000000000..6e556bd592 --- /dev/null +++ b/lib/msal-browser/test/broker/PlatformAuthDOMHandler.spec.ts @@ -0,0 +1,458 @@ +import { + AuthError, + AuthErrorCodes, + IPerformanceClient, + Logger, +} from "@azure/msal-common/browser"; +import { PlatformAuthConstants } from "../../src/utils/BrowserConstants.js"; +import { getDefaultPerformanceClient } from "../utils/TelemetryUtils.js"; +import { PlatformAuthDOMHandler } from "../../src/broker/nativeBroker/PlatformAuthDOMHandler.js"; +import { get } from "http"; +import { PlatformBrokerResponse } from "../../src/broker/nativeBroker/PlatformBrokerResponse.js"; +import { + TEST_CONFIG, + TEST_TOKENS, + TEST_URIS, +} from "../utils/StringConstants.js"; +import { PlatformBrokerRequest } from "../../src/broker/nativeBroker/PlatformBrokerRequest.js"; +import { NativeAuthError } from "../../src/error/NativeAuthError.js"; + +describe("PlatformAuthDOMHandler tests", () => { + let performanceClient: IPerformanceClient; + let logger: Logger; + + let getSupportedContractsMock: jest.Mock; + let executeGetTokenMock: jest.Mock; + beforeEach(() => { + performanceClient = getDefaultPerformanceClient(); + logger = new Logger({}, "test", "1.0.0"); + + getSupportedContractsMock = jest.fn(); + executeGetTokenMock = jest.fn(); + Object.defineProperty(window.navigator, "platformAuthentication", { + value: { + getSupportedContracts: getSupportedContractsMock, + executeGetToken: executeGetTokenMock, + }, + writable: true, + }); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe("createProvider tests", () => { + it("should return PlatformAuthDOMHandler when DOM APIs are available for platform auth", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(getSupportedContractsMock).toHaveBeenCalled(); + expect(platformAuthDOMHandler).toBeInstanceOf( + PlatformAuthDOMHandler + ); + }); + + it("should return undefined when DOM APIs are not available for platform auth", async () => { + getSupportedContractsMock.mockResolvedValue([]); + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(getSupportedContractsMock).toHaveBeenCalled(); + expect(platformAuthDOMHandler).toBe(undefined); + }); + }); + + describe("getExtensionId tests", () => { + it("should return the correct extension ID", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(platformAuthDOMHandler).toBeInstanceOf( + PlatformAuthDOMHandler + ); + const brokerId = platformAuthDOMHandler?.getExtensionId(); + expect(brokerId).toBe( + PlatformAuthConstants.MICROSOFT_ENTRA_BROKERID + ); + }); + }); + + describe("getExtensionVersion tests", () => { + it("should return empty string for extensionVersion", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(platformAuthDOMHandler).toBeInstanceOf( + PlatformAuthDOMHandler + ); + const brokerId = platformAuthDOMHandler?.getExtensionVersion(); + expect(brokerId).toBe(""); + }); + }); + + describe("getExtensionName tests", () => { + it("should return corect extensionName", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(platformAuthDOMHandler).toBeInstanceOf( + PlatformAuthDOMHandler + ); + const brokerId = platformAuthDOMHandler?.getExtensionName(); + expect(brokerId).toBe(PlatformAuthConstants.DOM_API_NAME); + }); + }); + + describe("sendMessage and validatePlatformBrokerResponse tests", () => { + it("returns PlatformBrokerResponse success response for valid request to DOM API", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const testRequest: PlatformBrokerRequest = { + accountId: "test-id", + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + authority: TEST_CONFIG.validAuthority, + redirectUri: TEST_URIS.TEST_REDIR_URI, + scope: "read openid", + correlationId: TEST_CONFIG.CORRELATION_ID, + windowTitleSubstring: "", + extraParameters: { + extendedExpiryToken: "true", + }, + }; + const testDOMResponse: object = { + isSuccess: true, + state: "", + accessToken: TEST_TOKENS.ACCESS_TOKEN, + expiresIn: 6000, + account: { + id: "test-id", + userName: "test-user", + properties: {}, + }, + clientInfo: "test-client-info", + idToken: TEST_TOKENS.IDTOKEN_V1, + scopes: "read openid", + error: {}, + properties: { + MATS: '{"MATS":"{"x_ms_clitelem":"1,0,0,,I","ui_visible":true}"}', + }, + extendedLifetimeToken: true, + }; + const validatedResponse: PlatformBrokerResponse = { + access_token: TEST_TOKENS.ACCESS_TOKEN, + account: { + id: "test-id", + userName: "test-user", + properties: {}, + }, + client_info: "test-client-info", + expires_in: 6000, + id_token: TEST_TOKENS.IDTOKEN_V1, + properties: { + MATS: '{"MATS":"{"x_ms_clitelem":"1,0,0,,I","ui_visible":true}"}', + }, + scope: "read openid", + state: "", + extendedLifetimeToken: true, + shr: undefined, + }; + executeGetTokenMock.mockResolvedValue(testDOMResponse); + + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + const platformBrokerResponse = + await platformAuthDOMHandler?.sendMessage(testRequest); + expect(platformBrokerResponse).toEqual(validatedResponse); + }); + + it("returns unexpected_error when token response is missing required properties with isSuccess = true", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const testRequest: PlatformBrokerRequest = { + accountId: "test-id", + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + authority: TEST_CONFIG.validAuthority, + redirectUri: TEST_URIS.TEST_REDIR_URI, + scope: "read openid", + correlationId: TEST_CONFIG.CORRELATION_ID, + windowTitleSubstring: "", + extraParameters: { + extendedExpiryToken: "true", + }, + }; + const testDOMResponse: object = { + isSuccess: true, + state: "", + expiresIn: 6000, + account: { + id: "test-id", + userName: "test-user", + properties: {}, + }, + clientInfo: "test-client-info", + scopes: "read openid", + error: {}, + properties: { + MATS: '{"MATS":"{"x_ms_clitelem":"1,0,0,,I","ui_visible":true}"}', + }, + extendedLifetimeToken: true, + }; + + executeGetTokenMock.mockResolvedValue(testDOMResponse); + + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + try { + const platformBrokerResponse = + await platformAuthDOMHandler?.sendMessage(testRequest); + throw "sendMessage should have thrown an error"; + } catch (e) { + expect(e).toBeInstanceOf(AuthError); + expect((e as AuthError).errorCode).toEqual( + AuthErrorCodes.unexpectedError + ); + expect((e as AuthError).errorMessage).toContain( + "Response missing expected properties." + ); + } + }); + + it("returns unexpected_error when required error properties missing from response with isSuccess = false", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const testRequest: PlatformBrokerRequest = { + accountId: "test-id", + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + authority: TEST_CONFIG.validAuthority, + redirectUri: TEST_URIS.TEST_REDIR_URI, + scope: "read openid", + correlationId: TEST_CONFIG.CORRELATION_ID, + windowTitleSubstring: "", + extraParameters: { + extendedExpiryToken: "true", + }, + }; + const testDOMResponse: object = { + isSuccess: false, + expiresIn: 0, + extendedLifetimeToken: false, + error: {}, + }; + + executeGetTokenMock.mockResolvedValue(testDOMResponse); + + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + try { + const platformBrokerResponse = + await platformAuthDOMHandler?.sendMessage(testRequest); + throw "sendMessage should have thrown an error"; + } catch (e) { + expect(e).toBeInstanceOf(AuthError); + expect((e as AuthError).errorCode).toEqual( + AuthErrorCodes.unexpectedError + ); + expect((e as AuthError).errorMessage).toContain( + "Response missing expected properties." + ); + } + }); + + it("returns nativeAuthError response for unsuccessful token request", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const testRequest: PlatformBrokerRequest = { + accountId: "test-id", + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + authority: TEST_CONFIG.validAuthority, + redirectUri: TEST_URIS.TEST_REDIR_URI, + scope: "read openid", + correlationId: TEST_CONFIG.CORRELATION_ID, + windowTitleSubstring: "", + extraParameters: { + extendedExpiryToken: "true", + }, + }; + const testDOMResponse: object = { + isSuccess: false, + expiresIn: 0, + extendedLifetimeToken: false, + error: { + code: "OSError", + description: "there is an OSError", + errorCode: "-6000", + protocolError: "-5000", + status: "PERSISTENT_ERROR", + properties: {}, + }, + }; + executeGetTokenMock.mockResolvedValue(testDOMResponse); + + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + try { + const platformBrokerResponse = + await platformAuthDOMHandler?.sendMessage(testRequest); + throw "sendMessage should have thrown an error"; + } catch (e) { + expect(e).toBeInstanceOf(NativeAuthError); + expect((e as NativeAuthError).errorCode).toEqual("OSError"); + expect((e as NativeAuthError).errorMessage).toEqual( + (testDOMResponse as any).error.description + ); + } + }); + }); + + describe("initializePlatformDOMRequest tests", () => { + it("should return a valid PlatformDOMTokenRequest object", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + const testRequest: PlatformBrokerRequest = { + accountId: "test-id", + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + authority: TEST_CONFIG.validAuthority, + redirectUri: TEST_URIS.TEST_REDIR_URI, + scope: "read openid", + correlationId: TEST_CONFIG.CORRELATION_ID, + windowTitleSubstring: "", + extraParameters: { + extendedExpiryToken: "true", + }, + }; + const platformDOMRequest = + //@ts-ignore + platformAuthDOMHandler.initializePlatformDOMRequest( + testRequest + ); + expect(platformDOMRequest).toEqual({ + accountId: testRequest.accountId, + brokerId: PlatformAuthConstants.MICROSOFT_ENTRA_BROKERID, + authority: testRequest.authority, + clientId: testRequest.clientId, + correlationId: testRequest.correlationId, + isSecurityTokenService: false, + extraParameters: { + extendedExpiryToken: "true", + windowTitleSubstring: "", + }, + redirectUri: testRequest.redirectUri, + scope: testRequest.scope, + state: undefined, + storeInCache: undefined, + embeddedClientId: undefined, + }); + }); + }); + + describe("validatePlatformBrokerResponse tests", () => { + it("should return a valid PlatformBrokerResponse object", async () => { + getSupportedContractsMock.mockResolvedValue([ + PlatformAuthConstants.PLATFORM_DOM_APIS, + ]); + const platformAuthDOMHandler = + await PlatformAuthDOMHandler.createProvider( + logger, + performanceClient, + "test-correlation-id" + ); + const testResponse: object = { + isSuccess: true, + state: "", + accessToken: TEST_TOKENS.ACCESS_TOKEN, + expiresIn: 6000, + account: { + id: "test-id", + userName: "test-user", + properties: {}, + }, + clientInfo: "test-client-info", + idToken: TEST_TOKENS.IDTOKEN_V1, + scopes: "read openid", + error: {}, + properties: { + MATS: '{"MATS":"{"x_ms_clitelem":"1,0,0,,I","ui_visible":true}"}', + }, + extendedLifetimeToken: true, + }; + const validatedResponse = + //@ts-ignore + platformAuthDOMHandler.validatePlatformBrokerResponse( + testResponse + ); + expect(validatedResponse).toEqual({ + access_token: TEST_TOKENS.ACCESS_TOKEN, + account: { + id: "test-id", + userName: "test-user", + properties: {}, + }, + client_info: "test-client-info", + expires_in: 6000, + id_token: TEST_TOKENS.IDTOKEN_V1, + properties: { + MATS: '{"MATS":"{"x_ms_clitelem":"1,0,0,,I","ui_visible":true}"}', + }, + scope: "read openid", + state: "", + extendedLifetimeToken: true, + }); + }); + }); +}); diff --git a/lib/msal-browser/test/broker/NativeMessageHandler.spec.ts b/lib/msal-browser/test/broker/PlatformAuthExtensionHandler.spec.ts similarity index 80% rename from lib/msal-browser/test/broker/NativeMessageHandler.spec.ts rename to lib/msal-browser/test/broker/PlatformAuthExtensionHandler.spec.ts index 538be2712d..71fd2b98a9 100644 --- a/lib/msal-browser/test/broker/NativeMessageHandler.spec.ts +++ b/lib/msal-browser/test/broker/PlatformAuthExtensionHandler.spec.ts @@ -10,17 +10,30 @@ import { AuthErrorCodes, IPerformanceClient, } from "@azure/msal-common"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; import { BrowserAuthError, BrowserAuthErrorCodes } from "../../src/index.js"; import { NativeExtensionMethod } from "../../src/utils/BrowserConstants.js"; import { NativeAuthError } from "../../src/error/NativeAuthError.js"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils.js"; import { CryptoOps } from "../../src/crypto/CryptoOps.js"; +import { mock } from "node:test"; +import { PlatformBrokerRequest } from "../../src/broker/nativeBroker/PlatformBrokerRequest.js"; +import { TEST_CONFIG, TEST_URIS } from "../utils/StringConstants.js"; import { BrowserAuthErrorMessages } from "../../src/error/BrowserAuthError.js"; let performanceClient: IPerformanceClient; -describe("NativeMessageHandler Tests", () => { +const TEST_REQUEST: PlatformBrokerRequest = { + accountId: "test-account-id", + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + authority: TEST_CONFIG.validAuthority, + redirectUri: TEST_URIS.TEST_REDIR_URI, + scope: "User.Read", + correlationId: "test-correlation-id", + windowTitleSubstring: "", +}; + +describe("PlatformAuthExtensionHandler Tests", () => { let postMessageSpy: jest.SpyInstance; let mcPort: MessagePort; let cryptoInterface: CryptoOps; @@ -63,12 +76,15 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - const wamMessageHandler = await NativeMessageHandler.createProvider( - new Logger({}), - 2000, - performanceClient + const wamMessageHandler = + await PlatformAuthExtensionHandler.createProvider( + new Logger({}), + 2000, + performanceClient + ); + expect(wamMessageHandler).toBeInstanceOf( + PlatformAuthExtensionHandler ); - expect(wamMessageHandler).toBeInstanceOf(NativeMessageHandler); window.removeEventListener("message", eventHandler, true); }); @@ -112,7 +128,7 @@ describe("NativeMessageHandler Tests", () => { } ); - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient @@ -149,18 +165,21 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - const wamMessageHandler = await NativeMessageHandler.createProvider( - new Logger({}), - 2000, - performanceClient + const wamMessageHandler = + await PlatformAuthExtensionHandler.createProvider( + new Logger({}), + 2000, + performanceClient + ); + expect(wamMessageHandler).toBeInstanceOf( + PlatformAuthExtensionHandler ); - expect(wamMessageHandler).toBeInstanceOf(NativeMessageHandler); window.removeEventListener("message", eventHandler, true); }); it("Throws if no extension is installed", (done) => { - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient @@ -185,7 +204,7 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient @@ -225,7 +244,7 @@ describe("NativeMessageHandler Tests", () => { } ); - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient @@ -239,11 +258,21 @@ describe("NativeMessageHandler Tests", () => { describe("sendMessage", () => { it("Sends message to WAM extension", async () => { + const testWAMResponse = { + access_token: "test-access-token", + id_token: "test-id-token", + client_info: "test-client-info", + account: { + id: "test-account-id", + properties: {}, + userName: "test-user-name", + }, + scope: "read openid", + expires_in: "3600", + }; const testResponse = { status: "Success", - result: { - accessToken: "test-access-token", - }, + result: testWAMResponse, }; const eventHandler = function (event: MessageEvent) { event.stopImmediatePropagation(); @@ -281,16 +310,17 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - const wamMessageHandler = await NativeMessageHandler.createProvider( - new Logger({}), - 2000, - performanceClient + const wamMessageHandler = + await PlatformAuthExtensionHandler.createProvider( + new Logger({}), + 2000, + performanceClient + ); + expect(wamMessageHandler).toBeInstanceOf( + PlatformAuthExtensionHandler ); - expect(wamMessageHandler).toBeInstanceOf(NativeMessageHandler); - const response = await wamMessageHandler.sendMessage({ - method: NativeExtensionMethod.GetToken, - }); + const response = await wamMessageHandler.sendMessage(TEST_REQUEST); expect(response).toEqual(testResponse.result); window.removeEventListener("message", eventHandler, true); @@ -338,22 +368,20 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient ) .then((wamMessageHandler) => { - wamMessageHandler - .sendMessage({ method: NativeExtensionMethod.GetToken }) - .catch((e) => { - expect(e).toBeInstanceOf(NativeAuthError); - expect(e.errorCode).toEqual(testResponse.code); - expect(e.errorMessage).toEqual( - testResponse.description - ); - done(); - }); + wamMessageHandler.sendMessage(TEST_REQUEST).catch((e) => { + expect(e).toBeInstanceOf(NativeAuthError); + expect(e.errorCode).toEqual(testResponse.code); + expect(e.errorMessage).toEqual( + testResponse.description + ); + done(); + }); }) .finally(() => { window.removeEventListener("message", eventHandler, true); @@ -404,24 +432,20 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient ) .then((wamMessageHandler) => { - wamMessageHandler - .sendMessage({ method: NativeExtensionMethod.GetToken }) - .catch((e) => { - expect(e).toBeInstanceOf(NativeAuthError); - expect(e.errorCode).toEqual( - testResponse.result.code - ); - expect(e.errorMessage).toEqual( - testResponse.result.description - ); - done(); - }); + wamMessageHandler.sendMessage(TEST_REQUEST).catch((e) => { + expect(e).toBeInstanceOf(NativeAuthError); + expect(e.errorCode).toEqual(testResponse.result.code); + expect(e.errorMessage).toEqual( + testResponse.result.description + ); + done(); + }); }) .finally(() => { window.removeEventListener("message", eventHandler, true); @@ -468,26 +492,22 @@ describe("NativeMessageHandler Tests", () => { window.addEventListener("message", eventHandler, true); - NativeMessageHandler.createProvider( + PlatformAuthExtensionHandler.createProvider( new Logger({}), 2000, performanceClient ) .then((wamMessageHandler) => { - wamMessageHandler - .sendMessage({ method: NativeExtensionMethod.GetToken }) - .catch((e) => { - expect(e).toBeInstanceOf(AuthError); - expect(e.errorCode).toEqual( - AuthErrorCodes.unexpectedError - ); - expect(e.errorMessage).toContain( - AuthErrorMessages[ - AuthErrorCodes.unexpectedError - ] - ); - done(); - }); + wamMessageHandler.sendMessage(TEST_REQUEST).catch((e) => { + expect(e).toBeInstanceOf(AuthError); + expect(e.errorCode).toEqual( + AuthErrorCodes.unexpectedError + ); + expect(e.errorMessage).toContain( + AuthErrorMessages[AuthErrorCodes.unexpectedError] + ); + done(); + }); }) .finally(() => { window.removeEventListener("message", eventHandler, true); diff --git a/lib/msal-browser/test/broker/PlatformAuthProvider.spec.ts b/lib/msal-browser/test/broker/PlatformAuthProvider.spec.ts new file mode 100644 index 0000000000..0914bb411b --- /dev/null +++ b/lib/msal-browser/test/broker/PlatformAuthProvider.spec.ts @@ -0,0 +1,277 @@ +import { + Logger, + IPerformanceClient, + AuthenticationScheme, +} from "@azure/msal-common/browser"; +import * as PlatformAuthProvider from "../../src/broker/nativeBroker/PlatformAuthProvider.js"; +import { getDefaultPerformanceClient } from "../utils/TelemetryUtils.js"; +import { PlatformAuthDOMHandler } from "../../src/broker/nativeBroker/PlatformAuthDOMHandler.js"; +import { + BrowserConfiguration, + buildConfiguration, + Configuration, +} from "../../src/config/Configuration.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; +import exp from "constants"; +import { log } from "console"; +import { BrowserAuthError } from "../../src/index.js"; + +describe("PlatformAuthProvider tests", () => { + function stubExtensionProvider() { + return jest + .spyOn(PlatformAuthExtensionHandler, "createProvider") + .mockImplementation(async () => { + return new PlatformAuthExtensionHandler( + logger, + 2000, + performanceClient, + "test-extensionId" + ); + }); + } + + function stubDOMProvider() { + return jest + .spyOn(PlatformAuthDOMHandler, "createProvider") + .mockImplementation(async () => { + return new PlatformAuthDOMHandler( + logger, + performanceClient, + "test-correlation-id" + ); + }); + } + + let performanceClient: IPerformanceClient; + let logger: Logger; + beforeEach(() => { + performanceClient = getDefaultPerformanceClient(); + logger = new Logger({}, "test", "1.0.0"); + }); + afterEach(() => { + window.sessionStorage.clear(); + jest.restoreAllMocks(); + }); + + describe("isPlatformBrokerAvailable tests", () => { + it("should return false if application is not in browser environment", async () => { + const { window } = global; + //@ts-ignore + delete global.window; + const result = await PlatformAuthProvider.isPlatformBrokerAvailable( + {}, + performanceClient, + "test-correlation-id" + ); + expect(result).toBe(false); + global.window = window; // Restore window + }); + + it("should return true if its a browser app and dom handler is available", async () => { + window.sessionStorage.setItem( + "msal.browser.platform.auth.dom", + "true" + ); + const getItemSpy = jest.spyOn( + Object.getPrototypeOf(sessionStorage), + "getItem" + ); + + const domProviderSpy = stubDOMProvider(); + + const result = + await PlatformAuthProvider.isPlatformBrokerAvailable(); + expect(result).toBe(true); + expect(getItemSpy).toHaveBeenCalled(); + expect(domProviderSpy).toHaveBeenCalled(); + }); + + it("should return true if its a browser app and extension handler is available", async () => { + const extensionProviderSpy = stubExtensionProvider(); + + const result = + await PlatformAuthProvider.isPlatformBrokerAvailable(); + expect(result).toBe(true); + expect(extensionProviderSpy).toHaveBeenCalled(); + }); + + it("should return false if no handler is available", async () => { + jest.spyOn( + PlatformAuthDOMHandler, + "createProvider" + ).mockImplementation(async () => { + throw new Error("No handler available"); + }); + + jest.spyOn( + PlatformAuthExtensionHandler, + "createProvider" + ).mockImplementation(async () => { + throw new Error("No handler available"); + }); + + const result = + await PlatformAuthProvider.isPlatformBrokerAvailable(); + expect(result).toBe(false); + }); + }); + + describe("getPlatformAuthProvider tests", () => { + it("should return undefined if no provider is available", async () => { + jest.spyOn( + PlatformAuthDOMHandler, + "createProvider" + ).mockImplementation(async () => { + throw new Error("No handler available"); + }); + + jest.spyOn( + PlatformAuthExtensionHandler, + "createProvider" + ).mockImplementation(async () => { + throw new Error("No handler available"); + }); + + const result = await PlatformAuthProvider.getPlatformAuthProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(result).toBe(undefined); + }); + + it("returns dom handler when available", async () => { + window.sessionStorage.setItem( + "msal.browser.platform.auth.dom", + "true" + ); + const getItemSpy = jest.spyOn( + Object.getPrototypeOf(sessionStorage), + "getItem" + ); + + const domProviderSpy = stubDOMProvider(); + + const result = await PlatformAuthProvider.getPlatformAuthProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(result).not.toBe(undefined); + expect(result).toBeInstanceOf(PlatformAuthDOMHandler); + expect(getItemSpy).toHaveBeenCalled(); + expect(domProviderSpy).toHaveBeenCalled(); + }); + + it("returns extension handler if dom APIs are not available and extension is available", async () => { + const extensionProviderSpy = stubExtensionProvider(); + + const result = await PlatformAuthProvider.getPlatformAuthProvider( + logger, + performanceClient, + "test-correlation-id" + ); + expect(result).not.toBe(undefined); + expect(result).toBeInstanceOf(PlatformAuthExtensionHandler); + expect(extensionProviderSpy).toHaveBeenCalled(); + }); + }); + + describe("isDomEnabledForPlatformAuth tests", () => { + it("should return false if session storage is not set with DOM API flag", () => { + expect(PlatformAuthProvider.isDomEnabledForPlatformAuth()).toBe( + false + ); + }); + + it("should return true if session storage is set with DOM API flag", () => { + window.sessionStorage.setItem( + "msal.browser.platform.auth.dom", + "true" + ); + expect(PlatformAuthProvider.isDomEnabledForPlatformAuth()).toBe( + true + ); + }); + + it("should return false if session storage errors out", () => { + const { sessionStorage } = global.window; + //@ts-ignore + delete global.window.sessionStorage; + const result = PlatformAuthProvider.isDomEnabledForPlatformAuth(); + expect(result).toBe(false); + global.window.sessionStorage = sessionStorage; // Restore sessionStorage + }); + }); + + describe("isBrokerAvailable", () => { + let config: BrowserConfiguration; + beforeEach(() => { + config = buildConfiguration( + { + auth: { + clientId: "test-client-id", + authority: "https://login.microsoftonline.com/common", + redirectUri: "http://localhost", + }, + system: { + allowPlatformBroker: true, + }, + }, + true + ); + }); + + it("returns false when config is not set to enable paltform broker", () => { + config.system.allowPlatformBroker = false; + const result = PlatformAuthProvider.isBrokerAvailable( + config, + logger, + new PlatformAuthDOMHandler( + logger, + performanceClient, + "test-correlation-id" + ), + AuthenticationScheme.BEARER + ); + expect(result).toBe(false); + }); + + it("returns false when platform auth provider is not initialized", () => { + const result = PlatformAuthProvider.isBrokerAvailable( + config, + logger, + undefined, + AuthenticationScheme.BEARER + ); + expect(result).toBe(false); + }); + it("returns false when authentication scheme is not supported", () => { + const result = PlatformAuthProvider.isBrokerAvailable( + config, + logger, + new PlatformAuthDOMHandler( + logger, + performanceClient, + "test-correlation-id" + ), + "unknown-scheme" as AuthenticationScheme + ); + expect(result).toBe(false); + }); + + it("returns true when platform auth provider is initialized and authentication scheme is supported", () => { + const result = PlatformAuthProvider.isBrokerAvailable( + config, + logger, + new PlatformAuthDOMHandler( + logger, + performanceClient, + "test-correlation-id" + ), + AuthenticationScheme.BEARER + ); + expect(result).toBe(true); + }); + }); +}); diff --git a/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts b/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts index 55bad7f5a6..cdf8fdcac1 100644 --- a/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts +++ b/lib/msal-browser/test/cache/BrowserCacheManager.spec.ts @@ -40,6 +40,7 @@ import { } from "@azure/msal-common"; import { BrowserCacheLocation, + INTERACTION_TYPE, InteractionType, TemporaryCacheKeys, } from "../../src/utils/BrowserConstants.js"; @@ -1476,6 +1477,90 @@ describe("BrowserCacheManager tests", () => { ); }); }); + + describe("interactionInProgress", () => { + it("handles new format", () => { + const perfClient = new BrowserPerformanceClient({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + }); + const cacheManager = new BrowserCacheManager( + TEST_CONFIG.MSAL_CLIENT_ID, + cacheConfig, + browserCrypto, + logger, + perfClient, + new EventHandler() + ); + + cacheManager.setInteractionInProgress(true); + expect( + cacheManager.getInteractionInProgress()?.clientId + ).toEqual(TEST_CONFIG.MSAL_CLIENT_ID); + expect( + cacheManager.getInteractionInProgress()?.type + ).toEqual(INTERACTION_TYPE.SIGNIN); + }); + + it("handles old format", () => { + const perfClient = new BrowserPerformanceClient({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + }); + const cacheManager = new BrowserCacheManager( + TEST_CONFIG.MSAL_CLIENT_ID, + cacheConfig, + browserCrypto, + logger, + perfClient, + new EventHandler() + ); + + cacheManager.setTemporaryCache( + `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`, + TEST_CONFIG.MSAL_CLIENT_ID + ); + expect(cacheManager.getInteractionInProgress()).toBeNull(); + }); + + it("handles old format and removes temporary artifacts", () => { + const perfClient = new BrowserPerformanceClient({ + auth: { + clientId: TEST_CONFIG.MSAL_CLIENT_ID, + }, + }); + const cacheManager = new BrowserCacheManager( + TEST_CONFIG.MSAL_CLIENT_ID, + cacheConfig, + browserCrypto, + logger, + perfClient, + new EventHandler() + ); + + cacheManager.setTemporaryCache( + `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`, + TEST_CONFIG.MSAL_CLIENT_ID + ); + // @ts-ignore + const requestParamKey = cacheManager.generateCacheKey( + TemporaryCacheKeys.REQUEST_PARAMS + ); + const requestParamPayload = JSON.stringify({ + correlationId: "test-correlation-id", + }); + cacheManager.setTemporaryCache( + requestParamKey, + requestParamPayload + ); + expect(cacheManager.getInteractionInProgress()).toBeNull(); + expect( + cacheManager.getTemporaryCache(requestParamKey) + ).toBeNull(); + }); + }); }); }); diff --git a/lib/msal-browser/test/interaction_client/NativeInteractionClient.spec.ts b/lib/msal-browser/test/interaction_client/PlatformAuthInteractionClient.spec.ts similarity index 84% rename from lib/msal-browser/test/interaction_client/NativeInteractionClient.spec.ts rename to lib/msal-browser/test/interaction_client/PlatformAuthInteractionClient.spec.ts index bbc6b31aa3..d16b970797 100644 --- a/lib/msal-browser/test/interaction_client/NativeInteractionClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/PlatformAuthInteractionClient.spec.ts @@ -22,9 +22,9 @@ import { PerformanceEvents, AccountEntityUtils, } from "@azure/msal-common"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; import { ApiId } from "../../src/utils/BrowserConstants.js"; -import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient.js"; +import { PlatformAuthInteractionClient } from "../../src/interaction_client/PlatformAuthInteractionClient.js"; import { PublicClientApplication } from "../../src/app/PublicClientApplication.js"; import { ID_TOKEN_CLAIMS, @@ -43,7 +43,10 @@ import { NativeAuthErrorCodes, NativeAuthErrorMessages, } from "../../src/error/NativeAuthError.js"; -import { NativeExtensionRequestBody } from "../../src/broker/nativeBroker/NativeRequest.js"; +import { + NativeExtensionRequestBody, + PlatformBrokerRequest, +} from "../../src/broker/nativeBroker/PlatformBrokerRequest.js"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils.js"; import { BrowserCacheManager } from "../../src/cache/BrowserCacheManager.js"; import { @@ -56,8 +59,9 @@ import { buildAccountFromIdTokenClaims, buildIdToken } from "msal-test-utils"; import { version } from "../../src/packageMetadata.js"; import { BrowserConstants } from "../../src/utils/BrowserConstants.js"; import * as NativeStatusCodes from "../../src/broker/nativeBroker/NativeStatusCodes.js"; +import { PlatformBrokerResponse } from "../../src/broker/nativeBroker/PlatformBrokerResponse.js"; -const MOCK_WAM_RESPONSE = { +const MOCK_WAM_RESPONSE: PlatformBrokerResponse = { access_token: TEST_TOKENS.ACCESS_TOKEN, id_token: TEST_TOKENS.IDTOKEN_V2, scope: "User.Read", @@ -65,20 +69,26 @@ const MOCK_WAM_RESPONSE = { client_info: TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, account: { id: "nativeAccountId", + properties: {}, + userName: "test_username", }, properties: {}, + state: "", }; -const MOCK_WAM_RESPONSE_STRING_EXPIRES_IN = { +const MOCK_WAM_RESPONSE_STRING_EXPIRES_IN: PlatformBrokerResponse = { access_token: TEST_TOKENS.ACCESS_TOKEN, id_token: TEST_TOKENS.IDTOKEN_V2, scope: "User.Read", - expires_in: "3600", + expires_in: 3600, client_info: TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, account: { id: "nativeAccountId", + properties: {}, + userName: "test_username", }, properties: {}, + state: "", }; const testAccountEntity: AccountEntity = buildAccountFromIdTokenClaims( @@ -113,14 +123,14 @@ const testAccessTokenEntity: AccessTokenEntity = { cachedAt: `${TimeUtils.nowSeconds()}`, }; -describe("NativeInteractionClient Tests", () => { +describe("PlatformAuthInteractionClient Tests", () => { let pca: PublicClientApplication; - let nativeInteractionClient: NativeInteractionClient; + let nativeInteractionClient: PlatformAuthInteractionClient; let browserCacheManager: BrowserCacheManager; let internalStorage: BrowserCacheManager; - let wamProvider: NativeMessageHandler; + let wamProvider: PlatformAuthExtensionHandler; let postMessageSpy: jest.SpyInstance; let mcPort: MessagePort; let perfClient: IPerformanceClient; @@ -156,13 +166,13 @@ describe("NativeInteractionClient Tests", () => { //@ts-ignore internalStorage = pca.nativeInternalStorage; - wamProvider = new NativeMessageHandler( + wamProvider = new PlatformAuthExtensionHandler( pca.getLogger(), 2000, getDefaultPerformanceClient() ); - nativeInteractionClient = new NativeInteractionClient( + nativeInteractionClient = new PlatformAuthInteractionClient( // @ts-ignore pca.config, // @ts-ignore @@ -244,9 +254,9 @@ describe("NativeInteractionClient Tests", () => { describe("acquireToken Tests", () => { it("acquires token successfully", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); const response = await nativeInteractionClient.acquireToken({ @@ -268,9 +278,9 @@ describe("NativeInteractionClient Tests", () => { it("acquires token successfully with string expires_in", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE_STRING_EXPIRES_IN); }); const response = await nativeInteractionClient.acquireToken({ @@ -335,9 +345,9 @@ describe("NativeInteractionClient Tests", () => { it("prompt: none succeeds", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); const response = await nativeInteractionClient.acquireToken({ @@ -360,9 +370,9 @@ describe("NativeInteractionClient Tests", () => { it("prompt: consent succeeds", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); const response = await nativeInteractionClient.acquireToken({ @@ -385,9 +395,9 @@ describe("NativeInteractionClient Tests", () => { it("prompt: login succeeds", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); const response = await nativeInteractionClient.acquireToken({ @@ -409,16 +419,22 @@ describe("NativeInteractionClient Tests", () => { }); it("does not throw account switch error when homeaccountid is same", (done) => { - const mockWamResponse = { + const raw_client_info = + "eyJ1aWQiOiAiMDAwMDAwMDAtMDAwMC0wMDAwLTY2ZjMtMzMzMmVjYTdlYTgxIiwgInV0aWQiOiIzMzM4MDQwZC02YzY3LTRjNWItYjExMi0zNmEzMDRiNjZkYWQifQ=="; + + const mockWamResponse: PlatformBrokerResponse = { access_token: TEST_TOKENS.ACCESS_TOKEN, - id_token: TEST_TOKENS.IDTOKEN_V2, + id_token: TEST_TOKENS.IDTOKEN_V2_ALT, scope: "User.Read", expires_in: 3600, - client_info: TEST_DATA_CLIENT_INFO.TEST_RAW_CLIENT_INFO, + client_info: raw_client_info, account: { id: "different-nativeAccountId", + properties: {}, + userName: "test_username", }, properties: {}, + state: "", }; jest.spyOn( @@ -427,9 +443,9 @@ describe("NativeInteractionClient Tests", () => { ).mockReturnValue(TEST_ACCOUNT_INFO); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(mockWamResponse); }); nativeInteractionClient @@ -455,7 +471,7 @@ describe("NativeInteractionClient Tests", () => { const raw_client_info = "eyJ1aWQiOiAiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIiwgInV0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcifQ=="; - const mockWamResponse = { + const mockWamResponse: PlatformBrokerResponse = { access_token: TEST_TOKENS.ACCESS_TOKEN, id_token: TEST_TOKENS.IDTOKEN_V2_ALT, scope: "User.Read", @@ -463,8 +479,11 @@ describe("NativeInteractionClient Tests", () => { client_info: raw_client_info, account: { id: "different-nativeAccountId", + properties: {}, + userName: "test_username", }, properties: {}, + state: "", }; jest.spyOn( @@ -473,9 +492,9 @@ describe("NativeInteractionClient Tests", () => { ).mockReturnValue(TEST_ACCOUNT_INFO); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(mockWamResponse); }); nativeInteractionClient @@ -495,7 +514,7 @@ describe("NativeInteractionClient Tests", () => { const raw_client_info = "eyJ1aWQiOiAiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIiwgInV0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcifQ=="; - const mockWamResponse = { + const mockWamResponse: PlatformBrokerResponse = { access_token: TEST_TOKENS.ACCESS_TOKEN, id_token: TEST_TOKENS.IDTOKEN_V2_ALT, scope: "User.Read", @@ -503,8 +522,11 @@ describe("NativeInteractionClient Tests", () => { client_info: raw_client_info, account: { id: "different-nativeAccountId", + properties: {}, + userName: "test_username", }, properties: {}, + state: "", }; jest.spyOn( @@ -513,9 +535,9 @@ describe("NativeInteractionClient Tests", () => { ).mockReturnValue(TEST_ACCOUNT_INFO); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(mockWamResponse); }); @@ -546,16 +568,18 @@ describe("NativeInteractionClient Tests", () => { it("ssoSilent overwrites prompt to be 'none' and succeeds", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((nativeRequest): Promise => { - expect( - nativeRequest.request && nativeRequest.request.prompt - ).toBe(PromptValue.NONE); - return Promise.resolve(MOCK_WAM_RESPONSE); - }); + ).mockImplementation( + (nativeRequest): Promise => { + expect(nativeRequest && nativeRequest.prompt).toBe( + PromptValue.NONE + ); + return Promise.resolve(MOCK_WAM_RESPONSE); + } + ); // @ts-ignore - const nativeInteractionClient = new NativeInteractionClient( + const nativeInteractionClient = new PlatformAuthInteractionClient( // @ts-ignore pca.config, // @ts-ignore @@ -597,16 +621,18 @@ describe("NativeInteractionClient Tests", () => { it("acquireTokenSilent overwrites prompt to be 'none' and succeeds", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((nativeRequest): Promise => { - expect( - nativeRequest.request && nativeRequest.request.prompt - ).toBe(PromptValue.NONE); - return Promise.resolve(MOCK_WAM_RESPONSE); - }); + ).mockImplementation( + (nativeRequest): Promise => { + expect(nativeRequest && nativeRequest.prompt).toBe( + PromptValue.NONE + ); + return Promise.resolve(MOCK_WAM_RESPONSE); + } + ); // @ts-ignore - const nativeInteractionClient = new NativeInteractionClient( + const nativeInteractionClient = new PlatformAuthInteractionClient( // @ts-ignore pca.config, // @ts-ignore @@ -648,12 +674,12 @@ describe("NativeInteractionClient Tests", () => { it("adds MSAL.js SKU to request extra query parameters", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { - expect( - message.request?.extraParameters!["x-client-xtra-sku"] - ).toEqual(`${BrowserConstants.MSAL_SKU}|${version},|,|,|`); + ).mockImplementation((request): Promise => { + expect(request?.extraParameters!["x-client-xtra-sku"]).toEqual( + `${BrowserConstants.MSAL_SKU}|${version},|,|,|` + ); return Promise.resolve(MOCK_WAM_RESPONSE); }); await nativeInteractionClient.acquireToken({ @@ -663,27 +689,25 @@ describe("NativeInteractionClient Tests", () => { it("adds MSAL.js and Chrome extension SKUs to request extra query parameters", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { - expect( - message.request?.extraParameters!["x-client-xtra-sku"] - ).toEqual( + ).mockImplementation((request): Promise => { + expect(request.extraParameters!["x-client-xtra-sku"]).toEqual( `${BrowserConstants.MSAL_SKU}|${version},|,chrome|1.0.2,|` ); return Promise.resolve(MOCK_WAM_RESPONSE); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "getExtensionId" ).mockReturnValue("ppnbnpeolgkicgegkbkbjmhlideopiji"); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "getExtensionVersion" ).mockReturnValue("1.0.2"); - nativeInteractionClient = new NativeInteractionClient( + nativeInteractionClient = new PlatformAuthInteractionClient( // @ts-ignore pca.config, // @ts-ignore @@ -711,27 +735,25 @@ describe("NativeInteractionClient Tests", () => { it("adds MSAL.js and unknown extension SKUs to request extra query parameters", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { - expect( - message.request?.extraParameters!["x-client-xtra-sku"] - ).toEqual( + ).mockImplementation((request): Promise => { + expect(request.extraParameters!["x-client-xtra-sku"]).toEqual( `${BrowserConstants.MSAL_SKU}|${version},|,unknown|2.3.4,|` ); return Promise.resolve(MOCK_WAM_RESPONSE); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "getExtensionId" ).mockReturnValue("random_extension_id"); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "getExtensionVersion" ).mockReturnValue("2.3.4"); - nativeInteractionClient = new NativeInteractionClient( + nativeInteractionClient = new PlatformAuthInteractionClient( // @ts-ignore pca.config, // @ts-ignore @@ -759,9 +781,9 @@ describe("NativeInteractionClient Tests", () => { it("does not set native broker error to server telemetry", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { + ).mockImplementation((message): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); @@ -783,9 +805,9 @@ describe("NativeInteractionClient Tests", () => { it("sets native broker error to server telemetry", async () => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { + ).mockImplementation((message): Promise => { return Promise.reject( new NativeAuthError("test_native_error_code") ); @@ -811,21 +833,25 @@ describe("NativeInteractionClient Tests", () => { it("resets native broker error in server telemetry", async () => { const sendMessageStub = jest - .spyOn(NativeMessageHandler.prototype, "sendMessage") + .spyOn(PlatformAuthExtensionHandler.prototype, "sendMessage") .mockImplementation(); sendMessageStub - .mockImplementationOnce((message): Promise => { - return Promise.reject( - new NativeAuthError( - "test_native_error_code", - "test_error_desc", - { status: NativeStatusCodes.PERSISTENT_ERROR } - ) - ); - }) - .mockImplementationOnce((message): Promise => { - return Promise.resolve(MOCK_WAM_RESPONSE); - }); + .mockImplementationOnce( + (message): Promise => { + return Promise.reject( + new NativeAuthError( + "test_native_error_code", + "test_error_desc", + { status: NativeStatusCodes.PERSISTENT_ERROR } + ) + ); + } + ) + .mockImplementationOnce( + (message): Promise => { + return Promise.resolve(MOCK_WAM_RESPONSE); + } + ); try { await nativeInteractionClient.acquireToken({ @@ -866,7 +892,7 @@ describe("NativeInteractionClient Tests", () => { beforeEach(() => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" ).mockResolvedValue(MOCK_WAM_RESPONSE); }); @@ -959,9 +985,9 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); nativeInteractionClient.acquireTokenRedirect( @@ -981,9 +1007,9 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); const callbackId = pca.addPerformanceCallback((events) => { @@ -1002,9 +1028,9 @@ describe("NativeInteractionClient Tests", () => { it("throws if native token acquisition fails with fatal error", (done) => { jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.reject( new NativeAuthError( "ContentError", @@ -1033,12 +1059,12 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { - expect( - message.request?.extraParameters!["x-client-xtra-sku"] - ).toEqual(`${BrowserConstants.MSAL_SKU}|${version},|,|,|`); + ).mockImplementation((request): Promise => { + expect(request.extraParameters!["x-client-xtra-sku"]).toEqual( + `${BrowserConstants.MSAL_SKU}|${version},|,|,|` + ); return Promise.resolve(MOCK_WAM_RESPONSE); }); nativeInteractionClient.acquireTokenRedirect( @@ -1069,9 +1095,9 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((message): Promise => { + ).mockImplementation((message): Promise => { return Promise.reject( new NativeAuthError("test_native_error_code") ); @@ -1092,25 +1118,31 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); const sendMessageStub = jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" ); sendMessageStub - .mockImplementationOnce((message): Promise => { - return Promise.reject( - new NativeAuthError( - "test_native_error_code", - "test_error_desc", - { status: NativeStatusCodes.PERSISTENT_ERROR } - ) - ); - }) - .mockImplementationOnce((message): Promise => { - return Promise.resolve(MOCK_WAM_RESPONSE); - }) - .mockImplementationOnce((message): Promise => { - return Promise.resolve(MOCK_WAM_RESPONSE); - }); + .mockImplementationOnce( + (message): Promise => { + return Promise.reject( + new NativeAuthError( + "test_native_error_code", + "test_error_desc", + { status: NativeStatusCodes.PERSISTENT_ERROR } + ) + ); + } + ) + .mockImplementationOnce( + (message): Promise => { + return Promise.resolve(MOCK_WAM_RESPONSE); + } + ) + .mockImplementationOnce( + (message): Promise => { + return Promise.resolve(MOCK_WAM_RESPONSE); + } + ); try { await nativeInteractionClient.acquireTokenRedirect( @@ -1168,9 +1200,9 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); // @ts-ignore @@ -1194,7 +1226,7 @@ describe("NativeInteractionClient Tests", () => { idTokenClaims: ID_TOKEN_CLAIMS, accessToken: MOCK_WAM_RESPONSE.access_token, fromCache: false, - state: undefined, + state: "", correlationId: RANDOM_TEST_GUID, expiresOn: response && response.expiresOn, // Steal the expires on from the response as this is variable account: TEST_ACCOUNT_INFO, @@ -1214,13 +1246,13 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" ).mockImplementation( - (messageBody: NativeExtensionRequestBody): Promise => { - expect( - messageBody.request && messageBody.request.prompt - ).toBe(undefined); + ( + request: PlatformBrokerRequest + ): Promise => { + expect(request && request.prompt).toBe(undefined); return Promise.resolve(MOCK_WAM_RESPONSE); } ); @@ -1246,7 +1278,7 @@ describe("NativeInteractionClient Tests", () => { idTokenClaims: ID_TOKEN_CLAIMS, accessToken: MOCK_WAM_RESPONSE.access_token, fromCache: false, - state: undefined, + state: "", correlationId: RANDOM_TEST_GUID, expiresOn: response && response.expiresOn, // Steal the expires on from the response as this is variable account: TEST_ACCOUNT_INFO, @@ -1267,9 +1299,9 @@ describe("NativeInteractionClient Tests", () => { return Promise.resolve(true); }); jest.spyOn( - NativeMessageHandler.prototype, + PlatformAuthExtensionHandler.prototype, "sendMessage" - ).mockImplementation((): Promise => { + ).mockImplementation((): Promise => { return Promise.resolve(MOCK_WAM_RESPONSE); }); await nativeInteractionClient.acquireTokenRedirect( diff --git a/lib/msal-browser/test/interaction_client/PopupClient.spec.ts b/lib/msal-browser/test/interaction_client/PopupClient.spec.ts index 2930772975..509a7600e7 100644 --- a/lib/msal-browser/test/interaction_client/PopupClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/PopupClient.spec.ts @@ -50,8 +50,8 @@ import * as AuthorizeProtocol from "../../src/protocol/Authorize.js"; import { NavigationClient } from "../../src/navigation/NavigationClient.js"; import { EndSessionPopupRequest } from "../../src/request/EndSessionPopupRequest.js"; import { PopupClient } from "../../src/interaction_client/PopupClient.js"; -import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient.js"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthInteractionClient } from "../../src/interaction_client/PlatformAuthInteractionClient.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; import { BrowserAuthError, createBrowserAuthError, @@ -392,7 +392,7 @@ describe("PopupClient", () => { TEST_HASHES.TEST_SUCCESS_NATIVE_ACCOUNT_ID_POPUP ); jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ).mockResolvedValue(testTokenResponse); jest.spyOn(PkceGenerator, "generatePkceCodes").mockResolvedValue({ @@ -402,7 +402,7 @@ describe("PopupClient", () => { jest.spyOn(BrowserCrypto, "createNewGuid").mockReturnValue( RANDOM_TEST_GUID ); - const nativeMessageHandler = new NativeMessageHandler( + const nativeMessageHandler = new PlatformAuthExtensionHandler( //@ts-ignore pca.logger, 2000, @@ -519,7 +519,7 @@ describe("PopupClient", () => { TEST_HASHES.TEST_SUCCESS_NATIVE_ACCOUNT_ID_POPUP ); jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ).mockResolvedValue(testTokenResponse); jest.spyOn(PkceGenerator, "generatePkceCodes").mockResolvedValue({ diff --git a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts index 0b4bffd3f9..356faaa3d2 100644 --- a/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/RedirectClient.spec.ts @@ -79,8 +79,8 @@ import { NavigationOptions } from "../../src/navigation/NavigationOptions.js"; import { RedirectClient } from "../../src/interaction_client/RedirectClient.js"; import { EventHandler } from "../../src/event/EventHandler.js"; import { EventType } from "../../src/event/EventType.js"; -import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient.js"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthInteractionClient } from "../../src/interaction_client/PlatformAuthInteractionClient.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils.js"; import { AuthenticationResult } from "../../src/response/AuthenticationResult.js"; import { @@ -488,7 +488,7 @@ describe("RedirectClient", () => { pca = (pca as any).controller; // @ts-ignore - const nativeMessageHandler = new NativeMessageHandler( + const nativeMessageHandler = new PlatformAuthExtensionHandler( //@ts-ignore pca.logger, 2000, @@ -596,7 +596,7 @@ describe("RedirectClient", () => { } }); jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ).mockResolvedValue(testTokenResponse); diff --git a/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts b/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts index d67697f5fd..36b893e940 100644 --- a/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts +++ b/lib/msal-browser/test/interaction_client/SilentIframeClient.spec.ts @@ -42,8 +42,8 @@ import * as PkceGenerator from "../../src/crypto/PkceGenerator.js"; import * as AuthorizeProtocol from "../../src/protocol/Authorize.js"; import { SilentIframeClient } from "../../src/interaction_client/SilentIframeClient.js"; import { BrowserCacheManager } from "../../src/cache/BrowserCacheManager.js"; -import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient.js"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; +import { PlatformAuthInteractionClient } from "../../src/interaction_client/PlatformAuthInteractionClient.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; import { getDefaultPerformanceClient } from "../utils/TelemetryUtils.js"; import { InteractionHandler } from "../../src/interaction_handler/InteractionHandler.js"; import { @@ -413,7 +413,7 @@ describe("SilentIframeClient", () => { pca = (pca as any).controller; // @ts-ignore - const nativeMessageHandler = new NativeMessageHandler( + const nativeMessageHandler = new PlatformAuthExtensionHandler( //@ts-ignore pca.logger, 2000, @@ -491,7 +491,7 @@ describe("SilentIframeClient", () => { TEST_HASHES.TEST_SUCCESS_NATIVE_ACCOUNT_ID_SILENT ); jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ).mockResolvedValue(testTokenResponse); jest.spyOn(PkceGenerator, "generatePkceCodes").mockResolvedValue({ @@ -593,7 +593,7 @@ describe("SilentIframeClient", () => { TEST_HASHES.TEST_SUCCESS_NATIVE_ACCOUNT_ID_SILENT ); jest.spyOn( - NativeInteractionClient.prototype, + PlatformAuthInteractionClient.prototype, "acquireToken" ).mockResolvedValue(testTokenResponse); jest.spyOn(PkceGenerator, "generatePkceCodes").mockResolvedValue({ diff --git a/lib/msal-browser/test/network/FetchClient.spec.ts b/lib/msal-browser/test/network/FetchClient.spec.ts index 0935708f8b..91ea18b2d0 100644 --- a/lib/msal-browser/test/network/FetchClient.spec.ts +++ b/lib/msal-browser/test/network/FetchClient.spec.ts @@ -5,10 +5,7 @@ import { NetworkError, NetworkRequestOptions, } from "@azure/msal-common"; -import { - BrowserAuthErrorCodes, - BrowserAuthError, -} from "../../src/error/BrowserAuthError"; +import { BrowserAuthErrorCodes } from "../../src/error/BrowserAuthError.js"; const mockResponse: Response = { headers: new Headers(), @@ -140,10 +137,11 @@ describe("FetchClient.ts Unit Tests", () => { fetchClient .sendPostRequestAsync(targetUri, requestOptions) .catch((e) => { - expect(e).toBeInstanceOf(BrowserAuthError); + expect(e).toBeInstanceOf(NetworkError); expect(e.errorCode).toBe( BrowserAuthErrorCodes.postRequestFailed ); + expect(e.errorMessage).toContain(`additionalErrorInfo:`); done(); }); }); @@ -161,10 +159,11 @@ describe("FetchClient.ts Unit Tests", () => { ); fetchClient.sendGetRequestAsync(targetUri).catch((e) => { - expect(e).toBeInstanceOf(BrowserAuthError); + expect(e).toBeInstanceOf(NetworkError); expect(e.errorCode).toBe( BrowserAuthErrorCodes.getRequestFailed ); + expect(e.errorMessage).toContain(`additionalErrorInfo:`); done(); }); }); @@ -195,10 +194,10 @@ describe("FetchClient.ts Unit Tests", () => { .sendPostRequestAsync(targetUri, requestOptions) .catch((e) => { expect(e).toBeInstanceOf(NetworkError); - expect(e.error).toBeInstanceOf(BrowserAuthError); expect(e.errorCode).toBe( BrowserAuthErrorCodes.failedToParseResponse ); + expect(e.errorMessage).toContain(`additionalErrorInfo:`); done(); }); }); @@ -234,10 +233,11 @@ describe("FetchClient.ts Unit Tests", () => { fetchClient .sendPostRequestAsync(targetUri, requestOptions) .catch((e) => { - expect(e).toBeInstanceOf(BrowserAuthError); + expect(e).toBeInstanceOf(NetworkError); expect(e.errorCode).toBe( BrowserAuthErrorCodes.noNetworkConnectivity ); + expect(e.errorMessage).toContain(`additionalErrorInfo:`); done(); }); }); diff --git a/lib/msal-browser/test/protocol/Authorize.spec.ts b/lib/msal-browser/test/protocol/Authorize.spec.ts index f2650902e0..f5878c4255 100644 --- a/lib/msal-browser/test/protocol/Authorize.spec.ts +++ b/lib/msal-browser/test/protocol/Authorize.spec.ts @@ -33,8 +33,8 @@ import { BrowserAuthError, BrowserAuthErrorCodes, } from "../../src/error/BrowserAuthError.js"; -import { NativeMessageHandler } from "../../src/broker/nativeBroker/NativeMessageHandler.js"; -import { NativeInteractionClient } from "../../src/interaction_client/NativeInteractionClient.js"; +import { PlatformAuthExtensionHandler } from "../../src/broker/nativeBroker/PlatformAuthExtensionHandler.js"; +import { PlatformAuthInteractionClient } from "../../src/interaction_client/PlatformAuthInteractionClient.js"; describe("Authorize Protocol Tests", () => { describe("EAR Protocol Tests", () => { @@ -295,13 +295,16 @@ describe("Authorize Protocol Tests", () => { ); const response = { ...validResponse, ear_jwe: jwe }; - const nativeMessageHandler = new NativeMessageHandler( + const nativeMessageHandler = new PlatformAuthExtensionHandler( logger, 2000, performanceClient ); const platformBrokerSpy = jest - .spyOn(NativeInteractionClient.prototype, "acquireToken") + .spyOn( + PlatformAuthInteractionClient.prototype, + "acquireToken" + ) .mockResolvedValue(getTestAuthenticationResult()); const authResult = await Authorize.handleResponseEAR( diff --git a/lib/msal-browser/test/utils/StringConstants.ts b/lib/msal-browser/test/utils/StringConstants.ts index b209fbd0a1..1c7896a738 100644 --- a/lib/msal-browser/test/utils/StringConstants.ts +++ b/lib/msal-browser/test/utils/StringConstants.ts @@ -16,6 +16,7 @@ import { version } from "../../src/packageMetadata.js"; import { base64Decode, base64DecToArr } from "../../src/encode/Base64Decode.js"; import { urlEncodeArr } from "../../src/encode/Base64Encode.js"; import { AuthenticationResult } from "../../src/response/AuthenticationResult.js"; +import { PlatformDOMTokenResponse } from "../../src/broker/nativeBroker/PlatformBrokerResponse.js"; /** * This file contains the string constants used by the test classes. @@ -579,3 +580,47 @@ export function getTestAuthenticationResult(): AuthenticationResult { familyId: "", }; } + +export const PlatformDOMTestTokenResponseObject = { + isSuccess: true, + state: "1234state", + accessToken: "eyJ0eXAiOiJKV1QiLCJub25j…", + expiresIn: 1744768881, + account: { + userName: "idlab@msidlab4.onmicrosoft.com", + id: "test-nativeAccountId", + properties: {}, + }, + clientInfo: + "clienteyJ1aWQiOiJkMTdkMzcwNi0xZTRlLTQ2OTUtODA0OC1lZjYxOTZlOTZm", + idToken: TEST_TOKENS.IDTOKEN_V2, + scopes: "openid profile User.Read email", + proofOfPossessionPayload: "successshr", + extendedLifetimeToken: true, + properties: {}, + error: { + code: "", + description: "", + errorCode: "", + properties: {}, + status: "", + protocolError: "", + }, +}; + +export const PlatformDOMTestErrorResponseObject = { + isSuccess: false, + expiresIn: 0, + extendedLifetimeToken: false, + error: { + code: "OSError", + description: + 'Error Domain=com.apple.AuthenticationServices.AuthorizationError Code=-6000 "(null)" UserInfo={NSUnderlyingError=0x1319056b0 {Error Domain=MSALErrorDomain Code=-50000 "(null)" UserInfo={MSALErrorDescriptionKey=redirectUri host doesn\'t match sender host., MSALBrokerVersionKey=1.0, MSALInternalErrorCodeKey=-42008, MSALBrowserNativeMessageErrorStatus=PERSISTENT_ERROR}}}', + errorCode: "-6000", + properties: { + MATS: '{"x_ms_clitelem":"1,0,0,,I","ui_visible":true}', + }, + status: "PERSISTENT_ERROR", + protocolError: "", + }, +}; diff --git a/lib/msal-common/CHANGELOG.json b/lib/msal-common/CHANGELOG.json index d0e769b0f5..7b50462ea7 100644 --- a/lib/msal-common/CHANGELOG.json +++ b/lib/msal-common/CHANGELOG.json @@ -1,6 +1,92 @@ { "name": "@azure/msal-common", "entries": [ + { + "date": "Tue, 06 May 2025 22:47:43 GMT", + "version": "15.6.0", + "tag": "@azure/msal-common_v15.6.0", + "comments": { + "minor": [ + { + "author": "shylasummers@microsoft.com", + "package": "@azure/msal-common", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "Multi-instance detection" + }, + { + "author": "beachball", + "package": "@azure/msal-common", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-common", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-common", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ], + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-common", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "New dev dependency" + } + ] + } + }, + { + "date": "Tue, 29 Apr 2025 20:25:47 GMT", + "version": "15.5.2", + "tag": "@azure/msal-common_v15.5.2", + "comments": { + "patch": [ + { + "author": "sameera.gajjarapu@microsoft.com", + "package": "@azure/msal-common", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Add optional parameter to NetworkError for error specifics #7721" + }, + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-common", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Fix circular type imports" + }, + { + "author": "joarroyo@microsoft.com", + "package": "@azure/msal-common", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Deprecate cache options #7707" + }, + { + "author": "beachball", + "package": "@azure/msal-common", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-common", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-common", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, { "date": "Tue, 15 Apr 2025 23:34:14 GMT", "version": "15.5.1", diff --git a/lib/msal-common/CHANGELOG.md b/lib/msal-common/CHANGELOG.md index 4ad4a1be42..1d7e758ccc 100644 --- a/lib/msal-common/CHANGELOG.md +++ b/lib/msal-common/CHANGELOG.md @@ -1,9 +1,33 @@ # Change Log - @azure/msal-common - + +## 15.6.0 + +Tue, 06 May 2025 22:47:43 GMT + +### Minor changes + +- Multi-instance detection (shylasummers@microsoft.com) +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 +- Bump rollup-msal to v0.0.0 + +## 15.5.2 + +Tue, 29 Apr 2025 20:25:47 GMT + +### Patches + +- Add optional parameter to NetworkError for error specifics #7721 (sameera.gajjarapu@microsoft.com) +- Fix circular type imports (thomas.norling@microsoft.com) +- Deprecate cache options #7707 (joarroyo@microsoft.com) +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 +- Bump rollup-msal to v0.0.0 + ## 15.5.1 Tue, 15 Apr 2025 23:34:14 GMT diff --git a/lib/msal-common/apiReview/msal-common.api.md b/lib/msal-common/apiReview/msal-common.api.md index cca1651662..de9f264f2d 100644 --- a/lib/msal-common/apiReview/msal-common.api.md +++ b/lib/msal-common/apiReview/msal-common.api.md @@ -1817,7 +1817,7 @@ export function createInteractionRequiredAuthError(errorCode: string): Interacti // Warning: (ae-missing-release-tag) "createNetworkError" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public -export function createNetworkError(error: AuthError, httpStatus?: number, responseHeaders?: Record): NetworkError; +export function createNetworkError(error: AuthError, httpStatus?: number, responseHeaders?: Record, additionalError?: Error): NetworkError; // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen @@ -3255,6 +3255,8 @@ export type PerformanceEvent = { domainHintFromRequest?: boolean; prompt?: string; usePreGeneratedPkce?: boolean; + msalInstanceCount?: number; + sameClientIdInstanceCount?: number; }; // Warning: (tsdoc-undefined-tag) The TSDoc tag "@export" is not defined in this configuration @@ -4291,7 +4293,7 @@ export type ValidCredentialType = IdTokenEntity | AccessTokenEntity | RefreshTok // Warning: (ae-missing-release-tag) "version" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const version = "15.5.1"; +export const version = "15.6.0"; // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen diff --git a/lib/msal-common/package.json b/lib/msal-common/package.json index 5d64c77a97..c02478e770 100644 --- a/lib/msal-common/package.json +++ b/lib/msal-common/package.json @@ -10,7 +10,7 @@ "type": "git", "url": "https://github.com/AzureAD/microsoft-authentication-library-for-js.git" }, - "version": "15.5.1", + "version": "15.6.0", "description": "Microsoft Authentication Library for js", "keywords": [ "implicit", @@ -107,6 +107,7 @@ "@types/node": "^20.3.1", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", + "jest-junit": "^16.0.0", "lodash": "^4.17.21", "msal-test-utils": "file:../../shared-test-utils", "prettier": "2.8.7", diff --git a/lib/msal-common/src/error/NetworkError.ts b/lib/msal-common/src/error/NetworkError.ts index 0b4c9f5aa2..60b64a351f 100644 --- a/lib/msal-common/src/error/NetworkError.ts +++ b/lib/msal-common/src/error/NetworkError.ts @@ -38,7 +38,9 @@ export class NetworkError extends AuthError { export function createNetworkError( error: AuthError, httpStatus?: number, - responseHeaders?: Record + responseHeaders?: Record, + additionalError?: Error ): NetworkError { + error.errorMessage = `${error.errorMessage}, additionalErrorInfo: error.name:${additionalError?.name}, error.message:${additionalError?.message}`; return new NetworkError(error, httpStatus, responseHeaders); } diff --git a/lib/msal-common/src/packageMetadata.ts b/lib/msal-common/src/packageMetadata.ts index d694fa2f76..e70cc69085 100644 --- a/lib/msal-common/src/packageMetadata.ts +++ b/lib/msal-common/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-common"; -export const version = "15.5.1"; +export const version = "15.6.0"; diff --git a/lib/msal-common/src/telemetry/performance/PerformanceEvent.ts b/lib/msal-common/src/telemetry/performance/PerformanceEvent.ts index 6edd889ae5..b2fa072096 100644 --- a/lib/msal-common/src/telemetry/performance/PerformanceEvent.ts +++ b/lib/msal-common/src/telemetry/performance/PerformanceEvent.ts @@ -888,6 +888,11 @@ export type PerformanceEvent = { prompt?: string; usePreGeneratedPkce?: boolean; + + // Number of MSAL JS instances in the frame + msalInstanceCount?: number; + // Number of MSAL JS instances using the same client id in the frame + sameClientIdInstanceCount?: number; }; export type PerformanceEventContext = { diff --git a/lib/msal-node/CHANGELOG.json b/lib/msal-node/CHANGELOG.json index 9b6dcf0a12..4918da6fab 100644 --- a/lib/msal-node/CHANGELOG.json +++ b/lib/msal-node/CHANGELOG.json @@ -1,6 +1,80 @@ { "name": "@azure/msal-node", "entries": [ + { + "date": "Tue, 06 May 2025 22:47:43 GMT", + "version": "3.5.3", + "tag": "@azure/msal-node_v3.5.3", + "comments": { + "none": [ + { + "author": "rginsburg@microsoft.com", + "package": "@azure/msal-node", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "Minor comment updates for retry policy tests #7704" + }, + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-node", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "New dev dependency" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump @azure/msal-common to v15.6.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, + { + "date": "Tue, 29 Apr 2025 20:25:48 GMT", + "version": "3.5.2", + "tag": "@azure/msal-node_v3.5.2", + "comments": { + "patch": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-node", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Fix circular type imports" + }, + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump @azure/msal-common to v15.5.2", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-node", + "comment": "Bump rollup-msal to v0.0.0", + "commit": "not available" + } + ] + } + }, { "date": "Tue, 15 Apr 2025 23:34:14 GMT", "version": "3.5.1", diff --git a/lib/msal-node/CHANGELOG.md b/lib/msal-node/CHANGELOG.md index d8b04c7a71..b2a16971fe 100644 --- a/lib/msal-node/CHANGELOG.md +++ b/lib/msal-node/CHANGELOG.md @@ -1,9 +1,30 @@ # Change Log - @azure/msal-node - + +## 3.5.3 + +Tue, 06 May 2025 22:47:43 GMT + +### Patches + +- Bump @azure/msal-common to v15.6.0 +- Bump eslint-config-msal to v0.0.0 +- Bump rollup-msal to v0.0.0 + +## 3.5.2 + +Tue, 29 Apr 2025 20:25:48 GMT + +### Patches + +- Fix circular type imports (thomas.norling@microsoft.com) +- Bump @azure/msal-common to v15.5.2 +- Bump eslint-config-msal to v0.0.0 +- Bump rollup-msal to v0.0.0 + ## 3.5.1 Tue, 15 Apr 2025 23:34:14 GMT diff --git a/lib/msal-node/apiReview/msal-node.api.md b/lib/msal-node/apiReview/msal-node.api.md index 3e62e1f0f0..a4d216df1b 100644 --- a/lib/msal-node/apiReview/msal-node.api.md +++ b/lib/msal-node/apiReview/msal-node.api.md @@ -623,7 +623,7 @@ export { ValidCacheType } // Warning: (ae-missing-release-tag) "version" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const version = "3.5.1"; +export const version = "3.5.3"; // Warnings were encountered during analysis: // diff --git a/lib/msal-node/jest.config.cjs b/lib/msal-node/jest.config.cjs index b7c2194cd3..2ce5ea096c 100644 --- a/lib/msal-node/jest.config.cjs +++ b/lib/msal-node/jest.config.cjs @@ -6,6 +6,7 @@ module.exports = { verbose: true, moduleFileExtensions: ["ts", "tsx", "js", "json", "jsx", "node"], + reporters: ["default", "jest-junit"], testMatch: ["/test/**/*.spec.ts"], transform: { "^.+\\.(ts|tsx)$": "ts-jest", diff --git a/lib/msal-node/package.json b/lib/msal-node/package.json index 073193cd31..ae4a2a18c9 100644 --- a/lib/msal-node/package.json +++ b/lib/msal-node/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@azure/msal-node", - "version": "3.5.1", + "version": "3.5.3", "author": { "name": "Microsoft", "email": "nugetaad@microsoft.com", @@ -71,6 +71,7 @@ "@types/uuid": "^7.0.0", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", + "jest-junit": "^16.0.0", "prettier": "2.8.7", "rollup": "^4.22.4", "rollup-msal": "file:../../shared-configs/rollup-msal", @@ -80,7 +81,7 @@ "yargs": "^17.3.1" }, "dependencies": { - "@azure/msal-common": "15.5.1", + "@azure/msal-common": "15.6.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, diff --git a/lib/msal-node/src/packageMetadata.ts b/lib/msal-node/src/packageMetadata.ts index 9c67f47419..b27c6bbe94 100644 --- a/lib/msal-node/src/packageMetadata.ts +++ b/lib/msal-node/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-node"; -export const version = "3.5.1"; +export const version = "3.5.3"; diff --git a/lib/msal-node/src/retry/DefaultManagedIdentityRetryPolicy.ts b/lib/msal-node/src/retry/DefaultManagedIdentityRetryPolicy.ts index e4e77b887b..2688fd4d0e 100644 --- a/lib/msal-node/src/retry/DefaultManagedIdentityRetryPolicy.ts +++ b/lib/msal-node/src/retry/DefaultManagedIdentityRetryPolicy.ts @@ -8,7 +8,7 @@ import { HttpStatus, Logger } from "@azure/msal-common"; import { IHttpRetryPolicy } from "./IHttpRetryPolicy.js"; import { LinearRetryStrategy } from "./LinearRetryStrategy.js"; -const DEFAULT_MANAGED_IDENTITY_MAX_RETRIES: number = 3; +export const DEFAULT_MANAGED_IDENTITY_MAX_RETRIES: number = 3; // referenced in unit test const DEFAULT_MANAGED_IDENTITY_RETRY_DELAY_MS: number = 1000; const DEFAULT_MANAGED_IDENTITY_HTTP_STATUS_CODES_TO_RETRY_ON: Array = [ HttpStatus.NOT_FOUND, diff --git a/lib/msal-node/test/client/ManagedIdentitySources/DefaultManagedIdentityRetryPolicy.spec.ts b/lib/msal-node/test/client/ManagedIdentitySources/DefaultManagedIdentityRetryPolicy.spec.ts index 9d6f8d6a15..562b0085eb 100644 --- a/lib/msal-node/test/client/ManagedIdentitySources/DefaultManagedIdentityRetryPolicy.spec.ts +++ b/lib/msal-node/test/client/ManagedIdentitySources/DefaultManagedIdentityRetryPolicy.spec.ts @@ -6,7 +6,6 @@ import { ManagedIdentityApplication } from "../../../src/client/ManagedIdentityApplication.js"; import { DEFAULT_USER_SYSTEM_ASSIGNED_MANAGED_IDENTITY_AUTHENTICATION_RESULT, - LINEAR_POLICY_MAX_RETRIES_IN_MS, MANAGED_IDENTITY_SERVICE_FABRIC_NETWORK_REQUEST_400_ERROR, MANAGED_IDENTITY_TOKEN_RETRIEVAL_ERROR_MESSAGE, ONE_HUNDRED_TIMES_FASTER, @@ -186,8 +185,11 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear }); test("returns a 500 error response from the network request, just the first time, with a retry-after header of 3 seconds", async () => { + // make it one hundred times faster so the test completes quickly + const RETRY_AFTER_SECONDS: number = 3 * ONE_HUNDRED_TIMES_FASTER; + const headers: Record = { - "Retry-After": ".03", // 3 seconds, but make it one hundred times faster so the test completes quickly + "Retry-After": RETRY_AFTER_SECONDS.toString(), }; const managedIdentityNetworkErrorClient = new ManagedIdentityNetworkErrorClient(undefined, headers); @@ -214,9 +216,7 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear expect( timeAfterNetworkRequest.valueOf() - timeBeforeNetworkRequest.valueOf() - ).toBeGreaterThanOrEqual( - LINEAR_POLICY_MAX_RETRIES_IN_MS * ONE_HUNDRED_TIMES_FASTER - ); + ).toBeGreaterThanOrEqual(RETRY_AFTER_SECONDS * 1000); // convert to milliseconds, it was already defined as 100 times faster expect(sendGetRequestAsyncSpy).toHaveBeenCalledTimes(2); expect(networkManagedIdentityResult.accessToken).toEqual( @@ -225,10 +225,14 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear }); test("returns a 500 error response from the network request, just the first time, with a retry-after header of 3 seconds (extrapolated from an http-date)", async () => { + // this test can not be made one hundred times faster because it is based on a date + const RETRY_AFTER_SECONDS: number = 3; + var retryAfterHttpDate = new Date(); retryAfterHttpDate.setSeconds( - retryAfterHttpDate.getSeconds() + 4 // 4 seconds. An extra second has been added to account for this date operation - ); // this test can not be made one hundred times faster because it is based on a date + // an extra second has been added to account for this date operation + retryAfterHttpDate.getSeconds() + RETRY_AFTER_SECONDS + 1 + ); const headers: Record = { "Retry-After": retryAfterHttpDate.toString(), }; @@ -257,7 +261,7 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear expect( timeAfterNetworkRequest.valueOf() - timeBeforeNetworkRequest.valueOf() - ).toBeGreaterThanOrEqual(LINEAR_POLICY_MAX_RETRIES_IN_MS); + ).toBeGreaterThanOrEqual(RETRY_AFTER_SECONDS * 1000); // convert to milliseconds expect(sendGetRequestAsyncSpy).toHaveBeenCalledTimes(2); expect(networkManagedIdentityResult.accessToken).toEqual( @@ -303,7 +307,8 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear resource: "https://graph.microsoft1.com", }); } catch (e) { - expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes(4); // request + 3 retries + // 4 total: request + 3 retries + expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes(4); } try { @@ -311,7 +316,8 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear resource: "https://graph.microsoft2.com", }); } catch (e) { - expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes(8); // 8 total, 2 x (request + 3 retries) + // 8 total: 2 x (request + 3 retries) + expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes(8); } try { @@ -319,7 +325,8 @@ describe("Linear Retry Policy (App Service, Azure Arc, Cloud Shell, Machine Lear resource: "https://graph.microsoft3.com", }); } catch (e) { - expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes(12); // 12 total, 3 x (request + 3 retries) + // 12 total: 3 x (request + 3 retries) + expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes(12); } }); diff --git a/lib/msal-node/test/client/ManagedIdentitySources/Imds.spec.ts b/lib/msal-node/test/client/ManagedIdentitySources/Imds.spec.ts index 935b95feb9..170613a5fd 100644 --- a/lib/msal-node/test/client/ManagedIdentitySources/Imds.spec.ts +++ b/lib/msal-node/test/client/ManagedIdentitySources/Imds.spec.ts @@ -316,10 +316,7 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { const timeAfterNetworkRequest = new Date(); - /** - * ensure that each retry followed the exponential backoff strategy - * 2 x exponential backoff (1 second -> 2 seconds) - */ + // exponential backoff (1 second -> 2 seconds) expect( timeAfterNetworkRequest.valueOf() - timeBeforeNetworkRequest.valueOf() @@ -378,10 +375,7 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { const timeAfterNetworkRequest = new Date(); - /** - * ensure that each retry followed the exponential backoff strategy - * 7 x linear backoff (10 seconds) - */ + // linear backoff (10 seconds * 4 retries) expect( timeAfterNetworkRequest.valueOf() - timeBeforeNetworkRequest.valueOf() @@ -415,7 +409,7 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { const sendGetRequestAsyncSpy: jest.SpyInstance = jest .spyOn(networkClient, "sendGetRequestAsync") - // permanently override the networkClient's sendGetRequestAsync method to return a 504 + // permanently override the networkClient's sendGetRequestAsync method to return a 410 .mockReturnValue( managedIdentityNetworkErrorClient410.sendGetRequestAsync() ); @@ -433,10 +427,7 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { const timeAfterNetworkRequest = new Date(); - /** - * ensure that each retry followed the exponential backoff strategy - * 7 x linear backoff (10 seconds) - */ + // linear backoff (10 seconds * 7 retries) expect( timeAfterNetworkRequest.valueOf() - timeBeforeNetworkRequest.valueOf() @@ -490,10 +481,7 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { const timeAfterNetworkRequest = new Date(); - /** - * ensure that each retry followed the exponential backoff strategy - * 3 x exponential backoff (1 second -> 2 seconds -> 4 seconds) - */ + // exponential backoff (1 second -> 2 seconds -> 4 seconds) expect( timeAfterNetworkRequest.valueOf() - timeBeforeNetworkRequest.valueOf() @@ -531,9 +519,10 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { resource: "https://graph.microsoft1.com", }); } catch (e) { + // 4 total: request + 3 retries expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes( IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_NUM_REQUESTS - ); // request + 3 retries + ); } try { @@ -541,9 +530,10 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { resource: "https://graph.microsoft2.com", }); } catch (e) { + // 8 total: 2 x (request + 3 retries) expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes( IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_NUM_REQUESTS * 2 - ); // 8 total, 2 x (request + 3 retries) + ); } try { @@ -551,9 +541,10 @@ describe("Acquires a token successfully via an IMDS Managed Identity", () => { resource: "https://graph.microsoft3.com", }); } catch (e) { + // 12 total: 3 x (request + 3 retries) expect(sendGetRequestAsyncSpyApp).toHaveBeenCalledTimes( IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_NUM_REQUESTS * 3 - ); // 12 total, 3 x (request + 3 retries) + ); } } ); diff --git a/lib/msal-node/test/test_kit/StringConstants.ts b/lib/msal-node/test/test_kit/StringConstants.ts index bd003a7b47..e822294917 100644 --- a/lib/msal-node/test/test_kit/StringConstants.ts +++ b/lib/msal-node/test/test_kit/StringConstants.ts @@ -569,11 +569,10 @@ export const CORS_SIMPLE_REQUEST_HEADERS = [ export const ONE_HUNDRED_TIMES_FASTER: number = 0.01; -export const LINEAR_POLICY_MAX_RETRIES_IN_MS = 3000; -export const IMDS_EXPONENTIAL_STRATEGY_TWO_RETRIES_IN_MS = 3000; // 1 -> 2 -export const IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_IN_MS = 7000; // 1 -> 2 -> 4 +export const IMDS_EXPONENTIAL_STRATEGY_TWO_RETRIES_IN_MS = 3000; // 1 second -> 2 seconds +export const IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_IN_MS = 7000; // 1 second -> 2 seconds -> 4 seconds -export const IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_NUM_REQUESTS = 4; // initial request -> 1 -> 2 -> 4 +export const IMDS_EXPONENTIAL_STRATEGY_MAX_RETRIES_NUM_REQUESTS = 4; // initial request -> 1 second -> 2 seconds -> 4 seconds export const MOCK_USERNAME = `mock_${PasswordGrantConstants.username}`; export const MOCK_PASSWORD = `mock_${PasswordGrantConstants.password}`; diff --git a/lib/msal-react/CHANGELOG.json b/lib/msal-react/CHANGELOG.json index 2de216106e..847b511a97 100644 --- a/lib/msal-react/CHANGELOG.json +++ b/lib/msal-react/CHANGELOG.json @@ -1,6 +1,80 @@ { "name": "@azure/msal-react", "entries": [ + { + "date": "Tue, 06 May 2025 22:47:43 GMT", + "version": "3.0.12", + "tag": "@azure/msal-react_v3.0.12", + "comments": { + "patch": [ + { + "author": "ethan.pearce@rightmove.co.uk", + "package": "@azure/msal-react", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "chore: Allow react 19 usage" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump @azure/msal-browser to v4.12.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + } + ], + "none": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-react", + "commit": "b6098464c80f3db124ca3db145446ddb71be936d", + "comment": "New dev dependency" + } + ] + } + }, + { + "date": "Tue, 29 Apr 2025 20:25:48 GMT", + "version": "3.0.11", + "tag": "@azure/msal-react_v3.0.11", + "comments": { + "patch": [ + { + "author": "thomas.norling@microsoft.com", + "package": "@azure/msal-react", + "commit": "2b6112d62495ac4e3245d8a0d9be6b541ffb206c", + "comment": "Fix race between cache initialization and state initialization" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump @azure/msal-browser to v4.11.1", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump eslint-config-msal to v0.0.0", + "commit": "not available" + }, + { + "author": "beachball", + "package": "@azure/msal-react", + "comment": "Bump msal-test-utils to v0.0.1", + "commit": "not available" + } + ] + } + }, { "date": "Tue, 15 Apr 2025 23:34:14 GMT", "version": "3.0.10", diff --git a/lib/msal-react/CHANGELOG.md b/lib/msal-react/CHANGELOG.md index 5bc2e93d7e..b47df06172 100644 --- a/lib/msal-react/CHANGELOG.md +++ b/lib/msal-react/CHANGELOG.md @@ -1,9 +1,31 @@ # Change Log - @azure/msal-react - + +## 3.0.12 + +Tue, 06 May 2025 22:47:43 GMT + +### Patches + +- chore: Allow react 19 usage (ethan.pearce@rightmove.co.uk) +- Bump @azure/msal-browser to v4.12.0 +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 + +## 3.0.11 + +Tue, 29 Apr 2025 20:25:48 GMT + +### Patches + +- Fix race between cache initialization and state initialization (thomas.norling@microsoft.com) +- Bump @azure/msal-browser to v4.11.1 +- Bump eslint-config-msal to v0.0.0 +- Bump msal-test-utils to v0.0.1 + ## 3.0.10 Tue, 15 Apr 2025 23:34:14 GMT diff --git a/lib/msal-react/README.md b/lib/msal-react/README.md index b5ed11dfaa..482b85c15e 100644 --- a/lib/msal-react/README.md +++ b/lib/msal-react/README.md @@ -4,8 +4,8 @@ [![npm version](https://img.shields.io/npm/dm/@azure/msal-react.svg)](https://nodei.co/npm/@azure/msal-react/) [![codecov](https://codecov.io/gh/AzureAD/microsoft-authentication-library-for-js/branch/dev/graph/badge.svg?flag=msal-react)](https://codecov.io/gh/AzureAD/microsoft-authentication-library-for-js) -| Getting Started | AAD Docs | Library Reference | Samples -|--- | --- | --- | --- | +| Getting Started | AAD Docs | Library Reference | Samples | +| ------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | 1. [About](#about) 1. [FAQ](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-react/FAQ.md) @@ -32,16 +32,16 @@ The `@azure/msal-react` package described by the code in this folder uses the [` ## Prerequisites -- `@azure/msal-react` is meant to be used in [Single-Page Application scenarios](https://docs.microsoft.com/azure/active-directory/develop/scenario-spa-overview). +- `@azure/msal-react` is meant to be used in [Single-Page Application scenarios](https://docs.microsoft.com/azure/active-directory/develop/scenario-spa-overview). -- Before using `@azure/msal-react` you will need to [register a Single Page Application in Azure AD](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-app-registration) to get a valid `clientId` for configuration, and to register the routes that your app will accept redirect traffic on. +- Before using `@azure/msal-react` you will need to [register a Single Page Application in Azure AD](https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-spa-app-registration) to get a valid `clientId` for configuration, and to register the routes that your app will accept redirect traffic on. ## Version Support -| MSAL React version | MSAL support status | Supported React versions | -| ------------------ | ------------------- | -------------------------- | -| MSAL React v2 | Active development | 16, 17, 18 | -| MSAL React v1 | In maintenance | 16, 17, 18 | +| MSAL React version | MSAL support status | Supported React versions | +| ------------------ | ------------------- | ------------------------ | +| MSAL React v3 | Active development | 16, 17, 18, 19 | +| MSAL React v1, v2 | In maintenance | 16, 17, 18 | **Note:** There have been no functional changes in the MSAL React v2 release. @@ -111,11 +111,11 @@ Since `@azure/msal-react` is a wrapper around `@azure/msal-browser` many docs fr ### Advanced Topics -- [Configuration Options](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/configuration.md) -- [Request and Response Details](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/request-response-object.md) -- [Events](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/events.md) -- [Cache Storage](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/caching.md) -- [Performance Enhancements](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/performance.md) +- [Configuration Options](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/configuration.md) +- [Request and Response Details](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/request-response-object.md) +- [Events](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/events.md) +- [Cache Storage](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/caching.md) +- [Performance Enhancements](https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/performance.md) ### MSAL React Specific Concepts @@ -128,18 +128,18 @@ Since `@azure/msal-react` is a wrapper around `@azure/msal-browser` many docs fr Our [samples directory](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples) contains several example apps you can spin up to see how this library can be used in different contexts. -- [Create React App (JS) Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/react-router-sample) -- [Create React App (TS) Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/typescript-sample) -- [Next.js Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/nextjs-sample) -- [Gatsby Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/gatsby-sample) -- [B2C Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/b2c-sample) +- [Create React App (JS) Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/react-router-sample) +- [Create React App (TS) Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/typescript-sample) +- [Next.js Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/nextjs-sample) +- [Gatsby Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/gatsby-sample) +- [B2C Sample](https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/samples/msal-react-samples/b2c-sample) More advanced samples backed with a tutorial can be found in the [Azure Samples](https://github.com/Azure-Samples) space on GitHub: -- [React SPA calling Express.js web API](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/3-Authorization-II/1-call-api) -- [React SPA calling Express.js web API using App Roles and RBAC](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/1-call-api-roles) -- [React SPA calling Microsoft Graph via Express.js web API using on-behalf-of flow](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/1-call-api-obo) -- [Deployment tutorial for Azure Static Web Apps](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/2-deploy-static) +- [React SPA calling Express.js web API](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/3-Authorization-II/1-call-api) +- [React SPA calling Express.js web API using App Roles and RBAC](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/5-AccessControl/1-call-api-roles) +- [React SPA calling Microsoft Graph via Express.js web API using on-behalf-of flow](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/6-AdvancedScenarios/1-call-api-obo) +- [Deployment tutorial for Azure Static Web Apps](https://github.com/Azure-Samples/ms-identity-javascript-react-tutorial/tree/main/4-Deployment/2-deploy-static) ## Security Reporting @@ -147,7 +147,7 @@ If you find a security issue with our libraries or services please report it to ## License -Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT License. +Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT License. ## We Value and Adhere to the Microsoft Open Source Code of Conduct diff --git a/lib/msal-react/apiReview/msal-react.api.md b/lib/msal-react/apiReview/msal-react.api.md index 0975203f6e..0c5042a607 100644 --- a/lib/msal-react/apiReview/msal-react.api.md +++ b/lib/msal-react/apiReview/msal-react.api.md @@ -153,7 +153,7 @@ export function useMsalAuthentication(interactionType: InteractionType, authenti // Warning: (ae-missing-release-tag) "version" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const version = "3.0.10"; +export const version = "3.0.12"; // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen // Warning: (ae-missing-release-tag) "withMsal" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/lib/msal-react/package.json b/lib/msal-react/package.json index 3f717e2bb4..df5ea3b9cb 100644 --- a/lib/msal-react/package.json +++ b/lib/msal-react/package.json @@ -1,6 +1,6 @@ { "name": "@azure/msal-react", - "version": "3.0.10", + "version": "3.0.12", "author": { "name": "Microsoft", "email": "nugetaad@microsoft.com", @@ -54,26 +54,27 @@ "apiExtractor": "api-extractor run" }, "peerDependencies": { - "@azure/msal-browser": "^4.11.0", - "react": "^16.8.0 || ^17 || ^18" + "@azure/msal-browser": "^4.12.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" }, "devDependencies": { - "@azure/msal-browser": "^4.11.0", + "@azure/msal-browser": "^4.12.0", "@microsoft/api-extractor": "^7.43.4", "@rollup/plugin-typescript": "^11.1.5", "@testing-library/jest-dom": "^5.11.5", - "@testing-library/react": "^13.4.0", + "@testing-library/react": "^16.3.0", "@types/jest": "^29.5.0", "@types/node": "^20.5.1", - "@types/react": "^18.2.13", - "@types/react-dom": "^18.2.6", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", + "jest-junit": "^16.0.0", "msal-test-utils": "file:../../shared-test-utils", "prettier": "2.8.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "rollup": "^4.22.4", "ts-jest": "^29.1.0", "ts-jest-resolver": "^2.0.1", diff --git a/lib/msal-react/src/MsalProvider.tsx b/lib/msal-react/src/MsalProvider.tsx index cfefb1b18f..2c95247931 100644 --- a/lib/msal-react/src/MsalProvider.tsx +++ b/lib/msal-react/src/MsalProvider.tsx @@ -85,6 +85,11 @@ const reducer = ( throw new Error(`Unknown action type: ${type}`); } + if (newInProgress === InteractionStatus.Startup) { + // Can't start checking accounts until initialization is complete + return previousState; + } + const currentAccounts = payload.instance.getAllAccounts(); if ( newInProgress !== previousState.inProgress && @@ -135,7 +140,7 @@ export function MsalProvider({ // Lazy initialization of the initial state return { inProgress: InteractionStatus.Startup, - accounts: instance.getAllAccounts(), + accounts: [], }; }); diff --git a/lib/msal-react/src/hooks/useAccount.ts b/lib/msal-react/src/hooks/useAccount.ts index 18b18b8e6b..a1437e442e 100644 --- a/lib/msal-react/src/hooks/useAccount.ts +++ b/lib/msal-react/src/hooks/useAccount.ts @@ -8,6 +8,7 @@ import { AccountInfo, IPublicClientApplication, AccountEntityUtils, + InteractionStatus, } from "@azure/msal-browser"; import { useMsal } from "./useMsal.js"; import { AccountIdentifiers } from "../types/AccountIdentifiers.js"; @@ -42,26 +43,32 @@ export function useAccount( ): AccountInfo | null { const { instance, inProgress, logger } = useMsal(); - const [account, setAccount] = useState(() => - getAccount(instance, accountIdentifiers) - ); + const [account, setAccount] = useState(() => { + if (inProgress === InteractionStatus.Startup) { + return null; + } else { + return getAccount(instance, accountIdentifiers); + } + }); useEffect(() => { - setAccount((currentAccount: AccountInfo | null) => { - const nextAccount = getAccount(instance, accountIdentifiers); - if ( - !AccountEntityUtils.accountInfoIsEqual( - currentAccount, - nextAccount, - true - ) - ) { - logger.info("useAccount - Updating account"); - return nextAccount; - } + if (inProgress !== InteractionStatus.Startup) { + setAccount((currentAccount: AccountInfo | null) => { + const nextAccount = getAccount(instance, accountIdentifiers); + if ( + !AccountEntityUtils.accountInfoIsEqual( + currentAccount, + nextAccount, + true + ) + ) { + logger.info("useAccount - Updating account"); + return nextAccount; + } - return currentAccount; - }); + return currentAccount; + }); + } }, [inProgress, accountIdentifiers, instance, logger]); return account; diff --git a/lib/msal-react/src/hooks/useMsalAuthentication.ts b/lib/msal-react/src/hooks/useMsalAuthentication.ts index 9a0f02de17..25408e6371 100644 --- a/lib/msal-react/src/hooks/useMsalAuthentication.ts +++ b/lib/msal-react/src/hooks/useMsalAuthentication.ts @@ -253,8 +253,8 @@ export function useMsalAuthentication( shouldAcquireToken.current && inProgress === InteractionStatus.None ) { - shouldAcquireToken.current = false; if (!isAuthenticated) { + shouldAcquireToken.current = false; logger.info( "useMsalAuthentication - No user is authenticated, attempting to login" ); @@ -263,6 +263,7 @@ export function useMsalAuthentication( return; }); } else if (account) { + shouldAcquireToken.current = false; logger.info( "useMsalAuthentication - User is authenticated, attempting to acquire token" ); diff --git a/lib/msal-react/src/packageMetadata.ts b/lib/msal-react/src/packageMetadata.ts index a9f82ec2b3..ba0ea4cd54 100644 --- a/lib/msal-react/src/packageMetadata.ts +++ b/lib/msal-react/src/packageMetadata.ts @@ -1,3 +1,3 @@ /* eslint-disable header/header */ export const name = "@azure/msal-react"; -export const version = "3.0.10"; +export const version = "3.0.12"; diff --git a/package-lock.json b/package-lock.json index f3d5d079f5..3aa47602ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,11 +53,11 @@ }, "extensions/msal-node-extensions": { "name": "@azure/msal-node-extensions", - "version": "1.5.11", + "version": "1.5.13", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "15.5.1", + "@azure/msal-common": "15.6.0", "@azure/msal-node-runtime": "^0.18.1", "keytar": "^7.8.0" }, @@ -68,6 +68,7 @@ "@types/node": "^20.3.1", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", + "jest-junit": "^16.0.0", "msal-test-utils": "file:../../shared-test-utils", "node-addon-api": "^6.1.0", "rollup": "^4.22.4", @@ -83,9 +84,9 @@ } }, "extensions/msal-node-extensions/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -130,9 +131,9 @@ } }, "extensions/samples/electron-webpack/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -274,7 +275,7 @@ }, "lib/msal-angular": { "name": "@azure/msal-angular", - "version": "4.0.10", + "version": "4.0.12", "license": "MIT", "devDependencies": { "@angular-devkit/build-angular": "^19.2.3", @@ -288,7 +289,7 @@ "@angular/platform-browser": "^19.2.2", "@angular/platform-browser-dynamic": "^19.2.2", "@angular/router": "^19.2.2", - "@azure/msal-browser": "^4.10.0", + "@azure/msal-browser": "^4.12.0", "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", @@ -309,22 +310,22 @@ "zone.js": "~0.15.0" }, "peerDependencies": { - "@azure/msal-browser": "^4.11.0", + "@azure/msal-browser": "^4.12.0", "rxjs": "^7.0.0" } }, "lib/msal-angular/node_modules/@angular-devkit/build-angular": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.9.tgz", - "integrity": "sha512-v6x3h+LYyEew3EjoI1+2IiFDz6f96lJB1JvbbZj3Li9FMhO4M/xo4BaWHbeg9Lot/vUy6IAlR+BJywawNIzv0Q==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.12.tgz", + "integrity": "sha512-gPx3Vi7QFzHkSV388en6VqSqasojitJKuKmgTMPOV5keLtpOylPv3rjnr8oO9rYbYmLsT/WTUsP7bYiZhrr19Q==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", - "@angular-devkit/build-webpack": "0.1902.9", - "@angular-devkit/core": "19.2.9", - "@angular/build": "19.2.9", + "@angular-devkit/architect": "0.1902.12", + "@angular-devkit/build-webpack": "0.1902.12", + "@angular-devkit/core": "19.2.12", + "@angular/build": "19.2.12", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -335,7 +336,7 @@ "@babel/preset-env": "7.26.9", "@babel/runtime": "7.26.10", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.2.9", + "@ngtools/webpack": "19.2.12", "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -343,7 +344,7 @@ "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.1", + "esbuild-wasm": "0.25.4", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", @@ -382,14 +383,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.1" + "esbuild": "0.25.4" }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -440,14 +441,14 @@ } }, "lib/msal-angular/node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.9.tgz", - "integrity": "sha512-hrRhSdY98wGQ/jrpT3K73/Ii5FadQEJFcHy+ockqP2Xh7pXOwhGFc+D0ks4AdHea+pHtNbIb/qPd+UvR5izY3Q==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.12.tgz", + "integrity": "sha512-G28ux1T5QDlWporwupWbcodBN3rcyHfK2Dh5M3UC5hj0GstpfEHcpBHxawZzIxhqPKy//tdVLlzORUgvAwnqbA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", + "@angular-devkit/architect": "0.1902.12", "@babel/core": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -456,7 +457,7 @@ "@vitejs/plugin-basic-ssl": "1.2.0", "beasties": "0.3.2", "browserslist": "^4.23.0", - "esbuild": "0.25.1", + "esbuild": "0.25.4", "fast-glob": "3.3.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", @@ -470,7 +471,7 @@ "sass": "1.85.0", "semver": "7.7.1", "source-map-support": "0.5.21", - "vite": "6.2.6", + "vite": "6.2.7", "watchpack": "2.4.2" }, "engines": { @@ -487,7 +488,7 @@ "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^19.0.0 || ^19.2.0-next.0", @@ -526,9 +527,9 @@ } }, "lib/msal-angular/node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", + "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -649,9 +650,9 @@ } }, "lib/msal-angular/node_modules/@angular-devkit/build-angular/node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.15.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz", + "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==", "dev": true, "license": "MIT", "optional": true, @@ -671,9 +672,9 @@ } }, "lib/msal-angular/node_modules/@angular/compiler-cli": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.8.tgz", - "integrity": "sha512-gq/sc3D3m6aKmhdSTTzzD59wfQcVjIZ8dgJoPW7pOcmPVQL1N8syjv+quHySfSJlBkbs5dQ0P4Kk0yvxRw9S7g==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.11.tgz", + "integrity": "sha512-15aoOg+qj7Z3Uap1JKHMy51y12M09AOnseDBa0SYKidSx15XwZi8d01hv7sRaQJX/6Ie5cug9GiAbLKts6R33w==", "dev": true, "license": "MIT", "dependencies": { @@ -695,7 +696,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.8", + "@angular/compiler": "19.2.11", "typescript": ">=5.5 <5.9" } }, @@ -747,10 +748,181 @@ "semver": "bin/semver.js" } }, + "lib/msal-angular/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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" + } + }, + "lib/msal-angular/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, + "license": "MIT" + }, + "lib/msal-angular/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "lib/msal-angular/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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "lib/msal-angular/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "lib/msal-angular/node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "lib/msal-angular/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "lib/msal-angular/node_modules/@ngtools/webpack": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.9.tgz", - "integrity": "sha512-CLfUauqi2Xp/jKGxp5wUwjqfVQWcBE09GMd51ovcCRLkgB2Kh26+CiVnGw5/lkBpISUCNdgN6nGiS+nfqMfFeQ==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.12.tgz", + "integrity": "sha512-MTxkM+jZPQP55q0BWx/1w2kaN9mSFC14V9+p4sfNm/OXk7fibtxz5lXH/2sDGFWJi36s4gppKqfHBhp9OTdHCQ==", "dev": true, "license": "MIT", "engines": { @@ -1136,9 +1308,9 @@ } }, "lib/msal-angular/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1404,6 +1576,19 @@ } } }, + "lib/msal-angular/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "lib/msal-angular/node_modules/ts-node": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", @@ -1499,10 +1684,10 @@ }, "lib/msal-browser": { "name": "@azure/msal-browser", - "version": "4.11.0", + "version": "4.12.0", "license": "MIT", "dependencies": { - "@azure/msal-common": "15.5.1" + "@azure/msal-common": "15.6.0" }, "devDependencies": { "@azure/storage-blob": "^12.2.1", @@ -1522,6 +1707,7 @@ "fake-indexeddb": "^3.1.3", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", + "jest-junit": "^16.0.0", "msal-test-utils": "file:../../shared-test-utils", "prettier": "^2.8.7", "rimraf": "^3.0.0", @@ -1539,9 +1725,9 @@ } }, "lib/msal-browser/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1557,7 +1743,7 @@ }, "lib/msal-common": { "name": "@azure/msal-common", - "version": "15.5.1", + "version": "15.6.0", "license": "MIT", "devDependencies": { "@babel/core": "^7.7.2", @@ -1573,6 +1759,7 @@ "@types/node": "^20.3.1", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", + "jest-junit": "^16.0.0", "lodash": "^4.17.21", "msal-test-utils": "file:../../shared-test-utils", "prettier": "2.8.7", @@ -1592,9 +1779,9 @@ } }, "lib/msal-common/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1654,10 +1841,10 @@ }, "lib/msal-node": { "name": "@azure/msal-node", - "version": "3.5.1", + "version": "3.5.3", "license": "MIT", "dependencies": { - "@azure/msal-common": "15.5.1", + "@azure/msal-common": "15.6.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -1671,6 +1858,7 @@ "@types/uuid": "^7.0.0", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", + "jest-junit": "^16.0.0", "prettier": "2.8.7", "rollup": "^4.22.4", "rollup-msal": "file:../../shared-configs/rollup-msal", @@ -1684,9 +1872,9 @@ } }, "lib/msal-node/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1702,25 +1890,26 @@ }, "lib/msal-react": { "name": "@azure/msal-react", - "version": "3.0.10", + "version": "3.0.12", "license": "MIT", "devDependencies": { - "@azure/msal-browser": "^4.11.0", + "@azure/msal-browser": "^4.12.0", "@microsoft/api-extractor": "^7.43.4", "@rollup/plugin-typescript": "^11.1.5", "@testing-library/jest-dom": "^5.11.5", - "@testing-library/react": "^13.4.0", + "@testing-library/react": "^16.3.0", "@types/jest": "^29.5.0", "@types/node": "^20.5.1", - "@types/react": "^18.2.13", - "@types/react-dom": "^18.2.6", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", "eslint-config-msal": "file:../../shared-configs/eslint-config-msal", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", + "jest-junit": "^16.0.0", "msal-test-utils": "file:../../shared-test-utils", "prettier": "2.8.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "rollup": "^4.22.4", "ts-jest": "^29.1.0", "ts-jest-resolver": "^2.0.1", @@ -1731,14 +1920,14 @@ "node": ">=10" }, "peerDependencies": { - "@azure/msal-browser": "^4.11.0", - "react": "^16.8.0 || ^17 || ^18" + "@azure/msal-browser": "^4.12.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "lib/msal-react/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1778,13 +1967,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1902.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.9.tgz", - "integrity": "sha512-SLUc7EaFMjhCnimqxTcv32wESJBLQ3E6c/1sAndPojyCoGiX24ASu2pxrTXrYNS9DqiJT8tReAnqmh7dmf3xwQ==", + "version": "0.1902.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.12.tgz", + "integrity": "sha512-LfUc7k84YL290hAxsG+FvjQpXugQXyw5aDzrQQB4iTYhBgaABu2aaNOU4eu3JH+F8NeXd2EBF/YMr2LDSkYlMw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.9", + "@angular-devkit/core": "19.2.12", "rxjs": "7.8.1" }, "engines": { @@ -1804,13 +1993,13 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1902.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.9.tgz", - "integrity": "sha512-iklNoxKgwd54KT5GE0o5SB+0hr6Iu3YSpj9fi23DlLKcWWwFYaKqoRaYcfuL7KdUzunFg7dzB7n6TgYpVHWWJw==", + "version": "0.1902.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.12.tgz", + "integrity": "sha512-JNwvzaN2RVbG1IClFPXhNpysVwf55nWmVsNN5iQHRXkD3kpqnaOfhUBtlhBBjLf/i6cwKEne2TI8zciaEYr+iw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1902.9", + "@angular-devkit/architect": "0.1902.12", "rxjs": "7.8.1" }, "engines": { @@ -1834,9 +2023,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.9.tgz", - "integrity": "sha512-vbTomKnN7H4jaif0hWAECFU2WvRbhfkYWHdlk/JtJM53iIJVL3mKWBRZ0QXITjmgfdIo3c9RcX+wFI7gGqGd6g==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.12.tgz", + "integrity": "sha512-v5pdfZHZ8MTZozfpkhKoPFBpXQW+2GFbTfdyis8FBtevJWCbIsCR3xhodgI4jwzkSEAraN4oVtWvSytdNyBC6A==", "dev": true, "license": "MIT", "dependencies": { @@ -1889,13 +2078,13 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.9.tgz", - "integrity": "sha512-B8FQ4hFsP4Ffh895F9GVvyhgDoZztWnAyYKiM1pyvLSQikzaUZqi9NZnD12HgMALmwm2z36zTzoSNsYFBTHgaw==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.12.tgz", + "integrity": "sha512-vK5NI/asi1snWFkw02DpmC8tLq6u5ZbUwwXxgALKuVwGl3g1VLzrHrkoSCrcsOO9Nu6GQOPbxax2lR/DICmytg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.9", + "@angular-devkit/core": "19.2.12", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", @@ -2045,9 +2234,9 @@ } }, "node_modules/@angular-eslint/eslint-plugin/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2226,9 +2415,9 @@ } }, "node_modules/@angular-eslint/utils/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2287,9 +2476,9 @@ } }, "node_modules/@angular/animations": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.8.tgz", - "integrity": "sha512-gKWBusQvjb946uuTXaXWzkEfLdTiy9GUNZ9okF3yolv+aoW0D8AM9mVvTX1xdqAV3xuIxRXRbkWG7BR+p8xVzQ==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.11.tgz", + "integrity": "sha512-NR33bZVho7EgTc1fmCnmkwc2/U266n311Wfvk7VVtz+0Q9WliNdDLBon654V8IWSKvlqKXyU3W+fp0VjH/FvSw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2298,8 +2487,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.2.8", - "@angular/core": "19.2.8" + "@angular/common": "19.2.11", + "@angular/core": "19.2.11" } }, "node_modules/@angular/cdk": { @@ -2320,18 +2509,18 @@ } }, "node_modules/@angular/cli": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.9.tgz", - "integrity": "sha512-m3yaqrtodzO+tDspAqD6h7Ft8HzP4xbTmqPoSHaAN6Wupf/m/q94AMBmuEk74URS3q7v6PhayOuNOzBY2q4bIw==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.12.tgz", + "integrity": "sha512-cZkHpM16uh3VouHG1XdWSk0ZWisQRxMVADk5IJlM9jMcPqnFyJwD/UXCS+XTaW3POpNDwsmbh2UB9Xabdgo7rw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": "0.1902.9", - "@angular-devkit/core": "19.2.9", - "@angular-devkit/schematics": "19.2.9", + "@angular-devkit/architect": "0.1902.12", + "@angular-devkit/core": "19.2.12", + "@angular-devkit/schematics": "19.2.12", "@inquirer/prompts": "7.3.2", "@listr2/prompt-adapter-inquirer": "2.0.18", - "@schematics/angular": "19.2.9", + "@schematics/angular": "19.2.12", "@yarnpkg/lockfile": "1.1.0", "ini": "5.0.0", "jsonc-parser": "3.3.1", @@ -2353,10 +2542,23 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular/common": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.8.tgz", - "integrity": "sha512-SnW+/amz1Mtni9125xlzPZ5MU+wSzUepc9G5jRnL0q9vrFglRWa3BEW3GxVurfbdnf6FleroZ7fZCZFAfREw7Q==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.11.tgz", + "integrity": "sha512-/ZnF2Nfp6S6TAu3VlvUAIp4NVd81WE1Q95wuwSSuoEx2aSyXzI+1myyKWSYe/jYCyGuppmocjTciEh8mAInmOw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2365,14 +2567,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "19.2.8", + "@angular/core": "19.2.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.8.tgz", - "integrity": "sha512-HBtt96X09XFatHAnkquFYbcD3aQSvuYoqqhCV5OLkhAwHmvr3BGyHx/EBZ5JGOfCNOzCupoQmOBF+nh5LKwkeQ==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.11.tgz", + "integrity": "sha512-/ZGFAEO2TyqkaE4neR8lGL9I2QeO2sRVFqulQv7Bu8zKTPStjcsFCwNkp+TNX8Oq/1rLcY9XWAOsUk1//AZd8Q==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2382,9 +2584,9 @@ } }, "node_modules/@angular/core": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.8.tgz", - "integrity": "sha512-iNISGgLr+nBzEaGbfzRCOVfV3T66gbEu+Ee4VCnEqifU7Er6fnvn+oFfHo3gNKHrCdicrbyb2oKAmeOJynKbsA==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.11.tgz", + "integrity": "sha512-kmtJQB7B5F2V1JIzy1oBPS6WrRyedSYkuge+XoX1mCSFJDef8HRNd7GopnQ0Zaz0vOTGvCCkWvvaH/+7s2lmAQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2398,9 +2600,9 @@ } }, "node_modules/@angular/forms": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.8.tgz", - "integrity": "sha512-4q/6ad8YZPixxLhDwOxm4pQO3ekwGriOTVB0pMb9FdpvjOUSdDTM08o8ToHvu6MBbZjHzLs8+xkMw9QCd55x/w==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.11.tgz", + "integrity": "sha512-ZH9ccuT6rTirNSbiMRtGRkRrj69a2/+BVaa/kEpUHjh41wDQXxhOlOfPZd/sfj04QiAzIpsYmVJrmoV7/LxPSw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2409,9 +2611,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.2.8", - "@angular/core": "19.2.8", - "@angular/platform-browser": "19.2.8", + "@angular/common": "19.2.11", + "@angular/core": "19.2.11", + "@angular/platform-browser": "19.2.11", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2434,9 +2636,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.8.tgz", - "integrity": "sha512-3O69vMAq/ki13YX8hWBUs1R6iwS1GmkcHWu5fIUU7rjSuhGfD60nASqRBYZiJb68eUom//T544KavOvfAl1PzQ==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.11.tgz", + "integrity": "sha512-wAPJtgzmxBEpW31sa2eg9QssCHBZ52Zc9nm6azTflDlOAyfm9bzqec7y3wqy5sgVue/qID2gzHqmpS3Nx3o0xg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2445,9 +2647,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "19.2.8", - "@angular/common": "19.2.8", - "@angular/core": "19.2.8" + "@angular/animations": "19.2.11", + "@angular/common": "19.2.11", + "@angular/core": "19.2.11" }, "peerDependenciesMeta": { "@angular/animations": { @@ -2456,9 +2658,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.8.tgz", - "integrity": "sha512-Vwh53CGCC/I3DQ/nqWxNTKk052CRHv46H6KjfWBsD8vOVTJoQf2HXwEbDKntpmJ0K4MtMdIdbpwXieUMLyfmXA==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.11.tgz", + "integrity": "sha512-1/0FmjSAvsK+A6gWLgEc60YMnWQchP9fP6y4sE1uQOThIgK+qLnLjZqZn7uOw8zMDBMtxB7SlepajnXftVXddw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2467,16 +2669,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.2.8", - "@angular/compiler": "19.2.8", - "@angular/core": "19.2.8", - "@angular/platform-browser": "19.2.8" + "@angular/common": "19.2.11", + "@angular/compiler": "19.2.11", + "@angular/core": "19.2.11", + "@angular/platform-browser": "19.2.11" } }, "node_modules/@angular/router": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.8.tgz", - "integrity": "sha512-aZenxUzrz8idGmw0jsVaPFY8EAPOYcOHmv9mDljzAhJZHaSX/r0iVasnjf5qUkTb7ElpRXppS4wXPNNGKTrXZA==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.11.tgz", + "integrity": "sha512-nBwMwRgQ3s1c1CPItPnTJTf81NDOQHvK41r2MIJGHa3H9LONlcbY07q/9p49fqt/xn/dgoOmQTtJ22b/nbIJAQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" @@ -2485,9 +2687,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "19.2.8", - "@angular/core": "19.2.8", - "@angular/platform-browser": "19.2.8", + "@angular/common": "19.2.11", + "@angular/core": "19.2.11", + "@angular/platform-browser": "19.2.11", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -2746,14 +2948,14 @@ } }, "node_modules/@azure/core-client": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.3.tgz", - "integrity": "sha512-/wGw8fJ4mdpJ1Cum7s1S+VQyXt1ihwKLzfabS1O/RDADnmzVc01dHn44qD0BvGH6KlZNzOMW95tEpKqhkCChPA==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.4.tgz", + "integrity": "sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.9.1", + "@azure/core-rest-pipeline": "^1.20.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", @@ -2764,14 +2966,14 @@ } }, "node_modules/@azure/core-http-compat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.2.0.tgz", - "integrity": "sha512-1kW8ZhN0CfbNOG6C688z5uh2yrzALE7dDXHiR9dY4vt+EbhGZQSbjDa5bQd2rf3X2pdWMsXbqbArxUyeNdvtmg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.0.tgz", + "integrity": "sha512-qLQujmUypBBG0gxHd0j6/Jdmul6ttl24c8WGiLXIk7IHXdBlfoBqW27hyz3Xn6xbfdyVSarl1Ttbk0AwnZBYCw==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-client": "^1.3.0", - "@azure/core-rest-pipeline": "^1.19.0" + "@azure/core-rest-pipeline": "^1.20.0" }, "engines": { "node": ">=18.0.0" @@ -2805,9 +3007,9 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.19.1.tgz", - "integrity": "sha512-zHeoI3NCs53lLBbWNzQycjnYKsA1CVKlnzSNuSFcUDwBp8HHVObePxrM7HaX+Ha5Ks639H7chNC9HOaIhNS03w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.20.0.tgz", + "integrity": "sha512-ASoP8uqZBS3H/8N8at/XwFr6vYrRP3syTK0EUjDXQy0Y1/AUS+QeIRThKmTNJO2RggvBBxaXDPM7YoIwDGeA0g==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -2815,8 +3017,7 @@ "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2836,12 +3037,13 @@ } }, "node_modules/@azure/core-util": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz", - "integrity": "sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.12.0.tgz", + "integrity": "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -2863,9 +3065,9 @@ } }, "node_modules/@azure/identity": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.9.1.tgz", - "integrity": "sha512-986D7Cf1AOwYqSDtO/FnMAyk/Jc8qpftkGsxuehoh4F85MhQ4fICBGX/44+X1y78lN4Sqib3Bsoaoh/FvOGgmg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.10.0.tgz", + "integrity": "sha512-iT53Sre2NJK6wzMWnvpjNiR3md597LZ3uK/5kQD2TkrY9vqhrY5bt2KwELNjkOWQ9n8S/92knj/QEykTtjMNqQ==", "license": "MIT", "dependencies": { "@azure/abort-controller": "^2.0.0", @@ -2885,9 +3087,9 @@ } }, "node_modules/@azure/identity/node_modules/open": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.1.tgz", - "integrity": "sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", "license": "MIT", "dependencies": { "default-browser": "^5.2.1", @@ -2968,11 +3170,12 @@ } }, "node_modules/@azure/logger": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", - "integrity": "sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.2.0.tgz", + "integrity": "sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==", "license": "MIT", "dependencies": { + "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" }, "engines": { @@ -3036,44 +3239,44 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -3088,6 +3291,22 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "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", @@ -3095,9 +3314,9 @@ "license": "MIT" }, "node_modules/@babel/core/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3121,9 +3340,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.0.tgz", - "integrity": "sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz", + "integrity": "sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==", "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -3185,13 +3404,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -3210,17 +3429,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", - "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.27.0", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "engines": { @@ -3230,6 +3449,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.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", @@ -3240,12 +3471,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", - "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, @@ -3256,6 +3487,18 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "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", @@ -3282,9 +3525,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3299,40 +3542,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3342,35 +3585,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.9" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3379,15 +3622,27 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3397,13 +3652,13 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3423,54 +3678,54 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3563,12 +3818,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.27.1" }, "bin": { "parser": "bin/babel-parser.js" @@ -3578,13 +3833,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3594,12 +3849,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3609,12 +3864,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "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.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "version": "7.27.1", + "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.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3624,14 +3879,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3641,13 +3896,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3674,14 +3929,14 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3851,12 +4106,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3866,12 +4121,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", - "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3881,12 +4136,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3896,12 +4151,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3935,12 +4190,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4052,12 +4307,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4083,12 +4338,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4101,6 +4356,7 @@ "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.26.5", @@ -4118,6 +4374,7 @@ "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", @@ -4132,12 +4389,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", - "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4147,12 +4404,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", - "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4162,13 +4419,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4178,13 +4435,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4194,16 +4451,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.27.1", "globals": "^11.1.0" }, "engines": { @@ -4213,6 +4470,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-classes/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -4223,13 +4492,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4239,12 +4508,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4254,13 +4523,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4270,12 +4539,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4285,13 +4554,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4301,12 +4570,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4316,12 +4585,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4331,12 +4600,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4346,13 +4615,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.26.5.tgz", - "integrity": "sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/plugin-syntax-flow": "^7.26.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4362,13 +4631,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", - "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4378,14 +4647,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4395,12 +4664,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4410,12 +4679,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4425,12 +4694,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4440,12 +4709,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4455,13 +4724,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4471,13 +4740,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4487,15 +4756,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4505,13 +4774,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4521,13 +4790,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4537,12 +4806,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4552,12 +4821,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.26.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", - "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4567,12 +4836,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4582,14 +4851,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", + "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4599,13 +4869,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4615,12 +4885,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4630,13 +4900,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4646,12 +4916,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4661,13 +4931,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4677,14 +4947,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4693,13 +4963,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4709,12 +4991,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", - "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4724,12 +5006,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4739,16 +5021,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4758,12 +5040,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4772,14 +5054,26 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4788,14 +5082,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", - "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4805,13 +5110,13 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4821,12 +5126,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4865,12 +5170,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4880,13 +5185,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4896,12 +5201,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4911,12 +5216,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", - "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4926,12 +5231,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", - "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4941,16 +5246,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", - "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.27.0", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4959,13 +5264,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4975,13 +5292,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -4991,13 +5308,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -5007,13 +5324,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -5023,74 +5340,74 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", + "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.27.1", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.27.1", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.27.1", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.27.2", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.1", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.27.1", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.11.0", @@ -5117,6 +5434,40 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.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", @@ -5141,17 +5492,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -5161,16 +5512,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", - "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -5180,9 +5531,9 @@ } }, "node_modules/@babel/register": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz", - "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.27.1.tgz", + "integrity": "sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5312,30 +5663,30 @@ "license": "MIT" }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -5344,13 +5695,13 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -5360,9 +5711,9 @@ } }, "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -5386,13 +5737,13 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -5860,9 +6211,9 @@ } }, "node_modules/@electron-forge/cli/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6107,9 +6458,9 @@ } }, "node_modules/@electron-forge/core-utils/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6155,9 +6506,9 @@ } }, "node_modules/@electron-forge/core/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6476,9 +6827,9 @@ } }, "node_modules/@electron-forge/plugin-webpack/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6691,9 +7042,9 @@ } }, "node_modules/@electron-forge/plugin-webpack/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "license": "MIT", "engines": { @@ -6939,9 +7290,9 @@ } }, "node_modules/@electron-forge/template-base/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7084,9 +7435,9 @@ } }, "node_modules/@electron/get/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7230,9 +7581,9 @@ } }, "node_modules/@electron/notarize/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7286,9 +7637,9 @@ } }, "node_modules/@electron/osx-sign/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7333,9 +7684,9 @@ } }, "node_modules/@electron/rebuild/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7393,9 +7744,9 @@ } }, "node_modules/@electron/universal/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7427,9 +7778,9 @@ } }, "node_modules/@electron/windows-sign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.1.tgz", - "integrity": "sha512-YfASnrhJ+ve6Q43ZiDwmpBgYgi2u0bYjeAVi2tDfN7YWAKO8X9EEOuPGtqbJpPLM6TfAHimghICjWe2eaJ8BAg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -7448,9 +7799,9 @@ } }, "node_modules/@electron/windows-sign/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "optional": true, @@ -7507,7 +7858,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -7701,9 +8051,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -7718,9 +8068,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -7735,9 +8085,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -7752,9 +8102,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -7769,9 +8119,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -7786,9 +8136,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -7803,9 +8153,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -7820,9 +8170,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -7837,9 +8187,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -7854,9 +8204,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -7871,9 +8221,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -7888,9 +8238,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -7905,9 +8255,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -7922,9 +8272,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -7939,9 +8289,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -7956,9 +8306,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -7973,9 +8323,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -7990,9 +8340,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", "cpu": [ "arm64" ], @@ -8007,9 +8357,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -8024,9 +8374,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", "cpu": [ "arm64" ], @@ -8041,9 +8391,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -8058,9 +8408,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -8075,9 +8425,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -8092,9 +8442,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -8109,9 +8459,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -8126,9 +8476,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", - "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -8176,9 +8526,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -8221,21 +8571,21 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz", - "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", + "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz", - "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", + "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", + "@floating-ui/core": "^1.7.0", "@floating-ui/utils": "^0.2.9" } }, @@ -8268,9 +8618,9 @@ } }, "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -8304,14 +8654,391 @@ "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", + "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", + "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", + "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", + "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", + "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", + "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", + "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", + "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", + "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", + "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", + "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@inquirer/checkbox": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", - "integrity": "sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.6.tgz", + "integrity": "sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/figures": "^1.0.11", "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2", @@ -8330,13 +9057,13 @@ } }, "node_modules/@inquirer/confirm": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", - "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz", + "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6" }, "engines": { @@ -8352,9 +9079,9 @@ } }, "node_modules/@inquirer/core": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", - "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", + "version": "10.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.11.tgz", + "integrity": "sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==", "dev": true, "license": "MIT", "dependencies": { @@ -8380,13 +9107,13 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.10.tgz", - "integrity": "sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.11.tgz", + "integrity": "sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6", "external-editor": "^3.1.0" }, @@ -8403,13 +9130,13 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.12.tgz", - "integrity": "sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.13.tgz", + "integrity": "sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6", "yoctocolors-cjs": "^2.1.2" }, @@ -8436,13 +9163,13 @@ } }, "node_modules/@inquirer/input": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.9.tgz", - "integrity": "sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.10.tgz", + "integrity": "sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6" }, "engines": { @@ -8458,13 +9185,13 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.12.tgz", - "integrity": "sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.13.tgz", + "integrity": "sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6" }, "engines": { @@ -8480,13 +9207,13 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.12.tgz", - "integrity": "sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==", + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.13.tgz", + "integrity": "sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2" }, @@ -8533,13 +9260,13 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.0.tgz", - "integrity": "sha512-6ob45Oh9pXmfprKqUiEeMz/tjtVTFQTgDDz1xAMKMrIvyrYjAmRbQZjMJfsictlL4phgjLhdLu27IkHNnNjB7g==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.1.tgz", + "integrity": "sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/type": "^3.0.6", "yoctocolors-cjs": "^2.1.2" }, @@ -8556,13 +9283,13 @@ } }, "node_modules/@inquirer/search": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.12.tgz", - "integrity": "sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.13.tgz", + "integrity": "sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/figures": "^1.0.11", "@inquirer/type": "^3.0.6", "yoctocolors-cjs": "^2.1.2" @@ -8580,13 +9307,13 @@ } }, "node_modules/@inquirer/select": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.0.tgz", - "integrity": "sha512-KkXQ4aSySWimpV4V/TUJWdB3tdfENZUU765GjOIZ0uPwdbGIG6jrxD4dDf1w68uP+DVtfNhr1A92B+0mbTZ8FA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.1.tgz", + "integrity": "sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", + "@inquirer/core": "^10.1.11", "@inquirer/figures": "^1.0.11", "@inquirer/type": "^3.0.6", "ansi-escapes": "^4.3.2", @@ -9353,9 +10080,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", - "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz", + "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -9522,19 +10249,19 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.52.5", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.52.5.tgz", - "integrity": "sha512-6WWgjjg6FkoDWpF/O3sjB05OkszpI5wtKJqd8fUIR/JJUv8IqNCGr1lJUZJnc1HegcT9gAvyf98KfH0wFncU0w==", + "version": "7.52.8", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.52.8.tgz", + "integrity": "sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==", "dev": true, "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.30.5", + "@microsoft/api-extractor-model": "7.30.6", "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.13.0", + "@rushstack/node-core-library": "5.13.1", "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.15.2", - "@rushstack/ts-command-line": "5.0.0", + "@rushstack/terminal": "0.15.3", + "@rushstack/ts-command-line": "5.0.1", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", @@ -9547,15 +10274,15 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.30.5", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.5.tgz", - "integrity": "sha512-0ic4rcbcDZHz833RaTZWTGu+NpNgrxVNjVaor0ZDUymfDFzjA/Uuk8hYziIUIOEOSTfmIQqyzVwlzxZxPe7tOA==", + "version": "7.30.6", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.6.tgz", + "integrity": "sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==", "dev": true, "license": "MIT", "dependencies": { "@microsoft/tsdoc": "~0.15.1", "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.13.0" + "@rushstack/node-core-library": "5.13.1" } }, "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { @@ -9645,9 +10372,9 @@ } }, "node_modules/@microsoft/dev-tunnels-contracts/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "peer": true, @@ -9679,9 +10406,9 @@ } }, "node_modules/@microsoft/dev-tunnels-management/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "peer": true, @@ -10401,9 +11128,9 @@ } }, "node_modules/@microsoft/teamsapp-cli/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "peer": true, @@ -11276,15 +12003,15 @@ } }, "node_modules/@next/env": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.28.tgz", - "integrity": "sha512-PAmWhJfJQlP+kxZwCjrVd9QnR5x0R3u0mTXTiZDgSd4h5LdXmjxCCWbN9kq6hkZBOax8Rm3xDW5HagWyJuT37g==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.2.tgz", + "integrity": "sha512-xURk++7P7qR9JG1jJtLzPzf0qEvqCN0A/T3DXf8IPMKo9/6FfjxtEffRJIIew/bIL4T3C2jLLqBor8B/zVlx6g==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.28.tgz", - "integrity": "sha512-kzGChl9setxYWpk3H6fTZXXPFFjg7urptLq5o5ZgYezCrqlemKttwMT5iFyx/p1e/JeglTwDFRtb923gTJ3R1w==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.2.tgz", + "integrity": "sha512-2DR6kY/OGcokbnCsjHpNeQblqCZ85/1j6njYSkzRdpLn5At7OkSdmk7WyAmB9G0k25+VgqVZ/u356OSoQZ3z0g==", "cpu": [ "arm64" ], @@ -11298,9 +12025,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.28.tgz", - "integrity": "sha512-z6FXYHDJlFOzVEOiiJ/4NG8aLCeayZdcRSMjPDysW297Up6r22xw6Ea9AOwQqbNsth8JNgIK8EkWz2IDwaLQcw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.2.tgz", + "integrity": "sha512-ro/fdqaZWL6k1S/5CLv1I0DaZfDVJkWNaUU3un8Lg6m0YENWlDulmIWzV96Iou2wEYyEsZq51mwV8+XQXqMp3w==", "cpu": [ "x64" ], @@ -11314,9 +12041,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.28.tgz", - "integrity": "sha512-9ARHLEQXhAilNJ7rgQX8xs9aH3yJSj888ssSjJLeldiZKR4D7N08MfMqljk77fAwZsWwsrp8ohHsMvurvv9liQ==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.2.tgz", + "integrity": "sha512-covwwtZYhlbRWK2HlYX9835qXum4xYZ3E2Mra1mdQ+0ICGoMiw1+nVAn4d9Bo7R3JqSmK1grMq/va+0cdh7bJA==", "cpu": [ "arm64" ], @@ -11330,9 +12057,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.28.tgz", - "integrity": "sha512-p6gvatI1nX41KCizEe6JkF0FS/cEEF0u23vKDpl+WhPe/fCTBeGkEBh7iW2cUM0rvquPVwPWdiUR6Ebr/kQWxQ==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.2.tgz", + "integrity": "sha512-KQkMEillvlW5Qk5mtGA/3Yz0/tzpNlSw6/3/ttsV1lNtMuOHcGii3zVeXZyi4EJmmLDKYcTcByV2wVsOhDt/zg==", "cpu": [ "arm64" ], @@ -11346,9 +12073,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.28.tgz", - "integrity": "sha512-nsiSnz2wO6GwMAX2o0iucONlVL7dNgKUqt/mDTATGO2NY59EO/ZKnKEr80BJFhuA5UC1KZOMblJHWZoqIJddpA==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.2.tgz", + "integrity": "sha512-uRBo6THWei0chz+Y5j37qzx+BtoDRFIkDzZjlpCItBRXyMPIg079eIkOCl3aqr2tkxL4HFyJ4GHDes7W8HuAUg==", "cpu": [ "x64" ], @@ -11362,9 +12089,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.28.tgz", - "integrity": "sha512-+IuGQKoI3abrXFqx7GtlvNOpeExUH1mTIqCrh1LGFf8DnlUcTmOOCApEnPJUSLrSbzOdsF2ho2KhnQoO0I1RDw==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.2.tgz", + "integrity": "sha512-+uxFlPuCNx/T9PdMClOqeE8USKzj8tVz37KflT3Kdbx/LOlZBRI2yxuIcmx1mPNK8DwSOMNCr4ureSet7eyC0w==", "cpu": [ "x64" ], @@ -11378,9 +12105,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.28.tgz", - "integrity": "sha512-l61WZ3nevt4BAnGksUVFKy2uJP5DPz2E0Ma/Oklvo3sGj9sw3q7vBWONFRgz+ICiHpW5mV+mBrkB3XEubMrKaA==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.2.tgz", + "integrity": "sha512-LLTKmaI5cfD8dVzh5Vt7+OMo+AIOClEdIU/TSKbXXT2iScUTSxOGoBhfuv+FU8R9MLmrkIL1e2fBMkEEjYAtPQ==", "cpu": [ "arm64" ], @@ -11393,26 +12120,10 @@ "node": ">= 10" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.28.tgz", - "integrity": "sha512-+Kcp1T3jHZnJ9v9VTJ/yf1t/xmtFAc/Sge4v7mVc1z+NYfYzisi8kJ9AsY8itbgq+WgEwMtOpiLLJsUy2qnXZw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.28.tgz", - "integrity": "sha512-1gCmpvyhz7DkB1srRItJTnmR2UwQPAUXXIg9r0/56g3O8etGmwlX68skKXJOp9EejW3hhv7nSQUJ2raFiz4MoA==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.2.tgz", + "integrity": "sha512-aW5B8wOPioJ4mBdMDXkt5f3j8pUr9W8AnlX0Df35uRWNT1Y6RIybxjnSUe+PhM+M1bwgyY8PHLmXZC6zT1o5tA==", "cpu": [ "x64" ], @@ -11510,9 +12221,9 @@ } }, "node_modules/@npmcli/agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11804,9 +12515,9 @@ } }, "node_modules/@npmcli/redact": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.0.tgz", - "integrity": "sha512-NyJXHoZwJE0iUsCDTclXf1bWHJTsshtnp5xUN6F2vY+OLJv6d2cNc4Do6fKNkmPToB0GzoffxRh405ibTwG+Og==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", "dev": true, "license": "ISC", "engines": { @@ -12485,9 +13196,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.2.tgz", - "integrity": "sha512-i4Ez+s9oRWQbNjtI/3+jxr7OH508mjAKvza0ekPJem0ZtmsYHP3B5dq62+IaBHKaGCOuqJxXzvFLUhJvQ6jtsQ==", + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.4.tgz", + "integrity": "sha512-9DxbZx+XGMNdjBynIs4BRSz+M3iRDeB7qRcAr6UORFLphCIM2x3DXgOucvADiifcqCE4XePFUKcnaAMyGbrDlQ==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -12507,9 +13218,9 @@ } }, "node_modules/@puppeteer/browsers/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "peer": true, "dependencies": { @@ -12576,9 +13287,9 @@ } }, "node_modules/@redis/client": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.0.tgz", - "integrity": "sha512-aR0uffYI700OEEH4gYnitAnv3vzVGXCFvYfdpu/CJKvk4pHfLPEy/JSZyrpQ+15WhXe1yJRXLtfQ84s4mEXnPg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", + "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.2", @@ -12814,9 +13525,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", - "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", "cpu": [ "arm" ], @@ -12828,9 +13539,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", - "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", "cpu": [ "arm64" ], @@ -12842,9 +13553,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", - "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", "cpu": [ "arm64" ], @@ -12856,9 +13567,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", - "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", "cpu": [ "x64" ], @@ -12870,9 +13581,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", - "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", "cpu": [ "arm64" ], @@ -12884,9 +13595,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", - "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", "cpu": [ "x64" ], @@ -12898,9 +13609,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", - "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", "cpu": [ "arm" ], @@ -12912,9 +13623,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", - "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", "cpu": [ "arm" ], @@ -12926,9 +13637,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", - "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", "cpu": [ "arm64" ], @@ -12940,9 +13651,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", - "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", "cpu": [ "arm64" ], @@ -12954,9 +13665,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", - "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", "cpu": [ "loong64" ], @@ -12968,9 +13679,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", - "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", "cpu": [ "ppc64" ], @@ -12982,9 +13693,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", - "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", "cpu": [ "riscv64" ], @@ -12996,9 +13707,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", - "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", "cpu": [ "riscv64" ], @@ -13010,9 +13721,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", - "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", "cpu": [ "s390x" ], @@ -13024,9 +13735,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", - "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", "cpu": [ "x64" ], @@ -13038,9 +13749,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", - "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", "cpu": [ "x64" ], @@ -13052,9 +13763,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", - "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", "cpu": [ "arm64" ], @@ -13066,9 +13777,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", - "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", "cpu": [ "ia32" ], @@ -13080,9 +13791,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", - "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", "cpu": [ "x64" ], @@ -13094,9 +13805,9 @@ ] }, "node_modules/@rollup/wasm-node": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.40.1.tgz", - "integrity": "sha512-3nXUKfAq1nD/vgQi7ncLNyn8jx1PAsN6njSS9baCpI9JHk92Y/JOWZib7HvLJ5BBZ4MC5NSeqkpUKnmceXyzXA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.40.2.tgz", + "integrity": "sha512-rl60ew3oh38IrtETrAf0A0qTByOsHSi7Sx1BZH4+vrIzL/DqxFx+FgTUFVViL3ZQqs95gIOm9mZQ1fUOopnkmA==", "dev": true, "license": "MIT", "dependencies": { @@ -13126,9 +13837,9 @@ "license": "MIT" }, "node_modules/@rushstack/node-core-library": { - "version": "5.13.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.13.0.tgz", - "integrity": "sha512-IGVhy+JgUacAdCGXKUrRhwHMTzqhWwZUI+qEPcdzsb80heOw0QPbhhoVsoiMF7Klp8eYsp7hzpScMXmOa3Uhfg==", + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.13.1.tgz", + "integrity": "sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13245,13 +13956,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.2.tgz", - "integrity": "sha512-7Hmc0ysK5077R/IkLS9hYu0QuNafm+TbZbtYVzCMbeOdMjaRboLKrhryjwZSRJGJzu+TV1ON7qZHeqf58XfLpA==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.3.tgz", + "integrity": "sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.13.0", + "@rushstack/node-core-library": "5.13.1", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -13264,27 +13975,27 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.0.0.tgz", - "integrity": "sha512-SW6nqZVxH26Rxz25+lJQRlnXI/YCrNH7NfDEWPPm9i0rwkSE6Rgtmzw96cuZgQjacOh0sw77d6V4SvgarAfr8g==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.0.1.tgz", + "integrity": "sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==", "dev": true, "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.15.2", + "@rushstack/terminal": "0.15.3", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, "node_modules/@schematics/angular": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.9.tgz", - "integrity": "sha512-V5c8qycipodwbDX3lY0sbQaG2OKkO2HdjxL0K70TzcpEwnD4uVMs73PRaLtREASzpnSo6CKewQCsgPSgyzJCKw==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.12.tgz", + "integrity": "sha512-6S6tclFctLrjMvhpi8eVvswIpXqlybRpZLCTWyVeWIC6PHYLEyFmFoOhuhcSmOdtnwudvzOt6xWnWEVb3qXZbQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "19.2.9", - "@angular-devkit/schematics": "19.2.9", + "@angular-devkit/core": "19.2.12", + "@angular-devkit/schematics": "19.2.12", "jsonc-parser": "3.3.1" }, "engines": { @@ -14084,33 +14795,24 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "node": ">=18" } }, "node_modules/@testing-library/jest-dom": { @@ -14164,22 +14866,31 @@ } }, "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" + "@babel/runtime": "^7.12.5" }, "engines": { - "node": ">=12" + "node": ">=18" }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } } }, "node_modules/@tootallnate/once": { @@ -14305,7 +15016,8 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -14400,9 +15112,9 @@ } }, "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", + "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", "dev": true, "license": "MIT", "dependencies": { @@ -14723,9 +15435,9 @@ } }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.15.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz", + "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -14758,9 +15470,9 @@ "license": "MIT" }, "node_modules/@types/office-js": { - "version": "1.0.492", - "resolved": "https://registry.npmjs.org/@types/office-js/-/office-js-1.0.492.tgz", - "integrity": "sha512-sCUW8/2arxa2TxkfzW66RXpgGSxlyJaHqhd/cHid7AHwh32dysORoiQl5AbrJNIld8tp3TFXvlq0gbdV17khfw==", + "version": "1.0.501", + "resolved": "https://registry.npmjs.org/@types/office-js/-/office-js-1.0.501.tgz", + "integrity": "sha512-sqGlefT7IxXfSeiPx4ddroGCFqPlrC7CYMxZ0yzsWkS+wo3VKygrh3PFxd6DqpOuIszhLf+/VE7NjxL8OgommA==", "dev": true, "license": "MIT" }, @@ -14815,22 +15527,21 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.4.tgz", + "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", - "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", + "version": "19.1.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", + "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", "license": "MIT", "peerDependencies": { - "@types/react": "^18.0.0" + "@types/react": "^19.0.0" } }, "node_modules/@types/react-router": { @@ -15058,9 +15769,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -15121,9 +15832,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -15182,9 +15893,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -15239,9 +15950,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -15311,6 +16022,20 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.2.2.tgz", + "integrity": "sha512-Gz/Sm64+Sq/vklJu1tt9t+4R2lvnud8NbTD/ZfpZtMiUX7YeVpCA8j6NSW8ptwcoLL+NmYANwqP8DV0q/bwl2w==", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", @@ -15627,53 +16352,53 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.14.tgz", + "integrity": "sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.14", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.14.tgz", + "integrity": "sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.14.tgz", + "integrity": "sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.27.2", + "@vue/compiler-core": "3.5.14", + "@vue/compiler-dom": "3.5.14", + "@vue/compiler-ssr": "3.5.14", + "@vue/shared": "3.5.14", "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.17", + "postcss": "^8.5.3", + "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.14.tgz", + "integrity": "sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/devtools-api": { @@ -15735,53 +16460,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.14.tgz", + "integrity": "sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.13" + "@vue/shared": "3.5.14" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.14.tgz", + "integrity": "sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/reactivity": "3.5.14", + "@vue/shared": "3.5.14" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.14.tgz", + "integrity": "sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", + "@vue/reactivity": "3.5.14", + "@vue/runtime-core": "3.5.14", + "@vue/shared": "3.5.14", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.14.tgz", + "integrity": "sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-ssr": "3.5.14", + "@vue/shared": "3.5.14" }, "peerDependencies": { - "vue": "3.5.13" + "vue": "3.5.14" } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.14.tgz", + "integrity": "sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==", "license": "MIT" }, "node_modules/@vueuse/core": { @@ -16502,12 +17227,13 @@ } }, "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -17375,9 +18101,9 @@ "peer": true }, "node_modules/bare-fs": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.3.tgz", - "integrity": "sha512-OeEZYIg+2qepaWLyphaOXHAHKo3xkM8y3BeGAvHdMN8GNWvEAU1Yw6rYpGzu/wDDbKxgEjVeVDpgGhDzaeMpjg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", "license": "Apache-2.0", "optional": true, "peer": true, @@ -17793,9 +18519,9 @@ "optional": true }, "node_modules/bootstrap": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", - "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.6.tgz", + "integrity": "sha512-jX0GAcRzvdwISuvArXn3m7KZscWWFAf1MKBcnzaN02qWMb3jpMoUX4/qgeiGzqyIb4ojulRzs89UCUmGcFSzTA==", "funding": [ { "type": "github", @@ -17840,9 +18566,9 @@ "license": "BSD-2-Clause" }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "funding": [ { "type": "opencollective", @@ -17859,10 +18585,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -18245,9 +18971,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001715", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", - "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "funding": [ { "type": "opencollective", @@ -18415,9 +19141,9 @@ } }, "node_modules/chromium-bidi": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-4.1.1.tgz", - "integrity": "sha512-biR7t4vF3YluE6RlMSk9IWk+b9U+WWyzHp+N2pL9vRTk+UXHYRTVp7jTK58ZNzMLBgoLMHY4QyJMbeuw3eKxqg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz", + "integrity": "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -18859,6 +19585,20 @@ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "license": "MIT" }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -18877,6 +19617,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colord": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", @@ -19280,9 +20031,9 @@ } }, "node_modules/core-js": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz", - "integrity": "sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", + "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -19291,9 +20042,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", "license": "MIT", "dependencies": { "browserslist": "^4.24.4" @@ -19304,9 +20055,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.41.0.tgz", - "integrity": "sha512-71Gzp96T9YPk63aUvE5Q5qP+DryB4ZloUZPSOebGM88VNw8VNfvdA7z6kGA8iGOTEzAomsRidp4jXSmUIJsL+Q==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", + "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -20325,9 +21076,9 @@ } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" @@ -20352,39 +21103,6 @@ "node": ">=6" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -20648,9 +21366,9 @@ } }, "node_modules/detect-port/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "peer": true, @@ -20667,9 +21385,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1425554", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", - "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", + "version": "0.0.1439962", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1439962.tgz", + "integrity": "sha512-jJF48UdryzKiWhJ1bLKr7BFWUQCEIT5uCNbDLqkQJBtkFxYzILJH44WN0PDKMIlGDN7Utb8vyUY85C3w4R/t2g==", "license": "BSD-3-Clause", "peer": true }, @@ -21100,9 +21818,9 @@ } }, "node_modules/electron-installer-common/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "optional": true, @@ -21201,9 +21919,9 @@ } }, "node_modules/electron-installer-debian/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "optional": true, @@ -21386,9 +22104,9 @@ } }, "node_modules/electron-installer-redhat/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "optional": true, @@ -21545,9 +22263,9 @@ } }, "node_modules/electron-packager/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21591,9 +22309,9 @@ "link": true }, "node_modules/electron-to-chromium": { - "version": "1.5.144", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.144.tgz", - "integrity": "sha512-eJIaMRKeAzxfBSxtjYnoIAw/tdD6VIH6tHBZepZnAbE3Gyqqs5mGN87DvcldPUbVkIljTK8pY0CMcUljP64lfQ==", + "version": "1.5.155", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", + "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", "license": "ISC" }, "node_modules/electron-webpack": { @@ -21623,9 +22341,9 @@ } }, "node_modules/electron-winstaller/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "optional": true, @@ -21691,9 +22409,9 @@ "link": true }, "node_modules/element-plus": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.9.9.tgz", - "integrity": "sha512-gN553+xr7ETkhJhH26YG0fERmd2BSCcQKslbtR8fats0Mc0yCtZOXr00bmoPOt5xGzhuRN1TWc9+f1pCaiA0/Q==", + "version": "2.9.10", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.9.10.tgz", + "integrity": "sha512-W2v9jWnm1kl/zm4bSvCh8aFCVlxvhG3fmqiDZwyd6WQiWGE595J/mpjcCggEr+49QDgIymhXrpPMOPPSARUbng==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.4.1", @@ -22120,27 +22838,6 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-iterator-helpers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", @@ -22247,9 +22944,9 @@ "peer": true }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -22260,37 +22957,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/esbuild-wasm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.1.tgz", - "integrity": "sha512-dZxPeDHcDIQ6ilml/NzYxnPbNkoVsHSFH3JGLSobttc5qYYgExMo8lh2XcB+w+AfiqykVDGK5PWanGB0gWaAWw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.4.tgz", + "integrity": "sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==", "dev": true, "license": "MIT", "bin": { @@ -22498,9 +23195,9 @@ } }, "node_modules/eslint-import-resolver-typescript/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22671,6 +23368,15 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -23034,9 +23740,9 @@ } }, "node_modules/eslint/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -23522,9 +24228,9 @@ } }, "node_modules/extract-zip/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -23648,9 +24354,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.1.tgz", - "integrity": "sha512-Kqq/ewnRACQ20e0BlQ5KqHRYWRBp7yv+jttK4Yj2yY+2ldgCoxJkrP1NHUhjypsJ+eQXlGJ/jebM3wa60s1rbQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.3.tgz", + "integrity": "sha512-OdCYfRqfpuLUFonTNjvd30rCBZUneHpSQkCqfaeWQ9qrKcl6XlWeDBNVwGb+INAIxRshuN2jF+BE0L6gbBO2mw==", "dev": true, "funding": [ { @@ -23660,7 +24366,7 @@ ], "license": "MIT", "dependencies": { - "strnum": "^2.0.5" + "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -24048,9 +24754,9 @@ } }, "node_modules/flora-colossus/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -24432,9 +25138,9 @@ } }, "node_modules/galactus/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -24712,9 +25418,9 @@ } }, "node_modules/get-uri/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "peer": true, "dependencies": { @@ -25613,9 +26319,9 @@ } }, "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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -25704,9 +26410,9 @@ } }, "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -25739,9 +26445,9 @@ } }, "node_modules/http-proxy-middleware/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25792,9 +26498,9 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -25984,9 +26690,9 @@ } }, "node_modules/immutable": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", - "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", + "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", "devOptional": true, "license": "MIT" }, @@ -26287,23 +26993,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -27058,9 +27747,9 @@ } }, "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -28784,9 +29473,9 @@ } }, "node_modules/jsdom/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -28831,9 +29520,9 @@ } }, "node_modules/jsdom/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "license": "MIT", "engines": { @@ -29047,12 +29736,12 @@ } }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -29075,9 +29764,9 @@ } }, "node_modules/jwks-rsa/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -29199,9 +29888,9 @@ } }, "node_modules/karma-coverage-istanbul-reporter/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -30249,9 +30938,9 @@ } }, "node_modules/log4js/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -30371,6 +31060,7 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -30456,9 +31146,9 @@ } }, "node_modules/make-fetch-happen/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -31136,9 +31826,9 @@ "link": true }, "node_modules/msgpackr": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", - "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.3.tgz", + "integrity": "sha512-mNdO4s/W54QCghwGNSqO5ULVJ6QUimP/1hRlWVx5f7frTLaClg+4sBRjUTgP1OrBRgVtkH1tI9vi4Dqg/JX3Kg==", "dev": true, "license": "MIT", "optional": true, @@ -31256,9 +31946,9 @@ "license": "MIT" }, "node_modules/napi-postinstall": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.3.tgz", - "integrity": "sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", "dev": true, "license": "MIT", "bin": { @@ -31351,41 +32041,42 @@ "peer": true }, "node_modules/next": { - "version": "14.2.28", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.28.tgz", - "integrity": "sha512-QLEIP/kYXynIxtcKB6vNjtWLVs3Y4Sb+EClTC/CSVzdLD1gIuItccpu/n1lhmduffI32iPGEK2cLLxxt28qgYA==", + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.2.tgz", + "integrity": "sha512-CA3BatMyHkxZ48sgOCLdVHjFU36N7TF1HhqAHLFOkV6buwZnvMI84Cug8xD56B9mCuKrqXnLn94417GrZ/jjCQ==", "license": "MIT", "dependencies": { - "@next/env": "14.2.28", - "@swc/helpers": "0.5.5", + "@next/env": "15.3.2", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", - "graceful-fs": "^4.2.11", "postcss": "8.4.31", - "styled-jsx": "5.1.1" + "styled-jsx": "5.1.6" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=18.17.0" + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.2.28", - "@next/swc-darwin-x64": "14.2.28", - "@next/swc-linux-arm64-gnu": "14.2.28", - "@next/swc-linux-arm64-musl": "14.2.28", - "@next/swc-linux-x64-gnu": "14.2.28", - "@next/swc-linux-x64-musl": "14.2.28", - "@next/swc-win32-arm64-msvc": "14.2.28", - "@next/swc-win32-ia32-msvc": "14.2.28", - "@next/swc-win32-x64-msvc": "14.2.28" + "@next/swc-darwin-arm64": "15.3.2", + "@next/swc-darwin-x64": "15.3.2", + "@next/swc-linux-arm64-gnu": "15.3.2", + "@next/swc-linux-arm64-musl": "15.3.2", + "@next/swc-linux-x64-gnu": "15.3.2", + "@next/swc-linux-x64-musl": "15.3.2", + "@next/swc-win32-arm64-msvc": "15.3.2", + "@next/swc-win32-x64-msvc": "15.3.2", + "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { @@ -31395,6 +32086,9 @@ "@playwright/test": { "optional": true }, + "babel-plugin-react-compiler": { + "optional": true + }, "sass": { "optional": true } @@ -31405,13 +32099,12 @@ "link": true }, "node_modules/next/node_modules/@swc/helpers": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", - "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.3", - "tslib": "^2.4.0" + "tslib": "^2.8.0" } }, "node_modules/next/node_modules/postcss": { @@ -31460,9 +32153,9 @@ } }, "node_modules/node-abi": { - "version": "3.74.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", - "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "version": "3.75.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -33016,23 +33709,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -33385,21 +34061,21 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz", - "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/type-utils": "8.31.1", - "@typescript-eslint/utils": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -33414,17 +34090,27 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/office-addin-lint/node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/parser": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz", - "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/typescript-estree": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "engines": { @@ -33440,14 +34126,14 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz", - "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1" + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -33458,16 +34144,16 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/type-utils": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz", - "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.31.1", - "@typescript-eslint/utils": "8.31.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -33482,9 +34168,9 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/types": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz", - "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", "dev": true, "license": "MIT", "engines": { @@ -33496,20 +34182,20 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz", - "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/visitor-keys": "8.31.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -33539,16 +34225,16 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/utils": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz", - "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.31.1", - "@typescript-eslint/types": "8.31.1", - "@typescript-eslint/typescript-estree": "8.31.1" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -33563,13 +34249,13 @@ } }, "node_modules/office-addin-lint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz", - "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.31.1", + "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -33614,9 +34300,9 @@ } }, "node_modules/office-addin-lint/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -34000,9 +34686,9 @@ } }, "node_modules/office-addin-lint/node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.0.tgz", + "integrity": "sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==", "dev": true, "license": "MIT", "dependencies": { @@ -34074,15 +34760,15 @@ } }, "node_modules/office-addin-lint/node_modules/typescript-eslint": { - "version": "8.31.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz", - "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==", + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.32.1.tgz", + "integrity": "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.31.1", - "@typescript-eslint/parser": "8.31.1", - "@typescript-eslint/utils": "8.31.1" + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/utils": "8.32.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -34785,9 +35471,9 @@ } }, "node_modules/pac-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "peer": true, "dependencies": { @@ -37514,9 +38200,9 @@ } }, "node_modules/proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "peer": true, "dependencies": { @@ -37616,18 +38302,18 @@ "license": "MIT" }, "node_modules/puppeteer": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.7.2.tgz", - "integrity": "sha512-ifYqoY6wGs0yZeFuFPn8BE9FhuveXkarF+eO18I2e/axdoCh4Qh1AE+qXdJBhdaeoPt6eRNTY4Dih29Jbq8wow==", + "version": "24.8.2", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.8.2.tgz", + "integrity": "sha512-Sn6SBPwJ6ASFvQ7knQkR+yG7pcmr4LfXzmoVp3NR0xXyBbPhJa8a8ybtb6fnw1g/DD/2t34//yirubVczko37w==", "hasInstallScript": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", + "@puppeteer/browsers": "2.10.4", + "chromium-bidi": "5.1.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1425554", - "puppeteer-core": "24.7.2", + "devtools-protocol": "0.0.1439962", + "puppeteer-core": "24.8.2", "typed-query-selector": "^2.12.0" }, "bin": { @@ -37638,27 +38324,27 @@ } }, "node_modules/puppeteer-core": { - "version": "24.7.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.7.2.tgz", - "integrity": "sha512-P9pZyTmJqKODFCnkZgemCpoFA4LbAa8+NumHVQKyP5X9IgdNS1ZnAnIh1sMAwhF8/xEUGf7jt+qmNLlKieFw1Q==", + "version": "24.8.2", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.8.2.tgz", + "integrity": "sha512-wNw5cRZOHiFibWc0vdYCYO92QuKTbJ8frXiUfOq/UGJWMqhPoBThTKkV+dJ99YyWfzJ2CfQQ4T1nhhR0h8FlVw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "@puppeteer/browsers": "2.10.2", - "chromium-bidi": "4.1.1", + "@puppeteer/browsers": "2.10.4", + "chromium-bidi": "5.1.0", "debug": "^4.4.0", - "devtools-protocol": "0.0.1425554", + "devtools-protocol": "0.0.1439962", "typed-query-selector": "^2.12.0", - "ws": "^8.18.1" + "ws": "^8.18.2" }, "engines": { "node": ">=18" } }, "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "peer": true, "dependencies": { @@ -37674,9 +38360,9 @@ } }, "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "license": "MIT", "peer": true, "engines": { @@ -37897,13 +38583,10 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } @@ -37926,9 +38609,9 @@ } }, "node_modules/react-bootstrap": { - "version": "2.10.9", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.9.tgz", - "integrity": "sha512-TJUCuHcxdgYpOqeWmRApM/Dy0+hVsxNRFvq2aRFQuxhNi/+ivOxC5OdWIeHS3agxvzJ4Ev4nDw2ZdBl9ymd/JQ==", + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz", + "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", @@ -38158,16 +38841,15 @@ } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.1.0" } }, "node_modules/react-error-overlay": { @@ -38835,9 +39517,9 @@ } }, "node_modules/react-scripts/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -40500,9 +41182,9 @@ } }, "node_modules/react-scripts/node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -40650,9 +41332,9 @@ } }, "node_modules/read-binary-file-arch/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -41017,16 +41699,16 @@ } }, "node_modules/redis": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.0.tgz", - "integrity": "sha512-zvmkHEAdGMn+hMRXuMBtu4Vo5P6rHQjLoHftu+lBqq8ZTA3RCVC/WzD790bkKKiNFp7d5/9PcSD19fJyyRvOdQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.7.1.tgz", + "integrity": "sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==", "license": "MIT", "workspaces": [ "./packages/*" ], "dependencies": { "@redis/bloom": "1.2.0", - "@redis/client": "1.6.0", + "@redis/client": "1.6.1", "@redis/graph": "1.1.1", "@redis/json": "1.0.7", "@redis/search": "1.2.0", @@ -41101,15 +41783,6 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regex-parser": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", @@ -41658,9 +42331,9 @@ "optional": true }, "node_modules/rollup": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", - "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", "dev": true, "license": "MIT", "dependencies": { @@ -41674,26 +42347,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.1", - "@rollup/rollup-android-arm64": "4.40.1", - "@rollup/rollup-darwin-arm64": "4.40.1", - "@rollup/rollup-darwin-x64": "4.40.1", - "@rollup/rollup-freebsd-arm64": "4.40.1", - "@rollup/rollup-freebsd-x64": "4.40.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", - "@rollup/rollup-linux-arm-musleabihf": "4.40.1", - "@rollup/rollup-linux-arm64-gnu": "4.40.1", - "@rollup/rollup-linux-arm64-musl": "4.40.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-musl": "4.40.1", - "@rollup/rollup-linux-s390x-gnu": "4.40.1", - "@rollup/rollup-linux-x64-gnu": "4.40.1", - "@rollup/rollup-linux-x64-musl": "4.40.1", - "@rollup/rollup-win32-arm64-msvc": "4.40.1", - "@rollup/rollup-win32-ia32-msvc": "4.40.1", - "@rollup/rollup-win32-x64-msvc": "4.40.1", + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" } }, @@ -41850,9 +42523,9 @@ "license": "CC0-1.0" }, "node_modules/sass": { - "version": "1.87.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.87.0.tgz", - "integrity": "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==", + "version": "1.89.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.0.tgz", + "integrity": "sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -41963,13 +42636,10 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.3.2", @@ -42055,9 +42725,9 @@ } }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -42273,6 +42943,47 @@ "node": ">=8" } }, + "node_modules/sharp": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", + "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.7.1" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.1", + "@img/sharp-darwin-x64": "0.34.1", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.1", + "@img/sharp-linux-arm64": "0.34.1", + "@img/sharp-linux-s390x": "0.34.1", + "@img/sharp-linux-x64": "0.34.1", + "@img/sharp-linuxmusl-arm64": "0.34.1", + "@img/sharp-linuxmusl-x64": "0.34.1", + "@img/sharp-wasm32": "0.34.1", + "@img/sharp-win32-ia32": "0.34.1", + "@img/sharp-win32-x64": "0.34.1" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -42596,6 +43307,23 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, "node_modules/simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", @@ -42870,9 +43598,9 @@ } }, "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -43038,9 +43766,9 @@ } }, "node_modules/spdy-transport/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -43055,9 +43783,9 @@ } }, "node_modules/spdy/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -43238,20 +43966,6 @@ "node": ">= 0.8" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", @@ -43278,9 +43992,9 @@ } }, "node_modules/streamroller/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -43718,9 +44432,9 @@ } }, "node_modules/strnum": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.0.5.tgz", - "integrity": "sha512-YAT3K/sgpCUxhxNMrrdhtod3jckkpYwH6JAuwmUdXZsmzH1wUyzTMrrK2wYCEEqlKwrWDd35NeuUkbBy/1iK+Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", "dev": true, "funding": [ { @@ -43747,9 +44461,9 @@ } }, "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -43758,7 +44472,7 @@ "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -43910,9 +44624,9 @@ } }, "node_modules/sumchecker/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -44240,13 +44954,13 @@ "license": "MIT" }, "node_modules/synckit": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", - "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.5.tgz", + "integrity": "sha512-frqvfWyDA5VPVdrWfH24uM6SI/O8NLpVbIIJxb8t/a3YGsp4AW9CYgSKC0OaSEfexnp7Y1pVh2Y6IHO8ggGDmA==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.3", + "@pkgr/core": "^0.2.4", "tslib": "^2.8.1" }, "engines": { @@ -45161,9 +45875,9 @@ "license": "Apache-2.0" }, "node_modules/ts-jest": { - "version": "29.3.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz", - "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", + "version": "29.3.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.3.tgz", + "integrity": "sha512-y6jLm19SL4GroiBmHwFK4dSHUfDNmOrJbRfp6QmDIlI9p5tT5Q8ItccB4pTIslCIqOZuQnBwpTR0bQ5eUMYwkw==", "dev": true, "license": "MIT", "dependencies": { @@ -45174,8 +45888,8 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.1", - "type-fest": "^4.39.1", + "semver": "^7.7.2", + "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "bin": { @@ -45231,9 +45945,9 @@ } }, "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", - "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -45423,9 +46137,9 @@ } }, "node_modules/tuf-js/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -46621,9 +47335,9 @@ } }, "node_modules/vite": { - "version": "5.4.18", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.18.tgz", - "integrity": "sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==", + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, "license": "MIT", "dependencies": { @@ -47146,16 +47860,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "version": "3.5.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.14.tgz", + "integrity": "sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.14", + "@vue/compiler-sfc": "3.5.14", + "@vue/runtime-dom": "3.5.14", + "@vue/server-renderer": "3.5.14", + "@vue/shared": "3.5.14" }, "peerDependencies": { "typescript": "*" @@ -47311,9 +48025,9 @@ } }, "node_modules/webpack": { - "version": "5.99.7", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.7.tgz", - "integrity": "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==", + "version": "5.99.8", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.8.tgz", + "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -47516,9 +48230,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", - "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz", + "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -47666,9 +48380,9 @@ } }, "node_modules/webpack-dev-server/node_modules/open": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.1.tgz", - "integrity": "sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", + "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -47711,9 +48425,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "devOptional": true, "license": "MIT", "engines": { @@ -48829,15 +49543,15 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { @@ -49032,9 +49746,9 @@ } }, "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", "license": "MIT", "peer": true, "funding": { @@ -49121,17 +49835,17 @@ } }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@angular-devkit/build-angular": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.9.tgz", - "integrity": "sha512-v6x3h+LYyEew3EjoI1+2IiFDz6f96lJB1JvbbZj3Li9FMhO4M/xo4BaWHbeg9Lot/vUy6IAlR+BJywawNIzv0Q==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.12.tgz", + "integrity": "sha512-gPx3Vi7QFzHkSV388en6VqSqasojitJKuKmgTMPOV5keLtpOylPv3rjnr8oO9rYbYmLsT/WTUsP7bYiZhrr19Q==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", - "@angular-devkit/build-webpack": "0.1902.9", - "@angular-devkit/core": "19.2.9", - "@angular/build": "19.2.9", + "@angular-devkit/architect": "0.1902.12", + "@angular-devkit/build-webpack": "0.1902.12", + "@angular-devkit/core": "19.2.12", + "@angular/build": "19.2.12", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -49142,7 +49856,7 @@ "@babel/preset-env": "7.26.9", "@babel/runtime": "7.26.10", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.2.9", + "@ngtools/webpack": "19.2.12", "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -49150,7 +49864,7 @@ "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.1", + "esbuild-wasm": "0.25.4", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", @@ -49189,14 +49903,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.1" + "esbuild": "0.25.4" }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -49247,14 +49961,14 @@ } }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.9.tgz", - "integrity": "sha512-hrRhSdY98wGQ/jrpT3K73/Ii5FadQEJFcHy+ockqP2Xh7pXOwhGFc+D0ks4AdHea+pHtNbIb/qPd+UvR5izY3Q==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.12.tgz", + "integrity": "sha512-G28ux1T5QDlWporwupWbcodBN3rcyHfK2Dh5M3UC5hj0GstpfEHcpBHxawZzIxhqPKy//tdVLlzORUgvAwnqbA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", + "@angular-devkit/architect": "0.1902.12", "@babel/core": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -49263,7 +49977,7 @@ "@vitejs/plugin-basic-ssl": "1.2.0", "beasties": "0.3.2", "browserslist": "^4.23.0", - "esbuild": "0.25.1", + "esbuild": "0.25.4", "fast-glob": "3.3.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", @@ -49277,7 +49991,7 @@ "sass": "1.85.0", "semver": "7.7.1", "source-map-support": "0.5.21", - "vite": "6.2.6", + "vite": "6.2.7", "watchpack": "2.4.2" }, "engines": { @@ -49294,7 +50008,7 @@ "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^19.0.0 || ^19.2.0-next.0", @@ -49333,9 +50047,9 @@ } }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", + "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -49433,10 +50147,20 @@ "node": "^10 || ^12 || >=14" } }, + "samples/msal-angular-samples/angular-b2c-sample/node_modules/@angular-devkit/build-angular/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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@angular/compiler-cli": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.8.tgz", - "integrity": "sha512-gq/sc3D3m6aKmhdSTTzzD59wfQcVjIZ8dgJoPW7pOcmPVQL1N8syjv+quHySfSJlBkbs5dQ0P4Kk0yvxRw9S7g==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.11.tgz", + "integrity": "sha512-15aoOg+qj7Z3Uap1JKHMy51y12M09AOnseDBa0SYKidSx15XwZi8d01hv7sRaQJX/6Ie5cug9GiAbLKts6R33w==", "dev": true, "license": "MIT", "dependencies": { @@ -49458,7 +50182,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.8", + "@angular/compiler": "19.2.11", "typescript": ">=5.5 <5.9" } }, @@ -49510,6 +50234,177 @@ "semver": "bin/semver.js" } }, + "samples/msal-angular-samples/angular-b2c-sample/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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" + } + }, + "samples/msal-angular-samples/angular-b2c-sample/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, + "license": "MIT" + }, + "samples/msal-angular-samples/angular-b2c-sample/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "samples/msal-angular-samples/angular-b2c-sample/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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-b2c-sample/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-b2c-sample/node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-b2c-sample/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@inquirer/confirm": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", @@ -49533,9 +50428,9 @@ } }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@ngtools/webpack": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.9.tgz", - "integrity": "sha512-CLfUauqi2Xp/jKGxp5wUwjqfVQWcBE09GMd51ovcCRLkgB2Kh26+CiVnGw5/lkBpISUCNdgN6nGiS+nfqMfFeQ==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.12.tgz", + "integrity": "sha512-MTxkM+jZPQP55q0BWx/1w2kaN9mSFC14V9+p4sfNm/OXk7fibtxz5lXH/2sDGFWJi36s4gppKqfHBhp9OTdHCQ==", "dev": true, "license": "MIT", "engines": { @@ -49830,9 +50725,9 @@ "license": "MIT" }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/@types/node": { - "version": "20.17.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.32.tgz", - "integrity": "sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==", + "version": "20.17.47", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.47.tgz", + "integrity": "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -49914,9 +50809,9 @@ } }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -50109,15 +51004,6 @@ "fsevents": "~2.3.2" } }, - "samples/msal-angular-samples/angular-b2c-sample/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==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/sass": { "version": "1.85.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", @@ -50180,6 +51066,19 @@ } } }, + "samples/msal-angular-samples/angular-b2c-sample/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "samples/msal-angular-samples/angular-b2c-sample/node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -50325,17 +51224,17 @@ } }, "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular-devkit/build-angular": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.9.tgz", - "integrity": "sha512-v6x3h+LYyEew3EjoI1+2IiFDz6f96lJB1JvbbZj3Li9FMhO4M/xo4BaWHbeg9Lot/vUy6IAlR+BJywawNIzv0Q==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.12.tgz", + "integrity": "sha512-gPx3Vi7QFzHkSV388en6VqSqasojitJKuKmgTMPOV5keLtpOylPv3rjnr8oO9rYbYmLsT/WTUsP7bYiZhrr19Q==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", - "@angular-devkit/build-webpack": "0.1902.9", - "@angular-devkit/core": "19.2.9", - "@angular/build": "19.2.9", + "@angular-devkit/architect": "0.1902.12", + "@angular-devkit/build-webpack": "0.1902.12", + "@angular-devkit/core": "19.2.12", + "@angular/build": "19.2.12", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -50346,7 +51245,7 @@ "@babel/preset-env": "7.26.9", "@babel/runtime": "7.26.10", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.2.9", + "@ngtools/webpack": "19.2.12", "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -50354,7 +51253,7 @@ "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.1", + "esbuild-wasm": "0.25.4", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", @@ -50393,14 +51292,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.1" + "esbuild": "0.25.4" }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -50450,15 +51349,15 @@ } } }, - "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular/build": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.9.tgz", - "integrity": "sha512-hrRhSdY98wGQ/jrpT3K73/Ii5FadQEJFcHy+ockqP2Xh7pXOwhGFc+D0ks4AdHea+pHtNbIb/qPd+UvR5izY3Q==", + "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.12.tgz", + "integrity": "sha512-G28ux1T5QDlWporwupWbcodBN3rcyHfK2Dh5M3UC5hj0GstpfEHcpBHxawZzIxhqPKy//tdVLlzORUgvAwnqbA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", + "@angular-devkit/architect": "0.1902.12", "@babel/core": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -50467,7 +51366,7 @@ "@vitejs/plugin-basic-ssl": "1.2.0", "beasties": "0.3.2", "browserslist": "^4.23.0", - "esbuild": "0.25.1", + "esbuild": "0.25.4", "fast-glob": "3.3.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", @@ -50481,7 +51380,7 @@ "sass": "1.85.0", "semver": "7.7.1", "source-map-support": "0.5.21", - "vite": "6.2.6", + "vite": "6.2.7", "watchpack": "2.4.2" }, "engines": { @@ -50498,7 +51397,7 @@ "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^19.0.0 || ^19.2.0-next.0", @@ -50536,10 +51435,10 @@ } } }, - "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular/build/node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", + "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -50608,7 +51507,7 @@ } } }, - "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular/build/node_modules/vite/node_modules/postcss": { + "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite/node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", @@ -50637,10 +51536,20 @@ "node": "^10 || ^12 || >=14" } }, + "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular-devkit/build-angular/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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "samples/msal-angular-samples/angular-modules-sample/node_modules/@angular/compiler-cli": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.8.tgz", - "integrity": "sha512-gq/sc3D3m6aKmhdSTTzzD59wfQcVjIZ8dgJoPW7pOcmPVQL1N8syjv+quHySfSJlBkbs5dQ0P4Kk0yvxRw9S7g==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.11.tgz", + "integrity": "sha512-15aoOg+qj7Z3Uap1JKHMy51y12M09AOnseDBa0SYKidSx15XwZi8d01hv7sRaQJX/6Ie5cug9GiAbLKts6R33w==", "dev": true, "license": "MIT", "dependencies": { @@ -50662,7 +51571,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.8", + "@angular/compiler": "19.2.11", "typescript": ">=5.5 <5.9" } }, @@ -50714,6 +51623,177 @@ "semver": "bin/semver.js" } }, + "samples/msal-angular-samples/angular-modules-sample/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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" + } + }, + "samples/msal-angular-samples/angular-modules-sample/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, + "license": "MIT" + }, + "samples/msal-angular-samples/angular-modules-sample/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "samples/msal-angular-samples/angular-modules-sample/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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-modules-sample/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-modules-sample/node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-modules-sample/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "samples/msal-angular-samples/angular-modules-sample/node_modules/@inquirer/confirm": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", @@ -50737,9 +51817,9 @@ } }, "samples/msal-angular-samples/angular-modules-sample/node_modules/@ngtools/webpack": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.9.tgz", - "integrity": "sha512-CLfUauqi2Xp/jKGxp5wUwjqfVQWcBE09GMd51ovcCRLkgB2Kh26+CiVnGw5/lkBpISUCNdgN6nGiS+nfqMfFeQ==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.12.tgz", + "integrity": "sha512-MTxkM+jZPQP55q0BWx/1w2kaN9mSFC14V9+p4sfNm/OXk7fibtxz5lXH/2sDGFWJi36s4gppKqfHBhp9OTdHCQ==", "dev": true, "license": "MIT", "engines": { @@ -51120,9 +52200,9 @@ } }, "samples/msal-angular-samples/angular-modules-sample/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -51457,15 +52537,6 @@ "fsevents": "~2.3.2" } }, - "samples/msal-angular-samples/angular-modules-sample/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==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "samples/msal-angular-samples/angular-modules-sample/node_modules/sass": { "version": "1.85.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", @@ -51528,6 +52599,19 @@ } } }, + "samples/msal-angular-samples/angular-modules-sample/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "samples/msal-angular-samples/angular-modules-sample/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -51732,17 +52816,17 @@ } }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular-devkit/build-angular": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.9.tgz", - "integrity": "sha512-v6x3h+LYyEew3EjoI1+2IiFDz6f96lJB1JvbbZj3Li9FMhO4M/xo4BaWHbeg9Lot/vUy6IAlR+BJywawNIzv0Q==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.12.tgz", + "integrity": "sha512-gPx3Vi7QFzHkSV388en6VqSqasojitJKuKmgTMPOV5keLtpOylPv3rjnr8oO9rYbYmLsT/WTUsP7bYiZhrr19Q==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", - "@angular-devkit/build-webpack": "0.1902.9", - "@angular-devkit/core": "19.2.9", - "@angular/build": "19.2.9", + "@angular-devkit/architect": "0.1902.12", + "@angular-devkit/build-webpack": "0.1902.12", + "@angular-devkit/core": "19.2.12", + "@angular/build": "19.2.12", "@babel/core": "7.26.10", "@babel/generator": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", @@ -51753,7 +52837,7 @@ "@babel/preset-env": "7.26.9", "@babel/runtime": "7.26.10", "@discoveryjs/json-ext": "0.6.3", - "@ngtools/webpack": "19.2.9", + "@ngtools/webpack": "19.2.12", "@vitejs/plugin-basic-ssl": "1.2.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.20", @@ -51761,7 +52845,7 @@ "browserslist": "^4.21.5", "copy-webpack-plugin": "12.0.2", "css-loader": "7.1.2", - "esbuild-wasm": "0.25.1", + "esbuild-wasm": "0.25.4", "fast-glob": "3.3.3", "http-proxy-middleware": "3.0.5", "istanbul-lib-instrument": "6.0.3", @@ -51800,14 +52884,14 @@ "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.25.1" + "esbuild": "0.25.4" }, "peerDependencies": { "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "@web/test-runner": "^0.20.0", "browser-sync": "^3.0.2", "jest": "^29.5.0", @@ -51857,15 +52941,15 @@ } } }, - "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular/build": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.9.tgz", - "integrity": "sha512-hrRhSdY98wGQ/jrpT3K73/Ii5FadQEJFcHy+ockqP2Xh7pXOwhGFc+D0ks4AdHea+pHtNbIb/qPd+UvR5izY3Q==", + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.12.tgz", + "integrity": "sha512-G28ux1T5QDlWporwupWbcodBN3rcyHfK2Dh5M3UC5hj0GstpfEHcpBHxawZzIxhqPKy//tdVLlzORUgvAwnqbA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1902.9", + "@angular-devkit/architect": "0.1902.12", "@babel/core": "7.26.10", "@babel/helper-annotate-as-pure": "7.25.9", "@babel/helper-split-export-declaration": "7.24.7", @@ -51874,7 +52958,7 @@ "@vitejs/plugin-basic-ssl": "1.2.0", "beasties": "0.3.2", "browserslist": "^4.23.0", - "esbuild": "0.25.1", + "esbuild": "0.25.4", "fast-glob": "3.3.3", "https-proxy-agent": "7.0.6", "istanbul-lib-instrument": "6.0.3", @@ -51888,7 +52972,7 @@ "sass": "1.85.0", "semver": "7.7.1", "source-map-support": "0.5.21", - "vite": "6.2.6", + "vite": "6.2.7", "watchpack": "2.4.2" }, "engines": { @@ -51905,7 +52989,7 @@ "@angular/localize": "^19.0.0 || ^19.2.0-next.0", "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", - "@angular/ssr": "^19.2.9", + "@angular/ssr": "^19.2.12", "karma": "^6.4.0", "less": "^4.2.0", "ng-packagr": "^19.0.0 || ^19.2.0-next.0", @@ -51943,10 +53027,10 @@ } } }, - "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular/build/node_modules/vite": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz", - "integrity": "sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==", + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", + "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -52015,7 +53099,7 @@ } } }, - "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular/build/node_modules/vite/node_modules/postcss": { + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular-devkit/build-angular/node_modules/@angular/build/node_modules/vite/node_modules/postcss": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", @@ -52044,10 +53128,20 @@ "node": "^10 || ^12 || >=14" } }, + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular-devkit/build-angular/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==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/@angular/compiler-cli": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.8.tgz", - "integrity": "sha512-gq/sc3D3m6aKmhdSTTzzD59wfQcVjIZ8dgJoPW7pOcmPVQL1N8syjv+quHySfSJlBkbs5dQ0P4Kk0yvxRw9S7g==", + "version": "19.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.11.tgz", + "integrity": "sha512-15aoOg+qj7Z3Uap1JKHMy51y12M09AOnseDBa0SYKidSx15XwZi8d01hv7sRaQJX/6Ie5cug9GiAbLKts6R33w==", "dev": true, "license": "MIT", "dependencies": { @@ -52069,7 +53163,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "19.2.8", + "@angular/compiler": "19.2.11", "typescript": ">=5.5 <5.9" } }, @@ -52121,6 +53215,177 @@ "semver": "bin/semver.js" } }, + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "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" + } + }, + "samples/msal-angular-samples/angular-standalone-sample/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, + "license": "MIT" + }, + "samples/msal-angular-samples/angular-standalone-sample/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "samples/msal-angular-samples/angular-standalone-sample/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, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-standalone-sample/node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "samples/msal-angular-samples/angular-standalone-sample/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/@inquirer/confirm": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", @@ -52144,9 +53409,9 @@ } }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/@ngtools/webpack": { - "version": "19.2.9", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.9.tgz", - "integrity": "sha512-CLfUauqi2Xp/jKGxp5wUwjqfVQWcBE09GMd51ovcCRLkgB2Kh26+CiVnGw5/lkBpISUCNdgN6nGiS+nfqMfFeQ==", + "version": "19.2.12", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.12.tgz", + "integrity": "sha512-MTxkM+jZPQP55q0BWx/1w2kaN9mSFC14V9+p4sfNm/OXk7fibtxz5lXH/2sDGFWJi36s4gppKqfHBhp9OTdHCQ==", "dev": true, "license": "MIT", "engines": { @@ -52434,9 +53699,9 @@ "license": "MIT" }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/@types/jasmine": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.7.tgz", - "integrity": "sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.8.tgz", + "integrity": "sha512-u7/CnvRdh6AaaIzYjCgUuVbREFgulhX05Qtf6ZtW+aOcjCKKVvKgpkPYJBFTZSHtFBYimzU4zP0V2vrEsq9Wcg==", "dev": true, "license": "MIT" }, @@ -52527,9 +53792,9 @@ } }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -52869,15 +54134,6 @@ "fsevents": "~2.3.2" } }, - "samples/msal-angular-samples/angular-standalone-sample/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==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/sass": { "version": "1.85.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", @@ -52940,6 +54196,19 @@ } } }, + "samples/msal-angular-samples/angular-standalone-sample/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "samples/msal-angular-samples/angular-standalone-sample/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -53519,9 +54788,9 @@ } }, "samples/msal-browser-samples/OfficeAddin/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", "dev": true, "license": "MIT", "engines": { @@ -53609,7 +54878,7 @@ "devDependencies": { "@vitejs/plugin-vue": "^4.6.2", "typescript": "^4.8.4", - "vite": "^4.5.13", + "vite": "^4.5.14", "vue-tsc": "^1.0.8" } }, @@ -54043,9 +55312,9 @@ } }, "samples/msal-browser-samples/vue3-sample-app/node_modules/vite": { - "version": "4.5.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.13.tgz", - "integrity": "sha512-Hgp8IF/yZDzKsN1hQWOuQZbrKiaFsbQud+07jJ8h9m9PaHWkpvZ5u55Xw5yYjWRXwRQ4jwFlJvY7T7FUJG9MCA==", + "version": "4.5.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", "dev": true, "license": "MIT", "dependencies": { @@ -54192,9 +55461,9 @@ } }, "samples/msal-node-samples/auth-code-distributed-cache/node_modules/@types/node": { - "version": "18.19.87", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.87.tgz", - "integrity": "sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==", + "version": "18.19.100", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.100.tgz", + "integrity": "sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==", "dev": true, "license": "MIT", "dependencies": { @@ -54424,12 +55693,12 @@ } }, "samples/msal-node-samples/auth-code-key-vault/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", "license": "MIT", "dependencies": { - "buffer-equal-constant-time": "1.0.1", + "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } @@ -54573,9 +55842,9 @@ } }, "samples/msal-node-samples/client-credentials-distributed-cache/node_modules/@types/node": { - "version": "18.19.87", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.87.tgz", - "integrity": "sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==", + "version": "18.19.100", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.100.tgz", + "integrity": "sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==", "dev": true, "license": "MIT", "dependencies": { @@ -54751,9 +56020,9 @@ } }, "samples/msal-node-samples/custom-INetworkModule-and-network-tracing/node_modules/@types/node": { - "version": "18.19.87", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.87.tgz", - "integrity": "sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==", + "version": "18.19.100", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.100.tgz", + "integrity": "sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==", "dev": true, "license": "MIT", "dependencies": { @@ -54792,9 +56061,9 @@ "axios": "^1.8.2", "bootstrap": "^5.0.0", "electron-squirrel-startup": "^1.0.0", - "react": "^18.2.0", + "react": "^19.1.0", "react-bootstrap": "^2.7.2", - "react-dom": "^18.2.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.9.0" }, "devDependencies": { @@ -54807,8 +56076,8 @@ "@electron/asar": "^3.2.3", "@playwright/test": "^1.31.1", "@types/jest": "^29.5.0", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", + "@types/react": "^19.1.3", + "@types/react-dom": "^19.1.3", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "@vercel/webpack-asset-relocator-loader": "1.7.3", @@ -54843,9 +56112,9 @@ } }, "samples/msal-node-samples/ElectronSystemBrowserTestApp/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -55032,9 +56301,9 @@ } }, "samples/msal-node-samples/on-behalf-of-distributed-cache/node_modules/@types/node": { - "version": "18.19.87", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.87.tgz", - "integrity": "sha512-OIAAu6ypnVZHmsHCeJ+7CCSub38QNBS9uceMQeg7K5Ur0Jr+wG9wEOEvvMbhp09pxD5czIUy/jND7s7Tb6Nw7A==", + "version": "18.19.100", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.100.tgz", + "integrity": "sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA==", "dev": true, "license": "MIT", "dependencies": { @@ -55293,8 +56562,8 @@ "@emotion/styled": "^11.9.3", "@mui/icons-material": "^5.8.4", "@mui/material": "^5.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.7.0" }, "devDependencies": { @@ -55319,9 +56588,9 @@ "@emotion/styled": "^11.10.5", "@mui/icons-material": "^5.10.14", "@mui/material": "^5.10.14", - "next": "^14.2.26", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "next": "^15.3.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" }, "devDependencies": { "@types/jest": "^29.5.2", @@ -55340,8 +56609,8 @@ "@emotion/styled": "^11.10.5", "@mui/icons-material": "^5.10.16", "@mui/material": "^5.10.17", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.7.0", "react-scripts": "^5.0.1" }, @@ -55365,11 +56634,11 @@ "@mui/icons-material": "^5.10.16", "@mui/material": "^5.10.17", "@types/node": "^16.18.10", - "@types/react": "^18.0.26", - "@types/react-dom": "^18.0.9", + "@types/react": "^19.1.3", + "@types/react-dom": "^19.1.3", "@types/react-router-dom": "^5.1.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.7.0", "react-scripts": "5.0.1", "typescript": "^4.9.4" @@ -55422,4 +56691,4 @@ } } } -} \ No newline at end of file +} diff --git a/samples/e2eTestUtils/src/Constants.ts b/samples/e2eTestUtils/src/Constants.ts index e2544e9d9f..0d56dc15b5 100644 --- a/samples/e2eTestUtils/src/Constants.ts +++ b/samples/e2eTestUtils/src/Constants.ts @@ -87,28 +87,36 @@ export const GuestHomedIn = { ONPREM: "onprem", }; +export const UsernameSelectors = { + I0116: "#i0116, input[name='i0116']", + USERNAME_ENTRY: "#usernameEntry, input[name='usernameEntry']", + LOGON_IDENTIFIER: "#logonIdentifier, input[type='email']", +} + +export const SubmitButtonSelectors = { + IDSIBUTTON9: "#idSIButton9, input[name='idSIButton9']", + NEXT: "#next, input[name='next']", + ACCEPTBUTTON: "#acceptButton, input[name='acceptButton']", + REMOTE_CONNECT_SUBMIT: "#remoteConnectSubmit, input[name='remoteConnectSubmit']", + SUBMITBUTTON: "#submitButton, input[name='submitButton']", + SUBMIT: "button[type='submit']" +} + +export const PasswordInputSelectors = { + PASSWORD: "#password, input[name='password']", + PASSWORD_INPUT: "#passwordInput, input[name='passwordInput']", + I0118: "#i0118, input[name='i0118']", + PASSWORDENTRY: "#passwordEntry, input[type='password']", +} + export const HtmlSelectors = { - BUTTON9SELECTOR: "#idSIButton9, input[name='idSIButton9']", - USERNAME_INPUT: "#i0116, input[name='i0116']", AAD_TITLE: "#aadTile, input[name='aadTile']", - B2C_LOCAL_ACCOUNT_USERNAME: - "#logonIdentifier, input[name='logonIdentifier']", - B2C_LOCAL_ACCOUNT_PASSWORD: "#password, input[name='password']", - NEXT_BUTTON: "#next, input[name='next']", B2C_AAD_MSIDLAB4_SIGNIN_PAGE: "#MSIDLAB4_AzureAD, input[name='MSIDLAB4_AzureAD']", B2C_MSA_SIGNIN_PAGE: "#MicrosoftAccountExchange, input[name='MicrosoftAccountExchange']", - FORGOT_PASSWORD_LINK: - "#idA_PWD_ForgotPassword, input[name='idA_PWD_ForgotPassword']", - PASSWORD_INPUT_TEXTBOX: "#i0118, input[name='i0118']", KMSI_PAGE: "#kmsiTitle, input[name='kmsiTitle']", - STAY_SIGNEDIN_BUTTON: "#acceptButton, input[name='acceptButton']", REMOTE_LOCATION_DESCRPITION: "#remoteConnectDescription, input[name='remoteConnectDescription']", - REMOTE_LOCATION_SUBMIT_BUTTON: - "#remoteConnectSubmit, input[name='remoteConnectSubmit']", - PASSWORD_INPUT_SELECTOR: "#passwordInput, input[name='passwordInput']", - CREDENTIALS_SUBMIT_BUTTON: "#submitButton, input[name='submitButton']", DEVICE_OTC_INPUT_SELECTOR: "#otc, input[name='otc']", }; diff --git a/samples/e2eTestUtils/src/ElectronPlaywrightTestUtils.ts b/samples/e2eTestUtils/src/ElectronPlaywrightTestUtils.ts index 9c2318cd26..930129a4cb 100644 --- a/samples/e2eTestUtils/src/ElectronPlaywrightTestUtils.ts +++ b/samples/e2eTestUtils/src/ElectronPlaywrightTestUtils.ts @@ -1,86 +1,77 @@ -import { ElectronApplication, Page } from "playwright-core"; +import { ElectronApplication, ElementHandle, Page } from "playwright-core"; import * as fs from "fs"; -import { HtmlSelectors } from "./Constants"; - -export async function enterCredentials( - page: Page, - screenshot: Screenshot, - username: string, - accountPwd: string -): Promise { - await Promise.all([ - page.waitForSelector(HtmlSelectors.USERNAME_INPUT), - page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; +import { HtmlSelectors, PasswordInputSelectors, SubmitButtonSelectors, UsernameSelectors } from "./Constants"; + +export async function getUsernameInput(page: Page): Promise { + const usernameInput = await Promise.any([ + page.waitForSelector( + UsernameSelectors.I0116), + page.waitForSelector( + UsernameSelectors.USERNAME_ENTRY), + page.waitForSelector( + UsernameSelectors.LOGON_IDENTIFIER) + ]).catch(() => { + throw new Error("Username input not found"); }); - await screenshot.takeScreenshot(page, "loginPage"); - await page.type(HtmlSelectors.USERNAME_INPUT, username); - await screenshot.takeScreenshot(page, "loginPageUsernameFilled"); + return usernameInput; +} - await Promise.all([ - page.waitForNavigation({ waitUntil: "load" }), - page.waitForNavigation({ waitUntil: "domcontentloaded" }), - page.waitForNavigation({ waitUntil: "networkidle" }).catch(() => {}), // Wait for navigation but don't throw due to timeout - page.click(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; +export async function getSubmitButton(page: Page): Promise { + const submitButton = await Promise.any([ + page.waitForSelector(SubmitButtonSelectors.IDSIBUTTON9), + page.waitForSelector(SubmitButtonSelectors.NEXT), + page.waitForSelector(SubmitButtonSelectors.ACCEPTBUTTON), + page.waitForSelector(SubmitButtonSelectors.REMOTE_CONNECT_SUBMIT), + page.waitForSelector(SubmitButtonSelectors.SUBMITBUTTON), + page.waitForSelector(SubmitButtonSelectors.SUBMIT), + ]).catch(() => { + throw new Error("Submit button not found"); }); - await page.waitForSelector(HtmlSelectors.FORGOT_PASSWORD_LINK); - await page.waitForSelector(HtmlSelectors.PASSWORD_INPUT_TEXTBOX); - await page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR); - await screenshot.takeScreenshot(page, "pwdInputPage"); - await page.type(HtmlSelectors.PASSWORD_INPUT_TEXTBOX, accountPwd); - await screenshot.takeScreenshot(page, "loginPagePasswordFilled"); - await page.click(HtmlSelectors.BUTTON9SELECTOR, { noWaitAfter: true }); + return submitButton; } -export async function enterCredentialsADFS( +export async function getPasswordInput(page: Page): Promise { + const passwordInput = await Promise.any([ + page.waitForSelector(PasswordInputSelectors.PASSWORD), + page.waitForSelector(PasswordInputSelectors.PASSWORD_INPUT), + page.waitForSelector(PasswordInputSelectors.I0118), + page.waitForSelector(PasswordInputSelectors.PASSWORDENTRY), + ]).catch(() => { + throw new Error("Password input not found"); + }); + return passwordInput; +} + +export async function enterCredentials( page: Page, screenshot: Screenshot, username: string, accountPwd: string ): Promise { - await Promise.all([ - page.waitForSelector(HtmlSelectors.USERNAME_INPUT), - page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); - - await screenshot.takeScreenshot(page, "loginPageADFS"); - await page.type(HtmlSelectors.USERNAME_INPUT, username); + const usernameInput = await getUsernameInput(page); + await screenshot.takeScreenshot(page, "loginPage"); + await usernameInput.fill(username); await screenshot.takeScreenshot(page, "loginPageUsernameFilled"); + let submitButton = await getSubmitButton(page); await Promise.all([ page.waitForNavigation({ waitUntil: "load" }), page.waitForNavigation({ waitUntil: "domcontentloaded" }), page.waitForNavigation({ waitUntil: "networkidle" }).catch(() => {}), // Wait for navigation but don't throw due to timeout - page.click(HtmlSelectors.BUTTON9SELECTOR), + submitButton.click(), ]).catch(async (e) => { await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); throw e; }); - await page.waitForSelector(HtmlSelectors.PASSWORD_INPUT_SELECTOR); - await page.waitForSelector(HtmlSelectors.CREDENTIALS_SUBMIT_BUTTON); - await page.type(HtmlSelectors.PASSWORD_INPUT_SELECTOR, accountPwd); - await screenshot.takeScreenshot(page, "passwordEntered"); - - await Promise.all([ - page.waitForNavigation({ waitUntil: "load" }), - page.waitForNavigation({ waitUntil: "domcontentloaded" }), - page.waitForNavigation({ waitUntil: "networkidle" }).catch(() => {}), // Wait for navigation but don't throw due to timeout - page.click(HtmlSelectors.CREDENTIALS_SUBMIT_BUTTON), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + const passwordInput = await getPasswordInput(page); + await screenshot.takeScreenshot(page, "pwdInputPage"); + await passwordInput.fill(accountPwd); + await screenshot.takeScreenshot(page, "loginPagePasswordFilled"); + submitButton = await getSubmitButton(page); + await submitButton.click({ noWaitAfter: true }); } export async function clickSignIn( diff --git a/samples/e2eTestUtils/src/TestUtils.ts b/samples/e2eTestUtils/src/TestUtils.ts index 8cee888852..505ae62c9a 100644 --- a/samples/e2eTestUtils/src/TestUtils.ts +++ b/samples/e2eTestUtils/src/TestUtils.ts @@ -1,14 +1,15 @@ import * as fs from "fs"; -import { Page, HTTPResponse, Browser, WaitForOptions } from "puppeteer"; +import { Page, Browser, WaitForOptions } from "puppeteer"; import { LabConfig } from "./LabConfig"; import { LabClient } from "./LabClient"; -import { HtmlSelectors } from "./Constants"; +import { HtmlSelectors, PasswordInputSelectors, SubmitButtonSelectors, UsernameSelectors } from "./Constants"; export const ONE_SECOND_IN_MS = 1000; export const RETRY_TIMES = 5; const WAIT_FOR_NAVIGATION_CONFIG: WaitForOptions = { waitUntil: ["load", "domcontentloaded", "networkidle0"], + timeout: 2000 }; export class Screenshot { @@ -174,11 +175,9 @@ export async function b2cLocalAccountEnterCredentials( username: string, accountPwd: string ) { - await page.waitForSelector(HtmlSelectors.B2C_LOCAL_ACCOUNT_USERNAME); - await screenshot.takeScreenshot(page, "b2cSignInPage"); - await page.type(HtmlSelectors.B2C_LOCAL_ACCOUNT_USERNAME, username); - await page.type(HtmlSelectors.B2C_LOCAL_ACCOUNT_PASSWORD, accountPwd); - await page.click(HtmlSelectors.NEXT_BUTTON); + await fillUsername(page, screenshot, username); + await fillPassword(page, screenshot, accountPwd); + await clickSubmitButton(page, screenshot); } export async function b2cAadPpeAccountEnterCredentials( @@ -216,126 +215,100 @@ export const SUCCESSFUL_GRAPH_CALL_ID = "graph-called-successfully"; export const SUCCESSFUL_SILENT_TOKEN_ACQUISITION_ID = "token-acquired-silently"; export const SUCCESSFUL_GET_ALL_ACCOUNTS_ID = "accounts-retrieved-successfully"; -export async function enterCredentials( - page: Page, - screenshot: Screenshot, - username: string, - accountPwd: string -): Promise { - await Promise.all([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG).catch(() => {}), // Wait for navigation but don't throw due to timeout - page.waitForSelector(HtmlSelectors.USERNAME_INPUT), - page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); - await screenshot.takeScreenshot(page, "loginPage"); - await page.type(HtmlSelectors.USERNAME_INPUT, username); - await screenshot.takeScreenshot(page, "loginPageUsernameFilled"); - await Promise.all([ - page.waitForNavigation({ - waitUntil: ["load", "domcontentloaded", "networkidle0"], - }), - page.click(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); - - // agce: which type of account do you want to use +export async function fillPassword(page: Page, screenshot: Screenshot, password: string): Promise { try { - await page.waitForSelector(HtmlSelectors.AAD_TITLE, { timeout: 1000 }); - await screenshot.takeScreenshot(page, "accountType"); - await Promise.all([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), - page.click(HtmlSelectors.AAD_TITLE), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + await screenshot.takeScreenshot(page, "passwordPage"); + await page.locator(`${Object.values(PasswordInputSelectors).join(", ")}`).setTimeout(2000).fill(password); + await screenshot.takeScreenshot(page, "loginPagePasswordFilled"); } catch (e) { - // - } - - await page.waitForSelector(HtmlSelectors.FORGOT_PASSWORD_LINK); - await page.waitForSelector(HtmlSelectors.PASSWORD_INPUT_TEXTBOX); - await page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR); - await screenshot.takeScreenshot(page, "pwdInputPage"); - await page.type(HtmlSelectors.PASSWORD_INPUT_TEXTBOX, accountPwd); - await screenshot.takeScreenshot(page, "loginPagePasswordFilled"); - await Promise.all([ - page.click(HtmlSelectors.BUTTON9SELECTOR), - - // Wait either for another navigation to Keep me signed in page or back to redirectUri - Promise.race([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), - page.waitForResponse( - (response: HTTPResponse) => - response.url().startsWith(SAMPLE_HOME_URL), - { timeout: 0 } - ), - ]), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); + await screenshot.takeScreenshot(page, "failedToFillPassword").catch(() => {}); throw e; - }); - - if (page.url().startsWith(SAMPLE_HOME_URL)) { - return; } - await screenshot.takeScreenshot(page, "passwordSubmitted"); +} - // agce: check if the "help us protect your account" dialog appears +export async function fillUsername(page: Page, screenshot: Screenshot, username: string): Promise { try { - const selector = - "#lightbox > div:nth-child(3) > div > div.pagination-view.has-identity-banner.animate.slide-in-next > div > div:nth-child(3) > a"; - await page.waitForSelector(selector, { timeout: 1000 }); - await page.click(selector); + await screenshot.takeScreenshot(page, "loginPage"); + await page.locator(`${Object.values(UsernameSelectors).join(", ")}`).setTimeout(2000).fill(username); + await screenshot.takeScreenshot(page, "loginPageUsernameFilled"); } catch (e) { - // continue + await screenshot.takeScreenshot(page, "failedToFillUsername").catch(() => {}); + throw e; } +} - // keep me signed in page +export async function clickSubmitButton(page: Page, screenshot: Screenshot): Promise { try { - const aadKmsi = page - .waitForSelector(HtmlSelectors.BUTTON9SELECTOR, { timeout: 1000 }) - .then(() => { - return HtmlSelectors.BUTTON9SELECTOR; - }); - const msaKmsi = page - .waitForSelector(HtmlSelectors.KMSI_PAGE, { timeout: 1000 }) - .then(() => { - return HtmlSelectors.STAY_SIGNEDIN_BUTTON; - }); - const buttonTag = await Promise.race([aadKmsi, msaKmsi]); - await screenshot.takeScreenshot(page, "keepMeSignedInPage"); - await Promise.all([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), - page.click(buttonTag), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + await page.locator(`${Object.values(SubmitButtonSelectors).join(", ")}`).setTimeout(2000).click(); + await page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG).catch(() => {}); } catch (e) { - return; + await screenshot.takeScreenshot(page, "errorClickingSubmit").catch(() => {}); + throw e; } +} - // agce: private tenant sign in page +export async function enterCredentials( + page: Page, + screenshot: Screenshot, + username: string, + accountPwd: string +): Promise { try { - await page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR, { - timeout: 1000, - }); - await screenshot.takeScreenshot(page, "privateTenantSignInPage"); - await Promise.all([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), - page.click(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + await page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG).catch(() => {}); + await fillUsername(page, screenshot, username); + await clickSubmitButton(page, screenshot); + + // agce: which type of account do you want to use + try { + await page.waitForSelector(HtmlSelectors.AAD_TITLE, { timeout: 1000 }); + await screenshot.takeScreenshot(page, "accountType"); + await Promise.all([ + page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), + page.click(HtmlSelectors.AAD_TITLE), + ]).catch(async (e) => { + await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); + throw e; + }); + } catch (e) { + // + } + + await fillPassword(page, screenshot, accountPwd); + await clickSubmitButton(page, screenshot); + + if (page.isClosed() || page.url().startsWith(SAMPLE_HOME_URL)) { + return; + } + await screenshot.takeScreenshot(page, "passwordSubmitted"); + + // agce: check if the "help us protect your account" dialog appears + try { + const selector = + "#lightbox > div:nth-child(3) > div > div.pagination-view.has-identity-banner.animate.slide-in-next > div > div:nth-child(3) > a"; + await page.waitForSelector(selector, { timeout: 1000 }); + await page.click(selector); + } catch (e) { + // continue + } + + // keep me signed in page + try { + await screenshot.takeScreenshot(page, "keepMeSignedInPage"); + await clickSubmitButton(page, screenshot); + } catch (e) { + return; + } + + // agce: private tenant sign in page + try { + await screenshot.takeScreenshot(page, "privateTenantSignInPage"); + await clickSubmitButton(page, screenshot); + } catch (e) { + return; + } } catch (e) { - return; + await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); + throw e; } } @@ -345,15 +318,7 @@ export async function approveRemoteConnect( ): Promise { try { await page.waitForSelector(HtmlSelectors.REMOTE_LOCATION_DESCRPITION); - await page.waitForSelector(HtmlSelectors.REMOTE_LOCATION_SUBMIT_BUTTON); - await screenshot.takeScreenshot(page, "remoteConnectPage"); - await Promise.all([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), - page.click(HtmlSelectors.REMOTE_LOCATION_SUBMIT_BUTTON), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + await clickSubmitButton(page, screenshot); } catch (e) { return; } @@ -373,16 +338,7 @@ export async function approveConsent( page: Page, screenshot: Screenshot ): Promise { - await page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR); - await Promise.all([ - page.waitForNavigation({ - waitUntil: ["load", "domcontentloaded", "networkidle0"], - }), - page.click(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + await clickSubmitButton(page, screenshot); await screenshot.takeScreenshot(page, "consentApproved"); } @@ -393,9 +349,7 @@ export async function clickSignIn( await page.waitForSelector("#SignIn"); await screenshot.takeScreenshot(page, "samplePageInit"); await Promise.all([ - page.waitForNavigation({ - waitUntil: ["load", "domcontentloaded", "networkidle0"], - }), + page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG), page.click("#SignIn"), ]).catch(async (e) => { await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); @@ -410,40 +364,12 @@ export async function enterCredentialsADFS( username: string, accountPwd: string ): Promise { - await Promise.all([ - page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG).catch(() => {}), // Wait for navigation but don't throw due to timeout - page.waitForSelector(HtmlSelectors.USERNAME_INPUT), - page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); - await screenshot.takeScreenshot(page, "loginPageADFS"); - await page.type(HtmlSelectors.USERNAME_INPUT, username); - await screenshot.takeScreenshot(page, "usernameEntered"); - await Promise.all([ - page.waitForNavigation({ - waitUntil: ["load", "domcontentloaded", "networkidle0"], - }), - page.click(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); - await page.waitForSelector(HtmlSelectors.PASSWORD_INPUT_SELECTOR); - await page.waitForSelector(HtmlSelectors.CREDENTIALS_SUBMIT_BUTTON); - await page.type(HtmlSelectors.PASSWORD_INPUT_SELECTOR, accountPwd); - await screenshot.takeScreenshot(page, "passwordEntered"); - await Promise.all([ - page.waitForNavigation({ - waitUntil: ["load", "domcontentloaded", "networkidle0"], - }), - page.click(HtmlSelectors.CREDENTIALS_SUBMIT_BUTTON), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); - await screenshot.takeScreenshot(page, "pwdSubmitted"); + await page.waitForNavigation(WAIT_FOR_NAVIGATION_CONFIG).catch(() => {}); + await fillUsername(page, screenshot, username); + await clickSubmitButton(page, screenshot); + await page.waitForSelector(PasswordInputSelectors.PASSWORD_INPUT); + await fillPassword(page, screenshot, accountPwd); + await clickSubmitButton(page, screenshot); } export async function enterDeviceCode( @@ -456,18 +382,9 @@ export async function enterDeviceCode( waitUntil: ["load", "domcontentloaded", "networkidle0"], }); await page.waitForSelector(HtmlSelectors.DEVICE_OTC_INPUT_SELECTOR); - await page.waitForSelector(HtmlSelectors.BUTTON9SELECTOR); await screenshot.takeScreenshot(page, "deviceCodePage"); await page.type(HtmlSelectors.DEVICE_OTC_INPUT_SELECTOR, code); - await Promise.all([ - page.waitForNavigation({ - waitUntil: ["load", "domcontentloaded", "networkidle0"], - }), - page.click(HtmlSelectors.BUTTON9SELECTOR), - ]).catch(async (e) => { - await screenshot.takeScreenshot(page, "errorPage").catch(() => {}); - throw e; - }); + await clickSubmitButton(page, screenshot); } export async function validateCacheLocation( diff --git a/samples/msal-angular-samples/angular-b2c-sample/tsconfig.json b/samples/msal-angular-samples/angular-b2c-sample/tsconfig.json index c136d29e54..50e284f9b9 100644 --- a/samples/msal-angular-samples/angular-b2c-sample/tsconfig.json +++ b/samples/msal-angular-samples/angular-b2c-sample/tsconfig.json @@ -19,7 +19,7 @@ "module": "es2020", "esModuleInterop": true, "lib": [ - "es2020", + "es2021", "dom" ], "paths": { diff --git a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAAD.spec.ts b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAAD.spec.ts index fe26db221c..7295b14e1d 100644 --- a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAAD.spec.ts +++ b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAAD.spec.ts @@ -295,7 +295,6 @@ describe("AAD-Prod Tests", () => { .startsWith("https://login.microsoftonline.com/common/") ).toBeTruthy(); expect(popupWindow.url()).toContain("logout"); - await popupWindow.waitForNavigation(); const tokenStore = await BrowserCache.getTokens(); expect(tokenStore.idTokens.length).toEqual(0); @@ -369,8 +368,9 @@ describe("AAD-Prod Tests", () => { .startsWith("https://login.microsoftonline.com/common/") ).toBeTruthy(); expect(page.url()).toContain("logout"); - - await page.waitForNavigation(); + await page.waitForFunction( + `window.location.href.startsWith("${sampleHomeUrl}")` + ); const tokenStore = await BrowserCache.getTokens(); expect(tokenStore.idTokens.length).toEqual(0); diff --git a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADMultiTenant.spec.ts b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADMultiTenant.spec.ts index 4f725d28c6..527ddf9189 100644 --- a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADMultiTenant.spec.ts +++ b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADMultiTenant.spec.ts @@ -150,7 +150,6 @@ describe("AAD-Prod Tests", () => { ) ).toBeTruthy(); expect(popupWindow.url()).toContain("logout"); - await popupWindow.waitForNavigation(); const tokenStore = await BrowserCache.getTokens(); expect(tokenStore.idTokens.length).toEqual(0); diff --git a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADTenanted.spec.ts b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADTenanted.spec.ts index 4b0d9821ea..ba82066b1b 100644 --- a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADTenanted.spec.ts +++ b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/browserAADTenanted.spec.ts @@ -299,7 +299,6 @@ describe("AAD-Prod Tests", () => { ) ).toBeTruthy(); expect(popupWindow.url()).toContain("logout"); - await popupWindow.waitForNavigation(); const tokenStore = await BrowserCache.getTokens(); expect(tokenStore.idTokens.length).toEqual(0); diff --git a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/localStorage.spec.ts b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/localStorage.spec.ts index b0509e00f0..d2f74fcef1 100644 --- a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/localStorage.spec.ts +++ b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/customizable-e2e-test/test/localStorage.spec.ts @@ -112,7 +112,7 @@ describe("LocalStorage Tests", function () { `${SCREENSHOT_BASE_FOLDER_NAME}/${testName}` ); await clickLoginRedirect(screenshot, page); - await page.waitForNavigation({ waitUntil: "networkidle0" }); + await page.waitForNavigation({ waitUntil: "networkidle0" }).catch(() => {}); // Navigate back to home page await page.goto(sampleHomeUrl); // Wait for processing @@ -166,7 +166,7 @@ describe("LocalStorage Tests", function () { screenshot, page ); - await popupPage.waitForNavigation({ waitUntil: "networkidle0" }); + await popupPage.waitForNavigation({ waitUntil: "networkidle0" }).catch(() => {}); await popupPage.close(); // Wait until popup window closes await popupWindowClosed; diff --git a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/wamBroker/authConfig.js b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/wamBroker/authConfig.js index 3714c6dd9b..602c16b197 100644 --- a/samples/msal-browser-samples/VanillaJSTestApp2.0/app/wamBroker/authConfig.js +++ b/samples/msal-browser-samples/VanillaJSTestApp2.0/app/wamBroker/authConfig.js @@ -1,8 +1,16 @@ +// demo usage of isPlatformBrokerAvailable API +const isPlatformBrokerAvailable = msal.isPlatformBrokerAvailable().then((isAvailable) => { + console.log(`isNativeAvailable: ${isAvailable}`); + return isAvailable; +}).catch((error) => { + console.error("Error checking if platform broker is available:", error); +}); + // Config object to be passed to Msal on creation const msalConfig = { auth: { - clientId: "b5c2e510-4a17-4feb-b219-e55aa5b74144", - authority: "https://login.microsoftonline.com/common" + clientId: "591ddbcc-105b-42c5-89e6-c7638c4124d4", + authority: "https://login.microsoftonline.com/f645ad92-e38d-4d1a-b510-d1b09a74a8ca" }, cache: { cacheLocation: "sessionStorage", // This configures where your cache will be stored diff --git a/samples/msal-browser-samples/VanillaJSTestApp2.0/tsconfig.json b/samples/msal-browser-samples/VanillaJSTestApp2.0/tsconfig.json index 5e6695a0fa..faa7ec0463 100644 --- a/samples/msal-browser-samples/VanillaJSTestApp2.0/tsconfig.json +++ b/samples/msal-browser-samples/VanillaJSTestApp2.0/tsconfig.json @@ -5,9 +5,9 @@ "module": "commonjs", "target": "es5", "lib": [ - "es2015", + "es2021", "dom", - "es2015.promise" + "es2021.promise" ], "allowUnusedLabels": false, "noImplicitReturns": true, diff --git a/samples/msal-browser-samples/vue3-sample-app/package.json b/samples/msal-browser-samples/vue3-sample-app/package.json index 4c8720886e..2d54647daa 100644 --- a/samples/msal-browser-samples/vue3-sample-app/package.json +++ b/samples/msal-browser-samples/vue3-sample-app/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@vitejs/plugin-vue": "^4.6.2", "typescript": "^4.8.4", - "vite": "^4.5.13", + "vite": "^4.5.14", "vue-tsc": "^1.0.8" } } diff --git a/samples/msal-node-samples/ElectronSystemBrowserTestApp/package.json b/samples/msal-node-samples/ElectronSystemBrowserTestApp/package.json index 8a64c11cca..9b65da45d0 100644 --- a/samples/msal-node-samples/ElectronSystemBrowserTestApp/package.json +++ b/samples/msal-node-samples/ElectronSystemBrowserTestApp/package.json @@ -31,8 +31,8 @@ "@electron/asar": "^3.2.3", "@playwright/test": "^1.31.1", "@types/jest": "^29.5.0", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", + "@types/react": "^19.1.3", + "@types/react-dom": "^19.1.3", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "@vercel/webpack-asset-relocator-loader": "1.7.3", @@ -60,9 +60,9 @@ "axios": "^1.8.2", "bootstrap": "^5.0.0", "electron-squirrel-startup": "^1.0.0", - "react": "^18.2.0", + "react": "^19.1.0", "react-bootstrap": "^2.7.2", - "react-dom": "^18.2.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.9.0" }, "config": { diff --git a/samples/msal-node-samples/ElectronSystemBrowserTestApp/src/app/components/PageLayout.tsx b/samples/msal-node-samples/ElectronSystemBrowserTestApp/src/app/components/PageLayout.tsx index 194d07c982..c44743a012 100644 --- a/samples/msal-node-samples/ElectronSystemBrowserTestApp/src/app/components/PageLayout.tsx +++ b/samples/msal-node-samples/ElectronSystemBrowserTestApp/src/app/components/PageLayout.tsx @@ -4,7 +4,7 @@ import { NavigationBar } from "./NavigationBar"; type PageLayoutProps = { account: AccountInfo; - children: JSX.Element; + children: React.JSX.Element; }; export const PageLayout = (props: PageLayoutProps) => { diff --git a/samples/msal-node-samples/tsconfig.json b/samples/msal-node-samples/tsconfig.json index 1609257cb5..60f21f5532 100644 --- a/samples/msal-node-samples/tsconfig.json +++ b/samples/msal-node-samples/tsconfig.json @@ -6,7 +6,7 @@ "lib": [ "ES2021", "dom", - "es2015.promise" + "ES2021.Promise" ], "allowUnusedLabels": false, "noImplicitReturns": true, diff --git a/samples/msal-react-samples/b2c-sample/package.json b/samples/msal-react-samples/b2c-sample/package.json index bf9b8d3418..0f6531b83f 100644 --- a/samples/msal-react-samples/b2c-sample/package.json +++ b/samples/msal-react-samples/b2c-sample/package.json @@ -9,8 +9,8 @@ "@emotion/styled": "^11.9.3", "@mui/icons-material": "^5.8.4", "@mui/material": "^5.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.7.0" }, "devDependencies": { diff --git a/samples/msal-react-samples/b2c-sample/src/ui-components/WelcomeName.jsx b/samples/msal-react-samples/b2c-sample/src/ui-components/WelcomeName.jsx index 718ccf97b1..13d83df587 100644 --- a/samples/msal-react-samples/b2c-sample/src/ui-components/WelcomeName.jsx +++ b/samples/msal-react-samples/b2c-sample/src/ui-components/WelcomeName.jsx @@ -1,12 +1,13 @@ import { useEffect, useState } from "react"; import { useMsal } from "@azure/msal-react"; +import { InteractionStatus } from "@azure/msal-browser"; import Typography from "@mui/material/Typography"; const WelcomeName = () => { - const { instance } = useMsal(); + const { instance, inProgress } = useMsal(); const [name, setName] = useState(null); - const activeAccount = instance.getActiveAccount(); + const activeAccount = inProgress === InteractionStatus.None ? instance.getActiveAccount() : null; useEffect(() => { if (activeAccount && activeAccount.name) { setName(activeAccount.name.split(' ')[0]); diff --git a/samples/msal-react-samples/b2c-sample/test/msa-account.spec.ts b/samples/msal-react-samples/b2c-sample/test/msa-account.spec.ts index f49d230b42..bc546f233b 100644 --- a/samples/msal-react-samples/b2c-sample/test/msa-account.spec.ts +++ b/samples/msal-react-samples/b2c-sample/test/msa-account.spec.ts @@ -107,15 +107,16 @@ describe("B2C user-flow tests (msa account)", () => { const editProfileButton = await page.waitForSelector( "#editProfileButton" ); - if (editProfileButton) { - await editProfileButton.click(); - } + await editProfileButton.click(); let displayName = (Math.random() + 1).toString(36).substring(7); // generate a random string await page.waitForNavigation(); + await screenshot.takeScreenshot(page, "Edit profile button clicked"); await page.waitForSelector("#attributeVerification", { visible: true }); - await page.$eval("#displayName", (el: any) => (el.value = "")), // clear the text field - await page.type("#displayName", `${displayName}`), - await page.click("#continue"); + await page.$eval("#displayName", (el: any) => (el.value = "")); // clear the text field + await page.type("#displayName", `${displayName}`); + await page.click("#continue"); + await page.waitForNetworkIdle(); + await screenshot.takeScreenshot(page, "Edit profile page filled"); await Promise.all([ page.waitForFunction( `window.location.href.startsWith("http://localhost:${port}")` diff --git a/samples/msal-react-samples/nextjs-sample/next-env.d.ts b/samples/msal-react-samples/nextjs-sample/next-env.d.ts index 4f11a03dc6..52e831b434 100644 --- a/samples/msal-react-samples/nextjs-sample/next-env.d.ts +++ b/samples/msal-react-samples/nextjs-sample/next-env.d.ts @@ -2,4 +2,4 @@ /// // NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. +// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information. diff --git a/samples/msal-react-samples/nextjs-sample/package.json b/samples/msal-react-samples/nextjs-sample/package.json index eacc8bebc1..375ad67e5e 100644 --- a/samples/msal-react-samples/nextjs-sample/package.json +++ b/samples/msal-react-samples/nextjs-sample/package.json @@ -18,9 +18,9 @@ "@emotion/styled": "^11.10.5", "@mui/icons-material": "^5.10.14", "@mui/material": "^5.10.14", - "next": "^14.2.26", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "next": "^15.3.1", + "react": "^19.1.0", + "react-dom": "^19.1.0" }, "devDependencies": { "@types/jest": "^29.5.2", diff --git a/samples/msal-react-samples/nextjs-sample/src/ui-components/WelcomeName.jsx b/samples/msal-react-samples/nextjs-sample/src/ui-components/WelcomeName.jsx index 718ccf97b1..13d83df587 100644 --- a/samples/msal-react-samples/nextjs-sample/src/ui-components/WelcomeName.jsx +++ b/samples/msal-react-samples/nextjs-sample/src/ui-components/WelcomeName.jsx @@ -1,12 +1,13 @@ import { useEffect, useState } from "react"; import { useMsal } from "@azure/msal-react"; +import { InteractionStatus } from "@azure/msal-browser"; import Typography from "@mui/material/Typography"; const WelcomeName = () => { - const { instance } = useMsal(); + const { instance, inProgress } = useMsal(); const [name, setName] = useState(null); - const activeAccount = instance.getActiveAccount(); + const activeAccount = inProgress === InteractionStatus.None ? instance.getActiveAccount() : null; useEffect(() => { if (activeAccount && activeAccount.name) { setName(activeAccount.name.split(' ')[0]); diff --git a/samples/msal-react-samples/nextjs-sample/test/profile.spec.ts b/samples/msal-react-samples/nextjs-sample/test/profile.spec.ts index 39773095ba..0896c494a9 100644 --- a/samples/msal-react-samples/nextjs-sample/test/profile.spec.ts +++ b/samples/msal-react-samples/nextjs-sample/test/profile.spec.ts @@ -24,7 +24,7 @@ async function verifyTokenStore( "b5c2e510-4a17-4feb-b219-e55aa5b74144" ); expect(telemetryCacheEntry).not.toBeNull; - expect(telemetryCacheEntry["cacheHits"]).toBe(1); + expect(telemetryCacheEntry["cacheHits"]).toBeGreaterThanOrEqual(1); } describe("/profile", () => { diff --git a/samples/msal-react-samples/react-router-sample/package.json b/samples/msal-react-samples/react-router-sample/package.json index 56f4ac8c2f..3eed7ef3a0 100644 --- a/samples/msal-react-samples/react-router-sample/package.json +++ b/samples/msal-react-samples/react-router-sample/package.json @@ -9,8 +9,8 @@ "@emotion/styled": "^11.10.5", "@mui/icons-material": "^5.10.16", "@mui/material": "^5.10.17", - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.7.0", "react-scripts": "^5.0.1" }, diff --git a/samples/msal-react-samples/react-router-sample/src/ui-components/WelcomeName.jsx b/samples/msal-react-samples/react-router-sample/src/ui-components/WelcomeName.jsx index a9ca901882..3efd6c884e 100644 --- a/samples/msal-react-samples/react-router-sample/src/ui-components/WelcomeName.jsx +++ b/samples/msal-react-samples/react-router-sample/src/ui-components/WelcomeName.jsx @@ -1,12 +1,13 @@ import { useEffect, useState } from "react"; import { useMsal } from "@azure/msal-react"; +import { InteractionStatus } from "@azure/msal-browser"; import Typography from "@mui/material/Typography"; const WelcomeName = () => { - const { instance } = useMsal(); + const { instance, inProgress } = useMsal(); const [name, setName] = useState(null); - const activeAccount = instance.getActiveAccount(); + const activeAccount = inProgress === InteractionStatus.None ? instance.getActiveAccount() : null; useEffect(() => { if (activeAccount) { setName(activeAccount.name.split(' ')[0]); diff --git a/samples/msal-react-samples/react-router-sample/test/profile.spec.ts b/samples/msal-react-samples/react-router-sample/test/profile.spec.ts index 03c6e612f4..e38be2d133 100644 --- a/samples/msal-react-samples/react-router-sample/test/profile.spec.ts +++ b/samples/msal-react-samples/react-router-sample/test/profile.spec.ts @@ -24,7 +24,7 @@ async function verifyTokenStore( "b5c2e510-4a17-4feb-b219-e55aa5b74144" ); expect(telemetryCacheEntry).not.toBeNull; - expect(telemetryCacheEntry["cacheHits"]).toBe(1); + expect(telemetryCacheEntry["cacheHits"]).toBeGreaterThanOrEqual(1); } describe("/profile", () => { diff --git a/samples/msal-react-samples/react-router-sample/test/profileRawContext.spec.ts b/samples/msal-react-samples/react-router-sample/test/profileRawContext.spec.ts index 40ecfb15d4..daca110064 100644 --- a/samples/msal-react-samples/react-router-sample/test/profileRawContext.spec.ts +++ b/samples/msal-react-samples/react-router-sample/test/profileRawContext.spec.ts @@ -24,7 +24,7 @@ async function verifyTokenStore( "b5c2e510-4a17-4feb-b219-e55aa5b74144" ); expect(telemetryCacheEntry).not.toBeNull; - expect(telemetryCacheEntry["cacheHits"]).toBe(1); + expect(telemetryCacheEntry["cacheHits"]).toBeGreaterThanOrEqual(1); } describe("/profileRawContext", () => { diff --git a/samples/msal-react-samples/react-router-sample/test/profileWithMsal.spec.ts b/samples/msal-react-samples/react-router-sample/test/profileWithMsal.spec.ts index 11fa315bc0..8c1d824994 100644 --- a/samples/msal-react-samples/react-router-sample/test/profileWithMsal.spec.ts +++ b/samples/msal-react-samples/react-router-sample/test/profileWithMsal.spec.ts @@ -24,7 +24,7 @@ async function verifyTokenStore( "b5c2e510-4a17-4feb-b219-e55aa5b74144" ); expect(telemetryCacheEntry).not.toBeNull; - expect(telemetryCacheEntry["cacheHits"]).toBe(1); + expect(telemetryCacheEntry["cacheHits"]).toBeGreaterThanOrEqual(1); } describe("/profileWithMsal", () => { diff --git a/samples/msal-react-samples/tsconfig.json b/samples/msal-react-samples/tsconfig.json index bafed899c0..3a5538f7d5 100644 --- a/samples/msal-react-samples/tsconfig.json +++ b/samples/msal-react-samples/tsconfig.json @@ -4,9 +4,9 @@ "module": "commonjs", "target": "es5", "lib": [ - "es2015", + "ES2021", "dom", - "es2015.promise" + "ES2021.Promise" ], "allowUnusedLabels": false, "noImplicitReturns": true, diff --git a/samples/msal-react-samples/typescript-sample/package.json b/samples/msal-react-samples/typescript-sample/package.json index 22e5dc9967..ff3a0f4d49 100644 --- a/samples/msal-react-samples/typescript-sample/package.json +++ b/samples/msal-react-samples/typescript-sample/package.json @@ -10,11 +10,11 @@ "@mui/icons-material": "^5.10.16", "@mui/material": "^5.10.17", "@types/node": "^16.18.10", - "@types/react": "^18.0.26", - "@types/react-dom": "^18.0.9", + "@types/react": "^19.1.3", + "@types/react-dom": "^19.1.3", "@types/react-router-dom": "^5.1.7", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "react": "^19.1.0", + "react-dom": "^19.1.0", "react-router-dom": "^6.7.0", "react-scripts": "5.0.1", "typescript": "^4.9.4" @@ -50,5 +50,5 @@ "suiteNameTemplate": "TypeScript Sample Tests", "outputDirectory": ".", "outputName": "test-results.xml" - } + } } diff --git a/samples/msal-react-samples/typescript-sample/test/profile.spec.ts b/samples/msal-react-samples/typescript-sample/test/profile.spec.ts index 200f08df30..712fdb5cf5 100644 --- a/samples/msal-react-samples/typescript-sample/test/profile.spec.ts +++ b/samples/msal-react-samples/typescript-sample/test/profile.spec.ts @@ -34,7 +34,7 @@ async function verifyTokenStore( "b5c2e510-4a17-4feb-b219-e55aa5b74144" ); expect(telemetryCacheEntry).not.toBeNull; - expect(telemetryCacheEntry!.cacheHits).toBe(1); + expect(telemetryCacheEntry!.cacheHits).toBeGreaterThanOrEqual(1); } describe("/profile", () => { diff --git a/shared-configs/jest-config/jest.config.cjs b/shared-configs/jest-config/jest.config.cjs index ebab6be377..6a029c0422 100644 --- a/shared-configs/jest-config/jest.config.cjs +++ b/shared-configs/jest-config/jest.config.cjs @@ -8,6 +8,7 @@ const path = require("path"); module.exports = { preset: "ts-jest", resolver: "ts-jest-resolver", + reporters: ['default', 'jest-junit'], testEnvironment: "jsdom", testEnvironmentOptions: { url: "https://localhost:8081/index.html"