From 0e8d6bf49ffe99cbbd16a2f8dd97d5b8e995fda5 Mon Sep 17 00:00:00 2001 From: laxmanhalaki Date: Sun, 19 Apr 2026 23:23:00 +0530 Subject: [PATCH] folder structure refactored unit test cases added revoke sreject send back tested on costitutional and termination modules all modules almost completed major points covered in this commit --- babel.config.cjs | 22 + jest.config.cjs | 29 + package-lock.json | 6635 +++++++++++++++++ package.json | 23 +- playwright.config.ts | 34 + src/App.tsx | 131 +- .../e2e/fixtures/lifecycle-api-stubs.ts | 387 + src/__tests__/e2e/fixtures/login.ts | 9 + .../e2e/lifecycle-modules.e2e.spec.ts | 53 + src/api/API.ts | 9 +- src/assets/images/Re_Logo.png | Bin 0 -> 30239 bytes src/assets/images/royal_enfield_logo.png | Bin 0 -> 133031 bytes .../auth/__tests__/LoginPage.test.tsx | 172 + .../auth/components}/RoleGuard.tsx | 2 +- .../auth/pages}/LoginPage.tsx | 12 +- .../auth/pages}/ProspectiveLoginPage.tsx | 10 +- .../ConstitutionalChangeDetails.test.tsx | 156 + .../ConstitutionalChangePage.test.tsx | 141 + .../DealerConstitutionalChangePage.test.tsx | 108 + .../pages}/ConstitutionalChangeDetails.tsx | 253 +- .../pages}/ConstitutionalChangePage.tsx | 29 +- .../pages}/DealerConstitutionalChangePage.tsx | 26 +- .../dashboard/pages}/Dashboard.tsx | 8 +- .../dashboard/pages}/DealerDashboard.tsx | 10 +- .../dashboard/pages}/FDDDashboardPage.tsx | 6 +- .../dashboard/pages}/FinanceDashboard.tsx | 62 +- .../pages}/ProspectiveDashboardPage.tsx | 12 +- .../__tests__/FinanceFnFDetailsPage.test.tsx | 73 + .../fnf/__tests__/FinanceFnFPage.test.tsx | 79 + .../FinancePaymentDetailsPage.test.tsx | 86 + .../fnf/__tests__/FnFDetails.test.tsx | 79 + src/features/fnf/__tests__/FnFPage.test.tsx | 89 + .../fnf/pages}/FinanceFnFDetailsPage.tsx | 264 +- .../fnf/pages}/FinanceFnFPage.tsx | 25 +- .../fnf/pages}/FinancePaymentDetailsPage.tsx | 19 +- .../fnf/pages}/FnFDetails.tsx | 121 +- .../fnf/pages}/FnFPage.tsx | 16 +- .../master/components}/ASMDialog.tsx | 14 +- .../master/components}/ASMManagement.tsx | 10 +- .../master/components}/AddRoleDialog.tsx | 10 +- .../master/components}/DDLeadDialog.tsx | 12 +- .../master/components}/DDLeadManagement.tsx | 11 +- .../components}/DocumentConfigManagement.tsx | 21 +- .../components/EmailTemplateBodyEditor.tsx | 144 + .../master/components}/EmailTemplates.tsx | 35 +- .../master/components}/LocationDialog.tsx | 11 +- .../master/components}/LocationManagement.tsx | 13 +- .../master/components}/RegionDialog.tsx | 19 +- .../master/components}/RegionalManagement.tsx | 11 +- .../master/components}/RoleDialog.tsx | 8 +- .../master/components}/RolePermissions.tsx | 9 +- .../master/components}/SLAConfiguration.tsx | 9 +- .../components}/SecurityDepositMaster.tsx | 12 +- .../master/components}/TemplateDialog.tsx | 209 +- .../components}/UserManagementTable.tsx | 7 +- .../master/components}/ZMDialog.tsx | 13 +- .../master/components}/ZMManagement.tsx | 10 +- .../master/components}/ZoneDetails.tsx | 13 +- .../master/components}/ZoneDialog.tsx | 12 +- .../master/components}/ZonesOverview.tsx | 6 +- .../master/constants/emailTemplateTriggers.ts | 37 + .../master/pages}/MasterPage.tsx | 111 +- .../master/utils/emailTemplateLayoutShell.ts | 57 + .../__tests__/AllApplicationsPage.test.tsx | 69 + .../ApplicationReviewWorkflow.test.tsx | 91 + .../__tests__/ApplicationsPage.test.tsx | 165 + .../__tests__/DeepOnboardingStages.test.tsx | 108 + .../__tests__/FddAgencyFlow.test.tsx | 101 + .../__tests__/NonOpportunitiesPage.test.tsx | 85 + .../OpportunityRequestsFlow.test.tsx | 158 + ...eBasedPermissionsAndProgressTrack.test.tsx | 347 + .../__tests__/e2e/fixtures/api-stubs.ts | 125 + .../__tests__/e2e/fixtures/login.ts | 13 + ...onboarding-dealership-requests.e2e.spec.ts | 36 + .../e2e/opportunity-requests.e2e.spec.ts | 31 + .../onboarding/__tests__/shared/constants.ts | 1 + .../onboarding/__tests__/shared/mocks.ts | 67 + .../onboarding/__tests__/test-utils.tsx | 70 + .../components}/ApplicationCard.tsx | 46 +- .../components}/BankDetailsModal.tsx | 22 +- .../components}/QuestionnaireResponseView.tsx | 35 +- .../ApplicantInformationCard.tsx | 88 +- .../ApplicationDetailsActionModals.tsx | 107 +- .../ApplicationDetailsExtendedModals.tsx | 346 +- .../ApplicationDetailsFddAuditContent.tsx | 54 +- .../ApplicationDetailsHeader.tsx | 19 +- .../ApplicationDetailsSidebar.tsx | 104 +- .../ApplicationDetailsTabs.tsx | 240 +- .../applicationDetails.shared.ts | 0 .../useApplicationDetailsAdminActions.ts | 3 +- .../hooks}/useApplicationDetailsData.ts | 10 +- .../useApplicationDetailsFeedbackActions.ts | 5 +- .../useApplicationDetailsLocalActions.ts | 3 +- .../useApplicationDetailsPermissions.ts | 0 .../hooks}/useApplicationDetailsStageData.ts | 2 +- .../hooks}/useApplicationDetailsUIState.ts | 0 .../onboarding/pages}/AllApplicationsPage.tsx | 91 +- .../onboarding/pages}/ApplicationDetails.tsx | 34 +- .../onboarding/pages}/ApplicationsPage.tsx | 91 +- .../pages}/FDDApplicationDetails.tsx | 116 +- .../pages}/FinanceFddDetailPage.tsx | 145 +- .../pages}/FinanceOnboardingPage.tsx | 45 +- .../pages}/NonOpportunitiesPage.tsx | 78 +- .../pages}/OpportunityRequestsPage.tsx | 125 +- .../pages}/ProspectiveApplicationDetails.tsx | 69 +- .../onboarding/pages}/WorkNotesPage.tsx | 98 +- .../__tests__/DealerRelocationPage.test.tsx | 163 + .../RelocationRequestDetails.test.tsx | 91 + .../__tests__/RelocationRequestPage.test.tsx | 93 + .../pages}/DealerRelocationPage.tsx | 26 +- .../pages}/RelocationRequestDetails.tsx | 291 +- .../pages}/RelocationRequestPage.tsx | 16 +- .../DealerResignationDetailsPage.test.tsx | 70 + .../__tests__/DealerResignationPage.test.tsx | 144 + .../__tests__/ResignationPage.test.tsx | 93 + .../pages}/DealerResignationDetailsPage.tsx | 20 +- .../pages}/DealerResignationPage.tsx | 26 +- .../resignation/pages}/ResignationDetails.tsx | 159 +- .../resignation/pages}/ResignationPage.tsx | 14 +- .../__tests__/TerminationDetails.test.tsx | 102 + .../__tests__/TerminationPage.test.tsx | 99 + .../termination/pages}/TerminationDetails.tsx | 137 +- .../termination/pages}/TerminationPage.tsx | 48 +- src/lib/mock-data.ts | 6 +- src/lib/offboarding-actions.ts | 27 + src/main.tsx | 6 +- src/services/dealer.service.ts | 2 +- src/services/eor.service.ts | 2 +- src/services/master.service.ts | 2 +- src/services/notification.service.ts | 2 +- src/services/onboarding.service.ts | 2 +- src/services/resignation.service.ts | 2 +- src/services/settlement.service.ts | 2 +- src/services/termination.service.ts | 5 +- src/services/worknote.service.ts | 2 +- src/setupTests.ts | 147 + src/testing/constants.ts | 38 + src/testing/mocks.ts | 58 + src/testing/reactRouterTest.ts | 5 + test-results/.last-run.json | 4 + 140 files changed, 13553 insertions(+), 1808 deletions(-) create mode 100644 babel.config.cjs create mode 100644 jest.config.cjs create mode 100644 playwright.config.ts create mode 100644 src/__tests__/e2e/fixtures/lifecycle-api-stubs.ts create mode 100644 src/__tests__/e2e/fixtures/login.ts create mode 100644 src/__tests__/e2e/lifecycle-modules.e2e.spec.ts create mode 100644 src/assets/images/Re_Logo.png create mode 100644 src/assets/images/royal_enfield_logo.png create mode 100644 src/features/auth/__tests__/LoginPage.test.tsx rename src/{components/auth => features/auth/components}/RoleGuard.tsx (97%) rename src/{components/auth => features/auth/pages}/LoginPage.tsx (98%) rename src/{components/auth => features/auth/pages}/ProspectiveLoginPage.tsx (97%) create mode 100644 src/features/constitutional/__tests__/ConstitutionalChangeDetails.test.tsx create mode 100644 src/features/constitutional/__tests__/ConstitutionalChangePage.test.tsx create mode 100644 src/features/constitutional/__tests__/DealerConstitutionalChangePage.test.tsx rename src/{components/applications => features/constitutional/pages}/ConstitutionalChangeDetails.tsx (87%) rename src/{components/applications => features/constitutional/pages}/ConstitutionalChangePage.tsx (98%) rename src/{components/dealer => features/constitutional/pages}/DealerConstitutionalChangePage.tsx (96%) rename src/{components/dashboard => features/dashboard/pages}/Dashboard.tsx (97%) rename src/{components/dashboard => features/dashboard/pages}/DealerDashboard.tsx (97%) rename src/{components/dashboard => features/dashboard/pages}/FDDDashboardPage.tsx (98%) rename src/{components/dashboard => features/dashboard/pages}/FinanceDashboard.tsx (95%) rename src/{components/dashboard => features/dashboard/pages}/ProspectiveDashboardPage.tsx (97%) create mode 100644 src/features/fnf/__tests__/FinanceFnFDetailsPage.test.tsx create mode 100644 src/features/fnf/__tests__/FinanceFnFPage.test.tsx create mode 100644 src/features/fnf/__tests__/FinancePaymentDetailsPage.test.tsx create mode 100644 src/features/fnf/__tests__/FnFDetails.test.tsx create mode 100644 src/features/fnf/__tests__/FnFPage.test.tsx rename src/{components/applications => features/fnf/pages}/FinanceFnFDetailsPage.tsx (91%) rename src/{components/applications => features/fnf/pages}/FinanceFnFPage.tsx (98%) rename src/{components/applications => features/fnf/pages}/FinancePaymentDetailsPage.tsx (97%) rename src/{components/applications => features/fnf/pages}/FnFDetails.tsx (94%) rename src/{components/applications => features/fnf/pages}/FnFPage.tsx (98%) rename src/{components/applications/MasterPage => features/master/components}/ASMDialog.tsx (97%) rename src/{components/applications/MasterPage => features/master/components}/ASMManagement.tsx (96%) rename src/{components/applications/MasterPage => features/master/components}/AddRoleDialog.tsx (92%) rename src/{components/applications/MasterPage => features/master/components}/DDLeadDialog.tsx (95%) rename src/{components/applications/MasterPage => features/master/components}/DDLeadManagement.tsx (95%) rename src/{components/applications/MasterPage => features/master/components}/DocumentConfigManagement.tsx (98%) create mode 100644 src/features/master/components/EmailTemplateBodyEditor.tsx rename src/{components/applications/MasterPage => features/master/components}/EmailTemplates.tsx (78%) rename src/{components/applications/MasterPage => features/master/components}/LocationDialog.tsx (96%) rename src/{components/applications/MasterPage => features/master/components}/LocationManagement.tsx (97%) rename src/{components/applications/MasterPage => features/master/components}/RegionDialog.tsx (97%) rename src/{components/applications/MasterPage => features/master/components}/RegionalManagement.tsx (96%) rename src/{components/applications/MasterPage => features/master/components}/RoleDialog.tsx (97%) rename src/{components/applications/MasterPage => features/master/components}/RolePermissions.tsx (95%) rename src/{components/applications/MasterPage => features/master/components}/SLAConfiguration.tsx (96%) rename src/{components/applications/MasterPage => features/master/components}/SecurityDepositMaster.tsx (96%) rename src/{components/applications/MasterPage => features/master/components}/TemplateDialog.tsx (57%) rename src/{components/applications/MasterPage => features/master/components}/UserManagementTable.tsx (94%) rename src/{components/applications/MasterPage => features/master/components}/ZMDialog.tsx (95%) rename src/{components/applications/MasterPage => features/master/components}/ZMManagement.tsx (95%) rename src/{components/applications/MasterPage => features/master/components}/ZoneDetails.tsx (96%) rename src/{components/applications/MasterPage => features/master/components}/ZoneDialog.tsx (94%) rename src/{components/applications/MasterPage => features/master/components}/ZonesOverview.tsx (94%) create mode 100644 src/features/master/constants/emailTemplateTriggers.ts rename src/{components/applications => features/master/pages}/MasterPage.tsx (89%) create mode 100644 src/features/master/utils/emailTemplateLayoutShell.ts create mode 100644 src/features/onboarding/__tests__/AllApplicationsPage.test.tsx create mode 100644 src/features/onboarding/__tests__/ApplicationReviewWorkflow.test.tsx create mode 100644 src/features/onboarding/__tests__/ApplicationsPage.test.tsx create mode 100644 src/features/onboarding/__tests__/DeepOnboardingStages.test.tsx create mode 100644 src/features/onboarding/__tests__/FddAgencyFlow.test.tsx create mode 100644 src/features/onboarding/__tests__/NonOpportunitiesPage.test.tsx create mode 100644 src/features/onboarding/__tests__/OpportunityRequestsFlow.test.tsx create mode 100644 src/features/onboarding/__tests__/RoleBasedPermissionsAndProgressTrack.test.tsx create mode 100644 src/features/onboarding/__tests__/e2e/fixtures/api-stubs.ts create mode 100644 src/features/onboarding/__tests__/e2e/fixtures/login.ts create mode 100644 src/features/onboarding/__tests__/e2e/onboarding-dealership-requests.e2e.spec.ts create mode 100644 src/features/onboarding/__tests__/e2e/opportunity-requests.e2e.spec.ts create mode 100644 src/features/onboarding/__tests__/shared/constants.ts create mode 100644 src/features/onboarding/__tests__/shared/mocks.ts create mode 100644 src/features/onboarding/__tests__/test-utils.tsx rename src/{components/applications => features/onboarding/components}/ApplicationCard.tsx (67%) rename src/{components/applications => features/onboarding/components}/BankDetailsModal.tsx (84%) rename src/{components/applications => features/onboarding/components}/QuestionnaireResponseView.tsx (74%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicantInformationCard.tsx (72%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicationDetailsActionModals.tsx (76%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicationDetailsExtendedModals.tsx (56%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicationDetailsFddAuditContent.tsx (84%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicationDetailsHeader.tsx (75%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicationDetailsSidebar.tsx (78%) rename src/{components/applications => features/onboarding/components}/application-details/ApplicationDetailsTabs.tsx (83%) rename src/{components/applications => features/onboarding/components}/application-details/applicationDetails.shared.ts (100%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsAdminActions.ts (99%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsData.ts (95%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsFeedbackActions.ts (97%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsLocalActions.ts (97%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsPermissions.ts (100%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsStageData.ts (99%) rename src/{components/applications/application-details => features/onboarding/hooks}/useApplicationDetailsUIState.ts (100%) rename src/{components/applications => features/onboarding/pages}/AllApplicationsPage.tsx (81%) rename src/{components/applications => features/onboarding/pages}/ApplicationDetails.tsx (92%) rename src/{components/applications => features/onboarding/pages}/ApplicationsPage.tsx (81%) rename src/{components/applications => features/onboarding/pages}/FDDApplicationDetails.tsx (88%) rename src/{components/applications => features/onboarding/pages}/FinanceFddDetailPage.tsx (83%) rename src/{components/applications => features/onboarding/pages}/FinanceOnboardingPage.tsx (83%) rename src/{components/applications => features/onboarding/pages}/NonOpportunitiesPage.tsx (76%) rename src/{components/applications => features/onboarding/pages}/OpportunityRequestsPage.tsx (80%) rename src/{components/applications => features/onboarding/pages}/ProspectiveApplicationDetails.tsx (90%) rename src/{components/applications => features/onboarding/pages}/WorkNotesPage.tsx (91%) create mode 100644 src/features/relocation/__tests__/DealerRelocationPage.test.tsx create mode 100644 src/features/relocation/__tests__/RelocationRequestDetails.test.tsx create mode 100644 src/features/relocation/__tests__/RelocationRequestPage.test.tsx rename src/{components/dealer => features/relocation/pages}/DealerRelocationPage.tsx (96%) rename src/{components/applications => features/relocation/pages}/RelocationRequestDetails.tsx (86%) rename src/{components/applications => features/relocation/pages}/RelocationRequestPage.tsx (98%) create mode 100644 src/features/resignation/__tests__/DealerResignationDetailsPage.test.tsx create mode 100644 src/features/resignation/__tests__/DealerResignationPage.test.tsx create mode 100644 src/features/resignation/__tests__/ResignationPage.test.tsx rename src/{components/dealer => features/resignation/pages}/DealerResignationDetailsPage.tsx (96%) rename src/{components/dealer => features/resignation/pages}/DealerResignationPage.tsx (96%) rename src/{components/applications => features/resignation/pages}/ResignationDetails.tsx (87%) rename src/{components/applications => features/resignation/pages}/ResignationPage.tsx (97%) create mode 100644 src/features/termination/__tests__/TerminationDetails.test.tsx create mode 100644 src/features/termination/__tests__/TerminationPage.test.tsx rename src/{components/applications => features/termination/pages}/TerminationDetails.tsx (90%) rename src/{components/applications => features/termination/pages}/TerminationPage.tsx (94%) create mode 100644 src/lib/offboarding-actions.ts create mode 100644 src/setupTests.ts create mode 100644 src/testing/constants.ts create mode 100644 src/testing/mocks.ts create mode 100644 src/testing/reactRouterTest.ts create mode 100644 test-results/.last-run.json diff --git a/babel.config.cjs b/babel.config.cjs new file mode 100644 index 0000000..1a04d3f --- /dev/null +++ b/babel.config.cjs @@ -0,0 +1,22 @@ +module.exports = { + presets: [ + ["@babel/preset-env", { targets: { node: "current" } }], + ["@babel/preset-react", { runtime: "automatic" }], + "@babel/preset-typescript", + ], + plugins: [ + function () { + return { + visitor: { + MetaProperty(path) { + if (path.node.meta.name === "import" && path.node.property.name === "meta") { + path.replaceWithSourceString( + "(typeof global.importMeta !== 'undefined' ? global.importMeta : { env: {} })" + ); + } + }, + }, + }; + }, + ], +} diff --git a/jest.config.cjs b/jest.config.cjs new file mode 100644 index 0000000..00cf6f3 --- /dev/null +++ b/jest.config.cjs @@ -0,0 +1,29 @@ +/** @type {import("jest").Config} */ +module.exports = { + testEnvironment: "jsdom", + roots: ["/src"], + testPathIgnorePatterns: [ + "/node_modules/", + "/src/features/onboarding/__tests__/e2e/", + "/src/__tests__/e2e/", + ], + testMatch: [ + "**/__tests__/**/*.(test|spec).[jt]s?(x)", + "**/*.(test|spec).[jt]s?(x)", + ], + transform: { + "^.+\\.(ts|tsx)$": "babel-jest", + }, + moduleNameMapper: { + "^@/(.*)$": "/src/$1", + "\\.(css|less|scss|sass)$": "identity-obj-proxy", + }, + setupFilesAfterEnv: ["/src/setupTests.ts"], + collectCoverageFrom: [ + "src/**/*.{ts,tsx}", + "!src/**/*.d.ts", + "!src/main.tsx", + "!src/setupTests.ts", + "!src/**/__tests__/**", + ], +} diff --git a/package-lock.json b/package-lock.json index 6f4e890..22e574c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,10 +46,12 @@ "input-otp": "^1.2.0", "lucide-react": "^0.344.0", "next-themes": "^0.2.1", + "quill": "^2.0.3", "react": "^18.2.0", "react-day-picker": "^8.10.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.0", + "react-quill": "^2.0.0", "react-redux": "^9.2.0", "react-resizable-panels": "^2.0.12", "react-router-dom": "^6.22.3", @@ -62,16 +64,29 @@ "zod": "^3.22.4" }, "devDependencies": { + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.2", + "@babel/preset-react": "^7.28.5", + "@babel/preset-typescript": "^7.28.5", + "@playwright/test": "^1.59.1", "@tailwindcss/postcss": "^4.1.18", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/jest": "^30.0.0", "@types/node": "^20.11.24", "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.23", + "babel-jest": "^30.3.0", "eslint": "^9.39.2", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.26", "globals": "^17.0.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^30.3.0", + "jest-environment-jsdom": "^30.3.0", "postcss": "^8.5.6", "tailwindcss": "^4.1.18", "typescript": "^5.2.2", @@ -79,6 +94,13 @@ "vite": "^6.0.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -92,6 +114,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -165,6 +208,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", @@ -182,6 +238,63 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -192,6 +305,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", @@ -224,6 +351,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", @@ -234,6 +374,56 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-remap-async-to-generator": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -264,6 +454,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helpers": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", @@ -294,6 +499,1086 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", + "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", + "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", + "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.28.6.tgz", + "integrity": "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-jsx": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", @@ -326,6 +1611,381 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", + "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", + "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@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.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.29.0", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@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.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.29.0", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.29.0", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@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.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.15", + "babel-plugin-polyfill-corejs3": "^0.14.0", + "babel-plugin-polyfill-regenerator": "^0.6.6", + "core-js-compat": "^3.48.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", @@ -383,6 +2043,140 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", @@ -393,6 +2187,17 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", @@ -1573,6 +3378,588 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", + "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", + "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/jest-config": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.3.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "parse-json": "^5.2.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", + "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment-jsdom-abstract": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.3.0.tgz", + "integrity": "sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/jsdom": "^21.1.7", + "@types/node": "*", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/@jest/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.3.0", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", + "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", + "@types/node": "*", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", + "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", + "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", + "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", + "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", + "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", + "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1623,6 +4010,19 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@next/env": { "version": "16.2.1", "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.1.tgz", @@ -1766,6 +4166,46 @@ "node": ">= 10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@playwright/test": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -3767,6 +6207,33 @@ "win32" ] }, + "node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -4066,6 +6533,115 @@ "tailwindcss": "4.2.2" } }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "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.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.2.tgz", + "integrity": "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@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/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -4181,6 +6757,84 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -4205,6 +6859,21 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "license": "MIT", + "dependencies": { + "parchment": "^1.1.2" + } + }, + "node_modules/@types/quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "license": "BSD-3-Clause" + }, "node_modules/@types/react": { "version": "18.3.28", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", @@ -4226,12 +6895,43 @@ "@types/react": "^18.0.0" } }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.57.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz", @@ -4527,6 +7227,282 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -4571,6 +7547,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", @@ -4588,6 +7574,32 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4604,6 +7616,33 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/apisauce": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/apisauce/-/apisauce-3.2.2.tgz", @@ -4632,6 +7671,16 @@ "node": ">=10" } }, + "node_modules/aria-query": { + "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", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -4686,6 +7735,147 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", + "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.3.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", + "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.8" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", + "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4750,6 +7940,41 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -4763,6 +7988,22 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4773,6 +8014,16 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001781", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz", @@ -4810,6 +8061,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -4829,6 +8113,83 @@ "license": "MIT", "peer": true }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -4854,6 +8215,24 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4900,6 +8279,20 @@ "dev": true, "license": "MIT" }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4915,6 +8308,27 @@ "node": ">= 8" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -5042,6 +8456,20 @@ "node": ">=12" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/date-fns": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", @@ -5069,12 +8497,54 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5082,6 +8552,50 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5091,6 +8605,16 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -5101,12 +8625,30 @@ "node": ">=8" } }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -5131,6 +8673,13 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.321", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", @@ -5166,6 +8715,26 @@ "embla-carousel": "8.6.0" } }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, "node_modules/engine.io-client": { "version": "6.6.4", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.4.tgz", @@ -5202,6 +8771,29 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -5450,6 +9042,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -5502,6 +9108,71 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5509,6 +9180,12 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "license": "Apache-2.0" + }, "node_modules/fast-equals": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", @@ -5532,6 +9209,16 @@ "dev": true, "license": "MIT" }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -5621,6 +9308,23 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", @@ -5678,6 +9382,13 @@ } } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5702,6 +9413,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5712,6 +9432,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -5745,6 +9475,16 @@ "node": ">=6" } }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -5758,6 +9498,41 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -5771,6 +9546,32 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", @@ -5803,6 +9604,13 @@ "dev": true, "license": "ISC" }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true, + "license": "(Apache-2.0 OR MPL-1.1)" + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5813,6 +9621,18 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -5869,6 +9689,90 @@ "hermes-estree": "0.25.1" } }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5906,6 +9810,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5916,6 +9840,35 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/input-otp": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.4.2.tgz", @@ -5935,6 +9888,61 @@ "node": ">=12" } }, + "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==", + "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-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "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-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5945,6 +9953,26 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5958,6 +9986,44 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5965,6 +10031,973 @@ "dev": true, "license": "ISC" }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", + "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", + "import-local": "^3.2.0", + "jest-cli": "30.3.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", + "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.3.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", + "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "p-limit": "^3.1.0", + "pretty-format": "30.3.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", + "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/jest-config": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.3.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "parse-json": "^5.2.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.3.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", + "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "jest-util": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.3.0.tgz", + "integrity": "sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/environment-jsdom-abstract": "30.3.0", + "jsdom": "^26.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", + "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", + "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "picomatch": "^4.0.3", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", + "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.3.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", + "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", + "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", + "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", + "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", + "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", + "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", + "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.3.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -5994,6 +11027,46 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -6014,6 +11087,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -6051,6 +11131,16 @@ "json-buffer": "3.0.1" } }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -6326,6 +11416,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6348,6 +11445,32 @@ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6386,6 +11509,17 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -6396,6 +11530,45 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6405,6 +11578,13 @@ "node": ">= 0.4" } }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6426,6 +11606,26 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -6439,6 +11639,16 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/motion-dom": { "version": "11.18.1", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", @@ -6478,6 +11688,22 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6579,6 +11805,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.36", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", @@ -6586,6 +11819,36 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz", + "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -6595,6 +11858,57 @@ "node": ">=0.10.0" } }, + "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==", + "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", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6645,6 +11959,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parchment": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", + "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", + "license": "BSD-3-Clause" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6658,6 +11995,38 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6668,6 +12037,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6678,6 +12057,37 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6697,6 +12107,132 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/playwright": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.59.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", @@ -6743,6 +12279,44 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6776,6 +12350,58 @@ "node": ">=6" } }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/quill": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz", + "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", + "license": "BSD-3-Clause", + "dependencies": { + "eventemitter3": "^5.0.1", + "lodash-es": "^4.17.21", + "parchment": "^3.0.0", + "quill-delta": "^5.1.0" + }, + "engines": { + "npm": ">=8.2.3" + } + }, + "node_modules/quill-delta": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", + "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", + "license": "MIT", + "dependencies": { + "fast-diff": "^1.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.isequal": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/quill/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -6837,6 +12463,67 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, + "node_modules/react-quill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", + "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", + "license": "MIT", + "dependencies": { + "@types/quill": "^1.3.10", + "lodash": "^4.17.4", + "quill": "^1.3.7" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/react-quill/node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==", + "license": "MIT" + }, + "node_modules/react-quill/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "license": "Apache-2.0" + }, + "node_modules/react-quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==", + "license": "BSD-3-Clause" + }, + "node_modules/react-quill/node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "license": "BSD-3-Clause", + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/react-quill/node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "license": "MIT", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/react-redux": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", @@ -7044,6 +12731,20 @@ "decimal.js-light": "^2.4.1" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -7059,12 +12760,145 @@ "redux": "^5.0.0" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz", + "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/reselect": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7120,6 +12954,33 @@ "fsevents": "~2.3.2" } }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -7139,6 +13000,38 @@ "semver": "bin/semver.js" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", @@ -7222,6 +13115,29 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/socket.io-client": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", @@ -7260,6 +13176,16 @@ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -7269,6 +13195,204 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7319,6 +13443,42 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tailwind-merge": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", @@ -7358,6 +13518,43 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", @@ -7381,6 +13578,59 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -7413,6 +13663,29 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -7458,6 +13731,85 @@ "dev": true, "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -7551,6 +13903,21 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/vaul": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz", @@ -7661,6 +14028,77 @@ } } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7687,6 +14125,112 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/ws": { "version": "8.18.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", @@ -7708,6 +14252,23 @@ } } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xmlhttprequest-ssl": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", @@ -7716,6 +14277,16 @@ "node": ">=0.4.0" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -7723,6 +14294,70 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index f5c176f..fc4eaba 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,13 @@ "dev": "vite", "build": "tsc && vite build", "lint": "eslint . --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "preview": "vite preview", + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage", + "test:e2e": "playwright test", + "test:e2e:ui": "playwright test --ui", + "test:e2e:headed": "playwright test --headed" }, "dependencies": { "@radix-ui/react-accordion": "^1.1.2", @@ -48,10 +54,12 @@ "input-otp": "^1.2.0", "lucide-react": "^0.344.0", "next-themes": "^0.2.1", + "quill": "^2.0.3", "react": "^18.2.0", "react-day-picker": "^8.10.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.0", + "react-quill": "^2.0.0", "react-redux": "^9.2.0", "react-resizable-panels": "^2.0.12", "react-router-dom": "^6.22.3", @@ -64,16 +72,29 @@ "zod": "^3.22.4" }, "devDependencies": { + "@babel/core": "^7.29.0", + "@babel/preset-env": "^7.29.2", + "@babel/preset-react": "^7.28.5", + "@babel/preset-typescript": "^7.28.5", + "@playwright/test": "^1.59.1", "@tailwindcss/postcss": "^4.1.18", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", + "@types/jest": "^30.0.0", "@types/node": "^20.11.24", "@types/react": "^18.2.61", "@types/react-dom": "^18.2.19", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.23", + "babel-jest": "^30.3.0", "eslint": "^9.39.2", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.26", "globals": "^17.0.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^30.3.0", + "jest-environment-jsdom": "^30.3.0", "postcss": "^8.5.6", "tailwindcss": "^4.1.18", "typescript": "^5.2.2", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..4414a84 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,34 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Playwright discovers specs in any `__tests__/e2e/` folder under `src/` (onboarding, lifecycle, etc.). + * + * Starts Vite automatically unless CI sets PLAYWRIGHT_SKIP_WEB_SERVER=1 + * (useful when the dev server is already running). + */ +export default defineConfig({ + testDir: "./src", + testMatch: "**/__tests__/e2e/**/*.e2e.spec.ts", + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: process.env.CI ? "github" : "list", + timeout: 60_000, + expect: { timeout: 15_000 }, + use: { + baseURL: process.env.PLAYWRIGHT_BASE_URL ?? "http://127.0.0.1:5173", + trace: "on-first-retry", + screenshot: "only-on-failure", + video: "retain-on-failure", + }, + projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }], + webServer: process.env.PLAYWRIGHT_SKIP_WEB_SERVER + ? undefined + : { + command: "npm run dev -- --host 127.0.0.1 --port 5173", + url: "http://127.0.0.1:5173", + reuseExistingServer: !process.env.CI, + timeout: 120_000, + }, +}); diff --git a/src/App.tsx b/src/App.tsx index b18e72e..40c4ab6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,56 +1,56 @@ import { useState, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { RootState } from './store'; -import { setCredentials, logout as logoutAction, initializeAuth } from './store/slices/authSlice'; -import { RoleGuard } from './components/auth/RoleGuard'; +import { RootState } from '@/store'; +import { setCredentials, logout as logoutAction, initializeAuth } from '@/store/slices/authSlice'; +import { RoleGuard } from '@/features/auth/components/RoleGuard'; import { Routes, Route, Navigate, useLocation, useNavigate, Outlet } from 'react-router-dom'; -import { ApplicationFormPage } from './components/public/ApplicationFormPage'; -import PublicQuestionnairePage from './pages/public/PublicQuestionnairePage'; -import { LoginPage } from './components/auth/LoginPage'; -import { ProspectiveLoginPage } from './components/auth/ProspectiveLoginPage'; -import { Sidebar } from './components/layout/Sidebar'; -import { Header } from './components/layout/Header'; -import { Dashboard } from './components/dashboard/Dashboard'; -import { FinanceDashboard } from './components/dashboard/FinanceDashboard'; -import { DealerDashboard } from './components/dashboard/DealerDashboard'; -import { ProspectiveDashboardPage } from './components/dashboard/ProspectiveDashboardPage'; -import { FDDDashboardPage } from './components/dashboard/FDDDashboardPage'; -import { FDDApplicationDetails } from './components/applications/FDDApplicationDetails'; -import { ApplicationsPage } from './components/applications/ApplicationsPage'; -import { AllApplicationsPage } from './components/applications/AllApplicationsPage'; -import { OpportunityRequestsPage } from './components/applications/OpportunityRequestsPage'; -import { NonOpportunitiesPage } from './components/applications/NonOpportunitiesPage'; -import { ApplicationDetails } from './components/applications/ApplicationDetails'; -import { ResignationPage } from './components/applications/ResignationPage'; -import { TerminationPage } from './components/applications/TerminationPage'; -import { FnFPage } from './components/applications/FnFPage'; -import { ResignationDetails } from './components/applications/ResignationDetails'; -import { TerminationDetails } from './components/applications/TerminationDetails'; -import { FnFDetails } from './components/applications/FnFDetails'; -import { FinanceOnboardingPage } from './components/applications/FinanceOnboardingPage'; -import { FinanceFnFPage } from './components/applications/FinanceFnFPage'; -import { FinancePaymentDetailsPage } from './components/applications/FinancePaymentDetailsPage'; +import { ApplicationFormPage } from '@/components/public/ApplicationFormPage'; +import PublicQuestionnairePage from '@/pages/public/PublicQuestionnairePage'; +import { LoginPage } from '@/features/auth/pages/LoginPage'; +import { ProspectiveLoginPage } from '@/features/auth/pages/ProspectiveLoginPage'; +import { Sidebar } from '@/components/layout/Sidebar'; +import { Header } from '@/components/layout/Header'; +import { Dashboard } from '@/features/dashboard/pages/Dashboard'; +import { FinanceDashboard } from '@/features/dashboard/pages/FinanceDashboard'; +import { DealerDashboard } from '@/features/dashboard/pages/DealerDashboard'; +import { ProspectiveDashboardPage } from '@/features/dashboard/pages/ProspectiveDashboardPage'; +import { FDDDashboardPage } from '@/features/dashboard/pages/FDDDashboardPage'; +import { FDDApplicationDetails } from '@/features/onboarding/pages/FDDApplicationDetails'; +import { ApplicationsPage } from '@/features/onboarding/pages/ApplicationsPage'; +import { AllApplicationsPage } from '@/features/onboarding/pages/AllApplicationsPage'; +import { OpportunityRequestsPage } from '@/features/onboarding/pages/OpportunityRequestsPage'; +import { NonOpportunitiesPage } from '@/features/onboarding/pages/NonOpportunitiesPage'; +import { ApplicationDetails } from '@/features/onboarding/pages/ApplicationDetails'; +import { ResignationPage } from '@/features/resignation/pages/ResignationPage'; +import { TerminationPage } from '@/features/termination/pages/TerminationPage'; +import { FnFPage } from '@/features/fnf/pages/FnFPage'; +import { ResignationDetails } from '@/features/resignation/pages/ResignationDetails'; +import { TerminationDetails } from '@/features/termination/pages/TerminationDetails'; +import { FnFDetails } from '@/features/fnf/pages/FnFDetails'; +import { FinanceOnboardingPage } from '@/features/onboarding/pages/FinanceOnboardingPage'; +import { FinanceFnFPage } from '@/features/fnf/pages/FinanceFnFPage'; +import { FinancePaymentDetailsPage } from '@/features/fnf/pages/FinancePaymentDetailsPage'; -import { FinanceFnFDetailsPage } from './components/applications/FinanceFnFDetailsPage'; -import { MasterPage } from './components/applications/MasterPage'; -import { UserManagementPage } from './components/admin/UserManagementPage'; -import { ApprovalPoliciesPage } from './components/admin/ApprovalPoliciesPage'; -import { ConstitutionalChangePage } from './components/applications/ConstitutionalChangePage'; -import { ConstitutionalChangeDetails } from './components/applications/ConstitutionalChangeDetails'; -import { RelocationRequestPage } from './components/applications/RelocationRequestPage'; -import { RelocationRequestDetails } from './components/applications/RelocationRequestDetails'; -import { DealerResignationPage } from './components/dealer/DealerResignationPage'; -import { DealerResignationDetailsPage } from './components/dealer/DealerResignationDetailsPage'; -import { DealerConstitutionalChangePage } from './components/dealer/DealerConstitutionalChangePage'; -import { DealerRelocationPage } from './components/dealer/DealerRelocationPage'; -import QuestionnaireBuilder from './components/admin/QuestionnaireBuilder'; -import QuestionnaireList from './components/admin/QuestionnaireList'; -import { WorkNotesPage } from './components/applications/WorkNotesPage'; -import { Toaster } from './components/ui/sonner'; -import { User } from './lib/mock-data'; +import { FinanceFnFDetailsPage } from '@/features/fnf/pages/FinanceFnFDetailsPage'; +import { MasterPage } from '@/features/master/pages/MasterPage'; +import { UserManagementPage } from '@/components/admin/UserManagementPage'; +import { ApprovalPoliciesPage } from '@/components/admin/ApprovalPoliciesPage'; +import { ConstitutionalChangePage } from '@/features/constitutional/pages/ConstitutionalChangePage'; +import { ConstitutionalChangeDetails } from '@/features/constitutional/pages/ConstitutionalChangeDetails'; +import { RelocationRequestPage } from '@/features/relocation/pages/RelocationRequestPage'; +import { RelocationRequestDetails } from '@/features/relocation/pages/RelocationRequestDetails'; +import { DealerResignationPage } from '@/features/resignation/pages/DealerResignationPage'; +import { DealerResignationDetailsPage } from '@/features/resignation/pages/DealerResignationDetailsPage'; +import { DealerConstitutionalChangePage } from '@/features/constitutional/pages/DealerConstitutionalChangePage'; +import { DealerRelocationPage } from '@/features/relocation/pages/DealerRelocationPage'; +import QuestionnaireBuilder from '@/components/admin/QuestionnaireBuilder'; +import QuestionnaireList from '@/components/admin/QuestionnaireList'; +import { WorkNotesPage } from '@/features/onboarding/pages/WorkNotesPage'; +import { Toaster } from '@/components/ui/sonner'; +import { User } from '@/lib/mock-data'; import { toast } from 'sonner'; -import { API } from './api/API'; -import { SocketProvider } from './context/SocketContext'; +import { API } from '@/api/API'; +import { SocketProvider } from '@/context/SocketContext'; // Layout Component const AppLayout = ({ onLogout, title }: { onLogout: () => void, title: string }) => { @@ -214,14 +214,14 @@ export default function App() { {/* Dashboards */} navigate(`/${path}`)} onViewPaymentDetails={(id) => navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id) => navigate(`/finance-audit/${id}`)} onViewFnFDetails={(id) => navigate(`/finance-fnf/${id}`)} /> : + navigate(`/${path}`)} onViewPaymentDetails={(id: string) => navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id: string) => navigate(`/finance-audit/${id}`)} onViewFnFDetails={(id: string) => navigate(`/finance-fnf/${id}`)} /> : hasRole(['Dealer']) ? - navigate(`/${path}`)} /> : - navigate(`/${path}`)} /> + navigate(`/${path}`)} /> : + navigate(`/${path}`)} /> } /> {/* Applications */} - navigate(`/applications/${id}`)} initialFilter="all" />} /> + navigate(`/applications/${id}`)} initialFilter="all" />} /> } /> {/* Centralized Work Notes Route */} @@ -231,8 +231,9 @@ export default function App() { /> } /> + {/* All Applications */} navigate(`/applications/${id}`)} initialFilter="all" /> : + hasRole(['DD']) ? navigate(`/applications/${id}`)} initialFilter="all" /> : } /> {/* FDD Routes - Integrated into Layout */} @@ -240,8 +241,8 @@ export default function App() { } /> {/* Admin/Lead Routes */} - navigate(`/applications/${id}`)} />} /> - navigate(`/applications/${id}`)} />} /> + navigate(`/applications/${id}`)} />} /> + navigate(`/applications/${id}`)} />} /> {/* Other Modules */} } /> @@ -259,7 +260,7 @@ export default function App() { {/* HR/Finance Modules (Simplified for brevity, following pattern) */} navigate(`/resignation/${id}`)} /> + ? navigate(`/resignation/${id}`)} /> : } /> navigate(`/termination/${id}`)} /> + ? navigate(`/termination/${id}`)} /> : } /> navigate(`/fnf/${id}`)} /> + ? navigate(`/fnf/${id}`)} /> : } /> navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id) => navigate(`/finance-audit/${id}`)} /> + ? navigate(`/finance-onboarding/${id}`)} onViewAuditDetails={(id: string) => navigate(`/finance-audit/${id}`)} /> : } /> navigate(`/finance-fnf/${id}`)} /> + ? navigate(`/finance-fnf/${id}`)} /> : } /> } /> - navigate(`/constitutional-change/${id}`)} />} /> + navigate(`/constitutional-change/${id}`)} />} /> navigate('/constitutional-change')} currentUser={currentUser} />} /> - navigate(`/relocation-requests/${id}`)} />} /> + navigate(`/relocation-requests/${id}`)} />} /> navigate('/relocation-requests')} currentUser={currentUser} />} /> {/* Dealer Routes */} - navigate(`/dealer-resignation/${id}`)} />} /> + navigate(`/dealer-resignation/${id}`)} />} /> navigate('/dealer-resignation')} /> : } /> - navigate(`/constitutional-change/${id}`)} />} /> - navigate(`/relocation-requests/${id}`)} />} /> + navigate(`/constitutional-change/${id}`)} />} /> + navigate(`/relocation-requests/${id}`)} />} /> {/* Placeholder Routes */} { + await page.route("**/api/auth/login", async (route) => { + if (route.request().method() !== "POST") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + token: "e2e-playwright-token", + user: { + id: E2E_DD_ADMIN.id, + fullName: E2E_DD_ADMIN.fullName, + email: E2E_DD_ADMIN.email, + role: E2E_DD_ADMIN.role, + }, + }), + }); + }); + + await page.route("**/api/auth/me", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + user: { + id: E2E_DD_ADMIN.id, + fullName: E2E_DD_ADMIN.fullName, + email: E2E_DD_ADMIN.email, + role: E2E_DD_ADMIN.role, + roleCode: E2E_DD_ADMIN.role, + }, + }), + }); + }); + + await page.route("**/api/communication/notifications**", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ success: true, data: [] }), + }); + }); + + await page.route("**/api/termination", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + terminations: [terminationListRow], + }), + }); + }); + + await page.route(`**/api/termination/${E2E_IDS.termination}**`, async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + termination: terminationDetail, + }), + }); + }); + + await page.route("**/api/resignation", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + resignations: { rows: [resignationListRow] }, + }), + }); + }); + + await page.route(`**/api/resignation/${E2E_IDS.resignation}**`, async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + resignation: resignationDetail, + }), + }); + }); + + await page.route("**/api/relocation", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + requests: [relocationListRow], + }), + }); + }); + + await page.route(`**/api/relocation/${E2E_IDS.relocation}**`, async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + request: relocationDetail, + }), + }); + }); + + await page.route("**/api/constitutional-change**", async (route) => { + const method = route.request().method(); + if (method !== "GET") { + await route.continue(); + return; + } + const path = new URL(route.request().url()).pathname.replace(/\/$/, ""); + const pub = `/api/constitutional-change/${E2E_IDS.constitutionalPublicId}`; + + if (path.endsWith("/constitutional-change/meta")) { + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + structureTargets: [ + { value: "Partnership", label: "Partnership" }, + { value: "LLP", label: "LLP" }, + ], + }), + }); + return; + } + + if (path === pub) { + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + request: constitutionalDetail, + }), + }); + return; + } + + if (path === "/api/constitutional-change") { + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + requests: [constitutionalListRow], + }), + }); + return; + } + + await route.continue(); + }); + + await page.route("**/api/dealer*", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + const path = new URL(route.request().url()).pathname; + if (!path.startsWith("/api/dealer") || path.includes("/bank-details")) { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + data: [ + { + id: "dealer-e2e-1", + legalName: "Stub Dealer Legal", + businessName: "Stub Dealer", + gstNumber: "27AAAAA0000A1Z5", + registeredAddress: "Test", + status: "active", + constitutionType: "Proprietorship", + dealerCode: { dealerCode: "STUB-01" }, + user: { + id: "user-dealer-e2e", + email: "dealer@e2e.test", + mobileNumber: "9000000000", + status: "active", + isActive: true, + }, + application: { preferredLocation: "Test", city: "Chennai", state: "TN" }, + }, + ], + }), + }); + }); + + await page.route("**/api/master/outlets**", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + success: true, + outlets: [{ id: "outlet-e2e-1", code: "OUT-1", name: "Outlet One", dealerId: "user-dealer-e2e" }], + }), + }); + }); + + await page.route("**/api/audit/logs**", async (route) => { + if (route.request().method() !== "GET") { + await route.continue(); + return; + } + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ success: true, data: [] }), + }); + }); +} diff --git a/src/__tests__/e2e/fixtures/login.ts b/src/__tests__/e2e/fixtures/login.ts new file mode 100644 index 0000000..dc2ce1f --- /dev/null +++ b/src/__tests__/e2e/fixtures/login.ts @@ -0,0 +1,9 @@ +import type { Page } from "@playwright/test"; +import { expect } from "@playwright/test"; +import { E2E_DD_ADMIN } from "./lifecycle-api-stubs"; + +export async function loginAsDdAdmin(page: Page): Promise { + await page.goto("/admin-login"); + await page.locator("div.cursor-pointer").filter({ hasText: E2E_DD_ADMIN.email }).click(); + await expect(page).toHaveURL(/\/dashboard$/); +} diff --git a/src/__tests__/e2e/lifecycle-modules.e2e.spec.ts b/src/__tests__/e2e/lifecycle-modules.e2e.spec.ts new file mode 100644 index 0000000..513cd80 --- /dev/null +++ b/src/__tests__/e2e/lifecycle-modules.e2e.spec.ts @@ -0,0 +1,53 @@ +import { test, expect } from "@playwright/test"; +import { installLifecycleModuleApiStubs, E2E_IDS } from "./fixtures/lifecycle-api-stubs"; +import { loginAsDdAdmin } from "./fixtures/login"; + +test.describe("Lifecycle modules (stubbed API)", () => { + test.beforeEach(async ({ page }) => { + await installLifecycleModuleApiStubs(page); + }); + + test("Termination — list and detail", async ({ page }) => { + await loginAsDdAdmin(page); + await page.goto("/termination"); + await expect(page.getByRole("heading", { name: "Termination Requests" })).toBeVisible(); + await expect(page.getByText("E2E Termination Dealer").first()).toBeVisible(); + + await page.getByRole("button", { name: "View Details" }).first().click(); + await expect(page).toHaveURL(new RegExp(`/termination/${E2E_IDS.termination}$`)); + await expect(page.getByText("E2E Termination Dealer").first()).toBeVisible(); + }); + + test("Resignation — list and detail", async ({ page }) => { + await loginAsDdAdmin(page); + await page.goto("/resignation"); + await expect(page.getByRole("heading", { name: "Resignation Requests" })).toBeVisible(); + await expect(page.getByText("RES-E2E-001").first()).toBeVisible(); + + await page.getByRole("button", { name: "View Details" }).first().click(); + await expect(page).toHaveURL(new RegExp(`/resignation/${E2E_IDS.resignation}$`)); + await expect(page.getByText("E2E Resignation Dealer")).toBeVisible(); + }); + + test("Relocation — list and detail", async ({ page }) => { + await loginAsDdAdmin(page); + await page.goto("/relocation-requests"); + await expect(page.getByRole("heading", { name: "Relocation Request Management" })).toBeVisible(); + await expect(page.getByText("REL-E2E-001")).toBeVisible(); + + await page.getByRole("button", { name: "View", exact: true }).first().click(); + await expect(page).toHaveURL(new RegExp(`/relocation-requests/${E2E_IDS.relocation}$`)); + await expect(page.getByText("E2E Relocation Dealer").first()).toBeVisible(); + }); + + test("Constitutional change — list and detail", async ({ page }) => { + await loginAsDdAdmin(page); + await page.goto("/constitutional-change"); + await expect(page.getByRole("heading", { name: "Constitutional Change Management" })).toBeVisible(); + await expect(page.getByText("CCR-E2E-001")).toBeVisible(); + + await page.getByRole("button", { name: "View", exact: true }).first().click(); + await expect(page).toHaveURL(new RegExp(`/constitutional-change/${E2E_IDS.constitutionalPublicId}$`)); + await expect(page.getByText("E2E Constitutional Dealer", { exact: true }).first()).toBeVisible(); + }); +}); diff --git a/src/api/API.ts b/src/api/API.ts index 9620e66..e3c99cc 100644 --- a/src/api/API.ts +++ b/src/api/API.ts @@ -1,5 +1,6 @@ import client from './client'; import axios from 'axios'; +import type { ConstitutionalChangeAction } from '@/lib/offboarding-actions'; export const API = { // Auth routes @@ -188,7 +189,13 @@ export const API = { getConstitutionalChangeMeta: () => client.get('/constitutional-change/meta'), getConstitutionalChangeById: (id: string) => client.get(`/constitutional-change/${id}`), createConstitutionalChange: (data: any) => client.post('/constitutional-change', data), - updateConstitutionalChange: (id: string, action: string, data?: any) => client.post(`/constitutional-change/${id}/action`, { action, ...data }), + /** + * POST `/constitutional-change/:id/action` + * Body: `{ action, comments? }` — `action` must be `approve` | `sendBack` | `reject` | `revoke` (see `OFFBOARDING_ACTIONS` in `@/lib/offboarding-actions`). + * Backend also accepts `remarks` as an alias for `comments`. + */ + updateConstitutionalChange: (id: string, action: ConstitutionalChangeAction, data?: { comments?: string; remarks?: string }) => + client.post(`/constitutional-change/${id}/action`, { action, ...data }), uploadConstitutionalDocuments: (id: string, documents: any[]) => client.post(`/constitutional-change/${id}/documents`, { documents }), // SLA diff --git a/src/assets/images/Re_Logo.png b/src/assets/images/Re_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6ceec941ba3712fd880c12775f1bb87bf662ae2a GIT binary patch literal 30239 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 DBEAfv literal 0 HcmV?d00001 diff --git a/src/features/auth/__tests__/LoginPage.test.tsx b/src/features/auth/__tests__/LoginPage.test.tsx new file mode 100644 index 0000000..3b2d7ed --- /dev/null +++ b/src/features/auth/__tests__/LoginPage.test.tsx @@ -0,0 +1,172 @@ +import { render, screen, waitFor, within } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { LoginPage } from "../pages/LoginPage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +describe("LoginPage", () => { + const adminEmail = "admin@royalenfield.com" + const adminPassword = "Admin@123" + + beforeEach(() => { + jest.clearAllMocks() + window.alert = jest.fn() + }) + + function setup(onLogin = jest.fn().mockResolvedValue(undefined)) { + render() + return { onLogin } + } + + it("renders branding and primary login controls", () => { + setup() + expect( + screen.getByRole("heading", { name: /royal enfield/i }), + ).toBeInTheDocument() + expect(screen.getByLabelText(/^email address$/i)).toBeInTheDocument() + expect(screen.getByLabelText(/^password$/i)).toBeInTheDocument() + expect(screen.getByRole("button", { name: /^login$/i })).toBeEnabled() + expect( + screen.getByRole("button", { name: /prospective user login/i }), + ).toBeInTheDocument() + expect(screen.getByText(/test user credentials/i)).toBeInTheDocument() + }) + + it("shows validation error when email or password is missing", async () => { + const user = userEvent.setup() + setup() + await user.click(screen.getByRole("button", { name: /^login$/i })) + expect( + await screen.findByText(/please enter both email and password/i), + ).toBeInTheDocument() + }) + + it("calls onLogin with entered credentials on success", async () => { + const user = userEvent.setup() + const onLogin = jest.fn().mockResolvedValue(undefined) + setup(onLogin) + + await user.type( + screen.getByLabelText(/^email address$/i), + adminEmail, + ) + await user.type( + screen.getByLabelText(/^password$/i), + adminPassword, + ) + await user.click(screen.getByRole("button", { name: /^login$/i })) + + await waitFor(() => { + expect(onLogin).toHaveBeenCalledWith(adminEmail, adminPassword) + }) + }) + + it("shows server error message when onLogin rejects", async () => { + const user = userEvent.setup() + const onLogin = jest + .fn() + .mockRejectedValue({ message: "Invalid credentials" }) + setup(onLogin) + + await user.type( + screen.getByLabelText(/^email address$/i), + adminEmail, + ) + await user.type(screen.getByLabelText(/^password$/i), "wrong-pass") + await user.click(screen.getByRole("button", { name: /^login$/i })) + + expect( + await screen.findByText(/invalid credentials/i), + ).toBeInTheDocument() + }) + + it("toggles forgot-password view and returns with Back to Login", async () => { + const user = userEvent.setup() + setup() + + await user.click( + screen.getByRole("button", { name: /forgot password/i }), + ) + expect( + screen.getByRole("heading", { name: /reset password/i }), + ).toBeInTheDocument() + expect( + screen.queryByRole("button", { name: /^login$/i }), + ).not.toBeInTheDocument() + + await user.click( + screen.getByRole("button", { name: /back to login/i }), + ) + expect( + screen.getByRole("button", { name: /^login$/i }), + ).toBeInTheDocument() + expect( + screen.queryByRole("heading", { name: /reset password/i }), + ).not.toBeInTheDocument() + }) + + it("quick-login card triggers onLogin with mock user credentials", async () => { + const user = userEvent.setup() + const onLogin = jest.fn().mockResolvedValue(undefined) + setup(onLogin) + + await user.click( + screen.getByText(/click to login as super admin/i), + ) + + await waitFor(() => { + expect(onLogin).toHaveBeenCalledWith(adminEmail, adminPassword) + }) + }) + + it("shows loading state on submit while onLogin is pending", async () => { + const user = userEvent.setup() + let resolveLogin!: () => void + const pending = new Promise((res) => { + resolveLogin = res + }) + const onLogin = jest.fn().mockReturnValue(pending) + setup(onLogin) + + await user.type( + screen.getByLabelText(/^email address$/i), + adminEmail, + ) + await user.type( + screen.getByLabelText(/^password$/i), + adminPassword, + ) + await user.click(screen.getByRole("button", { name: /^login$/i })) + + expect(screen.getByText(/logging in/i)).toBeInTheDocument() + resolveLogin() + await waitFor(() => { + expect(screen.queryByText(/logging in/i)).not.toBeInTheDocument() + }) + }) + + it("toggles password visibility", async () => { + const user = userEvent.setup() + setup() + const passwordInput = screen.getByLabelText( + /^password$/i, + ) as HTMLInputElement + expect(passwordInput.type).toBe("password") + + const pwdContainer = passwordInput.closest(".relative") + const toggleBtn = pwdContainer + ? within(pwdContainer as HTMLElement).getAllByRole("button")[0] + : null + expect(toggleBtn).toBeTruthy() + await user.click(toggleBtn as HTMLElement) + + expect((screen.getByLabelText(/^password$/i) as HTMLInputElement).type).toBe( + "text", + ) + }) +}) diff --git a/src/components/auth/RoleGuard.tsx b/src/features/auth/components/RoleGuard.tsx similarity index 97% rename from src/components/auth/RoleGuard.tsx rename to src/features/auth/components/RoleGuard.tsx index a8d844d..41e3a99 100644 --- a/src/components/auth/RoleGuard.tsx +++ b/src/features/auth/components/RoleGuard.tsx @@ -1,6 +1,6 @@ import { Navigate, useLocation } from 'react-router-dom'; import { useSelector } from 'react-redux'; -import { RootState } from '../../store'; +import { RootState } from '@/store'; interface RoleGuardProps { children: React.ReactNode; diff --git a/src/components/auth/LoginPage.tsx b/src/features/auth/pages/LoginPage.tsx similarity index 98% rename from src/components/auth/LoginPage.tsx rename to src/features/auth/pages/LoginPage.tsx index 54fcdde..97cfa2c 100644 --- a/src/components/auth/LoginPage.tsx +++ b/src/features/auth/pages/LoginPage.tsx @@ -1,10 +1,10 @@ import { useState } from 'react'; -import { Button } from '../ui/button'; -import { Input } from '../ui/input'; -import { Label } from '../ui/label'; -import { Checkbox } from '../ui/checkbox'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Checkbox } from '@/components/ui/checkbox'; import { AlertCircle, Copy, Check, Eye, EyeOff } from 'lucide-react'; -import { mockUsers } from '../../lib/mock-data'; +import { mockUsers } from '@/lib/mock-data'; import { toast } from 'sonner'; interface LoginPageProps { @@ -287,7 +287,7 @@ export function LoginPage({ onLogin }: LoginPageProps) {

{mockUsers.map((user, index) => (
quickLogin(user.email, user.password)} > diff --git a/src/components/auth/ProspectiveLoginPage.tsx b/src/features/auth/pages/ProspectiveLoginPage.tsx similarity index 97% rename from src/components/auth/ProspectiveLoginPage.tsx rename to src/features/auth/pages/ProspectiveLoginPage.tsx index a90ee9a..06f6f20 100644 --- a/src/components/auth/ProspectiveLoginPage.tsx +++ b/src/features/auth/pages/ProspectiveLoginPage.tsx @@ -1,13 +1,13 @@ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { Button } from '../ui/button'; -import { Input } from '../ui/input'; -import { Label } from '../ui/label'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; import { AlertCircle, ArrowLeft, Smartphone } from 'lucide-react'; import { toast } from 'sonner'; -import { API } from '../../api/API'; +import { API } from '@/api/API'; import { useDispatch } from 'react-redux'; -import { setCredentials } from '../../store/slices/authSlice'; +import { setCredentials } from '@/store/slices/authSlice'; export function ProspectiveLoginPage() { const navigate = useNavigate(); diff --git a/src/features/constitutional/__tests__/ConstitutionalChangeDetails.test.tsx b/src/features/constitutional/__tests__/ConstitutionalChangeDetails.test.tsx new file mode 100644 index 0000000..4b47fb2 --- /dev/null +++ b/src/features/constitutional/__tests__/ConstitutionalChangeDetails.test.tsx @@ -0,0 +1,156 @@ +import { render, screen, waitFor } from "@testing-library/react" +import { MemoryRouter } from "react-router-dom" +import type { User } from "@/lib/mock-data" +import { MEMORY_ROUTER_TEST_FUTURE } from "@/testing/reactRouterTest" +import { ConstitutionalChangeDetails } from "../pages/ConstitutionalChangeDetails" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +const mockGetConstitutionalChangeById = jest.fn() +const mockGetAuditLogs = jest.fn() + +jest.mock("@/api/API", () => ({ + API: { + getConstitutionalChangeById: (...args: unknown[]) => + mockGetConstitutionalChangeById(...args), + getAuditLogs: (...args: unknown[]) => mockGetAuditLogs(...args), + updateConstitutionalChange: jest.fn(), + uploadConstitutionalDocuments: jest.fn(), + }, +})) + +function buildAsmUser(): User { + return { + id: "u1", + name: "ASM Person", + email: "asm@test.com", + password: "", + role: "ASM", + roleCode: "ASM", + } +} + +function minimalRequest() { + return { + id: "req-internal-id", + requestId: "CCR-500", + status: "Submitted", + currentStage: "Submitted", + changeType: "Partnership", + description: "Expansion requires partnership.", + createdAt: "2025-03-15T09:30:00.000Z", + progressPercentage: 12, + dealer: { + fullName: "Jane Dealer", + dealerProfile: { + businessName: "Highway Garage", + dealerCode: { + dealerCode: "HG-01", + salesCode: "S1", + serviceCode: "V1", + gmaCode: "G1", + gearCode: "GR1", + }, + registeredAddress: "Plot 9, Industrial Area", + application: { loiRequests: [], loaRequests: [] }, + }, + }, + outlet: { + type: "Proprietorship", + name: "Main Outlet", + code: "OUT-1", + city: "Chennai", + state: "TN", + address: "Street 1", + }, + documents: [], + timeline: [], + metadata: { jointApprovals: { zmRbm: {} } }, + worknotes: [], + } +} + +describe("ConstitutionalChangeDetails", () => { + const onBack = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + mockGetAuditLogs.mockResolvedValue({ + data: { success: true, data: [] }, + }) + }) + + function setup(requestId = "CCR-500", user: User | null = buildAsmUser()) { + render( + + + , + ) + } + + it("shows loading then not found when API returns no request", async () => { + mockGetConstitutionalChangeById.mockResolvedValue({ + data: { success: false }, + }) + + setup() + + expect(screen.getByText(/loading request details/i)).toBeInTheDocument() + + await waitFor(() => { + expect(screen.getByRole("heading", { name: /request not found/i })).toBeInTheDocument() + }) + + expect( + screen.getByText(/doesn't exist/i), + ).toBeInTheDocument() + }) + + it("renders overview when request loads", async () => { + mockGetConstitutionalChangeById.mockResolvedValue({ + data: { success: true, request: minimalRequest() }, + }) + + setup() + + await waitFor(() => { + expect( + screen.getByRole("heading", { + name: /CCR-500 - constitutional change details/i, + }), + ).toBeInTheDocument() + }) + + expect(screen.getAllByText(/Highway Garage/i).length).toBeGreaterThanOrEqual( + 1, + ) + expect(screen.getByText(/request overview/i)).toBeInTheDocument() + expect(screen.getByText(/expansion requires partnership/i)).toBeInTheDocument() + expect(screen.getByText(/workflow progress/i)).toBeInTheDocument() + }) + + it("invokes onBack from Go Back when request missing", async () => { + mockGetConstitutionalChangeById.mockResolvedValue({ + data: { success: false }, + }) + + setup() + + await waitFor(() => { + expect(screen.getByRole("button", { name: /^go back$/i })).toBeInTheDocument() + }) + + screen.getByRole("button", { name: /^go back$/i }).click() + + expect(onBack).toHaveBeenCalled() + }) +}) diff --git a/src/features/constitutional/__tests__/ConstitutionalChangePage.test.tsx b/src/features/constitutional/__tests__/ConstitutionalChangePage.test.tsx new file mode 100644 index 0000000..ba51e30 --- /dev/null +++ b/src/features/constitutional/__tests__/ConstitutionalChangePage.test.tsx @@ -0,0 +1,141 @@ +import { render, screen, waitFor } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { ConstitutionalChangePage } from "../pages/ConstitutionalChangePage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +const mockGetConstitutionalChanges = jest.fn() +jest.mock("@/api/API", () => ({ + API: { + getConstitutionalChanges: (...args: unknown[]) => + mockGetConstitutionalChanges(...args), + getConstitutionalChangeMeta: jest.fn().mockResolvedValue({ + data: { + success: true, + structureTargets: [ + { value: "Partnership", label: "Partnership" }, + { value: "LLP", label: "LLP" }, + ], + }, + }), + getDealers: jest.fn().mockResolvedValue({ + data: { success: true, data: [] }, + }), + getOutlets: jest.fn().mockResolvedValue({ data: { outlets: [] } }), + createConstitutionalChange: jest.fn(), + }, +})) + +describe("ConstitutionalChangePage", () => { + const onViewDetails = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + mockGetConstitutionalChanges.mockResolvedValue({ + data: { success: true, requests: [] }, + }) + }) + + function setup() { + render() + } + + it("renders header and stats after loading", async () => { + setup() + + await waitFor(() => { + expect(mockGetConstitutionalChanges).toHaveBeenCalled() + }) + + expect( + screen.getByRole("heading", { + name: /constitutional change management/i, + }), + ).toBeInTheDocument() + + expect(screen.getByText("Total Requests")).toBeInTheDocument() + expect( + screen.getAllByText(/Submitted \/ Review/i).length, + ).toBeGreaterThanOrEqual(1) + expect(screen.getAllByText(/^Completed$/i).length).toBeGreaterThanOrEqual( + 1, + ) + + expect( + screen.getByRole("button", { name: /new request/i }), + ).toBeInTheDocument() + }) + + it("shows empty state when there are no requests", async () => { + setup() + + await waitFor(() => { + expect( + screen.getByText( + /no constitutional change requests found/i, + ), + ).toBeInTheDocument() + }) + }) + + it("calls onViewDetails when View is clicked for a row", async () => { + const user = userEvent.setup() + mockGetConstitutionalChanges.mockResolvedValue({ + data: { + success: true, + requests: [ + { + requestId: "CCR-100", + status: "Submitted", + currentStage: "Submitted", + currentConstitution: "Proprietorship", + changeType: "Partnership", + progressPercentage: 5, + createdAt: "2024-06-01T10:00:00.000Z", + dealer: { + fullName: "Dealer User", + dealerProfile: { + dealerCode: { dealerCode: "DLR-1" }, + businessName: "Roadside Motors", + registeredAddress: "City", + }, + }, + }, + ], + }, + }) + + setup() + + const viewBtn = await screen.findByRole("button", { name: /^view$/i }) + await user.click(viewBtn) + + expect(onViewDetails).toHaveBeenCalledWith("CCR-100") + }) + + it("opens New Request dialog and loads form fields", async () => { + const user = userEvent.setup() + setup() + + await waitFor(() => { + expect(mockGetConstitutionalChanges).toHaveBeenCalled() + }) + + await user.click( + screen.getByRole("button", { name: /new request/i }), + ) + + expect( + screen.getByRole("heading", { + name: /create constitutional change request/i, + }), + ).toBeInTheDocument() + + expect(screen.getByText(/^Dealer \*$/i)).toBeInTheDocument() + }) +}) diff --git a/src/features/constitutional/__tests__/DealerConstitutionalChangePage.test.tsx b/src/features/constitutional/__tests__/DealerConstitutionalChangePage.test.tsx new file mode 100644 index 0000000..f2078ce --- /dev/null +++ b/src/features/constitutional/__tests__/DealerConstitutionalChangePage.test.tsx @@ -0,0 +1,108 @@ +import { render, screen, waitFor } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { API } from "@/api/API" +import { DealerConstitutionalChangePage } from "../pages/DealerConstitutionalChangePage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +jest.mock("@/api/API", () => ({ + API: { + getDealerDashboard: jest.fn(), + getConstitutionalChanges: jest.fn(), + getConstitutionalChangeMeta: jest.fn(), + createConstitutionalChange: jest.fn(), + }, +})) + +describe("DealerConstitutionalChangePage", () => { + const onViewDetails = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + jest.mocked(API.getDealerDashboard).mockResolvedValue({ + data: { + profile: { + constitutionType: "Proprietorship", + dealerCode: "DLR-99", + businessName: "Test Motors", + }, + }, + } as never) + jest.mocked(API.getConstitutionalChanges).mockResolvedValue({ + data: { requests: [] }, + } as never) + jest.mocked(API.getConstitutionalChangeMeta).mockResolvedValue({ + data: { + success: true, + structureTargets: [ + { value: "Partnership", label: "Partnership" }, + { value: "LLP", label: "LLP" }, + ], + }, + } as never) + }) + + function setup() { + render( + , + ) + } + + it("renders dealer heading and stats after loading", async () => { + setup() + + expect( + await screen.findByRole("heading", { + level: 1, + name: /my constitutional change requests/i, + }), + ).toBeInTheDocument() + + expect(API.getDealerDashboard).toHaveBeenCalled() + + expect(screen.getByText("Total Requests")).toBeInTheDocument() + expect(screen.getByText("Pending")).toBeInTheDocument() + expect(screen.getByText("Completed")).toBeInTheDocument() + }) + + it("shows empty table message when no requests", async () => { + setup() + + await waitFor(() => { + expect( + screen.getByText( + /no constitutional change requests found/i, + ), + ).toBeInTheDocument() + }) + }) + + it("opens submit dialog from New Constitutional Change", async () => { + const user = userEvent.setup() + setup() + + await screen.findByRole("heading", { + level: 1, + name: /my constitutional change requests/i, + }) + + await user.click( + await screen.findByRole("button", { + name: /new constitutional change/i, + }), + ) + + expect( + screen.getByRole("heading", { + name: /submit constitutional change request/i, + }), + ).toBeInTheDocument() + + expect(screen.getByText(/current dealership information/i)).toBeInTheDocument() + }) +}) diff --git a/src/components/applications/ConstitutionalChangeDetails.tsx b/src/features/constitutional/pages/ConstitutionalChangeDetails.tsx similarity index 87% rename from src/components/applications/ConstitutionalChangeDetails.tsx rename to src/features/constitutional/pages/ConstitutionalChangeDetails.tsx index 9e00978..0e7b9a4 100644 --- a/src/components/applications/ConstitutionalChangeDetails.tsx +++ b/src/features/constitutional/pages/ConstitutionalChangeDetails.tsx @@ -1,19 +1,20 @@ import { ArrowLeft, CheckCircle2, Clock, AlertCircle, Upload, Download, Eye, ArrowRight, MessageSquare, Loader2, Ban, Undo2 } from 'lucide-react'; -import { Button } from '../ui/button'; -import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; -import { Badge } from '../ui/badge'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '../ui/dialog'; -import { Textarea } from '../ui/textarea'; -import { Label } from '../ui/label'; -import { Input } from '../ui/input'; +import { Button } from '@/components/ui/button'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; +import { Textarea } from '@/components/ui/textarea'; +import { Label } from '@/components/ui/label'; +import { Input } from '@/components/ui/input'; import { useState, useEffect, useMemo } from 'react'; -import { User as UserType } from '../../lib/mock-data'; +import { User as UserType } from '@/lib/mock-data'; import { toast } from 'sonner'; -import { API } from '../../api/API'; +import { API } from '@/api/API'; +import { OFFBOARDING_ACTIONS } from '@/lib/offboarding-actions'; import { useNavigate } from 'react-router-dom'; -import { formatDateTime } from '../ui/utils'; +import { formatDateTime } from '@/components/ui/utils'; interface ConstitutionalChangeDetailsProps { requestId: string; @@ -23,9 +24,9 @@ interface ConstitutionalChangeDetailsProps { // Workflow stages as per the process flow (SRS 12.2.4) const workflowStages = [ - { id: 1, name: 'Submitted', key: 'submitted', role: 'Dealer' }, { id: 2, name: 'ASM Review', key: 'asm-review', role: 'ASM' }, { id: 3, name: 'ZM/RBM Review', key: 'zm-rbm-review', role: 'ZM/RBM' }, + { id: 4, name: 'ZBH Review', key: 'zbh-review', role: 'ZBH' }, { id: 5, name: 'DD Lead Review', key: 'lead-review', role: 'DD Lead' }, { id: 6, name: 'DD Head Review', key: 'head-review', role: 'DD Head' }, @@ -40,7 +41,7 @@ const formatStageLabel = (label: string) => const formatStageRole = (role: string) => role === 'ZM/RBM' ? 'ZM+RBM' : role; -// Document requirements mapping (same as in ConstitutionalChangePage) +// Document requirements mapping (same as in ConstitutionalChangePage) — SRS §12.2.4 by target constitution const documentRequirements: Record = { 'Partnership': [1, 2, 3, 4, 8, 9, 10, 16], 'LLP': [1, 2, 3, 7, 8, 9, 10, 11, 16], @@ -49,6 +50,9 @@ const documentRequirements: Record = { 'Proprietorship': [1, 2, 3, 10, 16] }; +/** Ad-hoc / future uploads; not part of mandatory §12.2.4 checklist. Multiple files allowed (append). */ +const OTHER_DOCUMENT_DOC_NUMBER = 99; + const documentNames: Record = { 1: 'GST Certificate', 2: 'Firm PAN Copy', @@ -65,7 +69,8 @@ const documentNames: Record = { 13: 'NBH Approval', 14: 'RBM Approval', 15: 'DD-Lead Approval', - 16: 'Declaration / Authorization Letter' + 16: 'Declaration / Authorization Letter', + [OTHER_DOCUMENT_DOC_NUMBER]: 'Other' }; @@ -97,26 +102,29 @@ const getStatusColor = (status: string) => { /** Audit rows were stored as UPDATED for approvals; avoid treating "UPDATED" as pending via substring "update". */ const getConstitutionalHistoryPresentation = (entry: any) => { - const raw = String(entry.action || 'UPDATED').toUpperCase(); + const action = String(entry.action || '').toUpperCase(); + const desc = String(entry.description || '').toUpperCase(); + const rem = String(entry.remarks || '').toUpperCase(); const details = entry.details || entry.newData || {}; - const targetStage = details.targetStage as string | undefined; - const remarks = String(entry.remarks || '').toLowerCase(); + const targetStage = String(details.targetStage || '').toUpperCase(); + const detailsAction = String(details.action || '').toUpperCase(); - if (raw === 'REJECTED') return { variant: 'danger' as const, badge: 'REJECTED' }; - if (raw === 'CONSTITUTIONAL_REVOKED' || raw === 'REVOKED') return { variant: 'danger' as const, badge: 'REVOKED' }; - if (raw === 'CONSTITUTIONAL_SENT_BACK') return { variant: 'pending' as const, badge: 'SENT BACK' }; - if (raw === 'DOCUMENT_REJECTED') return { variant: 'danger' as const, badge: 'DOCUMENT REJECTED' }; - if (raw === 'APPROVED' || raw === 'CREATED' || raw === 'DOCUMENT_UPLOADED' || raw === 'DOCUMENT_VERIFIED') { - return { variant: 'success' as const, badge: raw.replace(/_/g, ' ') }; + const combined = `${action} ${desc} ${rem} ${detailsAction}`.toUpperCase(); + + if (combined.includes('REJECT')) return { variant: 'danger' as const, badge: action.replace(/_/g, ' ') || 'REJECTED' }; + if (combined.includes('REVOK')) return { variant: 'danger' as const, badge: action.replace(/_/g, ' ') || 'REVOKED' }; + if (combined.includes('SENT BACK') || combined.includes('SEND BACK') || combined.includes('RECONSIDER')) { + return { variant: 'pending' as const, badge: action.replace(/_/g, ' ') || 'SENT BACK' }; } - if (raw === 'UPDATED') { - if (remarks.includes('send') && remarks.includes('back')) return { variant: 'pending' as const, badge: 'SENT BACK' }; - if (remarks.includes('reject')) return { variant: 'danger' as const, badge: 'REJECTED' }; - if (targetStage === 'Completed') return { variant: 'success' as const, badge: 'COMPLETED' }; - if (targetStage) return { variant: 'success' as const, badge: 'APPROVED' }; - return { variant: 'neutral' as const, badge: 'UPDATED' }; + + if (combined.includes('APPROV') || combined.includes('INITI') || combined.includes('CREATE') || combined.includes('VERIF') || combined.includes('UPLOAD')) { + return { variant: 'success' as const, badge: action.replace(/_/g, ' ') || 'APPROVED' }; } - return { variant: 'neutral' as const, badge: raw.replace(/_/g, ' ') || 'EVENT' }; + + if (targetStage === 'COMPLETED' || combined.includes('COMPLET')) return { variant: 'success' as const, badge: 'COMPLETED' }; + if (targetStage) return { variant: 'success' as const, badge: 'APPROVED' }; + + return { variant: 'neutral' as const, badge: action.replace(/_/g, ' ') || 'EVENT' }; }; const normalizeConstitutionType = (value: string) => { @@ -198,6 +206,19 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: })); }, [auditLogs, request?.timeline]); + /** Must run before any conditional return (Rules of Hooks). */ + const uploadDocumentTypeOptions = useMemo(() => { + const normalized = normalizeConstitutionType(String(request?.changeType || '')); + const base = documentRequirements[normalized] || []; + const merged = [...base]; + if (!merged.includes(OTHER_DOCUMENT_DOC_NUMBER)) merged.push(OTHER_DOCUMENT_DOC_NUMBER); + return merged.sort((a, b) => { + if (a === OTHER_DOCUMENT_DOC_NUMBER) return 1; + if (b === OTHER_DOCUMENT_DOC_NUMBER) return -1; + return a - b; + }); + }, [request?.changeType]); + if (isLoading) { return (
@@ -239,20 +260,38 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: // Calculate current stage index mapping to backend stages const getCurrentStageIndex = () => { - if (request.currentStage === 'Rejected' || request.currentStage === 'Revoked') return -1; + let currentStage = request.currentStage || ''; + + // For terminal states, resolve the last active stage from timeline + if (['Rejected', 'Revoked', 'Withdrawn'].includes(request.status) && (currentStage === 'Rejected' || currentStage === 'Revoked' || !currentStage)) { + const lastEntry = [...(request.timeline || [])].reverse().find(e => e.stage && !['Rejected', 'Revoked', 'REJECTED', 'REVOKED'].includes(e.stage)); + if (lastEntry) currentStage = lastEntry.stage; + } + const stageMap: Record = { - 'Submitted': 1, - 'ASM Review': 2, - 'ZM/RBM Review': 3, - 'ZM+RBM Review': 3, - 'ZBH Review': 4, - 'DD Lead Review': 5, - 'DD Head Review': 6, - 'NBH Approval': 7, - 'Legal Review': 8, - 'Completed': 9 + 'ASM Review': 1, + 'ZM/RBM Review': 2, + 'ZM+RBM Review': 2, + 'ZBH Review': 3, + 'DD Lead Review': 4, + 'DD Head Review': 5, + 'NBH Approval': 6, + 'Legal Review': 7, + 'Completed': 8 }; - return stageMap[request.currentStage] || 1; + + + if (stageMap[currentStage]) return stageMap[currentStage]; + + // Case-insensitive fallback search + const normalized = currentStage.trim().toLowerCase(); + for (const [key, val] of Object.entries(stageMap)) { + if (key.toLowerCase() === normalized || key.toLowerCase().includes(normalized) || normalized.includes(key.toLowerCase())) { + return val; + } + } + + return 1; }; const currentStageIndex = getCurrentStageIndex(); @@ -296,7 +335,7 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: const currentStage = request.currentStage; const status = request.status; const userRole = currentUser.role || currentUser.roleCode; - const userRoleCode = String(currentUser.roleCode || '').toUpperCase(); + const userRoleCode = String(currentUser.roleCode || currentUser.role || '').trim().toUpperCase(); const isFinalState = ['Completed', 'Rejected', 'Revoked'].includes(String(status || '')) || ['Rejected', 'Revoked', 'Completed'].includes(String(currentStage || '')); @@ -331,25 +370,24 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: currentStage !== 'Legal Review' && currentStage !== 'Submitted'; - const jointZmRbmMeta = (request.metadata as any)?.jointApprovals?.zmRbm || {}; + let meta = request.metadata || {}; + if (typeof meta === 'string') { + try { + meta = JSON.parse(meta); + } catch (e) { + console.error('Failed to parse metadata', e); + meta = {}; + } + } + const jointZmRbmMeta = (meta as any)?.jointApprovals?.zmRbm || {}; const isZmRbmStage = currentStage === 'ZM/RBM Review' || currentStage === 'ZM+RBM Review'; - const actorKey = userRoleCode === 'RBM' ? 'RBM' : (userRoleCode === 'DD-ZM' ? 'DD-ZM' : null); - const approvedFromMetadata = actorKey ? Boolean(jointZmRbmMeta?.[actorKey]?.approvedByUserId) : false; - const approvedFromTimeline = isZmRbmStage && Boolean( - (request.timeline || []).some((entry: any) => { - const stage = String(entry?.stage || '').trim(); - const action = String(entry?.action || '').toLowerCase(); - const actor = String(entry?.user || '').trim().toLowerCase(); - const me = String(currentUser?.name || '').trim().toLowerCase(); - return ( - (stage === 'ZM/RBM Review' || stage === 'ZM+RBM Review' || stage === 'RBM Review' || stage === 'ZM Review') && - action.includes('approved') && - me.length > 0 && - actor === me - ); - }) - ); - const hasCurrentUserApprovedZmRbm = isZmRbmStage && (approvedFromMetadata || approvedFromTimeline); + const actorKey = (userRoleCode === 'RBM') ? 'RBM' : + (userRoleCode === 'DD-ZM' || userRoleCode === 'DD ZM' || userRoleCode === 'ZM') ? 'DD-ZM' : null; + + // GAP CLOSURE: Rely primarily on metadata for joint approval status. + const hasCurrentUserApprovedZmRbm = isZmRbmStage && actorKey && Boolean(jointZmRbmMeta?.[actorKey]?.approvedByUserId); + + return { canApprove: isCurrentlyAssigned && !isFinalState && !hasCurrentUserApprovedZmRbm, @@ -383,20 +421,30 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: const handleSubmitAction = async (e: React.FormEvent) => { e.preventDefault(); - const remarksRequired = actionType === 'sendBack' || actionType === 'revoke'; - if (remarksRequired && !String(comments || '').trim()) { - toast.error('Remarks are required for Send Back and Revoke (SRS §12.2.3).'); + const remarksTrimmed = String(comments || '').trim(); + const isHighRiskAction = actionType === 'sendBack' || actionType === 'revoke'; + + if (isHighRiskAction && remarksTrimmed.length < 5) { + toast.error('Detailed remarks (minimum 5 characters) are required for Send Back and Revoke actions.'); + return; + } + + if (!remarksTrimmed && actionType !== 'approve') { + toast.error('Remarks are required for this action.'); return; } try { setIsActionLoading(true); - const actionLabel = - actionType === 'approve' ? 'Approve' : - actionType === 'reject' ? 'Reject' : - actionType === 'sendBack' ? 'Send Back' : - 'Revoke'; - const response = await API.updateConstitutionalChange(requestId, actionLabel, { + const actionPayload = + actionType === 'approve' + ? OFFBOARDING_ACTIONS.APPROVE + : actionType === 'reject' + ? OFFBOARDING_ACTIONS.REJECT + : actionType === 'sendBack' + ? OFFBOARDING_ACTIONS.SEND_BACK + : OFFBOARDING_ACTIONS.REVOKE; + const response = await API.updateConstitutionalChange(requestId, actionPayload, { comments }) as any; @@ -409,7 +457,7 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: toast.success(`Request ${actionText} successfully`); setIsActionDialogOpen(false); setComments(''); - fetchRequestDetails(); + await fetchRequestDetails(); } } catch (error) { console.error('Submit action error:', error); @@ -429,10 +477,14 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: try { setIsUploadingDoc(true); const existingDocs = Array.isArray(request.documents) ? [...request.documents] : []; - const existingIndex = existingDocs.findIndex((d: any) => d.docNumber === selectedDocType); + const replaceSameSlot = + selectedDocType !== OTHER_DOCUMENT_DOC_NUMBER; + const existingIndex = replaceSameSlot + ? existingDocs.findIndex((d: any) => Number(d?.docNumber) === selectedDocType) + : -1; const payloadDoc = { docNumber: selectedDocType, - name: documentNames[selectedDocType], + name: documentNames[selectedDocType] || 'Other', fileName: uploadFile.name, status: 'Pending Verification', uploadedOn: new Date().toISOString(), @@ -676,20 +728,24 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: * While DB stage is still `Submitted`, the filing step is already done; the queue is at ASM. * Show “Submitted” as completed and “ASM Review” as in progress (no extra dealer action). */ - const atSubmittedGate = request.currentStage === 'Submitted'; + // Adjusted logic for streamlined workflow (no separate 'Submitted' stage gate) const isCompleted = flowComplete || - index < currentStageIndex - 1 || - (atSubmittedGate && index === 0); + index < currentStageIndex - 1; const isCurrent = !flowComplete && - (atSubmittedGate ? index === 1 : index === currentStageIndex - 1); + index === currentStageIndex - 1; + const timelineEntry = getLatestStageTimelineEntry(stage.name); const explicitFeedback = timelineEntry?.comments || timelineEntry?.feedback || timelineEntry?.remarks; const isJointZmRbmStage = stage.name === 'ZM/RBM Review'; - const jointZmRbmMeta = (request.metadata as any)?.jointApprovals?.zmRbm || {}; - const rbmApproval = jointZmRbmMeta?.RBM; - const ddZmApproval = jointZmRbmMeta?.['DD-ZM']; + let metaObj = request.metadata || {}; + if (typeof metaObj === 'string') { + try { metaObj = JSON.parse(metaObj); } catch (e) { metaObj = {}; } + } + const jointZmRbmMetaObj = (metaObj as any)?.jointApprovals?.zmRbm || {}; + const rbmApproval = jointZmRbmMetaObj?.RBM; + const ddZmApproval = jointZmRbmMetaObj?.['DD-ZM']; const currentRoleNormalized = String(currentUser?.roleCode || currentUser?.role || '').toUpperCase(); const currentRoleApproval = currentRoleNormalized === 'RBM' @@ -698,6 +754,7 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: ? ddZmApproval : null; + return (
{/* Status Icon */} @@ -730,15 +787,9 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: {formatStageLabel(stage.name)}

- {atSubmittedGate && index === 0 - ? 'Dealer action: filing complete (no further step here).' - : `Responsible: ${formatStageRole(stage.role)}`} - {atSubmittedGate && index === 1 ? ( - - ASM approves to advance the request (first workflow action after submission). - - ) : null} + {`Responsible: ${formatStageRole(stage.role)}`}

+
-
+

Document Checklist

@@ -840,10 +891,10 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: }} > - {requiredDocs.map((docNum) => ( + {uploadDocumentTypeOptions.map((docNum) => ( ))} @@ -1035,8 +1086,20 @@ export function ConstitutionalChangeDetails({ requestId, onBack, currentUser }: {pres.badge}
-

{entry.description || entry.remarks || 'No remarks provided'}

-

{formatDateTime(entry.timestamp || entry.createdAt)}

+
+ Comments: + {/* + Audit API puts user-entered text in `remarks` and a generated summary in `description` + (e.g. "Approval - Stage: ZM/RBM Review"). Prefer remarks so History matches the approve modal / Work Notes. + */} + {String(entry.remarks || '').trim() || + String(entry.description || '').trim() || + 'No remarks provided'} +
+

+ {formatDateTime(entry.timestamp || entry.createdAt)} +

+
); diff --git a/src/components/applications/ConstitutionalChangePage.tsx b/src/features/constitutional/pages/ConstitutionalChangePage.tsx similarity index 98% rename from src/components/applications/ConstitutionalChangePage.tsx rename to src/features/constitutional/pages/ConstitutionalChangePage.tsx index 5e325a0..f5bf001 100644 --- a/src/components/applications/ConstitutionalChangePage.tsx +++ b/src/features/constitutional/pages/ConstitutionalChangePage.tsx @@ -1,18 +1,18 @@ import { FileText, Calendar, Building, Plus, Eye, ArrowRight, Shield, Loader2 } from 'lucide-react'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; -import { Badge } from '../ui/badge'; -import { Button } from '../ui/button'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '../ui/dialog'; -import { Label } from '../ui/label'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; -import { Textarea } from '../ui/textarea'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Textarea } from '@/components/ui/textarea'; import { useState, useEffect } from 'react'; -import { User as UserType } from '../../lib/mock-data'; +import { User as UserType } from '@/lib/mock-data'; import { toast } from 'sonner'; -import { API } from '../../api/API'; -import { formatDateTime } from '../ui/utils'; +import { API } from '@/api/API'; +import { formatDateTime } from '@/components/ui/utils'; import { normalizeDealerProfileConstitution } from '@/lib/constitutional-change'; interface ConstitutionalChangePageProps { @@ -29,6 +29,8 @@ const documentRequirements: Record = { }; // Document names +const OTHER_DOCUMENT_DOC_NUMBER = 99; + const documentNames: Record = { 1: 'GST', 2: 'Firm Pan Copy', @@ -45,7 +47,8 @@ const documentNames: Record = { 13: 'NBH Approval', 14: 'RBM Approval', 15: 'DD-Lead Approval', - 16: 'Declaration / Authorization Letter' + 16: 'Declaration / Authorization Letter', + [OTHER_DOCUMENT_DOC_NUMBER]: 'Other' }; const getStatusColor = (status: string) => { diff --git a/src/components/dealer/DealerConstitutionalChangePage.tsx b/src/features/constitutional/pages/DealerConstitutionalChangePage.tsx similarity index 96% rename from src/components/dealer/DealerConstitutionalChangePage.tsx rename to src/features/constitutional/pages/DealerConstitutionalChangePage.tsx index 87f5b74..f1d0988 100644 --- a/src/components/dealer/DealerConstitutionalChangePage.tsx +++ b/src/features/constitutional/pages/DealerConstitutionalChangePage.tsx @@ -1,19 +1,19 @@ import { RefreshCcw, Plus, Eye, Calendar, FileText, Loader2 } from 'lucide-react'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; -import { Badge } from '../ui/badge'; -import { Button } from '../ui/button'; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '../ui/dialog'; -import { Input } from '../ui/input'; -import { Label } from '../ui/label'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; -import { Textarea } from '../ui/textarea'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Textarea } from '@/components/ui/textarea'; import { useState, useEffect } from 'react'; -import { User as UserType } from '../../lib/mock-data'; +import { User as UserType } from '@/lib/mock-data'; import { toast } from 'sonner'; -import { dealerService } from '../../services/dealer.service'; -import { formatDateTime } from '../ui/utils'; -import { API } from '../../api/API'; +import { dealerService } from '@/services/dealer.service'; +import { formatDateTime } from '@/components/ui/utils'; +import { API } from '@/api/API'; import { normalizeDealerProfileConstitution } from '@/lib/constitutional-change'; interface DealerConstitutionalChangePageProps { diff --git a/src/components/dashboard/Dashboard.tsx b/src/features/dashboard/pages/Dashboard.tsx similarity index 97% rename from src/components/dashboard/Dashboard.tsx rename to src/features/dashboard/pages/Dashboard.tsx index 1c63182..9c95838 100644 --- a/src/components/dashboard/Dashboard.tsx +++ b/src/features/dashboard/pages/Dashboard.tsx @@ -11,10 +11,10 @@ import { Mail, Inbox } from 'lucide-react'; -import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; -import { dashboardStats, recentActivities } from '../../lib/mock-data'; -import { Badge } from '../ui/badge'; -import { ScrollArea } from '../ui/scroll-area'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { dashboardStats, recentActivities } from '@/lib/mock-data'; +import { Badge } from '@/components/ui/badge'; +import { ScrollArea } from '@/components/ui/scroll-area'; interface DashboardProps { onNavigate: (view: string, filter?: string) => void; diff --git a/src/components/dashboard/DealerDashboard.tsx b/src/features/dashboard/pages/DealerDashboard.tsx similarity index 97% rename from src/components/dashboard/DealerDashboard.tsx rename to src/features/dashboard/pages/DealerDashboard.tsx index 740366a..c5fa4e5 100644 --- a/src/components/dashboard/DealerDashboard.tsx +++ b/src/features/dashboard/pages/DealerDashboard.tsx @@ -1,10 +1,10 @@ import { useState, useEffect } from 'react'; import { RefreshCcw, MapPin, Users, TrendingUp, Clock, CheckCircle, AlertCircle, ShoppingBag, Loader2 } from 'lucide-react'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; -import { Button } from '../ui/button'; -import { Badge } from '../ui/badge'; -import { User } from '../../lib/mock-data'; -import { dealerService } from '../../services/dealer.service'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { User } from '@/lib/mock-data'; +import { dealerService } from '@/services/dealer.service'; interface DealerDashboardProps { currentUser: User | null; diff --git a/src/components/dashboard/FDDDashboardPage.tsx b/src/features/dashboard/pages/FDDDashboardPage.tsx similarity index 98% rename from src/components/dashboard/FDDDashboardPage.tsx rename to src/features/dashboard/pages/FDDDashboardPage.tsx index bedefaf..ba82d79 100644 --- a/src/components/dashboard/FDDDashboardPage.tsx +++ b/src/features/dashboard/pages/FDDDashboardPage.tsx @@ -1,8 +1,8 @@ import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; -import { API } from '../../api/API'; -import { Card, CardContent, CardHeader, CardTitle } from '../ui/card'; -import { Badge } from '../ui/badge'; +import { API } from '@/api/API'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; import { FileText, Clock, diff --git a/src/components/dashboard/FinanceDashboard.tsx b/src/features/dashboard/pages/FinanceDashboard.tsx similarity index 95% rename from src/components/dashboard/FinanceDashboard.tsx rename to src/features/dashboard/pages/FinanceDashboard.tsx index 85fdd4d..75c10c9 100644 --- a/src/components/dashboard/FinanceDashboard.tsx +++ b/src/features/dashboard/pages/FinanceDashboard.tsx @@ -1,20 +1,20 @@ import { IndianRupee, FileText, CheckCircle, Plus, Trash2, Save, Calculator, Clock, TrendingUp, TrendingDown } from 'lucide-react'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; -import { Badge } from '../ui/badge'; -import { Button } from '../ui/button'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; -import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '../ui/dialog'; -import { Input } from '../ui/input'; -import { Label } from '../ui/label'; -import { Textarea } from '../ui/textarea'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { useState, useEffect } from 'react'; -import { User } from '../../lib/mock-data'; +import { User } from '@/lib/mock-data'; import { toast } from 'sonner'; -import { onboardingService } from '../../services/onboarding.service'; -import { settlementService } from '../../services/settlement.service'; -import { formatDateTime } from '../ui/utils'; +import { onboardingService } from '@/services/onboarding.service'; +import { settlementService } from '@/services/settlement.service'; +import { formatDateTime } from '@/components/ui/utils'; interface FinanceDashboardProps { currentUser: User | null; @@ -28,7 +28,7 @@ interface FinanceLineItem { id: string; department: string; description: string; - type: 'payable' | 'recovery'; + type: 'payable' | 'receivable'; amount: number; } @@ -131,23 +131,23 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit const [newLineItem, setNewLineItem] = useState({ department: '', description: '', - type: 'recovery' as 'payable' | 'recovery', + type: 'receivable' as 'payable' | 'receivable', amount: '' }); const [finalRemarks, setFinalRemarks] = useState(''); const calculateTotals = () => { - const totalRecovery = lineItems - .filter(item => item.type === 'recovery') + const totalReceivable = lineItems + .filter(item => item.type === 'receivable') .reduce((sum, item) => sum + item.amount, 0); const totalPayable = lineItems .filter(item => item.type === 'payable') .reduce((sum, item) => sum + item.amount, 0); - const netAmount = totalPayable - totalRecovery; + const netAmount = totalPayable - totalReceivable; - return { totalRecovery, totalPayable, netAmount }; + return { totalReceivable, totalPayable, netAmount }; }; const handleSubmitFinanceSummary = async () => { @@ -200,7 +200,7 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit }; setLineItems([...lineItems, item]); - setNewLineItem({ department: '', description: '', type: 'recovery', amount: '' }); + setNewLineItem({ department: '', description: '', type: 'receivable', amount: '' }); toast.success('Line item added'); }; @@ -209,7 +209,7 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit toast.info('Line item removed'); }; - const { totalRecovery, totalPayable, netAmount } = calculateTotals(); + const { totalReceivable, totalPayable, netAmount } = calculateTotals(); if (loading) { return ( @@ -617,7 +617,7 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit ₹{fnf.netAmount ? Math.abs(fnf.netAmount).toLocaleString('en-IN') : '0'}

- {fnf.netAmount && fnf.netAmount >= 0 ? 'Payable to Dealer' : 'Recovery from Dealer'} + {fnf.netAmount && fnf.netAmount >= 0 ? 'Payable to Dealer' : 'Receivable from Dealer'}

@@ -685,12 +685,12 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit
- setNewLineItem({...newLineItem, type: value})}> - Recovery + Receivable Payable @@ -735,11 +735,11 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit {item.department} {item.description} - - {item.type === 'recovery' ? 'Recovery' : 'Payable'} + + {item.type === 'receivable' ? 'Receivable' : 'Payable'} - + ₹{item.amount.toLocaleString('en-IN')} @@ -768,8 +768,8 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit

₹{totalPayable.toLocaleString('en-IN')}

-

Total Recovery

-

₹{totalRecovery.toLocaleString('en-IN')}

+

Total receivable

+

₹{totalReceivable.toLocaleString('en-IN')}

Net Settlement

@@ -777,7 +777,7 @@ export function FinanceDashboard({ onNavigate, onViewPaymentDetails, onViewAudit ₹{Math.abs(netAmount).toLocaleString('en-IN')}

- {netAmount >= 0 ? 'Payable to Dealer' : 'Recoverable from Dealer'} + {netAmount >= 0 ? 'Payable to Dealer' : 'Receivable from Dealer'}

diff --git a/src/components/dashboard/ProspectiveDashboardPage.tsx b/src/features/dashboard/pages/ProspectiveDashboardPage.tsx similarity index 97% rename from src/components/dashboard/ProspectiveDashboardPage.tsx rename to src/features/dashboard/pages/ProspectiveDashboardPage.tsx index 3afc08e..94818b7 100644 --- a/src/components/dashboard/ProspectiveDashboardPage.tsx +++ b/src/features/dashboard/pages/ProspectiveDashboardPage.tsx @@ -18,13 +18,13 @@ import { } from 'lucide-react'; import { useDispatch, useSelector } from 'react-redux'; import { useNavigate, Routes, Route, useParams } from 'react-router-dom'; -import { RootState } from '../../store'; -import { logout } from '../../store/slices/authSlice'; +import { RootState } from '@/store'; +import { logout } from '@/store/slices/authSlice'; import { toast } from 'sonner'; -import { API } from '../../api/API'; -import { formatDateTime } from '../ui/utils'; -import { Badge } from '../ui/badge'; -import { ProspectiveApplicationDetails } from '../applications/ProspectiveApplicationDetails'; +import { API } from '@/api/API'; +import { formatDateTime } from '@/components/ui/utils'; +import { Badge } from '@/components/ui/badge'; +import { ProspectiveApplicationDetails } from '@/features/onboarding/pages/ProspectiveApplicationDetails'; export function ProspectiveDashboardPage() { const dispatch = useDispatch(); diff --git a/src/features/fnf/__tests__/FinanceFnFDetailsPage.test.tsx b/src/features/fnf/__tests__/FinanceFnFDetailsPage.test.tsx new file mode 100644 index 0000000..bfa2cbd --- /dev/null +++ b/src/features/fnf/__tests__/FinanceFnFDetailsPage.test.tsx @@ -0,0 +1,73 @@ +import { render, screen, waitFor } from "@testing-library/react" +import { API } from "@/api/API" +import { FinanceFnFDetailsPage } from "../pages/FinanceFnFDetailsPage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + info: jest.fn(), + }, +})) + +jest.mock("@/components/ui/DocumentPreviewModal", () => ({ + DocumentPreviewModal: () => null, +})) + +jest.mock("@/features/onboarding/components/BankDetailsModal", () => ({ + BankDetailsModal: () => null, +})) + +jest.mock("@/api/API", () => ({ + API: { + getSettlementDepartments: jest.fn().mockResolvedValue({ + data: { success: true, departments: [] }, + }), + getFnFSettlementById: jest.fn(), + getDealerBankDetails: jest.fn(), + }, +})) + +jest.mock("@/services/settlement.service", () => ({ + settlementService: { + updateFnF: jest.fn(), + }, +})) + +describe("FinanceFnFDetailsPage", () => { + const onBack = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("shows not found when settlement cannot be loaded", async () => { + jest.mocked(API.getFnFSettlementById).mockResolvedValue({ + data: { success: false }, + } as never) + + render( + , + ) + + expect( + await screen.findByText(/settlement case not found/i), + ).toBeInTheDocument() + + screen.getByRole("button", { name: /^go back$/i }).click() + expect(onBack).toHaveBeenCalled() + }) + + it("fetches departments and settlement on mount", async () => { + jest.mocked(API.getFnFSettlementById).mockResolvedValue({ + data: { success: false }, + } as never) + + render() + + await waitFor(() => { + expect(API.getSettlementDepartments).toHaveBeenCalled() + expect(API.getFnFSettlementById).toHaveBeenCalledWith("fnf-xyz") + }) + }) +}) diff --git a/src/features/fnf/__tests__/FinanceFnFPage.test.tsx b/src/features/fnf/__tests__/FinanceFnFPage.test.tsx new file mode 100644 index 0000000..3dcaaae --- /dev/null +++ b/src/features/fnf/__tests__/FinanceFnFPage.test.tsx @@ -0,0 +1,79 @@ +import { render, screen } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { API } from "@/api/API" +import { FinanceFnFPage } from "../pages/FinanceFnFPage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +jest.mock("@/api/API", () => ({ + API: { + getFnFSettlements: jest.fn(), + }, +})) + +describe("FinanceFnFPage", () => { + const onViewFnFDetails = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + jest.mocked(API.getFnFSettlements).mockResolvedValue({ + data: { success: true, settlements: [] }, + } as never) + }) + + it("renders finance header and queue after loading", async () => { + render() + + expect( + await screen.findByRole("heading", { + level: 1, + name: /f&f financial settlement/i, + }), + ).toBeInTheDocument() + + expect( + screen.getByRole("heading", { name: /f&f settlement queue/i }), + ).toBeInTheDocument() + expect(API.getFnFSettlements).toHaveBeenCalled() + }) + + it("calls onViewFnFDetails when View Details is clicked", async () => { + const user = userEvent.setup() + jest.mocked(API.getFnFSettlements).mockResolvedValue({ + data: { + success: true, + settlements: [ + { + id: "finance-fnf-99", + settlementId: "FNF-99", + status: "Calculated", + resignationId: "R-9", + resignation: { resignationId: "R-9" }, + outlet: { + code: "DLR-X", + city: "Mumbai", + dealer: { fullName: "Finance Dealer" }, + }, + totalPayables: "10000", + totalReceivables: "5000", + netAmount: "-2500", + createdAt: "2025-03-01T12:00:00.000Z", + }, + ], + }, + } as never) + + render() + + await user.click( + await screen.findByRole("button", { name: /view details/i }), + ) + + expect(onViewFnFDetails).toHaveBeenCalledWith("finance-fnf-99") + }) +}) diff --git a/src/features/fnf/__tests__/FinancePaymentDetailsPage.test.tsx b/src/features/fnf/__tests__/FinancePaymentDetailsPage.test.tsx new file mode 100644 index 0000000..953ffe0 --- /dev/null +++ b/src/features/fnf/__tests__/FinancePaymentDetailsPage.test.tsx @@ -0,0 +1,86 @@ +import { render, screen } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { onboardingService } from "@/services/onboarding.service" +import { FinancePaymentDetailsPage } from "../pages/FinancePaymentDetailsPage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +jest.mock("@/components/ui/DocumentPreviewModal", () => ({ + DocumentPreviewModal: () => null, +})) + +jest.mock("@/services/onboarding.service", () => ({ + onboardingService: { + getApplicationById: jest.fn(), + getSecurityDeposit: jest.fn(), + getSystemConfigs: jest.fn(), + updateSecurityDeposit: jest.fn(), + }, +})) + +describe("FinancePaymentDetailsPage", () => { + const onBack = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + jest.mocked(onboardingService.getApplicationById).mockResolvedValue({ + id: "app-internal", + applicationId: "APP-001", + applicantName: "Sample Applicant", + city: "Chennai", + state: "TN", + email: "a@example.com", + phone: "9999999999", + } as Awaited>) + jest.mocked(onboardingService.getSecurityDeposit).mockResolvedValue([]) + jest.mocked(onboardingService.getSystemConfigs).mockResolvedValue({ + SECURITY_DEPOSIT: { amount: 500000 }, + FIRST_FILL: { amount: 1500000 }, + } as never) + }) + + function setup(applicationId = "app-internal") { + render( + , + ) + } + + it("renders payment verification header and applicant info", async () => { + setup() + + expect( + await screen.findByRole("heading", { + name: /payment verification/i, + }), + ).toBeInTheDocument() + + expect(screen.getByText("APP-001")).toBeInTheDocument() + expect(screen.getByText("Sample Applicant")).toBeInTheDocument() + expect(onboardingService.getApplicationById).toHaveBeenCalledWith( + "app-internal", + ) + }) + + it("calls onBack when back button is used", async () => { + const user = userEvent.setup() + setup() + + await screen.findByRole("heading", { name: /payment verification/i }) + + const backBtn = screen.getAllByRole("button").find((b) => + b.querySelector("svg.lucide-arrow-left"), + ) + expect(backBtn).toBeTruthy() + await user.click(backBtn as HTMLElement) + + expect(onBack).toHaveBeenCalled() + }) +}) diff --git a/src/features/fnf/__tests__/FnFDetails.test.tsx b/src/features/fnf/__tests__/FnFDetails.test.tsx new file mode 100644 index 0000000..1bfe5df --- /dev/null +++ b/src/features/fnf/__tests__/FnFDetails.test.tsx @@ -0,0 +1,79 @@ +import { render, screen, waitFor } from "@testing-library/react" +import { MemoryRouter } from "react-router-dom" +import { API } from "@/api/API" +import { MEMORY_ROUTER_TEST_FUTURE } from "@/testing/reactRouterTest" +import { FnFDetails } from "../pages/FnFDetails" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +jest.mock("@/api/API", () => ({ + API: { + getFnFSettlementById: jest.fn(), + getAuditLogs: jest.fn().mockResolvedValue({ + data: { success: true, data: [] }, + }), + getDealerBankDetails: jest.fn(), + }, +})) + +jest.mock("@/components/ui/DocumentPreviewModal", () => ({ + DocumentPreviewModal: () => null, +})) + +jest.mock("@/features/onboarding/components/BankDetailsModal", () => ({ + BankDetailsModal: () => null, +})) + +describe("FnFDetails", () => { + const onBack = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + }) + + function setup(fnfId = "missing-id") { + render( + + + , + ) + } + + it("shows case not found when API returns unsuccessful payload", async () => { + jest.mocked(API.getFnFSettlementById).mockResolvedValue({ + data: { success: false }, + } as never) + + setup() + + expect( + await screen.findByText(/case not found/i), + ).toBeInTheDocument() + + screen.getByRole("button", { name: /^go back$/i }).click() + expect(onBack).toHaveBeenCalled() + }) + + it("requested settlement by id", async () => { + jest.mocked(API.getFnFSettlementById).mockResolvedValue({ + data: { success: false }, + } as never) + + setup("fnf-uuid-123") + + await waitFor(() => { + expect(API.getFnFSettlementById).toHaveBeenCalledWith( + "fnf-uuid-123", + ) + }) + }) +}) diff --git a/src/features/fnf/__tests__/FnFPage.test.tsx b/src/features/fnf/__tests__/FnFPage.test.tsx new file mode 100644 index 0000000..0c09136 --- /dev/null +++ b/src/features/fnf/__tests__/FnFPage.test.tsx @@ -0,0 +1,89 @@ +import { render, screen } from "@testing-library/react" +import userEvent from "@testing-library/user-event" +import { API } from "@/api/API" +import { FnFPage } from "../pages/FnFPage" + +jest.mock("sonner", () => ({ + toast: { + error: jest.fn(), + success: jest.fn(), + }, +})) + +jest.mock("@/api/API", () => ({ + API: { + getFnFSettlements: jest.fn(), + }, +})) + +const mockUser = { + id: "u1", + name: "DD Lead", + email: "dd@test.com", + password: "", + role: "DD Lead" as const, +} + +describe("FnFPage", () => { + const onViewDetails = jest.fn() + + beforeEach(() => { + jest.clearAllMocks() + jest.mocked(API.getFnFSettlements).mockResolvedValue({ + data: { success: true, settlements: [] }, + } as never) + }) + + it("renders summary stats and main title after loading", async () => { + render( + , + ) + + expect( + await screen.findByRole("heading", { + name: /full & final settlement cases/i, + }), + ).toBeInTheDocument() + + expect(screen.getByText("Newly created")).toBeInTheDocument() + expect(screen.getByText(/^Total$/)).toBeInTheDocument() + expect(API.getFnFSettlements).toHaveBeenCalled() + }) + + it("calls onViewDetails when View Details is clicked", async () => { + const user = userEvent.setup() + jest.mocked(API.getFnFSettlements).mockResolvedValue({ + data: { + success: true, + settlements: [ + { + id: "fnf-case-1", + settlementId: "SET-100", + status: "Initiated", + resignationId: "RES-1", + resignation: { resignationId: "RES-1" }, + outlet: { + code: "OUT-9", + name: "City Motors", + city: "Pune", + dealer: { fullName: "Dealer Person" }, + }, + totalReceivables: "0", + totalPayables: "0", + createdAt: "2025-02-01T10:00:00.000Z", + }, + ], + }, + } as never) + + render( + , + ) + + await user.click( + await screen.findByRole("button", { name: /view details/i }), + ) + + expect(onViewDetails).toHaveBeenCalledWith("fnf-case-1") + }) +}) diff --git a/src/components/applications/FinanceFnFDetailsPage.tsx b/src/features/fnf/pages/FinanceFnFDetailsPage.tsx similarity index 91% rename from src/components/applications/FinanceFnFDetailsPage.tsx rename to src/features/fnf/pages/FinanceFnFDetailsPage.tsx index ba3e553..1bef4fc 100644 --- a/src/components/applications/FinanceFnFDetailsPage.tsx +++ b/src/features/fnf/pages/FinanceFnFDetailsPage.tsx @@ -1,16 +1,16 @@ import { useState, useEffect } from 'react'; -import { API } from '../../api/API'; -import { settlementService } from '../../services/settlement.service'; +import { API } from '@/api/API'; +import { settlementService } from '@/services/settlement.service'; import { Loader2 } from 'lucide-react'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; -import { Badge } from '../ui/badge'; -import { Button } from '../ui/button'; -import { Input } from '../ui/input'; -import { Label } from '../ui/label'; -import { Textarea } from '../ui/textarea'; -import { Tabs, TabsContent, TabsList, TabsTrigger } from '../ui/tabs'; -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; -import { Progress } from '../ui/progress'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; +import { Badge } from '@/components/ui/badge'; +import { Button } from '@/components/ui/button'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { Textarea } from '@/components/ui/textarea'; +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; +import { Progress } from '@/components/ui/progress'; import { ArrowLeft, IndianRupee, @@ -36,25 +36,16 @@ import { FileDown } from 'lucide-react'; import { toast } from 'sonner'; -import { DocumentPreviewModal } from '../ui/DocumentPreviewModal'; -import { formatDateTime } from '../../lib/dateUtils'; -import { BankDetailsModal } from './BankDetailsModal'; +import { DocumentPreviewModal } from '@/components/ui/DocumentPreviewModal'; +import { formatDateTime } from '@/lib/dateUtils'; +import { BankDetailsModal } from '@/features/onboarding/components/BankDetailsModal'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, -} from '../ui/select'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from "../ui/dialog"; - +} from '@/components/ui/select'; const ALL_DEPARTMENTS = [ 'Warranty Department', 'Accessories Department', 'Sales Department', 'RTO Department', 'Service Department', 'Parts Department', 'Finance Department', 'Insurance Department', @@ -102,16 +93,6 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr const [isBankModalOpen, setIsBankModalOpen] = useState(false); const [editingBank, setEditingBank] = useState(null); const [checklist, setChecklist] = useState([]); - const [showClearanceDialog, setShowClearanceDialog] = useState(false); - const [selectedDept, setSelectedDept] = useState(null); - const [isUpdatingClearance, setIsUpdatingClearance] = useState(false); - const [clearanceForm, setClearanceForm] = useState({ - status: 'Pending', - remarks: '', - amount: 0, - type: 'Recovery' - }); - const [clearanceFile, setClearanceFile] = useState(null); useEffect(() => { fetchDepartments(); @@ -176,6 +157,11 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr (typeof description === 'string' && (description.startsWith(DEPARTMENT_CLAIM_PREFIX) || description.includes('Clearance:'))); + const isAutoSeededDeptMirror = (li: any) => + li?.sourceType === 'FinanceValidated' && + typeof li?.description === 'string' && + li.description.includes('Auto-seeded from department claim'); + const isFinanceValidatedLine = (description?: string, sourceType?: string) => sourceType === 'FinanceValidated' || (typeof description === 'string' && description.startsWith(FINANCE_VALIDATED_PREFIX)); @@ -213,10 +199,16 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr allLineItems: (s.lineItems || []).filter((li: any) => li.isActive !== false), departmentResponses: ALL_DEPARTMENTS.map((deptName: string) => { const c = (s.clearances || []).find((clearance: any) => normalizeDepartment(clearance.department) === deptName); - const relatedItems = (s.lineItems || []).filter( + const lines = (s.lineItems || []).filter((li: any) => li.isActive !== false); + const claimLines = lines.filter( (li: any) => normalizeDepartment(li.department) === deptName && isDepartmentClaimLine(li.description, li.sourceType), ); + const seededMirrorLines = lines.filter( + (li: any) => + normalizeDepartment(li.department) === deptName && isAutoSeededDeptMirror(li), + ); + const relatedItems = claimLines.length > 0 ? claimLines : seededMirrorLines; // Calculate departmental net let deptPayables = 0; @@ -233,6 +225,12 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr const normalizedStatus = hasDuesAmount ? 'Dues Pending' : (rawStatus === 'Cleared' ? 'NOC Submitted' : rawStatus); + + /** Net payable to dealer vs receivable from dealer — drives UI colors */ + const duesFlow = + netAmount > 0 ? 'payable' as const : + netAmount < 0 ? 'recovery' as const : + null; return { id: c?.id || `dept-${deptName}`, @@ -241,10 +239,11 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr remarks: c?.remarks || '-', submittedDate: c?.clearedAt ? formatDateTime(c.clearedAt) : '-', amount: Math.abs(netAmount), + duesFlow, amountType: netAmount > 0 - ? 'Payable Amount' + ? 'Payable to dealer' : netAmount < 0 - ? 'Recovery Amount' + ? 'Receivable from dealer' : null, supportingDocument: c?.supportingDocument || null }; @@ -405,7 +404,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr deductions, netSettlement, settlementAmount: Math.abs(netSettlement), - settlementType: netSettlement > 0 ? 'Payable to Dealer' : netSettlement < 0 ? 'Recovery from Dealer' : 'No Settlement Required' + settlementType: netSettlement > 0 ? 'Payable to Dealer' : netSettlement < 0 ? 'Receivable from Dealer' : 'No Settlement Required' }; }; @@ -426,7 +425,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr .reduce((sum, item) => sum + (Number(item.amount) || 0), 0); const validatedNet = validatedPayable - validatedReceivable - validatedDeduction; const validatedAmount = Math.abs(validatedNet); - const validatedType = validatedNet > 0 ? 'Payable' : validatedNet < 0 ? 'Recovery' : '-'; + const validatedType = validatedNet > 0 ? 'Payable' : validatedNet < 0 ? 'Receivable' : '-'; const variance = validatedAmount - claimAmount; return { @@ -537,32 +536,6 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr } }; - const handleUpdateClearance = async () => { - if (!selectedDept || !fnfId) return; - - try { - setIsUpdatingClearance(true); - const formData = new FormData(); - formData.append('status', clearanceForm.status); - formData.append('remarks', clearanceForm.remarks); - formData.append('amount', String(clearanceForm.amount)); - formData.append('type', clearanceForm.type); - if (clearanceFile) formData.append('file', clearanceFile); - - await API.updateFnFClearance(fnfId, selectedDept.id, formData); - - toast.success(`Clearance updated for ${selectedDept.departmentName}`); - setShowClearanceDialog(false); - setActiveTab('departments'); - fetchFnFDetails(false); - } catch (error) { - console.error("Update clearance error:", error); - toast.error("Failed to update department clearance"); - } finally { - setIsUpdatingClearance(false); - } - }; - // Handlers for Receivables const handleAddReceivable = async () => { if (!newReceivable.department || !newReceivable.description || !newReceivable.amount) { @@ -829,7 +802,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr
-
+
@@ -853,7 +826,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr @@ -862,7 +835,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr
{settlement.settlementType === 'Payable to Dealer' ? ( - ) : settlement.settlementType === 'Recovery from Dealer' ? ( + ) : settlement.settlementType === 'Receivable from Dealer' ? ( ) : ( @@ -871,7 +844,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr

@@ -889,7 +862,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr

{settlement.settlementType === 'Payable to Dealer' ? 'Company will pay to dealer' - : settlement.settlementType === 'Recovery from Dealer' + : settlement.settlementType === 'Receivable from Dealer' ? 'Dealer must pay to company' : 'No payment required'}

@@ -1018,7 +991,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr
@@ -1028,7 +1001,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr

@@ -1601,7 +1574,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr

@@ -1611,7 +1584,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr

@@ -1688,7 +1661,7 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr All Department Responses - Status of NOC and dues clearance from all 16 departments + Status of NOC and dues clearance from all 16 departments (read-only for Finance; updates are done by department stakeholders). @@ -1701,12 +1674,20 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr Amount Submitted Date Remarks - Actions {fnfCase.departmentResponses.map((dept: any) => ( - + {dept.departmentName} {dept.amountType} @@ -1733,7 +1718,15 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr {dept.amount ? ( - + ₹{dept.amount.toLocaleString('en-IN')} ) : ( @@ -1759,25 +1752,6 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr )}

- - - ))} @@ -2213,94 +2187,6 @@ export function FinanceFnFDetailsPage({ fnfId, onBack }: FinanceFnFDetailsPagePr
- {/* Clearance Update Dialog */} - - - - Update {selectedDept?.departmentName} Status - - Mark the department as cleared or report pending dues with amount. - - - -
-
- - -
- -
- - -
- -
- -
- - setClearanceForm({ ...clearanceForm, amount: Number(e.target.value) })} - /> -
-
- -
- -