From 879e822332e18e3485e95becb05e4ba308d71512 Mon Sep 17 00:00:00 2001 From: Gnuxie <50846879+Gnuxie@users.noreply.github.com> Date: Thu, 19 Mar 2026 16:13:14 +0000 Subject: [PATCH] Monoreponir (#1046) * Move src to apps/draupnir/src https://github.com/the-draupnir-project/planning/issues/100 * Move package.json https://github.com/the-draupnir-project/planning/issues/100 * Add matrix-basic-types to monorepo. Get everything working including linting and prettier :3 https://github.com/the-draupnir-project/planning/issues/100 * Add interface-manager to monorepo. This was a bitch because apparently we forgot to delete node_modules before creating the workspace package.json. So it had linked a bunch of local stuff like was in node_modules for Draupnir... Anyways i think we're still on track. https://github.com/the-draupnir-project/planning/issues/100 * idk why there are prettier changes in apps but there are. * Add matrix-protection-suite to monorepo. https://github.com/the-draupnir-project/planning/issues/100 * Add matrix-protection-suite-for-matrix-bot-sdk https://github.com/the-draupnir-project/planning/issues/100 We will need to add the real upstreams and versions and remove the file links as we publish the packages. * Move mps-interface-adaptor into monorepo https://github.com/the-draupnir-project/planning/issues/100 Wohoo, i think only draupnir is left now? * Move Draupnir test files to draupnir directory smh smh smh. https://github.com/the-draupnir-project/planning/issues/100 * Fix typescript config for tests and eslint. Now we get proper linting and type checking of tests. https://github.com/the-draupnir-project/planning/issues/100 * WIP Integrating draupnir into monorepo tooling... https://github.com/the-draupnir-project/planning/issues/100 We need to stop aliasing bot-sdk but we should first check that upstream is using a consistent name too. * Remove matrix-bot-sdk alias for vector fork. https://github.com/the-draupnir-project/planning/issues/100 * Add top command description type and weave through API. A more recent version of typescript meant that the exectutor's contravariance got checked which destroyed the API so we had to make a top type for command descriptions and parametrise some of the API. https://github.com/the-draupnir-project/planning/issues/100 * Fix typescript errors related to class property initialisation changes. https://www.typescriptlang.org/tsconfig/#useDefineForClassFields Seems like they were using defineProperty before which meant properites were initialised after the constructor ran. Honestly i like that more but we're going to stick with what they intend to be the default. https://github.com/the-draupnir-project/planning/issues/100 * Fix tests lacking fixtures context. https://github.com/the-draupnir-project/planning/issues/100 * Fix typescript errors related to error destructuring in tests. https://github.com/the-draupnir-project/planning/issues/100 * Pin postgres package to workaround upstream issue https://github.com/porsager/postgres/issues/1150 Documented in DEPENDENCIES.md https://github.com/the-draupnir-project/planning/issues/100 * Fix contravariance issue in hash store helper. Part of the TS 5.9 upgrade fallout. https://github.com/the-draupnir-project/planning/issues/100 * Fix minor typescript 5.9 migration issuess All typescript errors finished, yay. * Fix REUSE missing headers. * Fix assets script in draupnir app. * Add Draupnir to eslint scope * Remove the appservice web API. There are too many eslint errors here to do with unsafe parsing of properties from the body etc. And there's actually no consumers to this API. It's also a widget API, and all it does is provision the bot and nothing more. * Fix eslint config for DeadDocumentJSX. It wasn't working well with the jsx templates. We should probably delete the tsconfig.eslint.json shite now. * Update src/utils.ts for eslint. This shit is legacy i hate it. * Fix eslint errors in config. Really this is paint over rot since the config doesn't have a schema, and we can't really make one either. * Fix eslint issues in ReportManager. This code is diabolical. It hasn't really been fixed that will take refactoring and making sure people don't write this sorts of bad code ever again. Which thankfully we have process in place for. * Fix clientHelper eslint issues. * Fix eslint for ImportCommand. * Grinding eslint fml. * Fix miscellaneous eslint issues. * allow no-deprecate for logMessage. shit's being annoying. * Fix remaining eslint issues... We also deleted one of the scripts used to evaluate the performance of various endpoints, which we were not using. * Give bot toggle asyncDispose for code consistency. * Fix package.json access issues. * Adjust Docker and CI for new app location in monorepo. * Fix broken integration tests. * Remove prepare script from matrix-protection-suite package. Isn't needed anymore * Fix build:all script missing base files. * Remove test script from matrix-protection-suite-for-matrix-bot-sdk It doesn't have any tests :/ * Order of setup is wrong in integration test workflows. * Fix mps interface adaptor doesn't have any tests. * Fix appservice registration for test harness. * Fix matrix-basic-types jest configuration * Fix no build step in mjolnir.yaml * Transfer common dev dependencies to the workspace root. They were just wrong. --- .editorconfig | 13 +- .github/workflows/mjolnir.yml | 21 +- .gitignore | 7 +- .pre-commit-config.yaml | 25 +- .prettierignore | 6 + .prettierrc.yaml | 2 +- CHANGELOG.md | 1 - DEPENDENCIES.md | 36 + Dockerfile | 11 +- LICENSES/0BSD.txt | 5 + LICENSES/MIT.txt | 18 + REUSE.toml | 40 +- apps/draupnir/.gitignore | 5 + apps/draupnir/REUSE.toml | 64 + apps/draupnir/package.json | 72 + {src => apps/draupnir/src}/Draupnir.ts | 52 +- {src => apps/draupnir/src}/DraupnirBotMode.ts | 18 +- .../draupnir/src}/appservice/AccessControl.ts | 0 .../draupnir/src}/appservice/AppService.ts | 8 +- .../appservice/AppServiceDraupnirManager.ts | 2 +- .../src}/appservice/bot/AccessCommands.tsx | 0 .../bot/AppserviceBotCommandDispatcher.ts | 0 .../bot/AppserviceBotCommandTable.ts | 0 .../appservice/bot/AppserviceBotCommands.ts | 0 .../src}/appservice/bot/AppserviceBotHelp.tsx | 0 .../bot/AppserviceBotInterfaceAdaptor.ts | 0 .../bot/AppserviceBotPrerequisite.ts | 0 .../bot/AppserviceCommandHandler.ts | 0 .../src}/appservice/bot/ListCommand.tsx | 0 {src => apps/draupnir/src}/appservice/cli.ts | 5 +- .../src}/appservice/config/REUSE.toml | 0 .../appservice/config/config.example.yaml | 4 - .../appservice/config/config.harness.yaml | 3 - .../draupnir/src}/appservice/config/config.ts | 12 - .../draupnir/src}/appservice/datastore.ts | 0 .../src}/appservice/postgres/PgDataStore.ts | 17 +- .../src}/appservice/postgres/schema/v1.ts | 0 .../src}/appservice/postgres/schema/v2.ts | 0 .../src}/backingstore/DraupnirStores.ts | 0 .../better-sqlite3/BetterSqliteStore.ts | 0 .../backingstore/better-sqlite3/HashStore.ts | 14 +- .../SqliteRoomStateBackingStore.ts | 2 +- .../better-sqlite3/SqliteSchema.ts | 10 +- .../DraupnirRendererMessageCollector.tsx | 4 +- .../capabilities/RendererMessageCollector.ts | 4 +- .../capabilities/RoomTakedownCapability.tsx | 0 .../RoomTakedownCapabilityRenderer.tsx | 17 +- .../ServerACLConsequencesRenderer.tsx | 21 +- .../StandardEventConsequencesRenderer.tsx | 17 +- .../StandardUserConsequencesRenderer.tsx | 16 +- .../SynapseAdminRoomTakedown.ts | 20 +- .../src}/capabilities/capabilityIndex.ts | 0 .../draupnir/src}/commands/AliasCommands.ts | 0 {src => apps/draupnir/src}/commands/Ban.tsx | 0 .../src}/commands/CreateBanListCommand.ts | 0 .../commands/DraupnirCommandDispatcher.ts | 0 .../commands/DraupnirCommandPrerequisites.ts | 0 .../src}/commands/DraupnirCommandTable.ts | 0 .../src}/commands/DraupnirCommands.ts | 0 {src => apps/draupnir/src}/commands/Help.tsx | 0 .../draupnir/src}/commands/ImportCommand.ts | 22 +- .../draupnir/src}/commands/KickCommand.tsx | 2 +- .../ProtectionsCapabilitiesCommand.tsx | 0 .../src}/commands/ProtectionsCommands.tsx | 0 .../src}/commands/ProtectionsShowCommand.tsx | 0 .../draupnir/src}/commands/RedactCommand.ts | 0 .../draupnir/src}/commands/ResolveAlias.tsx | 0 {src => apps/draupnir/src}/commands/Rooms.tsx | 0 {src => apps/draupnir/src}/commands/Rules.tsx | 0 .../draupnir/src}/commands/SafeModeCommand.ts | 0 .../src}/commands/SetDisplayNameCommand.ts | 18 +- .../src}/commands/SetPowerLevelCommand.ts | 0 .../draupnir/src}/commands/StatusCommand.tsx | 2 +- .../draupnir/src}/commands/WatchPreview.tsx | 0 .../src}/commands/WatchUnwatchCommand.ts | 0 .../server-admin/DeactivateCommand.tsx | 0 .../server-admin/HijackRoomCommand.ts | 0 .../server-admin/ShutdownRoomCommand.ts | 0 .../commands/server-admin/SuspendCommand.tsx | 0 .../src}/commands/server-admin/Takedown.tsx | 0 .../server-admin/UnrestrictCommand.tsx | 0 .../src}/commands/unban/PolicyRemove.tsx | 0 .../draupnir/src}/commands/unban/Unban.tsx | 0 .../src}/commands/unban/UnbanEntity.tsx | 0 .../src}/commands/unban/UnbanUsers.tsx | 0 {src => apps/draupnir/src}/config.ts | 36 +- .../src}/draupnirfactory/DraupnirFactory.ts | 4 +- .../DraupnirProtectedRoomsSet.ts | 0 .../StandardDraupnirManager.ts | 0 {src => apps/draupnir/src}/health/healthz.ts | 2 +- {src => apps/draupnir/src}/index.ts | 11 +- .../managementroom/ManagementRoomDetail.ts | 0 .../managementroom/ManagementRoomOutput.ts | 6 +- .../draupnir/src}/models/RoomUpdateError.tsx | 0 .../src}/protections/BanPropagation.tsx | 0 .../src}/protections/BasicFlooding.ts | 4 +- .../BlockInvitationsOnServerProtection.tsx | 0 .../draupnir/src}/protections/ConfigHooks.ts | 0 .../CapabilitySetProviderMigration.ts | 0 .../DefaultEnabledProtectionsMigration.ts | 0 .../protections/DraupnirNews/DraupnirNews.tsx | 42 +- .../src}/protections/DraupnirNews/news.json | 0 .../DraupnirNews/news.json.license | 0 .../protections/DraupnirProtectionsIndex.ts | 0 .../src}/protections/FirstMessageIsImage.ts | 2 +- .../HomeserverUserPolicyApplication.ts | 0 .../HomeserverUserPolicyProtection.ts | 2 +- .../HomeserverUserPurgingDeactivate.ts | 0 .../SqliteUserRestrictionAuditLog.ts | 0 .../UserRestrictionAuditLog.ts | 0 .../UserRestrictionCapability.ts | 0 .../UserRestrictionCapabilityRenderer.tsx | 26 +- .../UserSuspensionCapability.ts | 4 +- .../deactivateUser.ts | 0 .../protections/InvalidEventProtection.tsx | 2 +- .../src}/protections/JoinWaveShortCircuit.tsx | 2 +- .../MembershipChangeProtection.tsx | 16 +- .../protections/MentionLimitProtection.tsx | 2 +- .../src}/protections/MessageIsMedia.ts | 2 +- .../src}/protections/MessageIsVoice.ts | 2 +- .../MissingProtectionPermissions.tsx | 0 .../src}/protections/NewJoinerProtection.ts | 2 +- .../NotificationRoom/NotificationRoom.ts | 4 +- .../protections/PolicyChangeNotification.tsx | 0 .../ProtectedRooms/ProtectJoinedRooms.tsx | 0 .../ProtectReplacementRooms.tsx | 0 .../RoomsSetBehaviourProtection.tsx | 61 +- .../ProtectedRooms/UnprotectPartedRooms.tsx | 0 .../WatchReplacementPolicyRooms.tsx | 0 .../ProtectedRoomsSetRenderers.tsx | 0 .../draupnir/src}/protections/Protection.ts | 5 +- .../protections/RedactionSynchronisation.ts | 4 +- .../RoomTakedown/DiscoveredRoomStore.ts | 0 .../protections/RoomTakedown/RoomAuditLog.ts | 0 .../protections/RoomTakedown/RoomDiscovery.ts | 0 .../RoomTakedown/RoomDiscoveryRenderer.tsx | 0 .../protections/RoomTakedown/RoomTakedown.ts | 0 .../RoomTakedown/RoomTakedownProtection.ts | 2 +- .../RoomTakedown/SqliteRoomAuditLog.ts | 0 .../RoomTakedown/SynapseAdminRoomDetails.ts | 0 .../SynapseHTTPAntispamRoomExplorer.ts | 2 +- .../SynapseRoomListRoomExplorerer.ts | 9 +- .../src}/protections/TrustedReporters.ts | 0 .../draupnir/src}/protections/WordList.ts | 4 +- .../JoinRoomsOnInviteProtection.tsx | 18 +- .../invitation/ProtectRoomsOnInvite.tsx | 0 .../invitation/WatchRoomsOnInvite.tsx | 0 .../src}/protections/invitation/inviteCore.ts | 2 +- .../src}/queues/EventRedactionQueue.ts | 19 +- .../draupnir/src}/queues/LeakyBucket.ts | 0 .../queues/ProtectedRoomActivityTracker.ts | 0 .../draupnir/src}/queues/ThrottlingQueue.ts | 2 +- .../src}/queues/TimelineRedactionQueue.ts | 0 .../src}/queues/UnlistedUserRedactionQueue.ts | 2 +- .../draupnir/src}/report/ReportManager.ts | 88 +- .../draupnir/src}/report/ReportPoller.ts | 76 +- .../draupnir/src}/safemode/BootOption.ts | 0 .../src}/safemode/DraupnirSafeMode.ts | 25 +- .../draupnir/src}/safemode/ManagementRoom.ts | 0 .../src}/safemode/PersistentConfigEditor.ts | 0 .../safemode/PersistentConfigRenderer.tsx | 0 .../src}/safemode/RecoveryOptions.tsx | 0 .../draupnir/src}/safemode/SafeModeCause.ts | 0 .../safemode/SafeModeCommandDispatcher.ts | 0 .../draupnir/src}/safemode/SafeModeToggle.ts | 0 .../src}/safemode/commands/HelpCommand.tsx | 0 .../src}/safemode/commands/RecoverCommand.tsx | 0 .../commands/RestartDraupnirCommand.ts | 0 .../src}/safemode/commands/SafeModeAdaptor.ts | 0 .../safemode/commands/SafeModeCommands.tsx | 0 .../src}/safemode/commands/StatusCommand.tsx | 2 +- {src => apps/draupnir/src}/utils.ts | 61 +- .../CheckEventForSpamEndpoint.ts | 0 .../SynapseHTTPAntispam/PingEndpoint.ts | 0 .../SpamCheckEndpointPluginManager.ts | 0 .../SynapseHttpAntispam.ts | 0 .../UserMayInviteEndpoint.ts | 0 .../UserMayJoinRoomEndpoint.ts | 0 {src => apps/draupnir/src}/webapis/WebAPIs.ts | 10 +- .../integration/listUnstartedDraupnirTest.ts | 0 .../appservice/integration/provisionTest.ts | 12 +- .../integration/safeModeRecoverTest.ts | 0 .../integration/safeModeToggleTest.ts | 0 .../test}/appservice/utils/ProvisionHelper.ts | 0 .../test}/appservice/utils/harness.ts | 2 +- .../draupnir/test}/draupnir_news.json | 0 .../draupnir/test}/draupnir_news.json.license | 0 .../test}/integration/abuseReportTest.ts | 240 +- .../test}/integration/banPropagationTest.ts | 2 +- .../test}/integration/clientHelper.ts | 59 +- .../integration/commands/commandUtils.ts | 18 +- .../commands/hijackRoomCommandTest.ts | 15 +- .../commands/recoverCommandDetail.ts | 0 .../commands/recoverCommandTest.ts | 0 .../integration/commands/redactCommandTest.ts | 12 +- .../test}/integration/commands/roomsTest.ts | 4 +- .../commands/shutdownCommandTest.ts | 12 +- .../test}/integration/commands/unbanTest.ts | 2 +- .../draupnir/test}/integration/fixtures.ts | 3 +- .../draupnir/test}/integration/helloTest.ts | 6 +- .../test}/integration/httpAntispamTest.ts | 2 +- .../test}/integration/manualLaunchScript.ts | 0 .../test}/integration/mjolnirSetupUtils.ts | 44 +- .../BlockInvitationsOnServerTest.ts | 2 +- .../protections/JoinRoomsOnInviteTest.ts | 2 +- .../protections/RoomTakedownProtectionTest.ts | 0 .../test}/integration/reportPollingTest.ts | 12 +- .../test}/integration/throttleQueueTest.ts | 16 +- .../test}/integration/throttleTest.ts | 3 +- .../integration/timelinePaginationTest.ts | 9 +- .../draupnir/test}/integration/utilsTest.ts | 15 +- {test => apps/draupnir/test}/nginx.conf | 0 {test => apps/draupnir/test}/tsnode.cjs | 0 .../test}/unit/commands/BanCommandTest.ts | 0 .../test}/unit/commands/KickCommandTest.ts | 2 +- .../test}/unit/commands/UnbanCommandTest.ts | 0 .../unit/commands/WatchUnwatchCommandTest.ts | 0 .../unit/config/unknownPropertiesTest.ts | 0 .../unit/protections/DraupnirNewsTest.ts | 0 .../protections/MentionLimitProtectionTest.ts | 0 .../RedactionSynchronisationTest.ts | 0 .../protections/RoomTakedownServiceTest.ts | 0 ...rBanSynchronisationCapabilityRenameTest.ts | 0 .../test}/unit/stores/hashStoreTest.ts | 0 .../test}/unit/stores/roomAuditLogTest.ts | 0 .../unit/stores/roomStateBackingStoreTest.ts | 7 +- .../stores/userRestrictionAuditLogTest.ts | 0 apps/draupnir/tsconfig.json | 13 + apps/draupnir/tsconfig.test.json | 9 + draupnir-entrypoint.sh | 4 +- eslint.config.mjs | 163 +- mx-tester.yml | 14 +- package-lock.json | 18655 ++++++++++++++++ package.json | 103 +- packages/interface-manager/CHANGELOG.md | 219 + packages/interface-manager/README.md | 97 + packages/interface-manager/REUSE.toml | 34 + packages/interface-manager/jest.config.cjs | 9 + packages/interface-manager/package.json | 31 + ...daptorContextToCommandContextTranslator.ts | 79 + .../src/Adaptor/CommandDispatcher.test.ts | 64 + .../src/Adaptor/CommandDispatcher.ts | 195 + .../src/Adaptor/CommandInvoker.ts | 26 + .../src/Adaptor/CommandInvokerCallbacks.ts | 42 + .../src/Adaptor/StandardCommandInvoker.ts | 71 + .../interface-manager/src/Adaptor/index.ts | 14 + .../interface-manager/src/Command/Command.ts | 67 + .../src/Command/CommandDescription.ts | 59 + .../src/Command/CommandExecutorHelper.ts | 158 + .../src/Command/CommandMeta.ts | 39 + .../src/Command/CommandTable.test.ts | 37 + .../src/Command/CommandTable.ts | 289 + .../interface-manager/src/Command/Keyword.ts | 22 + .../Command/KeywordParameterDescription.ts | 252 + .../src/Command/ParameterDescription.ts | 34 + .../src/Command/ParameterParsing.ts | 250 + .../src/Command/ParseErrors.ts | 90 + .../src/Command/ParsedKeywords.ts | 83 + .../src/Command/Presentation.ts | 79 + .../src/Command/PresentationSchema.ts | 184 + .../src/Command/PresentationStream.ts | 40 + .../src/Command/PresentationTypeTranslator.ts | 28 + .../src/Command/PromptForAccept.ts | 48 + .../src/Command/RestParameterDescription.ts | 148 + .../src/Command/describeCommand.test.ts | 204 + .../src/Command/describeCommand.ts | 80 + .../interface-manager/src/Command/index.ts | 22 + .../src/DeadDocument/DeadDocument.ts | 504 + .../src/DeadDocument/DeadDocumentHTML.ts | 171 + .../src/DeadDocument/DeadDocumentMarkdown.ts | 231 + .../src/DeadDocument/DeadDocumentMatrix.ts | 120 + .../src/DeadDocument/JSXFactory.ts | 91 + .../src/DeadDocument/PagedDuplexStream.ts | 102 + .../src/DeadDocument/escapeHTML.ts | 10 + .../src/DeadDocument/index.ts | 10 + .../DefaultRenderers.tsx | 28 + .../MatrixInterfaceAdaptor.ts | 463 + .../MatrixInterfaceCommandDispatcher.ts | 131 + .../MatrixRendererDescription.ts | 57 + .../src/MatrixInterfaceAdaptor/index.ts | 7 + .../JSInterfaceCommandDispatcher.ts | 118 + .../StandardCommandDispatcher.test.ts | 43 + .../TextReader/StandardCommandDispatcher.ts | 95 + .../src/TextReader/TextCommandReader.test.ts | 141 + .../src/TextReader/TextCommandReader.ts | 372 + .../TextReader/TextPresentationRenderer.ts | 73 + .../src/TextReader/TextPresentationTypes.ts | 207 + .../src/TextReader/TextTranslators.test.ts | 67 + .../src/TextReader/TextTranslators.ts | 65 + .../interface-manager/src/TextReader/index.ts | 10 + packages/interface-manager/src/index.ts | 9 + packages/interface-manager/tsconfig.json | 13 + packages/interface-manager/tsconfig.test.json | 7 + packages/matrix-basic-types/CHANGELOG.md | 76 + packages/matrix-basic-types/README.md | 27 + packages/matrix-basic-types/REUSE.toml | 34 + packages/matrix-basic-types/jest.config.cjs | 9 + packages/matrix-basic-types/package.json | 33 + .../src/MatrixReference/MatrixGlob.ts | 48 + .../MatrixReference/MatrixRoomReference.ts | 243 + .../src/MatrixReference/MatrixUserID.ts | 47 + .../src/MatrixReference/Permalinks.test.ts | 30 + .../src/MatrixReference/Permalinks.ts | 169 + .../src/MatrixReference/index.ts | 13 + .../src/StringlyTypedMatrix/StringEventID.ts | 26 + .../StringlyTypedMatrix/StringRoomAlias.ts | 50 + .../src/StringlyTypedMatrix/StringRoomID.ts | 28 + .../StringlyTypedMatrix/StringServerName.ts | 36 + .../src/StringlyTypedMatrix/StringUserID.ts | 50 + .../StringlyTypedMatrix.test.ts | 57 + .../src/StringlyTypedMatrix/index.ts | 14 + packages/matrix-basic-types/src/index.ts | 11 + packages/matrix-basic-types/tsconfig.json | 11 + .../matrix-basic-types/tsconfig.test.json | 7 + .../CHANGELOG.md | 233 + .../README.md | 8 + .../REUSE.toml | 52 + .../jest.config.js | 8 + .../package.json | 45 + .../src/Client/BotSDKAllClient.ts | 39 + .../src/Client/BotSDKBaseClient.ts | 535 + .../src/Client/BotSDKClientPlatform.ts | 80 + .../ClientCapabilityFactory.ts | 41 + .../src/ClientManagement/ClientManagement.ts | 41 + .../src/ClientManagement/JoinedRoomsSafe.ts | 31 + .../RoomStateManagerFactory.ts | 358 + .../src/ClientManagement/RoomStateRefresh.ts | 38 + .../src/Interface/MatrixData.ts | 171 + .../src/Logging/BotSDKLogging.ts | 25 + .../src/MatrixEmitter.ts | 188 + .../src/PolicyList/PolicyListManager.ts | 208 + .../Protection/MjolnirProtectedRoomsStore.ts | 54 + .../MjolnirWatchedPolicyRoomsStore.ts | 56 + .../src/SafeMatrixClient.ts | 46 + .../StateTracking/RoomMembershipManager.ts | 99 + .../src/SynapseAdmin/BlockStatusEndpoint.ts | 19 + .../src/SynapseAdmin/RoomDetailsEndpoint.ts | 169 + .../src/SynapseAdmin/RoomListEndpoint.ts | 74 + .../src/SynapseAdmin/ShutdownV2Endpoint.ts | 51 + .../src/SynapseAdmin/SynapseAdminClient.ts | 336 + .../src/SynapseAdmin/UserDetailsEndpoint.ts | 57 + .../src/SynapseAdmin/UserRedactionEndpoint.ts | 33 + .../src/index.ts | 29 + .../tsconfig.json | 11 + .../tsconfig.test.json | 7 + .../typedoc.json | 8 + packages/matrix-protection-suite/.gitignore | 6 + packages/matrix-protection-suite/CHANGELOG.md | 17 + packages/matrix-protection-suite/NOTICE | 22 + packages/matrix-protection-suite/README.md | 22 + packages/matrix-protection-suite/REUSE.toml | 52 + .../matrix-protection-suite/jest.config.js | 12 + packages/matrix-protection-suite/package.json | 48 + .../src/Client/ClientCapabilityNegotiation.ts | 102 + .../src/Client/ClientPlatform.ts | 53 + .../src/Client/DummyClientPlatform.ts | 38 + .../src/Client/Pagination/MatrixPaginator.ts | 20 + .../src/Client/Pagination/PaginationChunk.ts | 17 + .../Client/Pagination/PaginationIteration.ts | 20 + .../Client/Pagination/PaginationOptions.ts | 15 + .../Client/Pagination/PaginationSession.ts | 14 + .../src/Client/Pagination/PaginationToken.ts | 29 + .../Pagination/StandardPaginationIterator.ts | 68 + .../src/Client/PowerLevelsMirror.test.ts | 34 + .../src/Client/PowerLevelsMirror.ts | 224 + .../src/Client/RoomBanner.ts | 18 + .../src/Client/RoomCreator.ts | 11 + .../src/Client/RoomEventFilter.ts | 24 + .../src/Client/RoomEventGetter.ts | 22 + .../src/Client/RoomEventRedacter.ts | 18 + .../src/Client/RoomEventRelations.ts | 42 + .../src/Client/RoomInviter.ts | 18 + .../src/Client/RoomJoiner.ts | 27 + .../src/Client/RoomKicker.ts | 18 + .../src/Client/RoomMessageSender.ts | 17 + .../src/Client/RoomMessages.ts | 37 + .../src/Client/RoomReactionSender.ts | 17 + .../src/Client/RoomResolver.ts | 17 + .../src/Client/RoomStateEventSender.ts | 19 + .../src/Client/RoomStateGetter.ts | 20 + .../src/Client/RoomUnbanner.ts | 18 + .../src/ClientManagement/Client.ts | 33 + .../src/ClientManagement/ClientRooms.ts | 95 + .../src/ClientManagement/ClientsInRoomMap.ts | 192 + .../ClientManagement/ConstantPeriodBatch.ts | 28 + .../ClientManagement/JoinedRoomsRevision.ts | 69 + .../src/ClientManagement/RoomEventAcivity.ts | 51 + .../src/ClientManagement/RoomPauser.ts | 97 + .../ClientManagement/StandardClientRooms.ts | 203 + .../src/ClientManagement/TimedGate.ts | 109 + .../src/Config/ConfigDescription.ts | 114 + .../src/Config/ConfigMirror.ts | 233 + .../src/Config/ConfigParseError.ts | 150 + .../src/Config/PersistentConfigData.ts | 232 + .../src/Config/describeConfig.test.ts | 101 + .../src/Config/describeConfig.ts | 19 + .../src/Interface/Action.ts | 18 + .../src/Interface/ActionException.ts | 103 + .../src/Interface/Deduplicator.ts | 43 + .../src/Interface/FakePersistentMatrixData.ts | 41 + .../src/Interface/InternedInstanceFactory.ts | 95 + .../src/Interface/KeyedBatchQueue.ts | 101 + .../src/Interface/Lifetime.ts | 268 + .../src/Interface/LoggableConfig.ts | 27 + .../src/Interface/MatrixException.ts | 41 + .../src/Interface/MultipleErrors.ts | 21 + .../src/Interface/PersistentMatrixData.ts | 21 + .../src/Interface/RoomUpdateError.ts | 98 + .../src/Interface/SchemedMatrixData.ts | 65 + .../src/Interface/SemanticType.ts | 83 + .../src/Interface/SimpleChangeType.ts | 18 + .../src/Interface/Static.ts | 9 + .../src/Interface/Task.ts | 75 + .../src/Interface/Value.ts | 117 + .../src/Logging/Logger.ts | 76 + .../src/MatrixTypes/CreateRoom.ts | 230 + .../src/MatrixTypes/DefaultEventDecoder.ts | 60 + .../src/MatrixTypes/EventDecoder.test.ts | 89 + .../src/MatrixTypes/EventDecoder.ts | 112 + .../src/MatrixTypes/Events.ts | 104 + .../src/MatrixTypes/JoinRules.ts | 54 + .../src/MatrixTypes/MembershipEvent.ts | 108 + .../src/MatrixTypes/PermalinkSchema.test.ts | 43 + .../src/MatrixTypes/PermalinkSchema.ts | 96 + .../src/MatrixTypes/PolicyEvents.ts | 202 + .../src/MatrixTypes/PowerLevels.ts | 89 + .../src/MatrixTypes/ReactionEvent.ts | 40 + .../src/MatrixTypes/Redaction.ts | 48 + .../src/MatrixTypes/RoomMessage.ts | 239 + .../src/MatrixTypes/ServerACL.ts | 46 + .../src/MatrixTypes/ServerACLBuilder.ts | 121 + .../src/MatrixTypes/StringlyTypedMatrix.ts | 40 + .../src/MatrixTypes/SynapseAdmin/APIBodies.ts | 76 + .../src/MatrixTypes/SynapseReport.ts | 40 + .../src/MatrixTypes/Tombstone.ts | 36 + .../Membership/FakeRoomMembershipManager.ts | 77 + .../FakeRoomMembershipRevisionIssuer.ts | 62 + .../src/Membership/MembershipChange.test.ts | 280 + .../src/Membership/MembershipChange.ts | 184 + .../src/Membership/MembershipRevision.ts | 65 + .../Membership/MembershipRevisionIssuer.ts | 55 + .../src/Membership/RoomMembershipManager.ts | 21 + .../RoomStateMembershipRevisionIssuer.ts | 71 + .../src/Membership/SetMembershipRevision.ts | 249 + .../SetMembershipRevisionIssuer.test.ts | 123 + .../Membership/SetMembershipRevisionIssuer.ts | 101 + .../src/Membership/SetRoomMembership.ts | 68 + .../StandardRoomMembershipRevision.test.ts | 26 + .../StandardRoomMembershipRevision.ts | 191 + .../StandardRoomMembershipRevisionIssuer.ts | 88 + .../Membership/StandardSetRoomMembership.ts | 124 + .../MembershipPolicyRevision.ts | 68 + .../SetMembershipPolicyRevisionIssuer.test.ts | 382 + .../SetMembershipPolicyRevisionIssuer.ts | 117 + .../StandardSetMembershipPolicyRevision.ts | 344 + .../FakePolicyRoomRevisionIssuer.ts | 56 + .../src/PolicyList/PolicyListRevision.ts | 160 + .../PolicyList/PolicyListRevisionIssuer.ts | 76 + .../src/PolicyList/PolicyRoomEditor.ts | 102 + .../src/PolicyList/PolicyRoomManger.ts | 67 + .../src/PolicyList/PolicyRule.ts | 189 + .../src/PolicyList/PolicyRuleChange.ts | 52 + .../src/PolicyList/PolicyRuleEventBuilder.ts | 96 + .../src/PolicyList/Revision.ts | 46 + .../RoomStatePolicyListRevisionIssuer.ts | 126 + .../PolicyList/StandardPolicyListRevision.ts | 568 + .../PolicyList/StandardPolicyRoomEditor.ts | 222 + .../PolicyList/StandardPolicyRoomRevision.ts | 537 + .../StandardPolicyRoomRevisionIssuer.ts | 176 + .../src/Projection/ListMultiMap.ts | 102 + .../src/Projection/Projection.ts | 101 + .../src/Projection/ProjectionNode.ts | 56 + .../src/Protection/AccessControl.ts | 131 + .../Capability/CapabilityContextGlue.ts | 59 + .../Capability/CapabilityInterface.ts | 58 + .../Capability/CapabilityProvider.ts | 156 + .../Capability/CapabilityRenderer.ts | 126 + .../Protection/Capability/CapabilitySet.ts | 76 + .../CapabilityMethodSchema.ts | 7 + .../StandardCapability/EventConsequences.ts | 34 + .../StandardCapability/RoomSetResult.test.ts | 34 + .../StandardCapability/RoomSetResult.ts | 95 + .../SimulatedEventConsequences.ts | 55 + .../SimulatedUserConsequences.ts | 92 + .../StandardEventConsequences.ts | 50 + .../StandardUserConsequences.ts | 175 + .../StandardCapability/UserConsequences.ts | 78 + .../src/Protection/DescriptionMeta.ts | 8 + ...rectPropagationPolicyListRevisionIssuer.ts | 138 + .../HandleRegistry/HandleDescription.ts | 97 + .../HandleRegistry/HandleRegistry.ts | 252 + .../HandleRegistryDescription.ts | 88 + .../StandardHandleRegistery.test.ts | 20 + .../HandleRegistry/StandardHandleRegistry.ts | 108 + .../StandardHandleRegistryDescription.ts | 50 + .../MjolnirPolicyRoomsConfig.test.ts | 60 + .../MjolnirPolicyRoomsConfig.ts | 148 + .../MjolnirPolicyRoomsDescription.ts | 28 + .../MjolnirWatchedListsEvent.ts | 24 + .../PolicyListConfig/PolicyListConfig.ts | 34 + .../FakeProtectedRoomsConfig.ts | 49 + .../MjolnirProtectedRoomsDescription.ts | 29 + .../MjolnirProtectedRoomsEvent.ts | 24 + .../ProtectedRoomsConfig.ts | 170 + .../ProtectedRoomsManager.ts | 40 + .../StandardProtectedRoomsManager.ts | 203 + .../src/Protection/ProtectedRoomsSet.ts | 414 + .../src/Protection/Protection.ts | 366 + .../src/Protection/ProtectionHandles.test.ts | 105 + .../src/Protection/ProtectionHandles.ts | 54 + .../FakeProtectionsConfig.ts | 25 + .../MjolnirEnabledProtectionsDescription.ts | 26 + .../MjolnirEnabledProtectionsEvent.ts | 49 + .../ProtectionCapabilityProviderSetConfig.ts | 25 + ...rdProtectionCapabilityProviderSetConfig.ts | 145 + .../MjolnirProtectionSettingsConfig.ts | 68 + .../ProtectionSettingsConfig.ts | 21 + .../ProtectionsConfig/ProtectionsConfig.ts | 47 + .../StandardProtectionsConfig.test.ts | 61 + .../StandardProtectionsConfig.ts | 228 + .../FakeProtectionsManager.ts | 26 + .../ProtectionsManager/ProtectionsManager.ts | 158 + .../StandardProtectionsManager.ts | 429 + .../MemberBanIntentProjection.ts | 58 + .../MemberBanIntentProjectionNode.ts | 207 + .../MemberBanSynchronisation.test.ts | 208 + .../MemberBanSynchronisation.ts | 215 + .../PolicyListBridgeProjection.ts | 18 + ...ServerACLSynchronisationCapability.test.ts | 64 + .../ServerACLSynchronisationCapability.ts | 226 + .../ServerBanIntentProjection.ts | 52 + .../ServerBanIntentProjectionNode.ts | 183 + .../ServerBanSynchronisation.ts | 149 + .../ServerBanSynchronisationCapability.ts | 41 + ...latedServerBanSynchronisationCapability.ts | 62 + .../HashReverser/Reversal.ts | 37 + .../HashReverser/SHA256HashReverser.ts | 262 + .../StandardWatchedPolicyRooms.ts | 149 + .../WatchedPolicyRooms/WatchedPolicyRooms.ts | 28 + .../src/Reporting/EventReport.ts | 19 + .../EventMixinDescription.ts | 47 + .../EventMixinExtraction.ts | 49 + .../StandardMixinExtractor.ts | 113 + .../DefaultMixinExtractor.test.ts | 47 + .../DefaultMixinExtractor.ts | 29 + .../ExtensibleTextMixin.ts | 59 + .../MentionsMixin.ts | 60 + .../NewContentMixin.ts | 46 + .../RoomMessageBodyMixin.ts | 45 + .../RoomMessageFileMixin.ts | 62 + .../RoomMessageFormatedBodyMixin.ts | 49 + .../RoomMessageMediaURLMixin.ts | 46 + .../RoomMessageThumbnailURLMixin.ts | 46 + .../SafeMembershipEvent.test.ts | 42 + .../SafeMatrixEvents/SafeMembershipEvent.ts | 123 + .../UndecodableEventContent.ts | 45 + .../src/SafeMatrixEvents/UnsafeEvent.ts | 10 + .../src/SafeMatrixEvents/hasOwn.ts | 18 + .../src/StateTracking/DeclareRoomState.ts | 377 + .../src/StateTracking/EventBatch.ts | 153 + .../StateTracking/FakePolicyRoomManager.ts | 100 + .../src/StateTracking/FakeRoomStateManager.ts | 81 + .../FakeRoomStateRevisionIssuer.ts | 61 + .../StateTracking/RoomStateBackingStore.ts | 47 + .../src/StateTracking/SetRoomState.ts | 55 + .../StandardRoomStateRevision.ts | 151 + .../StandardRoomStateRevisionIssuer.ts | 130 + .../src/StateTracking/StandardSetRoomState.ts | 106 + .../src/StateTracking/StateChangeType.test.ts | 213 + .../src/StateTracking/StateChangeType.ts | 138 + .../src/StateTracking/StateRevisionIssuer.ts | 105 + .../src/TestUtilities/EventGeneration.ts | 116 + packages/matrix-protection-suite/src/index.ts | 224 + .../matrix-protection-suite/tsconfig.json | 11 + .../tsconfig.test.json | 7 + packages/matrix-protection-suite/typedoc.json | 8 + packages/mps-interface-adaptor/CHANGELOG.md | 72 + packages/mps-interface-adaptor/REUSE.toml | 40 + packages/mps-interface-adaptor/package.json | 34 + .../MPSInterfaceAdaptor/CommonRenderers.tsx | 226 + .../MPSMatrixInterfaceAdaptor.ts | 229 + .../MatrixHelpRenderer.tsx | 408 + .../MatrixPromptForAccept.tsx | 240 + .../MatrixPromptForConfirmation.tsx | 175 + .../MatrixReactionHandler.ts | 307 + .../src/MPSInterfaceAdaptor/index.ts | 10 + .../src/MPSInterfaceAdaptor/replyNotice.ts | 32 + packages/mps-interface-adaptor/src/index.ts | 5 + packages/mps-interface-adaptor/tsconfig.json | 13 + .../mps-interface-adaptor/tsconfig.test.json | 7 + packages/tsconfig/CHANGELOG.md | 17 + packages/tsconfig/REUSE.toml | 28 + packages/tsconfig/package.json | 19 + packages/tsconfig/src/eslint9.mjs | 80 + packages/tsconfig/src/index.js | 5 + src/appservice/Api.ts | 267 - test/appservice/integration/webAPITest.ts | 89 - test/appservice/utils/webAPIClient.ts | 82 - test/scripts/memberQueryTest.ts | 127 - test/tsconfig.json | 7 - tsconfig.all.json | 17 + tsconfig.base.json | 26 + tsconfig.json | 33 +- yarn.lock | 4118 ---- 604 files changed, 53819 insertions(+), 5486 deletions(-) create mode 100644 .prettierignore create mode 100644 DEPENDENCIES.md create mode 100644 LICENSES/0BSD.txt create mode 100644 LICENSES/MIT.txt create mode 100644 apps/draupnir/.gitignore create mode 100644 apps/draupnir/REUSE.toml create mode 100644 apps/draupnir/package.json rename {src => apps/draupnir/src}/Draupnir.ts (92%) rename {src => apps/draupnir/src}/DraupnirBotMode.ts (96%) rename {src => apps/draupnir/src}/appservice/AccessControl.ts (100%) rename {src => apps/draupnir/src}/appservice/AppService.ts (98%) rename {src => apps/draupnir/src}/appservice/AppServiceDraupnirManager.ts (99%) rename {src => apps/draupnir/src}/appservice/bot/AccessCommands.tsx (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceBotCommandDispatcher.ts (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceBotCommandTable.ts (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceBotCommands.ts (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceBotHelp.tsx (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceBotInterfaceAdaptor.ts (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceBotPrerequisite.ts (100%) rename {src => apps/draupnir/src}/appservice/bot/AppserviceCommandHandler.ts (100%) rename {src => apps/draupnir/src}/appservice/bot/ListCommand.tsx (100%) rename {src => apps/draupnir/src}/appservice/cli.ts (91%) rename {src => apps/draupnir/src}/appservice/config/REUSE.toml (100%) rename {src => apps/draupnir/src}/appservice/config/config.example.yaml (86%) rename {src => apps/draupnir/src}/appservice/config/config.harness.yaml (94%) rename {src => apps/draupnir/src}/appservice/config/config.ts (91%) rename {src => apps/draupnir/src}/appservice/datastore.ts (100%) rename {src => apps/draupnir/src}/appservice/postgres/PgDataStore.ts (76%) rename {src => apps/draupnir/src}/appservice/postgres/schema/v1.ts (100%) rename {src => apps/draupnir/src}/appservice/postgres/schema/v2.ts (100%) rename {src => apps/draupnir/src}/backingstore/DraupnirStores.ts (100%) rename {src => apps/draupnir/src}/backingstore/better-sqlite3/BetterSqliteStore.ts (100%) rename {src => apps/draupnir/src}/backingstore/better-sqlite3/HashStore.ts (96%) rename {src => apps/draupnir/src}/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts (99%) rename {src => apps/draupnir/src}/backingstore/better-sqlite3/SqliteSchema.ts (95%) rename {src => apps/draupnir/src}/capabilities/DraupnirRendererMessageCollector.tsx (94%) rename {src => apps/draupnir/src}/capabilities/RendererMessageCollector.ts (94%) rename {src => apps/draupnir/src}/capabilities/RoomTakedownCapability.tsx (100%) rename {src => apps/draupnir/src}/capabilities/RoomTakedownCapabilityRenderer.tsx (92%) rename {src => apps/draupnir/src}/capabilities/ServerACLConsequencesRenderer.tsx (91%) rename {src => apps/draupnir/src}/capabilities/StandardEventConsequencesRenderer.tsx (90%) rename {src => apps/draupnir/src}/capabilities/StandardUserConsequencesRenderer.tsx (96%) rename {src => apps/draupnir/src}/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts (92%) rename {src => apps/draupnir/src}/capabilities/capabilityIndex.ts (100%) rename {src => apps/draupnir/src}/commands/AliasCommands.ts (100%) rename {src => apps/draupnir/src}/commands/Ban.tsx (100%) rename {src => apps/draupnir/src}/commands/CreateBanListCommand.ts (100%) rename {src => apps/draupnir/src}/commands/DraupnirCommandDispatcher.ts (100%) rename {src => apps/draupnir/src}/commands/DraupnirCommandPrerequisites.ts (100%) rename {src => apps/draupnir/src}/commands/DraupnirCommandTable.ts (100%) rename {src => apps/draupnir/src}/commands/DraupnirCommands.ts (100%) rename {src => apps/draupnir/src}/commands/Help.tsx (100%) rename {src => apps/draupnir/src}/commands/ImportCommand.ts (87%) rename {src => apps/draupnir/src}/commands/KickCommand.tsx (99%) rename {src => apps/draupnir/src}/commands/ProtectionsCapabilitiesCommand.tsx (100%) rename {src => apps/draupnir/src}/commands/ProtectionsCommands.tsx (100%) rename {src => apps/draupnir/src}/commands/ProtectionsShowCommand.tsx (100%) rename {src => apps/draupnir/src}/commands/RedactCommand.ts (100%) rename {src => apps/draupnir/src}/commands/ResolveAlias.tsx (100%) rename {src => apps/draupnir/src}/commands/Rooms.tsx (100%) rename {src => apps/draupnir/src}/commands/Rules.tsx (100%) rename {src => apps/draupnir/src}/commands/SafeModeCommand.ts (100%) rename {src => apps/draupnir/src}/commands/SetDisplayNameCommand.ts (64%) rename {src => apps/draupnir/src}/commands/SetPowerLevelCommand.ts (100%) rename {src => apps/draupnir/src}/commands/StatusCommand.tsx (98%) rename {src => apps/draupnir/src}/commands/WatchPreview.tsx (100%) rename {src => apps/draupnir/src}/commands/WatchUnwatchCommand.ts (100%) rename {src => apps/draupnir/src}/commands/server-admin/DeactivateCommand.tsx (100%) rename {src => apps/draupnir/src}/commands/server-admin/HijackRoomCommand.ts (100%) rename {src => apps/draupnir/src}/commands/server-admin/ShutdownRoomCommand.ts (100%) rename {src => apps/draupnir/src}/commands/server-admin/SuspendCommand.tsx (100%) rename {src => apps/draupnir/src}/commands/server-admin/Takedown.tsx (100%) rename {src => apps/draupnir/src}/commands/server-admin/UnrestrictCommand.tsx (100%) rename {src => apps/draupnir/src}/commands/unban/PolicyRemove.tsx (100%) rename {src => apps/draupnir/src}/commands/unban/Unban.tsx (100%) rename {src => apps/draupnir/src}/commands/unban/UnbanEntity.tsx (100%) rename {src => apps/draupnir/src}/commands/unban/UnbanUsers.tsx (100%) rename {src => apps/draupnir/src}/config.ts (95%) rename {src => apps/draupnir/src}/draupnirfactory/DraupnirFactory.ts (97%) rename {src => apps/draupnir/src}/draupnirfactory/DraupnirProtectedRoomsSet.ts (100%) rename {src => apps/draupnir/src}/draupnirfactory/StandardDraupnirManager.ts (100%) rename {src => apps/draupnir/src}/health/healthz.ts (96%) rename {src => apps/draupnir/src}/index.ts (95%) rename {src => apps/draupnir/src}/managementroom/ManagementRoomDetail.ts (100%) rename {src => apps/draupnir/src}/managementroom/ManagementRoomOutput.ts (98%) rename {src => apps/draupnir/src}/models/RoomUpdateError.tsx (100%) rename {src => apps/draupnir/src}/protections/BanPropagation.tsx (100%) rename {src => apps/draupnir/src}/protections/BasicFlooding.ts (98%) rename {src => apps/draupnir/src}/protections/BlockInvitationsOnServerProtection.tsx (100%) rename {src => apps/draupnir/src}/protections/ConfigHooks.ts (100%) rename {src => apps/draupnir/src}/protections/ConfigMigration/CapabilitySetProviderMigration.ts (100%) rename {src => apps/draupnir/src}/protections/ConfigMigration/DefaultEnabledProtectionsMigration.ts (100%) rename {src => apps/draupnir/src}/protections/DraupnirNews/DraupnirNews.tsx (91%) rename {src => apps/draupnir/src}/protections/DraupnirNews/news.json (100%) rename {src => apps/draupnir/src}/protections/DraupnirNews/news.json.license (100%) rename {src => apps/draupnir/src}/protections/DraupnirProtectionsIndex.ts (100%) rename {src => apps/draupnir/src}/protections/FirstMessageIsImage.ts (98%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyApplication.ts (100%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts (98%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/HomeserverUserPurgingDeactivate.ts (100%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/SqliteUserRestrictionAuditLog.ts (100%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/UserRestrictionAuditLog.ts (100%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/UserRestrictionCapability.ts (100%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx (90%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts (97%) rename {src => apps/draupnir/src}/protections/HomeserverUserPolicyApplication/deactivateUser.ts (100%) rename {src => apps/draupnir/src}/protections/InvalidEventProtection.tsx (99%) rename {src => apps/draupnir/src}/protections/JoinWaveShortCircuit.tsx (99%) rename {src => apps/draupnir/src}/protections/MembershipChangeProtection.tsx (95%) rename {src => apps/draupnir/src}/protections/MentionLimitProtection.tsx (99%) rename {src => apps/draupnir/src}/protections/MessageIsMedia.ts (98%) rename {src => apps/draupnir/src}/protections/MessageIsVoice.ts (98%) rename {src => apps/draupnir/src}/protections/MissingProtectionPermissions.tsx (100%) rename {src => apps/draupnir/src}/protections/NewJoinerProtection.ts (99%) rename {src => apps/draupnir/src}/protections/NotificationRoom/NotificationRoom.ts (98%) rename {src => apps/draupnir/src}/protections/PolicyChangeNotification.tsx (100%) rename {src => apps/draupnir/src}/protections/ProtectedRooms/ProtectJoinedRooms.tsx (100%) rename {src => apps/draupnir/src}/protections/ProtectedRooms/ProtectReplacementRooms.tsx (100%) rename {src => apps/draupnir/src}/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx (77%) rename {src => apps/draupnir/src}/protections/ProtectedRooms/UnprotectPartedRooms.tsx (100%) rename {src => apps/draupnir/src}/protections/ProtectedRooms/WatchReplacementPolicyRooms.tsx (100%) rename {src => apps/draupnir/src}/protections/ProtectedRoomsSetRenderers.tsx (100%) rename {src => apps/draupnir/src}/protections/Protection.ts (76%) rename {src => apps/draupnir/src}/protections/RedactionSynchronisation.ts (99%) rename {src => apps/draupnir/src}/protections/RoomTakedown/DiscoveredRoomStore.ts (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/RoomAuditLog.ts (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/RoomDiscovery.ts (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/RoomDiscoveryRenderer.tsx (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/RoomTakedown.ts (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/RoomTakedownProtection.ts (99%) rename {src => apps/draupnir/src}/protections/RoomTakedown/SqliteRoomAuditLog.ts (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/SynapseAdminRoomDetails.ts (100%) rename {src => apps/draupnir/src}/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts (98%) rename {src => apps/draupnir/src}/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts (96%) rename {src => apps/draupnir/src}/protections/TrustedReporters.ts (100%) rename {src => apps/draupnir/src}/protections/WordList.ts (99%) rename {src => apps/draupnir/src}/protections/invitation/JoinRoomsOnInviteProtection.tsx (95%) rename {src => apps/draupnir/src}/protections/invitation/ProtectRoomsOnInvite.tsx (100%) rename {src => apps/draupnir/src}/protections/invitation/WatchRoomsOnInvite.tsx (100%) rename {src => apps/draupnir/src}/protections/invitation/inviteCore.ts (90%) rename {src => apps/draupnir/src}/queues/EventRedactionQueue.ts (88%) rename {src => apps/draupnir/src}/queues/LeakyBucket.ts (100%) rename {src => apps/draupnir/src}/queues/ProtectedRoomActivityTracker.ts (100%) rename {src => apps/draupnir/src}/queues/ThrottlingQueue.ts (98%) rename {src => apps/draupnir/src}/queues/TimelineRedactionQueue.ts (100%) rename {src => apps/draupnir/src}/queues/UnlistedUserRedactionQueue.ts (97%) rename {src => apps/draupnir/src}/report/ReportManager.ts (95%) rename {src => apps/draupnir/src}/report/ReportPoller.ts (75%) rename {src => apps/draupnir/src}/safemode/BootOption.ts (100%) rename {src => apps/draupnir/src}/safemode/DraupnirSafeMode.ts (88%) rename {src => apps/draupnir/src}/safemode/ManagementRoom.ts (100%) rename {src => apps/draupnir/src}/safemode/PersistentConfigEditor.ts (100%) rename {src => apps/draupnir/src}/safemode/PersistentConfigRenderer.tsx (100%) rename {src => apps/draupnir/src}/safemode/RecoveryOptions.tsx (100%) rename {src => apps/draupnir/src}/safemode/SafeModeCause.ts (100%) rename {src => apps/draupnir/src}/safemode/SafeModeCommandDispatcher.ts (100%) rename {src => apps/draupnir/src}/safemode/SafeModeToggle.ts (100%) rename {src => apps/draupnir/src}/safemode/commands/HelpCommand.tsx (100%) rename {src => apps/draupnir/src}/safemode/commands/RecoverCommand.tsx (100%) rename {src => apps/draupnir/src}/safemode/commands/RestartDraupnirCommand.ts (100%) rename {src => apps/draupnir/src}/safemode/commands/SafeModeAdaptor.ts (100%) rename {src => apps/draupnir/src}/safemode/commands/SafeModeCommands.tsx (100%) rename {src => apps/draupnir/src}/safemode/commands/StatusCommand.tsx (98%) rename {src => apps/draupnir/src}/utils.ts (94%) rename {src => apps/draupnir/src}/webapis/SynapseHTTPAntispam/CheckEventForSpamEndpoint.ts (100%) rename {src => apps/draupnir/src}/webapis/SynapseHTTPAntispam/PingEndpoint.ts (100%) rename {src => apps/draupnir/src}/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts (100%) rename {src => apps/draupnir/src}/webapis/SynapseHTTPAntispam/SynapseHttpAntispam.ts (100%) rename {src => apps/draupnir/src}/webapis/SynapseHTTPAntispam/UserMayInviteEndpoint.ts (100%) rename {src => apps/draupnir/src}/webapis/SynapseHTTPAntispam/UserMayJoinRoomEndpoint.ts (100%) rename {src => apps/draupnir/src}/webapis/WebAPIs.ts (96%) rename {test => apps/draupnir/test}/appservice/integration/listUnstartedDraupnirTest.ts (100%) rename {test => apps/draupnir/test}/appservice/integration/provisionTest.ts (86%) rename {test => apps/draupnir/test}/appservice/integration/safeModeRecoverTest.ts (100%) rename {test => apps/draupnir/test}/appservice/integration/safeModeToggleTest.ts (100%) rename {test => apps/draupnir/test}/appservice/utils/ProvisionHelper.ts (100%) rename {test => apps/draupnir/test}/appservice/utils/harness.ts (96%) rename {test => apps/draupnir/test}/draupnir_news.json (100%) rename {test => apps/draupnir/test}/draupnir_news.json.license (100%) rename {test => apps/draupnir/test}/integration/abuseReportTest.ts (76%) rename {test => apps/draupnir/test}/integration/banPropagationTest.ts (99%) rename {test => apps/draupnir/test}/integration/clientHelper.ts (84%) rename {test => apps/draupnir/test}/integration/commands/commandUtils.ts (97%) rename {test => apps/draupnir/test}/integration/commands/hijackRoomCommandTest.ts (85%) rename {test => apps/draupnir/test}/integration/commands/recoverCommandDetail.ts (100%) rename {test => apps/draupnir/test}/integration/commands/recoverCommandTest.ts (100%) rename {test => apps/draupnir/test}/integration/commands/redactCommandTest.ts (96%) rename {test => apps/draupnir/test}/integration/commands/roomsTest.ts (96%) rename {test => apps/draupnir/test}/integration/commands/shutdownCommandTest.ts (83%) rename {test => apps/draupnir/test}/integration/commands/unbanTest.ts (99%) rename {test => apps/draupnir/test}/integration/fixtures.ts (97%) rename {test => apps/draupnir/test}/integration/helloTest.ts (90%) rename {test => apps/draupnir/test}/integration/httpAntispamTest.ts (97%) rename {test => apps/draupnir/test}/integration/manualLaunchScript.ts (100%) rename {test => apps/draupnir/test}/integration/mjolnirSetupUtils.ts (84%) rename {test => apps/draupnir/test}/integration/protections/BlockInvitationsOnServerTest.ts (98%) rename {test => apps/draupnir/test}/integration/protections/JoinRoomsOnInviteTest.ts (98%) rename {test => apps/draupnir/test}/integration/protections/RoomTakedownProtectionTest.ts (100%) rename {test => apps/draupnir/test}/integration/reportPollingTest.ts (90%) rename {test => apps/draupnir/test}/integration/throttleQueueTest.ts (85%) rename {test => apps/draupnir/test}/integration/throttleTest.ts (95%) rename {test => apps/draupnir/test}/integration/timelinePaginationTest.ts (95%) rename {test => apps/draupnir/test}/integration/utilsTest.ts (81%) rename {test => apps/draupnir/test}/nginx.conf (100%) rename {test => apps/draupnir/test}/tsnode.cjs (100%) rename {test => apps/draupnir/test}/unit/commands/BanCommandTest.ts (100%) rename {test => apps/draupnir/test}/unit/commands/KickCommandTest.ts (98%) rename {test => apps/draupnir/test}/unit/commands/UnbanCommandTest.ts (100%) rename {test => apps/draupnir/test}/unit/commands/WatchUnwatchCommandTest.ts (100%) rename {test => apps/draupnir/test}/unit/config/unknownPropertiesTest.ts (100%) rename {test => apps/draupnir/test}/unit/protections/DraupnirNewsTest.ts (100%) rename {test => apps/draupnir/test}/unit/protections/MentionLimitProtectionTest.ts (100%) rename {test => apps/draupnir/test}/unit/protections/RedactionSynchronisationTest.ts (100%) rename {test => apps/draupnir/test}/unit/protections/RoomTakedownServiceTest.ts (100%) rename {test => apps/draupnir/test}/unit/protections/serverBanSynchronisationCapabilityRenameTest.ts (100%) rename {test => apps/draupnir/test}/unit/stores/hashStoreTest.ts (100%) rename {test => apps/draupnir/test}/unit/stores/roomAuditLogTest.ts (100%) rename {test => apps/draupnir/test}/unit/stores/roomStateBackingStoreTest.ts (95%) rename {test => apps/draupnir/test}/unit/stores/userRestrictionAuditLogTest.ts (100%) create mode 100644 apps/draupnir/tsconfig.json create mode 100644 apps/draupnir/tsconfig.test.json create mode 100644 package-lock.json create mode 100644 packages/interface-manager/CHANGELOG.md create mode 100644 packages/interface-manager/README.md create mode 100644 packages/interface-manager/REUSE.toml create mode 100644 packages/interface-manager/jest.config.cjs create mode 100644 packages/interface-manager/package.json create mode 100644 packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts create mode 100644 packages/interface-manager/src/Adaptor/CommandDispatcher.test.ts create mode 100644 packages/interface-manager/src/Adaptor/CommandDispatcher.ts create mode 100644 packages/interface-manager/src/Adaptor/CommandInvoker.ts create mode 100644 packages/interface-manager/src/Adaptor/CommandInvokerCallbacks.ts create mode 100644 packages/interface-manager/src/Adaptor/StandardCommandInvoker.ts create mode 100644 packages/interface-manager/src/Adaptor/index.ts create mode 100644 packages/interface-manager/src/Command/Command.ts create mode 100644 packages/interface-manager/src/Command/CommandDescription.ts create mode 100644 packages/interface-manager/src/Command/CommandExecutorHelper.ts create mode 100644 packages/interface-manager/src/Command/CommandMeta.ts create mode 100644 packages/interface-manager/src/Command/CommandTable.test.ts create mode 100644 packages/interface-manager/src/Command/CommandTable.ts create mode 100644 packages/interface-manager/src/Command/Keyword.ts create mode 100644 packages/interface-manager/src/Command/KeywordParameterDescription.ts create mode 100644 packages/interface-manager/src/Command/ParameterDescription.ts create mode 100644 packages/interface-manager/src/Command/ParameterParsing.ts create mode 100644 packages/interface-manager/src/Command/ParseErrors.ts create mode 100644 packages/interface-manager/src/Command/ParsedKeywords.ts create mode 100644 packages/interface-manager/src/Command/Presentation.ts create mode 100644 packages/interface-manager/src/Command/PresentationSchema.ts create mode 100644 packages/interface-manager/src/Command/PresentationStream.ts create mode 100644 packages/interface-manager/src/Command/PresentationTypeTranslator.ts create mode 100644 packages/interface-manager/src/Command/PromptForAccept.ts create mode 100644 packages/interface-manager/src/Command/RestParameterDescription.ts create mode 100644 packages/interface-manager/src/Command/describeCommand.test.ts create mode 100644 packages/interface-manager/src/Command/describeCommand.ts create mode 100644 packages/interface-manager/src/Command/index.ts create mode 100644 packages/interface-manager/src/DeadDocument/DeadDocument.ts create mode 100644 packages/interface-manager/src/DeadDocument/DeadDocumentHTML.ts create mode 100644 packages/interface-manager/src/DeadDocument/DeadDocumentMarkdown.ts create mode 100644 packages/interface-manager/src/DeadDocument/DeadDocumentMatrix.ts create mode 100644 packages/interface-manager/src/DeadDocument/JSXFactory.ts create mode 100644 packages/interface-manager/src/DeadDocument/PagedDuplexStream.ts create mode 100644 packages/interface-manager/src/DeadDocument/escapeHTML.ts create mode 100644 packages/interface-manager/src/DeadDocument/index.ts create mode 100644 packages/interface-manager/src/MatrixInterfaceAdaptor/DefaultRenderers.tsx create mode 100644 packages/interface-manager/src/MatrixInterfaceAdaptor/MatrixInterfaceAdaptor.ts create mode 100644 packages/interface-manager/src/MatrixInterfaceAdaptor/MatrixInterfaceCommandDispatcher.ts create mode 100644 packages/interface-manager/src/MatrixInterfaceAdaptor/MatrixRendererDescription.ts create mode 100644 packages/interface-manager/src/MatrixInterfaceAdaptor/index.ts create mode 100644 packages/interface-manager/src/TextReader/JSInterfaceCommandDispatcher.ts create mode 100644 packages/interface-manager/src/TextReader/StandardCommandDispatcher.test.ts create mode 100644 packages/interface-manager/src/TextReader/StandardCommandDispatcher.ts create mode 100644 packages/interface-manager/src/TextReader/TextCommandReader.test.ts create mode 100644 packages/interface-manager/src/TextReader/TextCommandReader.ts create mode 100644 packages/interface-manager/src/TextReader/TextPresentationRenderer.ts create mode 100644 packages/interface-manager/src/TextReader/TextPresentationTypes.ts create mode 100644 packages/interface-manager/src/TextReader/TextTranslators.test.ts create mode 100644 packages/interface-manager/src/TextReader/TextTranslators.ts create mode 100644 packages/interface-manager/src/TextReader/index.ts create mode 100644 packages/interface-manager/src/index.ts create mode 100644 packages/interface-manager/tsconfig.json create mode 100644 packages/interface-manager/tsconfig.test.json create mode 100644 packages/matrix-basic-types/CHANGELOG.md create mode 100644 packages/matrix-basic-types/README.md create mode 100644 packages/matrix-basic-types/REUSE.toml create mode 100644 packages/matrix-basic-types/jest.config.cjs create mode 100644 packages/matrix-basic-types/package.json create mode 100644 packages/matrix-basic-types/src/MatrixReference/MatrixGlob.ts create mode 100644 packages/matrix-basic-types/src/MatrixReference/MatrixRoomReference.ts create mode 100644 packages/matrix-basic-types/src/MatrixReference/MatrixUserID.ts create mode 100644 packages/matrix-basic-types/src/MatrixReference/Permalinks.test.ts create mode 100644 packages/matrix-basic-types/src/MatrixReference/Permalinks.ts create mode 100644 packages/matrix-basic-types/src/MatrixReference/index.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/StringEventID.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/StringRoomAlias.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/StringRoomID.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/StringServerName.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/StringUserID.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/StringlyTypedMatrix.test.ts create mode 100644 packages/matrix-basic-types/src/StringlyTypedMatrix/index.ts create mode 100644 packages/matrix-basic-types/src/index.ts create mode 100644 packages/matrix-basic-types/tsconfig.json create mode 100644 packages/matrix-basic-types/tsconfig.test.json create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/CHANGELOG.md create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/README.md create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/REUSE.toml create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/jest.config.js create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/package.json create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Client/BotSDKAllClient.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Client/BotSDKBaseClient.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Client/BotSDKClientPlatform.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/ClientManagement/ClientCapabilityFactory.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/ClientManagement/ClientManagement.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/ClientManagement/JoinedRoomsSafe.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/ClientManagement/RoomStateManagerFactory.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/ClientManagement/RoomStateRefresh.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Interface/MatrixData.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Logging/BotSDKLogging.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/MatrixEmitter.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/PolicyList/PolicyListManager.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Protection/MjolnirProtectedRoomsStore.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/Protection/MjolnirWatchedPolicyRoomsStore.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SafeMatrixClient.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/StateTracking/RoomMembershipManager.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/BlockStatusEndpoint.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/RoomDetailsEndpoint.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/RoomListEndpoint.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/ShutdownV2Endpoint.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/SynapseAdminClient.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/UserDetailsEndpoint.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/SynapseAdmin/UserRedactionEndpoint.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/src/index.ts create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/tsconfig.json create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/tsconfig.test.json create mode 100644 packages/matrix-protection-suite-for-matrix-bot-sdk/typedoc.json create mode 100644 packages/matrix-protection-suite/.gitignore create mode 100644 packages/matrix-protection-suite/CHANGELOG.md create mode 100644 packages/matrix-protection-suite/NOTICE create mode 100644 packages/matrix-protection-suite/README.md create mode 100644 packages/matrix-protection-suite/REUSE.toml create mode 100644 packages/matrix-protection-suite/jest.config.js create mode 100644 packages/matrix-protection-suite/package.json create mode 100644 packages/matrix-protection-suite/src/Client/ClientCapabilityNegotiation.ts create mode 100644 packages/matrix-protection-suite/src/Client/ClientPlatform.ts create mode 100644 packages/matrix-protection-suite/src/Client/DummyClientPlatform.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/MatrixPaginator.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/PaginationChunk.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/PaginationIteration.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/PaginationOptions.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/PaginationSession.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/PaginationToken.ts create mode 100644 packages/matrix-protection-suite/src/Client/Pagination/StandardPaginationIterator.ts create mode 100644 packages/matrix-protection-suite/src/Client/PowerLevelsMirror.test.ts create mode 100644 packages/matrix-protection-suite/src/Client/PowerLevelsMirror.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomBanner.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomCreator.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomEventFilter.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomEventGetter.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomEventRedacter.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomEventRelations.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomInviter.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomJoiner.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomKicker.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomMessageSender.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomMessages.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomReactionSender.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomResolver.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomStateEventSender.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomStateGetter.ts create mode 100644 packages/matrix-protection-suite/src/Client/RoomUnbanner.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/Client.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/ClientRooms.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/ClientsInRoomMap.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/ConstantPeriodBatch.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/JoinedRoomsRevision.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/RoomEventAcivity.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/RoomPauser.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/StandardClientRooms.ts create mode 100644 packages/matrix-protection-suite/src/ClientManagement/TimedGate.ts create mode 100644 packages/matrix-protection-suite/src/Config/ConfigDescription.ts create mode 100644 packages/matrix-protection-suite/src/Config/ConfigMirror.ts create mode 100644 packages/matrix-protection-suite/src/Config/ConfigParseError.ts create mode 100644 packages/matrix-protection-suite/src/Config/PersistentConfigData.ts create mode 100644 packages/matrix-protection-suite/src/Config/describeConfig.test.ts create mode 100644 packages/matrix-protection-suite/src/Config/describeConfig.ts create mode 100644 packages/matrix-protection-suite/src/Interface/Action.ts create mode 100644 packages/matrix-protection-suite/src/Interface/ActionException.ts create mode 100644 packages/matrix-protection-suite/src/Interface/Deduplicator.ts create mode 100644 packages/matrix-protection-suite/src/Interface/FakePersistentMatrixData.ts create mode 100644 packages/matrix-protection-suite/src/Interface/InternedInstanceFactory.ts create mode 100644 packages/matrix-protection-suite/src/Interface/KeyedBatchQueue.ts create mode 100644 packages/matrix-protection-suite/src/Interface/Lifetime.ts create mode 100644 packages/matrix-protection-suite/src/Interface/LoggableConfig.ts create mode 100644 packages/matrix-protection-suite/src/Interface/MatrixException.ts create mode 100644 packages/matrix-protection-suite/src/Interface/MultipleErrors.ts create mode 100644 packages/matrix-protection-suite/src/Interface/PersistentMatrixData.ts create mode 100644 packages/matrix-protection-suite/src/Interface/RoomUpdateError.ts create mode 100644 packages/matrix-protection-suite/src/Interface/SchemedMatrixData.ts create mode 100644 packages/matrix-protection-suite/src/Interface/SemanticType.ts create mode 100644 packages/matrix-protection-suite/src/Interface/SimpleChangeType.ts create mode 100644 packages/matrix-protection-suite/src/Interface/Static.ts create mode 100644 packages/matrix-protection-suite/src/Interface/Task.ts create mode 100644 packages/matrix-protection-suite/src/Interface/Value.ts create mode 100644 packages/matrix-protection-suite/src/Logging/Logger.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/CreateRoom.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/DefaultEventDecoder.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/EventDecoder.test.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/EventDecoder.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/Events.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/JoinRules.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/MembershipEvent.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/PermalinkSchema.test.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/PermalinkSchema.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/PolicyEvents.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/PowerLevels.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/ReactionEvent.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/Redaction.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/RoomMessage.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/ServerACL.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/ServerACLBuilder.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/StringlyTypedMatrix.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/SynapseAdmin/APIBodies.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/SynapseReport.ts create mode 100644 packages/matrix-protection-suite/src/MatrixTypes/Tombstone.ts create mode 100644 packages/matrix-protection-suite/src/Membership/FakeRoomMembershipManager.ts create mode 100644 packages/matrix-protection-suite/src/Membership/FakeRoomMembershipRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Membership/MembershipChange.test.ts create mode 100644 packages/matrix-protection-suite/src/Membership/MembershipChange.ts create mode 100644 packages/matrix-protection-suite/src/Membership/MembershipRevision.ts create mode 100644 packages/matrix-protection-suite/src/Membership/MembershipRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Membership/RoomMembershipManager.ts create mode 100644 packages/matrix-protection-suite/src/Membership/RoomStateMembershipRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Membership/SetMembershipRevision.ts create mode 100644 packages/matrix-protection-suite/src/Membership/SetMembershipRevisionIssuer.test.ts create mode 100644 packages/matrix-protection-suite/src/Membership/SetMembershipRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Membership/SetRoomMembership.ts create mode 100644 packages/matrix-protection-suite/src/Membership/StandardRoomMembershipRevision.test.ts create mode 100644 packages/matrix-protection-suite/src/Membership/StandardRoomMembershipRevision.ts create mode 100644 packages/matrix-protection-suite/src/Membership/StandardRoomMembershipRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Membership/StandardSetRoomMembership.ts create mode 100644 packages/matrix-protection-suite/src/MembershipPolicies/MembershipPolicyRevision.ts create mode 100644 packages/matrix-protection-suite/src/MembershipPolicies/SetMembershipPolicyRevisionIssuer.test.ts create mode 100644 packages/matrix-protection-suite/src/MembershipPolicies/SetMembershipPolicyRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/MembershipPolicies/StandardSetMembershipPolicyRevision.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/FakePolicyRoomRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyListRevision.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyListRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyRoomEditor.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyRoomManger.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyRule.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyRuleChange.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/PolicyRuleEventBuilder.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/Revision.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/RoomStatePolicyListRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/StandardPolicyListRevision.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/StandardPolicyRoomEditor.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/StandardPolicyRoomRevision.ts create mode 100644 packages/matrix-protection-suite/src/PolicyList/StandardPolicyRoomRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Projection/ListMultiMap.ts create mode 100644 packages/matrix-protection-suite/src/Projection/Projection.ts create mode 100644 packages/matrix-protection-suite/src/Projection/ProjectionNode.ts create mode 100644 packages/matrix-protection-suite/src/Protection/AccessControl.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/CapabilityContextGlue.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/CapabilityInterface.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/CapabilityProvider.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/CapabilityRenderer.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/CapabilitySet.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/CapabilityMethodSchema.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/EventConsequences.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/RoomSetResult.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/RoomSetResult.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/SimulatedEventConsequences.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/SimulatedUserConsequences.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/StandardEventConsequences.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/StandardUserConsequences.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Capability/StandardCapability/UserConsequences.ts create mode 100644 packages/matrix-protection-suite/src/Protection/DescriptionMeta.ts create mode 100644 packages/matrix-protection-suite/src/Protection/DirectPropagationPolicyListRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/Protection/HandleRegistry/HandleDescription.ts create mode 100644 packages/matrix-protection-suite/src/Protection/HandleRegistry/HandleRegistry.ts create mode 100644 packages/matrix-protection-suite/src/Protection/HandleRegistry/HandleRegistryDescription.ts create mode 100644 packages/matrix-protection-suite/src/Protection/HandleRegistry/StandardHandleRegistery.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/HandleRegistry/StandardHandleRegistry.ts create mode 100644 packages/matrix-protection-suite/src/Protection/HandleRegistry/StandardHandleRegistryDescription.ts create mode 100644 packages/matrix-protection-suite/src/Protection/PolicyListConfig/MjolnirPolicyRoomsConfig.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/PolicyListConfig/MjolnirPolicyRoomsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/PolicyListConfig/MjolnirPolicyRoomsDescription.ts create mode 100644 packages/matrix-protection-suite/src/Protection/PolicyListConfig/MjolnirWatchedListsEvent.ts create mode 100644 packages/matrix-protection-suite/src/Protection/PolicyListConfig/PolicyListConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsConfig/FakeProtectedRoomsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsConfig/MjolnirProtectedRoomsDescription.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsConfig/MjolnirProtectedRoomsEvent.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsConfig/ProtectedRoomsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsManager/ProtectedRoomsManager.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsManager/StandardProtectedRoomsManager.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectedRoomsSet.ts create mode 100644 packages/matrix-protection-suite/src/Protection/Protection.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionHandles.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionHandles.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/FakeProtectionsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/MjolnirEnabledProtectionsDescription.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/MjolnirEnabledProtectionsEvent.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/ProtectionCapabilityProviderSetConfig/ProtectionCapabilityProviderSetConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/ProtectionCapabilityProviderSetConfig/StandardProtectionCapabilityProviderSetConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/ProtectionSettingsConfig/MjolnirProtectionSettingsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/ProtectionSettingsConfig/ProtectionSettingsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/ProtectionsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/StandardProtectionsConfig.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsConfig/StandardProtectionsConfig.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsManager/FakeProtectionsManager.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsManager/ProtectionsManager.ts create mode 100644 packages/matrix-protection-suite/src/Protection/ProtectionsManager/StandardProtectionsManager.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/MemberBanSynchronisation/MemberBanIntentProjection.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/MemberBanSynchronisation/MemberBanIntentProjectionNode.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/MemberBanSynchronisation/MemberBanSynchronisation.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/MemberBanSynchronisation/MemberBanSynchronisation.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/PolicyListBridgeProjection.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/ServerACLSynchronisationCapability.test.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/ServerACLSynchronisationCapability.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/ServerBanIntentProjection.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/ServerBanIntentProjectionNode.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/ServerBanSynchronisation.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/ServerBanSynchronisationCapability.ts create mode 100644 packages/matrix-protection-suite/src/Protection/StandardProtections/ServerBanSynchronisation/SimulatedServerBanSynchronisationCapability.ts create mode 100644 packages/matrix-protection-suite/src/Protection/WatchedPolicyRooms/HashReverser/Reversal.ts create mode 100644 packages/matrix-protection-suite/src/Protection/WatchedPolicyRooms/HashReverser/SHA256HashReverser.ts create mode 100644 packages/matrix-protection-suite/src/Protection/WatchedPolicyRooms/StandardWatchedPolicyRooms.ts create mode 100644 packages/matrix-protection-suite/src/Protection/WatchedPolicyRooms/WatchedPolicyRooms.ts create mode 100644 packages/matrix-protection-suite/src/Reporting/EventReport.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/EventMixinExtraction/EventMixinDescription.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/EventMixinExtraction/EventMixinExtraction.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/EventMixinExtraction/StandardMixinExtractor.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/DefaultMixinExtractor.test.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/DefaultMixinExtractor.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/ExtensibleTextMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/MentionsMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/NewContentMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/RoomMessageBodyMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/RoomMessageFileMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/RoomMessageFormatedBodyMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/RoomMessageMediaURLMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/MatrixEventMixinDescriptions/RoomMessageThumbnailURLMixin.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/SafeMembershipEvent.test.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/SafeMembershipEvent.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/UndecodableEventContent.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/UnsafeEvent.ts create mode 100644 packages/matrix-protection-suite/src/SafeMatrixEvents/hasOwn.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/DeclareRoomState.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/EventBatch.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/FakePolicyRoomManager.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/FakeRoomStateManager.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/FakeRoomStateRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/RoomStateBackingStore.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/SetRoomState.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/StandardRoomStateRevision.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/StandardRoomStateRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/StandardSetRoomState.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/StateChangeType.test.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/StateChangeType.ts create mode 100644 packages/matrix-protection-suite/src/StateTracking/StateRevisionIssuer.ts create mode 100644 packages/matrix-protection-suite/src/TestUtilities/EventGeneration.ts create mode 100644 packages/matrix-protection-suite/src/index.ts create mode 100644 packages/matrix-protection-suite/tsconfig.json create mode 100644 packages/matrix-protection-suite/tsconfig.test.json create mode 100644 packages/matrix-protection-suite/typedoc.json create mode 100644 packages/mps-interface-adaptor/CHANGELOG.md create mode 100644 packages/mps-interface-adaptor/REUSE.toml create mode 100644 packages/mps-interface-adaptor/package.json create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/CommonRenderers.tsx create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MPSMatrixInterfaceAdaptor.ts create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixHelpRenderer.tsx create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixPromptForAccept.tsx create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixPromptForConfirmation.tsx create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/MatrixReactionHandler.ts create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/index.ts create mode 100644 packages/mps-interface-adaptor/src/MPSInterfaceAdaptor/replyNotice.ts create mode 100644 packages/mps-interface-adaptor/src/index.ts create mode 100644 packages/mps-interface-adaptor/tsconfig.json create mode 100644 packages/mps-interface-adaptor/tsconfig.test.json create mode 100644 packages/tsconfig/CHANGELOG.md create mode 100644 packages/tsconfig/REUSE.toml create mode 100644 packages/tsconfig/package.json create mode 100644 packages/tsconfig/src/eslint9.mjs create mode 100644 packages/tsconfig/src/index.js delete mode 100644 src/appservice/Api.ts delete mode 100644 test/appservice/integration/webAPITest.ts delete mode 100644 test/appservice/utils/webAPIClient.ts delete mode 100644 test/scripts/memberQueryTest.ts delete mode 100644 test/tsconfig.json create mode 100644 tsconfig.all.json create mode 100644 tsconfig.base.json delete mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig index be5f8231..329b86a7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,18 +1,17 @@ -# SPDX-FileCopyrightText: 2024 Aminda Suomalainen +# SPDX-FileCopyrightText: 2024 Gnuxie # -# SPDX-License-Identifier: CC0-1.0 +# SPDX-License-Identifier: 0BSD root = true [*] -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true charset = utf-8 indent_style = space -indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true -[{LICENSE,NOTICE,*.{md,yml,yaml,json,txt}}] +[LICENSES/**.txt] trim_trailing_whitespace = false indent_style = space indent_size = unset diff --git a/.github/workflows/mjolnir.yml b/.github/workflows/mjolnir.yml index 4c2dff29..5c0bd848 100644 --- a/.github/workflows/mjolnir.yml +++ b/.github/workflows/mjolnir.yml @@ -26,9 +26,9 @@ jobs: with: node-version: "20" - run: corepack enable - - run: corepack yarn install - - run: corepack yarn build - - run: corepack yarn lint + - run: corepack npm install + - run: corepack npm run build:all + - run: corepack npm run lint unit: name: Unit tests runs-on: ubuntu-latest @@ -38,8 +38,9 @@ jobs: uses: actions/setup-node@v6 with: node-version: "20" - - run: corepack yarn install - - run: corepack yarn test:unit + - run: corepack npm install + - run: corepack npm run build:all + - run: corepack npm run test integration: name: Integration tests runs-on: ubuntu-latest @@ -54,10 +55,10 @@ jobs: with: crate: mx-tester version: "0.3.3" + - name: Setup dependencies + run: corepack npm install && corepack npm run build:all - name: Setup image run: RUST_LOG=debug,hyper=info,rusttls=info mx-tester build up - - name: Setup dependencies - run: corepack yarn install - name: Run tests run: RUST_LOG=debug,hyper=info,rusttls=info mx-tester run - name: Cleanup @@ -76,11 +77,11 @@ jobs: with: crate: mx-tester version: "0.3.3" + - name: Setup dependencies + run: corepack npm install && corepack npm run build:all - name: Setup image run: RUST_LOG=debug,hyper=info,rusttls=info mx-tester build up - - name: Setup dependencies - run: corepack yarn install - name: Run tests - run: corepack yarn test:appservice:integration + run: corepack npm run -w apps/draupnir test:appservice:integration - name: Cleanup run: mx-tester down diff --git a/.gitignore b/.gitignore index e41ef3be..b5d5d8c4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,12 @@ config/* # Draupnir test data draupnir-registration.yaml -test/harness/mjolnir-data/* + +# Monorepo +**/node_modules/ +**/dist/ +**/lib/ +*.tsbuildinfo # Misc diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 577f90bc..19822129 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,13 @@ -# SPDX-FileCopyrightText: 2024 Aminda Suomalainen +# SPDX-FileCopyrightText: 2024 Gnuxie # -# SPDX-License-Identifier: CC0-1.0 +# SPDX-License-Identifier: 0BSD # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks # See https://pre-commit.ci for more information ci: - autoupdate_schedule: weekly - skip: [yarn-lint] + autoupdate_schedule: monthly + skip: [npm-lint, npm-build] repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 @@ -18,9 +18,6 @@ repos: - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files - - id: check-executables-have-shebangs - - id: check-shebang-scripts-are-executable - - id: check-illegal-windows-names - repo: https://github.com/editorconfig-checker/editorconfig-checker.python rev: "3.6.1" hooks: @@ -32,10 +29,18 @@ repos: - id: reuse - repo: local hooks: - - id: yarn-lint - name: linter - entry: corepack yarn lint + - id: npm-build + name: npm build + entry: npm run build:all language: system + pass_filenames: false + - repo: local + hooks: + - id: npm-lint + name: linter + entry: npm run lint + language: system + pass_filenames: false - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.37.0 hooks: diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..6557bb75 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +# SPDX-FileCopyrightText: 2024 Gnuxie +# +# SPDX-License-Identifier: AFL-3.0 + +dist +packages/matrix-protection-suite/docs diff --git a/.prettierrc.yaml b/.prettierrc.yaml index 3f8adf6f..c7114a44 100644 --- a/.prettierrc.yaml +++ b/.prettierrc.yaml @@ -1,6 +1,6 @@ # SPDX-FileCopyrightText: 2024 Gnuxie # -# SPDX-License-Identifier: CC0-1.0 +# SPDX-License-Identifier: 0BSD tabWidth: 2 useTabs: false diff --git a/CHANGELOG.md b/CHANGELOG.md index c52121c9..13989f32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -752,7 +752,6 @@ Special thanks to all contributors who helped in the beta programme: @avdb13, https://github.com/the-draupnir-project/Draupnir/issues/622. - The `JoinWaveShortCircuitProtection` has been improved: - - The `JoinWaveShortCircuitProtection` now uses a leaky bucket token algorithm, prior to this the entire bucket got dumped after a preconfigured time. diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md new file mode 100644 index 00000000..0c4abdcb --- /dev/null +++ b/DEPENDENCIES.md @@ -0,0 +1,36 @@ + + +# Dependencies + +## Pinned dependencies + +### @vector-im/matrix-bot-sdk + +This is pinned and overridden because we need to have the exact same version for +all dependencies. As we create and pass `MatrixClient` through Draupnir, +matrix-protection-suite-for-matrix-bot-sdk, the vector bot-sdk fork itself, and +also matrix-appservice-bridge. + +### postgres + +https://github.com/porsager/postgres/issues/1143 + +This is pinned specifically as a work around for this issue. + +## Workspace dependencies + +Workspace dependencies should be kept at their same version and changesets +should be used for any changes. Package release should only be made from the +main branch once changesets have been merged and the associated package versions +bumped. This allows for the workspace state to always be used to build Draupnir +reproducibly on any branch of PR. + +## Developer tooling + +Developer tooling related `devDependencies` should be kept in the root package +unless it is not common to most packages. This is to make sure the versioning +remains consistent without relying on npm to do that. diff --git a/Dockerfile b/Dockerfile index c4706f89..52a3fd8c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,16 +10,15 @@ COPY . /tmp/src RUN cd /tmp/src && git describe > version.txt.tmp && mv version.txt.tmp version.txt # build and install RUN cd /tmp/src \ - && yarn install --frozen-lockfile --network-timeout 100000 \ - && yarn build \ - && yarn install --frozen-lockfile --production --network-timeout 100000 + && npm ci \ + && npm run build \ + && npm prune --production FROM node:20-slim as final-stage -COPY --from=build-stage /tmp/src/version.txt version.txt -COPY --from=build-stage /tmp/src/lib/ /draupnir/ +COPY --from=build-stage /tmp/src/apps/draupnir /apps/draupnir +COPY --from=build-stage /tmp/src/packages /packages COPY --from=build-stage /tmp/src/node_modules /node_modules COPY --from=build-stage /tmp/src/draupnir-entrypoint.sh / -COPY --from=build-stage /tmp/src/package.json / ENV NODE_ENV=production ENV NODE_CONFIG_DIR=/data/config diff --git a/LICENSES/0BSD.txt b/LICENSES/0BSD.txt new file mode 100644 index 00000000..0b8ae762 --- /dev/null +++ b/LICENSES/0BSD.txt @@ -0,0 +1,5 @@ +Copyright (C) YEAR by AUTHOR EMAIL + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt new file mode 100644 index 00000000..d817195d --- /dev/null +++ b/LICENSES/MIT.txt @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/REUSE.toml b/REUSE.toml index 1a15e05a..c714b608 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -7,37 +7,55 @@ SPDX-PackageDownloadLocation = "https://github.com/the-draupnir-project/Draupnir path = ".github/ISSUE_TEMPLATE/bug-report.md" precedence = "aggregate" SPDX-FileCopyrightText = "Gnuxie " -SPDX-License-Identifier = "CC0-1.0" +SPDX-License-Identifier = "0BSD" [[annotations]] path = "tsconfig.json" precedence = "aggregate" SPDX-FileCopyrightText = "Gnuxie " -SPDX-License-Identifier = "CC0-1.0" +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.base.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.all.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.eslint.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" [[annotations]] path = "REUSE.toml" precedence = "aggregate" SPDX-FileCopyrightText = "Gnuxie " -SPDX-License-Identifier = "CC0-1.0" +SPDX-License-Identifier = "0BSD" [[annotations]] path = "yarn.lock" precedence = "aggregate" SPDX-FileCopyrightText = "Gnuxie " -SPDX-License-Identifier = "CC0-1.0" +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "package-lock.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" [[annotations]] path = "NOTICE" precedence = "aggregate" SPDX-FileCopyrightText = "Gnuxie " -SPDX-License-Identifier = "CC0-1.0" - -[[annotations]] -path = "test/tsconfig.json" -precedence = "aggregate" -SPDX-FileCopyrightText = "Gnuxie " -SPDX-License-Identifier = "CC0-1.0" +SPDX-License-Identifier = "0BSD" [[annotations]] path = "package.json" diff --git a/apps/draupnir/.gitignore b/apps/draupnir/.gitignore new file mode 100644 index 00000000..94e7123e --- /dev/null +++ b/apps/draupnir/.gitignore @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2026 Gnuxie +# +# SPDX-License-Identifier: 0BSD + +test/harness/mjolnir-data/* diff --git a/apps/draupnir/REUSE.toml b/apps/draupnir/REUSE.toml new file mode 100644 index 00000000..a8653fc9 --- /dev/null +++ b/apps/draupnir/REUSE.toml @@ -0,0 +1,64 @@ +version = 1 +SPDX-PackageName = "Draupnir" +SPDX-PackageSupplier = "Gnuxie " +SPDX-PackageDownloadLocation = "https://github.com/the-draupnir-project/Draupnir" + +[[annotations]] +path = ".github/ISSUE_TEMPLATE/bug-report.md" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.test.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.base.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "REUSE.toml" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "yarn.lock" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "package-lock.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "NOTICE" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "test/tsconfig.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "package.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "AFL-3.0" diff --git a/apps/draupnir/package.json b/apps/draupnir/package.json new file mode 100644 index 00000000..f3a7016c --- /dev/null +++ b/apps/draupnir/package.json @@ -0,0 +1,72 @@ +{ + "name": "draupnir", + "version": "2.9.0", + "description": "A moderation tool for Matrix", + "main": "lib/index.js", + "repository": "https://github.com/the-draupnir-project/Draupnir.git", + "author": "Gnuxie", + "license": "AFL-3.0", + "private": true, + "scripts": { + "build": "tsc --project test/tsconfig.json && npm run build:assets", + "build:assets": "cp src/protections/DraupnirNews/news.json dist/protections/DraupnirNews/news.json && npm run describe-version", + "describe-version": "(git describe > version.txt.tmp && mv version.txt.tmp version.txt) || true && rm -f version.txt.tmp", + "harness-registration": "node dist/appservice/cli.js -r -u \"http://host.docker.internal:9000\" --enable-source-maps", + "test:unit": "mocha --require './test/tsnode.cjs' --forbid-only 'test/unit/**/*.{ts,tsx}'", + "test:unit:single": "mocha --require test/tsnode.cjs", + "test:integration": "NODE_ENV=harness mocha --require test/tsnode.cjs --async-stack-traces --forbid-only --require test/integration/fixtures.ts --timeout 300000 --project ./tsconfig.json \"test/integration/**/*Test.ts\" -- --draupnir-config ../../config/harness.yaml", + "test:integration:single": "NODE_ENV=harness mocha --require test/tsnode.cjs --require test/integration/fixtures.ts --timeout 300000 --project ./tsconfig.json -- --draupnir-config ../../config/harness.yaml", + "test:appservice:integration": "NODE_ENV=harness mocha --require test/tsnode.cjs --async-stack-traces --forbid-only --timeout 300000 --project ./tsconfig.json \"test/appservice/integration/**/*Test.ts\" -- --draupnir-config ../../config/harness.yaml", + "test:appservice:integration:single": "NODE_ENV=harness mocha --require test/tsnode.cjs --timeout 300000 --project ./tsconfig.json -- --draupnir-config ../../config/harness.yaml", + "test:manual": "NODE_ENV=harness ts-node test/integration/manualLaunchScript.ts -- --draupnir-config ../../config/harness.yaml" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.9", + "@types/config": "^3.3.1", + "@types/crypto-js": "^4.2.2", + "@types/express": "^4.17.21", + "@types/html-to-text": "^8.0.1", + "@types/js-yaml": "^4.0.9", + "@types/jsdom": "21.1.7", + "@types/mocha": "^10.0.7", + "@types/nedb": "^1.8.16", + "@types/node": "^20.14.11", + "@types/pg": "^8.6.5", + "@types/request": "^2.48.12", + "crypto-js": "^4.2.0", + "expect": "^29.7.0", + "mocha": "^10.7.0", + "ts-auto-mock": "^3.7.4", + "ts-node": "^10.9.2" + }, + "dependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "@sentry/node": "^7.17.2", + "@sinclair/typebox": "0.34.13", + "@the-draupnir-project/interface-manager": "4.2.6", + "@the-draupnir-project/matrix-basic-types": "1.5.0", + "@the-draupnir-project/mps-interface-adaptor": "file:../../packages/mps-interface-adaptor", + "@vector-im/matrix-bot-sdk": "0.7.1-element.6", + "better-sqlite3": "^9.4.3", + "body-parser": "^1.20.2", + "config": "^3.3.9", + "express": "^4.19", + "html-to-text": "^8.0.0", + "js-yaml": "^4.1.0", + "jsdom": "^24.0.0", + "matrix-appservice-bridge": "10.3.1", + "matrix-protection-suite": "file:../../packages/matrix-protection-suite", + "matrix-protection-suite-for-matrix-bot-sdk": "file:../../packages/matrix-protection-suite-for-matrix-bot-sdk", + "pg": "^8.8.0", + "yaml": "^2.3.2" + }, + "overrides": { + "@vector-im/matrix-bot-sdk": "0.7.1-element.6", + "@the-draupnir-project/matrix-basic-types": "$the-draupnir-project/matrix-basic-types", + "@the-draupnir-project/interface-manager": "$the-draupnir-project/interface-manager", + "matrix-protection-suite": "$matrix-protection-suite" + }, + "engines": { + "node": ">=20.0.0" + } +} diff --git a/src/Draupnir.ts b/apps/draupnir/src/Draupnir.ts similarity index 92% rename from src/Draupnir.ts rename to apps/draupnir/src/Draupnir.ts index d12a7cbb..a9fc30cc 100644 --- a/src/Draupnir.ts +++ b/apps/draupnir/src/Draupnir.ts @@ -39,7 +39,7 @@ import { SynapseAdminClient, } from "matrix-protection-suite-for-matrix-bot-sdk"; import { IConfig } from "./config"; -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import { RendererMessageCollector } from "./capabilities/RendererMessageCollector"; import { DraupnirRendererMessageCollector } from "./capabilities/DraupnirRendererMessageCollector"; import { renderProtectionFailedToStart } from "./protections/ProtectedRoomsSetRenderers"; @@ -97,7 +97,9 @@ export class Draupnir implements Client, MatrixAdaptorContext { */ public unlistedUserRedactionQueue = new UnlistedUserRedactionQueue(); - private readonly commandDispatcher = makeDraupnirCommandDispatcher(this); + private readonly commandDispatcher: ReturnType< + typeof makeDraupnirCommandDispatcher + >; public taskQueue: ThrottlingQueue; /** * Reporting back to the management room. @@ -115,32 +117,21 @@ export class Draupnir implements Client, MatrixAdaptorContext { public readonly reactionHandler: MatrixReactionHandler; - public readonly purgingDeactivate = - this.synapseAdminClient && this.stores.userRestrictionAuditLog - ? new HomeserverUserPurgingDeactivate( - this.synapseAdminClient, - this.stores.userRestrictionAuditLog - ) - : undefined; + public readonly purgingDeactivate: + | HomeserverUserPurgingDeactivate + | undefined; private readonly timelineEventListener = this.handleTimelineEvent.bind(this); public readonly capabilityMessageRenderer: RendererMessageCollector; - private readonly commandDispatcherTimelineListener = - makeCommandDispatcherTimelineListener( - this.managementRoom, - this.client, - this.commandDispatcher - ); + private readonly commandDispatcherTimelineListener: ReturnType< + typeof makeCommandDispatcherTimelineListener + >; - private readonly JSInterfaceDispatcher: JSInterfaceCommandDispatcher = - makeDraupnirJSCommandDispatcher(this); + private readonly JSInterfaceDispatcher: JSInterfaceCommandDispatcher; - public readonly timelineRedactionQueue = new TimelineRedactionQueue( - this.clientPlatform.toRoomMessages(), - this.clientPlatform.toRoomEventRedacter() - ); + public readonly timelineRedactionQueue: TimelineRedactionQueue; private constructor( public readonly client: MatrixSendClient, @@ -163,6 +154,25 @@ export class Draupnir implements Client, MatrixAdaptorContext { public readonly synapseAdminClient: SynapseAdminClient | undefined, public readonly synapseHTTPAntispam: SynapseHttpAntispam | undefined ) { + this.commandDispatcher = makeDraupnirCommandDispatcher(this); + this.purgingDeactivate = + this.synapseAdminClient && this.stores.userRestrictionAuditLog + ? new HomeserverUserPurgingDeactivate( + this.synapseAdminClient, + this.stores.userRestrictionAuditLog + ) + : undefined; + this.commandDispatcherTimelineListener = + makeCommandDispatcherTimelineListener( + this.managementRoom, + this.client, + this.commandDispatcher + ); + this.JSInterfaceDispatcher = makeDraupnirJSCommandDispatcher(this); + this.timelineRedactionQueue = new TimelineRedactionQueue( + this.clientPlatform.toRoomMessages(), + this.clientPlatform.toRoomEventRedacter() + ); this.managementRoomOutput = new ManagementRoomOutput( this.managementRoomDetail, this.clientUserID, diff --git a/src/DraupnirBotMode.ts b/apps/draupnir/src/DraupnirBotMode.ts similarity index 96% rename from src/DraupnirBotMode.ts rename to apps/draupnir/src/DraupnirBotMode.ts index d6239483..54857248 100644 --- a/src/DraupnirBotMode.ts +++ b/apps/draupnir/src/DraupnirBotMode.ts @@ -68,9 +68,8 @@ export function constructWebAPIs(draupnir: Draupnir): WebAPIs { * The appservice also implements `SafeModeToggle` but has different requirements. * This interface is exlusively used by the entrypoints to draupnir's bot mode. */ -interface BotModeTogle extends SafeModeToggle { +interface BotModeTogle extends SafeModeToggle, AsyncDisposable { encryptionInitialized(): Promise; - stopEverything(): void; startFromScratch( options?: SafeModeToggleOptions ): Promise>; @@ -276,7 +275,7 @@ export class DraupnirBotModeToggle implements BotModeTogle { public async maybeRecoverWithSafeMode( error: ResultError, - options?: SafeModeToggleOptions | undefined + options?: SafeModeToggleOptions ): Promise> { switch (this.config.safeMode?.bootOption) { case SafeModeBootOption.Never: @@ -303,14 +302,9 @@ export class DraupnirBotModeToggle implements BotModeTogle { public async encryptionInitialized(): Promise { if (this.draupnir !== null) { - try { - this.webAPIs = constructWebAPIs(this.draupnir); - await this.webAPIs.start(); - await this.draupnir.startupComplete(); - } catch (e) { - await this.stopEverything(); - throw e; - } + this.webAPIs = constructWebAPIs(this.draupnir); + await this.webAPIs.start(); + await this.draupnir.startupComplete(); } else if (this.safeModeDraupnir !== null) { this.safeModeDraupnir.startupComplete(); } @@ -328,7 +322,7 @@ export class DraupnirBotModeToggle implements BotModeTogle { this.safeModeDraupnir = null; } - public async stopEverything(): Promise { + public async [Symbol.asyncDispose](): Promise { await this.stopDraupnir(); this.stopSafeModeDraupnir(); } diff --git a/src/appservice/AccessControl.ts b/apps/draupnir/src/appservice/AccessControl.ts similarity index 100% rename from src/appservice/AccessControl.ts rename to apps/draupnir/src/appservice/AccessControl.ts diff --git a/src/appservice/AppService.ts b/apps/draupnir/src/appservice/AppService.ts similarity index 98% rename from src/appservice/AppService.ts rename to apps/draupnir/src/appservice/AppService.ts index b104e5ae..b6c51b4e 100644 --- a/src/appservice/AppService.ts +++ b/apps/draupnir/src/appservice/AppService.ts @@ -20,7 +20,6 @@ import { } from "matrix-appservice-bridge"; import { DataStore } from ".//datastore"; import { PgDataStore } from "./postgres/PgDataStore"; -import { Api } from "./Api"; import { AppserviceConfig } from "./config/config"; import { AccessControl } from "./AccessControl"; import { AppserviceCommandHandler } from "./bot/AppserviceCommandHandler"; @@ -57,7 +56,6 @@ const log = new Logger("AppService"); * the entrypoint of the application. */ export class MjolnirAppService { - private readonly api: Api; public readonly commands: AppserviceCommandHandler; /** @@ -78,7 +76,6 @@ export class MjolnirAppService { public readonly accessControlRoomID: StringRoomID, public readonly botUserID: StringUserID ) { - this.api = new Api(config.homeserver.url, draupnirManager); const client = this.bridge.getBot().getClient(); this.commands = new AppserviceCommandHandler( botUserID, @@ -278,7 +275,8 @@ export class MjolnirAppService { ); } catch (e: unknown) { log.error( - `Failed to join the room by ${mxEvent.sender} to display the welcome flow` + `Failed to join the room by ${mxEvent.sender} to display the welcome flow`, + e ); } try { @@ -364,7 +362,6 @@ export class MjolnirAppService { "Starting DraupnirAppService, Matrix-side to listen on port", port ); - this.api.start(this.config.webAPI.port); await this.bridge.listen(port); this.prometheusMetrics.addAppServicePath(this.bridge); this.bridge.addAppServicePath({ @@ -384,7 +381,6 @@ export class MjolnirAppService { public async close(): Promise { await this.bridge.close(); await this.dataStore.close(); - await this.api.close(); this.draupnirManager.unregisterListeners(); } diff --git a/src/appservice/AppServiceDraupnirManager.ts b/apps/draupnir/src/appservice/AppServiceDraupnirManager.ts similarity index 99% rename from src/appservice/AppServiceDraupnirManager.ts rename to apps/draupnir/src/appservice/AppServiceDraupnirManager.ts index 16f8861c..dd86434d 100644 --- a/src/appservice/AppServiceDraupnirManager.ts +++ b/apps/draupnir/src/appservice/AppServiceDraupnirManager.ts @@ -10,7 +10,7 @@ import { Bridge, Intent, Logger } from "matrix-appservice-bridge"; import { getProvisionedMjolnirConfig } from "../config"; -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; import { DataStore, MjolnirRecord } from "./datastore"; import { AccessControl } from "./AccessControl"; import { randomUUID } from "crypto"; diff --git a/src/appservice/bot/AccessCommands.tsx b/apps/draupnir/src/appservice/bot/AccessCommands.tsx similarity index 100% rename from src/appservice/bot/AccessCommands.tsx rename to apps/draupnir/src/appservice/bot/AccessCommands.tsx diff --git a/src/appservice/bot/AppserviceBotCommandDispatcher.ts b/apps/draupnir/src/appservice/bot/AppserviceBotCommandDispatcher.ts similarity index 100% rename from src/appservice/bot/AppserviceBotCommandDispatcher.ts rename to apps/draupnir/src/appservice/bot/AppserviceBotCommandDispatcher.ts diff --git a/src/appservice/bot/AppserviceBotCommandTable.ts b/apps/draupnir/src/appservice/bot/AppserviceBotCommandTable.ts similarity index 100% rename from src/appservice/bot/AppserviceBotCommandTable.ts rename to apps/draupnir/src/appservice/bot/AppserviceBotCommandTable.ts diff --git a/src/appservice/bot/AppserviceBotCommands.ts b/apps/draupnir/src/appservice/bot/AppserviceBotCommands.ts similarity index 100% rename from src/appservice/bot/AppserviceBotCommands.ts rename to apps/draupnir/src/appservice/bot/AppserviceBotCommands.ts diff --git a/src/appservice/bot/AppserviceBotHelp.tsx b/apps/draupnir/src/appservice/bot/AppserviceBotHelp.tsx similarity index 100% rename from src/appservice/bot/AppserviceBotHelp.tsx rename to apps/draupnir/src/appservice/bot/AppserviceBotHelp.tsx diff --git a/src/appservice/bot/AppserviceBotInterfaceAdaptor.ts b/apps/draupnir/src/appservice/bot/AppserviceBotInterfaceAdaptor.ts similarity index 100% rename from src/appservice/bot/AppserviceBotInterfaceAdaptor.ts rename to apps/draupnir/src/appservice/bot/AppserviceBotInterfaceAdaptor.ts diff --git a/src/appservice/bot/AppserviceBotPrerequisite.ts b/apps/draupnir/src/appservice/bot/AppserviceBotPrerequisite.ts similarity index 100% rename from src/appservice/bot/AppserviceBotPrerequisite.ts rename to apps/draupnir/src/appservice/bot/AppserviceBotPrerequisite.ts diff --git a/src/appservice/bot/AppserviceCommandHandler.ts b/apps/draupnir/src/appservice/bot/AppserviceCommandHandler.ts similarity index 100% rename from src/appservice/bot/AppserviceCommandHandler.ts rename to apps/draupnir/src/appservice/bot/AppserviceCommandHandler.ts diff --git a/src/appservice/bot/ListCommand.tsx b/apps/draupnir/src/appservice/bot/ListCommand.tsx similarity index 100% rename from src/appservice/bot/ListCommand.tsx rename to apps/draupnir/src/appservice/bot/ListCommand.tsx diff --git a/src/appservice/cli.ts b/apps/draupnir/src/appservice/cli.ts similarity index 91% rename from src/appservice/cli.ts rename to apps/draupnir/src/appservice/cli.ts index 7896837c..edc8d0e6 100644 --- a/src/appservice/cli.ts +++ b/apps/draupnir/src/appservice/cli.ts @@ -26,7 +26,10 @@ const cli = new Cli({ defaults: {}, }, generateRegistration: MjolnirAppService.generateRegistration, - run: function (port: number) { + run: function (port) { + if (port === null) { + throw new Error("Please specify a port for the appservice to run"); + } const config = cli.getConfig(); if (config === null) { throw new Error("Couldn't load config"); diff --git a/src/appservice/config/REUSE.toml b/apps/draupnir/src/appservice/config/REUSE.toml similarity index 100% rename from src/appservice/config/REUSE.toml rename to apps/draupnir/src/appservice/config/REUSE.toml diff --git a/src/appservice/config/config.example.yaml b/apps/draupnir/src/appservice/config/config.example.yaml similarity index 86% rename from src/appservice/config/config.example.yaml rename to apps/draupnir/src/appservice/config/config.example.yaml index 38cf27c6..196b454f 100644 --- a/src/appservice/config/config.example.yaml +++ b/apps/draupnir/src/appservice/config/config.example.yaml @@ -13,10 +13,6 @@ db: # See docs/access_control.md adminRoom: "#draupnir-admin:localhost:9999" -# This is a web api that the widget connects to in order to interact with the appservice. -webAPI: - port: 9001 - # The directory the bot should store various bits of information in dataPath: "/data/storage" diff --git a/src/appservice/config/config.harness.yaml b/apps/draupnir/src/appservice/config/config.harness.yaml similarity index 94% rename from src/appservice/config/config.harness.yaml rename to apps/draupnir/src/appservice/config/config.harness.yaml index f77b5c62..4d1b7201 100644 --- a/src/appservice/config/config.harness.yaml +++ b/apps/draupnir/src/appservice/config/config.harness.yaml @@ -8,9 +8,6 @@ db: adminRoom: "#draupnir-admin:localhost:9999" -webAPI: - port: 9001 - # The directory the bot should store various bits of information in dataPath: "./test/harness/mjolnir-data/" diff --git a/src/appservice/config/config.ts b/apps/draupnir/src/appservice/config/config.ts similarity index 91% rename from src/appservice/config/config.ts rename to apps/draupnir/src/appservice/config/config.ts index 70514d34..c5707ed2 100644 --- a/src/appservice/config/config.ts +++ b/apps/draupnir/src/appservice/config/config.ts @@ -80,18 +80,6 @@ export const AppserviceConfig = Type.Object({ }, { description: "Details for the database backend" } ), - webAPI: Type.Object( - { - port: Type.Number({ - description: - "Port number for the web API used to access the appservice via the widget", - }), - }, - { - description: - "Config for the web api used to access the appservice via the widget", - } - ), adminRoom: Type.String({ description: "The admin room for the appservice bot. Not called managementRoom like draupnir on purpose, so they're not mixed in code somehow.", diff --git a/src/appservice/datastore.ts b/apps/draupnir/src/appservice/datastore.ts similarity index 100% rename from src/appservice/datastore.ts rename to apps/draupnir/src/appservice/datastore.ts diff --git a/src/appservice/postgres/PgDataStore.ts b/apps/draupnir/src/appservice/postgres/PgDataStore.ts similarity index 76% rename from src/appservice/postgres/PgDataStore.ts rename to apps/draupnir/src/appservice/postgres/PgDataStore.ts index db3690bd..0fc03f70 100644 --- a/src/appservice/postgres/PgDataStore.ts +++ b/apps/draupnir/src/appservice/postgres/PgDataStore.ts @@ -2,22 +2,17 @@ // // SPDX-License-Identifier: Apache-2.0 -import { PostgresStore, SchemaUpdateFunction } from "matrix-appservice-bridge"; +import { PostgresStore } from "matrix-appservice-bridge"; import { DataStore, MjolnirRecord } from "../datastore"; -function getSchema(): SchemaUpdateFunction[] { - const nSchema = 2; - const schema = []; - for (let schemaID = 1; schemaID < nSchema + 1; schemaID++) { - // eslint-disable-next-line @typescript-eslint/no-var-requires - schema.push(require(`./schema/v${schemaID}`).runSchema); - } - return schema; -} +import { runSchema as v1 } from "./schema/v1"; +import { runSchema as v2 } from "./schema/v2"; + +const Schema = [v1, v2]; export class PgDataStore extends PostgresStore implements DataStore { constructor(connectionString: string) { - super(getSchema(), { url: connectionString }); + super(Schema, { url: connectionString }); } public async init(): Promise { diff --git a/src/appservice/postgres/schema/v1.ts b/apps/draupnir/src/appservice/postgres/schema/v1.ts similarity index 100% rename from src/appservice/postgres/schema/v1.ts rename to apps/draupnir/src/appservice/postgres/schema/v1.ts diff --git a/src/appservice/postgres/schema/v2.ts b/apps/draupnir/src/appservice/postgres/schema/v2.ts similarity index 100% rename from src/appservice/postgres/schema/v2.ts rename to apps/draupnir/src/appservice/postgres/schema/v2.ts diff --git a/src/backingstore/DraupnirStores.ts b/apps/draupnir/src/backingstore/DraupnirStores.ts similarity index 100% rename from src/backingstore/DraupnirStores.ts rename to apps/draupnir/src/backingstore/DraupnirStores.ts diff --git a/src/backingstore/better-sqlite3/BetterSqliteStore.ts b/apps/draupnir/src/backingstore/better-sqlite3/BetterSqliteStore.ts similarity index 100% rename from src/backingstore/better-sqlite3/BetterSqliteStore.ts rename to apps/draupnir/src/backingstore/better-sqlite3/BetterSqliteStore.ts diff --git a/src/backingstore/better-sqlite3/HashStore.ts b/apps/draupnir/src/backingstore/better-sqlite3/HashStore.ts similarity index 96% rename from src/backingstore/better-sqlite3/HashStore.ts rename to apps/draupnir/src/backingstore/better-sqlite3/HashStore.ts index d294f24c..83f77bdf 100644 --- a/src/backingstore/better-sqlite3/HashStore.ts +++ b/apps/draupnir/src/backingstore/better-sqlite3/HashStore.ts @@ -259,19 +259,19 @@ export class SqliteHashReversalStore }, "Error trying to reverse hashed policies"); } - private storeUndiscoveredEntities( - entities: string[], + private storeUndiscoveredEntities( + entities: TEntity[], filterStatement: Statement, insertOrIgnore: Statement, - recordFactoryFn: (entity: string, hash: string) => Record, - eventEmitFn: (newRecords: Record[]) => void, - serverExtractFn?: (record: Record) => StringServerName - ): Result { + recordFactoryFn: (entity: TEntity, hash: string) => TRecord, + eventEmitFn: (newRecords: TRecord[]) => void, + serverExtractFn?: (record: TRecord) => StringServerName + ): Result { return wrapInTryCatch(() => { const undiscoveredEntities = entities.filter((entity) => filterStatement.get(entity) ); - const rowsToInsert: Record[] = undiscoveredEntities.map((entity) => + const rowsToInsert: TRecord[] = undiscoveredEntities.map((entity) => recordFactoryFn( entity, createHash("sha256").update(entity, "utf8").digest("base64") diff --git a/src/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts b/apps/draupnir/src/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts similarity index 99% rename from src/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts rename to apps/draupnir/src/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts index 755d32bf..e688183a 100644 --- a/src/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts +++ b/apps/draupnir/src/backingstore/better-sqlite3/SqliteRoomStateBackingStore.ts @@ -200,7 +200,7 @@ export class SqliteRoomStateBackingStore .prepare(`SELECT json(event) FROM room_state_event WHERE room_id = ?`) .pluck() .iterate(roomID) as IterableIterator) { - const rawJson = JSON.parse(event, jsonReviver); + const rawJson: unknown = JSON.parse(event, jsonReviver); // We can't trust what's in the store, because our event decoders might have gotten // stricter in more recent versions. Meaning the store could have invalid events // that we don't want to blindly intern. diff --git a/src/backingstore/better-sqlite3/SqliteSchema.ts b/apps/draupnir/src/backingstore/better-sqlite3/SqliteSchema.ts similarity index 95% rename from src/backingstore/better-sqlite3/SqliteSchema.ts rename to apps/draupnir/src/backingstore/better-sqlite3/SqliteSchema.ts index 37847476..c2bcd3c2 100644 --- a/src/backingstore/better-sqlite3/SqliteSchema.ts +++ b/apps/draupnir/src/backingstore/better-sqlite3/SqliteSchema.ts @@ -86,10 +86,12 @@ export function checkKnownTables( unsortedKnownTables: string[] ): boolean { const knownTables = unsortedKnownTables.slice().sort(), - currentTables = db - .prepare(`SELECT name FROM "sqlite_master" WHERE type = 'table';`) - .pluck() - .all() + currentTables = ( + db + .prepare(`SELECT name FROM "sqlite_master" WHERE type = 'table';`) + .pluck() + .all() as string[] + ) .sort() .filter((table: string) => !/^sqlite_/.test(table)); if (knownTables.length !== currentTables.length) { diff --git a/src/capabilities/DraupnirRendererMessageCollector.tsx b/apps/draupnir/src/capabilities/DraupnirRendererMessageCollector.tsx similarity index 94% rename from src/capabilities/DraupnirRendererMessageCollector.tsx rename to apps/draupnir/src/capabilities/DraupnirRendererMessageCollector.tsx index d1880813..4fa1ae71 100644 --- a/src/capabilities/DraupnirRendererMessageCollector.tsx +++ b/apps/draupnir/src/capabilities/DraupnirRendererMessageCollector.tsx @@ -19,9 +19,7 @@ import { } from "@the-draupnir-project/interface-manager"; import { sendMatrixEventsFromDeadDocument } from "@the-draupnir-project/mps-interface-adaptor"; -export class DraupnirRendererMessageCollector - implements RendererMessageCollector -{ +export class DraupnirRendererMessageCollector implements RendererMessageCollector { constructor( private readonly roomMessageSender: RoomMessageSender, private readonly managementRoomID: StringRoomID diff --git a/src/capabilities/RendererMessageCollector.ts b/apps/draupnir/src/capabilities/RendererMessageCollector.ts similarity index 94% rename from src/capabilities/RendererMessageCollector.ts rename to apps/draupnir/src/capabilities/RendererMessageCollector.ts index c577fc9a..497c7ce4 100644 --- a/src/capabilities/RendererMessageCollector.ts +++ b/apps/draupnir/src/capabilities/RendererMessageCollector.ts @@ -35,9 +35,7 @@ export interface RendererMessage { /** * Used by capabilities to send messages to the users of Draupnir. */ -export class AbstractRendererMessageCollector - implements RendererMessageCollector -{ +export class AbstractRendererMessageCollector implements RendererMessageCollector { private readonly messages: RendererMessage[] = []; public getMessages(): RendererMessage[] { return this.messages; diff --git a/src/capabilities/RoomTakedownCapability.tsx b/apps/draupnir/src/capabilities/RoomTakedownCapability.tsx similarity index 100% rename from src/capabilities/RoomTakedownCapability.tsx rename to apps/draupnir/src/capabilities/RoomTakedownCapability.tsx diff --git a/src/capabilities/RoomTakedownCapabilityRenderer.tsx b/apps/draupnir/src/capabilities/RoomTakedownCapabilityRenderer.tsx similarity index 92% rename from src/capabilities/RoomTakedownCapabilityRenderer.tsx rename to apps/draupnir/src/capabilities/RoomTakedownCapabilityRenderer.tsx index 71e042c8..7f034824 100644 --- a/src/capabilities/RoomTakedownCapabilityRenderer.tsx +++ b/apps/draupnir/src/capabilities/RoomTakedownCapabilityRenderer.tsx @@ -64,11 +64,6 @@ function renderTakedown( } class StandardRoomTakedownCapabilityRenderer implements RoomTakedownCapability { - public readonly requiredEventPermissions = - this.capability.requiredEventPermissions; - public readonly requiredPermissions = this.capability.requiredPermissions; - public readonly requiredStatePermissions = - this.capability.requiredStatePermissions; constructor( private readonly description: DescriptionMeta, private readonly messageCollector: RendererMessageCollector, @@ -77,6 +72,18 @@ class StandardRoomTakedownCapabilityRenderer implements RoomTakedownCapability { // nothing to do. } + public get requiredEventPermissions() { + return this.capability.requiredEventPermissions; + } + + public get requiredPermissions() { + return this.capability.requiredPermissions; + } + + public get requiredStatePermissions() { + return this.capability.requiredStatePermissions; + } + public async isRoomTakendown(roomID: StringRoomID): Promise> { // pass this one through without rendering because it doesn't really have a consequence return await this.capability.isRoomTakendown(roomID); diff --git a/src/capabilities/ServerACLConsequencesRenderer.tsx b/apps/draupnir/src/capabilities/ServerACLConsequencesRenderer.tsx similarity index 91% rename from src/capabilities/ServerACLConsequencesRenderer.tsx rename to apps/draupnir/src/capabilities/ServerACLConsequencesRenderer.tsx index ab70aa59..0cfcbb11 100644 --- a/src/capabilities/ServerACLConsequencesRenderer.tsx +++ b/apps/draupnir/src/capabilities/ServerACLConsequencesRenderer.tsx @@ -32,9 +32,7 @@ import { renderRoomSetResult, } from "@the-draupnir-project/mps-interface-adaptor"; -class StandardServerBanSynchronisationCapabilityRenderer - implements ServerBanSynchronisationCapability -{ +class StandardServerBanSynchronisationCapabilityRenderer implements ServerBanSynchronisationCapability { constructor( private readonly description: DescriptionMeta, private readonly messageCollector: RendererMessageCollector, @@ -42,11 +40,6 @@ class StandardServerBanSynchronisationCapabilityRenderer ) { // nothing to do. } - public readonly requiredEventPermissions = - this.capability.requiredEventPermissions; - public readonly requiredPermissions = this.capability.requiredPermissions; - public readonly requiredStatePermissions = - this.capability.requiredStatePermissions; public async outcomeFromIntentInRoom( roomID: StringRoomID, projection: ServerBanIntentProjection @@ -111,6 +104,18 @@ class StandardServerBanSynchronisationCapabilityRenderer } return capabilityResult; } + + public get requiredEventPermissions() { + return this.capability.requiredEventPermissions; + } + + public get requiredPermissions() { + return this.capability.requiredPermissions; + } + + public get requiredStatePermissions() { + return this.capability.requiredStatePermissions; + } } describeCapabilityRenderer({ diff --git a/src/capabilities/StandardEventConsequencesRenderer.tsx b/apps/draupnir/src/capabilities/StandardEventConsequencesRenderer.tsx similarity index 90% rename from src/capabilities/StandardEventConsequencesRenderer.tsx rename to apps/draupnir/src/capabilities/StandardEventConsequencesRenderer.tsx index 139155ce..573e37fa 100644 --- a/src/capabilities/StandardEventConsequencesRenderer.tsx +++ b/apps/draupnir/src/capabilities/StandardEventConsequencesRenderer.tsx @@ -36,11 +36,6 @@ class StandardEventConsequencesRenderer implements EventConsequences { ) { // nothing to do. } - public readonly requiredEventPermissions = - this.capability.requiredEventPermissions; - public readonly requiredPermissions = this.capability.requiredPermissions; - public readonly requiredStatePermissions = - this.capability.requiredStatePermissions; public async consequenceForEvent( roomID: StringRoomID, eventID: StringEventID, @@ -69,6 +64,18 @@ class StandardEventConsequencesRenderer implements EventConsequences { this.messageCollector.addOneliner(this.description, this.capability, title); return capabilityResult; } + + public get requiredEventPermissions() { + return this.capability.requiredEventPermissions; + } + + public get requiredPermissions() { + return this.capability.requiredPermissions; + } + + public get requiredStatePermissions() { + return this.capability.requiredStatePermissions; + } } describeCapabilityRenderer({ diff --git a/src/capabilities/StandardUserConsequencesRenderer.tsx b/apps/draupnir/src/capabilities/StandardUserConsequencesRenderer.tsx similarity index 96% rename from src/capabilities/StandardUserConsequencesRenderer.tsx rename to apps/draupnir/src/capabilities/StandardUserConsequencesRenderer.tsx index 1f6d3d06..701c82ae 100644 --- a/src/capabilities/StandardUserConsequencesRenderer.tsx +++ b/apps/draupnir/src/capabilities/StandardUserConsequencesRenderer.tsx @@ -103,11 +103,17 @@ class StandardUserConsequencesRenderer implements UserConsequences { ) { // nothing to do. } - public readonly requiredEventPermissions = - this.capability.requiredEventPermissions; - public readonly requiredPermissions = this.capability.requiredPermissions; - public readonly requiredStatePermissions = - this.capability.requiredStatePermissions; + public get requiredEventPermissions() { + return this.capability.requiredEventPermissions; + } + + public get requiredPermissions() { + return this.capability.requiredPermissions; + } + + public get requiredStatePermissions() { + return this.capability.requiredStatePermissions; + } public async consequenceForUserInRoom( roomID: StringRoomID, diff --git a/src/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts b/apps/draupnir/src/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts similarity index 92% rename from src/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts rename to apps/draupnir/src/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts index 2cb77cf7..2f0d1922 100644 --- a/src/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts +++ b/apps/draupnir/src/capabilities/SynapseAdminRoomTakedown/SynapseAdminRoomTakedown.ts @@ -41,17 +41,15 @@ export class SynapseAdminRoomDetailsProvider implements RoomDetailsProvider { } } -export class SynapseAdminRoomTakedownCapability - implements RoomTakedownCapability -{ +export class SynapseAdminRoomTakedownCapability implements RoomTakedownCapability { public readonly requiredPermissions = []; public readonly requiredStatePermissions = []; public readonly requiredEventPermissions = []; - private readonly roomDetailsProvider = new SynapseAdminRoomDetailsProvider( - this.adminClient - ); + private readonly roomDetailsProvider: SynapseAdminRoomDetailsProvider; public constructor(private readonly adminClient: SynapseAdminClient) { - // nothing to do mare. + this.roomDetailsProvider = new SynapseAdminRoomDetailsProvider( + this.adminClient + ); } public async isRoomTakendown(roomID: StringRoomID): Promise> { @@ -118,12 +116,12 @@ export class SimulatedRoomTakedownCapability implements RoomTakedownCapability { public readonly requiredPermissions = []; public readonly requiredStatePermissions = []; public readonly requiredEventPermissions = []; - private readonly roomDetailsProvider = new SynapseAdminRoomDetailsProvider( - this.adminClient - ); + private readonly roomDetailsProvider: SynapseAdminRoomDetailsProvider; isSimulated?: true; public constructor(private readonly adminClient: SynapseAdminClient) { - // nothing to do mare. + this.roomDetailsProvider = new SynapseAdminRoomDetailsProvider( + this.adminClient + ); } public async isRoomTakendown(roomID: StringRoomID): Promise> { diff --git a/src/capabilities/capabilityIndex.ts b/apps/draupnir/src/capabilities/capabilityIndex.ts similarity index 100% rename from src/capabilities/capabilityIndex.ts rename to apps/draupnir/src/capabilities/capabilityIndex.ts diff --git a/src/commands/AliasCommands.ts b/apps/draupnir/src/commands/AliasCommands.ts similarity index 100% rename from src/commands/AliasCommands.ts rename to apps/draupnir/src/commands/AliasCommands.ts diff --git a/src/commands/Ban.tsx b/apps/draupnir/src/commands/Ban.tsx similarity index 100% rename from src/commands/Ban.tsx rename to apps/draupnir/src/commands/Ban.tsx diff --git a/src/commands/CreateBanListCommand.ts b/apps/draupnir/src/commands/CreateBanListCommand.ts similarity index 100% rename from src/commands/CreateBanListCommand.ts rename to apps/draupnir/src/commands/CreateBanListCommand.ts diff --git a/src/commands/DraupnirCommandDispatcher.ts b/apps/draupnir/src/commands/DraupnirCommandDispatcher.ts similarity index 100% rename from src/commands/DraupnirCommandDispatcher.ts rename to apps/draupnir/src/commands/DraupnirCommandDispatcher.ts diff --git a/src/commands/DraupnirCommandPrerequisites.ts b/apps/draupnir/src/commands/DraupnirCommandPrerequisites.ts similarity index 100% rename from src/commands/DraupnirCommandPrerequisites.ts rename to apps/draupnir/src/commands/DraupnirCommandPrerequisites.ts diff --git a/src/commands/DraupnirCommandTable.ts b/apps/draupnir/src/commands/DraupnirCommandTable.ts similarity index 100% rename from src/commands/DraupnirCommandTable.ts rename to apps/draupnir/src/commands/DraupnirCommandTable.ts diff --git a/src/commands/DraupnirCommands.ts b/apps/draupnir/src/commands/DraupnirCommands.ts similarity index 100% rename from src/commands/DraupnirCommands.ts rename to apps/draupnir/src/commands/DraupnirCommands.ts diff --git a/src/commands/Help.tsx b/apps/draupnir/src/commands/Help.tsx similarity index 100% rename from src/commands/Help.tsx rename to apps/draupnir/src/commands/Help.tsx diff --git a/src/commands/ImportCommand.ts b/apps/draupnir/src/commands/ImportCommand.ts similarity index 87% rename from src/commands/ImportCommand.ts rename to apps/draupnir/src/commands/ImportCommand.ts index 0a94dd44..7c70730f 100644 --- a/src/commands/ImportCommand.ts +++ b/apps/draupnir/src/commands/ImportCommand.ts @@ -10,10 +10,14 @@ import { ActionResult, + MembershipEventContent, MultipleErrors, PolicyRuleType, RoomActionError, RoomUpdateError, + ServerACLContent, + StateEvent, + Value, isError, } from "matrix-protection-suite"; import { resolveRoomReferenceSafe } from "matrix-protection-suite-for-matrix-bot-sdk"; @@ -65,17 +69,20 @@ export const DraupnirImportCommand = describeCommand({ if (isError(policyRoomEditor)) { return policyRoomEditor; } - const state = await draupnir.client.getRoomState( + const state = (await draupnir.client.getRoomState( importFromRoom.ok.toRoomIDOrAlias() - ); + )) as StateEvent[]; const errors: RoomUpdateError[] = []; for (const stateEvent of state) { - const content = stateEvent["content"] || {}; - if (!content || Object.keys(content).length === 0) continue; - + const content = stateEvent["content"]; + if (Object.keys(content).length === 0) { + // redacted event. + continue; + } if ( stateEvent["type"] === "m.room.member" && - stateEvent["state_key"] !== "" + stateEvent["state_key"] !== "" && + Value.Check(MembershipEventContent, content) ) { // Member event - check for ban if (content["membership"] === "ban") { @@ -93,7 +100,8 @@ export const DraupnirImportCommand = describeCommand({ } } else if ( stateEvent["type"] === "m.room.server_acl" && - stateEvent["state_key"] === "" + stateEvent["state_key"] === "" && + Value.Check(ServerACLContent, content) ) { // ACL event - ban denied servers if (!content["deny"]) continue; diff --git a/src/commands/KickCommand.tsx b/apps/draupnir/src/commands/KickCommand.tsx similarity index 99% rename from src/commands/KickCommand.tsx rename to apps/draupnir/src/commands/KickCommand.tsx index 40436189..614949c7 100644 --- a/src/commands/KickCommand.tsx +++ b/apps/draupnir/src/commands/KickCommand.tsx @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { MatrixGlob } from "matrix-bot-sdk"; +import { MatrixGlob } from "@vector-im/matrix-bot-sdk"; import { ActionError, Ok, diff --git a/src/commands/ProtectionsCapabilitiesCommand.tsx b/apps/draupnir/src/commands/ProtectionsCapabilitiesCommand.tsx similarity index 100% rename from src/commands/ProtectionsCapabilitiesCommand.tsx rename to apps/draupnir/src/commands/ProtectionsCapabilitiesCommand.tsx diff --git a/src/commands/ProtectionsCommands.tsx b/apps/draupnir/src/commands/ProtectionsCommands.tsx similarity index 100% rename from src/commands/ProtectionsCommands.tsx rename to apps/draupnir/src/commands/ProtectionsCommands.tsx diff --git a/src/commands/ProtectionsShowCommand.tsx b/apps/draupnir/src/commands/ProtectionsShowCommand.tsx similarity index 100% rename from src/commands/ProtectionsShowCommand.tsx rename to apps/draupnir/src/commands/ProtectionsShowCommand.tsx diff --git a/src/commands/RedactCommand.ts b/apps/draupnir/src/commands/RedactCommand.ts similarity index 100% rename from src/commands/RedactCommand.ts rename to apps/draupnir/src/commands/RedactCommand.ts diff --git a/src/commands/ResolveAlias.tsx b/apps/draupnir/src/commands/ResolveAlias.tsx similarity index 100% rename from src/commands/ResolveAlias.tsx rename to apps/draupnir/src/commands/ResolveAlias.tsx diff --git a/src/commands/Rooms.tsx b/apps/draupnir/src/commands/Rooms.tsx similarity index 100% rename from src/commands/Rooms.tsx rename to apps/draupnir/src/commands/Rooms.tsx diff --git a/src/commands/Rules.tsx b/apps/draupnir/src/commands/Rules.tsx similarity index 100% rename from src/commands/Rules.tsx rename to apps/draupnir/src/commands/Rules.tsx diff --git a/src/commands/SafeModeCommand.ts b/apps/draupnir/src/commands/SafeModeCommand.ts similarity index 100% rename from src/commands/SafeModeCommand.ts rename to apps/draupnir/src/commands/SafeModeCommand.ts diff --git a/src/commands/SetDisplayNameCommand.ts b/apps/draupnir/src/commands/SetDisplayNameCommand.ts similarity index 64% rename from src/commands/SetDisplayNameCommand.ts rename to apps/draupnir/src/commands/SetDisplayNameCommand.ts index e358078d..8a046b92 100644 --- a/src/commands/SetDisplayNameCommand.ts +++ b/apps/draupnir/src/commands/SetDisplayNameCommand.ts @@ -2,14 +2,14 @@ // // SPDX-License-Identifier: AFL-3.0 -import { Ok, Result } from "@gnuxie/typescript-result"; +import { isError, Ok, Result } from "@gnuxie/typescript-result"; import { StringPresentationType, describeCommand, } from "@the-draupnir-project/interface-manager"; import { Draupnir } from "../Draupnir"; -import { ActionError } from "matrix-protection-suite"; import { DraupnirInterfaceAdaptor } from "./DraupnirCommandPrerequisites"; +import { resultifyBotSDKRequestError } from "matrix-protection-suite-for-matrix-bot-sdk"; export const DraupnirDisplaynameCommand = describeCommand({ summary: @@ -26,15 +26,15 @@ export const DraupnirDisplaynameCommand = describeCommand({ displaynameParts ): Promise> { const displayname = displaynameParts.join(" "); - try { - await draupnir.client.setDisplayName(displayname); - } catch (e) { - const message = e.message || (e.body ? e.body.error : ""); - return ActionError.Result( - `Failed to set displayname to ${displayname}: ${message}` + const setDisplaynameResult = await draupnir.client + .setDisplayName(displayname) + .then((_) => Ok(undefined), resultifyBotSDKRequestError); + if (isError(setDisplaynameResult)) { + return setDisplaynameResult.elaborate( + `Failed to set displayname to ${displayname}` ); } - return Ok(undefined); + return setDisplaynameResult; }, }); diff --git a/src/commands/SetPowerLevelCommand.ts b/apps/draupnir/src/commands/SetPowerLevelCommand.ts similarity index 100% rename from src/commands/SetPowerLevelCommand.ts rename to apps/draupnir/src/commands/SetPowerLevelCommand.ts diff --git a/src/commands/StatusCommand.tsx b/apps/draupnir/src/commands/StatusCommand.tsx similarity index 98% rename from src/commands/StatusCommand.tsx rename to apps/draupnir/src/commands/StatusCommand.tsx index 9405aebb..0662b25f 100644 --- a/src/commands/StatusCommand.tsx +++ b/apps/draupnir/src/commands/StatusCommand.tsx @@ -135,7 +135,7 @@ export function draupnirStatusInfo(draupnir: Draupnir): StatusInfo { subscribedButPartedLists: watchedListInfo.subscribedButPartedLists, documentationURL: DOCUMENTATION_URL, version: SOFTWARE_VERSION, - repository: PACKAGE_JSON["repository"] ?? "Unknown", + repository: (PACKAGE_JSON["repository"] as string | undefined) ?? "Unknown", ...extractProtectionNotificationRooms(draupnir), }; } diff --git a/src/commands/WatchPreview.tsx b/apps/draupnir/src/commands/WatchPreview.tsx similarity index 100% rename from src/commands/WatchPreview.tsx rename to apps/draupnir/src/commands/WatchPreview.tsx diff --git a/src/commands/WatchUnwatchCommand.ts b/apps/draupnir/src/commands/WatchUnwatchCommand.ts similarity index 100% rename from src/commands/WatchUnwatchCommand.ts rename to apps/draupnir/src/commands/WatchUnwatchCommand.ts diff --git a/src/commands/server-admin/DeactivateCommand.tsx b/apps/draupnir/src/commands/server-admin/DeactivateCommand.tsx similarity index 100% rename from src/commands/server-admin/DeactivateCommand.tsx rename to apps/draupnir/src/commands/server-admin/DeactivateCommand.tsx diff --git a/src/commands/server-admin/HijackRoomCommand.ts b/apps/draupnir/src/commands/server-admin/HijackRoomCommand.ts similarity index 100% rename from src/commands/server-admin/HijackRoomCommand.ts rename to apps/draupnir/src/commands/server-admin/HijackRoomCommand.ts diff --git a/src/commands/server-admin/ShutdownRoomCommand.ts b/apps/draupnir/src/commands/server-admin/ShutdownRoomCommand.ts similarity index 100% rename from src/commands/server-admin/ShutdownRoomCommand.ts rename to apps/draupnir/src/commands/server-admin/ShutdownRoomCommand.ts diff --git a/src/commands/server-admin/SuspendCommand.tsx b/apps/draupnir/src/commands/server-admin/SuspendCommand.tsx similarity index 100% rename from src/commands/server-admin/SuspendCommand.tsx rename to apps/draupnir/src/commands/server-admin/SuspendCommand.tsx diff --git a/src/commands/server-admin/Takedown.tsx b/apps/draupnir/src/commands/server-admin/Takedown.tsx similarity index 100% rename from src/commands/server-admin/Takedown.tsx rename to apps/draupnir/src/commands/server-admin/Takedown.tsx diff --git a/src/commands/server-admin/UnrestrictCommand.tsx b/apps/draupnir/src/commands/server-admin/UnrestrictCommand.tsx similarity index 100% rename from src/commands/server-admin/UnrestrictCommand.tsx rename to apps/draupnir/src/commands/server-admin/UnrestrictCommand.tsx diff --git a/src/commands/unban/PolicyRemove.tsx b/apps/draupnir/src/commands/unban/PolicyRemove.tsx similarity index 100% rename from src/commands/unban/PolicyRemove.tsx rename to apps/draupnir/src/commands/unban/PolicyRemove.tsx diff --git a/src/commands/unban/Unban.tsx b/apps/draupnir/src/commands/unban/Unban.tsx similarity index 100% rename from src/commands/unban/Unban.tsx rename to apps/draupnir/src/commands/unban/Unban.tsx diff --git a/src/commands/unban/UnbanEntity.tsx b/apps/draupnir/src/commands/unban/UnbanEntity.tsx similarity index 100% rename from src/commands/unban/UnbanEntity.tsx rename to apps/draupnir/src/commands/unban/UnbanEntity.tsx diff --git a/src/commands/unban/UnbanUsers.tsx b/apps/draupnir/src/commands/unban/UnbanUsers.tsx similarity index 100% rename from src/commands/unban/UnbanUsers.tsx rename to apps/draupnir/src/commands/unban/UnbanUsers.tsx diff --git a/src/config.ts b/apps/draupnir/src/config.ts similarity index 95% rename from src/config.ts rename to apps/draupnir/src/config.ts index a33d1692..b87d90a3 100644 --- a/src/config.ts +++ b/apps/draupnir/src/config.ts @@ -10,7 +10,7 @@ import * as fs from "fs"; import { load } from "js-yaml"; -import { LogService, RichConsoleLogger } from "matrix-bot-sdk"; +import { LogService, RichConsoleLogger } from "@vector-im/matrix-bot-sdk"; // Needed for https://github.com/the-draupnir-project/Draupnir/issues/480 // sorry buddy... process.env.SUPPRESS_NO_CONFIG_WARNING = "y"; @@ -23,6 +23,13 @@ LogService.setLogger(new RichConsoleLogger()); setGlobalLoggerProvider(new RichConsoleLogger()); const log = new Logger("Draupnir config"); +/** + * Ideally we'd just have a schema for the config. + */ +function isConfigRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null; +} + /** * The version of the configuration that has been explicitly provided, * and does not contain default values. Secrets are marked with "REDACTED". @@ -30,26 +37,23 @@ const log = new Logger("Draupnir config"); export function getNonDefaultConfigProperties( config: IConfig ): Record { - const nonDefault = Config.util.diffDeep(defaultConfig, config); + const nonDefault = Config.util.diffDeep(defaultConfig, config) as Record< + string, + unknown + >; if ("accessToken" in nonDefault) { nonDefault.accessToken = "REDACTED"; } - if ( - "pantalaimon" in nonDefault && - typeof nonDefault.pantalaimon === "object" - ) { + if ("pantalaimon" in nonDefault && isConfigRecord(nonDefault.pantalaimon)) { nonDefault.pantalaimon.password = "REDACTED"; } if ( "web" in nonDefault && - typeof nonDefault["web"] === "object" && - nonDefault["web"] !== null && + isConfigRecord(nonDefault.web) && "synapseHTTPAntispam" in nonDefault["web"] && - typeof nonDefault["web"]["synapseHTTPAntispam"] === "object" + isConfigRecord(nonDefault["web"]["synapseHTTPAntispam"]) ) { - if (nonDefault["web"]["synapseHTTPAntispam"] !== null) { - nonDefault["web"]["synapseHTTPAntispam"].authorization = "REDACTED"; - } + nonDefault["web"]["synapseHTTPAntispam"].authorization = "REDACTED"; } return nonDefault; } @@ -271,7 +275,7 @@ const defaultConfig: IConfig = { }; export function getDefaultConfig(): IConfig { - return Config.util.cloneDeep(defaultConfig); + return Config.util.cloneDeep(defaultConfig) as IConfig; } function logNonDefaultConfiguration(config: IConfig): void { @@ -435,7 +439,7 @@ export function getProvisionedMjolnirConfig(managementRoomId: string): IConfig { allowedKeys.reduce((existingConfig, key) => { return { ...existingConfig, [key]: configTemplate[key as keyof IConfig] }; }, {}) - ); + ) as IConfig; config.managementRoom = managementRoomId; return config; @@ -445,7 +449,7 @@ export const PACKAGE_JSON = (() => { try { return JSON.parse( fs.readFileSync(path.join(__dirname, "../package.json"), "utf-8") - ); + ) as Record; } catch (e) { LogService.error("config", "Could not read Draupnir package.json", e); return {}; @@ -455,7 +459,7 @@ export const PACKAGE_JSON = (() => { export const SOFTWARE_VERSION = (() => { let versionFile; const defaultText = - PACKAGE_JSON.version ?? + (PACKAGE_JSON.version as string | undefined) ?? "A version was either not provided when building Draupnir or could not be read."; try { versionFile = fs.readFileSync( diff --git a/src/draupnirfactory/DraupnirFactory.ts b/apps/draupnir/src/draupnirfactory/DraupnirFactory.ts similarity index 97% rename from src/draupnirfactory/DraupnirFactory.ts rename to apps/draupnir/src/draupnirfactory/DraupnirFactory.ts index 784d0c7c..224d8ee2 100644 --- a/src/draupnirfactory/DraupnirFactory.ts +++ b/apps/draupnir/src/draupnirfactory/DraupnirFactory.ts @@ -43,7 +43,7 @@ async function safelyFetchProfile( ): Promise<{ displayname?: string } | undefined> { const clientProfileResult = await client.getUserProfile(clientUserID).then( (value) => Ok(value), - (error) => resultifyBotSDKRequestErrorWith404AsUndefined(error) + (error: unknown) => resultifyBotSDKRequestErrorWith404AsUndefined(error) ); // We opt to report to the log rather than fail outright. Because this is on the critical startup path // and when we did crash, we had unexplained server behaviour https://github.com/the-draupnir-project/Draupnir/issues/703 @@ -54,7 +54,7 @@ async function safelyFetchProfile( ); return undefined; } else { - return clientProfileResult.ok; + return clientProfileResult.ok as { displayname?: string }; } } diff --git a/src/draupnirfactory/DraupnirProtectedRoomsSet.ts b/apps/draupnir/src/draupnirfactory/DraupnirProtectedRoomsSet.ts similarity index 100% rename from src/draupnirfactory/DraupnirProtectedRoomsSet.ts rename to apps/draupnir/src/draupnirfactory/DraupnirProtectedRoomsSet.ts diff --git a/src/draupnirfactory/StandardDraupnirManager.ts b/apps/draupnir/src/draupnirfactory/StandardDraupnirManager.ts similarity index 100% rename from src/draupnirfactory/StandardDraupnirManager.ts rename to apps/draupnir/src/draupnirfactory/StandardDraupnirManager.ts diff --git a/src/health/healthz.ts b/apps/draupnir/src/health/healthz.ts similarity index 96% rename from src/health/healthz.ts rename to apps/draupnir/src/health/healthz.ts index 34f8619a..5c890bae 100644 --- a/src/health/healthz.ts +++ b/apps/draupnir/src/health/healthz.ts @@ -9,7 +9,7 @@ // import * as http from "http"; -import { LogService } from "matrix-bot-sdk"; +import { LogService } from "@vector-im/matrix-bot-sdk"; import { IConfig } from "../config"; // allowed to use the global configuration since this is only intended to be used by `src/index.ts`. diff --git a/src/index.ts b/apps/draupnir/src/index.ts similarity index 95% rename from src/index.ts rename to apps/draupnir/src/index.ts index c19f48b6..2e344e5b 100644 --- a/src/index.ts +++ b/apps/draupnir/src/index.ts @@ -17,7 +17,7 @@ import { PantalaimonClient, SimpleFsStorageProvider, RustSdkCryptoStorageProvider, -} from "matrix-bot-sdk"; +} from "@vector-im/matrix-bot-sdk"; import { StoreType } from "@matrix-org/matrix-sdk-crypto-nodejs"; import { configRead as configRead, getStoragePath } from "./config"; import { initializeSentry } from "./utils"; @@ -99,9 +99,10 @@ void (async function () { ); } catch (err) { console.error( - `Failed to setup draupnir from the config ${config.dataPath}: ${err}` + `Failed to setup draupnir from the config ${config.dataPath}`, + err ); - await bot?.stopEverything(); + await bot?.[Symbol.asyncDispose](); throw err; } try { @@ -109,8 +110,8 @@ void (async function () { await bot.encryptionInitialized(); healthz.isHealthy = true; } catch (err) { - console.error(`Draupnir failed to start: ${err}`); - await bot.stopEverything(); + console.error(`Draupnir failed to start:`, err); + await bot[Symbol.asyncDispose](); throw err; } })(); diff --git a/src/managementroom/ManagementRoomDetail.ts b/apps/draupnir/src/managementroom/ManagementRoomDetail.ts similarity index 100% rename from src/managementroom/ManagementRoomDetail.ts rename to apps/draupnir/src/managementroom/ManagementRoomDetail.ts diff --git a/src/managementroom/ManagementRoomOutput.ts b/apps/draupnir/src/managementroom/ManagementRoomOutput.ts similarity index 98% rename from src/managementroom/ManagementRoomOutput.ts rename to apps/draupnir/src/managementroom/ManagementRoomOutput.ts index 79c64cc9..fc11f08e 100644 --- a/src/managementroom/ManagementRoomOutput.ts +++ b/apps/draupnir/src/managementroom/ManagementRoomOutput.ts @@ -14,7 +14,7 @@ import { LogService, MessageType, TextualMessageEventContent, -} from "matrix-bot-sdk"; +} from "@vector-im/matrix-bot-sdk"; import { IConfig } from "../config"; import { htmlEscape } from "../utils"; import { MatrixSendClient } from "matrix-protection-suite-for-matrix-bot-sdk"; @@ -60,9 +60,7 @@ export interface ManagementRoomOutput { /** * Allows the different componenets of draupnir to send messages back to the management room without introducing a dependency on the entirity of a `Draupnir` instance. */ -export default class StandardManagementRoomOutput - implements ManagementRoomOutput -{ +export default class StandardManagementRoomOutput implements ManagementRoomOutput { private isSuccessfullySendingMessages = false; constructor( private readonly managementRoomDetail: ManagementRoomDetail, diff --git a/src/models/RoomUpdateError.tsx b/apps/draupnir/src/models/RoomUpdateError.tsx similarity index 100% rename from src/models/RoomUpdateError.tsx rename to apps/draupnir/src/models/RoomUpdateError.tsx diff --git a/src/protections/BanPropagation.tsx b/apps/draupnir/src/protections/BanPropagation.tsx similarity index 100% rename from src/protections/BanPropagation.tsx rename to apps/draupnir/src/protections/BanPropagation.tsx diff --git a/src/protections/BasicFlooding.ts b/apps/draupnir/src/protections/BasicFlooding.ts similarity index 98% rename from src/protections/BasicFlooding.ts rename to apps/draupnir/src/protections/BasicFlooding.ts index 5a49b512..eed8ef3b 100644 --- a/src/protections/BasicFlooding.ts +++ b/apps/draupnir/src/protections/BasicFlooding.ts @@ -16,7 +16,7 @@ import { } from "@the-draupnir-project/matrix-basic-types"; import { Draupnir } from "../Draupnir"; import { DraupnirProtection } from "./Protection"; -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import { AbstractProtection, ActionResult, @@ -118,7 +118,7 @@ function lastEventsRoomEntry( if (roomEntry) { return roomEntry; } else { - const nextEntry = new Map(); + const nextEntry = new Map(); lastEvents.set(roomID, nextEntry); return nextEntry; } diff --git a/src/protections/BlockInvitationsOnServerProtection.tsx b/apps/draupnir/src/protections/BlockInvitationsOnServerProtection.tsx similarity index 100% rename from src/protections/BlockInvitationsOnServerProtection.tsx rename to apps/draupnir/src/protections/BlockInvitationsOnServerProtection.tsx diff --git a/src/protections/ConfigHooks.ts b/apps/draupnir/src/protections/ConfigHooks.ts similarity index 100% rename from src/protections/ConfigHooks.ts rename to apps/draupnir/src/protections/ConfigHooks.ts diff --git a/src/protections/ConfigMigration/CapabilitySetProviderMigration.ts b/apps/draupnir/src/protections/ConfigMigration/CapabilitySetProviderMigration.ts similarity index 100% rename from src/protections/ConfigMigration/CapabilitySetProviderMigration.ts rename to apps/draupnir/src/protections/ConfigMigration/CapabilitySetProviderMigration.ts diff --git a/src/protections/ConfigMigration/DefaultEnabledProtectionsMigration.ts b/apps/draupnir/src/protections/ConfigMigration/DefaultEnabledProtectionsMigration.ts similarity index 100% rename from src/protections/ConfigMigration/DefaultEnabledProtectionsMigration.ts rename to apps/draupnir/src/protections/ConfigMigration/DefaultEnabledProtectionsMigration.ts diff --git a/src/protections/DraupnirNews/DraupnirNews.tsx b/apps/draupnir/src/protections/DraupnirNews/DraupnirNews.tsx similarity index 91% rename from src/protections/DraupnirNews/DraupnirNews.tsx rename to apps/draupnir/src/protections/DraupnirNews/DraupnirNews.tsx index 121bd5d2..1ced5b5d 100644 --- a/src/protections/DraupnirNews/DraupnirNews.tsx +++ b/apps/draupnir/src/protections/DraupnirNews/DraupnirNews.tsx @@ -159,15 +159,16 @@ async function fetchNews(newsURL: string): Promise> { * - unregisterListeners MUST be called when the parent protection is disposed. */ export class DraupnirNewsReader { - private readonly newsGate = new StandardTimedGate( - this.requestNews.bind(this), - this.requestIntervalMS - ); + private readonly newsGate: StandardTimedGate; private requestLoop: ConstantPeriodBatch; public constructor( private readonly lifecycle: DraupnirNewsLifecycle, private readonly requestIntervalMS: number ) { + this.newsGate = new StandardTimedGate( + this.requestNews.bind(this), + this.requestIntervalMS + ); this.newsGate.enqueueOpen(); this.requestLoop = this.createRequestLoop(); } @@ -219,22 +220,7 @@ export class DraupnirNews extends AbstractProtection implements DraupnirProtection { - private readonly newsReader = new DraupnirNewsReader( - new DraupnirNewsLifecycle( - new Set(this.settings.seenNews), - FSNews, - this.updateNews.bind(this), - () => fetchNews(this.draupnir.config.draupnirNewsURL), - (item) => - this.draupnir.clientPlatform - .toRoomMessageSender() - .sendMessage( - this.draupnir.managementRoomID, - item.matrix_event_content - ) as Promise> - ), - 4.32e7 // 12 hours - ); + private readonly newsReader: DraupnirNewsReader; public constructor( description: DraupnirNewsDescription, lifetime: OwnLifetime>, @@ -244,6 +230,22 @@ export class DraupnirNews private readonly draupnir: Draupnir ) { super(description, lifetime, capabilities, protectedRoomsSet, {}); + this.newsReader = new DraupnirNewsReader( + new DraupnirNewsLifecycle( + new Set(this.settings.seenNews), + FSNews, + this.updateNews.bind(this), + () => fetchNews(this.draupnir.config.draupnirNewsURL), + (item) => + this.draupnir.clientPlatform + .toRoomMessageSender() + .sendMessage( + this.draupnir.managementRoomID, + item.matrix_event_content + ) as Promise> + ), + 4.32e7 // 12 hours + ); } private async updateNews(allNews: DraupnirNewsItem[]): Promise> { diff --git a/src/protections/DraupnirNews/news.json b/apps/draupnir/src/protections/DraupnirNews/news.json similarity index 100% rename from src/protections/DraupnirNews/news.json rename to apps/draupnir/src/protections/DraupnirNews/news.json diff --git a/src/protections/DraupnirNews/news.json.license b/apps/draupnir/src/protections/DraupnirNews/news.json.license similarity index 100% rename from src/protections/DraupnirNews/news.json.license rename to apps/draupnir/src/protections/DraupnirNews/news.json.license diff --git a/src/protections/DraupnirProtectionsIndex.ts b/apps/draupnir/src/protections/DraupnirProtectionsIndex.ts similarity index 100% rename from src/protections/DraupnirProtectionsIndex.ts rename to apps/draupnir/src/protections/DraupnirProtectionsIndex.ts diff --git a/src/protections/FirstMessageIsImage.ts b/apps/draupnir/src/protections/FirstMessageIsImage.ts similarity index 98% rename from src/protections/FirstMessageIsImage.ts rename to apps/draupnir/src/protections/FirstMessageIsImage.ts index 233161c9..153995ae 100644 --- a/src/protections/FirstMessageIsImage.ts +++ b/apps/draupnir/src/protections/FirstMessageIsImage.ts @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { LogLevel, LogService } from "matrix-bot-sdk"; +import { LogLevel, LogService } from "@vector-im/matrix-bot-sdk"; import { AbstractProtection, ActionResult, diff --git a/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyApplication.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyApplication.ts similarity index 100% rename from src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyApplication.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyApplication.ts diff --git a/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts similarity index 98% rename from src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts index a39e8ab1..6048df03 100644 --- a/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts +++ b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPolicyProtection.ts @@ -22,7 +22,7 @@ import { StringRoomID, userServerName, } from "@the-draupnir-project/matrix-basic-types"; -import { MatrixGlob } from "matrix-bot-sdk"; +import { MatrixGlob } from "@vector-im/matrix-bot-sdk"; import { Ok, Result, ResultError } from "@gnuxie/typescript-result"; import { SynapseAdminUserSuspensionCapability } from "./UserSuspensionCapability"; import { diff --git a/src/protections/HomeserverUserPolicyApplication/HomeserverUserPurgingDeactivate.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPurgingDeactivate.ts similarity index 100% rename from src/protections/HomeserverUserPolicyApplication/HomeserverUserPurgingDeactivate.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/HomeserverUserPurgingDeactivate.ts diff --git a/src/protections/HomeserverUserPolicyApplication/SqliteUserRestrictionAuditLog.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/SqliteUserRestrictionAuditLog.ts similarity index 100% rename from src/protections/HomeserverUserPolicyApplication/SqliteUserRestrictionAuditLog.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/SqliteUserRestrictionAuditLog.ts diff --git a/src/protections/HomeserverUserPolicyApplication/UserRestrictionAuditLog.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionAuditLog.ts similarity index 100% rename from src/protections/HomeserverUserPolicyApplication/UserRestrictionAuditLog.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionAuditLog.ts diff --git a/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapability.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapability.ts similarity index 100% rename from src/protections/HomeserverUserPolicyApplication/UserRestrictionCapability.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapability.ts diff --git a/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx similarity index 90% rename from src/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx index 147047ed..7acf5412 100644 --- a/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx +++ b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserRestrictionCapabilityRenderer.tsx @@ -54,15 +54,7 @@ function renderUserRestriction( ); } -class StandardUserRestrictionCapabilityRenderer - implements UserRestrictionCapability -{ - public readonly requiredEventPermissions = - this.capability.requiredEventPermissions; - public readonly requiredPermissions = this.capability.requiredPermissions; - public readonly requiredStatePermissions = - this.capability.requiredStatePermissions; - public readonly isSimulated = Boolean(this.capability.isSimulated); +class StandardUserRestrictionCapabilityRenderer implements UserRestrictionCapability { constructor( private readonly description: DescriptionMeta, private readonly messageCollector: RendererMessageCollector, @@ -70,6 +62,22 @@ class StandardUserRestrictionCapabilityRenderer ) { // nothing to do. } + + public get requiredEventPermissions() { + return this.capability.requiredEventPermissions; + } + + public get requiredPermissions() { + return this.capability.requiredPermissions; + } + + public get requiredStatePermissions() { + return this.capability.requiredStatePermissions; + } + + public get isSimulated() { + return Boolean(this.capability.isSimulated); + } public async isUserRestricted( userID: StringUserID ): Promise> { diff --git a/src/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts similarity index 97% rename from src/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts index bd4f0322..786f1b48 100644 --- a/src/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts +++ b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/UserSuspensionCapability.ts @@ -21,9 +21,7 @@ import "./UserRestrictionCapability"; const log = new Logger("SynapseAdminUserSuspensionCapability"); -export class SynapseAdminUserSuspensionCapability - implements UserRestrictionCapability -{ +export class SynapseAdminUserSuspensionCapability implements UserRestrictionCapability { public readonly requiredPermissions = []; public readonly requiredStatePermissions = []; public readonly requiredEventPermissions = []; diff --git a/src/protections/HomeserverUserPolicyApplication/deactivateUser.ts b/apps/draupnir/src/protections/HomeserverUserPolicyApplication/deactivateUser.ts similarity index 100% rename from src/protections/HomeserverUserPolicyApplication/deactivateUser.ts rename to apps/draupnir/src/protections/HomeserverUserPolicyApplication/deactivateUser.ts diff --git a/src/protections/InvalidEventProtection.tsx b/apps/draupnir/src/protections/InvalidEventProtection.tsx similarity index 99% rename from src/protections/InvalidEventProtection.tsx rename to apps/draupnir/src/protections/InvalidEventProtection.tsx index 48533d11..ae2f0703 100644 --- a/src/protections/InvalidEventProtection.tsx +++ b/apps/draupnir/src/protections/InvalidEventProtection.tsx @@ -54,7 +54,7 @@ type InvalidEventProtectionSettings = EDStatic< >; export type InvalidEventProtectionDescription = ProtectionDescription< - unknown, + Draupnir, typeof InvalidEventProtectionSettings, InvalidEventProtectionCapabilities >; diff --git a/src/protections/JoinWaveShortCircuit.tsx b/apps/draupnir/src/protections/JoinWaveShortCircuit.tsx similarity index 99% rename from src/protections/JoinWaveShortCircuit.tsx rename to apps/draupnir/src/protections/JoinWaveShortCircuit.tsx index f1569f98..878bb274 100644 --- a/src/protections/JoinWaveShortCircuit.tsx +++ b/apps/draupnir/src/protections/JoinWaveShortCircuit.tsx @@ -27,7 +27,7 @@ import { describeProtection, isError, } from "matrix-protection-suite"; -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import { Draupnir } from "../Draupnir"; import { DraupnirProtection } from "./Protection"; import { diff --git a/src/protections/MembershipChangeProtection.tsx b/apps/draupnir/src/protections/MembershipChangeProtection.tsx similarity index 95% rename from src/protections/MembershipChangeProtection.tsx rename to apps/draupnir/src/protections/MembershipChangeProtection.tsx index f4c427f1..46e8f663 100644 --- a/src/protections/MembershipChangeProtection.tsx +++ b/apps/draupnir/src/protections/MembershipChangeProtection.tsx @@ -76,7 +76,7 @@ function makeBucketKey(roomID: StringRoomID, userID: StringUserID): string { } export type MembershipChangeProtectionDescription = ProtectionDescription< - unknown, + Draupnir, typeof MembershipChangeProtectionSettings, MembershipChangeProtectionCapabilities >; @@ -88,13 +88,8 @@ export class MembershipChangeProtection private readonly finalConsequences: UserConsequences; public readonly changeBucket: LeakyBucket; // just a crap attempt to stop consequences being spammed - private readonly consequenceBucket = new LazyLeakyBucket( - 1, - this.timescaleMilliseconds() - ); - private readonly warningThreshold = Math.floor( - this.settings.maxChangesPerUser * 0.6 - ); + private readonly consequenceBucket: LazyLeakyBucket; + private readonly warningThreshold: number; constructor( description: MembershipChangeProtectionDescription, lifetime: OwnLifetime>, @@ -105,6 +100,11 @@ export class MembershipChangeProtection ) { super(description, lifetime, capabilities, protectedRoomsSet, {}); this.finalConsequences = capabilities.finalConsequences; + this.consequenceBucket = new LazyLeakyBucket( + 1, + this.timescaleMilliseconds() + ); + this.warningThreshold = Math.floor(this.settings.maxChangesPerUser * 0.6); this.changeBucket = new LazyLeakyBucket( this.settings.maxChangesPerUser, this.timescaleMilliseconds() diff --git a/src/protections/MentionLimitProtection.tsx b/apps/draupnir/src/protections/MentionLimitProtection.tsx similarity index 99% rename from src/protections/MentionLimitProtection.tsx rename to apps/draupnir/src/protections/MentionLimitProtection.tsx index 38bebedc..65decbee 100644 --- a/src/protections/MentionLimitProtection.tsx +++ b/apps/draupnir/src/protections/MentionLimitProtection.tsx @@ -122,7 +122,7 @@ type MentionLimitProtectionSettings = EDStatic< >; export type MentionLimitProtectionDescription = ProtectionDescription< - unknown, + Draupnir, typeof MentionLimitProtectionSettings, MentionLimitProtectionCapabilities >; diff --git a/src/protections/MessageIsMedia.ts b/apps/draupnir/src/protections/MessageIsMedia.ts similarity index 98% rename from src/protections/MessageIsMedia.ts rename to apps/draupnir/src/protections/MessageIsMedia.ts index a752100a..502cf725 100644 --- a/src/protections/MessageIsMedia.ts +++ b/apps/draupnir/src/protections/MessageIsMedia.ts @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import { AbstractProtection, ActionResult, diff --git a/src/protections/MessageIsVoice.ts b/apps/draupnir/src/protections/MessageIsVoice.ts similarity index 98% rename from src/protections/MessageIsVoice.ts rename to apps/draupnir/src/protections/MessageIsVoice.ts index e158b734..e93b0504 100644 --- a/src/protections/MessageIsVoice.ts +++ b/apps/draupnir/src/protections/MessageIsVoice.ts @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import { AbstractProtection, ActionResult, diff --git a/src/protections/MissingProtectionPermissions.tsx b/apps/draupnir/src/protections/MissingProtectionPermissions.tsx similarity index 100% rename from src/protections/MissingProtectionPermissions.tsx rename to apps/draupnir/src/protections/MissingProtectionPermissions.tsx diff --git a/src/protections/NewJoinerProtection.ts b/apps/draupnir/src/protections/NewJoinerProtection.ts similarity index 99% rename from src/protections/NewJoinerProtection.ts rename to apps/draupnir/src/protections/NewJoinerProtection.ts index b56aa26f..c4a06c1b 100644 --- a/src/protections/NewJoinerProtection.ts +++ b/apps/draupnir/src/protections/NewJoinerProtection.ts @@ -25,7 +25,7 @@ import { IConfig } from "../config"; import { userServerName } from "@the-draupnir-project/matrix-basic-types"; export type NewJoinerProtectionDescription = ProtectionDescription< - unknown, + Draupnir, UnknownConfig, NewJoinerProtectionCapabilities >; diff --git a/src/protections/NotificationRoom/NotificationRoom.ts b/apps/draupnir/src/protections/NotificationRoom/NotificationRoom.ts similarity index 98% rename from src/protections/NotificationRoom/NotificationRoom.ts rename to apps/draupnir/src/protections/NotificationRoom/NotificationRoom.ts index 4c994e11..5896b5f6 100644 --- a/src/protections/NotificationRoom/NotificationRoom.ts +++ b/apps/draupnir/src/protections/NotificationRoom/NotificationRoom.ts @@ -65,8 +65,8 @@ export class NotificationRoomCreator< } public static async createNotificationRoomFromDraupnir< - TProtectionDescription extends - ProtectionDescription = ProtectionDescription, + TProtectionDescription extends ProtectionDescription = + ProtectionDescription, >( draupnir: Draupnir, description: TProtectionDescription, diff --git a/src/protections/PolicyChangeNotification.tsx b/apps/draupnir/src/protections/PolicyChangeNotification.tsx similarity index 100% rename from src/protections/PolicyChangeNotification.tsx rename to apps/draupnir/src/protections/PolicyChangeNotification.tsx diff --git a/src/protections/ProtectedRooms/ProtectJoinedRooms.tsx b/apps/draupnir/src/protections/ProtectedRooms/ProtectJoinedRooms.tsx similarity index 100% rename from src/protections/ProtectedRooms/ProtectJoinedRooms.tsx rename to apps/draupnir/src/protections/ProtectedRooms/ProtectJoinedRooms.tsx diff --git a/src/protections/ProtectedRooms/ProtectReplacementRooms.tsx b/apps/draupnir/src/protections/ProtectedRooms/ProtectReplacementRooms.tsx similarity index 100% rename from src/protections/ProtectedRooms/ProtectReplacementRooms.tsx rename to apps/draupnir/src/protections/ProtectedRooms/ProtectReplacementRooms.tsx diff --git a/src/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx b/apps/draupnir/src/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx similarity index 77% rename from src/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx rename to apps/draupnir/src/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx index b64c56ec..f5b484e0 100644 --- a/src/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx +++ b/apps/draupnir/src/protections/ProtectedRooms/RoomsSetBehaviourProtection.tsx @@ -39,27 +39,38 @@ export class RoomsSetBehaviour extends AbstractProtection implements DraupnirProtection { - private readonly protectJoinedRooms = new ProtectedJoinedRooms( - this.draupnir.clientUserID, - this.draupnir.managementRoomID, - this.protectedRoomsSet, - this.draupnir.clientRooms, - this.draupnir.clientPlatform.toRoomMessageSender() - ); - private readonly unprotectedPartedRooms = new UnprotectPartedRooms( - this.draupnir.clientUserID, - this.draupnir.managementRoomID, - this.protectedRoomsSet.protectedRoomsManager, - this.draupnir.clientPlatform.toRoomMessageSender() - ); - private readonly protectReplacementRooms = new ProtectReplacementRooms( - this.draupnir.managementRoomID, - this.draupnir.clientPlatform.toRoomJoiner(), - this.draupnir.clientPlatform.toRoomMessageSender(), - this.protectedRoomsSet.protectedRoomsManager - ); - private readonly watchReplacementPolicyRooms = - new WatchReplacementPolicyRooms( + private readonly protectJoinedRooms: ProtectedJoinedRooms; + private readonly unprotectedPartedRooms: UnprotectPartedRooms; + private readonly protectReplacementRooms: ProtectReplacementRooms; + private readonly watchReplacementPolicyRooms: WatchReplacementPolicyRooms; + public constructor( + description: RoomsSetBehaviourDescription, + lifetime: OwnLifetime>, + capabilities: RoomsSetBehaviourCapabailities, + protectedRoomsSet: ProtectedRoomsSet, + private readonly draupnir: Draupnir + ) { + super(description, lifetime, capabilities, protectedRoomsSet, {}); + this.protectJoinedRooms = new ProtectedJoinedRooms( + this.draupnir.clientUserID, + this.draupnir.managementRoomID, + this.protectedRoomsSet, + this.draupnir.clientRooms, + this.draupnir.clientPlatform.toRoomMessageSender() + ); + this.unprotectedPartedRooms = new UnprotectPartedRooms( + this.draupnir.clientUserID, + this.draupnir.managementRoomID, + this.protectedRoomsSet.protectedRoomsManager, + this.draupnir.clientPlatform.toRoomMessageSender() + ); + this.protectReplacementRooms = new ProtectReplacementRooms( + this.draupnir.managementRoomID, + this.draupnir.clientPlatform.toRoomJoiner(), + this.draupnir.clientPlatform.toRoomMessageSender(), + this.protectedRoomsSet.protectedRoomsManager + ); + this.watchReplacementPolicyRooms = new WatchReplacementPolicyRooms( this.draupnir.managementRoomID, this.draupnir.clientPlatform.toRoomJoiner(), this.draupnir.clientPlatform.toRoomMessageSender(), @@ -69,14 +80,6 @@ export class RoomsSetBehaviour this.draupnir.policyRoomManager, this.draupnir.reactionHandler ); - public constructor( - description: RoomsSetBehaviourDescription, - lifetime: OwnLifetime>, - capabilities: RoomsSetBehaviourCapabailities, - protectedRoomsSet: ProtectedRoomsSet, - private readonly draupnir: Draupnir - ) { - super(description, lifetime, capabilities, protectedRoomsSet, {}); if (this.draupnir.config.protectAllJoinedRooms) { void this.protectJoinedRooms.syncProtectedRooms(); } diff --git a/src/protections/ProtectedRooms/UnprotectPartedRooms.tsx b/apps/draupnir/src/protections/ProtectedRooms/UnprotectPartedRooms.tsx similarity index 100% rename from src/protections/ProtectedRooms/UnprotectPartedRooms.tsx rename to apps/draupnir/src/protections/ProtectedRooms/UnprotectPartedRooms.tsx diff --git a/src/protections/ProtectedRooms/WatchReplacementPolicyRooms.tsx b/apps/draupnir/src/protections/ProtectedRooms/WatchReplacementPolicyRooms.tsx similarity index 100% rename from src/protections/ProtectedRooms/WatchReplacementPolicyRooms.tsx rename to apps/draupnir/src/protections/ProtectedRooms/WatchReplacementPolicyRooms.tsx diff --git a/src/protections/ProtectedRoomsSetRenderers.tsx b/apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx similarity index 100% rename from src/protections/ProtectedRoomsSetRenderers.tsx rename to apps/draupnir/src/protections/ProtectedRoomsSetRenderers.tsx diff --git a/src/protections/Protection.ts b/apps/draupnir/src/protections/Protection.ts similarity index 76% rename from src/protections/Protection.ts rename to apps/draupnir/src/protections/Protection.ts index 53ca373d..5b0fd41b 100644 --- a/src/protections/Protection.ts +++ b/apps/draupnir/src/protections/Protection.ts @@ -10,5 +10,6 @@ import { Protection } from "matrix-protection-suite"; -export interface DraupnirProtection - extends Protection {} +export interface DraupnirProtection< + TProtectionDescription, +> extends Protection {} diff --git a/src/protections/RedactionSynchronisation.ts b/apps/draupnir/src/protections/RedactionSynchronisation.ts similarity index 99% rename from src/protections/RedactionSynchronisation.ts rename to apps/draupnir/src/protections/RedactionSynchronisation.ts index d026c634..ba4873f9 100644 --- a/src/protections/RedactionSynchronisation.ts +++ b/apps/draupnir/src/protections/RedactionSynchronisation.ts @@ -186,9 +186,7 @@ interface RedactionSynchronisation { handleMembershipChange(change: MembershipChange): void; } -export class StandardRedactionSynchronisation - implements RedactionSynchronisation -{ +export class StandardRedactionSynchronisation implements RedactionSynchronisation { public constructor( private readonly automaticRedactionReasons: MatrixGlob[], private readonly consequences: RedactionSynchronisationConsequences, diff --git a/src/protections/RoomTakedown/DiscoveredRoomStore.ts b/apps/draupnir/src/protections/RoomTakedown/DiscoveredRoomStore.ts similarity index 100% rename from src/protections/RoomTakedown/DiscoveredRoomStore.ts rename to apps/draupnir/src/protections/RoomTakedown/DiscoveredRoomStore.ts diff --git a/src/protections/RoomTakedown/RoomAuditLog.ts b/apps/draupnir/src/protections/RoomTakedown/RoomAuditLog.ts similarity index 100% rename from src/protections/RoomTakedown/RoomAuditLog.ts rename to apps/draupnir/src/protections/RoomTakedown/RoomAuditLog.ts diff --git a/src/protections/RoomTakedown/RoomDiscovery.ts b/apps/draupnir/src/protections/RoomTakedown/RoomDiscovery.ts similarity index 100% rename from src/protections/RoomTakedown/RoomDiscovery.ts rename to apps/draupnir/src/protections/RoomTakedown/RoomDiscovery.ts diff --git a/src/protections/RoomTakedown/RoomDiscoveryRenderer.tsx b/apps/draupnir/src/protections/RoomTakedown/RoomDiscoveryRenderer.tsx similarity index 100% rename from src/protections/RoomTakedown/RoomDiscoveryRenderer.tsx rename to apps/draupnir/src/protections/RoomTakedown/RoomDiscoveryRenderer.tsx diff --git a/src/protections/RoomTakedown/RoomTakedown.ts b/apps/draupnir/src/protections/RoomTakedown/RoomTakedown.ts similarity index 100% rename from src/protections/RoomTakedown/RoomTakedown.ts rename to apps/draupnir/src/protections/RoomTakedown/RoomTakedown.ts diff --git a/src/protections/RoomTakedown/RoomTakedownProtection.ts b/apps/draupnir/src/protections/RoomTakedown/RoomTakedownProtection.ts similarity index 99% rename from src/protections/RoomTakedown/RoomTakedownProtection.ts rename to apps/draupnir/src/protections/RoomTakedown/RoomTakedownProtection.ts index cf4e2a32..885d7034 100644 --- a/src/protections/RoomTakedown/RoomTakedownProtection.ts +++ b/apps/draupnir/src/protections/RoomTakedown/RoomTakedownProtection.ts @@ -43,7 +43,7 @@ import { Type } from "@sinclair/typebox"; import { EDStatic } from "matrix-protection-suite/dist/Interface/Static"; import { renderDiscoveredRoom } from "./RoomDiscoveryRenderer"; import { NotificationRoomCreator } from "../NotificationRoom/NotificationRoom"; -import { MatrixGlob } from "matrix-bot-sdk"; +import { MatrixGlob } from "@vector-im/matrix-bot-sdk"; import { SynapseHTTPAntispamRoomExplorer } from "./SynapseHTTPAntispamRoomExplorer"; import { SynapseRoomListRoomExplorer, diff --git a/src/protections/RoomTakedown/SqliteRoomAuditLog.ts b/apps/draupnir/src/protections/RoomTakedown/SqliteRoomAuditLog.ts similarity index 100% rename from src/protections/RoomTakedown/SqliteRoomAuditLog.ts rename to apps/draupnir/src/protections/RoomTakedown/SqliteRoomAuditLog.ts diff --git a/src/protections/RoomTakedown/SynapseAdminRoomDetails.ts b/apps/draupnir/src/protections/RoomTakedown/SynapseAdminRoomDetails.ts similarity index 100% rename from src/protections/RoomTakedown/SynapseAdminRoomDetails.ts rename to apps/draupnir/src/protections/RoomTakedown/SynapseAdminRoomDetails.ts diff --git a/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts b/apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts similarity index 98% rename from src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts rename to apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts index 4a364e8f..d9e5dfbf 100644 --- a/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts +++ b/apps/draupnir/src/protections/RoomTakedown/SynapseHTTPAntispamRoomExplorer.ts @@ -37,7 +37,7 @@ export class SynapseHTTPAntispamRoomExplorer implements RoomExplorer { ); this.batcher = new StandardBatcher( () => - new ConstantPeriodItemBatch( + new ConstantPeriodItemBatch( this.forwardDiscoveredBatch, { waitPeriodMS: this.batchWaitPeriodMS } ) diff --git a/src/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts b/apps/draupnir/src/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts similarity index 96% rename from src/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts rename to apps/draupnir/src/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts index 145a686d..9ac84a80 100644 --- a/src/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts +++ b/apps/draupnir/src/protections/RoomTakedown/SynapseRoomListRoomExplorerer.ts @@ -27,10 +27,7 @@ export class SynapseRoomListRoomExplorer extends EventEmitter implements RoomExplorer { - private readonly gate = new StandardTimedGate( - this.scanRoomDirectory.bind(this), - this.cooldownMS - ); + private readonly gate: StandardTimedGate; private backgroundScan: ConstantPeriodBatch; private createScanLoop(): ConstantPeriodBatch { @@ -46,6 +43,10 @@ export class SynapseRoomListRoomExplorer private readonly scanner: SynapseRoomListScanner ) { super(); + this.gate = new StandardTimedGate( + this.scanRoomDirectory.bind(this), + this.cooldownMS + ); this.gate.enqueueOpen(); this.backgroundScan = this.createScanLoop(); } diff --git a/src/protections/TrustedReporters.ts b/apps/draupnir/src/protections/TrustedReporters.ts similarity index 100% rename from src/protections/TrustedReporters.ts rename to apps/draupnir/src/protections/TrustedReporters.ts diff --git a/src/protections/WordList.ts b/apps/draupnir/src/protections/WordList.ts similarity index 99% rename from src/protections/WordList.ts rename to apps/draupnir/src/protections/WordList.ts index b95c2a64..b9ff9765 100644 --- a/src/protections/WordList.ts +++ b/apps/draupnir/src/protections/WordList.ts @@ -131,7 +131,9 @@ export class WordListProtection for (const change of changes) { const entryForRoom = this.justJoined.get(roomID) ?? - ((entry) => (this.justJoined.set(roomID, entry), entry))(new Map()); + ((entry) => (this.justJoined.set(roomID, entry), entry))( + new Map() + ); // When a new member logs in, store the time they joined. This will be useful // when we need to check if a message was sent within 20 minutes of joining if (change.membershipChangeType === MembershipChangeType.Joined) { diff --git a/src/protections/invitation/JoinRoomsOnInviteProtection.tsx b/apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx similarity index 95% rename from src/protections/invitation/JoinRoomsOnInviteProtection.tsx rename to apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx index 5ef3c5fa..ee3ccc4d 100644 --- a/src/protections/invitation/JoinRoomsOnInviteProtection.tsx +++ b/apps/draupnir/src/protections/invitation/JoinRoomsOnInviteProtection.tsx @@ -64,14 +64,8 @@ export class JoinRoomsOnInviteProtection { private readonly promptedToProtectedDeduplicator = new StandardDeduplicator(); - private readonly protectRoomsOnInvite = new ProtectroomsOnInvite( - this.draupnir, - this.protectedRoomsSet - ); - private readonly watchRoomsOnInvite = new WatchRoomsOnInvite( - this.draupnir, - this.protectedRoomsSet - ); + private readonly protectRoomsOnInvite: ProtectroomsOnInvite; + private readonly watchRoomsOnInvite: WatchRoomsOnInvite; public constructor( description: JoinRoomsOnInviteProtectionDescription, lifetime: OwnLifetime>, @@ -80,6 +74,14 @@ export class JoinRoomsOnInviteProtection private readonly draupnir: Draupnir ) { super(description, lifetime, capabilities, protectedRoomsSet, {}); + this.protectRoomsOnInvite = new ProtectroomsOnInvite( + this.draupnir, + this.protectedRoomsSet + ); + this.watchRoomsOnInvite = new WatchRoomsOnInvite( + this.draupnir, + this.protectedRoomsSet + ); } handleProtectionDisable(): void { diff --git a/src/protections/invitation/ProtectRoomsOnInvite.tsx b/apps/draupnir/src/protections/invitation/ProtectRoomsOnInvite.tsx similarity index 100% rename from src/protections/invitation/ProtectRoomsOnInvite.tsx rename to apps/draupnir/src/protections/invitation/ProtectRoomsOnInvite.tsx diff --git a/src/protections/invitation/WatchRoomsOnInvite.tsx b/apps/draupnir/src/protections/invitation/WatchRoomsOnInvite.tsx similarity index 100% rename from src/protections/invitation/WatchRoomsOnInvite.tsx rename to apps/draupnir/src/protections/invitation/WatchRoomsOnInvite.tsx diff --git a/src/protections/invitation/inviteCore.ts b/apps/draupnir/src/protections/invitation/inviteCore.ts similarity index 90% rename from src/protections/invitation/inviteCore.ts rename to apps/draupnir/src/protections/invitation/inviteCore.ts index ef4bf3f1..58203565 100644 --- a/src/protections/invitation/inviteCore.ts +++ b/apps/draupnir/src/protections/invitation/inviteCore.ts @@ -24,5 +24,5 @@ export function isSenderJoinedInRevision( membership: RoomMembershipRevision ): boolean { const senderMembership = membership.membershipForUser(senderUserID); - return Boolean(senderMembership?.content.membership === Membership.Join); + return senderMembership?.content.membership === Membership.Join; } diff --git a/src/queues/EventRedactionQueue.ts b/apps/draupnir/src/queues/EventRedactionQueue.ts similarity index 88% rename from src/queues/EventRedactionQueue.ts rename to apps/draupnir/src/queues/EventRedactionQueue.ts index 94179810..53f28a85 100644 --- a/src/queues/EventRedactionQueue.ts +++ b/apps/draupnir/src/queues/EventRedactionQueue.ts @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import { redactUserMessagesIn } from "../utils"; import ManagementRoomOutput from "../managementroom/ManagementRoomOutput"; import { MatrixSendClient } from "matrix-protection-suite-for-matrix-bot-sdk"; @@ -138,7 +138,22 @@ export class EventRedactionQueue { try { await redaction.redact(client, managementRoom); } catch (e) { - const message = e.message || (e.body ? e.body.error : ""); + // FIXME: all of this code is "legacy", from the RoomUpdateException + // type to the message destructuring. Instead it should be using + let message = ""; + if (typeof e === "object" && e !== null) { + if ("message" in e && typeof e.message === "string") { + message = e.message; + } else if ( + "body" in e && + typeof e.body === "object" && + e.body !== null && + "error" in e.body && + typeof e.body.error === "string" + ) { + message = e.body.error; + } + } const error = new RoomUpdateException( MatrixRoomReference.fromRoomID(redaction.roomID), ActionExceptionKind.Unknown, diff --git a/src/queues/LeakyBucket.ts b/apps/draupnir/src/queues/LeakyBucket.ts similarity index 100% rename from src/queues/LeakyBucket.ts rename to apps/draupnir/src/queues/LeakyBucket.ts diff --git a/src/queues/ProtectedRoomActivityTracker.ts b/apps/draupnir/src/queues/ProtectedRoomActivityTracker.ts similarity index 100% rename from src/queues/ProtectedRoomActivityTracker.ts rename to apps/draupnir/src/queues/ProtectedRoomActivityTracker.ts diff --git a/src/queues/ThrottlingQueue.ts b/apps/draupnir/src/queues/ThrottlingQueue.ts similarity index 98% rename from src/queues/ThrottlingQueue.ts rename to apps/draupnir/src/queues/ThrottlingQueue.ts index 86045dce..d99556e3 100644 --- a/src/queues/ThrottlingQueue.ts +++ b/apps/draupnir/src/queues/ThrottlingQueue.ts @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import ManagementRoomOutput from "../managementroom/ManagementRoomOutput"; import { Result, isError } from "@gnuxie/typescript-result"; diff --git a/src/queues/TimelineRedactionQueue.ts b/apps/draupnir/src/queues/TimelineRedactionQueue.ts similarity index 100% rename from src/queues/TimelineRedactionQueue.ts rename to apps/draupnir/src/queues/TimelineRedactionQueue.ts diff --git a/src/queues/UnlistedUserRedactionQueue.ts b/apps/draupnir/src/queues/UnlistedUserRedactionQueue.ts similarity index 97% rename from src/queues/UnlistedUserRedactionQueue.ts rename to apps/draupnir/src/queues/UnlistedUserRedactionQueue.ts index 317c4058..428fedbf 100644 --- a/src/queues/UnlistedUserRedactionQueue.ts +++ b/apps/draupnir/src/queues/UnlistedUserRedactionQueue.ts @@ -7,7 +7,7 @@ // This modified file incorporates work from mjolnir // https://github.com/matrix-org/mjolnir // -import { LogLevel, LogService } from "matrix-bot-sdk"; +import { LogLevel, LogService } from "@vector-im/matrix-bot-sdk"; import { RoomEvent } from "matrix-protection-suite"; import { Draupnir } from "../Draupnir"; import { diff --git a/src/report/ReportManager.ts b/apps/draupnir/src/report/ReportManager.ts similarity index 95% rename from src/report/ReportManager.ts rename to apps/draupnir/src/report/ReportManager.ts index e015373f..1fcf3981 100644 --- a/src/report/ReportManager.ts +++ b/apps/draupnir/src/report/ReportManager.ts @@ -8,13 +8,14 @@ // https://github.com/matrix-org/mjolnir // -import { PowerLevelAction } from "matrix-bot-sdk/lib/models/PowerLevelAction"; -import { LogService, UserID } from "matrix-bot-sdk"; +import { PowerLevelAction } from "@vector-im/matrix-bot-sdk/lib/models/PowerLevelAction"; +import { LogService, UserID } from "@vector-im/matrix-bot-sdk"; import { htmlToText } from "html-to-text"; import { htmlEscape } from "../utils"; import { JSDOM } from "jsdom"; import { Draupnir } from "../Draupnir"; import { + Logger, ReactionContent, RoomEvent, RoomMessage, @@ -31,6 +32,8 @@ import { userServerName, } from "@the-draupnir-project/matrix-basic-types"; +const log = new Logger("ReportManager"); + /// Regexp, used to extract the action label from an action reaction /// such as `⚽ Kick user @foobar:localhost from room [kick-user]`. const REACTION_ACTION = /\[([a-z-]*)\]$/; @@ -223,10 +226,10 @@ export class StandardReportManager { let initialNoticeReport: IReport | undefined, confirmationReport: IReportWithAction | undefined; try { - const originalEvent = await this.draupnir.client.getEvent( + const originalEvent = (await this.draupnir.client.getEvent( roomID, relation.event_id - ); + )) as RoomEvent; if (originalEvent.sender !== this.draupnir.clientUserID) { // Let's not handle reactions to events we didn't send as // some setups have two or more Draupnir's in the same management room. @@ -237,11 +240,14 @@ export class StandardReportManager { } const content = originalEvent["content"]; if (ABUSE_REPORT_KEY in content) { - initialNoticeReport = content[ABUSE_REPORT_KEY]; + initialNoticeReport = content[ABUSE_REPORT_KEY] as IReport | undefined; } else if (ABUSE_ACTION_CONFIRMATION_KEY in content) { - confirmationReport = content[ABUSE_ACTION_CONFIRMATION_KEY]; + confirmationReport = content[ABUSE_ACTION_CONFIRMATION_KEY] as + | IReportWithAction + | undefined; } - } catch (ex) { + } catch (e) { + log.error("Failure to handle report event reaction", e); return; } if (!initialNoticeReport && !confirmationReport) { @@ -512,7 +518,7 @@ export class StandardReportManager { } ); } else { - throw new TypeError(`Something is throwing absoloute garbage ${ex}`); + throw new TypeError(`Something is throwing absoloute garbage`); } } } @@ -699,6 +705,11 @@ class RedactMessage implements IUIAction { PowerLevelAction.RedactEvents ); } catch (ex) { + log.error( + "Failed to fetch power levels for draupnir user", + report.room_id, + ex + ); return false; } } @@ -742,6 +753,11 @@ class KickAccused implements IUIAction { PowerLevelAction.Kick ); } catch (ex) { + log.error( + "Failed to fetch power levels for draupnir user", + report.room_id, + ex + ); return false; } } @@ -785,6 +801,11 @@ class MuteAccused implements IUIAction { true ); } catch (ex) { + log.error( + "Failed to fetch power levels for draupnir user", + report.room_id, + ex + ); return false; } } @@ -831,6 +852,11 @@ class BanAccused implements IUIAction { PowerLevelAction.Ban ); } catch (ex) { + log.error( + "Failed to fetch power levels for draupnir user", + report.room_id, + ex + ); return false; } } @@ -928,7 +954,7 @@ class EscalateToServerModerationRoom implements IUIAction { } try { await manager.draupnir.client.getEvent(report.room_id, report.event_id); - } catch (ex) { + } catch (_) { // We can't fetch the event. return false; } @@ -952,10 +978,10 @@ class EscalateToServerModerationRoom implements IUIAction { _moderationroomID: string, displayManager: DisplayManager ): Promise { - const event = await manager.draupnir.client.getEvent( + const event = (await manager.draupnir.client.getEvent( report.room_id, report.event_id - ); + )) as RoomEvent; // Display the report and UI directly in the management room, as if it had been // received from /report. @@ -1053,7 +1079,7 @@ class DisplayManager { } else { eventContent = unknownEvent(); } - } catch (ex) { + } catch (_) { eventContent = { msg: `.`, }; @@ -1061,29 +1087,31 @@ class DisplayManager { const accusedId = event["sender"]; - let reporterDisplayName: string, accusedDisplayName: string; - try { - reporterDisplayName = - (await this.owner.draupnir.client.getUserProfile(reporterId))[ - "displayname" - ] || reporterId; - } catch (ex) { - reporterDisplayName = ""; - } - try { - accusedDisplayName = - (await this.owner.draupnir.client.getUserProfile(accusedId))[ - "displayname" - ] || accusedId; - } catch (ex) { - accusedDisplayName = ""; - } + const getDisplayName = async (userId: string): Promise => { + try { + const profile: unknown = + await this.owner.draupnir.client.getUserProfile(userId); + if ( + typeof profile === "object" && + profile !== null && + "displayname" in profile && + typeof profile.displayname === "string" + ) { + return profile.displayname; + } + return userId; + } catch (_) { + return ``; + } + }; + const reporterDisplayName = await getDisplayName(reporterId); + const accusedDisplayName = await getDisplayName(accusedId); const eventShortcut = `https://matrix.to/#/${encodeURIComponent(roomID)}/${encodeURIComponent(eventId)}`; let eventTimestamp; try { eventTimestamp = new Date(event["origin_server_ts"]).toUTCString(); - } catch (ex) { + } catch (_) { eventTimestamp = `.`; } diff --git a/src/report/ReportPoller.ts b/apps/draupnir/src/report/ReportPoller.ts similarity index 75% rename from src/report/ReportPoller.ts rename to apps/draupnir/src/report/ReportPoller.ts index a8e7e8ed..55fec39e 100644 --- a/src/report/ReportPoller.ts +++ b/apps/draupnir/src/report/ReportPoller.ts @@ -10,16 +10,18 @@ import { MatrixSendClient, + resultifyBotSDKRequestErrorWith404AsUndefined, SynapseAdminClient, } from "matrix-protection-suite-for-matrix-bot-sdk"; import { ReportManager } from "./ReportManager"; -import { LogLevel } from "matrix-bot-sdk"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; import ManagementRoomOutput from "../managementroom/ManagementRoomOutput"; import { Draupnir } from "../Draupnir"; import { ActionException, ActionExceptionKind, Ok, + RoomEvent, Task, isError, } from "matrix-protection-suite"; @@ -77,10 +79,9 @@ export class ReportPoller { * hangs for longer thank the interval, it could cause a stampede * of requests when networking problems resolve */ - this.timeout = setTimeout( - this.tryGetAbuseReports.bind(this), - this.pollPeriod - ); + this.timeout = setTimeout(() => { + void this.tryGetAbuseReports.call(this); + }, this.pollPeriod); } else { throw new InvalidStateError("poll already scheduled"); } @@ -92,6 +93,12 @@ export class ReportPoller { from: this.from, }); if (isError(response)) { + // FIXME: There's something wrong with what is happening here. + // We are trying to let the user know the thing is broken. Fine, + // but this shouldn't be happening via the logMesasage utility + // but we also just can't stop and break the thing in case the reason + // is just an intermittent issue. + // And that they wouldn't notice that it has stopped. await this.draupnir.managementRoomOutput.logMessage( LogLevel.ERROR, "getAbuseReports", @@ -110,7 +117,7 @@ export class ReportPoller { ) .then( (value) => Ok(value), - (exception) => + (exception: unknown) => ActionException.Result( `Failed to retrieve the context for an event ${report.event_id}`, { exception, exceptionKind: ActionExceptionKind.Unknown } @@ -126,7 +133,7 @@ export class ReportPoller { ); continue; } - const event = eventContext.ok.event; + const event = (eventContext.ok as Record<"event", RoomEvent>).event; await this.manager.handleServerAbuseReport({ roomID: report.room_id, @@ -149,11 +156,16 @@ export class ReportPoller { await this.draupnir.client.setAccountData(REPORT_POLL_EVENT_TYPE, { from: nextToken, }); - } catch (ex) { + } catch (e) { + const error = new ActionException( + ActionExceptionKind.Unknown, + e, + "Unable to set account data for report poller token" + ); await this.draupnir.managementRoomOutput.logMessage( LogLevel.ERROR, "getAbuseReports", - `failed to update progress: ${ex}` + `failed to update progress, provide the administrator with this reference for details: ${error.uuid}` ); } } @@ -164,11 +176,16 @@ export class ReportPoller { try { await this.getAbuseReports(); - } catch (ex) { + } catch (e) { + const error = new ActionException( + ActionExceptionKind.Unknown, + e, + "failed to get abuse reports" + ); await this.draupnir.managementRoomOutput.logMessage( LogLevel.ERROR, "tryGetAbuseReports", - `failed to get abuse reports: ${ex}` + `failed to get abuse reports: ${error.uuid}` ); } @@ -176,25 +193,28 @@ export class ReportPoller { } public static async getReportPollSetting( client: MatrixSendClient, - managementRoomOutput: ManagementRoomOutput + _managementRoomOutput: ManagementRoomOutput ): Promise { - let reportPollSetting: ReportPollSetting = { from: 0 }; - try { - reportPollSetting = await client.getAccountData(REPORT_POLL_EVENT_TYPE); - } catch (err) { - if (err.body?.errcode !== "M_NOT_FOUND") { - throw err; - } else { - void Task( - managementRoomOutput.logMessage( - LogLevel.INFO, - "Draupnir@startup", - "report poll setting does not exist yet" - ) - ); - } + const reportPollAccountData = ( + await client + .getAccountData(REPORT_POLL_EVENT_TYPE) + .then( + (value) => Ok(value), + resultifyBotSDKRequestErrorWith404AsUndefined + ) + ).expect("Unable to fetch report poll setting"); + if (reportPollAccountData === undefined) { + return { from: 0 }; } - return reportPollSetting; + if ( + typeof reportPollAccountData !== "object" || + reportPollAccountData === null || + !("from" in reportPollAccountData) || + !Number.isInteger(reportPollAccountData.from) + ) { + throw new TypeError("report poll setting is corrupted"); + } + return reportPollAccountData as ReportPollSetting; } public async startFromStoredSetting( diff --git a/src/safemode/BootOption.ts b/apps/draupnir/src/safemode/BootOption.ts similarity index 100% rename from src/safemode/BootOption.ts rename to apps/draupnir/src/safemode/BootOption.ts diff --git a/src/safemode/DraupnirSafeMode.ts b/apps/draupnir/src/safemode/DraupnirSafeMode.ts similarity index 88% rename from src/safemode/DraupnirSafeMode.ts rename to apps/draupnir/src/safemode/DraupnirSafeMode.ts index ce9b22ea..cbefe0b0 100644 --- a/src/safemode/DraupnirSafeMode.ts +++ b/apps/draupnir/src/safemode/DraupnirSafeMode.ts @@ -45,14 +45,15 @@ import { StandardPersistentConfigEditor } from "./PersistentConfigEditor"; export class SafeModeDraupnir implements MatrixAdaptorContext { public reactionHandler: MatrixReactionHandler; private readonly timelineEventListener = this.handleTimelineEvent.bind(this); - private readonly commandDispatcher = makeSafeModeCommandDispatcher(this); - private readonly commandDispatcherTimelineListener = - makeCommandDispatcherTimelineListener( - this.managementRoom, - this.client, - this.commandDispatcher - ); - private readonly JSInterfaceDispatcher = makeSafeModeJSDispatcher(this); + private readonly commandDispatcher: ReturnType< + typeof makeSafeModeCommandDispatcher + >; + private readonly commandDispatcherTimelineListener: ReturnType< + typeof makeCommandDispatcherTimelineListener + >; + private readonly JSInterfaceDispatcher: ReturnType< + typeof makeSafeModeJSDispatcher + >; public constructor( public readonly cause: SafeModeCause, public readonly client: MatrixSendClient, @@ -67,6 +68,14 @@ export class SafeModeDraupnir implements MatrixAdaptorContext { //private readonly policyRoomManager: PolicyRoomManager, //private readonly roomMembershipManager: RoomMembershipManager, ) { + this.commandDispatcher = makeSafeModeCommandDispatcher(this); + this.commandDispatcherTimelineListener = + makeCommandDispatcherTimelineListener( + this.managementRoom, + this.client, + this.commandDispatcher + ); + this.JSInterfaceDispatcher = makeSafeModeJSDispatcher(this); this.reactionHandler = new MatrixReactionHandler( managementRoom.toRoomIDOrAlias(), this.clientUserID, diff --git a/src/safemode/ManagementRoom.ts b/apps/draupnir/src/safemode/ManagementRoom.ts similarity index 100% rename from src/safemode/ManagementRoom.ts rename to apps/draupnir/src/safemode/ManagementRoom.ts diff --git a/src/safemode/PersistentConfigEditor.ts b/apps/draupnir/src/safemode/PersistentConfigEditor.ts similarity index 100% rename from src/safemode/PersistentConfigEditor.ts rename to apps/draupnir/src/safemode/PersistentConfigEditor.ts diff --git a/src/safemode/PersistentConfigRenderer.tsx b/apps/draupnir/src/safemode/PersistentConfigRenderer.tsx similarity index 100% rename from src/safemode/PersistentConfigRenderer.tsx rename to apps/draupnir/src/safemode/PersistentConfigRenderer.tsx diff --git a/src/safemode/RecoveryOptions.tsx b/apps/draupnir/src/safemode/RecoveryOptions.tsx similarity index 100% rename from src/safemode/RecoveryOptions.tsx rename to apps/draupnir/src/safemode/RecoveryOptions.tsx diff --git a/src/safemode/SafeModeCause.ts b/apps/draupnir/src/safemode/SafeModeCause.ts similarity index 100% rename from src/safemode/SafeModeCause.ts rename to apps/draupnir/src/safemode/SafeModeCause.ts diff --git a/src/safemode/SafeModeCommandDispatcher.ts b/apps/draupnir/src/safemode/SafeModeCommandDispatcher.ts similarity index 100% rename from src/safemode/SafeModeCommandDispatcher.ts rename to apps/draupnir/src/safemode/SafeModeCommandDispatcher.ts diff --git a/src/safemode/SafeModeToggle.ts b/apps/draupnir/src/safemode/SafeModeToggle.ts similarity index 100% rename from src/safemode/SafeModeToggle.ts rename to apps/draupnir/src/safemode/SafeModeToggle.ts diff --git a/src/safemode/commands/HelpCommand.tsx b/apps/draupnir/src/safemode/commands/HelpCommand.tsx similarity index 100% rename from src/safemode/commands/HelpCommand.tsx rename to apps/draupnir/src/safemode/commands/HelpCommand.tsx diff --git a/src/safemode/commands/RecoverCommand.tsx b/apps/draupnir/src/safemode/commands/RecoverCommand.tsx similarity index 100% rename from src/safemode/commands/RecoverCommand.tsx rename to apps/draupnir/src/safemode/commands/RecoverCommand.tsx diff --git a/src/safemode/commands/RestartDraupnirCommand.ts b/apps/draupnir/src/safemode/commands/RestartDraupnirCommand.ts similarity index 100% rename from src/safemode/commands/RestartDraupnirCommand.ts rename to apps/draupnir/src/safemode/commands/RestartDraupnirCommand.ts diff --git a/src/safemode/commands/SafeModeAdaptor.ts b/apps/draupnir/src/safemode/commands/SafeModeAdaptor.ts similarity index 100% rename from src/safemode/commands/SafeModeAdaptor.ts rename to apps/draupnir/src/safemode/commands/SafeModeAdaptor.ts diff --git a/src/safemode/commands/SafeModeCommands.tsx b/apps/draupnir/src/safemode/commands/SafeModeCommands.tsx similarity index 100% rename from src/safemode/commands/SafeModeCommands.tsx rename to apps/draupnir/src/safemode/commands/SafeModeCommands.tsx diff --git a/src/safemode/commands/StatusCommand.tsx b/apps/draupnir/src/safemode/commands/StatusCommand.tsx similarity index 98% rename from src/safemode/commands/StatusCommand.tsx rename to apps/draupnir/src/safemode/commands/StatusCommand.tsx index 7457bca8..8ef3e8d2 100644 --- a/src/safemode/commands/StatusCommand.tsx +++ b/apps/draupnir/src/safemode/commands/StatusCommand.tsx @@ -127,7 +127,7 @@ export function safeModeStatusInfo( configStatus, documentationURL: DOCUMENTATION_URL, version: SOFTWARE_VERSION, - repository: PACKAGE_JSON["repository"] ?? "Unknown", + repository: (PACKAGE_JSON["repository"] as string | undefined) ?? "Unknown", }; } diff --git a/src/utils.ts b/apps/draupnir/src/utils.ts similarity index 94% rename from src/utils.ts rename to apps/draupnir/src/utils.ts index 44e647db..8730eb32 100644 --- a/src/utils.ts +++ b/apps/draupnir/src/utils.ts @@ -15,7 +15,7 @@ import { getRequestFn, setRequestFn, MatrixError, -} from "matrix-bot-sdk"; +} from "@vector-im/matrix-bot-sdk"; import { ClientRequest, IncomingMessage } from "http"; import * as Sentry from "@sentry/node"; import ManagementRoomOutput from "./managementroom/ManagementRoomOutput"; @@ -56,6 +56,7 @@ export function incrementGaugeValue( uuid: string ) { // @ts-expect-error we access a private method due to lack of a public one. + // eslint-disable-next-line @typescript-eslint/no-unsafe-call if (!gauge._getValue({ status: status, uuid: uuid })) { gauge.inc({ status: status, uuid: uuid }); } @@ -78,6 +79,7 @@ export function decrementGaugeValue( uuid: string ) { // @ts-expect-error we access a private method due to lack of a public one. + // eslint-disable-next-line @typescript-eslint/no-unsafe-call if (gauge._getValue({ status: status, uuid: uuid })) { gauge.dec({ status: status, uuid: uuid }); } @@ -143,6 +145,9 @@ export async function redactUserMessagesIn( } ); } catch (error) { + if (!(error instanceof Error)) { + throw new TypeError("Throwing random shit"); + } await managementRoom.logMessage( LogLevel.ERROR, "utils#redactUserMessagesIn", @@ -219,11 +224,11 @@ export async function getMessagesByUserIn( ...(from ? { from } : {}), }; LogService.info("utils", "Backfilling with token: ", from); - return client.doRequest( + return (await client.doRequest( "GET", `/_matrix/client/v3/rooms/${encodeURIComponent(roomId)}/messages`, qs - ); + )) as BackfillResponse; } let processed = 0; @@ -286,6 +291,11 @@ interface RequestOptions { } type RequestError = + | (Error & { + body?: { + [key: string]: unknown; + }; + }) | { body?: { [key: string]: unknown; @@ -293,10 +303,22 @@ type RequestError = [key: string]: unknown; } | undefined; + type RequestResponse = | { statusCode: number; [key: string]: unknown } | undefined; +type RequestCallback = ( + err: RequestError, + response: RequestResponse, + resBody: unknown +) => void; + +export type RequestFunction = ( + params: RequestOptions, + cb: RequestCallback +) => void; + /** * Patch `MatrixClient` into something that throws concise exceptions. * @@ -314,8 +336,8 @@ function patchMatrixClientForConciseExceptions() { if (isMatrixClientPatchedForConciseExceptions) { return; } - const originalRequestFn = getRequestFn(); - setRequestFn((params: RequestOptions, cb: typeof originalRequestFn) => { + const originalRequestFn = getRequestFn() as unknown as RequestFunction; + setRequestFn((params: RequestOptions, cb: RequestCallback) => { // Store an error early, to maintain *some* semblance of stack. // We'll only throw the error if there is one. const error = new Error("STACK CAPTURE"); @@ -357,7 +379,8 @@ function patchMatrixClientForConciseExceptions() { } if (!(err instanceof IncomingMessage)) { // In most cases, we're happy with the result. - return cb(err, response, resBody); + cb(err, response, resBody); + return; } // However, MatrixClient has a tendency of throwing // instances of `IncomingMessage` instead of instances @@ -383,7 +406,7 @@ function patchMatrixClientForConciseExceptions() { if (typeof body === "string") { try { body = JSON.parse(body, jsonReviver); - } catch (ex) { + } catch (_) { // Not JSON. } } @@ -418,9 +441,11 @@ function patchMatrixClientForConciseExceptions() { if (error.stack !== undefined) { matrixError.stack = error.stack; } - return cb(matrixError, response, resBody); + cb(matrixError, response, resBody); + return; } else { - return cb(error, response, resBody); + cb(error, response, resBody); + return; } } ); @@ -444,8 +469,8 @@ function patchMatrixClientForRetry() { if (isMatrixClientPatchedForRetryWhenThrottled) { return; } - const originalRequestFn = getRequestFn(); - setRequestFn(async (params: RequestOptions, cb: typeof originalRequestFn) => { + const originalRequestFn = getRequestFn() as unknown as RequestFunction; + setRequestFn(async (params: RequestOptions, cb: RequestCallback) => { let attempt = 1; while (true) { try { @@ -485,7 +510,8 @@ function patchMatrixClientForRetry() { }); // This is our final result. // Pass result, whether success or error. - return cb(...result); + cb(...result); + return; } catch (err) { // Need to retry. const retryAfterMs = (() => { @@ -539,8 +565,8 @@ function patchMatrixClientForPrototypePollution() { if (isMatrixClientPatchedForPrototypePollution) { return; } - const originalRequestFn = getRequestFn(); - setRequestFn((params: RequestOptions, cb: typeof originalRequestFn) => { + const originalRequestFn = getRequestFn() as unknown as RequestFunction; + setRequestFn((params: RequestOptions, cb: RequestCallback) => { originalRequestFn( params, function conciseExceptionRequestFn( @@ -553,7 +579,7 @@ function patchMatrixClientForPrototypePollution() { if (typeof resBody === "string") { try { resBody = JSON.parse(resBody, jsonReviver); - } catch (e) { + } catch (_) { // we don't care if we fail to parse the JSON as it probably isn't JSON. } } @@ -561,11 +587,12 @@ function patchMatrixClientForPrototypePollution() { if (typeof response?.body === "string") { try { response.body = JSON.parse(response.body, jsonReviver); - } catch (e) { + } catch (_) { // we don't care if we fail to parse the JSON as it probably isn't JSON. } } - return cb(error, response, resBody); + cb(error, response, resBody); + return; } ); }); diff --git a/src/webapis/SynapseHTTPAntispam/CheckEventForSpamEndpoint.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/CheckEventForSpamEndpoint.ts similarity index 100% rename from src/webapis/SynapseHTTPAntispam/CheckEventForSpamEndpoint.ts rename to apps/draupnir/src/webapis/SynapseHTTPAntispam/CheckEventForSpamEndpoint.ts diff --git a/src/webapis/SynapseHTTPAntispam/PingEndpoint.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/PingEndpoint.ts similarity index 100% rename from src/webapis/SynapseHTTPAntispam/PingEndpoint.ts rename to apps/draupnir/src/webapis/SynapseHTTPAntispam/PingEndpoint.ts diff --git a/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts similarity index 100% rename from src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts rename to apps/draupnir/src/webapis/SynapseHTTPAntispam/SpamCheckEndpointPluginManager.ts diff --git a/src/webapis/SynapseHTTPAntispam/SynapseHttpAntispam.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/SynapseHttpAntispam.ts similarity index 100% rename from src/webapis/SynapseHTTPAntispam/SynapseHttpAntispam.ts rename to apps/draupnir/src/webapis/SynapseHTTPAntispam/SynapseHttpAntispam.ts diff --git a/src/webapis/SynapseHTTPAntispam/UserMayInviteEndpoint.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/UserMayInviteEndpoint.ts similarity index 100% rename from src/webapis/SynapseHTTPAntispam/UserMayInviteEndpoint.ts rename to apps/draupnir/src/webapis/SynapseHTTPAntispam/UserMayInviteEndpoint.ts diff --git a/src/webapis/SynapseHTTPAntispam/UserMayJoinRoomEndpoint.ts b/apps/draupnir/src/webapis/SynapseHTTPAntispam/UserMayJoinRoomEndpoint.ts similarity index 100% rename from src/webapis/SynapseHTTPAntispam/UserMayJoinRoomEndpoint.ts rename to apps/draupnir/src/webapis/SynapseHTTPAntispam/UserMayJoinRoomEndpoint.ts diff --git a/src/webapis/WebAPIs.ts b/apps/draupnir/src/webapis/WebAPIs.ts similarity index 96% rename from src/webapis/WebAPIs.ts rename to apps/draupnir/src/webapis/WebAPIs.ts index 22b069f4..554798a5 100644 --- a/src/webapis/WebAPIs.ts +++ b/apps/draupnir/src/webapis/WebAPIs.ts @@ -10,7 +10,7 @@ import { Server } from "http"; import express from "express"; -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; import { StandardReportManager } from "../report/ReportManager"; import { IConfig } from "../config"; import { @@ -19,7 +19,7 @@ import { isStringRoomID, isStringEventID, } from "@the-draupnir-project/matrix-basic-types"; -import { Logger, Task } from "matrix-protection-suite"; +import { Logger, RoomEvent, Task } from "matrix-protection-suite"; import { SynapseHttpAntispam } from "./SynapseHTTPAntispam/SynapseHttpAntispam"; import { jsonReviver } from "../utils"; @@ -260,9 +260,11 @@ export class WebAPIs { // // By doing this with the reporterClient, we ensure that this feature of Draupnir can work // with all Matrix homeservers, rather than just Synapse. - event = await reporterClient.getEvent(roomID, eventID); + event = (await reporterClient.getEvent(roomID, eventID)) as RoomEvent; } - const reason = request.body["reason"]; + const reason = (request.body as Record)[ + "reason" + ] as string; await this.reportManager.handleServerAbuseReport({ roomID, reporterId, diff --git a/test/appservice/integration/listUnstartedDraupnirTest.ts b/apps/draupnir/test/appservice/integration/listUnstartedDraupnirTest.ts similarity index 100% rename from test/appservice/integration/listUnstartedDraupnirTest.ts rename to apps/draupnir/test/appservice/integration/listUnstartedDraupnirTest.ts diff --git a/test/appservice/integration/provisionTest.ts b/apps/draupnir/test/appservice/integration/provisionTest.ts similarity index 86% rename from test/appservice/integration/provisionTest.ts rename to apps/draupnir/test/appservice/integration/provisionTest.ts index 9784cde6..00f4c30c 100644 --- a/test/appservice/integration/provisionTest.ts +++ b/apps/draupnir/test/appservice/integration/provisionTest.ts @@ -8,10 +8,10 @@ // https://github.com/matrix-org/mjolnir // -import { isPolicyRoom, readTestConfig, setupHarness } from "../utils/harness"; +import { readTestConfig, setupHarness } from "../utils/harness"; import { newTestUser } from "../../integration/clientHelper"; import { getFirstReply } from "../../integration/commands/commandUtils"; -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; import { MjolnirAppService } from "../../../src/appservice/AppService"; interface Context extends Mocha.Context { @@ -60,9 +60,11 @@ describe("Test that the app service can provision a draupnir on invite of the ap await Promise.all( roomsInvitedTo.map((roomId) => moderator.joinRoom(roomId)) ); - const managementRoomId = roomsInvitedTo.filter( - async (roomId) => !(await isPolicyRoom(moderator, roomId)) - )[0]; + // FIXME: + // Originally this was finding the management room by filtering out the rooms + // that were not policy rooms. But this code never actually worked, and + // it just fetches the first invite. Obviously this needs to be fixed + const managementRoomId = roomsInvitedTo[0]; if (managementRoomId === undefined) { throw new TypeError(`Unable to find management room`); } diff --git a/test/appservice/integration/safeModeRecoverTest.ts b/apps/draupnir/test/appservice/integration/safeModeRecoverTest.ts similarity index 100% rename from test/appservice/integration/safeModeRecoverTest.ts rename to apps/draupnir/test/appservice/integration/safeModeRecoverTest.ts diff --git a/test/appservice/integration/safeModeToggleTest.ts b/apps/draupnir/test/appservice/integration/safeModeToggleTest.ts similarity index 100% rename from test/appservice/integration/safeModeToggleTest.ts rename to apps/draupnir/test/appservice/integration/safeModeToggleTest.ts diff --git a/test/appservice/utils/ProvisionHelper.ts b/apps/draupnir/test/appservice/utils/ProvisionHelper.ts similarity index 100% rename from test/appservice/utils/ProvisionHelper.ts rename to apps/draupnir/test/appservice/utils/ProvisionHelper.ts diff --git a/test/appservice/utils/harness.ts b/apps/draupnir/test/appservice/utils/harness.ts similarity index 96% rename from test/appservice/utils/harness.ts rename to apps/draupnir/test/appservice/utils/harness.ts index f71c29c5..4e432b9b 100644 --- a/test/appservice/utils/harness.ts +++ b/apps/draupnir/test/appservice/utils/harness.ts @@ -16,7 +16,7 @@ import { AppserviceConfig, } from "../../../src/appservice/config/config"; import { newTestUser } from "../../integration/clientHelper"; -import { CreateEvent, MatrixClient } from "matrix-bot-sdk"; +import { CreateEvent, MatrixClient } from "@vector-im/matrix-bot-sdk"; import { POLICY_ROOM_TYPE_VARIANTS } from "matrix-protection-suite"; import { isStringRoomAlias } from "@the-draupnir-project/matrix-basic-types"; diff --git a/test/draupnir_news.json b/apps/draupnir/test/draupnir_news.json similarity index 100% rename from test/draupnir_news.json rename to apps/draupnir/test/draupnir_news.json diff --git a/test/draupnir_news.json.license b/apps/draupnir/test/draupnir_news.json.license similarity index 100% rename from test/draupnir_news.json.license rename to apps/draupnir/test/draupnir_news.json.license diff --git a/test/integration/abuseReportTest.ts b/apps/draupnir/test/integration/abuseReportTest.ts similarity index 76% rename from test/integration/abuseReportTest.ts rename to apps/draupnir/test/integration/abuseReportTest.ts index 81d8e592..4f046a99 100644 --- a/test/integration/abuseReportTest.ts +++ b/apps/draupnir/test/integration/abuseReportTest.ts @@ -11,15 +11,18 @@ import { strict as assert } from "assert"; import { newTestUser } from "./clientHelper"; import { ABUSE_REPORT_KEY, IReport } from "../../src/report/ReportManager"; -import { DraupnirTestContext, draupnirClient } from "./mjolnirSetupUtils"; +import { DraupnirTestContext, draupnirSafeEmitter } from "./mjolnirSetupUtils"; import { NoticeMessageContent, + Ok, ReactionContent, ReactionEvent, + RoomEvent, RoomMessage, Value, } from "matrix-protection-suite"; import { StringEventID } from "@the-draupnir-project/matrix-basic-types"; +import { resultifyBotSDKRequestError } from "matrix-protection-suite-for-matrix-bot-sdk"; /** * Test the ability to turn abuse reports into room messages. @@ -63,24 +66,28 @@ describe("Test: Reporting abuse", () => { throw new TypeError("setup must have failed."); } const draupnir = this.draupnir; - const draupnirSyncClient = draupnirClient(); - if (draupnirSyncClient === null) { - throw new TypeError("setup must have failed."); - } + const draupnirSyncClient = draupnirSafeEmitter(); // Listen for any notices that show up. - const notices: (Omit & { + type NoticeEvent = Omit & { content: NoticeMessageContent; - })[] = []; + }; + const notices: NoticeEvent[] = []; draupnirSyncClient.on("room.event", (roomId, event) => { - if (roomId === draupnir.managementRoomID) { - notices.push(event); + if ( + roomId === draupnir.managementRoomID && + event.type === "m.room.message" + ) { + notices.push(event as NoticeEvent); } }); const reactions: UnredactedReaction[] = []; draupnirSyncClient.on("room.event", (roomId, event) => { - if (roomId === draupnir.managementRoomID) { + if ( + roomId === draupnir.managementRoomID && + event.type === "m.reaction" + ) { if (Value.Check(ReactionContent, event.content)) { - reactions.push(event); + reactions.push(event as UnredactedReaction); } } }); @@ -106,10 +113,10 @@ describe("Test: Reporting abuse", () => { const badText = `BAD: ${Math.random()}`; // Will be reported as abuse. const badText2 = `BAD: ${Math.random()}`; // Will be reported as abuse. const badText3 = `BAD: ${Math.random()}`; // Will be reported as abuse. - const badText4 = [...Array(1024)] + const badText4 = [...Array(1024)] .map((_) => `${Math.random()}`) .join(""); // Text is too long. - const badText5 = [...Array(1024)].map((_) => "ABC").join("\n"); // Text has too many lines. + const badText5 = [...Array(1024)].map((_) => "ABC").join("\n"); // Text has too many lines. const badEventId = await badUser.sendText(roomId, badText); const badEventId2 = await badUser.sendText(roomId, badText2); const badEventId3 = await badUser.sendText(roomId, badText3); @@ -121,93 +128,88 @@ describe("Test: Reporting abuse", () => { const reportsToFind: ReportTemplate[] = []; // Time to report, first without a comment, then with one. - try { - await goodUser.doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId)}` - ); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId, - text: badText, - }); - } catch (e) { - console.error("Could not send first report", e.body || e); - throw e; - } + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId)}` + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send first report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId, + text: badText, + }); - try { - await goodUser.doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId2)}`, - "", - { - reason: badEvent2Comment, - } - ); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId2, - text: badText2, - comment: badEvent2Comment, - }); - } catch (e) { - console.error("Could not send second report", e.body || e); - throw e; - } + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId2)}`, + "", + { + reason: badEvent2Comment, + } + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send second report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId2, + text: badText2, + comment: badEvent2Comment, + }); - try { - await goodUser.doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId3)}`, - "" - ); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId3, - text: badText3, - }); - } catch (e) { - console.error("Could not send third report", e.body || e); - throw e; - } + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId3)}`, + "" + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send third report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId3, + text: badText3, + }); - try { - await goodUser.doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId4)}`, - "" - ); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId4, - text_prefix: badText4.substring(0, 256), - }); - } catch (e) { - console.error("Could not send fourth report", e.body || e); - throw e; - } + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId4)}`, + "" + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send fourth report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId4, + text_prefix: badText4.substring(0, 256), + }); - try { - await goodUser.doRequest( - "POST", - `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId5)}`, - "" - ); - reportsToFind.push({ - reporter_id: goodUserId, - accused_id: badUserId, - event_id: badEventId5, - text_prefix: badText5.substring(0, 256).split("\n").join(" "), - }); - } catch (e) { - console.error("Could not send fifth report", e.body || e); - throw e; - } + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/${endpoint}/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId5)}`, + "" + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send fifth report"); + reportsToFind.push({ + reporter_id: goodUserId, + accused_id: badUserId, + event_id: badEventId5, + text_prefix: badText5.substring(0, 256).split("\n").join(" "), + }); console.log("Test: Reporting abuse - wait"); await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -366,27 +368,31 @@ describe("Test: Reporting abuse", () => { it("The redact action works", async function (this: DraupnirTestContext) { this.timeout(60000); const draupnir = this.draupnir; - const draupnirSyncClient = draupnirClient(); - if (draupnir === undefined || draupnirSyncClient === null) { - throw new TypeError("setup code didn't work"); + if (draupnir === undefined) { + throw new TypeError("setup must have failed."); } + const draupnirSyncClient = draupnirSafeEmitter(); - // Listen for any notices that show up. - const notices: (Omit & { + type NoticeEvent = Omit & { content: NoticeMessageContent; - })[] = []; + }; + // Listen for any notices that show up. + const notices: NoticeEvent[] = []; draupnirSyncClient.on("room.event", (roomId, event) => { - if (roomId === draupnir.managementRoomID) { + if ( + roomId === draupnir.managementRoomID && + event.type === "m.room.message" + ) { if (Value.Check(NoticeMessageContent, event.content)) { - notices.push(event); + notices.push(event as NoticeEvent); } } }); const reactions: UnredactedReaction[] = []; draupnirSyncClient.on("room.event", (roomId, event) => { - if (roomId === draupnir.managementRoomID) { + if (roomId === draupnir.managementRoomID && event.type === "m.reaction") { if (Value.Check(ReactionContent, event.content)) { - reactions.push(event); + reactions.push(event as UnredactedReaction); } } }); @@ -432,15 +438,14 @@ describe("Test: Reporting abuse", () => { console.log("Test: Reporting abuse - send reports"); - try { - await goodUser.doRequest( - "POST", - `/_matrix/client/r0/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId)}` - ); - } catch (e) { - console.error("Could not send first report", e.body || e); - throw e; - } + ( + await goodUser + .doRequest( + "POST", + `/_matrix/client/r0/rooms/${encodeURIComponent(roomId)}/report/${encodeURIComponent(badEventId)}` + ) + .then((_) => Ok(undefined), resultifyBotSDKRequestError) + ).expect("Could not send first report"); console.log("Test: Reporting abuse - wait"); await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -528,7 +533,10 @@ describe("Test: Reporting abuse", () => { await new Promise((resolve) => setTimeout(resolve, 1000)); // This should have redacted the message. - const newBadEvent = await draupnir.client.getEvent(roomId, badEventId); + const newBadEvent = (await draupnir.client.getEvent( + roomId, + badEventId + )) as RoomEvent; assert.deepEqual( Object.keys(newBadEvent.content), [], diff --git a/test/integration/banPropagationTest.ts b/apps/draupnir/test/integration/banPropagationTest.ts similarity index 99% rename from test/integration/banPropagationTest.ts rename to apps/draupnir/test/integration/banPropagationTest.ts index 66462ea9..15f435d9 100644 --- a/test/integration/banPropagationTest.ts +++ b/apps/draupnir/test/integration/banPropagationTest.ts @@ -63,7 +63,7 @@ describe("Ban propagation test", function () { const spamUserID = (await spammer.getUserId()) as StringUserID; await moderator.joinRoom(draupnir.managementRoomID); const protectedRooms = await Promise.all( - [...Array(5)].map(async (_) => { + [...Array(5)].map(async (_) => { const room = await moderator.createRoom({ invite: [draupnir.clientUserID, spamUserID], }); diff --git a/test/integration/clientHelper.ts b/apps/draupnir/test/integration/clientHelper.ts similarity index 84% rename from test/integration/clientHelper.ts rename to apps/draupnir/test/integration/clientHelper.ts index 8c716aaf..0bd98245 100644 --- a/test/integration/clientHelper.ts +++ b/apps/draupnir/test/integration/clientHelper.ts @@ -15,13 +15,14 @@ import { MatrixClient, MemoryStorageProvider, PantalaimonClient, -} from "matrix-bot-sdk"; +} from "@vector-im/matrix-bot-sdk"; import "../../src/utils"; // we need this for the patches to matrix-bot-sdk's `getRequestFn`. import { NoticeMessageContent, RoomMessage, Value, } from "matrix-protection-suite"; +import { RequestFunction } from "../../src/utils"; const REGISTRATION_ATTEMPTS = 10; const REGISTRATION_RETRY_BASE_DELAY_MS = 100; @@ -46,7 +47,7 @@ export async function registerUser( ): Promise { const registerUrl = `${homeserver}/_synapse/admin/v1/register`; const nonce: string = await new Promise((resolve, reject) => { - getRequestFn()( + (getRequestFn() as RequestFunction)( { uri: registerUrl, method: "GET", timeout: 60000 }, (error: unknown, _response: unknown, resBody: unknown) => { if (error) { @@ -93,28 +94,38 @@ export async function registerUser( timeout: 60000, }; await new Promise((resolve, reject) => { - getRequestFn()(params, (error: unknown) => { - error !== undefined - ? error instanceof Error - ? reject(error) - : resolve(new TypeError(`something is throwing garbage`)) - : resolve(undefined); + (getRequestFn() as RequestFunction)(params, (error: unknown) => { + if (error === undefined || error === null) { + resolve(undefined); + } else if (error instanceof Error) { + reject(error); + } else { + reject(new TypeError(`something is throwing garbage`)); + } }); }); return; - } catch (ex) { + } catch (e) { // In case of timeout or throttling, backoff and retry. if ( - ex?.code === "ESOCKETTIMEDOUT" || - ex?.code === "ETIMEDOUT" || - ex?.body?.errcode === "M_LIMIT_EXCEEDED" + (typeof e === "object" && + e !== null && + "code" in e && + (e.code === "ESOCKETTIMEDOUT" || e.code === "ETIMEDOUT")) || + (typeof e === "object" && + e !== null && + "body" in e && + typeof e.body === "object" && + e.body !== null && + "errcode" in e.body && + e.body.errcode === "M_LIMIT_EXCEEDED") ) { await new Promise((resolve) => setTimeout(resolve, REGISTRATION_RETRY_BASE_DELAY_MS * i * i) ); continue; } - throw ex; + throw e; } } throw new Error( @@ -167,7 +178,15 @@ async function registerNewTestUser( ); return username; } catch (e) { - if (e?.body?.errcode === "M_USER_IN_USE") { + if ( + typeof e === "object" && + e !== null && + "body" in e && + typeof e.body === "object" && + e.body !== null && + "errcode" in e.body && + e.body.errcode === "M_USER_IN_USE" + ) { if ("exact" in options.name) { LogService.debug( "test/clientHelper", @@ -181,7 +200,7 @@ async function registerNewTestUser( ); } } else { - console.error(`failed to register user ${e}`); + console.error(`failed to register user`, e); throw e; } } @@ -226,7 +245,15 @@ async function getGlobalAdminUser(homeserver: string): Promise { try { await registerUser(homeserver, USERNAME, USERNAME, USERNAME, true); } catch (e) { - if (e?.body?.errcode === "M_USER_IN_USE") { + if ( + typeof e === "object" && + e !== null && + "body" in e && + typeof e.body === "object" && + e.body !== null && + "errcode" in e.body && + e.body.errcode === "M_USER_IN_USE" + ) { // Then we've already registered the user in a previous run and that is ok. } else { throw e; diff --git a/test/integration/commands/commandUtils.ts b/apps/draupnir/test/integration/commands/commandUtils.ts similarity index 97% rename from test/integration/commands/commandUtils.ts rename to apps/draupnir/test/integration/commands/commandUtils.ts index f767c269..443761f0 100644 --- a/test/integration/commands/commandUtils.ts +++ b/apps/draupnir/test/integration/commands/commandUtils.ts @@ -8,12 +8,12 @@ // https://github.com/matrix-org/mjolnir // -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; import { strict as assert } from "assert"; import * as crypto from "crypto"; import { - MatrixEmitter, MatrixSendClient, + SafeMatrixEmitter, } from "matrix-protection-suite-for-matrix-bot-sdk"; import { NoticeMessageContent, @@ -53,7 +53,7 @@ export type ReplyContent = typeof ReplyContent; * @returns The replying event. */ export async function getFirstReply( - matrix: MatrixEmitter, + matrix: SafeMatrixEmitter, targetRoom: string, targetEventThunk: () => Promise ): Promise> { @@ -70,7 +70,7 @@ export async function getFirstReply( * @returns The replying event. */ export async function getNthReply( - matrix: MatrixEmitter, + matrix: SafeMatrixEmitter, targetRoom: string, n: number, targetEventThunk: () => Promise @@ -138,7 +138,7 @@ export async function getNthReply( * @returns The reaction event. */ export async function getFirstReaction( - matrix: MatrixEmitter, + matrix: SafeMatrixEmitter, targetRoom: string, reactionKey: string, targetEventThunk: () => Promise @@ -203,7 +203,7 @@ export async function getFirstReaction( * @returns The event matching the predicate provided. */ export async function getFirstEventMatching(details: { - matrix: MatrixEmitter; + matrix: SafeMatrixEmitter; targetRoom: string; lookAfterEvent: () => Promise; predicate: (event: RoomEvent) => boolean; @@ -239,18 +239,18 @@ export async function getFirstEventMatching(details: { /** * Create a new banlist for draupnir to watch and return the shortcode that can be used to refer to the list in future commands. * @param managementRoom The room to send the create command to. - * @param mjolnir A syncing matrix client. + * @param matrix A syncing matrix client. * @param client A client that isn't draupnir to send the message with, as you will be invited to the room. * @returns The shortcode for the list that can be used to refer to the list in future commands. */ export async function createBanList( managementRoom: string, - mjolnir: MatrixEmitter, + matrix: SafeMatrixEmitter, client: MatrixClient ): Promise { const listName = crypto.randomUUID(); const listCreationResponse = await getFirstReply( - mjolnir, + matrix, managementRoom, async () => { return await client.sendMessage(managementRoom, { diff --git a/test/integration/commands/hijackRoomCommandTest.ts b/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts similarity index 85% rename from test/integration/commands/hijackRoomCommandTest.ts rename to apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts index df7cfdf7..da789645 100644 --- a/test/integration/commands/hijackRoomCommandTest.ts +++ b/apps/draupnir/test/integration/commands/hijackRoomCommandTest.ts @@ -12,6 +12,7 @@ import { strict as assert } from "assert"; import { newTestUser } from "../clientHelper"; import { getFirstReaction } from "./commandUtils"; import { DraupnirTestContext, draupnirSafeEmitter } from "../mjolnirSetupUtils"; +import { PowerLevelsEventContent } from "matrix-protection-suite"; // Breaks with this test. describe("Test: The make admin command", function () { @@ -20,7 +21,7 @@ describe("Test: The make admin command", function () { ) { this.timeout(90000); if (!this.config.admin?.enableMakeRoomAdminCommand) { - this.done(); + return; } const draupnir = this.draupnir; if (draupnir === undefined) { @@ -44,13 +45,13 @@ describe("Test: The make admin command", function () { body: `!draupnir rooms add ${targetRoom}`, }); await userA.joinRoom(targetRoom); - const powerLevelsBefore = await moderator.getRoomStateEvent( + const powerLevelsBefore = (await moderator.getRoomStateEvent( targetRoom, "m.room.power_levels", "" - ); + )) as PowerLevelsEventContent; assert.notEqual( - powerLevelsBefore["users"][draupnir.clientUserID], + powerLevelsBefore["users"]?.[draupnir.clientUserID], 100, `Bot should not yet be an admin of ${targetRoom}` ); @@ -66,13 +67,13 @@ describe("Test: The make admin command", function () { } ); - const powerLevelsAfter = await moderator.getRoomStateEvent( + const powerLevelsAfter = (await moderator.getRoomStateEvent( targetRoom, "m.room.power_levels", "" - ); + )) as PowerLevelsEventContent; assert.equal( - powerLevelsAfter["users"][draupnir.clientUserID], + powerLevelsAfter["users"]?.[draupnir.clientUserID], 100, "Bot should be a room admin." ); diff --git a/test/integration/commands/recoverCommandDetail.ts b/apps/draupnir/test/integration/commands/recoverCommandDetail.ts similarity index 100% rename from test/integration/commands/recoverCommandDetail.ts rename to apps/draupnir/test/integration/commands/recoverCommandDetail.ts diff --git a/test/integration/commands/recoverCommandTest.ts b/apps/draupnir/test/integration/commands/recoverCommandTest.ts similarity index 100% rename from test/integration/commands/recoverCommandTest.ts rename to apps/draupnir/test/integration/commands/recoverCommandTest.ts diff --git a/test/integration/commands/redactCommandTest.ts b/apps/draupnir/test/integration/commands/redactCommandTest.ts similarity index 96% rename from test/integration/commands/redactCommandTest.ts rename to apps/draupnir/test/integration/commands/redactCommandTest.ts index 3e5090cb..27cb0a91 100644 --- a/test/integration/commands/redactCommandTest.ts +++ b/apps/draupnir/test/integration/commands/redactCommandTest.ts @@ -11,14 +11,15 @@ import { strict as assert } from "assert"; import { newTestUser } from "../clientHelper"; import { getMessagesByUserIn } from "../../../src/utils"; -import { LogService } from "matrix-bot-sdk"; +import { LogService } from "@vector-im/matrix-bot-sdk"; import { getFirstReaction } from "./commandUtils"; import { draupnirClient, draupnirSafeEmitter, DraupnirTestContext, } from "../mjolnirSetupUtils"; -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; +import { RoomEvent } from "matrix-protection-suite"; interface RedactionTestContext extends DraupnirTestContext { moderator?: MatrixClient; @@ -26,7 +27,7 @@ interface RedactionTestContext extends DraupnirTestContext { describe("Test: The redaction command", function () { // If a test has a timeout while awaitng on a promise then we never get given control back. - afterEach(function () { + afterEach(function (this: RedactionTestContext) { this.moderator?.stop(); }); @@ -285,7 +286,10 @@ describe("Test: The redaction command", function () { } ); - const redactedEvent = await moderator.getEvent(targetRoom, eventToRedact); + const redactedEvent = (await moderator.getEvent( + targetRoom, + eventToRedact + )) as RoomEvent; assert.equal( Object.keys(redactedEvent.content).length, 0, diff --git a/test/integration/commands/roomsTest.ts b/apps/draupnir/test/integration/commands/roomsTest.ts similarity index 96% rename from test/integration/commands/roomsTest.ts rename to apps/draupnir/test/integration/commands/roomsTest.ts index 9a1e349d..66690e17 100644 --- a/test/integration/commands/roomsTest.ts +++ b/apps/draupnir/test/integration/commands/roomsTest.ts @@ -12,7 +12,7 @@ import { strict as assert } from "assert"; import { newTestUser } from "../clientHelper"; import { getFirstReaction, getFirstReply } from "./commandUtils"; import { draupnirSafeEmitter, DraupnirTestContext } from "../mjolnirSetupUtils"; -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; interface RoomsTestContext extends DraupnirTestContext { moderator?: MatrixClient; @@ -20,7 +20,7 @@ interface RoomsTestContext extends DraupnirTestContext { describe("Test: The rooms commands", function () { // If a test has a timeout while awaitng on a promise then we never get given control back. - afterEach(function () { + afterEach(function (this: RoomsTestContext) { this.moderator?.stop(); }); diff --git a/test/integration/commands/shutdownCommandTest.ts b/apps/draupnir/test/integration/commands/shutdownCommandTest.ts similarity index 83% rename from test/integration/commands/shutdownCommandTest.ts rename to apps/draupnir/test/integration/commands/shutdownCommandTest.ts index f963995a..bb7aaff9 100644 --- a/test/integration/commands/shutdownCommandTest.ts +++ b/apps/draupnir/test/integration/commands/shutdownCommandTest.ts @@ -16,20 +16,20 @@ import { draupnirClient, draupnirSafeEmitter, } from "../mjolnirSetupUtils"; -import { MatrixClient, MatrixError } from "matrix-bot-sdk"; +import { MatrixClient, MatrixError } from "@vector-im/matrix-bot-sdk"; import { getFirstReaction } from "./commandUtils"; -describe("Test: shutdown command", function () { +describe("Test: shutdown command", function (this: Mocha.Suite) { let client: MatrixClient; - this.beforeEach(async function () { + this.beforeEach(async function (this: DraupnirTestContext) { client = await newTestUser(this.config.homeserverUrl, { name: { contains: "shutdown-command" }, }); await client.start(); - }); - this.afterEach(async function () { + } as unknown as Mocha.AsyncFunc); + this.afterEach(async function (this: DraupnirTestContext) { client.stop(); - }); + } as unknown as Mocha.AsyncFunc); it("Draupnir asks synapse to shut down a channel", async function ( this: DraupnirTestContext ) { diff --git a/test/integration/commands/unbanTest.ts b/apps/draupnir/test/integration/commands/unbanTest.ts similarity index 99% rename from test/integration/commands/unbanTest.ts rename to apps/draupnir/test/integration/commands/unbanTest.ts index bdeca078..316f0f10 100644 --- a/test/integration/commands/unbanTest.ts +++ b/apps/draupnir/test/integration/commands/unbanTest.ts @@ -41,7 +41,7 @@ async function createProtectedRoomsSetWithBan( { numberOfRooms }: { numberOfRooms: number } ): Promise { return await Promise.all( - [...Array(numberOfRooms)].map(async (_) => { + [...Array(numberOfRooms)].map(async (_) => { const roomID = (await draupnir.client.createRoom()) as StringRoomID; const room = MatrixRoomReference.fromRoomID(roomID, []); ( diff --git a/test/integration/fixtures.ts b/apps/draupnir/test/integration/fixtures.ts similarity index 97% rename from test/integration/fixtures.ts rename to apps/draupnir/test/integration/fixtures.ts index cfded6c4..eb97e209 100644 --- a/test/integration/fixtures.ts +++ b/apps/draupnir/test/integration/fixtures.ts @@ -106,7 +106,7 @@ export const mochaHooks = { afterEach: [ async function (this: DraupnirTestContext) { this.timeout(10000); - await this.toggle?.stopEverything(); + await this.toggle?.[Symbol.asyncDispose](); draupnirClient()?.stop(); this.stores?.dispose(); await this.lifetime[Symbol.asyncDispose](); @@ -122,6 +122,7 @@ export const mochaHooks = { ), ]); const client = draupnirClient(); + // FIXME: I don't believe this EVER runs lmao. // remove alias from management room and leave it. if (client !== null && this.managementRoomAlias !== undefined) { await teardownManagementRoom( diff --git a/test/integration/helloTest.ts b/apps/draupnir/test/integration/helloTest.ts similarity index 90% rename from test/integration/helloTest.ts rename to apps/draupnir/test/integration/helloTest.ts index fac667be..5b32fe40 100644 --- a/test/integration/helloTest.ts +++ b/apps/draupnir/test/integration/helloTest.ts @@ -8,13 +8,13 @@ // https://github.com/matrix-org/mjolnir // -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; import { newTestUser, noticeListener } from "./clientHelper"; import { DraupnirTestContext } from "./mjolnirSetupUtils"; import { SafeMatrixEmitterWrapper } from "matrix-protection-suite-for-matrix-bot-sdk"; import { DefaultEventDecoder } from "matrix-protection-suite"; -describe("Test: !help command", function () { +describe("Test: !help command", function (this: Mocha.Suite) { let client: MatrixClient; this.beforeEach(async function (this: DraupnirTestContext) { client = await newTestUser(this.config.homeserverUrl, { @@ -22,7 +22,7 @@ describe("Test: !help command", function () { }); await client.start(); } as unknown as Mocha.AsyncFunc); - this.afterEach(async function () { + this.afterEach(async function (this: DraupnirTestContext) { client.stop(); } as unknown as Mocha.AsyncFunc); it("Draupnir responded to !mjolnir help", async function ( diff --git a/test/integration/httpAntispamTest.ts b/apps/draupnir/test/integration/httpAntispamTest.ts similarity index 97% rename from test/integration/httpAntispamTest.ts rename to apps/draupnir/test/integration/httpAntispamTest.ts index 616e6ef5..cb0e4514 100644 --- a/test/integration/httpAntispamTest.ts +++ b/apps/draupnir/test/integration/httpAntispamTest.ts @@ -9,7 +9,7 @@ import { isOk, MatrixException, } from "matrix-protection-suite"; -import { MatrixError } from "matrix-bot-sdk"; +import { MatrixError } from "@vector-im/matrix-bot-sdk"; describe("Test for http antispam callbacks", function () { it("We can process check_event_for_spam", async function ( diff --git a/test/integration/manualLaunchScript.ts b/apps/draupnir/test/integration/manualLaunchScript.ts similarity index 100% rename from test/integration/manualLaunchScript.ts rename to apps/draupnir/test/integration/manualLaunchScript.ts diff --git a/test/integration/mjolnirSetupUtils.ts b/apps/draupnir/test/integration/mjolnirSetupUtils.ts similarity index 84% rename from test/integration/mjolnirSetupUtils.ts rename to apps/draupnir/test/integration/mjolnirSetupUtils.ts index fc545ec6..aa98198d 100644 --- a/test/integration/mjolnirSetupUtils.ts +++ b/apps/draupnir/test/integration/mjolnirSetupUtils.ts @@ -14,7 +14,7 @@ import { MemoryStorageProvider, LogService, LogLevel, -} from "matrix-bot-sdk"; +} from "@vector-im/matrix-bot-sdk"; import { overrideRatelimitForUser, registerUser } from "./clientHelper"; import { initializeSentry, patchMatrixClient } from "../../src/utils"; import { IConfig } from "../../src/config"; @@ -71,15 +71,21 @@ export async function ensureAliasedRoomExists( try { return await client.resolveRoom(alias); } catch (e) { - if (e?.body?.errcode === "M_NOT_FOUND") { - console.info(`${alias} hasn't been created yet, so we're making it now.`); - const roomId = await client.createRoom({ - visibility: "public", - }); - await client.createRoomAlias(alias, roomId); - return roomId; + if (typeof e !== "object" || e === null) { + throw new TypeError("Something is throwing garbage"); } - throw e; + if (!("body" in e) || typeof e.body !== "object" || e.body === null) { + throw e; + } + if (!("errcode" in e.body) || e.body.errcode !== "M_NOT_FOUND") { + throw e; + } + console.info(`${alias} hasn't been created yet, so we're making it now.`); + const roomId = await client.createRoom({ + visibility: "public", + }); + await client.createRoomAlias(alias, roomId); + return roomId; } } @@ -95,13 +101,17 @@ async function configureMjolnir(config: IConfig) { true ); } catch (e) { - if (e?.body?.errcode === "M_USER_IN_USE") { - console.log( - `${config.pantalaimon.username} already registered, skipping` - ); - return; + if (typeof e !== "object" || e === null) { + throw new TypeError("Something is throwing garbage"); } - throw e; + if (!("body" in e) || typeof e.body !== "object" || e.body === null) { + throw e; + } + if (!("errcode" in e.body) || e.body.errcode !== "M_USER_IN_USE") { + throw e; + } + console.log(`${config.pantalaimon.username} already registered, skipping`); + return; } } @@ -163,6 +173,10 @@ export async function makeBotModeToggle( config.homeserverUrl, await client.getUserId() ); + + await client + .deleteRoomAlias(config.managementRoom) + .catch((_: unknown) => undefined); await ensureAliasedRoomExists(client, config.managementRoom); const toggle = await DraupnirBotModeToggle.create( client, diff --git a/test/integration/protections/BlockInvitationsOnServerTest.ts b/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts similarity index 98% rename from test/integration/protections/BlockInvitationsOnServerTest.ts rename to apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts index 6778af9e..dc846fbf 100644 --- a/test/integration/protections/BlockInvitationsOnServerTest.ts +++ b/apps/draupnir/test/integration/protections/BlockInvitationsOnServerTest.ts @@ -14,7 +14,7 @@ import { BlockInvitationsOnServerProtection } from "../../../src/protections/Blo import expect from "expect"; import { resultifyBotSDKRequestError } from "matrix-protection-suite-for-matrix-bot-sdk"; import { isOk, MatrixException, Ok } from "matrix-protection-suite"; -import { MatrixError } from "matrix-bot-sdk"; +import { MatrixError } from "@vector-im/matrix-bot-sdk"; async function createWatchedPolicyRoom( draupnir: Draupnir diff --git a/test/integration/protections/JoinRoomsOnInviteTest.ts b/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts similarity index 98% rename from test/integration/protections/JoinRoomsOnInviteTest.ts rename to apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts index e193909a..07e1ca5e 100644 --- a/test/integration/protections/JoinRoomsOnInviteTest.ts +++ b/apps/draupnir/test/integration/protections/JoinRoomsOnInviteTest.ts @@ -19,7 +19,7 @@ async function setupProtectedRooms( ): Promise { await moderator.joinRoom(draupnir.managementRoomID); return await Promise.all( - [...Array(numberOfRooms)].map(async (_) => { + [...Array(numberOfRooms)].map(async (_) => { const room = await moderator.createRoom({ invite: [draupnir.clientUserID], }); diff --git a/test/integration/protections/RoomTakedownProtectionTest.ts b/apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts similarity index 100% rename from test/integration/protections/RoomTakedownProtectionTest.ts rename to apps/draupnir/test/integration/protections/RoomTakedownProtectionTest.ts diff --git a/test/integration/reportPollingTest.ts b/apps/draupnir/test/integration/reportPollingTest.ts similarity index 90% rename from test/integration/reportPollingTest.ts rename to apps/draupnir/test/integration/reportPollingTest.ts index 169e06f3..2549055b 100644 --- a/test/integration/reportPollingTest.ts +++ b/apps/draupnir/test/integration/reportPollingTest.ts @@ -8,7 +8,7 @@ // https://github.com/matrix-org/mjolnir // -import { MatrixClient } from "matrix-bot-sdk"; +import { MatrixClient } from "@vector-im/matrix-bot-sdk"; import { newTestUser } from "./clientHelper"; import { DraupnirTestContext } from "./mjolnirSetupUtils"; import { @@ -21,17 +21,17 @@ import { createMock } from "ts-auto-mock"; import { ReportManager } from "../../src/report/ReportManager"; import { ReportPoller } from "../../src/report/ReportPoller"; -describe("Test: Report polling", function () { +describe("Test: Report polling", function (this: Mocha.Suite) { let client: MatrixClient; let reportPoller: ReportPoller | undefined; - this.beforeEach(async function () { + this.beforeEach(async function (this: DraupnirTestContext) { client = await newTestUser(this.config.homeserverUrl, { name: { contains: "protection-settings" }, }); - }); - this.afterEach(function () { + } as unknown as Mocha.AsyncFunc); + this.afterEach(function (this: DraupnirTestContext) { reportPoller?.stop(); - }); + } as unknown as Mocha.Func); it("Draupnir correctly retrieves a report from synapse", async function ( this: DraupnirTestContext ) { diff --git a/test/integration/throttleQueueTest.ts b/apps/draupnir/test/integration/throttleQueueTest.ts similarity index 85% rename from test/integration/throttleQueueTest.ts rename to apps/draupnir/test/integration/throttleQueueTest.ts index 8b5fc054..c06f52a3 100644 --- a/test/integration/throttleQueueTest.ts +++ b/apps/draupnir/test/integration/throttleQueueTest.ts @@ -10,12 +10,15 @@ import { Ok } from "matrix-protection-suite"; import { ThrottlingQueue } from "../../src/queues/ThrottlingQueue"; +import { DraupnirTestContext } from "./mjolnirSetupUtils"; describe("Test: ThrottlingQueue", function () { - it("Tasks enqueued with `push()` are executed exactly once and in the right order", async function () { + it("Tasks enqueued with `push()` are executed exactly once and in the right order", async function (this: DraupnirTestContext) { this.timeout(20000); - - const queue = new ThrottlingQueue(this.mjolnir, 10); + if (this.draupnir === undefined) { + throw new TypeError("Test isn't setup correctly"); + } + const queue = new ThrottlingQueue(this.draupnir.managementRoomOutput, 10); const state = new Map(); const promises: Promise[] = []; for (let counter = 0; counter < 10; ++counter) { @@ -54,9 +57,12 @@ describe("Test: ThrottlingQueue", function () { queue.dispose(); }); - it("Tasks enqueued with `push()` are executed exactly once and in the right order, even if we call `block()` at some point", async function () { + it("Tasks enqueued with `push()` are executed exactly once and in the right order, even if we call `block()` at some point", async function (this: DraupnirTestContext) { this.timeout(20000); - const queue = new ThrottlingQueue(this.mjolnir, 10); + if (this.draupnir === undefined) { + throw new TypeError("Test isn't setup correctly"); + } + const queue = new ThrottlingQueue(this.draupnir.managementRoomOutput, 10); const state = new Map(); const promises: Promise[] = []; for (let counter = 0; counter < 10; ++counter) { diff --git a/test/integration/throttleTest.ts b/apps/draupnir/test/integration/throttleTest.ts similarity index 95% rename from test/integration/throttleTest.ts rename to apps/draupnir/test/integration/throttleTest.ts index 3e9784d5..541fd75c 100644 --- a/test/integration/throttleTest.ts +++ b/apps/draupnir/test/integration/throttleTest.ts @@ -11,9 +11,10 @@ import { strict as assert } from "assert"; import { newTestUser } from "./clientHelper"; import { getMessagesByUserIn } from "../../src/utils"; +import { DraupnirTestContext } from "./mjolnirSetupUtils"; describe("Test: throttled users can function with Draupnir.", function () { - it("throttled users survive being throttled by synapse", async function () { + it("throttled users survive being throttled by synapse", async function (this: DraupnirTestContext) { const throttledUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "throttled" }, isThrottled: true, diff --git a/test/integration/timelinePaginationTest.ts b/apps/draupnir/test/integration/timelinePaginationTest.ts similarity index 95% rename from test/integration/timelinePaginationTest.ts rename to apps/draupnir/test/integration/timelinePaginationTest.ts index 1a8338e3..0743309b 100644 --- a/test/integration/timelinePaginationTest.ts +++ b/apps/draupnir/test/integration/timelinePaginationTest.ts @@ -11,6 +11,7 @@ import { strict as assert } from "assert"; import { newTestUser } from "./clientHelper"; +import { DraupnirTestContext } from "./mjolnirSetupUtils"; import { getMessagesByUserIn } from "../../src/utils"; import { TextMessageContent } from "matrix-protection-suite"; @@ -18,7 +19,7 @@ import { TextMessageContent } from "matrix-protection-suite"; * Ensure that Draupnir paginates only the necessary segment of the room timeline when backfilling. */ describe("Test: timeline pagination", function () { - it("does not paginate across the entire room history while backfilling.", async function () { + it("does not paginate across the entire room history while backfilling.", async function (this: DraupnirTestContext) { this.timeout(60000); // Create a few users and a room. const badUser = await newTestUser(this.config.homeserverUrl, { @@ -94,7 +95,7 @@ describe("Test: timeline pagination", function () { "There shouldn't be any more events (1 member event and 6 messages), and they should all be from the same account." ); }); - it("does not call the callback with an empty array when there are no relevant events", async function () { + it("does not call the callback with an empty array when there are no relevant events", async function (this: DraupnirTestContext) { this.timeout(60000); const badUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "spammer" }, @@ -126,7 +127,7 @@ describe("Test: timeline pagination", function () { ); assert.equal(cbCount, 0, "The callback should never get called"); }); - it("The limit provided is respected", async function () { + it("The limit provided is respected", async function (this: DraupnirTestContext) { this.timeout(60000); const badUser = await newTestUser(this.config.homeserverUrl, { name: { contains: "spammer" }, @@ -197,7 +198,7 @@ describe("Test: timeline pagination", function () { "The callback should be called once with events matching the glob." ); }); - it("Gives the events to the callback ordered by youngest first (even more important when the limit is reached halfway through a chunk).", async function () { + it("Gives the events to the callback ordered by youngest first (even more important when the limit is reached halfway through a chunk).", async function (this: DraupnirTestContext) { this.timeout(60000); const moderator = await newTestUser(this.config.homeserverUrl, { name: { contains: "moderator" }, diff --git a/test/integration/utilsTest.ts b/apps/draupnir/test/integration/utilsTest.ts similarity index 81% rename from test/integration/utilsTest.ts rename to apps/draupnir/test/integration/utilsTest.ts index d95508e5..f2426ede 100644 --- a/test/integration/utilsTest.ts +++ b/apps/draupnir/test/integration/utilsTest.ts @@ -9,8 +9,8 @@ // import { strict as assert } from "assert"; -import { LogLevel } from "matrix-bot-sdk"; -import { DraupnirTestContext, draupnirClient } from "./mjolnirSetupUtils"; +import { LogLevel } from "@vector-im/matrix-bot-sdk"; +import { DraupnirTestContext, draupnirSafeEmitter } from "./mjolnirSetupUtils"; import { NoticeMessageContent, RoomEvent, @@ -23,8 +23,8 @@ describe("Test: utils", function () { async function (this: DraupnirTestContext) { const managementRoomAlias = this.config.managementRoom; const draupnir = this.draupnir; - const draupnirMatrixClient = draupnirClient(); - if (draupnir === undefined || draupnirMatrixClient === null) { + const draupnirMatrixClient = draupnirSafeEmitter(); + if (draupnir === undefined) { throw new TypeError(`Setup code is broken`); } const managementRoomOutput = draupnir.managementRoomOutput; @@ -37,8 +37,11 @@ describe("Test: utils", function () { const message: RoomEvent = await new Promise((resolve) => { draupnirMatrixClient.on("room.message", (roomId, event) => { - if (roomId === draupnir.managementRoomID) { - if (event.content?.body?.startsWith("it's")) { + if ( + roomId === draupnir.managementRoomID && + Value.Check(NoticeMessageContent, event.content) + ) { + if (event.content.body.startsWith("it's")) { resolve(event); } } diff --git a/test/nginx.conf b/apps/draupnir/test/nginx.conf similarity index 100% rename from test/nginx.conf rename to apps/draupnir/test/nginx.conf diff --git a/test/tsnode.cjs b/apps/draupnir/test/tsnode.cjs similarity index 100% rename from test/tsnode.cjs rename to apps/draupnir/test/tsnode.cjs diff --git a/test/unit/commands/BanCommandTest.ts b/apps/draupnir/test/unit/commands/BanCommandTest.ts similarity index 100% rename from test/unit/commands/BanCommandTest.ts rename to apps/draupnir/test/unit/commands/BanCommandTest.ts diff --git a/test/unit/commands/KickCommandTest.ts b/apps/draupnir/test/unit/commands/KickCommandTest.ts similarity index 98% rename from test/unit/commands/KickCommandTest.ts rename to apps/draupnir/test/unit/commands/KickCommandTest.ts index e8e1e56d..06c59556 100644 --- a/test/unit/commands/KickCommandTest.ts +++ b/apps/draupnir/test/unit/commands/KickCommandTest.ts @@ -30,7 +30,7 @@ async function createProtectedRooms() { return await describeProtectedRoomsSet({ rooms: [ { - membershipDescriptions: [...Array(50)].map((_, index) => ({ + membershipDescriptions: [...Array(50)].map((_, index) => ({ membership: Membership.Join, sender: `@${index}:testserver.example.com` as StringUserID, })), diff --git a/test/unit/commands/UnbanCommandTest.ts b/apps/draupnir/test/unit/commands/UnbanCommandTest.ts similarity index 100% rename from test/unit/commands/UnbanCommandTest.ts rename to apps/draupnir/test/unit/commands/UnbanCommandTest.ts diff --git a/test/unit/commands/WatchUnwatchCommandTest.ts b/apps/draupnir/test/unit/commands/WatchUnwatchCommandTest.ts similarity index 100% rename from test/unit/commands/WatchUnwatchCommandTest.ts rename to apps/draupnir/test/unit/commands/WatchUnwatchCommandTest.ts diff --git a/test/unit/config/unknownPropertiesTest.ts b/apps/draupnir/test/unit/config/unknownPropertiesTest.ts similarity index 100% rename from test/unit/config/unknownPropertiesTest.ts rename to apps/draupnir/test/unit/config/unknownPropertiesTest.ts diff --git a/test/unit/protections/DraupnirNewsTest.ts b/apps/draupnir/test/unit/protections/DraupnirNewsTest.ts similarity index 100% rename from test/unit/protections/DraupnirNewsTest.ts rename to apps/draupnir/test/unit/protections/DraupnirNewsTest.ts diff --git a/test/unit/protections/MentionLimitProtectionTest.ts b/apps/draupnir/test/unit/protections/MentionLimitProtectionTest.ts similarity index 100% rename from test/unit/protections/MentionLimitProtectionTest.ts rename to apps/draupnir/test/unit/protections/MentionLimitProtectionTest.ts diff --git a/test/unit/protections/RedactionSynchronisationTest.ts b/apps/draupnir/test/unit/protections/RedactionSynchronisationTest.ts similarity index 100% rename from test/unit/protections/RedactionSynchronisationTest.ts rename to apps/draupnir/test/unit/protections/RedactionSynchronisationTest.ts diff --git a/test/unit/protections/RoomTakedownServiceTest.ts b/apps/draupnir/test/unit/protections/RoomTakedownServiceTest.ts similarity index 100% rename from test/unit/protections/RoomTakedownServiceTest.ts rename to apps/draupnir/test/unit/protections/RoomTakedownServiceTest.ts diff --git a/test/unit/protections/serverBanSynchronisationCapabilityRenameTest.ts b/apps/draupnir/test/unit/protections/serverBanSynchronisationCapabilityRenameTest.ts similarity index 100% rename from test/unit/protections/serverBanSynchronisationCapabilityRenameTest.ts rename to apps/draupnir/test/unit/protections/serverBanSynchronisationCapabilityRenameTest.ts diff --git a/test/unit/stores/hashStoreTest.ts b/apps/draupnir/test/unit/stores/hashStoreTest.ts similarity index 100% rename from test/unit/stores/hashStoreTest.ts rename to apps/draupnir/test/unit/stores/hashStoreTest.ts diff --git a/test/unit/stores/roomAuditLogTest.ts b/apps/draupnir/test/unit/stores/roomAuditLogTest.ts similarity index 100% rename from test/unit/stores/roomAuditLogTest.ts rename to apps/draupnir/test/unit/stores/roomAuditLogTest.ts diff --git a/test/unit/stores/roomStateBackingStoreTest.ts b/apps/draupnir/test/unit/stores/roomStateBackingStoreTest.ts similarity index 95% rename from test/unit/stores/roomStateBackingStoreTest.ts rename to apps/draupnir/test/unit/stores/roomStateBackingStoreTest.ts index ff38c5c8..1d6c0672 100644 --- a/test/unit/stores/roomStateBackingStoreTest.ts +++ b/apps/draupnir/test/unit/stores/roomStateBackingStoreTest.ts @@ -59,13 +59,12 @@ describe("RoomStateBackingStore", function () { const store = makeStore(); const roomStateRevisionIssuer = ( await roomStateManager.getRoomStateRevisionIssuer(exampleRoom) - ).expect( - "should be able to get this revision issuer mare" - ) as FakeRoomStateRevisionIssuer; + ).expect("should be able to get this revision issuer mare"); + const fakeMirror = roomStateRevisionIssuer as FakeRoomStateRevisionIssuer; roomStateRevisionIssuer.on("revision", (revision, changes) => { store.handleRevision(revision, changes); }); - roomStateRevisionIssuer.appendState([ + fakeMirror.appendState([ describeRoomMember({ sender: DraupnirUserID, room_id: exampleRoom.toRoomIDOrAlias(), diff --git a/test/unit/stores/userRestrictionAuditLogTest.ts b/apps/draupnir/test/unit/stores/userRestrictionAuditLogTest.ts similarity index 100% rename from test/unit/stores/userRestrictionAuditLogTest.ts rename to apps/draupnir/test/unit/stores/userRestrictionAuditLogTest.ts diff --git a/apps/draupnir/tsconfig.json b/apps/draupnir/tsconfig.json new file mode 100644 index 00000000..359adae8 --- /dev/null +++ b/apps/draupnir/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "declarationDir": "dist", + "outDir": "dist", + "rootDir": "src", + "jsx": "react", + "jsxFactory": "DeadDocumentJSX.JSXFactory" + }, + "include": ["src/**/*"], + "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx"] +} diff --git a/apps/draupnir/tsconfig.test.json b/apps/draupnir/tsconfig.test.json new file mode 100644 index 00000000..7e068945 --- /dev/null +++ b/apps/draupnir/tsconfig.test.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true, + "rootDir": "." + }, + "exclude": [], + "include": ["src/**/*", "test/**/*"] +} diff --git a/draupnir-entrypoint.sh b/draupnir-entrypoint.sh index c92ddb81..4ae9c6b4 100755 --- a/draupnir-entrypoint.sh +++ b/draupnir-entrypoint.sh @@ -12,8 +12,8 @@ # We maintain the behaviour where if it looks like someone is providing an executable to `docker run`, then we will execute that instead. # This aids configuration and debugging of the image if for example node needed to be started via another method. case "$1" in - bot) shift; set -- node /draupnir/index.js "$@";; - appservice) shift; set -- node /draupnir/appservice/cli.js "$@";; + bot) shift; set -- node /apps/draupnir/dist/index.js "$@";; + appservice) shift; set -- node /apps/draupnir/dist/appservice/cli.js "$@";; esac exec "$@"; diff --git a/eslint.config.mjs b/eslint.config.mjs index e5cf583b..f7f061e9 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2024 Gnuxie // -// SPDX-License-Identifier: CC0-1.0 +// SPDX-License-Identifier: 0BSD import eslint from "@eslint/js"; import tseslint from "typescript-eslint"; @@ -17,69 +17,108 @@ const ignores = [ "**/coverage/**", "**/dist/**", "**/lib/**", + "**/node_modules/**", + "**/*.js", + "**/*.jsx" ]; -const rulesFromMPS = { - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }], - // we implement a lot of interfaces that return promises with synchronous functions. - "require-await": "off", - "@typescript-eslint/require-await": "off", - // we need never because our code can be wrong! - "@typescript-eslint/restrict-template-expressions": [ - "error", - { allowNever: true }, - ], - // stylistic recommendation that doesn't play well with event emitter interfaces. - "@typescript-eslint/unified-signatures": "off", - // There are some compelling arguments for including this rule, - // but other than using namespaces, we don't have granular enough modules - // to be able to depend on their behaviour. This should be revisited. - "@typescript-eslint/no-extraneous-class": "off", - // We want to be able to create infinite loops. - "@typescript-eslint/no-unnecessary-condition": [ - "error", - { allowConstantLoopConditions: true }, - ], -}; - -export default tseslint.config({ - // This is a typescript-eslint configurartion for typescript files. - // This will not work against js files. - files: ["src/**/*.ts", "src/**/*.tsx", "test/**/*.ts", "test/**/*.tsx"], - extends: [eslint.configs.recommended, ...tseslint.configs.strictTypeChecked], - languageOptions: { - parserOptions: { - project: ["./tsconfig.json", "./test/tsconfig.json"], +export default tseslint.config( + { + ignores + }, + { + // This is a typescript-eslint configurartion for typescript files. + // This will not work against js files. + files: [ + "packages/**/src/**/*.ts", + "packages/**/src/**/*.tsx", + "packages/**/test/**/*.ts", + "packages/**/test/**/*.tsx", + "apps/**/src/**/*.ts", + "apps/**/src/**/*.tsx", + "apps/**/test/**/*.ts", + "apps/**/test/**/*.tsx", + ], + extends: [ + eslint.configs.recommended, + ...tseslint.configs.strictTypeChecked, + ], + languageOptions: { + parserOptions: { + project: [ + "./apps/*/tsconfig.test.json", + "./apps/*/tsconfig.json", + "./packages/*/tsconfig.test.json", + "./packages/*/tsconfig.json", + ], + tsconfigRootDir: import.meta.dirname, + }, }, + // This is needed in order to specify the desired behavior for its rules + plugins: { + "@typescript-eslint": tsplugin, + }, + rules: { + // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs + // e.g. "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { argsIgnorePattern: "^_", caughtErrorsIgnorePattern: "^_" }, + ], + // we implement a lot of interfaces that return promises with synchronous functions. + "require-await": "off", + "@typescript-eslint/require-await": "off", + // we need never because our code can be wrong! + "@typescript-eslint/restrict-template-expressions": [ + "error", + { allowNever: true }, + ], + // stylistic recommendation that doesn't play well with event emitter interfaces. + "@typescript-eslint/unified-signatures": "off", + // There are some compelling arguments for including this rule, + // but other than using namespaces, we don't have granular enough modules + // to be able to depend on their behaviour. This should be revisited. + "@typescript-eslint/no-extraneous-class": "off", + "@typescript-eslint/unbound-method": [ + "error", + { ignoreStatic: true } + ], + // We want to be able to create infinite loops. + "@typescript-eslint/no-unnecessary-condition": [ + "error", + { allowConstantLoopConditions: true }, + ], + // This rule is unstable as hell and tries to apply itself to interfaces. + "@typescript-eslint/no-unnecessary-type-parameters": "off", + "@typescript-eslint/no-empty-object-type": [ + "error", + { allowInterfaces: "with-single-extends" }, + ], + // We intentionally use enums to compare against non enum values, but no doubt this one will bite us in the ass later + }, + ignores, }, - // This is needed in order to specify the desired behavior for its rules - plugins: { - "@typescript-eslint": tsplugin, + { + files: ["packages/matrix-protection-suite/**/*.{ts,tsx}"], + rules: { + // We intentionally compare enums to non enum values but no doubt it will bite us in the ass later + "@typescript-eslint/no-unsafe-enum-comparison": "off", + }, + ignores, }, - rules: { - // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs - // e.g. "@typescript-eslint/explicit-function-return-type": "off", - ...rulesFromMPS, - - // There is too much ambient `any` from the `matrix-bot-sdk` in our project to be able to use no-unsafe-*. - // We would really love to be able to set this to `error`. - "@typescript-eslint/no-unsafe-argument": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-return": "off", - "@typescript-eslint/no-unsafe-call": "off", - - // We make the mistake of using `unknown` for caught and wrapped exceptions - // in matrix-protection-suite... - // which causes problems when we unwrap them. - // We should probably change `Result` to throw when exception doesn't - // implement error. - "@typescript-eslint/only-throw-error": "off", - - "@typescript-eslint/unbound-method": ["error", { ignoreStatic: true }], - - "no-constant-condition": ["error", { checkLoops: "allExceptWhileTrue" }], - }, - ignores: [...ignores, "**/*.js", "**/*.jsx"], -}); + { + files: ["apps/draupnir/**/*.{ts,tsx}"], + rules: { + "@typescript-eslint/no-deprecated": [ + "error", + { + allow: [{ from: "file", name: "logMessage" }, { from: "file", name: "allocateProtection"}], + }, + ], + // We intentionally compare enums to non enum values but no doubt it will bite us in the ass later + "@typescript-eslint/no-unsafe-enum-comparison": "off", + }, + ignores, + } +); diff --git a/mx-tester.yml b/mx-tester.yml index e417ccfd..3e031f98 100644 --- a/mx-tester.yml +++ b/mx-tester.yml @@ -16,14 +16,12 @@ up: ""; do echo "Waiting for psql..."; sleep 1s; done # Launch the reverse proxy, listening for connections *only* on the local host. - docker run --rm --network host --name mjolnir-test-reverse-proxy -p - 127.0.0.1:8081:80 -v $MX_TEST_CWD/test/nginx.conf:/etc/nginx/nginx.conf:ro - -v - $MX_TEST_CWD/test/draupnir_news.json:/var/www/test/draupnir_news.json:ro + 127.0.0.1:8081:80 -v + $MX_TEST_CWD/apps/draupnir/test/nginx.conf:/etc/nginx/nginx.conf:ro -v + $MX_TEST_CWD/apps/draupnir/test/draupnir_news.json:/var/www/test/draupnir_news.json:ro -d nginx - - corepack yarn install - - corepack yarn ts-node src/appservice/cli.ts -r -u - "http://host.docker.internal:9000" - - cp draupnir-registration.yaml $MX_TEST_SYNAPSE_DIR/data/ + - corepack npm run -w apps/draupnir harness-registration + - cp apps/draupnir/draupnir-registration.yaml $MX_TEST_SYNAPSE_DIR/data/ after: # Wait until Synapse is ready - until curl localhost:9999 --stderr /dev/null > /dev/null; do echo "Waiting @@ -31,7 +29,7 @@ up: - echo "Synapse is ready" run: - - corepack yarn test:integration + - corepack npm run -w apps/draupnir test:integration down: finally: diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..681b3795 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18655 @@ +{ + "name": "@the-draupnir-project/monorepo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@the-draupnir-project/monorepo", + "version": "0.0.0", + "license": "AFL-3.0", + "workspaces": [ + "packages/*", + "apps/*" + ], + "devDependencies": { + "@eslint/js": "^9.39.3", + "@types/jest": "^30.0.0", + "eslint": "^9.39.3", + "jest": "^30.3.0", + "prettier": "^3.3.3", + "ts-jest": "^29.4.6", + "typescript": "^5.9.3", + "typescript-eslint": "^8.56.1" + } + }, + "apps/draupnir": { + "version": "2.9.0", + "license": "AFL-3.0", + "dependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "@sentry/node": "^7.17.2", + "@sinclair/typebox": "0.34.13", + "@the-draupnir-project/interface-manager": "4.2.6", + "@the-draupnir-project/matrix-basic-types": "1.5.0", + "@the-draupnir-project/mps-interface-adaptor": "file:../../packages/mps-interface-adaptor", + "@vector-im/matrix-bot-sdk": "0.7.1-element.6", + "better-sqlite3": "^9.4.3", + "body-parser": "^1.20.2", + "config": "^3.3.9", + "express": "^4.19", + "html-to-text": "^8.0.0", + "js-yaml": "^4.1.0", + "jsdom": "^24.0.0", + "matrix-appservice-bridge": "10.3.1", + "matrix-protection-suite": "file:../../packages/matrix-protection-suite", + "matrix-protection-suite-for-matrix-bot-sdk": "file:../../packages/matrix-protection-suite-for-matrix-bot-sdk", + "pg": "^8.8.0", + "yaml": "^2.3.2" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.9", + "@types/config": "^3.3.1", + "@types/crypto-js": "^4.2.2", + "@types/express": "^4.17.21", + "@types/html-to-text": "^8.0.1", + "@types/js-yaml": "^4.0.9", + "@types/jsdom": "21.1.7", + "@types/mocha": "^10.0.7", + "@types/nedb": "^1.8.16", + "@types/node": "^20.14.11", + "@types/pg": "^8.6.5", + "@types/request": "^2.48.12", + "crypto-js": "^4.2.0", + "expect": "^29.7.0", + "mocha": "^10.7.0", + "ts-auto-mock": "^3.7.4", + "ts-node": "^10.9.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "apps/draupnir/node_modules/@selderee/plugin-htmlparser2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz", + "integrity": "sha512-J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==", + "license": "MIT", + "dependencies": { + "domhandler": "^4.2.0", + "selderee": "^0.6.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "apps/draupnir/node_modules/@types/node": { + "version": "20.19.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz", + "integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "apps/draupnir/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "apps/draupnir/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "apps/draupnir/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "apps/draupnir/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "apps/draupnir/node_modules/html-to-text": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-8.2.1.tgz", + "integrity": "sha512-aN/3JvAk8qFsWVeE9InWAWueLXrbkoVZy0TkzaGhoRBC2gCFEeRLDDJN3/ijIGHohy6H+SZzUQWN/hcYtaPK8w==", + "license": "MIT", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.6.0", + "deepmerge": "^4.2.2", + "he": "^1.2.0", + "htmlparser2": "^6.1.0", + "minimist": "^1.2.6", + "selderee": "^0.6.0" + }, + "bin": { + "html-to-text": "bin/cli.js" + }, + "engines": { + "node": ">=10.23.2" + } + }, + "apps/draupnir/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "apps/draupnir/node_modules/matrix-appservice-bridge": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/matrix-appservice-bridge/-/matrix-appservice-bridge-10.3.1.tgz", + "integrity": "sha512-umBLAqLUdm6TefEdQuHUE0QfSmbtJf+LnHDYRM5XwpMjScIXQ/5pI6559gVQrxVVT5T58jbNuoJCz2+8+XLr3Q==", + "license": "Apache-2.0", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@types/nedb": "^1.8.16", + "@vector-im/matrix-bot-sdk": "^0.7.1-element.6", + "chalk": "^4.1.0", + "express": "^4.18.2", + "express-rate-limit": "^7.1.5", + "extend": "^3.0.2", + "ip-cidr": "^3.0.0", + "is-my-json-valid": "^2.20.5", + "js-yaml": "^4.0.0", + "matrix-appservice": "^2.0.0", + "nopt": "^5.0.0", + "p-queue": "^6.6.2", + "pkginfo": "^0.4.1", + "postgres": "^3.4.3", + "prom-client": "^15.1.0", + "winston": "^3.11.0", + "winston-daily-rotate-file": "^4.5.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "nedb": "^1.8.0" + } + }, + "apps/draupnir/node_modules/parseley": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.7.0.tgz", + "integrity": "sha512-xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==", + "license": "MIT", + "dependencies": { + "moo": "^0.5.1", + "nearley": "^2.20.1" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "apps/draupnir/node_modules/selderee": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz", + "integrity": "sha512-ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==", + "license": "MIT", + "dependencies": { + "parseley": "^0.7.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "apps/draupnir/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "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", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "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==", + "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==", + "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", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "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", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "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", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "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", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.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-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/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "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/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.3", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gerrit0/mini-shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz", + "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-oniguruma": "^3.22.0", + "@shikijs/langs": "^3.22.0", + "@shikijs/themes": "^3.22.0", + "@shikijs/types": "^3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@gnuxie/super-cool-stream": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@gnuxie/super-cool-stream/-/super-cool-stream-0.2.1.tgz", + "integrity": "sha512-Sk6MXHTAn3GVRk/EkF9dt514OB/tdmesAJnOwygU1s3YoHcxNkf5t9p0U6BfZt7dYSuqEnMnc/XH5PCVsbrjkA==", + "license": "Apache-2.0" + }, + "node_modules/@gnuxie/typescript-result": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@gnuxie/typescript-result/-/typescript-result-1.1.1.tgz", + "integrity": "sha512-t8qKAyOYzpC+oMceFJHTbkzakKbCywJoDo7Gff7gnYZC4mbGP52SN/9cHUk8LZcy8WjFkhE1rC1gwkwzGnpu4g==", + "license": "Apache-2.0" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/@isaacs/cliui/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/@isaacs/cliui/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/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "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/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "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/@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.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "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/console/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/console/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/@jest/console/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/console/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/@jest/console/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/console/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/console/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/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/@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/core/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/@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/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/@jest/core/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/core/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/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.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "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/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/environment/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/@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": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect/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/expect/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/expect/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/expect/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/@jest/expect/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/expect/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/@jest/expect/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/@jest/expect/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/expect/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/expect/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/expect/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/expect/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/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/fake-timers/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/fake-timers/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/@jest/fake-timers/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/fake-timers/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/@jest/fake-timers/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/fake-timers/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/fake-timers/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/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/globals/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/globals/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/@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/reporters/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/reporters/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/@jest/reporters/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/reporters/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@jest/reporters/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/@jest/reporters/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/@jest/reporters/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/reporters/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/reporters/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/@jest/reporters/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/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas/node_modules/@sinclair/typebox": { + "version": "0.27.10", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", + "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.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/snapshot-utils/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/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "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/@jest/snapshot-utils/node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "dev": true, + "license": "MIT" + }, + "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-result/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/test-result/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/@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/transform/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/transform/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/@jest/transform/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/@jest/transform/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/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@matrix-org/matrix-sdk-crypto-nodejs": { + "version": "0.2.0-beta.1", + "resolved": "https://registry.npmjs.org/@matrix-org/matrix-sdk-crypto-nodejs/-/matrix-sdk-crypto-nodejs-0.2.0-beta.1.tgz", + "integrity": "sha512-CgbOKORfD6dvYgQTPhfN73H1RbQknrFkMnRRwCIJMt15iL2AF1gEowgbrlGhkbG6gNng4CgPnKs1iHKCRrhvmA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "https-proxy-agent": "^5.0.1", + "node-downloader-helper": "^2.1.5" + }, + "engines": { + "node": ">= 18" + } + }, + "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/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "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/@selderee/plugin-htmlparser2": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", + "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "selderee": "^0.11.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.4.tgz", + "integrity": "sha512-Fz5+4XCg3akeoFK+K7g+d7HqGMjmnLoY2eJlpONJmaeT9pXY7yfUyXKZMmMajdE2LxxKJgQ2YKvSCaGVamTjHw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.4", + "@sentry/types": "7.120.4", + "@sentry/utils": "7.120.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.4.tgz", + "integrity": "sha512-TXu3Q5kKiq8db9OXGkWyXUbIxMMuttB5vJ031yolOl5T/B69JRyAoKuojLBjRv1XX583gS1rSSoX8YXX7ATFGA==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.4", + "@sentry/utils": "7.120.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.4.tgz", + "integrity": "sha512-kkBTLk053XlhDCg7OkBQTIMF4puqFibeRO3E3YiVc4PGLnocXMaVpOSCkMqAc1k1kZ09UgGi8DxfQhnFEjUkpA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.4", + "@sentry/types": "7.120.4", + "@sentry/utils": "7.120.4", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.4.tgz", + "integrity": "sha512-qq3wZAXXj2SRWhqErnGCSJKUhPSlZ+RGnCZjhfjHpP49KNpcd9YdPTIUsFMgeyjdh6Ew6aVCv23g1hTP0CHpYw==", + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.120.4", + "@sentry/core": "7.120.4", + "@sentry/integrations": "7.120.4", + "@sentry/types": "7.120.4", + "@sentry/utils": "7.120.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.4.tgz", + "integrity": "sha512-cUq2hSSe6/qrU6oZsEP4InMI5VVdD86aypE+ENrQ6eZEVLTCYm1w6XhW1NvIu3UuWh7gZec4a9J7AFpYxki88Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.120.4", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.4.tgz", + "integrity": "sha512-zCKpyDIWKHwtervNK2ZlaK8mMV7gVUijAgFeJStH+CU/imcdquizV3pFLlSQYRswG+Lbyd6CT/LGRh3IbtkCFw==", + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/core/node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/core/node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.13", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.13.tgz", + "integrity": "sha512-ceVKqyCEgC355Kw0s/0tyfY9MzMQINSykJ/pG2w6YnaZyrcjV48svZpr8lVZrYgWjzOmrIPBhQRAtr/7eJpA5g==", + "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.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@the-draupnir-project/interface-manager": { + "resolved": "packages/interface-manager", + "link": true + }, + "node_modules/@the-draupnir-project/matrix-basic-types": { + "resolved": "packages/matrix-basic-types", + "link": true + }, + "node_modules/@the-draupnir-project/matrix-protection-suite": { + "resolved": "packages/matrix-protection-suite", + "link": true + }, + "node_modules/@the-draupnir-project/matrix-protection-suite-for-matrix-bot-sdk": { + "resolved": "packages/matrix-protection-suite-for-matrix-bot-sdk", + "link": true + }, + "node_modules/@the-draupnir-project/mps-interface-adaptor": { + "resolved": "packages/mps-interface-adaptor", + "link": true + }, + "node_modules/@the-draupnir-project/tsconfig": { + "resolved": "packages/tsconfig", + "link": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "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/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/better-sqlite3": { + "version": "7.6.13", + "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", + "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/config": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.5.tgz", + "integrity": "sha512-itq2HtXQBrNUKwMNZnb9mBRE3T99VYCdl1gjST9rq+9kFaB1iMMGuDeZnP88qid73DnpAMKH9ZolqDpS1Lz7+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob-to-regexp": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.4.tgz", + "integrity": "sha512-nDKoaKJYbnn1MZxUY0cA1bPmmgZbg0cTq7Rh13d0KWYNOiKbqoR+2d89SnRPszGh7ROzSwZ/GOjZ4jPbmmZ6Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-to-text": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-8.1.1.tgz", + "integrity": "sha512-QFcqfc7TiVbvIX8Fc2kWUxakruI1Ay6uitaGCYHzI5M0WHQROV5D2XeSaVrK0FmvssivXum4yERVnJsiuH61Ww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "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/@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/@types/jest/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/@types/jest/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/@types/jest/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/@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/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/@types/jest/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/@types/jest/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/@types/jest/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/@types/jest/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/@types/jest/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/@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/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "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", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/nedb": { + "version": "1.8.16", + "resolved": "https://registry.npmjs.org/@types/nedb/-/nedb-1.8.16.tgz", + "integrity": "sha512-ND+uzwAZk7ZI9byOvHGOcZe2R9XUcLF698yDJKn00trFvh+GaemkX3gQKCSKtObjDpv8Uuou+k8v4x4scPr4TA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/pg": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", + "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/request": { + "version": "2.48.13", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", + "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.5" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "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/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "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.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz", + "integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz", + "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz", + "integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz", + "integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz", + "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz", + "integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz", + "integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz", + "integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", + "integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz", + "integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "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/@vector-im/matrix-bot-sdk": { + "version": "0.7.1-element.6", + "resolved": "https://registry.npmjs.org/@vector-im/matrix-bot-sdk/-/matrix-bot-sdk-0.7.1-element.6.tgz", + "integrity": "sha512-0KfyTpQV5eyY4vPUZW89t7EZf1YF0UyFkyYqpsxL/6S7XIlbTMC4onod7vx/QpKC0lSREmwIiXx2JSjExP6CIw==", + "license": "MIT", + "dependencies": { + "@matrix-org/matrix-sdk-crypto-nodejs": "0.2.0-beta.1", + "@types/express": "^4.17.21", + "another-json": "^0.2.0", + "async-lock": "^1.4.0", + "chalk": "4", + "express": "^4.18.2", + "glob-to-regexp": "^0.4.1", + "hash.js": "^1.1.7", + "html-to-text": "^9.0.5", + "htmlencode": "^0.0.4", + "lowdb": "1", + "lru-cache": "^10.0.1", + "mkdirp": "^3.0.1", + "morgan": "^1.10.0", + "postgres": "^3.4.1", + "request": "^2.88.2", + "request-promise": "^4.2.6", + "sanitize-html": "^2.11.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@vector-im/matrix-bot-sdk/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==", + "license": "ISC" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/another-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", + "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==", + "license": "Apache-2.0" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "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", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "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.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "peer": true + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/await-lock": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==", + "license": "MIT" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "license": "MIT" + }, + "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-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", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/better-sqlite3": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.6.0.tgz", + "integrity": "sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/binary-search-tree": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/binary-search-tree/-/binary-search-tree-0.2.5.tgz", + "integrity": "sha512-CvNVKS6iXagL1uGwLagSXz1hzSMezxOuGnFi5FHGKqaTO3nPPWrAbyALUzK640j+xOTVm7lzD9YP8W1f/gvUdw==", + "peer": true, + "dependencies": { + "underscore": "~1.4.4" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "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": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "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", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "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/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/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": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/config": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/config/-/config-3.3.12.tgz", + "integrity": "sha512-Vmx389R/QVM3foxqBzXO8t2tUikYZP64Q6vQxGrsMpREeJc/aWRnPRERXWsYzOHAumx/AOoILWe6nU3ZJL+6Sw==", + "license": "MIT", + "dependencies": { + "json5": "^2.2.3" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT" + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/create-jest/node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/create-jest/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/create-jest/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/create-jest/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-jest/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/create-jest/node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/create-jest/node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/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/create-jest/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/create-jest/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/create-jest/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/create-jest/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "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==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/cssstyle/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==", + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "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/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/draupnir": { + "resolved": "apps/draupnir", + "link": true + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "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/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "dev": true, + "license": "ISC" + }, + "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": "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/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "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", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "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", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "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/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "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/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ], + "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", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "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", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.1" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "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/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "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", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha512-TuOwZWgJ2VAMEGJvAyPWvpqxSANF0LDpmyHauMjFYzaACvn+QTT/AZomvPCzVBV7yDN3OmwHQ5OvHaeLKre3JQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "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", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "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", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "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/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-prefix": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", + "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^4.1.3", + "kind-of": "^6.0.3", + "which": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/global-prefix/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "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==", + "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/html-to-text": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", + "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", + "license": "MIT", + "dependencies": { + "@selderee/plugin-htmlparser2": "^0.11.0", + "deepmerge": "^4.3.1", + "dom-serializer": "^2.0.0", + "htmlparser2": "^8.0.2", + "selderee": "^0.11.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlencode": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/htmlencode/-/htmlencode-0.0.4.tgz", + "integrity": "sha512-0uDvNVpzj/E2TfvLLyyXhKBRvF1y84aZsyRxRXFsQobnHaL4pcaXk+Y9cnFlvnxrBLeXDNq/VJBD+ngdBgQG1w==", + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/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==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "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", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ip-address": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-7.1.0.tgz", + "integrity": "sha512-V9pWC/VJf2lsXqP7IWJ+pe3P1/HCYGBMZrrnT62niLGjAfCbeiwXMUxaeHvnVlz19O27pvXP4azs+Pj/A0x+SQ==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "1.1.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "license": "BSD-3-Clause" + }, + "node_modules/ip-cidr": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ip-cidr/-/ip-cidr-3.1.0.tgz", + "integrity": "sha512-HUCn4snshEX1P8cja/IyU3qk8FVDW8T5zZcegDFbu4w7NojmAhk5NcOgj3M8+0fmumo1afJTPDtJlzsxLdOjtg==", + "license": "MIT", + "dependencies": { + "ip-address": "^7.1.0", + "jsbn": "^1.1.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ip-cidr/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "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", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.1.tgz", + "integrity": "sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==", + "license": "MIT" + }, + "node_modules/is-my-json-valid": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.6.tgz", + "integrity": "sha512-1JQwulVNjx8UqkPE/bqDaxtH4PXCe/2VRh/y3p99heOV87HG4Id5/VfDswd+YiAfHcRTfDlWgISycnHuhZq1aw==", + "license": "MIT", + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^5.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "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==", + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "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", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "license": "MIT" + }, + "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-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-changed-files/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-changed-files/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/jest-changed-files/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/jest-changed-files/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-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/@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-circus/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-circus/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/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/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/jest-circus/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-circus/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-circus/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-circus/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-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/@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-cli/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/jest-cli/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/jest-cli/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-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-config/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-config/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/jest-config/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-config/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-config/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/jest-config/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/jest-config/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-config/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/jest-config/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": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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/@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-each/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/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/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/jest-each/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-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-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-environment-node/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-environment-node/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/jest-environment-node/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/jest-environment-node/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-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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-haste-map/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-haste-map/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/jest-haste-map/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/jest-haste-map/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-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/@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-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": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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-mock/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-mock/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/jest-mock/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/jest-mock/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-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-resolve/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-resolve/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/jest-resolve/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/jest-resolve/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-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-runner/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-runner/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/jest-runner/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-runner/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/jest-runner/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-runner/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-runner/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-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-runtime/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-runtime/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/jest-runtime/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-runtime/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-runtime/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/jest-runtime/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/jest-runtime/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-runtime/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-runtime/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/jest-runtime/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": { + "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/@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-snapshot/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-snapshot/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/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-snapshot/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/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/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/jest-snapshot/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/jest-snapshot/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-snapshot/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-snapshot/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-snapshot/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-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-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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/@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-validate/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/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-watcher/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-watcher/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/jest-watcher/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/jest-watcher/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-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/@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-worker/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/jest-worker/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/jest-worker/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-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/jest/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/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/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "24.1.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", + "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/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==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/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==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "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": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/layerr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/layerr/-/layerr-3.0.0.tgz", + "integrity": "sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==", + "license": "MIT" + }, + "node_modules/leac": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", + "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "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", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lowdb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true, + "license": "MIT" + }, + "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-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "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/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/matrix-appservice": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matrix-appservice/-/matrix-appservice-2.0.0.tgz", + "integrity": "sha512-HCIuJ5i0YuO8b0dMyGe5dqlsE4f3RzHU0MuMg/2gGAZ4HL3r7aSWOFbyIWStSSUrk1qCa9Eml0i4EnEi0pOtdA==", + "license": "Apache-2.0", + "dependencies": { + "body-parser": "^1.19.0", + "express": "^4.18.1", + "js-yaml": "^4.1.0", + "morgan": "^1.10.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/matrix-protection-suite": { + "resolved": "packages/matrix-protection-suite", + "link": true + }, + "node_modules/matrix-protection-suite-for-matrix-bot-sdk": { + "resolved": "packages/matrix-protection-suite-for-matrix-bot-sdk", + "link": true + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", + "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "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": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "license": "BSD-3-Clause" + }, + "node_modules/morgan": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "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", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", + "license": "MIT", + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + }, + "funding": { + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" + } + }, + "node_modules/nedb": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/nedb/-/nedb-1.8.0.tgz", + "integrity": "sha512-ip7BJdyb5m+86ZbSb4y10FCCW9g35+U8bDRrZlAfCI6m4dKwEsQ5M52grcDcVK4Vm/vnPlDLywkyo3GliEkb5A==", + "license": "SEE LICENSE IN LICENSE", + "peer": true, + "dependencies": { + "async": "0.2.10", + "binary-search-tree": "0.2.5", + "localforage": "^1.3.0", + "mkdirp": "~0.5.1", + "underscore": "~1.4.4" + } + }, + "node_modules/nedb/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-downloader-helper": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/node-downloader-helper/-/node-downloader-helper-2.1.10.tgz", + "integrity": "sha512-8LdieUd4Bqw/CzfZLf30h+1xSAq3riWSDfWKsPJYz8EULoWxjS1vw6BGLYFZDxQgXjDR7UmC9UpQ0oV93U98Fg==", + "license": "MIT", + "bin": { + "ndh": "bin/ndh" + }, + "engines": { + "node": ">=14.18" + } + }, + "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.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "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/oniguruma-to-es": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "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/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseley": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", + "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", + "license": "MIT", + "dependencies": { + "leac": "^0.6.0", + "peberminta": "^0.9.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "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", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "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/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/peberminta": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", + "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", + "license": "MIT", + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.19.0.tgz", + "integrity": "sha512-QIcLGi508BAHkQ3pJNptsFz5WQMlpGbuBGBaIaXsWK8mel2kQ/rThYI+DbgjUvZrIr7MiuEuc9LcChJoEZK1xQ==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.11.0", + "pg-pool": "^3.12.0", + "pg-protocol": "^1.12.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", + "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.12.0.tgz", + "integrity": "sha512-eIJ0DES8BLaziFHW7VgJEBPi5hg3Nyng5iKpYtj3wbcAUV9A1wLgWiY7ajf/f/oO1wfxt83phXPY8Emztg7ITg==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.12.0.tgz", + "integrity": "sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/pkginfo": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", + "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.7.tgz", + "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prom-client": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.3.tgz", + "integrity": "sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "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/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", + "license": "CC0-1.0" + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "license": "MIT", + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz", + "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==", + "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "license": "ISC", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "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/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize-html": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.17.1.tgz", + "integrity": "sha512-ehFCW+q1a4CSOWRAdX97BX/6/PDEkCqw7/0JXZAGQV57FQB3YOkTa/rrzHPeJ+Aghy4vZAFfWMYyfxIiB7F/gw==", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^8.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/selderee": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", + "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", + "license": "MIT", + "dependencies": { + "parseley": "^0.12.0" + }, + "funding": { + "url": "https://ko-fi.com/killymxi" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/shiki/node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/shiki/node_modules/@shikijs/langs": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/shiki/node_modules/@shikijs/themes": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/shiki/node_modules/@shikijs/types": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "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/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", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "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/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "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/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "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/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "license": "ISC", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.3" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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-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": { + "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/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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-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-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-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "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==", + "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/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "license": "MIT", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "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/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-auto-mock": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/ts-auto-mock/-/ts-auto-mock-3.7.4.tgz", + "integrity": "sha512-+/X+7yjpUBsIJBRxl/hs9aq3pA76w3Pcu70uHDxdr4C8TbXXwd/gq6t3b81xqU9N/KPFIFata1HcQZ2lwGKDRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash-es": "4.17.21", + "micromatch": "4.0.8" + }, + "engines": { + "node": ">=14.x.x", + "npm": ">=6.x.x" + }, + "peerDependencies": { + "typescript": "^5.0.4" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-patch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ts-patch/-/ts-patch-3.3.0.tgz", + "integrity": "sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "global-prefix": "^4.0.0", + "minimist": "^1.2.8", + "resolve": "^1.22.2", + "semver": "^7.6.3", + "strip-ansi": "^6.0.1" + }, + "bin": { + "ts-patch": "bin/ts-patch.js", + "tspc": "bin/tspc.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "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/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedoc": { + "version": "0.28.17", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.17.tgz", + "integrity": "sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gerrit0/mini-shiki": "^3.17.0", + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "yaml": "^2.8.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18", + "pnpm": ">= 10" + }, + "peerDependencies": { + "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x" + } + }, + "node_modules/typedoc/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz", + "integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ulidx": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/ulidx/-/ulidx-2.4.1.tgz", + "integrity": "sha512-xY7c8LPyzvhvew0Fn+Ek3wBC9STZAuDI/Y5andCKi9AX6/jvfaX45PhsDX8oxgPL0YFp0Jhr8qWMbS/p9375Xg==", + "license": "MIT", + "dependencies": { + "layerr": "^3.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==", + "peer": true + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "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/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/wait-for-expect": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz", + "integrity": "sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==", + "dev": true, + "license": "MIT" + }, + "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==", + "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", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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==", + "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", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "license": "MIT", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston/node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "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/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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "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/write-file-atomic/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/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/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==", + "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==", + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "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", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "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-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/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/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/interface-manager": { + "name": "@the-draupnir-project/interface-manager", + "version": "4.2.6", + "license": "Apache-2.0", + "dependencies": { + "@gnuxie/super-cool-stream": "^0.2.1", + "@gnuxie/typescript-result": "^1.1.1" + }, + "devDependencies": { + "@types/jest": "^29.5.12", + "jest": "^29.7.0", + "ts-jest": "^29.2.4" + }, + "peerDependencies": { + "@the-draupnir-project/matrix-basic-types": "^1.4.0" + } + }, + "packages/interface-manager/node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/interface-manager/node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/interface-manager/node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "packages/interface-manager/node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "packages/interface-manager/node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "packages/interface-manager/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/interface-manager/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/interface-manager/node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/interface-manager/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "packages/interface-manager/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" + } + }, + "packages/interface-manager/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "packages/interface-manager/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/interface-manager/node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/interface-manager/node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/interface-manager/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "packages/interface-manager/node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "packages/interface-manager/node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/interface-manager/node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "packages/interface-manager/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" + } + }, + "packages/interface-manager/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/matrix-basic-types": { + "name": "@the-draupnir-project/matrix-basic-types", + "version": "1.5.0", + "license": "Apache-2.0", + "dependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "glob-to-regexp": "^0.4.1" + }, + "devDependencies": { + "@types/glob-to-regexp": "^0.4.4", + "@types/jest": "^29.5.12", + "@types/node": "^22.0.0", + "jest": "^29.7.0", + "ts-jest": "^29.2.3" + } + }, + "packages/matrix-basic-types/node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/matrix-basic-types/node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/matrix-basic-types/node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "packages/matrix-basic-types/node_modules/@types/node": { + "version": "22.19.11", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/matrix-basic-types/node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "packages/matrix-basic-types/node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/matrix-basic-types/node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "packages/matrix-basic-types/node_modules/babel-plugin-istanbul/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "packages/matrix-basic-types/node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "packages/matrix-basic-types/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" + } + }, + "packages/matrix-basic-types/node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "packages/matrix-basic-types/node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/matrix-basic-types/node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/matrix-basic-types/node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "packages/matrix-basic-types/node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "packages/matrix-basic-types/node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "packages/matrix-basic-types/node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "packages/matrix-basic-types/node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "packages/matrix-basic-types/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" + } + }, + "packages/matrix-basic-types/node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "packages/matrix-basic-types/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "packages/matrix-protection-suite": { + "name": "@the-draupnir-project/matrix-protection-suite", + "version": "6.0.0", + "license": "AFL-3.0", + "dependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "await-lock": "^2.2.2", + "crypto-js": "^4.2.0", + "glob-to-regexp": "^0.4.1", + "immutable": "^5.0.0-beta.5", + "ulidx": "^2.3.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/glob-to-regexp": "^0.4.4", + "@types/jest": "^30.0.0", + "@types/node": "^20.14.9", + "jest": "^30.2.0", + "ts-jest": "^29.4.5", + "ts-patch": "^3.2.1", + "typedoc": "^0.28.16", + "wait-for-expect": "^3.0.2" + }, + "peerDependencies": { + "@sinclair/typebox": "0.34.13", + "@the-draupnir-project/matrix-basic-types": "^1.5.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk": { + "name": "@the-draupnir-project/matrix-protection-suite-for-matrix-bot-sdk", + "version": "4.0.2", + "license": "AFL-3.0", + "dependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "await-lock": "^2.2.2" + }, + "devDependencies": { + "@types/crypto-js": "^4.1.2", + "@types/glob-to-regexp": "^0.4.1", + "@types/jest": "^30.0.0", + "@types/node": "^20.14.9", + "@vector-im/matrix-bot-sdk": "0.7.1-element.6", + "jest": "^30.2.0", + "matrix-protection-suite": "file:../matrix-protection-suite", + "ts-jest": "^29.4.5", + "ts-patch": "^3.2.1", + "typedoc": "^0.26.3" + }, + "peerDependencies": { + "@sinclair/typebox": "0.34.13", + "@the-draupnir-project/matrix-basic-types": "1.5.0", + "@vector-im/matrix-bot-sdk": "0.7.1-element.6", + "matrix-protection-suite": "file:../matrix-protection-suite" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.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.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.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 + } + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.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.3.10", + "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.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.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 + } + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.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.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.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 + } + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.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 + } + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "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.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.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 + } + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.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.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.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.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "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.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/minimatch": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/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" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/typedoc": { + "version": "0.26.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz", + "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "packages/matrix-protection-suite-for-matrix-bot-sdk/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "packages/matrix-protection-suite/node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.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.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.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 + } + } + }, + "packages/matrix-protection-suite/node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "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" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.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.3.10", + "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.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.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 + } + } + }, + "packages/matrix-protection-suite/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" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.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" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.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.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "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" + } + }, + "packages/matrix-protection-suite/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "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" + } + }, + "packages/matrix-protection-suite/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "packages/matrix-protection-suite/node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/matrix-protection-suite/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" + } + }, + "packages/matrix-protection-suite/node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.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" + } + }, + "packages/matrix-protection-suite/node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "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" + } + }, + "packages/matrix-protection-suite/node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.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" + } + }, + "packages/matrix-protection-suite/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "packages/matrix-protection-suite/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "packages/matrix-protection-suite/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" + } + }, + "packages/matrix-protection-suite/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" + } + }, + "packages/matrix-protection-suite/node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/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" + } + }, + "packages/matrix-protection-suite/node_modules/jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.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 + } + } + }, + "packages/matrix-protection-suite/node_modules/jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.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" + } + }, + "packages/matrix-protection-suite/node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.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 + } + } + }, + "packages/matrix-protection-suite/node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "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.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.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 + } + } + }, + "packages/matrix-protection-suite/node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.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.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "packages/matrix-protection-suite/node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.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.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.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" + } + }, + "packages/matrix-protection-suite/node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "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.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "packages/matrix-protection-suite/node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.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" + } + }, + "packages/matrix-protection-suite/node_modules/minimatch": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", + "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/matrix-protection-suite/node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "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" + } + }, + "packages/matrix-protection-suite/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" + } + }, + "packages/matrix-protection-suite/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "packages/mps-interface-adaptor": { + "name": "@the-draupnir-project/mps-interface-adaptor", + "version": "0.5.3", + "license": "Apache-2.0", + "devDependencies": { + "@types/node": "^20.17.57", + "matrix-protection-suite": "file:../matrix-protection-suite" + }, + "peerDependencies": { + "@gnuxie/typescript-result": "^1.0.0", + "@sinclair/typebox": "^0.34.13", + "@the-draupnir-project/interface-manager": "^4.2.3", + "matrix-protection-suite": "file:../matrix-protection-suite" + } + }, + "packages/mps-interface-adaptor/node_modules/@types/node": { + "version": "20.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", + "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "packages/mps-interface-adaptor/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "packages/tsconfig": { + "name": "@the-draupnir-project/tsconfig", + "version": "0.1.0", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json index 1e88b476..74834d2c 100644 --- a/package.json +++ b/package.json @@ -1,83 +1,40 @@ { - "name": "draupnir", - "version": "2.9.0", - "description": "A moderation tool for Matrix", - "main": "lib/index.js", - "repository": "https://github.com/the-draupnir-project/Draupnir.git", + "name": "@the-draupnir-project/monorepo", + "version": "0.0.0", + "private": true, + "workspaces": [ + "packages/*", + "apps/*" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/the-draupnir-project/Draupnir.git" + }, "author": "Gnuxie", "license": "AFL-3.0", - "private": true, + "bugs": { + "url": "https://github.com/the-draupnir-project/Draupnir/issues" + }, + "homepage": "https://github.com/the-draupnir-project/Draupnir#readme", "scripts": { - "build": "tsc --project test/tsconfig.json && tsc > /dev/null 2>&1 && corepack yarn copy-assets", - "copy-assets": "cp src/protections/DraupnirNews/news.json lib/protections/DraupnirNews/news.json", - "postbuild": "corepack yarn describe-version", - "describe-version": "(git describe > version.txt.tmp && mv version.txt.tmp version.txt) || true && rm -f version.txt.tmp", - "remove-tests-from-lib": "rm -rf lib/test/ && cp -r lib/src/* lib/ && rm -rf lib/src/", - "lint": "corepack yarn eslint --cache src test && corepack yarn prettier --cache --ignore-unknown --check src test", - "start:dev": "corepack yarn build && node --async-stack-traces lib/index.js", - "test:unit": "mocha --require './test/tsnode.cjs' --forbid-only 'test/unit/**/*.{ts,tsx}'", - "test:unit:single": "mocha --require test/tsnode.cjs", - "test:integration": "NODE_ENV=harness mocha --require test/tsnode.cjs --async-stack-traces --forbid-only --require test/integration/fixtures.ts --timeout 300000 --project ./tsconfig.json \"test/integration/**/*Test.ts\"", - "test:integration:single": "NODE_ENV=harness corepack yarn mocha --require test/tsnode.cjs --require test/integration/fixtures.ts --timeout 300000 --project ./tsconfig.json", - "test:appservice:integration": "NODE_ENV=harness mocha --require test/tsnode.cjs --async-stack-traces --forbid-only --timeout 300000 --project ./tsconfig.json \"test/appservice/integration/**/*Test.ts\"", - "test:appservice:integration:single": "NODE_ENV=harness corepack yarn mocha --require test/tsnode.cjs --timeout 300000 --project ./tsconfig.json", - "test:manual": "NODE_ENV=harness ts-node test/integration/manualLaunchScript.ts" + "build": "tsc -b && npm run -ws build:assets --if-present", + "build:all": "tsc -b tsconfig.all.json && npm run -ws build:assets --if-present", + "build:clean": "tsc -b --clean", + "test": "npm run -ws test --if-present && npm run -w apps/draupnir test:unit", + "lint": "eslint --cache 'packages/**/*{ts, tsx}' 'apps/**/*{ts, tsx}' && prettier --cache --ignore-unknown --check apps packages README.md CHANGELOG.md DEPENDENCIES.md" }, "devDependencies": { - "@eslint/js": "^9.7.0", - "@types/better-sqlite3": "^7.6.9", - "@types/config": "^3.3.1", - "@types/crypto-js": "^4.2.2", - "@types/eslint__js": "^8.42.3", - "@types/express": "^4.17.21", - "@types/html-to-text": "^8.0.1", - "@types/js-yaml": "^4.0.9", - "@types/jsdom": "21.1.7", - "@types/mocha": "^10.0.7", - "@types/nedb": "^1.8.16", - "@types/node": "^20.14.11", - "@types/pg": "^8.6.5", - "@types/request": "^2.48.12", - "crypto-js": "^4.2.0", - "eslint": "^9.7.0", - "expect": "^29.7.0", - "mocha": "^10.7.0", + "@eslint/js": "^9.39.3", + "@types/jest": "^30.0.0", + "eslint": "^9.39.3", + "jest": "^30.3.0", "prettier": "^3.3.3", - "ts-auto-mock": "^3.7.4", - "ts-node": "^10.9.2", - "typescript": "^5.5.3", - "typescript-eslint": "^7.16.1" - }, - "dependencies": { - "@gnuxie/typescript-result": "^1.0.0", - "@sentry/node": "^7.17.2", - "@sinclair/typebox": "0.34.13", - "@the-draupnir-project/interface-manager": "4.2.5", - "@the-draupnir-project/matrix-basic-types": "1.4.1", - "@the-draupnir-project/mps-interface-adaptor": "0.5.3", - "better-sqlite3": "^9.4.3", - "body-parser": "^1.20.2", - "config": "^3.3.9", - "express": "^4.19", - "html-to-text": "^8.0.0", - "js-yaml": "^4.1.0", - "jsdom": "^24.0.0", - "matrix-appservice-bridge": "^10.3.1", - "matrix-bot-sdk": "npm:@vector-im/matrix-bot-sdk@^0.7.1-element.6", - "matrix-protection-suite": "npm:@gnuxie/matrix-protection-suite@6.0.0", - "matrix-protection-suite-for-matrix-bot-sdk": "npm:@gnuxie/matrix-protection-suite-for-matrix-bot-sdk@4.0.2", - "pg": "^8.8.0", - "yaml": "^2.3.2" + "ts-jest": "^29.4.6", + "typescript": "^5.9.3", + "typescript-eslint": "^8.56.1" }, "overrides": { - "matrix-bot-sdk": "$@vector-im/matrix-bot-sdk", - "@vector-im/matrix-bot-sdk": "npm:@vector-im/matrix-bot-sdk@^0.7.1-element.6", - "@the-draupnir-project/matrix-basic-types": "$the-draupnir-project/matrix-basic-types", - "@the-draupnir-project/interface-manager": "$the-draupnir-project/interface-manager", - "matrix-protection-suite": "$matrix-protection-suite" - }, - "engines": { - "node": ">=20.0.0" - }, - "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610" + "@vector-im/matrix-bot-sdk": "0.7.1-element.6", + "postgres": "3.4.7" + } } diff --git a/packages/interface-manager/CHANGELOG.md b/packages/interface-manager/CHANGELOG.md new file mode 100644 index 00000000..c493043d --- /dev/null +++ b/packages/interface-manager/CHANGELOG.md @@ -0,0 +1,219 @@ + + +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [4.2.6] - 2025-11-12 + +### Fixed + +- Fix unsafe keyword argument parsing. + +## [4.2.5] - 2025-08-12 + +### Fixed + +- Updated matrix-basic-types peer dependency for V12 room ID's. + +## [4.2.4] - 2025-08-12 + +### Fixed + +- The `TextCommandReader` can now read V12 room ID's. + +- The mention detection regex has been simplified. + +## [4.2.3] - 2025-05-31 + +### Fixed + +- The prepare step was changed to postinstall by a misunderstanding. + +## [4.2.2] - 2025-05-31 + +### Fixed + +- `@gnuxie/typescript-result` was locally linked in package-lock.json smh. + +## [4.2.1] - 2025-05-31 + +### Fixed + +- Account for differences in yarn's intepretation of the `prepare` script and + modern npm's. + +## [4.2.0] - 2025-05-31 + +### Changed + +- Upgraded from yarn classic to npm. + +### Fixed + +- Updated outdated peer dependency for @the-draupnir-project/matrix-basic-types + +## [4.1.0] - 2025-05-14 + +### Added + +- Quote syntax to quote strings. +- Boolean presentation type and translator to string. + +### Fixed + +- Added a pathway to create negative integers. + +## [4.0.2] - 2025-03-03 + +### Fixed + +- Return an `UnexpectedArgumentError` instead of a `ResultError` when an + unexpected additional argument is provided to a command. + +## [4.0.1] - 2025-02-02 + +### Fixed + +- Fixed a bug in the command dispatcher normaliser that would mean only the + first argument or designator to any command would be included in the + normalised command. + https://github.com/the-draupnir-project/Draupnir/issues/707. + +## [4.0.0] - 2025-01-20 + +### Changed + +- The signature of the `CommandDispatcher` `prefixExtractor` callback has been + changed so that it is possible to transform the entire command body with a + `commandNormaliser`. This was changed primarily to fix + https://github.com/the-draupnir-project/Draupnir/issues/678. + +### Added + +- `makeCommandNormaliser` has been added that covers all the typical corner + cases for making a bot respond to mentions. + +## [3.0.0] - 2024-12-09 + +### Added + +- Numbers will now be parsed by the `TextCommandReader` as a new number + presentaiton type. + +- `PresentationTypeTranslators` now exist so that you can allow presentation + types to be translated between each other. + +- Several standard presentation type translators have been created that target + the `StringPresentationType`. This is because the command reader parses types + such as matrix user id's into specialized ones, and this can mess with + commands that are accepting a string. For example, a reason for a ban. + +## [2.6.0] - 2024-10-11 + +### Added + +- Added special handing of the `--no-confirm` keyword to the matrix interface + adaptor. This allows you to specify confirmation prompts for commands. + +## [2.5.0] - 2024-10-07 + +### Added + +- `

` through `

` are now supported in DeadDocument. + +- `
` is now supported in DeadDocument. + +## [2.4.1] - 2024-09-27 + +### Changed + +- Improved inference on `MatrixInterfaceAdaptor['describeRenderer']`. + +## [2.4.0] - 2024-09-20 + +### Changed + +- Verify that commands have renderers inside command dispatcher. + +## [2.3.0] - 2024-09-11 + +### Changed + +- Upgraded to `@the-draupnir-project/matrix-basic-types@0.2.0`. +- Upgraded to `@gnuxie/typescript-result@1.0.0`. + +## [2.2.0] - 2024-09-10 + +### Changed + +- `RestParameterDescription` can now only prompt one presentation for rest. + +## [2.1.0] - 2024-09-10 + +### Added + +- `CommandExecutorHelper` now has a `parseAndInvoke` method to aid unit testing + commands. + +### Changed + +- When an argument is missing, command parsers will always get a + `PromptRequiredError` if a prompt is available on the associated parameter + description. + +## [2.0.0] - 2024-09-09 + +### Changed + +- `MatrixInterfaceAdaptor` callbacks have been simplified and moved into a + common interface. + +## [1.1.1] - 2024-09-09 + +### Fixed + +- `CommandExecutorHelper` type inference. +- `CommandExecutorHelper` keyword properties are now partial instead of + required. + +## [1.1.0] - 2024-09-09 + +### Added + +- `CommandExecutorHelper` to help unit test command executors. + +## [1.0.2] - 2024-09-06 + +### Fixed + +- A bug where command designators were not interned into command entries. + +## [1.0.1] - 2024-09-06 + +### Fixed + +- `CompleteCommand.toPartialCommand()` method was missing after parsing commands + with the standard command parser. + +## [1.0.0] - 2024-09-06 + +### Changed + +- Everything. +- Better inference from parameter descriptions, no need to specify types in the + executor. +- Tests moved from Draupnir, some bugs squashed. +- Too much work done. + +## [0.1.0] - 2024-08-22 + +- Initial release. diff --git a/packages/interface-manager/README.md b/packages/interface-manager/README.md new file mode 100644 index 00000000..10c03b48 --- /dev/null +++ b/packages/interface-manager/README.md @@ -0,0 +1,97 @@ + + +# @the-draupnir-project/interface-manager + +This library provides a command-oriented presentation interface for Matrix bots. +This is the library used by +[Draupnir](https://github.com/the-draupnir-project/Draupnir) to provide command +parsing, rendering and interaction prompts. + +This library also includes a `JSXFactory` that can transform JSX templates into +`org.matrix.custom.html` and plain text fallback, so that it is possible to send +Matrix events from one source. + +```typescript +const KickCommand = describeCommand({ + summary: "A command to test keyword arguments", + parameters: tuple({ + name: "user", + acceptor: MatrixUserIDPresentationType, + }), + keywords: { + keywordDescriptions: { + glob: { + isFlag: true, + description: + "Allows globs to be used to kick several users from rooms.", + }, + }, + }, + async executor( + draupnir: Draupnir, + _info, + keywords + ): Promise> { + return await draupnir.kickUsers( + user, + keywords.getKeywordValue("glob", false) + ); + }, +}); + +DraupnirInterfaceAdaptor.describeRenderer( + KickCommand, + { + JSXRenderer(result) { + if (isError(result)) { + return Ok(undefined); + } + return Ok( + +
+ Removed {result.ok.length} users from protected rooms. + {renderKickedUsers(result.ok)} +
+
+ ); + } + } +); +``` + +## Getting started + +At some point in the near future we will create a simple bot that will act as a +template repository that can be copied and edited. + +In the meantime Draupnir's glue/setup code for the library can be found +[here](https://github.com/the-draupnir-project/Draupnir/blob/main/src/commands/interface-manager/MPSMatrixInterfaceAdaptor.ts) +and this code is licensed under Apache-2.0. + +## Contributing & Opening Issues + +Draupnir wants to be yours as much as it is ours. Please see or +[contributing document](https://the-draupnir-project.github.io/draupnir-documentation/contributing), +but do not worry too much about following the guidance to the letter. And keep +that in mind throughout. + +## Supported by + +### NLnet foundation + +

+ + +

+ +Draupnir is supported by the NLnet foundation and +[NGI Zero](https://nlnet.nl/NGI0/) under the +[NGI Zero Core](https://nlnet.nl/core/) programme. + +You can find details of the work that is being supported from NLnet +[here](https://nlnet.nl/project/Draupnir/) and the goals +[here](https://marewolf.me/posts/draupnir/24-nlnet-goals.html). diff --git a/packages/interface-manager/REUSE.toml b/packages/interface-manager/REUSE.toml new file mode 100644 index 00000000..41153469 --- /dev/null +++ b/packages/interface-manager/REUSE.toml @@ -0,0 +1,34 @@ +version = 1 +SPDX-PackageName = "interface-manager" +SPDX-PackageSupplier = "Gnuxie " +SPDX-PackageDownloadLocation = "https://github.com/the-draupnir-project/interface-manager" + +[[annotations]] +path = "REUSE.toml" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "tsconfig.test.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "package-lock.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "0BSD" + +[[annotations]] +path = "package.json" +precedence = "aggregate" +SPDX-FileCopyrightText = "Gnuxie " +SPDX-License-Identifier = "Apache-2.0" diff --git a/packages/interface-manager/jest.config.cjs b/packages/interface-manager/jest.config.cjs new file mode 100644 index 00000000..ba73b8ce --- /dev/null +++ b/packages/interface-manager/jest.config.cjs @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: CC0-1.0 + +module.exports = { + preset: "ts-jest", + testEnvironment: "node", + roots: ["/src"], +}; diff --git a/packages/interface-manager/package.json b/packages/interface-manager/package.json new file mode 100644 index 00000000..2095b56b --- /dev/null +++ b/packages/interface-manager/package.json @@ -0,0 +1,31 @@ +{ + "name": "@the-draupnir-project/interface-manager", + "version": "4.2.6", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "author": { + "name": "Gnuxie", + "email": "Gnuxie@protonmail.com" + }, + "license": "Apache-2.0", + "repository": { + "url": "https://github.com/the-draupnir-project/interface-manager.git", + "type": "git" + }, + "private": false, + "scripts": { + "build": "tsc --project tsconfig.json", + "lint": "eslint src && prettier --check src", + "test": "jest" + }, + "dependencies": { + "@gnuxie/super-cool-stream": "^0.2.1", + "@gnuxie/typescript-result": "^1.1.1" + }, + "peerDependencies": { + "@the-draupnir-project/matrix-basic-types": "^1.4.0" + } +} diff --git a/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts b/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts new file mode 100644 index 00000000..e5836fcc --- /dev/null +++ b/packages/interface-manager/src/Adaptor/AdaptorContextToCommandContextTranslator.ts @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { CommandDescription } from "../Command"; +import { CommandMeta } from "../Command/CommandMeta"; + +/** + * This is used to add glue code to take what is essentially a god context into a more specific + * attenuated one that can be unit tested easily. + * So basically, rather than giving a command the entirity of Draupnir, we can + * give it juts the capability to ban a user. Which simplifies test setup. + */ +export type AdaptorContextToCommandContextTranslationFunction< + AdaptorContext, + CommandContext, +> = (adaptorContext: AdaptorContext) => CommandContext; + +export interface AdaptorContextToCommandContextTranslator { + translateContext( + commandDescription: CommandDescription, + adaptorContext: AdaptorContext + ): TCommandMeta["Context"]; + registerTranslation( + commandDescription: CommandDescription, + translationFunction: AdaptorContextToCommandContextTranslationFunction< + AdaptorContext, + TCommandMeta["Context"] + > + ): AdaptorContextToCommandContextTranslator; +} + +export class StandardAdaptorContextToCommandContextTranslator< + AdaptorContext, +> implements AdaptorContextToCommandContextTranslator { + private readonly translators = new Map< + CommandDescription, + AdaptorContextToCommandContextTranslationFunction + >(); + translateContext( + commandDescription: CommandDescription, + adaptorContext: AdaptorContext + ): TCommandMeta["Context"] { + const entry = this.translators.get( + // i really don't care. + commandDescription as unknown as CommandDescription + ); + if (entry === undefined) { + return adaptorContext as unknown as TCommandMeta["Context"]; + } else { + return entry(adaptorContext) as TCommandMeta["Context"]; + } + } + registerTranslation( + commandDescription: CommandDescription, + translationFunction: AdaptorContextToCommandContextTranslationFunction< + AdaptorContext, + TCommandMeta["Context"] + > + ): AdaptorContextToCommandContextTranslator { + if ( + this.translators.has(commandDescription as unknown as CommandDescription) + ) { + throw new TypeError( + `There is already a translation function registered for the command ${commandDescription.summary}` + ); + } + this.translators.set( + commandDescription as unknown as CommandDescription, + translationFunction + ); + return this; + } +} diff --git a/packages/interface-manager/src/Adaptor/CommandDispatcher.test.ts b/packages/interface-manager/src/Adaptor/CommandDispatcher.test.ts new file mode 100644 index 00000000..7ae05e68 --- /dev/null +++ b/packages/interface-manager/src/Adaptor/CommandDispatcher.test.ts @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2025 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 + +import { StringUserID } from "@the-draupnir-project/matrix-basic-types"; +import { makeCommandNormaliser } from "./CommandDispatcher"; + +test("basic command dispatcher", function () { + const normaliser = makeCommandNormaliser( + "@draupnir:example.com" as StringUserID, + { + normalisedPrefix: "draupnir", + symbolPrefixes: ["!"], + getDisplayName() { + return "My Draupnir bot that is fluffy"; + }, + isAllowedOnlySymbolPrefixes: false, + additionalPrefixes: ["mjolnir"], + } + ); + expect(normaliser("!draupnir ban")).toBe("draupnir ban"); + expect(normaliser("draupnir ban")).toBe(undefined); + expect(normaliser("My Draupnir bot that is fluffy ban")).toBe("draupnir ban"); + expect(normaliser("My Draupnir bot that is fluffy: ban")).toBe( + "draupnir ban" + ); + expect( + normaliser( + "[@draupnir:example.com](https://matrix.to/#/@draupnir:example.com) ban" + ) + ).toBe("draupnir ban"); + expect( + normaliser( + "[@draupnir:example.com](https://matrix.to/#/@draupnir:example.com): ban" + ) + ).toBe("draupnir ban"); + expect(normaliser("!mjolnir ban")).toBe("draupnir ban"); +}); + +test("command normaliser that allows symbol prefixes", function () { + const normaliser = makeCommandNormaliser( + "@draupnir:example.com" as StringUserID, + { + normalisedPrefix: "draupnir", + symbolPrefixes: ["."], + getDisplayName() { + return "Draupnir"; + }, + isAllowedOnlySymbolPrefixes: true, + additionalPrefixes: ["mjolnir"], + } + ); + expect(normaliser(".draupnir ban")).toBe("draupnir ban"); + expect(normaliser(".ban @foo:localhost:9999 coc spam")).toBe( + "draupnir ban @foo:localhost:9999 coc spam" + ); + expect(normaliser(".mjolnir ban @foo:localhost:9999 coc spam")).toBe( + "draupnir ban @foo:localhost:9999 coc spam" + ); + expect(normaliser("Draupnir: ban")).toBe("draupnir ban"); + expect(normaliser(".list create coc coc")).toBe( + "draupnir list create coc coc" + ); +}); diff --git a/packages/interface-manager/src/Adaptor/CommandDispatcher.ts b/packages/interface-manager/src/Adaptor/CommandDispatcher.ts new file mode 100644 index 00000000..6aa8f7e8 --- /dev/null +++ b/packages/interface-manager/src/Adaptor/CommandDispatcher.ts @@ -0,0 +1,195 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { isError, Result } from "@gnuxie/typescript-result"; +import { + PartialCommand, + Presentation, + PresentationArgumentStream, +} from "../Command"; +import { CommandInvokerCallbacks } from "./CommandInvokerCallbacks"; +import { + Permalinks, + StringUserID, + userLocalpart, +} from "@the-draupnir-project/matrix-basic-types"; +import { StringStream } from "@gnuxie/super-cool-stream"; + +export type CommandNormaliser = (body: string) => string | undefined; +export type LogCurentCommandCB = ( + CommandInformation: CommandInformation, + commandParts: Presentation[] +) => void; + +export interface CommandDispatcherCallbacks< + CommandInformation, +> extends CommandInvokerCallbacks { + readonly logCurrentCommandCB?: + | LogCurentCommandCB + | undefined; + /** + * A function to normalize a command before dispatch. + * So for example, removing mention pill formatting or + * special configuration for bot prefixes etc. + */ + readonly commandNormaliser: CommandNormaliser; +} + +export interface CommandDispatcher { + parsePartialCommandFromBody( + commandInformation: CommandInformation, + body: string + ): Result; + parsePartialCommandFromStream( + commandInformation: CommandInformation, + stream: PresentationArgumentStream + ): Result; +} + +function readUntil(regex: RegExp, stream: StringStream): string | undefined { + let output = ""; + while (stream.peekChar() !== undefined && !regex.test(stream.peekChar())) { + output += stream.readChar(); + } + return output.length === 0 ? undefined : output; +} + +type StandardPrefixExtractorOptions = { + symbolPrefixes: string[]; + isAllowedOnlySymbolPrefixes: boolean; + additionalPrefixes: string[]; + getDisplayName: () => string; + // Set it to '' if you don't want it. + normalisedPrefix: string; +}; + +function maybeReadPrefixes( + body: string, + plainPrefixes: string[], + { + symbolPrefixes, + isAllowedOnlySymbolPrefixes, + normalisedPrefix, + }: StandardPrefixExtractorOptions +): string | undefined { + const stream = new StringStream(body); + readUntil(/\S/, stream); + const firstWord = readUntil(/\s/, stream); + if (firstWord === undefined || typeof firstWord !== "string") { + return undefined; + } + const usedSymbolPrefix = symbolPrefixes.find((p) => + firstWord.toLowerCase().startsWith(p) + ); + const additionalPrefixTarget = usedSymbolPrefix + ? firstWord.slice(usedSymbolPrefix.length) + : firstWord; + const usedAdditionalPrefix = plainPrefixes.find( + (p) => additionalPrefixTarget.toLowerCase() === p + ); + if (usedAdditionalPrefix && usedSymbolPrefix) { + return ( + normalisedPrefix + (stream.source as string).slice(stream.getPosition()) + ); + } + if (usedSymbolPrefix && isAllowedOnlySymbolPrefixes) { + return ( + normalisedPrefix + + " " + + additionalPrefixTarget + + (stream.source as string).slice(stream.getPosition()) + ); + } + return undefined; +} + +function maybeExtractDisplayNameMention( + body: string, + displayNameWords: string[], + options: StandardPrefixExtractorOptions +): string | undefined { + const stream = new StringStream(body); + for (const name of displayNameWords) { + readUntil(/\S/, stream); + const word = readUntil(/\s/, stream); + if (word === undefined) { + return undefined; + } + // check for : on the end of pills. + if (word.endsWith(":")) { + if (word.slice(0, word.length - 1) !== name) { + return undefined; + } + } else if (word !== name) { + return undefined; + } + } + readUntil(/\S/, stream); + if (stream.peekChar() === ":") { + stream.readChar(); + } + return ( + options.normalisedPrefix + + " " + + (stream.source as string).slice(stream.getPosition()) + ); +} + +function maybeExtractMarkdownMention( + body: string, + clientUserID: StringUserID, + normalisedPrefix: string +): string | undefined { + const result = /^\[[^\]]+\]\(([^)]+)\)\s*:?/.exec(body); + if (result === null || result[1] === undefined) { + return undefined; + } + const urlResult = Permalinks.parseUrl(result[1]); + if (isError(urlResult)) { + return undefined; + } + if (urlResult.ok.userID !== clientUserID) { + return undefined; + } + return normalisedPrefix + " " + body.slice(result[0].length).trimStart(); +} + +export function makeCommandNormaliser( + clientUserID: StringUserID, + options: StandardPrefixExtractorOptions +): CommandNormaliser { + const { additionalPrefixes, getDisplayName, normalisedPrefix } = options; + const plainPrefixes = [ + userLocalpart(clientUserID), + clientUserID, + ...additionalPrefixes, + ]; + // Remember to check for shit like : + // These are the ways that a prefix can be used: + // 1. By a displayname or a mention pill + // 2. By an additional prefix like the draupnir in !draupnir + // 3. By use of just a symbol prefix like ! and nothing else. + return (body) => { + const prefixResult = maybeReadPrefixes(body, plainPrefixes, options); + if (prefixResult !== undefined) { + return prefixResult; + } + // now we just need to match against displaynames and other pills + const displayNameWords = getDisplayName().split(/\s+/).filter(Boolean); + const displayNameResult = maybeExtractDisplayNameMention( + body, + displayNameWords, + options + ); + if (displayNameResult !== undefined) { + return displayNameResult; + } + return maybeExtractMarkdownMention(body, clientUserID, normalisedPrefix); + }; +} diff --git a/packages/interface-manager/src/Adaptor/CommandInvoker.ts b/packages/interface-manager/src/Adaptor/CommandInvoker.ts new file mode 100644 index 00000000..e3bf70ac --- /dev/null +++ b/packages/interface-manager/src/Adaptor/CommandInvoker.ts @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Result } from "@gnuxie/typescript-result"; +import { CommandMeta, CompleteCommand, PartialCommand } from "../Command"; + +export interface CommandInvoker { + /** + * Invoke the command object, running the command executor. + */ + invoke( + commandContext: TCommandMeta["Context"], + commandInformation: CommandInformation, + command: CompleteCommand + ): Promise>; + parseCommand( + commandInformation: CommandInformation, + partialCommand: PartialCommand + ): Result; +} diff --git a/packages/interface-manager/src/Adaptor/CommandInvokerCallbacks.ts b/packages/interface-manager/src/Adaptor/CommandInvokerCallbacks.ts new file mode 100644 index 00000000..3699de82 --- /dev/null +++ b/packages/interface-manager/src/Adaptor/CommandInvokerCallbacks.ts @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { ResultError } from "@gnuxie/typescript-result"; +import { Command } from "../Command"; + +export type CommandFailedCB = ( + commandInfo: CommandInformation, + command: Command, + error: ResultError +) => void; + +export type CommandUncaughtErrorCB = ( + commandInformation: CommandInformation, + commandBody: string, + error: Error +) => void; +export type ConvertUncaughtErrorToResultError = (error: Error) => ResultError; + +export interface CommandInvokerCallbacks { + /** + * A callback to handle commands returning an error result. + * Used for logging usually. + */ + readonly commandFailedCB?: CommandFailedCB | undefined; + /** + * A callback to handle any uncaught JS `Error`s that were thrown + * while handling a command. + */ + readonly commandUncaughtErrorCB?: + | CommandUncaughtErrorCB + | undefined; + readonly convertUncaughtErrorToResultError?: + | ConvertUncaughtErrorToResultError + | undefined; +} diff --git a/packages/interface-manager/src/Adaptor/StandardCommandInvoker.ts b/packages/interface-manager/src/Adaptor/StandardCommandInvoker.ts new file mode 100644 index 00000000..e8109483 --- /dev/null +++ b/packages/interface-manager/src/Adaptor/StandardCommandInvoker.ts @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Err, Result } from "@gnuxie/typescript-result"; +import { CommandMeta, CompleteCommand, PartialCommand } from "../Command"; +import { CommandInvoker } from "./CommandInvoker"; +import { CommandInvokerCallbacks } from "./CommandInvokerCallbacks"; +import { TextPresentationRenderer } from "../TextReader"; + +export class StandardCommandInvoker< + CommandInformation, +> implements CommandInvoker { + private readonly callbacks: CommandInvokerCallbacks; + public constructor(callbacks: CommandInvokerCallbacks) { + this.callbacks = callbacks; + } + parseCommand( + commandInformation: CommandInformation, + partialCommand: PartialCommand + ): Result { + return partialCommand.description.parametersDescription.parse( + partialCommand + ); + } + + public async invoke( + commandContext: TCommandMeta["Context"], + commandInformation: CommandInformation, + command: CompleteCommand + ): Promise> { + try { + return await command.description.executor( + commandContext as never, + commandInformation, + command.keywords, + command.rest ?? [], + ...command.immediateArguments + ); + } catch (error) { + if (error instanceof Error) { + this.callbacks.commandUncaughtErrorCB?.( + commandInformation, + command + .toPartialCommand() + .stream.source.map((p) => TextPresentationRenderer.render(p)) + .join(" "), + error + ); + if (this.callbacks.convertUncaughtErrorToResultError) { + return Err(this.callbacks.convertUncaughtErrorToResultError(error)); + } else { + throw new TypeError( + `Caught an error when executing a command, please use convertUncaughtErrorToResultError to handle this error and extract information from it.` + ); + } + } else { + throw new TypeError( + // I don't know what else we're going to do with it... + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + `Something is throwing things that are not errors ${error})}` + ); + } + } + } +} diff --git a/packages/interface-manager/src/Adaptor/index.ts b/packages/interface-manager/src/Adaptor/index.ts new file mode 100644 index 00000000..2a515d38 --- /dev/null +++ b/packages/interface-manager/src/Adaptor/index.ts @@ -0,0 +1,14 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +export * from "./AdaptorContextToCommandContextTranslator"; +export * from "./CommandDispatcher"; +export * from "./CommandInvoker"; +export * from "./CommandInvokerCallbacks"; +export * from "./StandardCommandInvoker"; diff --git a/packages/interface-manager/src/Command/Command.ts b/packages/interface-manager/src/Command/Command.ts new file mode 100644 index 00000000..064a93e3 --- /dev/null +++ b/packages/interface-manager/src/Command/Command.ts @@ -0,0 +1,67 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { CommandDescription } from "./CommandDescription"; +import { CommandMeta } from "./CommandMeta"; +import { CommandTable } from "./CommandTable"; +import { ParsedKeywords } from "./ParsedKeywords"; +import { PresentationArgumentStream } from "./PresentationStream"; + +type CommandBase = { + readonly description: CommandDescription; + // The normalised designator that was used to invoke the command. + readonly designator: string[]; + readonly commandTable: CommandTable; +}; + +export type Command = + | CompleteCommand + | PartialCommand; + +export type CompleteCommand = + CommandBase & { + readonly isPartial: false; + readonly immediateArguments: TCommandMeta["TImmediateArgumentsObjectTypes"]; + readonly rest?: TCommandMeta["TRestArgumentObjectType"][]; + readonly keywords: ParsedKeywords; + toPartialCommand(): PartialCommand; + }; + +export type PartialCommand = + CommandBase & { + readonly isPartial: true; + readonly stream: PresentationArgumentStream; + }; + +export function isPartialCommand(command: Command): command is PartialCommand { + return command.isPartial; +} + +export function isCompleteCommand< + TCommandMeta extends CommandMeta = CommandMeta, +>(command: Command): command is CompleteCommand { + return !command.isPartial; +} + +export function makePartialCommand< + TCommandMeta extends CommandMeta = CommandMeta, +>( + stream: PresentationArgumentStream, + commandDescription: CommandDescription, + commandTable: CommandTable, + designator: string[] +): PartialCommand { + return { + stream, + isPartial: true, + description: commandDescription, + designator, + commandTable, + }; +} diff --git a/packages/interface-manager/src/Command/CommandDescription.ts b/packages/interface-manager/src/Command/CommandDescription.ts new file mode 100644 index 00000000..7fb0205e --- /dev/null +++ b/packages/interface-manager/src/Command/CommandDescription.ts @@ -0,0 +1,59 @@ +// Copyright 2022 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Result } from "@gnuxie/typescript-result"; +import { ParsedKeywords } from "./ParsedKeywords"; +import { CommandMeta, KeywordsMeta } from "./CommandMeta"; +import { CommandParametersDescription } from "./ParameterParsing"; + +export type CommandExecutorFunction = ( + // The context needs to be specific to each command, and we need to add context glue + // that can attenuate them. + context: unknown extends TCommandMeta["Context"] + ? never + : TCommandMeta["Context"], + invocationInformation: TCommandMeta["InvocationInformation"], + keywords: ParsedKeywords, + rest: TCommandMeta["TRestArgumentObjectType"][], + ...args: TCommandMeta["TImmediateArgumentsObjectTypes"] +) => Promise>; + +export interface CommandDescription< + TCommandMeta extends CommandMeta = CommandMeta, +> { + readonly executor: CommandExecutorFunction; + /** A short one line summary of what the command does to display alongside it's help */ + readonly summary: string; + /** A longer description that goes into detail. */ + readonly description?: string | undefined; + readonly parametersDescription: CommandParametersDescription< + TCommandMeta["TImmediateArgumentsObjectTypes"], + TCommandMeta["TRestArgumentObjectType"], + TCommandMeta["TKeywordsMeta"] + >; +} + +export type ExtractCommandMeta = + TCommandDescription extends CommandDescription + ? TCommandMeta + : never; + +export type AnyCommandDescription = CommandDescription<{ + Context: unknown; + InvocationInformation: unknown; + CommandResult: unknown; + TImmediateArgumentsObjectTypes: unknown[]; + TRestArgumentObjectType: unknown; + TKeywordsMeta: KeywordsMeta; +}>; diff --git a/packages/interface-manager/src/Command/CommandExecutorHelper.ts b/packages/interface-manager/src/Command/CommandExecutorHelper.ts new file mode 100644 index 00000000..bc6fa09c --- /dev/null +++ b/packages/interface-manager/src/Command/CommandExecutorHelper.ts @@ -0,0 +1,158 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Result, isError } from "@gnuxie/typescript-result"; +import { CommandDescription } from "./CommandDescription"; +import { CommandMeta, KeywordsMeta } from "./CommandMeta"; +import { DirectParsedKeywords } from "./ParsedKeywords"; +import { StandardCommandInvoker } from "../Adaptor"; +import { PartialCommand } from "./Command"; +import { StandardPresentationArgumentStream } from "./PresentationStream"; +import { Presentation } from "./Presentation"; +import { KeywordPresentationType } from "../TextReader"; +import { Keyword } from "./Keyword"; +import { CommandTable } from "./CommandTable"; + +export type CommandExecutorHelperOptions< + TInvocationInformation, + TRestArgumentObjectType, + TKeywordsMeta extends KeywordsMeta, +> = { + info?: TInvocationInformation | undefined; + rest?: TRestArgumentObjectType[] | undefined; + keywords?: Partial | undefined; +}; + +type CommandExecutorHelperParseOptions< + TInvocationInformation, + TRestArgumentObjectType, + TKeywordsMeta extends KeywordsMeta, +> = { + info?: TInvocationInformation | undefined; + rest?: Presentation[] | undefined; + keywords?: + | Partial<{ [I in keyof TKeywordsMeta]: Presentation }> + | undefined; +}; + +export const CommandExecutorHelper = Object.freeze({ + async execute< + TCommandContext, + TInvocationInformation, + TCommandResult, + TImmediateArgumentsObjectTypes extends unknown[], + TRestArgumentObjectType, + TKeywordsMeta extends KeywordsMeta, + >( + command: CommandDescription< + CommandMeta< + TCommandContext, + TInvocationInformation, + TCommandResult, + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + > + >, + context: TCommandContext, + options: CommandExecutorHelperOptions< + TInvocationInformation, + TRestArgumentObjectType, + TKeywordsMeta + >, + ...args: TImmediateArgumentsObjectTypes + ): Promise> { + const parsedKeywords = new DirectParsedKeywords( + command.parametersDescription.keywords, + options.keywords ?? {} + ); + return await command.executor( + context as never, + options.info ?? ({} as TInvocationInformation), + parsedKeywords, + options.rest ?? [], + ...args + ); + }, + async parseAndInvoke< + TCommandContext, + TInvocationInformation, + TCommandResult, + TImmediateArgumentsObjectTypes extends unknown[], + TRestArgumentObjectType, + TKeywordsMeta extends KeywordsMeta, + >( + commandTable: CommandTable, + command: CommandDescription< + CommandMeta< + TCommandContext, + TInvocationInformation, + TCommandResult, + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + > + >, + context: TCommandContext, + options: CommandExecutorHelperParseOptions< + TInvocationInformation, + TRestArgumentObjectType, + TKeywordsMeta + >, + ...args: { + [I in keyof TImmediateArgumentsObjectTypes]: + | Presentation + | undefined; + } + ): Promise> { + type TPartialCommand = PartialCommand< + CommandMeta< + TCommandContext, + TInvocationInformation, + TCommandResult, + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + > + >; + const commandInvoker = new StandardCommandInvoker({}); + const flatKeywords: Presentation[] = []; + for (const [key, value] of Object.entries(options.keywords ?? {})) { + flatKeywords.push(KeywordPresentationType.wrap(new Keyword(key))); + flatKeywords.push(value as Presentation); + } + const partialcommand = { + description: command, + designator: ["CommandExecutorHelper"], + isPartial: true, + stream: new StandardPresentationArgumentStream([ + ...args.reduce( + (acc, arg) => (arg ? [...acc, arg] : acc), + [] + ), + ...flatKeywords, + ...(options.rest ?? []), + ]), + commandTable, + } satisfies TPartialCommand; + const parseResult = commandInvoker.parseCommand( + options.info, + partialcommand as never + ); + if (isError(parseResult)) { + return parseResult; + } else { + return (await commandInvoker.invoke( + context, + options.info, + parseResult.ok + )) as Result; + } + }, +}); diff --git a/packages/interface-manager/src/Command/CommandMeta.ts b/packages/interface-manager/src/Command/CommandMeta.ts new file mode 100644 index 00000000..db378b39 --- /dev/null +++ b/packages/interface-manager/src/Command/CommandMeta.ts @@ -0,0 +1,39 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { KeywordPropertyDescription } from "./KeywordParameterDescription"; + +export type KeywordsMeta = { + [keyword: string]: unknown; +}; + +export type KeywordPropertyDescriptionsFromKeywordsMeta< + TKeywordsMeta extends KeywordsMeta, +> = { + [I in keyof TKeywordsMeta]: KeywordPropertyDescription; +}; +export type KeywordPropertyRecordFromKeywordsMeta< + TKeywordsMeta extends KeywordsMeta, +> = { [I in keyof TKeywordsMeta]?: TKeywordsMeta[I] }; + +export type CommandMeta< + Context = unknown, + InvocationInformation = unknown, + CommandResult = unknown, + TImmediateArgumentsObjectTypes extends unknown[] = unknown[], + TRestArgumentObjectType = unknown, + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> = { + readonly Context: Context; + readonly InvocationInformation: InvocationInformation; + readonly CommandResult: CommandResult; + readonly TImmediateArgumentsObjectTypes: TImmediateArgumentsObjectTypes; + readonly TRestArgumentObjectType: TRestArgumentObjectType; + readonly TKeywordsMeta: TKeywordsMeta; +}; diff --git a/packages/interface-manager/src/Command/CommandTable.test.ts b/packages/interface-manager/src/Command/CommandTable.test.ts new file mode 100644 index 00000000..a06d3ee3 --- /dev/null +++ b/packages/interface-manager/src/Command/CommandTable.test.ts @@ -0,0 +1,37 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Ok } from "@gnuxie/typescript-result"; +import { StandardCommandTable } from "./CommandTable"; +import { describeCommand } from "./describeCommand"; + +it("Should be able to import commmands from other tables", function () { + const AdminCommands = new StandardCommandTable("admin commands"); + const DeactivateCommand = describeCommand({ + summary: "Deactivate a user", + parameters: [], + async executor() { + return Ok(true); + }, + }); + const ShutdownRoomCommand = describeCommand({ + summary: "Shutdown a room", + parameters: [], + async executor() { + return Ok(true); + }, + }); + AdminCommands.internCommand(DeactivateCommand, ["deactivate"]).internCommand( + ShutdownRoomCommand, + ["shutdown", "room"] + ); + const DraupnirCommandTable = new StandardCommandTable("Draupnir"); + DraupnirCommandTable.importTable(AdminCommands, []); + expect(DraupnirCommandTable.getAllCommands().length).toBe(2); +}); diff --git a/packages/interface-manager/src/Command/CommandTable.ts b/packages/interface-manager/src/Command/CommandTable.ts new file mode 100644 index 00000000..443b1d24 --- /dev/null +++ b/packages/interface-manager/src/Command/CommandTable.ts @@ -0,0 +1,289 @@ +// Copyright 2022 - 2024 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { StringPresentationType } from "../TextReader"; +import { CommandDescription } from "./CommandDescription"; +import { CommandMeta } from "./CommandMeta"; +import { + Presentation, + PresentationType, + PresentationTypeWithoutWrap, +} from "./Presentation"; +import { + PresentationArgumentStream, + StandardPresentationArgumentStream, +} from "./PresentationStream"; +import { PresentationTypeTranslator } from "./PresentationTypeTranslator"; + +export type BaseCommandTableEntry = + | EmptyCommandTableEntry + | CommandTableEntry + | SubCommandTableEntry; + +export type EmptyCommandTableEntry = { + designator: string[]; + sourceTable: CommandTable; + subCommands?: never; + currentCommand?: never; +}; + +export type CommandTableEntry = { + subCommands?: Map; + currentCommand: CommandDescription; + designator: string[]; + sourceTable: CommandTable; +}; + +export type SubCommandTableEntry = { + subCommands: Map; + currentCommand?: CommandDescription; + designator: string[]; + sourceTable: CommandTable; +}; + +export type CommandTableImport = { + table: CommandTable; + baseDesignator: string[]; +}; + +export interface CommandTable { + readonly name: string | symbol; + /** + * Can be used to render a help command with an index of all the commands. + * @returns All of the commands in this table. + */ + getAllCommands(): CommandTableEntry[]; + + /** + * @returns Only the commands interned in this table, excludes imported commands. + */ + getExportedCommands(): CommandTableEntry[]; + getImportedTables(): CommandTableImport[]; + findAMatchingCommand( + stream: PresentationArgumentStream + ): CommandDescription | undefined; + internCommand( + command: CommandDescription, + designator: string[] + ): CommandTable; + /** + * Import the commands from a different table into this one. + * @param baseDesignator A designator to use as a base for all of the table's + * commands before importing them. So for example, commands for the join wave + * short-circuit protection might add a base designator of ["join" "wave"]. + * So the complete designator for a status command that the join wave short-circuit + * protection defined would be ["join", "wave", "status"] in this table. + */ + importTable(table: CommandTable, baseDesignator: string[]): void; + isContainingCommand(command: CommandDescription): boolean; + internPresentationTypeTranslator( + translator: PresentationTypeTranslator + ): CommandTable; + findPresentationTypeTranslator( + toType: PresentationTypeWithoutWrap, + fromType: PresentationTypeWithoutWrap + ): PresentationTypeTranslator | undefined; +} + +export class StandardCommandTable implements CommandTable { + private readonly exportedCommands = new Set(); + private readonly flattenedCommands = new Map< + CommandDescription, + CommandTableEntry + >(); + private readonly commands: BaseCommandTableEntry = { + designator: [], + sourceTable: this, + }; + private readonly translators = new Map(); + /** Imported tables are tables that "add commands" to this table. They are not sub commands. */ + private readonly importedTables = new Map(); + + constructor(public readonly name: string | symbol) {} + + /** + * Can be used to render a help command with an index of all the commands. + * @returns All of the commands in this table. + */ + public getAllCommands(): CommandTableEntry[] { + return [...this.flattenedCommands.values()]; + } + + /** + * @returns Only the commands interned in this table, excludes imported commands. + */ + public getExportedCommands(): CommandTableEntry[] { + return [...this.exportedCommands.values()]; + } + + public getImportedTables(): CommandTableImport[] { + return [...this.importedTables.values()]; + } + + private findAMatchingCommandEntry( + stream: PresentationArgumentStream + ): BaseCommandTableEntry | undefined { + const tableHelper = ( + startingTableEntry: BaseCommandTableEntry, + argumentStream: PresentationArgumentStream + ): undefined | BaseCommandTableEntry => { + const nextArgument = argumentStream.peekItem(); + if ( + nextArgument === undefined || + typeof nextArgument.object !== "string" + ) { + // Then they might be using something like "!mjolnir status" + return startingTableEntry; + } + const entry = startingTableEntry.subCommands?.get(nextArgument.object); + if (!entry) { + // The reason there's no match is because this is the command arguments, rather than subcommand notation. + return startingTableEntry; + } else { + stream.readItem(); // dispose of the argument. + return tableHelper(entry, argumentStream); + } + }; + return tableHelper(this.commands, stream); + } + + public findAMatchingCommand( + stream: PresentationArgumentStream + ): CommandDescription | undefined { + const commandTableEntry = stream.savingPositionIf({ + body: (s) => + this.findAMatchingCommandEntry(s as PresentationArgumentStream), + predicate: (command) => command === undefined, + }); + if (commandTableEntry) { + return commandTableEntry.currentCommand; + } + return undefined; + } + + private internCommandHelper( + command: CommandDescription, + originalTable: CommandTable, + currentTableEntry: BaseCommandTableEntry, + originalDesignator: string[], + currentDesignator: string[] + ): void { + const currentDesignatorPart = currentDesignator.shift(); + if (currentDesignatorPart === undefined) { + if (currentTableEntry.currentCommand) { + throw new TypeError( + `There is already a command for ${JSON.stringify(originalDesignator)}` + ); + } + currentTableEntry.currentCommand = command; + if (originalTable === this) { + this.exportedCommands.add(currentTableEntry as CommandTableEntry); + } + this.flattenedCommands.set( + command, + currentTableEntry as CommandTableEntry + ); + } else { + if (currentTableEntry.subCommands === undefined) { + currentTableEntry.subCommands = new Map(); + } + const nextLookupEntry = + currentTableEntry.subCommands.get(currentDesignatorPart) ?? + ((lookup: BaseCommandTableEntry) => ( + currentTableEntry.subCommands.set(currentDesignatorPart, lookup), + lookup + ))({ designator: originalDesignator, sourceTable: this }); + this.internCommandHelper( + command, + originalTable, + nextLookupEntry, + originalDesignator, + currentDesignator + ); + } + } + + public internCommand( + command: CommandDescription, + designator: string[] + ): this { + this.internCommandHelper( + command, + this, + this.commands, + designator, + [...designator] // this array gets mutated. + ); + return this; + } + + public importTable( + importedTable: CommandTable, + baseDesignator: string[] + ): void { + for (const commandTableEntry of importedTable.getAllCommands()) { + if ( + this.findAMatchingCommand( + new StandardPresentationArgumentStream( + commandTableEntry.designator.map((d) => + StringPresentationType.wrap(d) + ) as Presentation[] + ) + ) + ) { + throw new TypeError( + `Command ${JSON.stringify(commandTableEntry.designator)} is in conflict with this table and cannot be imported.` + ); + } + } + this.importedTables.set(importedTable, { + table: importedTable, + baseDesignator, + }); + for (const command of importedTable.getAllCommands()) { + const designator = [...baseDesignator, ...command.designator]; + this.internCommandHelper( + command.currentCommand, + importedTable, + this.commands, + designator, + [...designator] // this array gets mutated. + ); + } + } + public isContainingCommand(command: CommandDescription): boolean { + return this.flattenedCommands.has(command); + } + private keyFromTranslator(translator: PresentationTypeTranslator): string { + return translator.toType.name + "From" + translator.fromType.name; // cheap but no one will ever find out. + } + public internPresentationTypeTranslator( + translator: PresentationTypeTranslator + ): CommandTable { + const key = this.keyFromTranslator(translator); + if (this.translators.has(key)) { + throw new TypeError( + `There is already a translator from ${translator.toType.name} to ${translator.fromType.name}` + ); + } + this.translators.set(key, translator); + return this; + } + public findPresentationTypeTranslator( + toType: PresentationType, + fromType: PresentationType + ): PresentationTypeTranslator | undefined { + return this.translators.get(toType.name + "From" + fromType.name); + } +} diff --git a/packages/interface-manager/src/Command/Keyword.ts b/packages/interface-manager/src/Command/Keyword.ts new file mode 100644 index 00000000..d073d724 --- /dev/null +++ b/packages/interface-manager/src/Command/Keyword.ts @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2022 - 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +/** + * Used for keyword arguments (also known as "options", but this isn't specific enough as it could mean an optional argument). + * For example `--force`. + */ +export class Keyword { + /** + * Creates a Keyword + * @param designator The designator exluding hyphens. + */ + constructor(public readonly designator: string) { + // nothing to do. + } +} diff --git a/packages/interface-manager/src/Command/KeywordParameterDescription.ts b/packages/interface-manager/src/Command/KeywordParameterDescription.ts new file mode 100644 index 00000000..e2f2b88e --- /dev/null +++ b/packages/interface-manager/src/Command/KeywordParameterDescription.ts @@ -0,0 +1,252 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Result, Ok, isError, getOwn } from "@gnuxie/typescript-result"; +import { TextPresentationRenderer } from "../TextReader/TextPresentationRenderer"; +import { Keyword } from "./Keyword"; +import { ParameterDescription } from "./ParameterDescription"; +import { ArgumentParseError, UnexpectedArgumentError } from "./ParseErrors"; +import { ParsedKeywords, StandardParsedKeywords } from "./ParsedKeywords"; +import { Presentation, PresentationTypeWithoutWrap } from "./Presentation"; +import { RestDescription } from "./RestParameterDescription"; +import { PartialCommand } from "./Command"; +import { + PresentationSchema, + PresentationSchemaType, + SinglePresentationSchema, + TopPresentationSchema, + acceptPresentation, + printPresentationSchema, +} from "./PresentationSchema"; +import { + KeywordPropertyDescriptionsFromKeywordsMeta, + KeywordsMeta, +} from "./CommandMeta"; + +/** + * An extension of ParameterDescription, some keyword arguments + * may just be flags that have no associated property in syntax, + * and their presence is to associate the value `true`. + */ +export interface KeywordPropertyDescription< + ObjectType = unknown, +> extends ParameterDescription { + readonly isFlag: boolean; +} + +export interface DescribeKeywordProperty { + readonly acceptor?: + | PresentationSchema + | PresentationTypeWithoutWrap; + readonly isFlag?: boolean; + readonly description?: string; +} + +/** + * Describes which keyword arguments can be accepted by a command. + */ +export interface KeywordParametersDescription< + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> { + readonly keywordDescriptions: KeywordPropertyDescriptionsFromKeywordsMeta; + readonly allowOtherKeys?: boolean; + getParser(): KeywordParser; +} + +/** + * A helper that gets instantiated for each command invoccation to parse and build + * the map representing the association between keywords and their properties. + */ +export class KeywordParser { + private readonly arguments = new Map< + keyof KeywordsMeta, + Presentation | true + >(); + + constructor( + public readonly description: KeywordParametersDescription + ) {} + + public getKeywords(): ParsedKeywords { + return new StandardParsedKeywords( + this.description, + this.arguments + ); + } + + private readKeywordAssociatedProperty< + TKeywordPropertyDescription extends + KeywordParametersDescription["keywordDescriptions"][string], + >( + keyword: TKeywordPropertyDescription, + partialCommand: PartialCommand + ): Result { + const stream = partialCommand.stream; + const nextItem = stream.peekItem(); + if (nextItem !== undefined && !(nextItem.object instanceof Keyword)) { + const acceptedPresentation = acceptPresentation( + keyword.acceptor, + partialCommand.commandTable, + nextItem + ); + if (acceptedPresentation !== undefined) { + stream.readItem(); // consume the presentation from the stream. + return Ok(acceptedPresentation); + } else { + return ArgumentParseError.Result( + `Was expecting a match for the presentation type: ${printPresentationSchema(keyword.acceptor)} but got ${TextPresentationRenderer.render(nextItem)}.`, + { + parameter: keyword, + partialCommand, + } + ); + } + } else { + if (!keyword.isFlag) { + return ArgumentParseError.Result( + `An associated argument was not provided for the keyword ${keyword.name}.`, + { parameter: keyword, partialCommand } + ); + } else { + return Ok(true); + } + } + } + + public parseKeywords(partialCommand: PartialCommand): Result { + const stream = partialCommand.stream; + while (stream.peekItem()?.object instanceof Keyword) { + const item = stream.readItem() as Presentation; + const description = getOwn( + this.description.keywordDescriptions, + item.object.designator + ); + if (description === undefined) { + if (this.description.allowOtherKeys) { + throw new TypeError("Allow other keys is umimplemented"); + // i don't think this can be implemented, + // how do you tell an extra key is a flag or has an associated + // property? + } else { + return UnexpectedArgumentError.Result( + `Encountered unexpected keyword argument: ${item.object.designator}`, + { partialCommand } + ); + } + } else { + const associatedPropertyResult = this.readKeywordAssociatedProperty( + // idk why typescript is bottoming out here but whatever. + description as unknown as KeywordParametersDescription["keywordDescriptions"][string], + partialCommand + ); + if (isError(associatedPropertyResult)) { + return associatedPropertyResult; + } else { + this.arguments.set(description.name, associatedPropertyResult.ok); + } + } + } + return Ok(this); + } + + public parseRest( + partialCommand: PartialCommand, + restDescription?: RestDescription + ): Result { + const stream = partialCommand.stream; + if (restDescription !== undefined) { + return restDescription.parseRest( + partialCommand, + this as unknown as KeywordParser + ); + } else { + const result = this.parseKeywords(partialCommand); + if (isError(result)) { + return result; + } + if (stream.peekItem() !== undefined) { + const textRendering = (() => { + try { + return TextPresentationRenderer.render(stream.peekItem()); + } catch (_e) { + return `${JSON.stringify(stream.peekItem()?.object)} (fallback representation)`; + } + })(); + return UnexpectedArgumentError.Result( + `There is an unexpected non-keyword argument: ${textRendering}`, + { partialCommand } + ); + } else { + return Ok(undefined); + } + } + } +} + +export type DescribeKeywordParametersOptions< + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> = { + readonly keywordDescriptions: { + [I in keyof TKeywordsMeta]: DescribeKeywordProperty; + }; + readonly allowOtherKeys?: boolean; +}; + +function describeKeywordProperty( + name: string, + property: DescribeKeywordProperty +): KeywordPropertyDescription { + if (property.acceptor === undefined) { + if (!property.isFlag) { + throw new TypeError( + "An acceptor is required if the property is not a flag." + ); + } + } + const acceptor = ((acceptor) => { + if (acceptor === undefined) { + return TopPresentationSchema; + } else if ("schemaType" in acceptor) { + return acceptor; + } else { + return { + schemaType: PresentationSchemaType.Single, + presentationType: acceptor, + } as SinglePresentationSchema; + } + })(property.acceptor); + return { + name, + isFlag: property.isFlag ?? false, + acceptor, + description: property.description, + }; +} + +export function describeKeywordParameters< + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +>( + options: DescribeKeywordParametersOptions +): KeywordParametersDescription { + const keywordDescriptions: Record = {}; + for (const [name, property] of Object.entries(options.keywordDescriptions)) { + keywordDescriptions[name] = describeKeywordProperty( + name, + property as DescribeKeywordProperty + ); + } + return { + keywordDescriptions: + keywordDescriptions as KeywordPropertyDescriptionsFromKeywordsMeta, + allowOtherKeys: options.allowOtherKeys ?? false, + getParser() { + return new KeywordParser(this); + }, + }; +} diff --git a/packages/interface-manager/src/Command/ParameterDescription.ts b/packages/interface-manager/src/Command/ParameterDescription.ts new file mode 100644 index 00000000..5d7be5ca --- /dev/null +++ b/packages/interface-manager/src/Command/ParameterDescription.ts @@ -0,0 +1,34 @@ +// Copyright 2022 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Result } from "@gnuxie/typescript-result"; +import { PresentationSchema } from "./PresentationSchema"; +import { PromptOptions } from "./PromptForAccept"; + +export type Prompt = ( + context: Context +) => Promise>>; + +export interface ParameterDescription { + name: string; + description?: string | undefined; + acceptor: PresentationSchema; + /** + * Prompt the interface for an argument that was not provided. + * @param this Expected to be the executor context that is used to provided to the command executor. + * @param description The parameter description being accepted. + * @returns PromptOptions, to be handled by the interface adaptor. + */ + prompt?: Prompt | undefined; +} diff --git a/packages/interface-manager/src/Command/ParameterParsing.ts b/packages/interface-manager/src/Command/ParameterParsing.ts new file mode 100644 index 00000000..b32843d2 --- /dev/null +++ b/packages/interface-manager/src/Command/ParameterParsing.ts @@ -0,0 +1,250 @@ +// Copyright 2022, 2024 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Ok, Result, isError } from "@gnuxie/typescript-result"; +import { ParameterDescription } from "./ParameterDescription"; +import { + DescribeRestParameters, + RestDescription, + describeRestParameters, +} from "./RestParameterDescription"; +import { + DescribeKeywordParametersOptions, + KeywordParametersDescription, + describeKeywordParameters, +} from "./KeywordParameterDescription"; +import { CompleteCommand, PartialCommand } from "./Command"; +import { ArgumentParseError, PromptRequiredError } from "./ParseErrors"; +import { TextPresentationRenderer } from "../TextReader/TextPresentationRenderer"; +import { Presentation, PresentationTypeWithoutWrap } from "./Presentation"; +import { + PresentationSchema, + PresentationSchemaType, + acceptPresentation, + printPresentationSchema, +} from "./PresentationSchema"; +import { ObjectTypeFromAcceptor } from "./PresentationSchema"; +import { KeywordsMeta } from "./CommandMeta"; + +export type ParameterParseFunction = ( + partialCommand: PartialCommand +) => Result; + +export interface CommandParametersDescription< + TImmediateArgumentsObjectTypes extends unknown[] = unknown[], + TRestArgumentObjectType = unknown, + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> { + readonly parse: ParameterParseFunction; + readonly descriptions: { + [I in keyof TImmediateArgumentsObjectTypes]: ParameterDescription< + TImmediateArgumentsObjectTypes[I] + >; + }; + readonly rest?: RestDescription | undefined; + readonly keywords: KeywordParametersDescription; +} + +export class StandardCommandParametersDescription< + TImmediateArgumentsObjectTypes extends unknown[] = unknown[], + TRestArgumentObjectType = unknown, + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> implements CommandParametersDescription< + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta +> { + constructor( + public readonly descriptions: { + [I in keyof TImmediateArgumentsObjectTypes]: ParameterDescription< + TImmediateArgumentsObjectTypes[I] + >; + }, + public readonly keywords: KeywordParametersDescription, + public readonly rest?: RestDescription | undefined + ) {} + + public parse(partialCommand: PartialCommand): Result { + const keywordsParser = this.keywords.getParser(); + const stream = partialCommand.stream; + const immediateArguments: Presentation[] = []; + for (const parameter of this.descriptions) { + // it eats any keywords at any point in the stream + // as they can appear at any point technically. + const keywordResult = keywordsParser.parseKeywords(partialCommand); + if (isError(keywordResult)) { + return keywordResult; + } + const nextItem = stream.peekItem(); + if (nextItem === undefined) { + if (parameter.prompt) { + return PromptRequiredError.Result( + `An argument for the parameter ${parameter.name} was expected but was not provided. A prompt is available for this parameter.`, + { + promptParameter: parameter, + partialCommand: partialCommand, + } + ); + } else { + return ArgumentParseError.Result( + `An argument for the parameter ${parameter.name} was expected but was not provided.`, + { parameter, partialCommand: partialCommand } + ); + } + } + const acceptedPresentation = acceptPresentation( + parameter.acceptor, + partialCommand.commandTable, + nextItem + ); + if (acceptedPresentation === undefined) { + return ArgumentParseError.Result( + `Was expecting a match for the presentation type: ${printPresentationSchema(parameter.acceptor)} but got ${TextPresentationRenderer.render(nextItem)}.`, + { + parameter: parameter, + partialCommand: partialCommand, + } + ); + } + stream.readItem(); // disopose of argument. + immediateArguments.push(acceptedPresentation); + } + const restResult = keywordsParser.parseRest(partialCommand, this.rest); + if (isError(restResult)) { + return restResult; + } + return Ok({ + description: partialCommand.description, + immediateArguments: immediateArguments.map((p) => p.object), + keywords: keywordsParser.getKeywords(), + rest: restResult.ok?.map((p) => p.object) ?? [], + designator: partialCommand.designator, + isPartial: false, + commandTable: partialCommand.commandTable, + toPartialCommand() { + return { + description: partialCommand.description, + stream: stream, + isPartial: true, + designator: partialCommand.designator, + commandTable: partialCommand.commandTable, + }; + }, + }); + } +} + +export type DescribeCommandParametersOptions< + TImmediateArgumentsObjectTypes extends unknown[] = unknown[], + TRestArgumentObjectType = unknown, + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> = { + readonly parameters: { + [I in keyof TImmediateArgumentsObjectTypes]: DescribeParameter< + TImmediateArgumentsObjectTypes[I] + >; + }; + readonly rest?: DescribeRestParameters | undefined; + readonly keywords?: + | DescribeKeywordParametersOptions + | undefined; +}; +export function describeCommandParameters< + TImmediateArgumentsObjectTypes extends unknown[] = unknown[], + TRestArgumentObjectType = unknown, + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +>( + options: DescribeCommandParametersOptions< + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + > +): CommandParametersDescription< + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta +> { + return new StandardCommandParametersDescription< + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + >( + parameterDescriptionsFromParameterOptions(options.parameters), + options.keywords === undefined + ? describeKeywordParameters({ + keywordDescriptions: + {} as DescribeKeywordParametersOptions["keywordDescriptions"], + allowOtherKeys: false, + }) + : describeKeywordParameters(options.keywords), + options.rest === undefined + ? undefined + : describeRestParameters(options.rest) + ); +} + +export type DescribeParameter = Omit< + ParameterDescription, + "acceptor" +> & { + acceptor: + | PresentationSchema + | PresentationTypeWithoutWrap; +}; + +export type ExtractParameterObjectType> = + ObjectTypeFromAcceptor; + +function parameterDescriptionsFromParameterOptions< + TImmediateArgumentsObjectTypes extends unknown[], +>(descriptions: { + [I in keyof TImmediateArgumentsObjectTypes]: DescribeParameter< + TImmediateArgumentsObjectTypes[I] + >; +}): { + [I in keyof TImmediateArgumentsObjectTypes]: ParameterDescription< + TImmediateArgumentsObjectTypes[I] + >; +} { + return descriptions.map(describeParameter) as { + [I in keyof TImmediateArgumentsObjectTypes]: ParameterDescription< + TImmediateArgumentsObjectTypes[I] + >; + }; +} + +function describeParameter( + description: DescribeParameter +): ParameterDescription { + if ("schemaType" in description.acceptor) { + return description as ParameterDescription; + } else { + return { + ...description, + acceptor: { + schemaType: PresentationSchemaType.Single, + presentationType: description.acceptor, + }, + }; + } +} + +/** + * For some reason typescript really struggles to infer tuples. + * So we have to use a function to guide the inference. + * This is supposed to be used on parameter descriptions. + */ +export function tuple(...args: T): T { + return args; +} diff --git a/packages/interface-manager/src/Command/ParseErrors.ts b/packages/interface-manager/src/Command/ParseErrors.ts new file mode 100644 index 00000000..51ba5cb9 --- /dev/null +++ b/packages/interface-manager/src/Command/ParseErrors.ts @@ -0,0 +1,90 @@ +// Copyright 2023 - 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Err, Result, ResultError } from "@gnuxie/typescript-result"; +import { ParameterDescription } from "./ParameterDescription"; +import { PartialCommand } from "./Command"; + +export class AbstractArgumentParseError extends ResultError { + constructor( + public readonly partialCommand: PartialCommand, + message: string + ) { + super(message); + } + + public static Result( + message: string, + options: { partialCommand: PartialCommand } + ): Result { + return Err(new AbstractArgumentParseError(options.partialCommand, message)); + } +} + +export class ArgumentParseError extends AbstractArgumentParseError { + constructor( + public readonly parameter: ParameterDescription, + partialCommand: PartialCommand, + message: string + ) { + super(partialCommand, message); + } + + public static Result( + message: string, + options: { + parameter: ParameterDescription; + partialCommand: PartialCommand; + } + ): Result { + return Err( + new ArgumentParseError(options.parameter, options.partialCommand, message) + ); + } +} + +export class UnexpectedArgumentError extends AbstractArgumentParseError { + public static Result( + message: string, + options: { partialCommand: PartialCommand } + ): Result { + return Err(new UnexpectedArgumentError(options.partialCommand, message)); + } +} + +export interface PromptContext { + items: string[]; + designator: string[]; +} + +export class PromptRequiredError extends ResultError { + constructor( + message: string, + context: string[], + public readonly parameterRequiringPrompt: ParameterDescription, + public readonly partialCommand: PartialCommand + ) { + super(message, context); + } + + public static Result( + message: string, + { + promptParameter, + partialCommand, + }: { + promptParameter: ParameterDescription; + partialCommand: PartialCommand; + } + ): Result { + return Err( + new PromptRequiredError(message, [], promptParameter, partialCommand) + ); + } +} diff --git a/packages/interface-manager/src/Command/ParsedKeywords.ts b/packages/interface-manager/src/Command/ParsedKeywords.ts new file mode 100644 index 00000000..1158b650 --- /dev/null +++ b/packages/interface-manager/src/Command/ParsedKeywords.ts @@ -0,0 +1,83 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { KeywordsMeta } from "./CommandMeta"; +import { KeywordParametersDescription } from "./KeywordParameterDescription"; +import { Presentation } from "./Presentation"; + +export interface ParsedKeywords { + getKeywordValue( + keyword: string, + defaultValue?: ObjectType + ): ObjectType | undefined; +} + +/** + * A read only map of keywords to their associated properties. + */ +export class StandardParsedKeywords< + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> implements ParsedKeywords { + constructor( + private readonly description: KeywordParametersDescription, + private readonly keywords: ReadonlyMap< + keyof TKeywordsMeta, + Presentation | true + > + ) {} + + public getKeywordValue( + keyword: string, + defaultValue: ObjectType | undefined + ): ObjectType | undefined { + const keywordDescription = this.description.keywordDescriptions[keyword]; + if (keywordDescription === undefined) { + throw new TypeError( + `${keyword} is not a keyword that has been described for this command.` + ); + } + const value = this.keywords.get(keyword); + if (value === true) { + return value as ObjectType; + } else if (value !== undefined) { + return value.object as ObjectType; + } else { + return defaultValue; + } + } +} + +export class DirectParsedKeywords< + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +> implements ParsedKeywords { + constructor( + private readonly description: KeywordParametersDescription, + public readonly keywords: TKeywordsMeta + ) { + // nothing to do. + } + + public getKeywordValue( + keyword: string, + defaultValue?: ObjectType + ): ObjectType | undefined { + const keywordDescription = this.description.keywordDescriptions[keyword]; + if (keywordDescription === undefined) { + throw new TypeError( + `${keyword} is not a keyword that has been described for this command.` + ); + } + const value = this.keywords[keyword]; + if (value === undefined) { + return defaultValue; + } else { + return value as ObjectType; + } + } +} diff --git a/packages/interface-manager/src/Command/Presentation.ts b/packages/interface-manager/src/Command/Presentation.ts new file mode 100644 index 00000000..30958430 --- /dev/null +++ b/packages/interface-manager/src/Command/Presentation.ts @@ -0,0 +1,79 @@ +// Copyright 2022 - 2024 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +/** + * This exists because typescript is bad and if you + * have the wrap function on in a type assertion, then + * it will complain because the argument is not assignable to unknown. + * As obviously the argument in the wrapper function is specific. + */ +export interface PresentationTypeWithoutWrap { + name: string; + /** + * Used when creating a presentation to ensure value is ObjectType. + * This should not be used to determine the type of a given presentation, + * that's what the `type` field on the presentation is for. + */ + validator: (value: unknown) => value is ObjectType; +} + +export type PresentationType = + PresentationTypeWithoutWrap & { + wrap: (object: ObjectType) => Presentation; + }; + +export type ObjectTypeFromPresentationType = + T extends PresentationTypeWithoutWrap ? ObjectType : never; + +export interface Presentation { + object: ObjectType; + presentationType: PresentationTypeWithoutWrap; +} + +const PRESENTATION_TYPES = new Map< + /* the name of the presentation type. */ string, + PresentationType +>(); + +export function findPresentationType( + name: string +): PresentationType { + const entry = PRESENTATION_TYPES.get(name); + if (entry) { + return entry as PresentationType; + } else { + throw new TypeError( + `presentation type with the name: ${name} was not registered` + ); + } +} + +export function registerPresentationType( + name: string, + presentationType: PresentationType +): PresentationType { + if (PRESENTATION_TYPES.has(name)) { + throw new TypeError( + `presentation type with the name: ${name} has already been registered` + ); + } + PRESENTATION_TYPES.set(name, presentationType as PresentationType); + return presentationType; +} + +export function definePresentationType( + description: PresentationType +): PresentationType { + return registerPresentationType(description.name, Object.freeze(description)); +} diff --git a/packages/interface-manager/src/Command/PresentationSchema.ts b/packages/interface-manager/src/Command/PresentationSchema.ts new file mode 100644 index 00000000..e3397fab --- /dev/null +++ b/packages/interface-manager/src/Command/PresentationSchema.ts @@ -0,0 +1,184 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { + ObjectTypeFromPresentationType, + Presentation, + PresentationTypeWithoutWrap, +} from "./Presentation"; +import { CommandTable } from "./CommandTable"; + +export enum PresentationSchemaType { + Single = "Single", + Union = "Union", + Top = "Top", +} + +type ObjectTypeForSingleSchema = + T["presentationType"] extends PresentationTypeWithoutWrap + ? ObjectType + : never; + +type ObjectTypeForUnionSchema = + T["variants"] extends PresentationTypeWithoutWrap[] + ? ObjectType + : never; + +type ObjectTypeForTopSchema = unknown; + +/** + * There is something wrong with the way argument parsing code is using validators + * of presnetation types. When a parameter has declared that it expects arguments + * to be of a presnetation type, all we should be doing is checking that the + * presentationType of the argument is the specified presentation type. + * + * This works, except what happens when we want a command that accepts a union + * of presentation types, or maybe the union of all known presentation types? + * + * Well that is probably an issue for the parameter description code right? + * It has to specify a schema for the argument to get the presentation types it + * expects, rather than just a presentation type. + * + * So is born the presentation schema. + */ +export type SinglePresentationSchema = { + readonly schemaType: PresentationSchemaType.Single; + readonly presentationType: PresentationTypeWithoutWrap; +}; + +export type UnionPresentationSchema = { + readonly schemaType: PresentationSchemaType.Union; + readonly variants: PresentationTypeWithoutWrap[]; +}; + +export type TopPresentationSchema = { + readonly schemaType: PresentationSchemaType.Top; +}; + +export const TopPresentationSchema: TopPresentationSchema = Object.freeze({ + schemaType: PresentationSchemaType.Top, +}); + +export type PresentationSchema = + | SinglePresentationSchema + | UnionPresentationSchema + | TopPresentationSchema; + +export type ObjectTypeForPresentationSchema = + T extends SinglePresentationSchema + ? ObjectTypeForSingleSchema + : T extends UnionPresentationSchema + ? ObjectTypeForUnionSchema + : T extends TopPresentationSchema + ? ObjectTypeForTopSchema + : never; + +export function checkPresentationSchema( + schema: PresentationSchema, + presentation: Presentation +): presentation is Presentation { + switch (schema.schemaType) { + case PresentationSchemaType.Single: + return presentation.presentationType === schema.presentationType; + case PresentationSchemaType.Union: + return Boolean( + schema.variants.find( + (presentationType) => + presentation.presentationType === presentationType + ) + ); + case PresentationSchemaType.Top: + return true; + } +} + +export function acceptPresentation( + schema: PresentationSchema, + commandTable: CommandTable, + presentation: Presentation +): Presentation | undefined { + if (checkPresentationSchema(schema, presentation)) { + return presentation; + } else if (schema.schemaType === PresentationSchemaType.Single) { + const translator = commandTable.findPresentationTypeTranslator( + schema.presentationType, + presentation.presentationType + ); + if (translator) { + return translator.translate(presentation) as Presentation; + } else { + return undefined; + } + } else if (schema.schemaType === PresentationSchemaType.Union) { + for (const variant of schema.variants) { + const result = acceptPresentation( + { + schemaType: PresentationSchemaType.Single, + presentationType: variant, + }, + commandTable, + presentation + ); + if (result !== undefined) { + return result; + } + } + return undefined; + } + throw new TypeError(`The code is wrong`); +} + +export function printPresentationSchema(schema: PresentationSchema): string { + switch (schema.schemaType) { + case PresentationSchemaType.Single: + return schema.presentationType.name; + case PresentationSchemaType.Union: + return schema.variants.map((type) => type.name).join(" | "); + case PresentationSchemaType.Top: + return `TopPresentationSchema`; + } +} + +type Acceptor = + | PresentationSchema + | PresentationTypeWithoutWrap; +export type ObjectTypeFromAcceptor = T extends PresentationTypeWithoutWrap + ? ObjectTypeFromPresentationType + : T extends PresentationSchema + ? ObjectTypeForPresentationSchema + : never; + +type UnionOfObjectTypes = { + [P in keyof T]: T[P] extends Acceptor ? U : never; +}[number]; + +export function union< + TAcceptor extends (PresentationTypeWithoutWrap | UnionPresentationSchema)[], +>( + ...acceptors: TAcceptor +): UnionPresentationSchema> { + type PresentationTypeForUnion = PresentationTypeWithoutWrap< + UnionOfObjectTypes + >; + const presentationTypes = acceptors.reduce( + (acc, acceptor) => { + if ("schemaType" in acceptor) { + acc.push(...(acceptor.variants as PresentationTypeForUnion[])); + } else { + acc.push(acceptor as PresentationTypeForUnion); + } + return acc; + }, + [] + ); + return { + schemaType: PresentationSchemaType.Union, + variants: presentationTypes, + } as UnionPresentationSchema>; +} diff --git a/packages/interface-manager/src/Command/PresentationStream.ts b/packages/interface-manager/src/Command/PresentationStream.ts new file mode 100644 index 00000000..6af5770b --- /dev/null +++ b/packages/interface-manager/src/Command/PresentationStream.ts @@ -0,0 +1,40 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { + StandardSuperCoolStream, + SuperCoolStream, +} from "@gnuxie/super-cool-stream"; +import { Presentation } from "./Presentation"; + +export interface PresentationArgumentStream extends SuperCoolStream< + Presentation, + Presentation[] +> { + rest(): Presentation[]; + // All of the read items before the current position. + priorItems(): Presentation[]; +} + +export class StandardPresentationArgumentStream + extends StandardSuperCoolStream + implements PresentationArgumentStream +{ + public rest() { + return this.source.slice(this.position); + } + + public priorItems(): Presentation[] { + return this.source.slice(0, this.position); + } +} + +// we probably need a command instance builder for when we are parsing arguments +// and then the builder method has a method to `create` the command instance once +// finished. diff --git a/packages/interface-manager/src/Command/PresentationTypeTranslator.ts b/packages/interface-manager/src/Command/PresentationTypeTranslator.ts new file mode 100644 index 00000000..b1cecc1f --- /dev/null +++ b/packages/interface-manager/src/Command/PresentationTypeTranslator.ts @@ -0,0 +1,28 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Presentation, PresentationTypeWithoutWrap } from "./Presentation"; + +export type PresentationTypeTranslator = { + fromType: PresentationTypeWithoutWrap; + toType: PresentationTypeWithoutWrap; + translate(from: Presentation): Presentation; +}; + +export function describeTranslator( + to: PresentationTypeWithoutWrap, + from: PresentationTypeWithoutWrap, + translate: (from: Presentation) => Presentation +): PresentationTypeTranslator { + return { + fromType: from, + toType: to, + translate, + }; +} diff --git a/packages/interface-manager/src/Command/PromptForAccept.ts b/packages/interface-manager/src/Command/PromptForAccept.ts new file mode 100644 index 00000000..109af9ea --- /dev/null +++ b/packages/interface-manager/src/Command/PromptForAccept.ts @@ -0,0 +1,48 @@ +// Copyright 2023 - 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Presentation } from "./Presentation"; +import { StandardPresentationArgumentStream } from "./PresentationStream"; + +// we need a `present(PresentationType, Object)` method on something so that it is easy to create +// presentations. +export interface PromptOptions { + readonly suggestions: Presentation[]; + readonly default?: Presentation; +} + +export interface RestPromptOptions { + readonly suggestions: Presentation[][]; + readonly default?: Presentation[]; +} + +/** + * The idea is that the InterfaceAcceptor can use the presentation type + * to derive the prompt, or use the prompt given by the ParameterDescription. + */ +export interface InterfaceAcceptor { + readonly isPromptable: boolean; +} + +export class PromptableArgumentStream extends StandardPresentationArgumentStream { + constructor( + source: Presentation[], + private readonly interfaceAcceptor: InterfaceAcceptor, + start = 0 + ) { + super([...source], start); + } + public rest() { + return this.source.slice(this.position); + } + + public isPromptable(): boolean { + return this.interfaceAcceptor.isPromptable; + } +} diff --git a/packages/interface-manager/src/Command/RestParameterDescription.ts b/packages/interface-manager/src/Command/RestParameterDescription.ts new file mode 100644 index 00000000..853da720 --- /dev/null +++ b/packages/interface-manager/src/Command/RestParameterDescription.ts @@ -0,0 +1,148 @@ +// Copyright 2022, 2024 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { Ok, Result, isError } from "@gnuxie/typescript-result"; +import { ParameterDescription, Prompt } from "./ParameterDescription"; +import { Presentation, PresentationTypeWithoutWrap } from "./Presentation"; +import { KeywordParser } from "./KeywordParameterDescription"; +import { ArgumentParseError, PromptRequiredError } from "./ParseErrors"; +import { TextPresentationRenderer } from "../TextReader/TextPresentationRenderer"; +import { PartialCommand } from "./Command"; +import { + PresentationSchema, + PresentationSchemaType, + acceptPresentation, + printPresentationSchema, +} from "./PresentationSchema"; + +/** + * Describes a rest parameter for a command. + * This consumes any arguments left over in the call to a command + * into an array and ensures that each can be accepted by the `acceptor`. + * + * Any keywords in the rest of the command will be given to the `keywordParser`. + */ +export interface RestDescription< + ObjectType = unknown, +> extends ParameterDescription { + readonly name: string; + /** The presentation type of each item. */ + readonly acceptor: PresentationSchema; + parseRest( + partialCommand: PartialCommand, + keywordParser: KeywordParser + ): Result[]>; + readonly description?: string | undefined; +} + +/** + * Describes a rest parameter for a command. + * This consumes any arguments left over in the call to a command + * into an array and ensures that each can be accepted by the `acceptor`. + * + * Any keywords in the rest of the command will be given to the `keywordParser`. + */ +export class StandardRestDescription< + ObjectType = unknown, +> implements RestDescription { + public readonly acceptor: PresentationSchema; + constructor( + public readonly name: string, + /** The presentation type of each item. */ + acceptor: + | PresentationTypeWithoutWrap + | PresentationSchema, + public readonly prompt?: Prompt, + public readonly description?: string + ) { + if ("schemaType" in acceptor) { + this.acceptor = acceptor; + } else { + this.acceptor = { + schemaType: PresentationSchemaType.Single, + presentationType: acceptor, + }; + } + } + + /** + * Parse the rest of a command. + * @param stream An argument stream that starts at the rest of a command. + * @param keywordParser Used to store any keywords found in the rest of the command. + * @returns A ActionResult of ReadItems associated with the rest of the command. + * If a ReadItem or Keyword is invalid for the command, then an error will be returned. + */ + public parseRest( + partialCommand: PartialCommand, + keywordParser: KeywordParser + ): Result[]> { + const stream = partialCommand.stream; + const items: Presentation[] = []; + if (this.prompt && stream.peekItem(undefined) === undefined) { + return PromptRequiredError.Result( + `A prompt is required for the missing argument for the ${this.name} parameter`, + { + promptParameter: this as ParameterDescription, + partialCommand, + } + ); + } + while (stream.peekItem(undefined) !== undefined) { + const keywordResult = keywordParser.parseKeywords(partialCommand); + if (isError(keywordResult)) { + return keywordResult; + } + const nextItem = stream.peekItem(undefined); + if (nextItem !== undefined) { + const acceptedPresentation = acceptPresentation( + this.acceptor, + partialCommand.commandTable, + nextItem + ); + if (acceptedPresentation === undefined) { + return ArgumentParseError.Result( + `Was expecting a match for the presentation type: ${printPresentationSchema(this.acceptor)} but got ${TextPresentationRenderer.render(nextItem)}.`, + { + parameter: this as ParameterDescription, + partialCommand, + } + ); + } + items.push(acceptedPresentation); + stream.readItem(); // dispose of keyword's associated value from the stream. + } + } + return Ok(items); + } +} + +export type DescribeRestParameters = Omit< + RestDescription, + "parseRest" | "acceptor" +> & { + acceptor: + | PresentationTypeWithoutWrap + | PresentationSchema; +}; + +export function describeRestParameters( + options: DescribeRestParameters +): RestDescription { + return new StandardRestDescription( + options.name, + options.acceptor, + options.prompt, + options.description + ); +} diff --git a/packages/interface-manager/src/Command/describeCommand.test.ts b/packages/interface-manager/src/Command/describeCommand.test.ts new file mode 100644 index 00000000..867e041a --- /dev/null +++ b/packages/interface-manager/src/Command/describeCommand.test.ts @@ -0,0 +1,204 @@ +// Copyright 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { + MatrixRoomID, + MatrixRoomReference, + MatrixUserID, + StringRoomID, + StringUserID, +} from "@the-draupnir-project/matrix-basic-types"; +import { describeCommand } from "./describeCommand"; +import { Ok, Result, isError, isOk } from "@gnuxie/typescript-result"; +import { + MatrixRoomIDPresentationType, + MatrixRoomReferencePresentationSchema, + MatrixUserIDPresentationType, + StandardJSInterfaceCommandDispatcher, + StringPresentationType, + readCommand, +} from "../TextReader"; +import { StandardParsedKeywords } from "./ParsedKeywords"; +import { tuple } from "./ParameterParsing"; +import { PromptOptions } from "./PromptForAccept"; +import { makePartialCommand } from "./Command"; +import { StandardPresentationArgumentStream } from "./PresentationStream"; +import { StandardCommandTable } from "./CommandTable"; +import { union } from "./PresentationSchema"; +import { CommandDescription } from "./CommandDescription"; + +it("Can define and execute commands.", async function () { + type Context = { + banUser( + room: MatrixRoomReference, + user: MatrixUserID + ): Promise>; + getProtectedRooms(): MatrixRoomID[]; + }; + // i think what we have to do is split describeCommand into two parts :( + // The first extracts the parameters and possibly accepts the `context` as a type parmater. + // then the function it returns accepts the executor. + const BanCommand = describeCommand({ + summary: "Ban a user from a room", + async executor( + context: Context, + _info, + _keywords, + _rest, + user, + room + ): Promise> { + return await context.banUser(room, user); + }, + parameters: tuple( + { + name: "user", + acceptor: MatrixUserIDPresentationType, + }, + { + name: "target room", + acceptor: MatrixRoomReferencePresentationSchema, + async prompt( + context: Context + ): Promise>> { + return Ok({ + suggestions: context + .getProtectedRooms() + .map((room) => MatrixRoomIDPresentationType.wrap(room)), + }); + }, + } + ), + }); + const banResult = await BanCommand.executor( + { + async banUser(room, user) { + expect(room.toRoomIDOrAlias()).toBe("!foo:example.com"); + expect(user.toString()).toBe("@foo:example.com"); + return Ok(true); + }, + getProtectedRooms() { + return [new MatrixRoomID("!foo:example.com")]; + }, + }, + {}, + new StandardParsedKeywords( + BanCommand.parametersDescription.keywords, + new Map() + ), + [], + new MatrixUserID("@foo:example.com" as StringUserID), + MatrixRoomReference.fromRoomID("!foo:example.com" as StringRoomID, []) + ); + expect(isOk(banResult)).toBe(true); +}); + +it("Can define keyword arguments.", async function () { + const KeywordsCommandTest = describeCommand({ + summary: "A command to test keyword arguments", + async executor( + _context: never, + _info: unknown, + _keywords + ): Promise> { + return Ok(undefined); + }, + parameters: [], + keywords: { + keywordDescriptions: { + "dry-run": { + isFlag: true, + description: + "Runs the kick command without actually removing any users.", + }, + glob: { + isFlag: true, + description: + "Allows globs to be used to kick several users from rooms.", + }, + room: { + acceptor: MatrixRoomReferencePresentationSchema, + description: + "Allows the command to be scoped to just one protected room.", + }, + }, + }, + }); + const parseResults = KeywordsCommandTest.parametersDescription.parse( + makePartialCommand( + new StandardPresentationArgumentStream( + readCommand(`--dry-run --room !foo:example.com`) + ), + KeywordsCommandTest, + new StandardCommandTable(Symbol("KeywordsCommandTest")), + [] + ) + ); + if (isError(parseResults)) { + throw new TypeError( + `Failed to parse for some reason: ${parseResults.error.mostRelevantElaboration}` + ); + } + const keywords = parseResults.ok.keywords; + expect(keywords.getKeywordValue("dry-run")).toBe(true); + expect(keywords.getKeywordValue("glob", false)).toBe(false); + expect( + keywords.getKeywordValue("room")?.toRoomIDOrAlias() + ).toEqual("!foo:example.com"); +}); + +it("end to end test a command that parses mxids", async function () { + const tableName = Symbol("ParseTest"); + const testTable = new StandardCommandTable(tableName); + const helpCommand = describeCommand({ + summary: "Mimicks the help command", + parameters: [], + async executor(): Promise> { + return Ok("here is your help"); + }, + }); + const unbanCommand = describeCommand({ + summary: "Mimicks the unban command", + parameters: tuple({ + name: "entity", + acceptor: union( + MatrixUserIDPresentationType, + MatrixRoomReferencePresentationSchema, + StringPresentationType + ), + }), + async executor( + _context: never, + _info, + _keywords, + _rest, + entity + ): Promise> { + return Ok(entity); + }, + }); + testTable.internCommand(unbanCommand as CommandDescription, [ + "draupnir", + "unban", + ]); + const dispatcher = new StandardJSInterfaceCommandDispatcher( + testTable, + helpCommand, + undefined, + { commandNormaliser: (body) => body } + ); + const result = await dispatcher.invokeCommandFromBody( + { commandSender: "@test:localhost" as StringUserID }, + "draupnir unban @spam:example.com" + ); + if (isError(result)) { + throw new TypeError(`Not supposed to be error mate`); + } + expect(result.ok).toBeInstanceOf(MatrixUserID); +}); diff --git a/packages/interface-manager/src/Command/describeCommand.ts b/packages/interface-manager/src/Command/describeCommand.ts new file mode 100644 index 00000000..6720412a --- /dev/null +++ b/packages/interface-manager/src/Command/describeCommand.ts @@ -0,0 +1,80 @@ +// Copyright 2022 Gnuxie +// Copyright 2022 The Matrix.org Foundation C.I.C. +// +// SPDX-License-Identifier: Apache-2.0 +// +// SPDX-FileAttributionText: +// This modified file incorporates work from mjolnir +// https://github.com/matrix-org/mjolnir +// +// SPDX-FileAttributionText: +// This modified file incorporates work from @the-draupnir-project/interface-manager +// https://github.com/the-draupnir-project/interface-manager +// + +import { + CommandDescription, + CommandExecutorFunction, +} from "./CommandDescription"; +import { CommandMeta, KeywordsMeta } from "./CommandMeta"; +import { + DescribeCommandParametersOptions, + describeCommandParameters, +} from "./ParameterParsing"; + +export type DescribeCommandOptions = { + /** A short one line summary of what the command does to display alongside it's help */ + readonly summary: string; + /** A longer description that goes into detail. */ + readonly description?: string; + readonly executor: CommandExecutorFunction; +} & DescribeCommandParametersOptions< + TCommandMeta["TImmediateArgumentsObjectTypes"], + TCommandMeta["TRestArgumentObjectType"], + TCommandMeta["TKeywordsMeta"] +>; + +export function describeCommand< + Context = unknown, + InvocationInformation = unknown, + CommandResult = unknown, + TImmediateArgumentsObjectTypes extends unknown[] = unknown[], + TRestArgumentObjectType = unknown, + TKeywordsMeta extends KeywordsMeta = KeywordsMeta, +>( + options: DescribeCommandOptions< + CommandMeta< + Context, + InvocationInformation, + CommandResult, + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + > + > +): CommandDescription< + CommandMeta< + Context, + InvocationInformation, + CommandResult, + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + > +> { + const parametersDescription = describeCommandParameters< + TImmediateArgumentsObjectTypes, + TRestArgumentObjectType, + TKeywordsMeta + >({ + parameters: options.parameters, + rest: options.rest, + keywords: options.keywords, + }); + return { + summary: options.summary, + description: options.description, + executor: options.executor, + parametersDescription, + }; +} diff --git a/packages/interface-manager/src/Command/index.ts b/packages/interface-manager/src/Command/index.ts new file mode 100644 index 00000000..1c1d704e --- /dev/null +++ b/packages/interface-manager/src/Command/index.ts @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2024 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 + +export * from "./Command"; +export * from "./CommandDescription"; +export * from "./CommandExecutorHelper"; +export * from "./CommandMeta"; +export * from "./CommandTable"; +export * from "./describeCommand"; +export * from "./Keyword"; +export * from "./KeywordParameterDescription"; +export * from "./ParameterDescription"; +export * from "./ParameterParsing"; +export * from "./ParsedKeywords"; +export * from "./ParseErrors"; +export * from "./Presentation"; +export * from "./PresentationSchema"; +export * from "./PresentationStream"; +export * from "./PresentationTypeTranslator"; +export * from "./PromptForAccept"; +export * from "./RestParameterDescription"; diff --git a/packages/interface-manager/src/DeadDocument/DeadDocument.ts b/packages/interface-manager/src/DeadDocument/DeadDocument.ts new file mode 100644 index 00000000..14b066be --- /dev/null +++ b/packages/interface-manager/src/DeadDocument/DeadDocument.ts @@ -0,0 +1,504 @@ +// Copyright 2023 Gnuxie +// +// SPDX-License-Identifier: Apache-2.0 + +import { StandardSuperCoolStream } from "@gnuxie/super-cool-stream"; + +/** + * The DeadDocument started as a universal document object model like Pandoc is. + * That kind of task is just too big for me though and someone else should have + * done it already. Irregardless, the way this is used is a simple DOM that can + * be used to incrementally render both HTML and Markdown. + * The reason we need to incrementally render both HTML and Markdown + * (which really means serialize, hence `DeadDocument`) is so that + * we can ensure in Matrix that both renditions of a node (html + markdown) + * are always in the same event and not split across multiple events. + * This ensures consistency when someone replies to an event that whichever + * format the client uses, the reply will be about the same "thing". + * So we have the power to split messages across multiple Matrix events + * automatically, without the need for micromanagement. + * + * While originally we were going to generate this DOM using a custom + * internal DSL, we discovered it was possible to use JSX templates with a + * custom DOM. You can find our own JSXFactory in `./JSXFactory.ts`. + * + * This means that end users shouldn't have to touch this DOM directly. + */ + +export interface AbstractNode { + readonly parent: DocumentNode | null; + readonly leafNode: boolean; + readonly tag: NodeTag; +} + +export interface DocumentNode extends AbstractNode { + readonly leafNode: false; + attributeMap: Map; + addChild(node: Node): Node; + getChildren(): (DocumentNode | LeafNode)[]; + getFirstChild(): DocumentNode | LeafNode | undefined; +} + +export interface LeafNode extends AbstractNode { + readonly parent: DocumentNode; + readonly data: string; + readonly leafNode: true; +} + +// These are NOT necessarily HTML tags. +export enum NodeTag { + TextNode = "text", + InlineCode = "code", + PreformattedText = "pre", + Root = "root", + Strong = "strong", + Emphasis = "em", + Paragraph = "p", + HeadingOne = "h1", + HeadingTwo = "h2", + HeadingThree = "h3", + HeadingFour = "h4", + HeadingFive = "h5", + HeadingSix = "h6", + UnorderedList = "ul", + OrderedList = "ol", + ListItem = "li", + LineBreak = "br", + BoldFace = "b", + ItalicFace = "i", + Anchor = "a", + Fragment = "fragment", + Details = "details", + Summary = "summary", + Font = "font", + Span = "span", + HorizontalRule = "hr", +} + +export const EmptyFragment = makeDocumentNode(NodeTag.Fragment); + +/** + * This is an internal interface so we can provide + * an implementation of `DocumentNode` in a way + * where we can use ad-hoc mixins. + */ +interface DeadDocumentNode extends DocumentNode { + children: (DocumentNode | LeafNode)[]; + attributeMap: Map; +} + +export function addChild( + this: DeadDocumentNode, + node: Node +): Node { + if (this.children.includes(node)) { + return node; + } + this.children.push(node); + return node; +} + +export function getChildren( + this: DeadDocumentNode +): (DocumentNode | LeafNode)[] { + return [...this.children]; +} + +export function getFirstChild( + this: DeadDocumentNode +): DocumentNode | LeafNode | undefined { + return this.children.at(0); +} + +export function makeDocumentNode(tag: NodeTag, parent = null): DocumentNode { + const node: DeadDocumentNode = { + tag, + leafNode: false, + parent, + children: [], + attributeMap: new Map(), + addChild, + getChildren, + getFirstChild, + }; + return node; +} + +export function makeLeafNode( + tag: LeafInterface["tag"], + parent: DocumentNode, + data: string +): LeafInterface { + const leaf = { tag, parent, data, leafNode: true } as LeafInterface; + parent.addChild(leaf); + return leaf; +} + +export interface TextNode extends LeafNode { + readonly tag: NodeTag.TextNode; +} + +// lol no mixins so addChild can't be protected on DocumentNode +// it's a yoke. +export function addText(this: DocumentNode, data: string): TextNode { + return this.addChild(makeLeafNode(NodeTag.TextNode, this, data)); +} + +export interface InlineCodeNode extends LeafNode { + readonly tag: NodeTag.InlineCode; +} + +export function addInlineCode( + this: DocumentNode, + data: string +): InlineCodeNode { + return this.addChild( + makeLeafNode(NodeTag.InlineCode, this, data) + ); +} + +export interface PreformattedTextNode extends LeafNode { + readonly tag: NodeTag.PreformattedText; +} + +export function addPreformattedText( + this: DocumentNode, + data: string +): PreformattedTextNode { + return this.addChild( + makeLeafNode(NodeTag.PreformattedText, this, data) + ); +} + +/** + * We use a Fringe to render. + */ + +export enum FringeType { + Pre = "pre", + Leaf = "leaf", + Post = "post", +} + +type AnnotatedFringeNode = { + type: FringeType; + node: DocumentNode | LeafNode; +}; + +type Flat = AnnotatedFringeNode[]; +// https://dl.acm.org/doi/pdf/10.1145/165507.165514 +// If performance becomes a concern then a generator should be written +// but for rendering incrementally i think constructing the fringe is acceptable. +// So long as no one uses `Flat` directly and there's some inversion of control +// then we'll be fine. +function fringeInternalNode(node: DocumentNode, flat: Flat): Flat { + if (node.getChildren().length === 0) { + return flat; + } else { + return node + .getChildren() + .reduce((previous: Flat, child: DocumentNode | LeafNode) => { + return fringe(child, previous); + }, flat); + } +} + +function fringe(node: DocumentNode | LeafNode, flat: Flat = []): Flat { + if (node.leafNode) { + flat.push({ type: FringeType.Leaf, node }); + return flat; + } else { + flat.push({ type: FringeType.Pre, node }); + flat = fringeInternalNode(node, flat); + flat.push({ type: FringeType.Post, node }); + return flat; + } +} +export type FringeLeafRenderFunction = ( + tag: NodeTag, + node: LeafNode, + context: Context +) => void; +export type FringeInnerRenderFunction = ( + type: FringeType, + node: DocumentNode, + context: Context, + environment: TagDynamicEnvironment +) => void; + +export interface FringeRenderer { + getLeafRenderer(tag: NodeTag): FringeLeafRenderFunction; + getPreRenderer(tag: NodeTag): FringeInnerRenderFunction; + getPostRenderer(tag: NodeTag): FringeInnerRenderFunction; +} + +export class SimpleFringeRenderer implements FringeRenderer { + private readonly preRenderers = new Map< + NodeTag, + FringeInnerRenderFunction + >(); + private readonly leafRenderers = new Map< + NodeTag, + FringeLeafRenderFunction + >(); + private readonly postRenderers = new Map< + NodeTag, + FringeInnerRenderFunction + >(); + + private getRenderer( + table: Map, + type: FringeType, + tag: NodeTag + ): T { + const entry = table.get(tag); + if (entry) { + return entry; + } + throw new TypeError(`Couldn't find a ${type} renderer for ${tag}`); + } + + public getPreRenderer(tag: NodeTag): FringeInnerRenderFunction { + return this.getRenderer(this.preRenderers, FringeType.Pre, tag); + } + + public getLeafRenderer(tag: NodeTag): FringeLeafRenderFunction { + return this.getRenderer(this.leafRenderers, FringeType.Leaf, tag); + } + + public getPostRenderer(tag: NodeTag): FringeInnerRenderFunction { + return this.getRenderer(this.postRenderers, FringeType.Post, tag); + } + + public internRenderer< + T extends + | FringeInnerRenderFunction + | FringeLeafRenderFunction, + >(type: FringeType, tag: NodeTag, table: Map, renderer: T): void { + if (table.has(tag)) { + throw new TypeError( + `There is already a renderer registered for ${type} ${tag}` + ); + } + table.set(tag, renderer); + } + + public registerRenderer< + T extends + | FringeInnerRenderFunction + | FringeLeafRenderFunction, + >(type: FringeType, tag: NodeTag, renderer: T): this { + // The casting in here is evil. Not sure how to fix it. + switch (type) { + case FringeType.Pre: + this.internRenderer( + type, + tag, + this.preRenderers as Map, + renderer + ); + break; + case FringeType.Leaf: + this.internRenderer( + type, + tag, + this.leafRenderers as Map, + renderer + ); + break; + case FringeType.Post: + this.internRenderer( + type, + tag, + this.postRenderers as Map, + renderer + ); + break; + } + return this; + } + + public registerInnerNode( + tag: NodeTag, + pre: FringeInnerRenderFunction, + post: FringeInnerRenderFunction + ): this { + this.internRenderer(FringeType.Pre, tag, this.preRenderers, pre); + this.internRenderer(FringeType.Post, tag, this.postRenderers, post); + return this; + } +} + +const COMMITTABLE_NODES = new Set([ + NodeTag.HeadingOne, + NodeTag.ListItem, + NodeTag.Paragraph, + NodeTag.PreformattedText, + NodeTag.UnorderedList, + NodeTag.Root, +]); + +class FringeStream extends StandardSuperCoolStream {} + +export type CommitHook = ( + node: DocumentNode, + context: Context +) => void; + +/** + * The FringeWalker allows for the implementation of an incremental + * renderer. + * Each increment is defined by the fist leaf node to be rendered + * or the first inner node to have all of its leaves renderered. + * @param Context is a static context that should be provided to each render function. + */ +export class FringeWalker { + private readonly stream: FringeStream; + private readonly dynamicEnvironment = new TagDynamicEnvironment(); + constructor( + public readonly root: DocumentNode, + private readonly context: Context, + private readonly renderer: FringeRenderer, + private readonly commitHook: CommitHook + ) { + this.stream = new FringeStream(fringe(root)); + } + + public increment(): DocumentNode | undefined { + const renderInnerNode = (node: AnnotatedFringeNode) => { + if (node.node.leafNode) { + throw new TypeError( + "Leaf nodes should not be in the Pre/Post position" + ); + } + const renderer = + node.type === FringeType.Pre + ? this.renderer.getPreRenderer(node.node.tag) + : this.renderer.getPostRenderer(node.node.tag); + renderer(node.type, node.node, this.context, this.dynamicEnvironment); + return node.node; + }; + const postNode = (node: AnnotatedFringeNode): DocumentNode => { + if (node.node.leafNode) { + throw new TypeError( + "Leaf nodes should not be in the Pre/Post position" + ); + } + renderInnerNode(node); + this.dynamicEnvironment.pop(node.node); + return node.node; + }; + const isAnnotatedNodeCommittable = (node: AnnotatedFringeNode): boolean => { + return ( + COMMITTABLE_NODES.has(node.node.tag) && node.type === FringeType.Post + ); + }; + while ( + this.stream.peekItem() && + !isAnnotatedNodeCommittable(this.stream.peekItem()) + ) { + const annotatedNode = this.stream.readItem(); + if (annotatedNode === undefined) { + throw new TypeError(`Stream code is wrong`); + } + switch (annotatedNode.type) { + case FringeType.Pre: + renderInnerNode(annotatedNode); + break; + case FringeType.Post: + postNode(annotatedNode); + break; + case FringeType.Leaf: + if (!annotatedNode.node.leafNode) { + throw new TypeError( + "Leaf nodes should not be marked as an inner node" + ); + } + this.renderer.getLeafRenderer(annotatedNode.node.tag)( + annotatedNode.node.tag, + annotatedNode.node as unknown as LeafNode, + this.context + ); + break; + default: + throw new TypeError(`Uknown fringe type ${annotatedNode.type}`); + } + } + if (this.stream.peekItem() === undefined) { + return undefined; + } + const documentNode = postNode(this.stream.readItem()); + this.commitHook(documentNode, this.context); + return documentNode; + } +} + +export class TagDynamicEnvironmentEntry { + constructor( + public readonly node: DocumentNode, + public value: unknown, + public readonly previous: undefined | TagDynamicEnvironmentEntry + ) {} +} + +/** + * A dynamic environment is just an environment of bindings that is made + * by shadowing previous bindings and pushing and popping bindings "dynamically" + * for a given variable with some thing. + * + * In this example, we push and pop bindings with `DocumentNode`s. + * For example, if you make a binding to a variable called `indentationLevel` + * to set it to `1` from a `
    ` node, then this binding should be popped + * when the `FringeWalker` reaches the post node (`
`). + * Howerver, if we encounter another `