diff --git a/.gitignore b/.gitignore index b62507c..952b929 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ network.txt node_modules/ dist/ -system.txt .DS_Store \ No newline at end of file diff --git a/jest.config.mjs b/jest.config.mjs new file mode 100644 index 0000000..200b828 --- /dev/null +++ b/jest.config.mjs @@ -0,0 +1,34 @@ +export default { + preset: 'ts-jest/presets/default-esm', + extensionsToTreatAsEsm: ['.ts'], + testEnvironment: 'node', + roots: ['/src', '/tests'], + testMatch: [ + '**/__tests__/**/*.ts', + '**/?(*.)+(spec|test).ts' + ], + transform: { + '^.+\\.ts$': ['ts-jest', { + useESM: true + }], + }, + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/**/*.d.ts', + '!src/**/index.ts', + '!src/examples/**', + ], + coverageDirectory: 'coverage', + coverageReporters: [ + 'text', + 'lcov', + 'html' + ], + setupFilesAfterEnv: ['/tests/setup.ts'], + testTimeout: 30000, + moduleNameMapping: { + '^@/(.*)$': '/src/$1', + '^@orbitdb/core$': '/tests/mocks/orbitdb.ts', + '^@helia/helia$': '/tests/mocks/ipfs.ts', + }, +}; \ No newline at end of file diff --git a/package.json b/package.json index 83e4943..d49f2ec 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,13 @@ "prepare": "husky", "lint": "npx eslint src", "format": "prettier --write \"**/*.{ts,js,json,md}\"", - "lint:fix": "npx eslint src --fix" + "lint:fix": "npx eslint src --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage", + "test:unit": "jest tests/unit", + "test:integration": "jest tests/integration", + "test:e2e": "jest tests/e2e" }, "keywords": [ "ipfs", @@ -60,8 +66,10 @@ }, "devDependencies": { "@eslint/js": "^9.24.0", + "@jest/globals": "^30.0.1", "@orbitdb/core-types": "^1.0.14", "@types/express": "^5.0.1", + "@types/jest": "^30.0.0", "@types/node": "^22.13.10", "@types/node-forge": "^1.3.11", "@typescript-eslint/eslint-plugin": "^8.29.0", @@ -71,9 +79,11 @@ "eslint-plugin-prettier": "^5.2.6", "globals": "^16.0.0", "husky": "^8.0.3", + "jest": "^30.0.1", "lint-staged": "^15.5.0", "prettier": "^3.5.3", "rimraf": "^5.0.5", + "ts-jest": "^29.4.0", "tsc-esm-fix": "^3.1.2", "typescript": "^5.8.2", "typescript-eslint": "^8.29.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e5e96da..0e2c72a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,7 @@ settings: excludeLinksFromLockfile: false importers: + .: dependencies: '@chainsafe/libp2p-gossipsub': @@ -51,7 +52,7 @@ importers: version: 2.5.0 '@orbitdb/feed-db': specifier: ^1.1.2 - version: 1.1.2(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)) + version: 1.1.2(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)) blockstore-fs: specifier: ^2.0.2 version: 2.0.2 @@ -60,7 +61,7 @@ importers: version: 5.1.0 helia: specifier: ^5.3.0 - version: 5.3.0(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)) + version: 5.3.0(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)) libp2p: specifier: ^2.8.2 version: 2.8.2 @@ -80,12 +81,18 @@ importers: '@eslint/js': specifier: ^9.24.0 version: 9.24.0 + '@jest/globals': + specifier: ^30.0.1 + version: 30.0.1 '@orbitdb/core-types': specifier: ^1.0.14 version: 1.0.14 '@types/express': specifier: ^5.0.1 version: 5.0.1 + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 '@types/node': specifier: ^22.13.10 version: 22.13.16 @@ -113,6 +120,9 @@ importers: husky: specifier: ^8.0.3 version: 8.0.3 + jest: + specifier: ^30.0.1 + version: 30.0.1(@types/node@22.13.16) lint-staged: specifier: ^15.5.0 version: 15.5.0 @@ -122,6 +132,9 @@ importers: rimraf: specifier: ^5.0.5 version: 5.0.10 + ts-jest: + specifier: ^29.4.0 + version: 29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.1)(@jest/types@30.0.1)(babel-jest@30.0.1(@babel/core@7.27.4))(jest-util@30.0.1)(jest@30.0.1(@types/node@22.13.16))(typescript@5.8.2) tsc-esm-fix: specifier: ^3.1.2 version: 3.1.2 @@ -133,1808 +146,1266 @@ importers: version: 8.29.0(eslint@9.24.0)(typescript@5.8.2) packages: + '@achingbrain/http-parser-js@0.5.8': - resolution: - { - integrity: sha512-7P8ukzL4jyh8Fho5tSfPBTzWJUZ0D7DxaW7ObObT5HTcljhjq9NN/qFg1yzPxq0VWRI/8qPnSUa1ofzzH/R9eQ==, - } + resolution: {integrity: sha512-7P8ukzL4jyh8Fho5tSfPBTzWJUZ0D7DxaW7ObObT5HTcljhjq9NN/qFg1yzPxq0VWRI/8qPnSUa1ofzzH/R9eQ==} '@achingbrain/nat-port-mapper@4.0.2': - resolution: - { - integrity: sha512-cOV/mPL8ouLko487f37LXl6t76NwksLbyib2Y2T72HK2bm7y2QP0+3+1xxqKqaffoo30CJm8E8IHN9hmJ/LiSA==, - } + resolution: {integrity: sha512-cOV/mPL8ouLko487f37LXl6t76NwksLbyib2Y2T72HK2bm7y2QP0+3+1xxqKqaffoo30CJm8E8IHN9hmJ/LiSA==} '@achingbrain/ssdp@4.2.1': - resolution: - { - integrity: sha512-haY46oYyQWlM3qElCpQ1M5I5pVbPPJ5p3n3gYuMtZsDezT5mQ4e4PuqiIzhfmrURj+WKbSppgNRuczN0S+Xt1Q==, - } + resolution: {integrity: sha512-haY46oYyQWlM3qElCpQ1M5I5pVbPPJ5p3n3gYuMtZsDezT5mQ4e4PuqiIzhfmrURj+WKbSppgNRuczN0S+Xt1Q==} '@ampproject/remapping@2.3.0': - resolution: - { - integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} '@assemblyscript/loader@0.9.4': - resolution: - { - integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==, - } + resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==} '@babel/code-frame@7.26.2': - resolution: - { - integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} '@babel/compat-data@7.26.8': - resolution: - { - integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.27.5': + resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} + engines: {node: '>=6.9.0'} '@babel/core@7.26.10': - resolution: - { - integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.27.4': + resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} + engines: {node: '>=6.9.0'} '@babel/generator@7.27.0': - resolution: - { - integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.5': + resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} + engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.25.9': - resolution: - { - integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.0': - resolution: - { - integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.27.0': - resolution: - { - integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-create-regexp-features-plugin@7.27.0': - resolution: - { - integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-define-polyfill-provider@0.6.4': - resolution: - { - integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==, - } + resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 '@babel/helper-member-expression-to-functions@7.25.9': - resolution: - { - integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.25.9': - resolution: - { - integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.26.0': - resolution: - { - integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-optimise-call-expression@7.25.9': - resolution: - { - integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} '@babel/helper-plugin-utils@7.26.5': - resolution: - { - integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} '@babel/helper-remap-async-to-generator@7.25.9': - resolution: - { - integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-replace-supers@7.26.5': - resolution: - { - integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: - { - integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.25.9': - resolution: - { - integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.25.9': - resolution: - { - integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.25.9': - resolution: - { - integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} '@babel/helper-wrap-function@7.25.9': - resolution: - { - integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + engines: {node: '>=6.9.0'} '@babel/helpers@7.27.0': - resolution: - { - integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} '@babel/parser@7.27.0': - resolution: - { - integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} + engines: {node: '>=6.0.0'} hasBin: true '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: - { - integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: - { - integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: - { - integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: - { - integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: - { - integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-proposal-export-default-from@7.25.9': - resolution: - { - integrity: sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: - { - integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-async-generators@7.8.4': - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: - { - integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==, - } + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-export-default-from@7.25.9': - resolution: - { - integrity: sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-flow@7.26.0': - resolution: - { - integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: - { - integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: - { - integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.25.9': - resolution: - { - integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.25.9': - resolution: - { - integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: - { - integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: - { - integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: - { - integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: - { - integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: - { - integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-block-scoping@7.27.0': - resolution: - { - integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-properties@7.25.9': - resolution: - { - integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-class-static-block@7.26.0': - resolution: - { - integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 '@babel/plugin-transform-classes@7.25.9': - resolution: - { - integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-computed-properties@7.25.9': - resolution: - { - integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-destructuring@7.25.9': - resolution: - { - integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: - { - integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: - { - integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: - { - integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: - { - integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: - { - integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: - { - integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: - { - integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-for-of@7.26.9': - resolution: - { - integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-function-name@7.25.9': - resolution: - { - integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-json-strings@7.25.9': - resolution: - { - integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-literals@7.25.9': - resolution: - { - integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: - { - integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: - { - integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-amd@7.25.9': - resolution: - { - integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: - { - integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: - { - integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-modules-umd@7.25.9': - resolution: - { - integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: - { - integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-new-target@7.25.9': - resolution: - { - integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: - { - integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: - { - integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: - { - integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-object-super@7.25.9': - resolution: - { - integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: - { - integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: - { - integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-parameters@7.25.9': - resolution: - { - integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-methods@7.25.9': - resolution: - { - integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: - { - integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-property-literals@7.25.9': - resolution: - { - integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-display-name@7.25.9': - resolution: - { - integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: - { - integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: - { - integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx@7.25.9': - resolution: - { - integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regenerator@7.27.0': - resolution: - { - integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: - { - integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/plugin-transform-reserved-words@7.25.9': - resolution: - { - integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-runtime@7.26.10': - resolution: - { - integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: - { - integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-spread@7.25.9': - resolution: - { - integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: - { - integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-template-literals@7.26.8': - resolution: - { - integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typeof-symbol@7.27.0': - resolution: - { - integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-typescript@7.27.0': - resolution: - { - integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: - { - integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: - { - integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: - { - integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: - { - integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/preset-env@7.26.9': - resolution: - { - integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-flow@7.25.9': - resolution: - { - integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: - { - integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==, - } + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 '@babel/preset-typescript@7.27.0': - resolution: - { - integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/register@7.25.9': - resolution: - { - integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime@7.27.0': - resolution: - { - integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} '@babel/template@7.27.0': - resolution: - { - integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} '@babel/traverse@7.27.0': - resolution: - { - integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + engines: {node: '>=6.9.0'} '@babel/types@7.27.0': - resolution: - { - integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} '@chainsafe/as-chacha20poly1305@0.1.0': - resolution: - { - integrity: sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==, - } + resolution: {integrity: sha512-BpNcL8/lji/GM3+vZ/bgRWqJ1q5kwvTFmGPk7pxm/QQZDbaMI98waOHjEymTjq2JmdD/INdNBFOVSyJofXg7ew==} '@chainsafe/as-sha256@1.0.1': - resolution: - { - integrity: sha512-4Y/kQm0LsJ6QRtGcMq6gOdQP+fZhWDfIV2eIqP6oFJZBWYGmdh3wm8YbrXDPLJO87X2Fu6koRLdUS00O3k14Hw==, - } + resolution: {integrity: sha512-4Y/kQm0LsJ6QRtGcMq6gOdQP+fZhWDfIV2eIqP6oFJZBWYGmdh3wm8YbrXDPLJO87X2Fu6koRLdUS00O3k14Hw==} '@chainsafe/is-ip@2.1.0': - resolution: - { - integrity: sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==, - } + resolution: {integrity: sha512-KIjt+6IfysQ4GCv66xihEitBjvhU/bixbbbFxdJ1sqCp4uJ0wuZiYBPhksZoy4lfaF0k9cwNzY5upEW/VWdw3w==} '@chainsafe/libp2p-gossipsub@14.1.1': - resolution: - { - integrity: sha512-EUs2C+xHXXbw0pQQF2AN/ih4qB6BBWOGkDhvHz1VN52o2m/827IBEMT8RHdXMNZciQc90to1L57BKmhXkvztDw==, - } - engines: { npm: '>=8.7.0' } + resolution: {integrity: sha512-EUs2C+xHXXbw0pQQF2AN/ih4qB6BBWOGkDhvHz1VN52o2m/827IBEMT8RHdXMNZciQc90to1L57BKmhXkvztDw==} + engines: {npm: '>=8.7.0'} '@chainsafe/libp2p-noise@16.1.0': - resolution: - { - integrity: sha512-GJA/i5pd6VmetxokvnPlEbVCeL7SfLHkSuUHwbJ4w0u7dZUbse4Hr8SA8RYGwNHbZr2TEKFC9WerhvMWbciIrQ==, - } + resolution: {integrity: sha512-GJA/i5pd6VmetxokvnPlEbVCeL7SfLHkSuUHwbJ4w0u7dZUbse4Hr8SA8RYGwNHbZr2TEKFC9WerhvMWbciIrQ==} '@chainsafe/libp2p-yamux@7.0.1': - resolution: - { - integrity: sha512-949MI0Ll0AsYq1gUETZmL/MijwX0jilOQ1i4s8wDEXGiMhuPWWiMsPgEnX6n+VzFmTrfNYyGaaJj5/MqxV9y/g==, - } + resolution: {integrity: sha512-949MI0Ll0AsYq1gUETZmL/MijwX0jilOQ1i4s8wDEXGiMhuPWWiMsPgEnX6n+VzFmTrfNYyGaaJj5/MqxV9y/g==} '@chainsafe/netmask@2.0.0': - resolution: - { - integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==, - } + resolution: {integrity: sha512-I3Z+6SWUoaljh3TBzCnCxjlUyN8tA+NAk5L6m9IxvCf1BENQTePzPMis97CoN/iMW1St3WN+AWCCRp+TTBRiDg==} '@colors/colors@1.6.0': - resolution: - { - integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==, - } - engines: { node: '>=0.1.90' } + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} '@dabh/diagnostics@2.0.3': - resolution: - { - integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==, - } + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} '@eslint-community/eslint-utils@4.5.1': - resolution: - { - integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: - { - integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.20.0': - resolution: - { - integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.2.1': - resolution: - { - integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.12.0': - resolution: - { - integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.13.0': - resolution: - { - integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': - resolution: - { - integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.24.0': - resolution: - { - integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': - resolution: - { - integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.2.8': - resolution: - { - integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@helia/bitswap@2.0.5': - resolution: - { - integrity: sha512-LdvjagmArJ6d67yFKIxU+H29be+u8teP3yQzL8CLPU2J6uG66Pwh0Bb7bU+D1uUyUcfLS4TqDrRh1VKR+EghYw==, - } + resolution: {integrity: sha512-LdvjagmArJ6d67yFKIxU+H29be+u8teP3yQzL8CLPU2J6uG66Pwh0Bb7bU+D1uUyUcfLS4TqDrRh1VKR+EghYw==} '@helia/block-brokers@4.1.0': - resolution: - { - integrity: sha512-pzIhJeDLdF0VFkj9+LeLI6ZZORdH6/FwV7Q+IlIi2m5kAExqaYh8Oob6Dc7J5luu1atf69q4PWNIPYRiySmsmg==, - } + resolution: {integrity: sha512-pzIhJeDLdF0VFkj9+LeLI6ZZORdH6/FwV7Q+IlIi2m5kAExqaYh8Oob6Dc7J5luu1atf69q4PWNIPYRiySmsmg==} '@helia/delegated-routing-v1-http-api-client@4.2.2': - resolution: - { - integrity: sha512-SQuyIZAbfvXUkGiralGI7sWq44Ztd1Cf+3pz/paCzq1J3Jvl7JnofWB0spsZjwSu0jYPdwAL60Nmg1TSTm6ZVg==, - } + resolution: {integrity: sha512-SQuyIZAbfvXUkGiralGI7sWq44Ztd1Cf+3pz/paCzq1J3Jvl7JnofWB0spsZjwSu0jYPdwAL60Nmg1TSTm6ZVg==} '@helia/interface@5.2.1': - resolution: - { - integrity: sha512-8eH3wOoOAHqcux2erXOm33oFBtKdpfHclepzn28bBYEl5wXhrc9JFeo2X3SYJeE0o/jxq0L39BprkYjgSSC91Q==, - } + resolution: {integrity: sha512-8eH3wOoOAHqcux2erXOm33oFBtKdpfHclepzn28bBYEl5wXhrc9JFeo2X3SYJeE0o/jxq0L39BprkYjgSSC91Q==} '@helia/routers@3.0.1': - resolution: - { - integrity: sha512-Eshr/8XJU4c0H8s1m5oBFB2YM0n3HBbxB3ny8DbsRFS8cAQ/L8ujnQomniMjZuuOhcNz8EEGwkUc07HCtAqAFA==, - } + resolution: {integrity: sha512-Eshr/8XJU4c0H8s1m5oBFB2YM0n3HBbxB3ny8DbsRFS8cAQ/L8ujnQomniMjZuuOhcNz8EEGwkUc07HCtAqAFA==} '@helia/unixfs@5.0.0': - resolution: - { - integrity: sha512-wIv9Zf4vM7UN2A7jNiOa5rOfO1Hl/9AarKSFQeV09I1NflclSSu6EHaiNcH1K6LBhRJ36/w2RHXE8DK3+DK8hw==, - } + resolution: {integrity: sha512-wIv9Zf4vM7UN2A7jNiOa5rOfO1Hl/9AarKSFQeV09I1NflclSSu6EHaiNcH1K6LBhRJ36/w2RHXE8DK3+DK8hw==} '@helia/utils@1.2.2': - resolution: - { - integrity: sha512-f8TC+gTQkMTVPaSDB8sSV+8W5/QIMX9XNWY2Xf0Y/WVzGm+Nz5o5wpVTT1kgBpILngXHSs4Xo+6aBQlafL15EA==, - } + resolution: {integrity: sha512-f8TC+gTQkMTVPaSDB8sSV+8W5/QIMX9XNWY2Xf0Y/WVzGm+Nz5o5wpVTT1kgBpILngXHSs4Xo+6aBQlafL15EA==} '@humanfs/core@0.19.1': - resolution: - { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} '@humanfs/node@0.16.6': - resolution: - { - integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} '@humanwhocodes/retry@0.3.1': - resolution: - { - integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} '@humanwhocodes/retry@0.4.2': - resolution: - { - integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} '@ipld/dag-cbor@9.2.2': - resolution: - { - integrity: sha512-uIEOuruCqKTP50OBWwgz4Js2+LhiBQaxc57cnP71f45b1mHEAo1OCR1Zn/TbvSW/mV1x+JqhacIktkKyaYqhCw==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-uIEOuruCqKTP50OBWwgz4Js2+LhiBQaxc57cnP71f45b1mHEAo1OCR1Zn/TbvSW/mV1x+JqhacIktkKyaYqhCw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@ipld/dag-json@10.2.3': - resolution: - { - integrity: sha512-itacv1j1hvYgLox2B42Msn70QLzcr0MEo5yGIENuw2SM/lQzq9bmBiMky+kDsIrsqqblKTXcHBZnnmK7D4a6ZQ==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-itacv1j1hvYgLox2B42Msn70QLzcr0MEo5yGIENuw2SM/lQzq9bmBiMky+kDsIrsqqblKTXcHBZnnmK7D4a6ZQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@ipld/dag-pb@4.1.3': - resolution: - { - integrity: sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@ipshipyard/libp2p-auto-tls@1.0.0': - resolution: - { - integrity: sha512-wV1smnqbg3xUCHmPB8KWFuP8G9MKlx8KDuiJvhCWPi7B03xJq2FMybMDPI8tM9boa9sHD+5+NFu+Teo3Lz76fw==, - } + resolution: {integrity: sha512-wV1smnqbg3xUCHmPB8KWFuP8G9MKlx8KDuiJvhCWPi7B03xJq2FMybMDPI8tM9boa9sHD+5+NFu+Teo3Lz76fw==} '@ipshipyard/node-datachannel@0.26.5': - resolution: - { - integrity: sha512-GOxqgCI4scLTSFwFO7ClK5eDgSCJQgf7mbmJu0qgPu9zNlRp0VJl6rNJScQBllHP7IhmBf3VXRWVvwWfOrplww==, - } - engines: { node: '>=18.20.0' } + resolution: {integrity: sha512-GOxqgCI4scLTSFwFO7ClK5eDgSCJQgf7mbmJu0qgPu9zNlRp0VJl6rNJScQBllHP7IhmBf3VXRWVvwWfOrplww==} + engines: {node: '>=18.20.0'} '@isaacs/cliui@8.0.2': - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@isaacs/ttlcache@1.4.1': - resolution: - { - integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==} + engines: {node: '>=12'} '@istanbuljs/load-nyc-config@1.1.0': - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} '@istanbuljs/schema@0.1.3': - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@30.0.1': + resolution: {integrity: sha512-ThsJ+1I1/7CSTCmddZWqwkwremh3kmKCEoa7oafYL0A1a4tiXWKHzp8+a4m0EbXfGsYVjaVjjzywOQ1ZCnLlzg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.0.1': + resolution: {integrity: sha512-wImaJH4bFaV8oDJkCureHnnua0dOtgVgogh62gFKjTMXyKRVLjiVOJU9VypxXNqDUAM+W23VHJrJRauW3OLPeQ==} + 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 '@jest/create-cache-key-function@29.7.0': - resolution: - { - integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/environment@29.7.0': - resolution: - { - integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/environment@30.0.1': + resolution: {integrity: sha512-JFI3qCT4ps9UjQNievPdsmpX+mOcAjOR2aemGUJbNiwpsuSCbiAaXwa2yBCND7OqCxUoiWMh6Lf/cwGxt/m2NA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.0.1': + resolution: {integrity: sha512-txHSNST7ud1V7JVFS5N1qqU+Wf6tiFPxDbjQpklTnckeVecFF8O+LD6efgF5z1dBigp4nMmDIYYxslQJHaS7QA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect@30.0.1': + resolution: {integrity: sha512-mxhK5Zt8z+gOrXkv6RxQoRb1741EkcliTaNAIzrj1w4ch3TruFW+1QbLOTarovxo02EIh+a+JGky3r25p0nhIA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/fake-timers@29.7.0': - resolution: - { - integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@30.0.1': + resolution: {integrity: sha512-H/rYdOcSa+vlux7a3aw6bqQ/nMFMGQqmflAl4qFTThidyakO63ATiHSuhHL1yY39IFBCIbIiUpqr8ognXZA54A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.0.1': + resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/globals@30.0.1': + resolution: {integrity: sha512-5IdHDqKVayXzBL8sKM5AvPaAnrfO9GXphDLwOg6VWjUiqSrGcj/Hd518QpfDWOeu1aWjBblst3rxeRgbtOEJ8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.0.1': + resolution: {integrity: sha512-r0vZe9j3J97Luj/qQ4G+nYpcvdhl1JuEeoJ7WgUN6FOUixztDKkqHjVtURmfUCoU7rqd1Hj5g5nKm35jClFhfw==} + 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 '@jest/schemas@29.6.3': - resolution: - { - integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@30.0.1': + resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.0.1': + resolution: {integrity: sha512-6Dpv7vdtoRiISEFwYF8/c7LIvqXD7xDXtLPNzC2xqAfBznKip0MQM+rkseKwUPUpv2PJ7KW/YsnwWXrIL2xF+A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.0.1': + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-result@30.0.1': + resolution: {integrity: sha512-VpPEdwN+NivPsExCb9FCcIfIIP4x6vzGg4xfaH0URYkZcJixwe2E69uRqp9MPq6A4mWUoQRtjPNocFA/kRoiFg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.0.1': + resolution: {integrity: sha512-2D3F5XSPIfGMvdK+T6z8fExQso3sPnkBJsUM5x3YQ1Aaz+4Qrs4X8eqzMyC0i0ENfhcijidzz5yMTM4PvK+mKg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/transform@29.7.0': - resolution: - { - integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@30.0.1': + resolution: {integrity: sha512-BXZJPGD56+bwIq8EM0X6VqtM+/W4NCMBOxTe4MtfpPVyoZ+rIs6thzdem853vav2jQzpXDsyKir3DRQS5mS9Rw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@29.6.3': - resolution: - { - integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@30.0.1': + resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.8': - resolution: - { - integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} '@jridgewell/set-array@1.2.1': - resolution: - { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} '@jridgewell/source-map@0.3.6': - resolution: - { - integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, - } + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.5.0': - resolution: - { - integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, - } + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': - resolution: - { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, - } + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@leichtgewicht/ip-codec@2.0.5': - resolution: - { - integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, - } + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} '@libp2p/autonat@2.0.28': - resolution: - { - integrity: sha512-SFVowDdGf+C8l3XpDAqvf6eVuFcxNVuo9AS5afkklZ9RoSgc46qVGBrRFsL/27gPkuFZspx5yMYClJO8/HRleg==, - } + resolution: {integrity: sha512-SFVowDdGf+C8l3XpDAqvf6eVuFcxNVuo9AS5afkklZ9RoSgc46qVGBrRFsL/27gPkuFZspx5yMYClJO8/HRleg==} '@libp2p/bootstrap@11.0.32': - resolution: - { - integrity: sha512-sXpl92PyFTHhq3mA56DDyqHwFKn8JSUdco83f4ur3Jl69Zm8e4Yxli2hdzWNPtOoXy2s0DCagc/bOFuSSYu8fA==, - } + resolution: {integrity: sha512-sXpl92PyFTHhq3mA56DDyqHwFKn8JSUdco83f4ur3Jl69Zm8e4Yxli2hdzWNPtOoXy2s0DCagc/bOFuSSYu8fA==} '@libp2p/circuit-relay-v2@3.2.8': - resolution: - { - integrity: sha512-rPKG0/1odRy4EynULTxTjshupAChZtjVNl/R41JO5KvvLV5XkFnOFyFdwXBxtS8telkpKhCEr+YGse6U0gZ3dA==, - } + resolution: {integrity: sha512-rPKG0/1odRy4EynULTxTjshupAChZtjVNl/R41JO5KvvLV5XkFnOFyFdwXBxtS8telkpKhCEr+YGse6U0gZ3dA==} '@libp2p/config@1.1.4': - resolution: - { - integrity: sha512-telhYtL8OdRXu0GSgCMtWbZpZy+sQxptU6mmUkZnJLLEAR9CVzRK9W2KzctAon9WSIop7ErKggAaiXeTGMEw8g==, - } + resolution: {integrity: sha512-telhYtL8OdRXu0GSgCMtWbZpZy+sQxptU6mmUkZnJLLEAR9CVzRK9W2KzctAon9WSIop7ErKggAaiXeTGMEw8g==} '@libp2p/crypto@5.0.15': - resolution: - { - integrity: sha512-28xYMOn3fs8flsNgCVVxp27gEmDTtZHbz+qEVv3v7cWfGRipaVhNXFV9tQJHWXHQ8mN8v/PQvgcfCcWu5jkrTg==, - } + resolution: {integrity: sha512-28xYMOn3fs8flsNgCVVxp27gEmDTtZHbz+qEVv3v7cWfGRipaVhNXFV9tQJHWXHQ8mN8v/PQvgcfCcWu5jkrTg==} '@libp2p/dcutr@2.0.27': - resolution: - { - integrity: sha512-A4qIN+nxfIJhlA0slqa90xlc2DADz2RT5gE09Edxi21jGY7g28IX98gd19A73P4EOMIH2aUBjW6xQpDXEmDLcw==, - } + resolution: {integrity: sha512-A4qIN+nxfIJhlA0slqa90xlc2DADz2RT5gE09Edxi21jGY7g28IX98gd19A73P4EOMIH2aUBjW6xQpDXEmDLcw==} '@libp2p/http-fetch@2.2.2': - resolution: - { - integrity: sha512-dMPo2pe2h/AHAljgwDEErdiB8JbiJM5b0LzuF/Yq4HcplfJZf33VtzUHN1n8x+3K+F8fntWUKN30SwSisSoVaw==, - } + resolution: {integrity: sha512-dMPo2pe2h/AHAljgwDEErdiB8JbiJM5b0LzuF/Yq4HcplfJZf33VtzUHN1n8x+3K+F8fntWUKN30SwSisSoVaw==} '@libp2p/identify@3.0.27': - resolution: - { - integrity: sha512-HCIT8I3X8CS/v1spocl5PR1qHGySvY5K7EtZSX7opH7wvQCT/WSWIQLSyY8hL0ezc2CGvCRpr6YVcuaYZtMjaA==, - } + resolution: {integrity: sha512-HCIT8I3X8CS/v1spocl5PR1qHGySvY5K7EtZSX7opH7wvQCT/WSWIQLSyY8hL0ezc2CGvCRpr6YVcuaYZtMjaA==} '@libp2p/interface-internal@2.3.9': - resolution: - { - integrity: sha512-1hW/yHktO3txc+r4ASmVA9GbNN6ZoGnH8Bt9VrYwY580BT53TP3eipn3Bo1XyGBDtmV6bpQiKhFK5AYVbhnz0g==, - } + resolution: {integrity: sha512-1hW/yHktO3txc+r4ASmVA9GbNN6ZoGnH8Bt9VrYwY580BT53TP3eipn3Bo1XyGBDtmV6bpQiKhFK5AYVbhnz0g==} '@libp2p/interface@2.7.0': - resolution: - { - integrity: sha512-lWmfIGzbSaw//yoEWWJh8dXNDGSCwUyXwC7P1Q6jCFWNoEtCaB1pvwOGBtri7Db/aNFZryMzN5covoq5ulldnA==, - } + resolution: {integrity: sha512-lWmfIGzbSaw//yoEWWJh8dXNDGSCwUyXwC7P1Q6jCFWNoEtCaB1pvwOGBtri7Db/aNFZryMzN5covoq5ulldnA==} '@libp2p/kad-dht@14.2.15': - resolution: - { - integrity: sha512-iARZsaKrm9LlOE0nRTsqMasYGfWbh+zw1TAMWOY/QHTszFGb9ol7FZoI9WUzoif9ltKLu3BjJpy00b8CVofCBw==, - } + resolution: {integrity: sha512-iARZsaKrm9LlOE0nRTsqMasYGfWbh+zw1TAMWOY/QHTszFGb9ol7FZoI9WUzoif9ltKLu3BjJpy00b8CVofCBw==} '@libp2p/keychain@5.1.4': - resolution: - { - integrity: sha512-0TyZSopKMX7npEEAAwyrm81BKURVx7pCvtlNvyroTd4Biyy6vV6GKwjSyBoNX9OYE7dRu8bDF0KH5sr1oxC0sg==, - } + resolution: {integrity: sha512-0TyZSopKMX7npEEAAwyrm81BKURVx7pCvtlNvyroTd4Biyy6vV6GKwjSyBoNX9OYE7dRu8bDF0KH5sr1oxC0sg==} '@libp2p/logger@5.1.13': - resolution: - { - integrity: sha512-JKyMlySG8T+LpItsj9Vma57yap/A0HqJ8ZdaHvgdoThhSOfqcRs8oRWO/2EG0Q5hUXugw//EAT+Ptj8MyNdbjQ==, - } + resolution: {integrity: sha512-JKyMlySG8T+LpItsj9Vma57yap/A0HqJ8ZdaHvgdoThhSOfqcRs8oRWO/2EG0Q5hUXugw//EAT+Ptj8MyNdbjQ==} '@libp2p/mdns@11.0.32': - resolution: - { - integrity: sha512-gMJePsHTND9o+S7A64tMt/vi5d/pBp7Tk1b1t5qq5JEzdeP64D0sW09pjEQ8b6U0OJxJ2pnKjxyYn0kEnE2eMQ==, - } + resolution: {integrity: sha512-gMJePsHTND9o+S7A64tMt/vi5d/pBp7Tk1b1t5qq5JEzdeP64D0sW09pjEQ8b6U0OJxJ2pnKjxyYn0kEnE2eMQ==} '@libp2p/mplex@11.0.32': - resolution: - { - integrity: sha512-91YZkr7N66pdrUDjX7KhevrafWt1ILY/jG5OlCX3RNNIOeguGxmNgdTF8o41JoK660lnI3OCCAN9mSE5cLLzGg==, - } + resolution: {integrity: sha512-91YZkr7N66pdrUDjX7KhevrafWt1ILY/jG5OlCX3RNNIOeguGxmNgdTF8o41JoK660lnI3OCCAN9mSE5cLLzGg==} '@libp2p/multistream-select@6.0.20': - resolution: - { - integrity: sha512-DHObPodBZXNUFiMzMX0KSnkbDM6am4G8GfkfYPpmx+yuleuutiJrmN95Xt9ximhn9m+YtEZWB2Je8+Lb0bwIYQ==, - } + resolution: {integrity: sha512-DHObPodBZXNUFiMzMX0KSnkbDM6am4G8GfkfYPpmx+yuleuutiJrmN95Xt9ximhn9m+YtEZWB2Je8+Lb0bwIYQ==} '@libp2p/peer-collections@6.0.25': - resolution: - { - integrity: sha512-sU6mjwANQvVPgTgslRZvxZ6cYzQJ66QmNHm6mrM0cx03Yf1heWnvL28N/P781nGsUjo1cJD7xB5ctAGk6A/lXw==, - } + resolution: {integrity: sha512-sU6mjwANQvVPgTgslRZvxZ6cYzQJ66QmNHm6mrM0cx03Yf1heWnvL28N/P781nGsUjo1cJD7xB5ctAGk6A/lXw==} '@libp2p/peer-id@5.1.0': - resolution: - { - integrity: sha512-9Xob9DDg1uBboM2QvJ5nyPbsjxsNS9obmGAYeAtLSx5aHAIC4AweJQFHssUUCfW7mufkzX/s3zyR62XPR4SYyQ==, - } + resolution: {integrity: sha512-9Xob9DDg1uBboM2QvJ5nyPbsjxsNS9obmGAYeAtLSx5aHAIC4AweJQFHssUUCfW7mufkzX/s3zyR62XPR4SYyQ==} '@libp2p/peer-record@8.0.25': - resolution: - { - integrity: sha512-IFuAhxzMS/NlXZS7+vn7tTJY32ODtKN/aFBRd1wekAw5DebGtvqkt9mN3UbeXJPesu9w87e4Q8GSarD0URXRlw==, - } + resolution: {integrity: sha512-IFuAhxzMS/NlXZS7+vn7tTJY32ODtKN/aFBRd1wekAw5DebGtvqkt9mN3UbeXJPesu9w87e4Q8GSarD0URXRlw==} '@libp2p/peer-store@11.1.2': - resolution: - { - integrity: sha512-2egfDs6j+uvreBrzChf5xwNe0kQgYhuaOBx3rVgCAHxuJyXK6/lK+PpEH3Cfgad+if388mII58MU5gzpbawsaw==, - } + resolution: {integrity: sha512-2egfDs6j+uvreBrzChf5xwNe0kQgYhuaOBx3rVgCAHxuJyXK6/lK+PpEH3Cfgad+if388mII58MU5gzpbawsaw==} '@libp2p/ping@2.0.27': - resolution: - { - integrity: sha512-UwkiEJkdKY/4ncwLxMeo1A0DMXMFPTOE39qFovIkEVZI+hLmwMGo9d6kaEVaNL7lyCPFvZmT28RAyK2wOqVZQg==, - } + resolution: {integrity: sha512-UwkiEJkdKY/4ncwLxMeo1A0DMXMFPTOE39qFovIkEVZI+hLmwMGo9d6kaEVaNL7lyCPFvZmT28RAyK2wOqVZQg==} '@libp2p/pubsub@10.1.8': - resolution: - { - integrity: sha512-y73boBSCWhykhAA21Rve6CFZaCw7qoDIUffbXz9elOlnOIr7M+1kS2fO6yamwWe5EWLZzGLq315JHeaOtWrugw==, - } + resolution: {integrity: sha512-y73boBSCWhykhAA21Rve6CFZaCw7qoDIUffbXz9elOlnOIr7M+1kS2fO6yamwWe5EWLZzGLq315JHeaOtWrugw==} '@libp2p/record@4.0.5': - resolution: - { - integrity: sha512-HfKugY+ZKizhxE/hbLqI8zcFLfYly2gakaL0k8wBXCfmOTrAV7UajeJWkWqrKkIEMHASUyapm746KF+i9e7Xmw==, - } + resolution: {integrity: sha512-HfKugY+ZKizhxE/hbLqI8zcFLfYly2gakaL0k8wBXCfmOTrAV7UajeJWkWqrKkIEMHASUyapm746KF+i9e7Xmw==} '@libp2p/tcp@10.1.8': - resolution: - { - integrity: sha512-O146gLsAKDD7Fp6MaaLREmWgp0nP2ju5TGKy5WThi8iKFFQ4mLWWb2QY8BFV1Drk6E/6boSgaDz1swqKypYAvA==, - } + resolution: {integrity: sha512-O146gLsAKDD7Fp6MaaLREmWgp0nP2ju5TGKy5WThi8iKFFQ4mLWWb2QY8BFV1Drk6E/6boSgaDz1swqKypYAvA==} '@libp2p/tls@2.1.1': - resolution: - { - integrity: sha512-BTkjDijVyatb1qjTtTZfYbt9778nwqst+ZayWMWW6B5tJQgVz8cW8DXeVtMPuGWyO79KHmMao43jE866PYsuRg==, - } + resolution: {integrity: sha512-BTkjDijVyatb1qjTtTZfYbt9778nwqst+ZayWMWW6B5tJQgVz8cW8DXeVtMPuGWyO79KHmMao43jE866PYsuRg==} '@libp2p/upnp-nat@3.1.11': - resolution: - { - integrity: sha512-rI1unUh7dz6TSOw7M94tv31f74sMQ+wY974yt0m6RIgMzNOSO0L6YhYCxdFLO39Ybf+Pxw0RKdvZBvokxBZoEw==, - } + resolution: {integrity: sha512-rI1unUh7dz6TSOw7M94tv31f74sMQ+wY974yt0m6RIgMzNOSO0L6YhYCxdFLO39Ybf+Pxw0RKdvZBvokxBZoEw==} '@libp2p/utils@6.6.0': - resolution: - { - integrity: sha512-QjS1+r+jInOxULjdATBc1N/gorUWUoJqEKxpqTcB2wOwCipzB58RYR3n3QPeoRHj1mVMhZujE1dTbmK/Nafhqg==, - } + resolution: {integrity: sha512-QjS1+r+jInOxULjdATBc1N/gorUWUoJqEKxpqTcB2wOwCipzB58RYR3n3QPeoRHj1mVMhZujE1dTbmK/Nafhqg==} '@libp2p/webrtc@5.2.9': - resolution: - { - integrity: sha512-+klNGfjTw2E0AovQl8/TnkMoMtPiSqy9uA7wOrWpwY8xc1NcaG0xo89b4WwvjVGMQdcti/gFGqQIJqU0wBkmew==, - } + resolution: {integrity: sha512-+klNGfjTw2E0AovQl8/TnkMoMtPiSqy9uA7wOrWpwY8xc1NcaG0xo89b4WwvjVGMQdcti/gFGqQIJqU0wBkmew==} '@libp2p/websockets@9.2.8': - resolution: - { - integrity: sha512-G4hOu3KDESFfNEvhLpGA0Dan8wRq7s5MtXfbCBnlSgbsWR3qZhQs6WdGaRd3T6Y038tGjmgKNJ3NS8+CbklwKw==, - } + resolution: {integrity: sha512-G4hOu3KDESFfNEvhLpGA0Dan8wRq7s5MtXfbCBnlSgbsWR3qZhQs6WdGaRd3T6Y038tGjmgKNJ3NS8+CbklwKw==} '@multiformats/dns@1.0.6': - resolution: - { - integrity: sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==, - } + resolution: {integrity: sha512-nt/5UqjMPtyvkG9BQYdJ4GfLK3nMqGpFZOzf4hAmIa0sJh2LlS9YKXZ4FgwBDsaHvzZqR/rUFIywIc7pkHNNuw==} '@multiformats/mafmt@12.1.6': - resolution: - { - integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==, - } + resolution: {integrity: sha512-tlJRfL21X+AKn9b5i5VnaTD6bNttpSpcqwKVmDmSHLwxoz97fAHaepqFOk/l1fIu94nImIXneNbhsJx/RQNIww==} '@multiformats/multiaddr-matcher@1.7.0': - resolution: - { - integrity: sha512-WfobrJy7XLaYL7PQ3IcFoXdGN5jmdv5FsuKQkZIIreC1pSR4Q9PSOWu2ULxP/M2JT738Xny0PFoCke0ENbyfww==, - } + resolution: {integrity: sha512-WfobrJy7XLaYL7PQ3IcFoXdGN5jmdv5FsuKQkZIIreC1pSR4Q9PSOWu2ULxP/M2JT738Xny0PFoCke0ENbyfww==} '@multiformats/multiaddr-to-uri@11.0.0': - resolution: - { - integrity: sha512-9RNmlIGwZbBLsHekT50dbt4o4u8Iciw9kGjv+WHiGxQdsJ6xKKjU1+C0Vbas6RilMbaVOAOnEyfNcXbUmTkLxQ==, - } + resolution: {integrity: sha512-9RNmlIGwZbBLsHekT50dbt4o4u8Iciw9kGjv+WHiGxQdsJ6xKKjU1+C0Vbas6RilMbaVOAOnEyfNcXbUmTkLxQ==} '@multiformats/multiaddr@12.4.0': - resolution: - { - integrity: sha512-FL7yBTLijJ5JkO044BGb2msf+uJLrwpD6jD6TkXlbjA9N12+18HT40jvd4o5vL4LOJMc86dPX6tGtk/uI9kYKg==, - } + resolution: {integrity: sha512-FL7yBTLijJ5JkO044BGb2msf+uJLrwpD6jD6TkXlbjA9N12+18HT40jvd4o5vL4LOJMc86dPX6tGtk/uI9kYKg==} '@multiformats/murmur3@2.1.8': - resolution: - { - integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} '@multiformats/uri-to-multiaddr@8.1.0': - resolution: - { - integrity: sha512-NHFqdKEwJ0A6JDXzC645Lgyw72zWhbM1QfaaD00ZYRrNvtx64p1bD9aIrWZIhLWZN87/lsV4QkJSNRF3Fd3ryw==, - } + resolution: {integrity: sha512-NHFqdKEwJ0A6JDXzC645Lgyw72zWhbM1QfaaD00ZYRrNvtx64p1bD9aIrWZIhLWZN87/lsV4QkJSNRF3Fd3ryw==} + + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} '@noble/ciphers@1.2.1': - resolution: - { - integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==, - } - engines: { node: ^14.21.3 || >=16 } + resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + engines: {node: ^14.21.3 || >=16} '@noble/curves@1.8.1': - resolution: - { - integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==, - } - engines: { node: ^14.21.3 || >=16 } + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.7.1': - resolution: - { - integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==, - } - engines: { node: ^14.21.3 || >=16 } + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@orbitdb/core-types@1.0.14': - resolution: - { - integrity: sha512-Mq+o9zMw8n1kD3eMOQZZ/XG9TnQ8HqUInmduBfMidPXFSQVrvVtTAxyFpHk+2+FMf6BTj1xhrAUCEZlcvYebeQ==, - } + resolution: {integrity: sha512-Mq+o9zMw8n1kD3eMOQZZ/XG9TnQ8HqUInmduBfMidPXFSQVrvVtTAxyFpHk+2+FMf6BTj1xhrAUCEZlcvYebeQ==} '@orbitdb/core@2.5.0': - resolution: - { - integrity: sha512-RE+te/z8MCLhkawby2j9J0T0hH8Mi9BgTUATWd99ih/cyU9OTbbXVuY64A64bdAQ4EZkfJ+OjO9vAMhJHwgnew==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-RE+te/z8MCLhkawby2j9J0T0hH8Mi9BgTUATWd99ih/cyU9OTbbXVuY64A64bdAQ4EZkfJ+OjO9vAMhJHwgnew==} + engines: {node: '>=20.0.0'} '@orbitdb/feed-db@1.1.2': - resolution: - { - integrity: sha512-o+9SBiVWdbvBWQyGRXUajTq75uDQqRzLafbn2dGMshsU8ibWAllxpOhHXojaDyJRUGXxjt25LkbLFQGQQGiBEQ==, - } + resolution: {integrity: sha512-o+9SBiVWdbvBWQyGRXUajTq75uDQqRzLafbn2dGMshsU8ibWAllxpOhHXojaDyJRUGXxjt25LkbLFQGQQGiBEQ==} '@peculiar/asn1-cms@2.3.15': - resolution: - { - integrity: sha512-B+DoudF+TCrxoJSTjjcY8Mmu+lbv8e7pXGWrhNp2/EGJp9EEcpzjBCar7puU57sGifyzaRVM03oD5L7t7PghQg==, - } + resolution: {integrity: sha512-B+DoudF+TCrxoJSTjjcY8Mmu+lbv8e7pXGWrhNp2/EGJp9EEcpzjBCar7puU57sGifyzaRVM03oD5L7t7PghQg==} '@peculiar/asn1-csr@2.3.15': - resolution: - { - integrity: sha512-caxAOrvw2hUZpxzhz8Kp8iBYKsHbGXZPl2KYRMIPvAfFateRebS3136+orUpcVwHRmpXWX2kzpb6COlIrqCumA==, - } + resolution: {integrity: sha512-caxAOrvw2hUZpxzhz8Kp8iBYKsHbGXZPl2KYRMIPvAfFateRebS3136+orUpcVwHRmpXWX2kzpb6COlIrqCumA==} '@peculiar/asn1-ecc@2.3.15': - resolution: - { - integrity: sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA==, - } + resolution: {integrity: sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA==} '@peculiar/asn1-pfx@2.3.15': - resolution: - { - integrity: sha512-E3kzQe3J2xV9DP6SJS4X6/N1e4cYa2xOAK46VtvpaRk8jlheNri8v0rBezKFVPB1rz/jW8npO+u1xOvpATFMWg==, - } + resolution: {integrity: sha512-E3kzQe3J2xV9DP6SJS4X6/N1e4cYa2xOAK46VtvpaRk8jlheNri8v0rBezKFVPB1rz/jW8npO+u1xOvpATFMWg==} '@peculiar/asn1-pkcs8@2.3.15': - resolution: - { - integrity: sha512-/PuQj2BIAw1/v76DV1LUOA6YOqh/UvptKLJHtec/DQwruXOCFlUo7k6llegn8N5BTeZTWMwz5EXruBw0Q10TMg==, - } + resolution: {integrity: sha512-/PuQj2BIAw1/v76DV1LUOA6YOqh/UvptKLJHtec/DQwruXOCFlUo7k6llegn8N5BTeZTWMwz5EXruBw0Q10TMg==} '@peculiar/asn1-pkcs9@2.3.15': - resolution: - { - integrity: sha512-yiZo/1EGvU1KiQUrbcnaPGWc0C7ElMMskWn7+kHsCFm+/9fU0+V1D/3a5oG0Jpy96iaXggQpA9tzdhnYDgjyFg==, - } + resolution: {integrity: sha512-yiZo/1EGvU1KiQUrbcnaPGWc0C7ElMMskWn7+kHsCFm+/9fU0+V1D/3a5oG0Jpy96iaXggQpA9tzdhnYDgjyFg==} '@peculiar/asn1-rsa@2.3.15': - resolution: - { - integrity: sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg==, - } + resolution: {integrity: sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg==} '@peculiar/asn1-schema@2.3.15': - resolution: - { - integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==, - } + resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} '@peculiar/asn1-x509-attr@2.3.15': - resolution: - { - integrity: sha512-TWJVJhqc+IS4MTEML3l6W1b0sMowVqdsnI4dnojg96LvTuP8dga9f76fjP07MUuss60uSyT2ckoti/2qHXA10A==, - } + resolution: {integrity: sha512-TWJVJhqc+IS4MTEML3l6W1b0sMowVqdsnI4dnojg96LvTuP8dga9f76fjP07MUuss60uSyT2ckoti/2qHXA10A==} '@peculiar/asn1-x509@2.3.15': - resolution: - { - integrity: sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg==, - } + resolution: {integrity: sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg==} '@peculiar/json-schema@1.1.12': - resolution: - { - integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} '@peculiar/webcrypto@1.5.0': - resolution: - { - integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==, - } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==} + engines: {node: '>=10.12.0'} '@peculiar/x509@1.12.3': - resolution: - { - integrity: sha512-+Mzq+W7cNEKfkNZzyLl6A6ffqc3r21HGZUezgfKxpZrkORfOqgRXnS80Zu0IV6a9Ue9QBJeKD7kN0iWfc3bhRQ==, - } + resolution: {integrity: sha512-+Mzq+W7cNEKfkNZzyLl6A6ffqc3r21HGZUezgfKxpZrkORfOqgRXnS80Zu0IV6a9Ue9QBJeKD7kN0iWfc3bhRQ==} '@pkgjs/parseargs@0.11.0': - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} '@pkgr/core@0.2.1': - resolution: - { - integrity: sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@react-native/assets-registry@0.78.1': - resolution: - { - integrity: sha512-SegfYQFuut05EQIQIVB/6QMGaxJ29jEtPmzFWJdIp/yc2mmhIq7MfWRjwOe6qbONzIdp6Ca8p835hiGiAGyeKQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-SegfYQFuut05EQIQIVB/6QMGaxJ29jEtPmzFWJdIp/yc2mmhIq7MfWRjwOe6qbONzIdp6Ca8p835hiGiAGyeKQ==} + engines: {node: '>=18'} '@react-native/babel-plugin-codegen@0.78.1': - resolution: - { - integrity: sha512-rD0tnct/yPEtoOc8eeFHIf8ZJJJEzLkmqLs8HZWSkt3w9VYWngqLXZxiDGqv0ngXjunAlC/Hpq+ULMVOvOnByw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-rD0tnct/yPEtoOc8eeFHIf8ZJJJEzLkmqLs8HZWSkt3w9VYWngqLXZxiDGqv0ngXjunAlC/Hpq+ULMVOvOnByw==} + engines: {node: '>=18'} '@react-native/babel-preset@0.78.1': - resolution: - { - integrity: sha512-yTVcHmEdNQH4Ju7lhvbiQaGxBpMcalgkBy/IvHowXKk/ex3nY1PolF16/mBG1BrefcUA/rtJpqTtk2Ii+7T/Lw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-yTVcHmEdNQH4Ju7lhvbiQaGxBpMcalgkBy/IvHowXKk/ex3nY1PolF16/mBG1BrefcUA/rtJpqTtk2Ii+7T/Lw==} + engines: {node: '>=18'} peerDependencies: '@babel/core': '*' '@react-native/codegen@0.78.1': - resolution: - { - integrity: sha512-kGG5qAM9JdFtxzUwe7c6CyJbsU2PnaTrtCHA2dF8VEiNX1K3yd9yKPzfkxA7HPvmHoAn3ga1941O79BStWcM3A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-kGG5qAM9JdFtxzUwe7c6CyJbsU2PnaTrtCHA2dF8VEiNX1K3yd9yKPzfkxA7HPvmHoAn3ga1941O79BStWcM3A==} + engines: {node: '>=18'} peerDependencies: '@babel/preset-env': ^7.1.6 '@react-native/community-cli-plugin@0.78.1': - resolution: - { - integrity: sha512-S6vF4oWpFqThpt/dBLrqLQw5ED2M1kg5mVtiL6ZqpoYIg+/e0vg7LZ8EXNbcdMDH4obRnm2xbOd+qlC7mOzNBg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-S6vF4oWpFqThpt/dBLrqLQw5ED2M1kg5mVtiL6ZqpoYIg+/e0vg7LZ8EXNbcdMDH4obRnm2xbOd+qlC7mOzNBg==} + engines: {node: '>=18'} peerDependencies: '@react-native-community/cli': '*' peerDependenciesMeta: @@ -1942,54 +1413,33 @@ packages: optional: true '@react-native/debugger-frontend@0.78.1': - resolution: - { - integrity: sha512-xev/B++QLxSDpEBWsc74GyCuq9XOHYTBwcGSpsuhOJDUha6WZIbEEvZe3LpVW+OiFso4oGIdnVSQntwippZdWw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-xev/B++QLxSDpEBWsc74GyCuq9XOHYTBwcGSpsuhOJDUha6WZIbEEvZe3LpVW+OiFso4oGIdnVSQntwippZdWw==} + engines: {node: '>=18'} '@react-native/dev-middleware@0.78.1': - resolution: - { - integrity: sha512-l8p7/dXa1vWPOdj0iuACkex8lgbLpYyPZ3QXGkocMcpl0bQ24K7hf3Bj02tfptP5PAm16b2RuEi04sjIGHUzzg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-l8p7/dXa1vWPOdj0iuACkex8lgbLpYyPZ3QXGkocMcpl0bQ24K7hf3Bj02tfptP5PAm16b2RuEi04sjIGHUzzg==} + engines: {node: '>=18'} '@react-native/gradle-plugin@0.78.1': - resolution: - { - integrity: sha512-v8GJU+8DzQDWO3iuTFI1nbuQ/kzuqbXv07VVtSIMLbdofHzuuQT14DGBacBkrIDKBDTVaBGAc/baDNsyxCghng==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-v8GJU+8DzQDWO3iuTFI1nbuQ/kzuqbXv07VVtSIMLbdofHzuuQT14DGBacBkrIDKBDTVaBGAc/baDNsyxCghng==} + engines: {node: '>=18'} '@react-native/js-polyfills@0.78.1': - resolution: - { - integrity: sha512-Ogcv4QOA1o3IyErrf/i4cDnP+nfNcIfGTgw6iNQyAPry1xjPOz4ziajskLpWG/3ADeneIZuyZppKB4A28rZSvg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Ogcv4QOA1o3IyErrf/i4cDnP+nfNcIfGTgw6iNQyAPry1xjPOz4ziajskLpWG/3ADeneIZuyZppKB4A28rZSvg==} + engines: {node: '>=18'} '@react-native/metro-babel-transformer@0.78.1': - resolution: - { - integrity: sha512-jQWf69D+QTMvSZSWLR+cr3VUF16rGB6sbD+bItD8Czdfn3hajzfMoHJTkVFP7991cjK5sIVekNiQIObou8JSQw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-jQWf69D+QTMvSZSWLR+cr3VUF16rGB6sbD+bItD8Czdfn3hajzfMoHJTkVFP7991cjK5sIVekNiQIObou8JSQw==} + engines: {node: '>=18'} peerDependencies: '@babel/core': '*' '@react-native/normalize-colors@0.78.1': - resolution: - { - integrity: sha512-h4wARnY4iBFgigN1NjnaKFtcegWwQyE9+CEBVG4nHmwMtr8lZBmc7ZKIM6hUc6lxqY/ugHg48aSQSynss7mJUg==, - } + resolution: {integrity: sha512-h4wARnY4iBFgigN1NjnaKFtcegWwQyE9+CEBVG4nHmwMtr8lZBmc7ZKIM6hUc6lxqY/ugHg48aSQSynss7mJUg==} '@react-native/virtualized-lists@0.78.1': - resolution: - { - integrity: sha512-v0jqDNMFXpnRnSlkDVvwNxXgPhifzzTFlxTSnHj9erKJsKpE26gSU5qB4hmJkEsscLG/ygdJ1c88aqinSh/wRA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-v0jqDNMFXpnRnSlkDVvwNxXgPhifzzTFlxTSnHj9erKJsKpE26gSU5qB4hmJkEsscLG/ygdJ1c88aqinSh/wRA==} + engines: {node: '>=18'} peerDependencies: '@types/react': ^19.0.0 react: '*' @@ -1999,1022 +1449,719 @@ packages: optional: true '@sinclair/typebox@0.27.8': - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinclair/typebox@0.34.35': + resolution: {integrity: sha512-C6ypdODf2VZkgRT6sFM8E1F8vR+HcffniX0Kp8MsU8PIfrlXbNCBz0jzj17GjdmjTx1OtZzdH8+iALL21UjF5A==} '@sindresorhus/fnv1a@3.1.0': - resolution: - { - integrity: sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-KV321z5m/0nuAg83W1dPLy85HpHDk7Sdi4fJbwvacWsEhAh+rZUW4ZfGcXmUIvjZg4ss2bcwNlRhJ7GBEUG08w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} '@sinonjs/commons@3.0.1': - resolution: - { - integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==, - } + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': - resolution: - { - integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, - } + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} '@topoconfig/extends@0.16.2': - resolution: - { - integrity: sha512-sTF+qpWakr5jf1Hn/kkFSi833xPW15s/loMAiKSYSSVv4vDonxf6hwCGzMXjLq+7HZoaK6BgaV72wXr1eY7FcQ==, - } + resolution: {integrity: sha512-sTF+qpWakr5jf1Hn/kkFSi833xPW15s/loMAiKSYSSVv4vDonxf6hwCGzMXjLq+7HZoaK6BgaV72wXr1eY7FcQ==} hasBin: true + '@tybys/wasm-util@0.9.0': + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@types/babel__core@7.20.5': - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} '@types/babel__generator@7.27.0': - resolution: - { - integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, - } + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.20.7': - resolution: - { - integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==, - } + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} '@types/body-parser@1.19.5': - resolution: - { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, - } + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} '@types/connect@3.4.38': - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/dns-packet@5.6.5': - resolution: - { - integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==, - } + resolution: {integrity: sha512-qXOC7XLOEe43ehtWJCMnQXvgcIpv6rPmQ1jXT98Ad8A3TB1Ue50jsCbSSSyuazScEuZ/Q026vHbrOTVkmwA+7Q==} '@types/estree@1.0.7': - resolution: - { - integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==, - } + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/express-serve-static-core@5.0.6': - resolution: - { - integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==, - } + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} '@types/express@5.0.1': - resolution: - { - integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==, - } + resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} '@types/graceful-fs@4.1.9': - resolution: - { - integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, - } + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} '@types/http-errors@2.0.4': - resolution: - { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, - } + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} '@types/istanbul-lib-coverage@2.0.6': - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - } + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} '@types/istanbul-lib-report@3.0.3': - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - } + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} '@types/istanbul-reports@3.0.4': - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - } + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/json-schema@7.0.15': - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/mime@1.3.5': - resolution: - { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, - } + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} '@types/multicast-dns@7.2.4': - resolution: - { - integrity: sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==, - } + resolution: {integrity: sha512-ib5K4cIDR4Ro5SR3Sx/LROkMDa0BHz0OPaCBL/OSPDsAXEGZ3/KQeS6poBKYVN7BfjXDL9lWNwzyHVgt/wkyCw==} '@types/node-forge@1.3.11': - resolution: - { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, - } + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} '@types/node@22.13.16': - resolution: - { - integrity: sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==, - } + resolution: {integrity: sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==} '@types/node@22.14.0': - resolution: - { - integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==, - } + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} '@types/qs@6.9.18': - resolution: - { - integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==, - } + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} '@types/range-parser@1.2.7': - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} '@types/retry@0.12.2': - resolution: - { - integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==, - } + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} '@types/send@0.17.4': - resolution: - { - integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, - } + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} '@types/serve-static@1.15.7': - resolution: - { - integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, - } + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/sinon@17.0.4': - resolution: - { - integrity: sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==, - } + resolution: {integrity: sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==} '@types/sinonjs__fake-timers@8.1.5': - resolution: - { - integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==, - } + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} '@types/stack-utils@2.0.3': - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - } + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/triple-beam@1.3.5': - resolution: - { - integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==, - } + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} '@types/ws@8.18.1': - resolution: - { - integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==, - } + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@types/yargs-parser@21.0.3': - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} '@types/yargs@17.0.33': - resolution: - { - integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==, - } + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@typescript-eslint/eslint-plugin@8.29.0': - resolution: - { - integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/parser@8.29.0': - resolution: - { - integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.29.0': - resolution: - { - integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.29.0': - resolution: - { - integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.29.0': - resolution: - { - integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.29.0': - resolution: - { - integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@8.29.0': - resolution: - { - integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@8.29.0': - resolution: - { - integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@unrs/resolver-binding-android-arm-eabi@1.9.0': + resolution: {integrity: sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.9.0': + resolution: {integrity: sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.9.0': + resolution: {integrity: sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.9.0': + resolution: {integrity: sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.9.0': + resolution: {integrity: sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + resolution: {integrity: sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + resolution: {integrity: sha512-uT6E7UBIrTdCsFQ+y0tQd3g5oudmrS/hds5pbU3h4s2t/1vsGWbbSKhBSCD9mcqaqkBwoqlECpUrRJCmldl8PA==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + resolution: {integrity: sha512-vdqBh911wc5awE2bX2zx3eflbyv8U9xbE/jVKAm425eRoOVv/VseGZsqi3A3SykckSpF4wSROkbQPvbQFn8EsA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + resolution: {integrity: sha512-/8JFZ/SnuDr1lLEVsxsuVwrsGquTvT51RZGvyDB/dOK3oYK2UqeXzgeyq6Otp8FZXQcEYqJwxb9v+gtdXn03eQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + resolution: {integrity: sha512-FkJjybtrl+rajTw4loI3L6YqSOpeZfDls4SstL/5lsP2bka9TiHUjgMBjygeZEis1oC8LfJTS8FSgpKPaQx2tQ==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + resolution: {integrity: sha512-w/NZfHNeDusbqSZ8r/hp8iL4S39h4+vQMc9/vvzuIKMWKppyUGKm3IST0Qv0aOZ1rzIbl9SrDeIqK86ZpUK37w==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + resolution: {integrity: sha512-bEPBosut8/8KQbUixPry8zg/fOzVOWyvwzOfz0C0Rw6dp+wIBseyiHKjkcSyZKv/98edrbMknBaMNJfA/UEdqw==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + resolution: {integrity: sha512-LDtMT7moE3gK753gG4pc31AAqGUC86j3AplaFusc717EUGF9ZFJ356sdQzzZzkBk1XzMdxFyZ4f/i35NKM/lFA==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + resolution: {integrity: sha512-WmFd5KINHIXj8o1mPaT8QRjA9HgSXhN1gl9Da4IZihARihEnOylu4co7i/yeaIpcfsI6sYs33cNZKyHYDh0lrA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.9.0': + resolution: {integrity: sha512-CYuXbANW+WgzVRIl8/QvZmDaZxrqvOldOwlbUjIM4pQ46FJ0W5cinJ/Ghwa/Ng1ZPMJMk1VFdsD/XwmCGIXBWg==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.9.0': + resolution: {integrity: sha512-6Rp2WH0OoitMYR57Z6VE8Y6corX8C6QEMWLgOV6qXiJIeZ1F9WGXY/yQ8yDC4iTraotyLOeJ2Asea0urWj2fKQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + resolution: {integrity: sha512-rknkrTRuvujprrbPmGeHi8wYWxmNVlBoNW8+4XF2hXUnASOjmuC9FNF1tGbDiRQWn264q9U/oGtixyO3BT8adQ==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + resolution: {integrity: sha512-Ceymm+iBl+bgAICtgiHyMLz6hjxmLJKqBim8tDzpX61wpZOx2bPK6Gjuor7I2RiUynVjvvkoRIkrPyMwzBzF3A==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + resolution: {integrity: sha512-k59o9ZyeyS0hAlcaKFezYSH2agQeRFEB7KoQLXl3Nb3rgkqT1NY9Vwy+SqODiLmYnEjxWJVRE/yq2jFVqdIxZw==} + cpu: [x64] + os: [win32] abort-controller@3.0.0: - resolution: - { - integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, - } - engines: { node: '>=6.5' } + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} abort-error@1.0.1: - resolution: - { - integrity: sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==, - } + resolution: {integrity: sha512-fxqCblJiIPdSXIUrxI0PL+eJG49QdP9SQ70qtB65MVAoMr2rASlOyAbJFOylfB467F/f+5BCLJJq58RYi7mGfg==} abstract-level@1.0.4: - resolution: - { - integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} + engines: {node: '>=12'} accepts@1.3.8: - resolution: - { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} accepts@2.0.0: - resolution: - { - integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} acme-client@5.4.0: - resolution: - { - integrity: sha512-mORqg60S8iML6XSmVjqjGHJkINrCGLMj2QvDmFzI9vIlv1RGlyjmw3nrzaINJjkNsYXC41XhhD5pfy7CtuGcbA==, - } - engines: { node: '>= 16' } + resolution: {integrity: sha512-mORqg60S8iML6XSmVjqjGHJkINrCGLMj2QvDmFzI9vIlv1RGlyjmw3nrzaINJjkNsYXC41XhhD5pfy7CtuGcbA==} + engines: {node: '>= 16'} acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.14.1: - resolution: - { - integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} hasBin: true agent-base@7.1.3: - resolution: - { - integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} anser@1.4.10: - resolution: - { - integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==, - } + resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} ansi-escapes@7.0.0: - resolution: - { - integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.1.0: - resolution: - { - integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansi-styles@6.2.1: - resolution: - { - integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} any-signal@4.1.1: - resolution: - { - integrity: sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-iADenERppdC+A2YKbOXXB2WUeABLaM6qnpZ70kZbPZ1cZMMJ7eF+3CaYm+/PhBizgkzlvssC7QuHS30oOiQYWA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} asn1js@3.0.6: - resolution: - { - integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} + engines: {node: '>=12.0.0'} ast-types@0.16.1: - resolution: - { - integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} async-limiter@1.0.1: - resolution: - { - integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==, - } + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} axios@1.8.4: - resolution: - { - integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==, - } + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} babel-jest@29.7.0: - resolution: - { - integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 + babel-jest@30.0.1: + resolution: {integrity: sha512-JlqAR53kHcRkLUpxvLYzUdo/Zn5HYPtheVMpSh+JQQppC9TYjkXoEt/PGUT86L3t7lNZLH83Wa+wziYVARYWXQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + babel-plugin-istanbul@6.1.1: - resolution: - { - integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-istanbul@7.0.0: + resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} + engines: {node: '>=12'} babel-plugin-jest-hoist@29.6.3: - resolution: - { - integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-plugin-jest-hoist@30.0.1: + resolution: {integrity: sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-plugin-polyfill-corejs2@0.4.13: - resolution: - { - integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==, - } + resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-corejs3@0.11.1: - resolution: - { - integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==, - } + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-polyfill-regenerator@0.6.4: - resolution: - { - integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==, - } + resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 babel-plugin-syntax-hermes-parser@0.25.1: - resolution: - { - integrity: sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==, - } + resolution: {integrity: sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==} babel-plugin-transform-flow-enums@0.0.2: - resolution: - { - integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==, - } + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} babel-preset-current-node-syntax@1.1.0: - resolution: - { - integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==, - } + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 babel-preset-jest@29.6.3: - resolution: - { - integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 + babel-preset-jest@30.0.1: + resolution: {integrity: sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} bl@5.1.0: - resolution: - { - integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==, - } + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} blockstore-core@5.0.2: - resolution: - { - integrity: sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q==, - } + resolution: {integrity: sha512-y7/BHdYLO3YCpJMg6Ue7b4Oz4FT1HWSZoHHdlsaJTsvoE8XieXb6kUCB9UkkUBDw2x4neRDwlgYBpyK77+Ro2Q==} blockstore-fs@2.0.2: - resolution: - { - integrity: sha512-g4l4cJZqcLGPD+iOSb9DYWClAiSSGKsN7V13PTZYqQFHeg96phG15jNi9ql3urrlVC/OTzPB95FXK+GP0TX8Tw==, - } + resolution: {integrity: sha512-g4l4cJZqcLGPD+iOSb9DYWClAiSSGKsN7V13PTZYqQFHeg96phG15jNi9ql3urrlVC/OTzPB95FXK+GP0TX8Tw==} body-parser@2.2.0: - resolution: - { - integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} brace-expansion@1.1.11: - resolution: - { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, - } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: - resolution: - { - integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, - } + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} browser-level@1.0.1: - resolution: - { - integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==, - } + resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} browser-readablestream-to-it@2.0.8: - resolution: - { - integrity: sha512-+aDq+8QoTxIklc9m21oVg96Bm18EpeVke4/8vWPNu+9Ktd+G4PYavitE4gv/pjIndw1q+vxE/Rcnv1zYHrEQbQ==, - } + resolution: {integrity: sha512-+aDq+8QoTxIklc9m21oVg96Bm18EpeVke4/8vWPNu+9Ktd+G4PYavitE4gv/pjIndw1q+vxE/Rcnv1zYHrEQbQ==} browserslist@4.24.4: - resolution: - { - integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} buffer@6.0.3: - resolution: - { - integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==, - } + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bound@1.0.4: - resolution: - { - integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} caller-callsite@2.0.0: - resolution: - { - integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} caller-path@2.0.0: - resolution: - { - integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} callsites@2.0.0: - resolution: - { - integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} caniuse-lite@1.0.30001712: - resolution: - { - integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==, - } + resolution: {integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==} catering@2.1.1: - resolution: - { - integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} + engines: {node: '>=6'} cborg@4.2.9: - resolution: - { - integrity: sha512-HG8GprGhfzkbzDAIQApqYcN1BJAyf8vDQbzclAwaqrm3ATFnB7ygiWLr+YID+GBdfTJ+yHtzPi06218xULpZrg==, - } + resolution: {integrity: sha512-HG8GprGhfzkbzDAIQApqYcN1BJAyf8vDQbzclAwaqrm3ATFnB7ygiWLr+YID+GBdfTJ+yHtzPi06218xULpZrg==} hasBin: true chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} chalk@5.4.1: - resolution: - { - integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==, - } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} chownr@1.1.4: - resolution: - { - integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, - } + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} chrome-launcher@0.15.2: - resolution: - { - integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==, - } - engines: { node: '>=12.13.0' } + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} hasBin: true chromium-edge-launcher@0.2.0: - resolution: - { - integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==, - } + resolution: {integrity: sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==} ci-info@2.0.0: - resolution: - { - integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==, - } + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} + engines: {node: '>=8'} + + cjs-module-lexer@2.1.0: + resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} classic-level@1.4.1: - resolution: - { - integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==} + engines: {node: '>=12'} cli-cursor@5.0.0: - resolution: - { - integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} cli-truncate@4.0.0: - resolution: - { - integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} clone-regexp@3.0.0: - resolution: - { - integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==} + engines: {node: '>=12'} clone@2.1.2: - resolution: - { - integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-string@1.9.1: - resolution: - { - integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, - } + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} color@3.2.1: - resolution: - { - integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, - } + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} colorspace@1.1.4: - resolution: - { - integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==, - } + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} commander@12.1.0: - resolution: - { - integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} commander@13.1.0: - resolution: - { - integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} connect@3.7.0: - resolution: - { - integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, - } - engines: { node: '>= 0.10.0' } + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} content-disposition@1.0.0: - resolution: - { - integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} convert-hrtime@5.0.0: - resolution: - { - integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.2.2: - resolution: - { - integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, - } - engines: { node: '>=6.6.0' } + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} cookie@0.7.2: - resolution: - { - integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} core-js-compat@3.41.0: - resolution: - { - integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==, - } + resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} cosmiconfig@5.2.1: - resolution: - { - integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} datastore-core@10.0.2: - resolution: - { - integrity: sha512-B3WXxI54VxJkpXxnYibiF17si3bLXE1XOjrJB7wM5co9fx2KOEkiePDGiCCEtnapFHTnmAnYCPdA7WZTIpdn/A==, - } + resolution: {integrity: sha512-B3WXxI54VxJkpXxnYibiF17si3bLXE1XOjrJB7wM5co9fx2KOEkiePDGiCCEtnapFHTnmAnYCPdA7WZTIpdn/A==} debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3022,11 +2169,8 @@ packages: optional: true debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3034,11 +2178,8 @@ packages: optional: true debug@4.4.0: - resolution: - { - integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -3046,250 +2187,164 @@ packages: optional: true decompress-response@6.0.0: - resolution: - { - integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true deep-extend@0.6.0: - resolution: - { - integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} delay@6.0.0: - resolution: - { - integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==} + engines: {node: '>=16'} delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} denque@2.1.0: - resolution: - { - integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} depseek@0.4.1: - resolution: - { - integrity: sha512-YYfPPajzH9s2qnEva411VJzCMWtArBTfluI9USiKQ+T6xBWFh3C7yPxhaa1KVgJa17v9aRKc+LcRhgxS5/9mOA==, - } + resolution: {integrity: sha512-YYfPPajzH9s2qnEva411VJzCMWtArBTfluI9USiKQ+T6xBWFh3C7yPxhaa1KVgJa17v9aRKc+LcRhgxS5/9mOA==} destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} detect-browser@5.3.0: - resolution: - { - integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==, - } + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} detect-libc@2.0.3: - resolution: - { - integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} dns-packet@5.6.1: - resolution: - { - integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true electron-to-chromium@1.5.134: - resolution: - { - integrity: sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==, - } + resolution: {integrity: sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} emoji-regex@10.4.0: - resolution: - { - integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==, - } + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} enabled@2.0.0: - resolution: - { - integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==, - } + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} end-of-stream@1.4.4: - resolution: - { - integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, - } + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} environment@1.1.0: - resolution: - { - integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} err-code@3.0.1: - resolution: - { - integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==, - } + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} error-ex@1.3.2: - resolution: - { - integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, - } + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} error-stack-parser@2.1.4: - resolution: - { - integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==, - } + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} eslint-config-prettier@10.1.1: - resolution: - { - integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==, - } + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-plugin-prettier@5.2.6: - resolution: - { - integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' @@ -3302,32 +2357,20 @@ packages: optional: true eslint-scope@8.3.0: - resolution: - { - integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.0: - resolution: - { - integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.24.0: - resolution: - { - integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -3336,251 +2379,155 @@ packages: optional: true espree@10.3.0: - resolution: - { - integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} event-iterator@2.0.0: - resolution: - { - integrity: sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==, - } + resolution: {integrity: sha512-KGft0ldl31BZVV//jj+IAIGCxkvvUkkON+ScH6zfoX+l+omX6001ggyRSpI0Io2Hlro0ThXotswCtfzS8UkIiQ==} event-target-shim@5.0.1: - resolution: - { - integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} event-target-shim@6.0.2: - resolution: - { - integrity: sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==} + engines: {node: '>=10.13.0'} eventemitter3@5.0.1: - resolution: - { - integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, - } + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} execa@8.0.1: - resolution: - { - integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, - } - engines: { node: '>=16.17' } + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} expand-template@2.0.3: - resolution: - { - integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expect@30.0.1: + resolution: {integrity: sha512-FLzSqyMY397aV5awKVGWOKrfrzQRxoGAofdTt9ucJ6dSVY+1c6yEfcw/JZ1oqfLnL78FONo9GfVaEb8VJ5irGw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} exponential-backoff@3.1.2: - resolution: - { - integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==, - } + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} express@5.1.0: - resolution: - { - integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: - resolution: - { - integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==, - } + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.19.1: - resolution: - { - integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, - } + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fecha@4.2.3: - resolution: - { - integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==, - } + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} finalhandler@1.1.2: - resolution: - { - integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} finalhandler@2.1.0: - resolution: - { - integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} find-cache-dir@2.1.0: - resolution: - { - integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} find-up@3.0.0: - resolution: - { - integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: - resolution: - { - integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, - } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} flow-enums-runtime@0.0.6: - resolution: - { - integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==, - } + resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} flow-parser@0.266.1: - resolution: - { - integrity: sha512-dON6h+yO7FGa/FO5NQCZuZHN0o3I23Ev6VYOJf9d8LpdrArHPt39wE++LLmueNV/hNY5hgWGIIrgnrDkRcXkPg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-dON6h+yO7FGa/FO5NQCZuZHN0o3I23Ev6VYOJf9d8LpdrArHPt39wE++LLmueNV/hNY5hgWGIIrgnrDkRcXkPg==} + engines: {node: '>=0.4.0'} fn.name@1.1.0: - resolution: - { - integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==, - } + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} follow-redirects@1.15.9: - resolution: - { - integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} peerDependencies: debug: '*' peerDependenciesMeta: @@ -3588,287 +2535,168 @@ packages: optional: true foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} form-data@4.0.2: - resolution: - { - integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} freeport-promise@2.0.0: - resolution: - { - integrity: sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-dwWpT1DdQcwrhmRwnDnPM/ZFny+FtzU+k50qF2eid3KxaQDsMiBrwo1i0G3qSugkN5db6Cb0zgfc68QeTOpEFg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} fresh@2.0.0: - resolution: - { - integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} fs-extra@11.3.0: - resolution: - { - integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==, - } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function-timeout@0.1.1: - resolution: - { - integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==} + engines: {node: '>=14.16'} gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-east-asian-width@1.3.0: - resolution: - { - integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} get-intrinsic@1.3.0: - resolution: - { - integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-iterator@2.0.1: - resolution: - { - integrity: sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==, - } + resolution: {integrity: sha512-7HuY/hebu4gryTDT7O/XY/fvY9wRByEGdK6QOa4of8npTcv0+NS6frFKABcf6S9EBAsveTuKTsZQQBFMMNILIg==} get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} get-port@7.1.0: - resolution: - { - integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} get-stream@8.0.1: - resolution: - { - integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} github-from-package@0.0.0: - resolution: - { - integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, - } + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} glob-parent@6.0.2: - resolution: - { - integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@10.4.5: - resolution: - { - integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, - } + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: - resolution: - { - integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} globals@16.0.0: - resolution: - { - integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: - resolution: - { - integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, - } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} hamt-sharding@3.0.6: - resolution: - { - integrity: sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==, - } + resolution: {integrity: sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} hashlru@2.3.0: - resolution: - { - integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==, - } + resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} helia@5.3.0: - resolution: - { - integrity: sha512-mSM/zQqdoQWUicf90NEcVO1MPSjrzPro5vMe90cKdU0mv10BDk6aJDEImgQlN2x7EsmHCf+hOgmA9K3gZizK4w==, - } + resolution: {integrity: sha512-mSM/zQqdoQWUicf90NEcVO1MPSjrzPro5vMe90cKdU0mv10BDk6aJDEImgQlN2x7EsmHCf+hOgmA9K3gZizK4w==} hermes-estree@0.25.1: - resolution: - { - integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==, - } + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} hermes-parser@0.25.1: - resolution: - { - integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==, - } + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} http-cookie-agent@6.0.8: - resolution: - { - integrity: sha512-qnYh3yLSr2jBsTYkw11elq+T361uKAJaZ2dR4cfYZChw1dt9uL5t3zSUwehoqqVb4oldk1BpkXKm2oat8zV+oA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-qnYh3yLSr2jBsTYkw11elq+T361uKAJaZ2dR4cfYZChw1dt9uL5t3zSUwehoqqVb4oldk1BpkXKm2oat8zV+oA==} + engines: {node: '>=18.0.0'} peerDependencies: tough-cookie: ^4.0.0 || ^5.0.0 undici: ^5.11.0 || ^6.0.0 @@ -3877,628 +2705,505 @@ packages: optional: true http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} human-signals@5.0.0: - resolution: - { - integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, - } - engines: { node: '>=16.17.0' } + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} husky@8.0.3: - resolution: - { - integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} hasBin: true iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} image-size@1.2.1: - resolution: - { - integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==, - } - engines: { node: '>=16.x' } + resolution: {integrity: sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==} + engines: {node: '>=16.x'} hasBin: true import-fresh@2.0.0: - resolution: - { - integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} import-fresh@3.3.1: - resolution: - { - integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + resolution: {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. inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} interface-blockstore@5.3.1: - resolution: - { - integrity: sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw==, - } + resolution: {integrity: sha512-nhgrQnz6yUQEqxTFLhlOBurQOy5lWlwCpgFmZ3GTObTVTQS9RZjK/JTozY6ty9uz2lZs7VFJSqwjWAltorJ4Vw==} interface-datastore@8.3.1: - resolution: - { - integrity: sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ==, - } + resolution: {integrity: sha512-3r0ETmHIi6HmvM5sc09QQiCD3gUfwtEM/AAChOyAd/UAKT69uk8LXfTSUBufbUIO/dU65Vj8nb9O6QjwW8vDSQ==} interface-store@6.0.2: - resolution: - { - integrity: sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA==, - } + resolution: {integrity: sha512-KSFCXtBlNoG0hzwNa0RmhHtrdhzexp+S+UY2s0rWTBJyfdEIgn6i6Zl9otVqrcFYbYrneBT7hbmHQ8gE0C3umA==} invariant@2.2.4: - resolution: - { - integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==, - } + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} ip-regex@5.0.0: - resolution: - { - integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} ipfs-unixfs-exporter@13.6.2: - resolution: - { - integrity: sha512-U3NkQHvQn5XzxtjSo1/GfoFIoXYY4hPgOlZG5RUrV5ScBI222b3jAHbHksXZuMy7sqPkA9ieeWdOmnG1+0nxyw==, - } + resolution: {integrity: sha512-U3NkQHvQn5XzxtjSo1/GfoFIoXYY4hPgOlZG5RUrV5ScBI222b3jAHbHksXZuMy7sqPkA9ieeWdOmnG1+0nxyw==} ipfs-unixfs-importer@15.3.2: - resolution: - { - integrity: sha512-12FqAAAE3YC6AHtYxZ944nDCabmvbNLdhNCVIN5RJIOri82ss62XdX4lsLpex9VvPzDIJyTAsrKJPcwM6hXGdQ==, - } + resolution: {integrity: sha512-12FqAAAE3YC6AHtYxZ944nDCabmvbNLdhNCVIN5RJIOri82ss62XdX4lsLpex9VvPzDIJyTAsrKJPcwM6hXGdQ==} ipfs-unixfs@11.2.1: - resolution: - { - integrity: sha512-gUeeX63EFgiaMgcs0cUs2ZUPvlOeEZ38okjK8twdWGZX2jYd2rCk8k/TJ3DSRIDZ2t/aZMv6I23guxHaofZE3w==, - } + resolution: {integrity: sha512-gUeeX63EFgiaMgcs0cUs2ZUPvlOeEZ38okjK8twdWGZX2jYd2rCk8k/TJ3DSRIDZ2t/aZMv6I23guxHaofZE3w==} ipns@10.0.2: - resolution: - { - integrity: sha512-tokCgz9X678zvHnAabVG91K64X7HnHdWOrop0ghUcXkzH5XNsmxHwVpqVATNqq/w62h7fRDhWURHU/WOfYmCpA==, - } + resolution: {integrity: sha512-tokCgz9X678zvHnAabVG91K64X7HnHdWOrop0ghUcXkzH5XNsmxHwVpqVATNqq/w62h7fRDhWURHU/WOfYmCpA==} is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: - resolution: - { - integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, - } + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-buffer@2.0.5: - resolution: - { - integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-directory@0.3.1: - resolution: - { - integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true is-electron@2.2.2: - resolution: - { - integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==, - } + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-fullwidth-code-point@4.0.0: - resolution: - { - integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} is-fullwidth-code-point@5.0.0: - resolution: - { - integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-ip@5.0.1: - resolution: - { - integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==} + engines: {node: '>=14.16'} is-loopback-addr@2.0.2: - resolution: - { - integrity: sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==, - } + resolution: {integrity: sha512-26POf2KRCno/KTNL5Q0b/9TYnL00xEsSaLfiFRmjM7m7Lw7ZMmFybzzuX4CcsLAluZGd+niLUiMRxEooVE3aqg==} is-network-error@1.1.0: - resolution: - { - integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-plain-obj@2.1.0: - resolution: - { - integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} is-promise@4.0.0: - resolution: - { - integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, - } + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} is-regexp@3.1.0: - resolution: - { - integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} is-stream@3.0.0: - resolution: - { - integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} istanbul-lib-instrument@5.2.1: - resolution: - { - integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} it-all@3.0.7: - resolution: - { - integrity: sha512-PkuYtu6XhJzuPTKXImd6y0qE6H91MUPV/b9xotXMAI6GjmD2v3NoHj2g5L0lS2qZ0EzyGWZU1kp0UxW8POvNBQ==, - } + resolution: {integrity: sha512-PkuYtu6XhJzuPTKXImd6y0qE6H91MUPV/b9xotXMAI6GjmD2v3NoHj2g5L0lS2qZ0EzyGWZU1kp0UxW8POvNBQ==} it-batch@3.0.7: - resolution: - { - integrity: sha512-tcAW8+OAnhC3WqO5ggInfndL/jJsL3i++JLBADKs7LSSzfVVOXicufAuY5Sv4RbCkulRuk/ClSZhS0fu9B9SJA==, - } + resolution: {integrity: sha512-tcAW8+OAnhC3WqO5ggInfndL/jJsL3i++JLBADKs7LSSzfVVOXicufAuY5Sv4RbCkulRuk/ClSZhS0fu9B9SJA==} it-byte-stream@1.1.1: - resolution: - { - integrity: sha512-OIOb8PvK9ZV7MHvyxIDNyN3jmrxrJdx99G0RIYYb3Tzo1OWv+O1C6mfg7nnlDuuTQz2POYFXe87AShKAEl+POw==, - } + resolution: {integrity: sha512-OIOb8PvK9ZV7MHvyxIDNyN3jmrxrJdx99G0RIYYb3Tzo1OWv+O1C6mfg7nnlDuuTQz2POYFXe87AShKAEl+POw==} it-drain@3.0.8: - resolution: - { - integrity: sha512-eeOz+WwKc11ou1UuqZympcXPLCjpTn5ALcYFJiHeTEiYEZ2py/J1vq41XWYj88huCUiqp9iNHfObOKrbIk5Izw==, - } + resolution: {integrity: sha512-eeOz+WwKc11ou1UuqZympcXPLCjpTn5ALcYFJiHeTEiYEZ2py/J1vq41XWYj88huCUiqp9iNHfObOKrbIk5Izw==} it-filter@3.1.2: - resolution: - { - integrity: sha512-2AozaGjIvBBiB7t7MpVNug9kwofqmKSpvgW7zhuyvCs6xxDd6FrfvqyfYtlQTKLNP+Io1WeXko1UQhdlK4M0gg==, - } + resolution: {integrity: sha512-2AozaGjIvBBiB7t7MpVNug9kwofqmKSpvgW7zhuyvCs6xxDd6FrfvqyfYtlQTKLNP+Io1WeXko1UQhdlK4M0gg==} it-first@3.0.7: - resolution: - { - integrity: sha512-e2dVSlOP+pAxPYPVJBF4fX7au8cvGfvLhIrGCMc5aWDnCvwgOo94xHbi3Da6eXQ2jPL5FGEM8sJMn5uE8Seu+g==, - } + resolution: {integrity: sha512-e2dVSlOP+pAxPYPVJBF4fX7au8cvGfvLhIrGCMc5aWDnCvwgOo94xHbi3Da6eXQ2jPL5FGEM8sJMn5uE8Seu+g==} it-foreach@2.1.2: - resolution: - { - integrity: sha512-PvXs3v1FaeWDhWzRxnwB4vSKJngxdLgi0PddkfurCvIFBmKTBfWONLeyDk5dxrvtCzdE4y96KzEQynk4/bbI5A==, - } + resolution: {integrity: sha512-PvXs3v1FaeWDhWzRxnwB4vSKJngxdLgi0PddkfurCvIFBmKTBfWONLeyDk5dxrvtCzdE4y96KzEQynk4/bbI5A==} it-glob@3.0.2: - resolution: - { - integrity: sha512-yw6am0buc9W6HThDhlf/0k9LpwK31p9Y3c0hpaoth9Iaha4Kog2oRlVanLGSrPPoh9yGwHJbs+KfBJt020N6/g==, - } + resolution: {integrity: sha512-yw6am0buc9W6HThDhlf/0k9LpwK31p9Y3c0hpaoth9Iaha4Kog2oRlVanLGSrPPoh9yGwHJbs+KfBJt020N6/g==} it-last@3.0.7: - resolution: - { - integrity: sha512-qG4BTveE6Wzsz5voqaOtZAfZgXTJT+yiaj45vp5S0Vi8oOdgKlRqUeolfvWoMCJ9vwSc/z9pAaNYIza7gA851w==, - } + resolution: {integrity: sha512-qG4BTveE6Wzsz5voqaOtZAfZgXTJT+yiaj45vp5S0Vi8oOdgKlRqUeolfvWoMCJ9vwSc/z9pAaNYIza7gA851w==} it-length-prefixed-stream@1.2.1: - resolution: - { - integrity: sha512-FYqlxc2toUoK+aPO5r3KDBIUG1mOvk2DzmjQcsfLUTHRWMJP4Va9855tVzg/22Bj+VUUaT7gxBg7HmbiCxTK4w==, - } + resolution: {integrity: sha512-FYqlxc2toUoK+aPO5r3KDBIUG1mOvk2DzmjQcsfLUTHRWMJP4Va9855tVzg/22Bj+VUUaT7gxBg7HmbiCxTK4w==} it-length-prefixed@10.0.1: - resolution: - { - integrity: sha512-BhyluvGps26u9a7eQIpOI1YN7mFgi8lFwmiPi07whewbBARKAG9LE09Odc8s1Wtbt2MB6rNUrl7j9vvfXTJwdQ==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-BhyluvGps26u9a7eQIpOI1YN7mFgi8lFwmiPi07whewbBARKAG9LE09Odc8s1Wtbt2MB6rNUrl7j9vvfXTJwdQ==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} it-length-prefixed@9.1.1: - resolution: - { - integrity: sha512-O88nBweT6M9ozsmok68/auKH7ik/slNM4pYbM9lrfy2z5QnpokW5SlrepHZDKtN71llhG2sZvd6uY4SAl+lAQg==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-O88nBweT6M9ozsmok68/auKH7ik/slNM4pYbM9lrfy2z5QnpokW5SlrepHZDKtN71llhG2sZvd6uY4SAl+lAQg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} it-length@3.0.7: - resolution: - { - integrity: sha512-URrszwrzPrUn6PtsSFcixG4NwHydaARmPubO0UUnFH+NSNylBaGtair1fnxX7Zf2qVJQltPBVs3PZvcmFPTLXA==, - } + resolution: {integrity: sha512-URrszwrzPrUn6PtsSFcixG4NwHydaARmPubO0UUnFH+NSNylBaGtair1fnxX7Zf2qVJQltPBVs3PZvcmFPTLXA==} it-map@3.1.2: - resolution: - { - integrity: sha512-G3dzFUjTYHKumJJ8wa9dSDS3yKm8L7qDUnAgzemOD0UMztwm54Qc2v97SuUCiAgbOz/aibkSLImfoFK09RlSFQ==, - } + resolution: {integrity: sha512-G3dzFUjTYHKumJJ8wa9dSDS3yKm8L7qDUnAgzemOD0UMztwm54Qc2v97SuUCiAgbOz/aibkSLImfoFK09RlSFQ==} it-merge@3.0.9: - resolution: - { - integrity: sha512-TjY4WTiwe4ONmaKScNvHDAJj6Tw0UeQFp4JrtC/3Mq7DTyhytes7mnv5OpZV4gItpZcs0AgRntpT2vAy2cnXUw==, - } + resolution: {integrity: sha512-TjY4WTiwe4ONmaKScNvHDAJj6Tw0UeQFp4JrtC/3Mq7DTyhytes7mnv5OpZV4gItpZcs0AgRntpT2vAy2cnXUw==} it-ndjson@1.1.2: - resolution: - { - integrity: sha512-TPKpdYSNKjDdroCPnLamM5Up6XnPQ7F1KgNP3Ib5y5O4ayOVP+DHac/pzjUigcg9Kf9gkGVXDz8+FFKpWwoB3w==, - } + resolution: {integrity: sha512-TPKpdYSNKjDdroCPnLamM5Up6XnPQ7F1KgNP3Ib5y5O4ayOVP+DHac/pzjUigcg9Kf9gkGVXDz8+FFKpWwoB3w==} it-pair@2.0.6: - resolution: - { - integrity: sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-5M0t5RAcYEQYNG5BV7d7cqbdwbCAp5yLdzvkxsZmkuZsLbTdZzah6MQySYfaAQjNDCq6PUnDt0hqBZ4NwMfW6g==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} it-parallel-batch@3.0.7: - resolution: - { - integrity: sha512-R/YKQMefUwLYfJ2UxMaxQUf+Zu9TM+X1KFDe4UaSQlcNog6AbMNMBt3w1suvLEjDDMrI9FNrlopVumfBIboeOg==, - } + resolution: {integrity: sha512-R/YKQMefUwLYfJ2UxMaxQUf+Zu9TM+X1KFDe4UaSQlcNog6AbMNMBt3w1suvLEjDDMrI9FNrlopVumfBIboeOg==} it-parallel@3.0.9: - resolution: - { - integrity: sha512-FSg8T+pr7Z1VUuBxEzAAp/K1j8r1e9mOcyzpWMxN3mt33WFhroFjWXV1oYSSjNqcdYwxD/XgydMVMktJvKiDog==, - } + resolution: {integrity: sha512-FSg8T+pr7Z1VUuBxEzAAp/K1j8r1e9mOcyzpWMxN3mt33WFhroFjWXV1oYSSjNqcdYwxD/XgydMVMktJvKiDog==} it-peekable@3.0.6: - resolution: - { - integrity: sha512-odk9wn8AwFQipy8+tFaZNRCM62riraKZJRysfbmOett9wgJumCwgZFzWUBUwMoiQapEcEVGwjDpMChZIi+zLuQ==, - } + resolution: {integrity: sha512-odk9wn8AwFQipy8+tFaZNRCM62riraKZJRysfbmOett9wgJumCwgZFzWUBUwMoiQapEcEVGwjDpMChZIi+zLuQ==} it-pipe@3.0.1: - resolution: - { - integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} it-protobuf-stream@1.1.6: - resolution: - { - integrity: sha512-TxqgDHXTBt1XkYhrGKP8ubNsYD4zuTClSg6S1M0xTPsskGKA4nPFOGM60zrkh4NMB1Wt3EnsqM5U7kXkx60EXQ==, - } + resolution: {integrity: sha512-TxqgDHXTBt1XkYhrGKP8ubNsYD4zuTClSg6S1M0xTPsskGKA4nPFOGM60zrkh4NMB1Wt3EnsqM5U7kXkx60EXQ==} it-pushable@3.2.3: - resolution: - { - integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==, - } + resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==} it-queueless-pushable@1.0.2: - resolution: - { - integrity: sha512-BFIm48C4O8+i+oVEPQpZ70+CaAsVUircvZtZCrpG2Q64933aLp+tDmas1mTBwqVBfIUUlg09d+e6SWW1CBuykQ==, - } + resolution: {integrity: sha512-BFIm48C4O8+i+oVEPQpZ70+CaAsVUircvZtZCrpG2Q64933aLp+tDmas1mTBwqVBfIUUlg09d+e6SWW1CBuykQ==} it-queueless-pushable@2.0.0: - resolution: - { - integrity: sha512-MlNnefWT/ntv5fesrHpxwVIu6ZdtlkN0A4aaJiE5wnmPMBv9ttiwX3UEMf78dFwIj5ZNaU9usYXg4swMEpUNJQ==, - } + resolution: {integrity: sha512-MlNnefWT/ntv5fesrHpxwVIu6ZdtlkN0A4aaJiE5wnmPMBv9ttiwX3UEMf78dFwIj5ZNaU9usYXg4swMEpUNJQ==} it-reader@6.0.4: - resolution: - { - integrity: sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-XCWifEcNFFjjBHtor4Sfaj8rcpt+FkY0L6WdhD578SCDhV4VUm7fCkF3dv5a+fTcfQqvN9BsxBTvWbYO6iCjTg==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} it-sort@3.0.7: - resolution: - { - integrity: sha512-PsaKSd2Z0uhq8Mq5htdfsE/UagmdLCLWdBXPwi3FZGR4BTG180pFamhK+O+luFtBCNGRoqKAdtbZGTyGwA9uzw==, - } + resolution: {integrity: sha512-PsaKSd2Z0uhq8Mq5htdfsE/UagmdLCLWdBXPwi3FZGR4BTG180pFamhK+O+luFtBCNGRoqKAdtbZGTyGwA9uzw==} it-stream-types@2.0.2: - resolution: - { - integrity: sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==, - } + resolution: {integrity: sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==} it-take@3.0.7: - resolution: - { - integrity: sha512-0+EbsTvH1XCpwhhFkjWdqJTjzS5XP3KL69woBqwANNhMLKn0j39jk/WHIlvbg9XW2vEm7cZz4p8w5DkBZR8LoA==, - } + resolution: {integrity: sha512-0+EbsTvH1XCpwhhFkjWdqJTjzS5XP3KL69woBqwANNhMLKn0j39jk/WHIlvbg9XW2vEm7cZz4p8w5DkBZR8LoA==} it-ws@6.1.5: - resolution: - { - integrity: sha512-uWjMtpy5HqhSd/LlrlP3fhYrr7rUfJFFMABv0F5d6n13Q+0glhZthwUKpEAVhDrXY95Tb1RB5lLqqef+QbVNaw==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-uWjMtpy5HqhSd/LlrlP3fhYrr7rUfJFFMABv0F5d6n13Q+0glhZthwUKpEAVhDrXY95Tb1RB5lLqqef+QbVNaw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@30.0.1: + resolution: {integrity: sha512-5F/T4oaUdWPE6Ttms/hq5M4YVJA1+s1lWqmUK27xfnj1MBy6HmtnRpXXD2KuKZbD5ntwCxTDVAaRrDyIh+HkBg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-circus@30.0.1: + resolution: {integrity: sha512-gJl83BUlAgtIx7UkLjIbsTwuQI+PE/959AE+/NbJaUuAgh23LGXWAGQqLdIlXU6TvLEEAmDR4caEI6pfW2PGBg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.0.1: + resolution: {integrity: sha512-jULGjC6PV7vA7oB2gFh3h6lZBWo0XvGnLA9d9Ct2PyM7hmr7DTApStl3beqR0aglUIxCOTHIwmQsnWlbJbGCtg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@30.0.1: + resolution: {integrity: sha512-5BGh/41Pe1p/aWj9HlEEjbi5JzTFZXYAszGS1cw19//jaPr4Usb16qPGkznzyJLL8ud/7jCplbmF7msTkzqYoA==} + 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 + + jest-diff@30.0.1: + resolution: {integrity: sha512-9uJGfS2tBBFTvn3ZjfPjrw0r7KtAcutTMs3k39+ur2xD0/MTdmz8SrTzuy1dMlGxmbSet1k79UFSJ2+U7dNEvQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-docblock@30.0.1: + resolution: {integrity: sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.0.1: + resolution: {integrity: sha512-zQIKhGrSq6NudJ6SKUBv7wsgRZ3iVe9TXfJ0UNWmrAxaFlsxyVDVq5WkTTWVvCCTCs99fy0s3y62Jx7lLHVJPg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-environment-node@29.7.0: - resolution: - { - integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@30.0.1: + resolution: {integrity: sha512-3MnzhHa1pGH8NgkYp0AjBqFplAW2LECRSpNjM4iA4MBbnyuMf0sBiZG7pzd66smSgilF7hnJr3qVLnlHRsRdIA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: - resolution: - { - integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-haste-map@29.7.0: - resolution: - { - integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@30.0.1: + resolution: {integrity: sha512-NnvtwP+HmTZQ5blCTjigGlmqHktvGSXk8fqh9qvtbPI04CXX9Qf3hEE8FjtAZiSAkPgYZopZm8jTezvXNStDGA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.0.1: + resolution: {integrity: sha512-67NTiVwvaI5K35oEy2Z3Xo6z4WIzSgcw08AEUXTcgNxhu8D8A7jOol/9YqA6ZJMVXC0QttsU7fxMOJYee08n0A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.0.1: + resolution: {integrity: sha512-4R9ct2D3kZTtRTjPVqWbuQpRgG4lVQ5ifI+Ni52OhEeT4XWnNaPe0AtixpkueMKUJDdh96r6xE7V1+imN2hhHQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-message-util@29.7.0: - resolution: - { - integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@30.0.1: + resolution: {integrity: sha512-/TZhT/tMqBVHhOOYY/VdCBoFN66f7rTAQ0TTh4igilDDd6y0SRP8OW7Fm+IV5bYW8MmdEstDQMZkBivmzDPy8A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-mock@29.7.0: - resolution: - { - integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@30.0.1: + resolution: {integrity: sha512-t57+MErWxWWCrhy4JyQHkgELFHv83u9MqO4XVNP9qAsrknDeX031hG1dEPPwDx77obsciQjXptN2nq1Y83T3CQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true jest-regex-util@29.6.3: - resolution: - { - integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve-dependencies@30.0.1: + resolution: {integrity: sha512-9lTOL/lsSs1o39/urF1J7eiN+w432Hf2EBVH6V6bzDoxJcr0juRJoWNH0fwDkF/725IjyU5JDEzUUZ/MATXzNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-resolve@30.0.1: + resolution: {integrity: sha512-VWbbfmQVqEjwRZKo/UgBdUE8RbPCZMEDeR3KLLZe+GaGeCmyUraTdSdfDa8WfmyK/JSHxF/zM7OtGoBr5KXiMw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runner@30.0.1: + resolution: {integrity: sha512-ntEAnH2AtpAi34j/5mEJTczXMjpVnw5jOKParWM0A0POrelfzJT+WEucIQWIonwlHo96T42B3lHzEUggZfaDNw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.0.1: + resolution: {integrity: sha512-lseQgeKgA9B2BYbGQUrd/XF22wB/Sic6MOCLz7VZ2M159Etzl3dO337foInA68f+f2exmmK0cDxq1lbMToBIVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-snapshot@30.0.1: + resolution: {integrity: sha512-Ap2g2X9dkA9Dd9a79DIBkAsE7jsMBydT/xjNGfj8V5ng1kuxpPTqOYHAlHjBZM+cppmCzHSbWn89BVQ9Qh9ibw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-util@29.7.0: - resolution: - { - integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@30.0.1: + resolution: {integrity: sha512-yKUK3Pq+9NtL2XbGhMW0O5PnHYPjvu3kpplm3j08fyqH6lsa/wLg1SCcNJAI4p8LTtfUMj71MnF3L4PKrlIcJg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-validate@29.7.0: - resolution: - { - integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@30.0.1: + resolution: {integrity: sha512-Wy5a3L0wNncZiVeEe8g0uL9ZkHqjXBuDYzl4+SVQ9y5VShSpSi+INSfWipDRX57EG0KCa4k+1N1qAj1s+gDBdg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-watcher@30.0.1: + resolution: {integrity: sha512-TZUy0f9VypPGse7ObbKyfUo7fhVtzLmmDhX84dv4KMvu2j27Nj49L06hBjAiGwi9m3jZruQuUEtQlctaVLSRZg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-worker@29.7.0: - resolution: - { - integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@30.0.1: + resolution: {integrity: sha512-W3zW27LH1+DYwvz5pw4Xw/t83JcWJv24WWp/CtjA2RvQse0k1OViFqUXBAGlUGM6/zTSek/K7EQea+h+SPUKNw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.0.1: + resolution: {integrity: sha512-T+zDYAoEa8+mZuLlRO6VzvHi/D+CtXSvLAPhmVdEYa7mUV7yshs9kvc/6wespnQx0FUHxnhIP7GuZGiIe/BWcg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@3.14.1: - resolution: - { - integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, - } + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true jsc-safe-url@0.2.4: - resolution: - { - integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==, - } + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} jscodeshift@17.3.0: - resolution: - { - integrity: sha512-LjFrGOIORqXBU+jwfC9nbkjmQfFldtMIoS6d9z2LG/lkmyNXsJAySPT+2SWXJEoE68/bCWcxKpXH37npftgmow==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-LjFrGOIORqXBU+jwfC9nbkjmQfFldtMIoS6d9z2LG/lkmyNXsJAySPT+2SWXJEoE68/bCWcxKpXH37npftgmow==} + engines: {node: '>=16'} hasBin: true peerDependencies: '@babel/preset-env': ^7.1.6 @@ -4507,634 +3212,384 @@ packages: optional: true jsesc@3.0.2: - resolution: - { - integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonfile@6.1.0: - resolution: - { - integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, - } + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} kuler@2.0.0: - resolution: - { - integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==, - } + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} level-supports@4.0.1: - resolution: - { - integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} + engines: {node: '>=12'} level-transcoder@1.0.1: - resolution: - { - integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: '>=12'} level@8.0.1: - resolution: - { - integrity: sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==} + engines: {node: '>=12'} leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} libp2p@2.8.2: - resolution: - { - integrity: sha512-LYZUWXcL5kQ+5VIiWhUWURLR7tgNBfwqGTLtZukMqjb33U/YAdd9lqW2MXjvaJLXPuGgRAatisDTOEP/ckfhWA==, - } + resolution: {integrity: sha512-LYZUWXcL5kQ+5VIiWhUWURLR7tgNBfwqGTLtZukMqjb33U/YAdd9lqW2MXjvaJLXPuGgRAatisDTOEP/ckfhWA==} lighthouse-logger@1.4.2: - resolution: - { - integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==, - } + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} lilconfig@3.1.3: - resolution: - { - integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} lint-staged@15.5.0: - resolution: - { - integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==, - } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} + engines: {node: '>=18.12.0'} hasBin: true listr2@8.2.5: - resolution: - { - integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} locate-path@3.0.0: - resolution: - { - integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.debounce@4.0.8: - resolution: - { - integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, - } + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.throttle@4.1.1: - resolution: - { - integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, - } + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} log-update@6.1.0: - resolution: - { - integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} logform@2.7.0: - resolution: - { - integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==, - } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lru@3.1.0: - resolution: - { - integrity: sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==} + engines: {node: '>= 0.4.0'} make-dir@2.1.0: - resolution: - { - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} marky@1.2.5: - resolution: - { - integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==, - } + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} media-typer@1.1.0: - resolution: - { - integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} memoize-one@5.2.1: - resolution: - { - integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==, - } + resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} merge-descriptors@2.0.0: - resolution: - { - integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} merge-options@3.0.4: - resolution: - { - integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} + engines: {node: '>=10'} merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} metro-babel-transformer@0.81.4: - resolution: - { - integrity: sha512-WW0yswWrW+eTVK9sYD+b1HwWOiUlZlUoomiw9TIOk0C+dh2V90Wttn/8g62kYi0Y4i+cJfISerB2LbV4nuRGTA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-WW0yswWrW+eTVK9sYD+b1HwWOiUlZlUoomiw9TIOk0C+dh2V90Wttn/8g62kYi0Y4i+cJfISerB2LbV4nuRGTA==} + engines: {node: '>=18.18'} metro-cache-key@0.81.4: - resolution: - { - integrity: sha512-3SaWQybvf1ivasjBegIxzVKLJzOpcz+KsnGwXFOYADQq0VN4cnM7tT+u2jkOhk6yJiiO1WIjl68hqyMOQJRRLg==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-3SaWQybvf1ivasjBegIxzVKLJzOpcz+KsnGwXFOYADQq0VN4cnM7tT+u2jkOhk6yJiiO1WIjl68hqyMOQJRRLg==} + engines: {node: '>=18.18'} metro-cache@0.81.4: - resolution: - { - integrity: sha512-sxCPH3gowDxazSaZZrwdNPEpnxR8UeXDnvPjBF9+5btDBNN2DpWvDAXPvrohkYkFImhc0LajS2V7eOXvu9PnvQ==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-sxCPH3gowDxazSaZZrwdNPEpnxR8UeXDnvPjBF9+5btDBNN2DpWvDAXPvrohkYkFImhc0LajS2V7eOXvu9PnvQ==} + engines: {node: '>=18.18'} metro-config@0.81.4: - resolution: - { - integrity: sha512-QnhMy3bRiuimCTy7oi5Ug60javrSa3lPh0gpMAspQZHY9h6y86jwHtZPLtlj8hdWQESIlrbeL8inMSF6qI/i9Q==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-QnhMy3bRiuimCTy7oi5Ug60javrSa3lPh0gpMAspQZHY9h6y86jwHtZPLtlj8hdWQESIlrbeL8inMSF6qI/i9Q==} + engines: {node: '>=18.18'} metro-core@0.81.4: - resolution: - { - integrity: sha512-GdL4IgmgJhrMA/rTy2lRqXKeXfC77Rg+uvhUEkbhyfj/oz7PrdSgvIFzziapjdHwk1XYq0KyFh/CcVm8ZawG6A==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-GdL4IgmgJhrMA/rTy2lRqXKeXfC77Rg+uvhUEkbhyfj/oz7PrdSgvIFzziapjdHwk1XYq0KyFh/CcVm8ZawG6A==} + engines: {node: '>=18.18'} metro-file-map@0.81.4: - resolution: - { - integrity: sha512-qUIBzkiqOi3qEuscu4cJ83OYQ4hVzjON19FAySWqYys9GKCmxlKa7LkmwqdpBso6lQl+JXZ7nCacX90w5wQvPA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-qUIBzkiqOi3qEuscu4cJ83OYQ4hVzjON19FAySWqYys9GKCmxlKa7LkmwqdpBso6lQl+JXZ7nCacX90w5wQvPA==} + engines: {node: '>=18.18'} metro-minify-terser@0.81.4: - resolution: - { - integrity: sha512-oVvq/AGvqmbhuijJDZZ9npeWzaVyeBwQKtdlnjcQ9fH7nR15RiBr5y2zTdgTEdynqOIb1Kc16l8CQIUSzOWVFA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-oVvq/AGvqmbhuijJDZZ9npeWzaVyeBwQKtdlnjcQ9fH7nR15RiBr5y2zTdgTEdynqOIb1Kc16l8CQIUSzOWVFA==} + engines: {node: '>=18.18'} metro-resolver@0.81.4: - resolution: - { - integrity: sha512-Ng7G2mXjSExMeRzj6GC19G6IJ0mfIbOLgjArsMWJgtt9ViZiluCwgWsMW9juBC5NSwjJxUMK2x6pC5NIMFLiHA==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-Ng7G2mXjSExMeRzj6GC19G6IJ0mfIbOLgjArsMWJgtt9ViZiluCwgWsMW9juBC5NSwjJxUMK2x6pC5NIMFLiHA==} + engines: {node: '>=18.18'} metro-runtime@0.81.4: - resolution: - { - integrity: sha512-fBoRgqkF69CwyPtBNxlDi5ha26Zc8f85n2THXYoh13Jn/Bkg8KIDCdKPp/A1BbSeNnkH/++H2EIIfnmaff4uRg==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-fBoRgqkF69CwyPtBNxlDi5ha26Zc8f85n2THXYoh13Jn/Bkg8KIDCdKPp/A1BbSeNnkH/++H2EIIfnmaff4uRg==} + engines: {node: '>=18.18'} metro-source-map@0.81.4: - resolution: - { - integrity: sha512-IOwVQ7mLqoqvsL70RZtl1EyE3f9jp43kVsAsb/B/zoWmu0/k4mwEhGLTxmjdXRkLJqPqPrh7WmFChAEf9trW4Q==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-IOwVQ7mLqoqvsL70RZtl1EyE3f9jp43kVsAsb/B/zoWmu0/k4mwEhGLTxmjdXRkLJqPqPrh7WmFChAEf9trW4Q==} + engines: {node: '>=18.18'} metro-symbolicate@0.81.4: - resolution: - { - integrity: sha512-rWxTmYVN6/BOSaMDUHT8HgCuRf6acd0AjHkenYlHpmgxg7dqdnAG1hLq999q2XpW5rX+cMamZD5W5Ez2LqGaag==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-rWxTmYVN6/BOSaMDUHT8HgCuRf6acd0AjHkenYlHpmgxg7dqdnAG1hLq999q2XpW5rX+cMamZD5W5Ez2LqGaag==} + engines: {node: '>=18.18'} hasBin: true metro-transform-plugins@0.81.4: - resolution: - { - integrity: sha512-nlP069nDXm4v28vbll4QLApAlvVtlB66rP6h+ml8Q/CCQCPBXu2JLaoxUmkIOJQjLhMRUcgTyQHq+TXWJhydOQ==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-nlP069nDXm4v28vbll4QLApAlvVtlB66rP6h+ml8Q/CCQCPBXu2JLaoxUmkIOJQjLhMRUcgTyQHq+TXWJhydOQ==} + engines: {node: '>=18.18'} metro-transform-worker@0.81.4: - resolution: - { - integrity: sha512-lKAeRZ8EUMtx2cA/Y4KvICr9bIr5SE03iK3lm+l9wyn2lkjLUuPjYVep159inLeDqC6AtSubsA8MZLziP7c03g==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-lKAeRZ8EUMtx2cA/Y4KvICr9bIr5SE03iK3lm+l9wyn2lkjLUuPjYVep159inLeDqC6AtSubsA8MZLziP7c03g==} + engines: {node: '>=18.18'} metro@0.81.4: - resolution: - { - integrity: sha512-78f0aBNPuwXW7GFnSc+Y0vZhbuQorXxdgqQfvSRqcSizqwg9cwF27I05h47tL8AzQcizS1JZncvq4xf5u/Qykw==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-78f0aBNPuwXW7GFnSc+Y0vZhbuQorXxdgqQfvSRqcSizqwg9cwF27I05h47tL8AzQcizS1JZncvq4xf5u/Qykw==} + engines: {node: '>=18.18'} hasBin: true micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-db@1.54.0: - resolution: - { - integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} mime-types@3.0.1: - resolution: - { - integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} hasBin: true + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + mimic-fn@4.0.0: - resolution: - { - integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} mimic-function@5.0.1: - resolution: - { - integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} mimic-response@3.1.0: - resolution: - { - integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} mkdirp-classic@0.5.3: - resolution: - { - integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, - } + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true module-error@1.0.2: - resolution: - { - integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: '>=10'} mortice@3.0.6: - resolution: - { - integrity: sha512-xUjsTQreX8rO3pHuGYDZ3PY/sEiONIzqzjLeog5akdY4bz9TlDDuvYlU8fm+6qnm4rnpa6AFxLhsfSBThLijdA==, - } + resolution: {integrity: sha512-xUjsTQreX8rO3pHuGYDZ3PY/sEiONIzqzjLeog5akdY4bz9TlDDuvYlU8fm+6qnm4rnpa6AFxLhsfSBThLijdA==} ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} ms@3.0.0-canary.1: - resolution: - { - integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==, - } - engines: { node: '>=12.13' } + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} multicast-dns@7.2.5: - resolution: - { - integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==, - } + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true multiformats@12.1.3: - resolution: - { - integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} multiformats@13.3.2: - resolution: - { - integrity: sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==, - } + resolution: {integrity: sha512-qbB0CQDt3QKfiAzZ5ZYjLFOs+zW43vA4uyM8g27PeEuXZybUOFyjrVdP93HPBHMoglibwfkdVwbzfUq8qGcH6g==} murmurhash3js-revisited@3.0.0: - resolution: - { - integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==} + engines: {node: '>=8.0.0'} nanoid@5.1.5: - resolution: - { - integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==, - } - engines: { node: ^18 || >=20 } + resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} + engines: {node: ^18 || >=20} hasBin: true napi-build-utils@2.0.0: - resolution: - { - integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==, - } + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} napi-macros@2.2.2: - resolution: - { - integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==, - } + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + + napi-postinstall@0.2.4: + resolution: {integrity: sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true natural-compare@1.4.0: - resolution: - { - integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} negotiator@1.0.0: - resolution: - { - integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} netmask@2.0.2: - resolution: - { - integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} node-abi@3.74.0: - resolution: - { - integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + engines: {node: '>=10'} node-cache@5.1.2: - resolution: - { - integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==, - } - engines: { node: '>= 8.0.0' } + resolution: {integrity: sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==} + engines: {node: '>= 8.0.0'} node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -5142,513 +3597,315 @@ packages: optional: true node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: '>= 6.13.0' } + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} node-gyp-build@4.8.4: - resolution: - { - integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==, - } + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-releases@2.0.19: - resolution: - { - integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, - } + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} npm-run-path@5.3.0: - resolution: - { - integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} nullthrows@1.1.1: - resolution: - { - integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==, - } + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} ob1@0.81.4: - resolution: - { - integrity: sha512-EZLYM8hfPraC2SYOR5EWLFAPV5e6g+p83m2Jth9bzCpFxP1NDQJYXdmXRB2bfbaWQSmm6NkIQlbzk7uU5lLfgg==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-EZLYM8hfPraC2SYOR5EWLFAPV5e6g+p83m2Jth9bzCpFxP1NDQJYXdmXRB2bfbaWQSmm6NkIQlbzk7uU5lLfgg==} + engines: {node: '>=18.18'} object-inspect@1.13.4: - resolution: - { - integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} observable-webworkers@2.0.1: - resolution: - { - integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-JI1vB0u3pZjoQKOK1ROWzp0ygxSi7Yb0iR+7UNsw4/Zn4cQ0P3R7XL38zac/Dy2tEA7Lg88/wIJTjF8vYXZ0uw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} on-finished@2.3.0: - resolution: - { - integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} one-time@1.0.0: - resolution: - { - integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==, - } + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} onetime@6.0.0: - resolution: - { - integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} onetime@7.0.0: - resolution: - { - integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} open@7.4.2: - resolution: - { - integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} p-defer@4.0.1: - resolution: - { - integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==} + engines: {node: '>=12'} p-event@6.0.1: - resolution: - { - integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==, - } - engines: { node: '>=16.17' } + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@3.0.0: - resolution: - { - integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} p-queue@8.1.0: - resolution: - { - integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} + engines: {node: '>=18'} p-retry@6.2.1: - resolution: - { - integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==, - } - engines: { node: '>=16.17' } + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} p-timeout@6.1.4: - resolution: - { - integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} p-wait-for@5.0.2: - resolution: - { - integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-lwx6u1CotQYPVju77R+D0vFomni/AqRfqLmqQ8hekklqZ6gAY9rONh7lBQ0uxWMkC2AuX9b2DVAl8To0NyP1JA==} + engines: {node: '>=12'} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-key@4.0.0: - resolution: - { - integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: '>=16 || 14 >=14.18' } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-to-regexp@8.2.0: - resolution: - { - integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} pidtree@0.6.0: - resolution: - { - integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} hasBin: true pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} pirates@4.0.7: - resolution: - { - integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} pkg-dir@3.0.0: - resolution: - { - integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} prebuild-install@7.1.3: - resolution: - { - integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} hasBin: true prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier-linter-helpers@1.0.0: - resolution: - { - integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} prettier@3.5.3: - resolution: - { - integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} hasBin: true pretty-format@29.7.0: - resolution: - { - integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-format@30.0.1: + resolution: {integrity: sha512-2pkYD4WKYrAVyx/Jo7DmV+XAVJ9PuC0gVi9/gCPOxd+dN6WD+Pa7+ScUdh3f9m2klEPEZmfu8HoyYnuaGXzGAA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} progress-events@1.0.1: - resolution: - { - integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==, - } + resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==} promise@8.3.0: - resolution: - { - integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==, - } + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} protons-runtime@5.5.0: - resolution: - { - integrity: sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==, - } + resolution: {integrity: sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==} proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} pump@3.0.2: - resolution: - { - integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, - } + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} pvtsutils@1.3.6: - resolution: - { - integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==, - } + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} pvutils@1.1.3: - resolution: - { - integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} + engines: {node: '>=6.0.0'} qs@6.14.0: - resolution: - { - integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} queue@6.0.2: - resolution: - { - integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==, - } + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} rabin-wasm@0.1.5: - resolution: - { - integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==, - } + resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==} hasBin: true race-event@1.3.0: - resolution: - { - integrity: sha512-kaLm7axfOnahIqD3jQ4l1e471FIFcEGebXEnhxyLscuUzV8C94xVHtWEqDDXxll7+yu/6lW0w1Ff4HbtvHvOHg==, - } + resolution: {integrity: sha512-kaLm7axfOnahIqD3jQ4l1e471FIFcEGebXEnhxyLscuUzV8C94xVHtWEqDDXxll7+yu/6lW0w1Ff4HbtvHvOHg==} race-signal@1.1.3: - resolution: - { - integrity: sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==, - } + resolution: {integrity: sha512-Mt2NznMgepLfORijhQMncE26IhkmjEphig+/1fKC0OtaKwys/gpvpmswSjoN01SS+VO951mj0L4VIDXdXsjnfA==} range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} raw-body@3.0.0: - resolution: - { - integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} rc@1.2.8: - resolution: - { - integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==, - } + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true react-devtools-core@6.1.1: - resolution: - { - integrity: sha512-TFo1MEnkqE6hzAbaztnyR5uLTMoz6wnEWwWBsCUzNt+sVXJycuRJdDqvL078M4/h65BI/YO5XWTaxZDWVsW0fw==, - } + resolution: {integrity: sha512-TFo1MEnkqE6hzAbaztnyR5uLTMoz6wnEWwWBsCUzNt+sVXJycuRJdDqvL078M4/h65BI/YO5XWTaxZDWVsW0fw==} react-is@18.3.1: - resolution: - { - integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, - } + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} react-native-webrtc@124.0.5: - resolution: - { - integrity: sha512-LIQJKst+t53bJOcQef9VXuz3pVheSBUA4olQGkxosbF4pHW1gsWoXYmf6wmI2zrqOA+aZsjjB6aT9AKLyr6a0Q==, - } + resolution: {integrity: sha512-LIQJKst+t53bJOcQef9VXuz3pVheSBUA4olQGkxosbF4pHW1gsWoXYmf6wmI2zrqOA+aZsjjB6aT9AKLyr6a0Q==} peerDependencies: react-native: '>=0.60.0' react-native@0.78.1: - resolution: - { - integrity: sha512-3CK/xxX02GeeVFyrXbsHvREZFVaXwHW43Km/EdYITn5G32cccWTGaqY9QdPddEBLw5O3BPip3LHbR1SywE0cpA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-3CK/xxX02GeeVFyrXbsHvREZFVaXwHW43Km/EdYITn5G32cccWTGaqY9QdPddEBLw5O3BPip3LHbR1SywE0cpA==} + engines: {node: '>=18'} hasBin: true peerDependencies: '@types/react': ^19.0.0 @@ -5658,1092 +3915,676 @@ packages: optional: true react-refresh@0.14.2: - resolution: - { - integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} react@19.1.0: - resolution: - { - integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readline@1.3.0: - resolution: - { - integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==, - } + resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} recast@0.23.11: - resolution: - { - integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} reflect-metadata@0.2.2: - resolution: - { - integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==, - } + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} regenerate-unicode-properties@10.2.0: - resolution: - { - integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + engines: {node: '>=4'} regenerate@1.4.2: - resolution: - { - integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==, - } + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} regenerator-runtime@0.13.11: - resolution: - { - integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==, - } + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} regenerator-runtime@0.14.1: - resolution: - { - integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, - } + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regenerator-transform@0.15.2: - resolution: - { - integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==, - } + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} regexpu-core@6.2.0: - resolution: - { - integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + engines: {node: '>=4'} regjsgen@0.8.0: - resolution: - { - integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==, - } + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} regjsparser@0.12.0: - resolution: - { - integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==, - } + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} resolve-from@3.0.0: - resolution: - { - integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve@1.22.10: - resolution: - { - integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true restore-cursor@5.1.0: - resolution: - { - integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} retimeable-signal@1.0.1: - resolution: - { - integrity: sha512-Cy26CYfbWnYu8HMoJeDhaMpW/EYFIbne3vMf6G9RSrOyWYXbPehja/BEdzpqmM84uy2bfBD7NPZhoQ4GZEtgvg==, - } + resolution: {integrity: sha512-Cy26CYfbWnYu8HMoJeDhaMpW/EYFIbne3vMf6G9RSrOyWYXbPehja/BEdzpqmM84uy2bfBD7NPZhoQ4GZEtgvg==} retimer@3.0.0: - resolution: - { - integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==, - } + resolution: {integrity: sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA==} retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: - resolution: - { - integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==, - } + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@5.0.10: - resolution: - { - integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==, - } + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true router@2.2.0: - resolution: - { - integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} run-parallel-limit@1.1.0: - resolution: - { - integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==, - } + resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safe-stable-stringify@2.5.0: - resolution: - { - integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} sanitize-filename@1.6.3: - resolution: - { - integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==, - } + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} sax@1.4.1: - resolution: - { - integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==, - } + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} scheduler@0.25.0: - resolution: - { - integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==, - } + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.1: - resolution: - { - integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} hasBin: true send@0.19.0: - resolution: - { - integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} send@1.2.0: - resolution: - { - integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} serialize-error@2.1.0: - resolution: - { - integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} serve-static@1.16.2: - resolution: - { - integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} serve-static@2.2.0: - resolution: - { - integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shell-quote@1.8.2: - resolution: - { - integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} side-channel-list@1.0.0: - resolution: - { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { - integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { - integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} simple-concat@1.0.1: - resolution: - { - integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, - } + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} simple-get@4.0.1: - resolution: - { - integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, - } + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} simple-swizzle@0.2.2: - resolution: - { - integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, - } + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} slice-ansi@5.0.0: - resolution: - { - integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} slice-ansi@7.1.0: - resolution: - { - integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} source-map@0.5.7: - resolution: - { - integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} sparse-array@1.3.2: - resolution: - { - integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==, - } + resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==} sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} stack-trace@0.0.10: - resolution: - { - integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==, - } + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} stackframe@1.3.4: - resolution: - { - integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==, - } + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} stacktrace-parser@0.1.11: - resolution: - { - integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} statuses@1.5.0: - resolution: - { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} steno@4.0.2: - resolution: - { - integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A==} + engines: {node: '>=18'} stream-to-it@1.0.1: - resolution: - { - integrity: sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==, - } + resolution: {integrity: sha512-AqHYAYPHcmvMrcLNgncE/q0Aj/ajP6A4qGhxP6EVn7K3YTNs0bJpJyk57wc2Heb7MUL64jurvmnmui8D9kjZgA==} string-argv@0.3.2: - resolution: - { - integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, - } - engines: { node: '>=0.6.19' } + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string-width@5.1.2: - resolution: - { - integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string-width@7.2.0: - resolution: - { - integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.0: - resolution: - { - integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} strip-final-newline@3.0.0: - resolution: - { - integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} strip-json-comments@2.0.1: - resolution: - { - integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} super-regex@0.2.0: - resolution: - { - integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==, - } - engines: { node: '>=14.16' } + resolution: {integrity: sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==} + engines: {node: '>=14.16'} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} supports-color@9.4.0: - resolution: - { - integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} synckit@0.11.2: - resolution: - { - integrity: sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA==} + engines: {node: ^14.18.0 || >=16.0.0} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + engines: {node: ^14.18.0 || >=16.0.0} tar-fs@2.1.2: - resolution: - { - integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==, - } + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} terser@5.39.0: - resolution: - { - integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} hasBin: true test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} text-hex@1.0.0: - resolution: - { - integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==, - } + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} throat@5.0.0: - resolution: - { - integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==, - } + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} thunky@1.1.0: - resolution: - { - integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, - } + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} time-span@5.1.0: - resolution: - { - integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} timeout-abort-controller@3.0.0: - resolution: - { - integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==, - } + resolution: {integrity: sha512-O3e+2B8BKrQxU2YRyEjC/2yFdb33slI22WRdUaDx6rvysfi9anloNZyR2q0l6LnePo5qH7gSM7uZtvvwZbc2yA==} timestamp-nano@1.0.1: - resolution: - { - integrity: sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA==, - } - engines: { node: '>= 4.5.0' } + resolution: {integrity: sha512-4oGOVZWTu5sl89PtCDnhQBSt7/vL1zVEwAfxH1p49JhTosxzVQWYBYFRFZ8nJmo0G6f824iyP/44BFAwIoKvIA==} + engines: {node: '>= 4.5.0'} tiny-invariant@1.3.3: - resolution: - { - integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==, - } + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tldts-core@6.1.85: - resolution: - { - integrity: sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==, - } + resolution: {integrity: sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==} tldts@6.1.85: - resolution: - { - integrity: sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==, - } + resolution: {integrity: sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==} hasBin: true tmp@0.2.3: - resolution: - { - integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==, - } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} tough-cookie@5.1.2: - resolution: - { - integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} triple-beam@1.4.1: - resolution: - { - integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==, - } - engines: { node: '>= 14.0.0' } + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} truncate-utf8-bytes@1.0.2: - resolution: - { - integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==, - } + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} ts-api-utils@2.1.0: - resolution: - { - integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, - } - engines: { node: '>=18.12' } + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' + ts-jest@29.4.0: + resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + 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 + esbuild: '*' + 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 + tsc-esm-fix@3.1.2: - resolution: - { - integrity: sha512-1/OpZssMcEp2ae6DyZV+yvDviofuCdDf7dEWEaBvm/ac8vtS04lFyl0LVs8LQE56vjKHytgzVjPIL9udM4QuNg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-1/OpZssMcEp2ae6DyZV+yvDviofuCdDf7dEWEaBvm/ac8vtS04lFyl0LVs8LQE56vjKHytgzVjPIL9udM4QuNg==} + engines: {node: '>=18.0.0'} hasBin: true tslib@1.14.1: - resolution: - { - integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==, - } + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsyringe@4.8.0: - resolution: - { - integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==, - } - engines: { node: '>= 6.0.0' } + resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} + engines: {node: '>= 6.0.0'} tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} type-fest@0.7.1: - resolution: - { - integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} type-flag@3.0.0: - resolution: - { - integrity: sha512-3YaYwMseXCAhBB14RXW5cRQfJQlEknS6i4C8fCfeUdS3ihG9EdccdR9kt3vP73ZdeTGmPb4bZtkDn5XMIn1DLA==, - } + resolution: {integrity: sha512-3YaYwMseXCAhBB14RXW5cRQfJQlEknS6i4C8fCfeUdS3ihG9EdccdR9kt3vP73ZdeTGmPb4bZtkDn5XMIn1DLA==} type-is@2.0.1: - resolution: - { - integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} typescript-eslint@8.29.0: - resolution: - { - integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-ep9rVd9B4kQsZ7ZnWCVxUE/xDLUUUsRzE0poAeNu+4CkFErLfuvPt/qtm2EpnSyfvsR0S6QzDFSrPCFBwf64fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' typescript@5.8.2: - resolution: - { - integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==, - } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} hasBin: true uint8-varint@2.0.4: - resolution: - { - integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==, - } + resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==} uint8arraylist@2.4.8: - resolution: - { - integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==, - } + resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==} uint8arrays@5.1.0: - resolution: - { - integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==, - } + resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==} undici-types@6.20.0: - resolution: - { - integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, - } + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} undici-types@6.21.0: - resolution: - { - integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, - } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici@6.21.2: - resolution: - { - integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==, - } - engines: { node: '>=18.17' } + resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==} + engines: {node: '>=18.17'} unicode-canonical-property-names-ecmascript@2.0.1: - resolution: - { - integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} unicode-match-property-ecmascript@2.0.0: - resolution: - { - integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} unicode-match-property-value-ecmascript@2.2.0: - resolution: - { - integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + engines: {node: '>=4'} unicode-property-aliases-ecmascript@2.1.0: - resolution: - { - integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unrs-resolver@1.9.0: + resolution: {integrity: sha512-wqaRu4UnzBD2ABTC1kLfBjAqIDZ5YUTr/MLGa7By47JV1bJDSW7jq/ZSLigB7enLe7ubNaJhtnBXgrc/50cEhg==} update-browserslist-db@1.1.3: - resolution: - { - integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==, - } + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} utf8-byte-length@1.0.5: - resolution: - { - integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==, - } + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} vlq@1.0.1: - resolution: - { - integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==, - } + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} weald@1.0.4: - resolution: - { - integrity: sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==, - } + resolution: {integrity: sha512-+kYTuHonJBwmFhP1Z4YQK/dGi3jAnJGCYhyODFpHK73rbxnp9lnZQj7a2m+WVgn8fXr5bJaxUpF6l8qZpPeNWQ==} webcrypto-core@1.8.1: - resolution: - { - integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==, - } + resolution: {integrity: sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-fetch@3.6.20: - resolution: - { - integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==, - } + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} wherearewe@2.0.1: - resolution: - { - integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==, - } - engines: { node: '>=16.0.0', npm: '>=7.0.0' } + resolution: {integrity: sha512-XUguZbDxCA2wBn2LoFtcEhXL6AXo+hVjGonwhSTTTU9SzbWG8Xu3onNIpzf9j/mYUcJQ0f+m37SzG77G851uFw==} + engines: {node: '>=16.0.0', npm: '>=7.0.0'} which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true winston-transport@4.9.0: - resolution: - { - integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==, - } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} winston@3.17.0: - resolution: - { - integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==, - } - engines: { node: '>= 12.0.0' } + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} + engines: {node: '>= 12.0.0'} word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrap-ansi@9.0.0: - resolution: - { - integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@4.0.2: - resolution: - { - integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==, - } - engines: { node: ^12.13.0 || ^14.15.0 || >=16.0.0 } + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} write-file-atomic@5.0.1: - resolution: - { - integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ws@6.2.3: - resolution: - { - integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==, - } + resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -6754,11 +4595,8 @@ packages: optional: true ws@7.5.10: - resolution: - { - integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, - } - engines: { node: '>=8.3.0' } + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -6769,11 +4607,8 @@ packages: optional: true ws@8.18.1: - resolution: - { - integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -6784,62 +4619,39 @@ packages: optional: true xml2js@0.6.2: - resolution: - { - integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} xmlbuilder@11.0.1: - resolution: - { - integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yaml@2.7.1: - resolution: - { - integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} hasBin: true yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: + '@achingbrain/http-parser-js@0.5.8': dependencies: uint8arrays: 5.1.0 @@ -6876,8 +4688,16 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.27.5': {} + '@babel/core@7.26.10': dependencies: '@ampproject/remapping': 2.3.0 @@ -6898,6 +4718,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.27.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.27.0': dependencies: '@babel/parser': 7.27.0 @@ -6906,6 +4746,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.1.0 + '@babel/generator@7.27.5': + dependencies: + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.27.0 @@ -6918,29 +4766,37 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/core': 7.26.10 + '@babel/compat-data': 7.27.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.27.4) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 '@babel/traverse': 7.27.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.26.10)': + '@babel/helper-create-regexp-features-plugin@7.27.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.26.10)': + '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-plugin-utils': 7.26.5 debug: 4.4.0 @@ -6963,6 +4819,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -6972,24 +4835,44 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.25.9': dependencies: '@babel/types': 7.27.0 '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + '@babel/helper-replace-supers@7.26.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 '@babel/traverse': 7.27.0 @@ -7005,10 +4888,16 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-wrap-function@7.25.9': dependencies: '@babel/template': 7.27.0 @@ -7022,642 +4911,661 @@ snapshots: '@babel/template': 7.27.0 '@babel/types': 7.27.0 + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + '@babel/parser@7.27.0': dependencies: '@babel/types': 7.27.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.10)': + '@babel/parser@7.27.5': dependencies: - '@babel/core': 7.26.10 + '@babel/types': 7.27.6 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-proposal-export-default-from@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-export-default-from@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.10)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.10)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.10)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': + dependencies: + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.27.4) '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-block-scoping@7.27.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.27.4) '@babel/traverse': 7.27.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/template': 7.27.0 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.10)': + '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.27.4) - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.10)': + '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-plugin-utils': 7.26.5 '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-identifier': 7.25.9 '@babel/traverse': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.10)': + '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.27.4) - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.27.4) '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regenerator@7.27.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 regenerator-transform: 0.15.2 - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.10)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)': + '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.26.5 - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.10)': + '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typeof-symbol@7.27.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.10)': + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-create-regexp-features-plugin': 7.27.0(@babel/core@7.27.4) '@babel/helper-plugin-utils': 7.26.5 - '@babel/preset-env@7.26.9(@babel/core@7.26.10)': + '@babel/preset-env@7.26.9(@babel/core@7.27.4)': dependencies: '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.10) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.26.10) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.26.10) + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.27.4) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.27.4) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.27.4) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.27.4) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.27.4) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.27.4) + '@babel/plugin-transform-typeof-symbol': 7.27.0(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.27.4) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) + babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) + babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) core-js-compat: 3.41.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-flow@7.25.9(@babel/core@7.26.10)': + '@babel/preset-flow@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.10) + '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.27.4) - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/types': 7.27.0 esutils: 2.0.3 - '@babel/preset-typescript@7.27.0(@babel/core@7.26.10)': + '@babel/preset-typescript@7.27.0(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/helper-plugin-utils': 7.26.5 '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.27.4) transitivePeerDependencies: - supports-color - '@babel/register@7.25.9(@babel/core@7.26.10)': + '@babel/register@7.25.9(@babel/core@7.27.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 clone-deep: 4.0.1 find-cache-dir: 2.1.0 make-dir: 2.1.0 @@ -7674,6 +5582,12 @@ snapshots: '@babel/parser': 7.27.0 '@babel/types': 7.27.0 + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.5 + '@babel/types': 7.27.6 + '@babel/traverse@7.27.0': dependencies: '@babel/code-frame': 7.26.2 @@ -7686,11 +5600,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.27.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.5 + '@babel/parser': 7.27.5 + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.27.0': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@0.2.3': {} + '@chainsafe/as-chacha20poly1305@0.1.0': {} '@chainsafe/as-sha256@1.0.1': {} @@ -7756,6 +5689,22 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 + '@emnapi/core@1.4.3': + dependencies: + '@emnapi/wasi-threads': 1.0.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': + dependencies: + tslib: 2.8.1 + optional: true + '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0)': dependencies: eslint: 9.24.0 @@ -8012,10 +5961,57 @@ snapshots: '@istanbuljs/schema@0.1.3': {} + '@jest/console@30.0.1': + dependencies: + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + chalk: 4.1.2 + jest-message-util: 30.0.1 + jest-util: 30.0.1 + slash: 3.0.0 + + '@jest/core@30.0.1': + dependencies: + '@jest/console': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/reporters': 30.0.1 + '@jest/test-result': 30.0.1 + '@jest/transform': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + 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.0.1 + jest-config: 30.0.1(@types/node@22.14.0) + jest-haste-map: 30.0.1 + jest-message-util: 30.0.1 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.1 + jest-resolve-dependencies: 30.0.1 + jest-runner: 30.0.1 + jest-runtime: 30.0.1 + jest-snapshot: 30.0.1 + jest-util: 30.0.1 + jest-validate: 30.0.1 + jest-watcher: 30.0.1 + micromatch: 4.0.8 + pretty-format: 30.0.1 + slash: 3.0.0 + transitivePeerDependencies: + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + '@jest/create-cache-key-function@29.7.0': dependencies: '@jest/types': 29.6.3 + '@jest/diff-sequences@30.0.1': {} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 @@ -8023,6 +6019,24 @@ snapshots: '@types/node': 22.14.0 jest-mock: 29.7.0 + '@jest/environment@30.0.1': + dependencies: + '@jest/fake-timers': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + jest-mock: 30.0.1 + + '@jest/expect-utils@30.0.1': + dependencies: + '@jest/get-type': 30.0.1 + + '@jest/expect@30.0.1': + dependencies: + expect: 30.0.1 + jest-snapshot: 30.0.1 + transitivePeerDependencies: + - supports-color + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 @@ -8032,13 +6046,97 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 + '@jest/fake-timers@30.0.1': + dependencies: + '@jest/types': 30.0.1 + '@sinonjs/fake-timers': 13.0.5 + '@types/node': 22.14.0 + jest-message-util: 30.0.1 + jest-mock: 30.0.1 + jest-util: 30.0.1 + + '@jest/get-type@30.0.1': {} + + '@jest/globals@30.0.1': + dependencies: + '@jest/environment': 30.0.1 + '@jest/expect': 30.0.1 + '@jest/types': 30.0.1 + jest-mock: 30.0.1 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.0.1': + dependencies: + '@types/node': 22.14.0 + jest-regex-util: 30.0.1 + + '@jest/reporters@30.0.1': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 30.0.1 + '@jest/test-result': 30.0.1 + '@jest/transform': 30.0.1 + '@jest/types': 30.0.1 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 22.14.0 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit-x: 0.2.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + jest-message-util: 30.0.1 + jest-util: 30.0.1 + jest-worker: 30.0.1 + slash: 3.0.0 + string-length: 4.0.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 + '@jest/schemas@30.0.1': + dependencies: + '@sinclair/typebox': 0.34.35 + + '@jest/snapshot-utils@30.0.1': + dependencies: + '@jest/types': 30.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.0.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@30.0.1': + dependencies: + '@jest/console': 30.0.1 + '@jest/types': 30.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@30.0.1': + dependencies: + '@jest/test-result': 30.0.1 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.1 + slash: 3.0.0 + '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -8056,6 +6154,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/transform@30.0.1': + dependencies: + '@babel/core': 7.27.4 + '@jest/types': 30.0.1 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 7.0.0 + 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.0.1 + jest-regex-util: 30.0.1 + jest-util: 30.0.1 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 @@ -8065,6 +6183,16 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 + '@jest/types@30.0.1': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.14.0 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -8438,7 +6566,7 @@ snapshots: uint8arraylist: 2.4.8 uint8arrays: 5.1.0 - '@libp2p/webrtc@5.2.9(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0))': + '@libp2p/webrtc@5.2.9(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0))': dependencies: '@chainsafe/is-ip': 2.1.0 '@chainsafe/libp2p-noise': 16.1.0 @@ -8466,7 +6594,7 @@ snapshots: protons-runtime: 5.5.0 race-event: 1.3.0 race-signal: 1.1.3 - react-native-webrtc: 124.0.5(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)) + react-native-webrtc: 124.0.5(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)) uint8-varint: 2.0.4 uint8arraylist: 2.4.8 uint8arrays: 5.1.0 @@ -8535,6 +6663,13 @@ snapshots: '@multiformats/multiaddr': 12.4.0 is-ip: 5.0.1 + '@napi-rs/wasm-runtime@0.2.11': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + '@noble/ciphers@1.2.1': {} '@noble/curves@1.8.1': @@ -8569,10 +6704,10 @@ snapshots: timeout-abort-controller: 3.0.0 uint8arrays: 5.1.0 - '@orbitdb/feed-db@1.1.2(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0))': + '@orbitdb/feed-db@1.1.2(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0))': dependencies: '@orbitdb/core': 2.5.0 - helia: 5.3.0(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)) + helia: 5.3.0(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)) transitivePeerDependencies: - bufferutil - react-native @@ -8686,84 +6821,86 @@ snapshots: '@pkgr/core@0.2.1': {} + '@pkgr/core@0.2.7': {} + '@react-native/assets-registry@0.78.1': {} - '@react-native/babel-plugin-codegen@0.78.1(@babel/preset-env@7.26.9(@babel/core@7.26.10))': + '@react-native/babel-plugin-codegen@0.78.1(@babel/preset-env@7.26.9(@babel/core@7.27.4))': dependencies: '@babel/traverse': 7.27.0 - '@react-native/codegen': 0.78.1(@babel/preset-env@7.26.9(@babel/core@7.26.10)) + '@react-native/codegen': 0.78.1(@babel/preset-env@7.26.9(@babel/core@7.27.4)) transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/babel-preset@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))': + '@react-native/babel-preset@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))': dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.10) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.10) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-proposal-export-default-from': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-export-default-from': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.27.4) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-block-scoping': 7.27.0(@babel/core@7.27.4) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.27.4) + '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.27.4) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.27.4) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.27.4) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-regenerator': 7.27.0(@babel/core@7.27.4) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.27.4) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.27.4) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.27.4) '@babel/template': 7.27.0 - '@react-native/babel-plugin-codegen': 0.78.1(@babel/preset-env@7.26.9(@babel/core@7.26.10)) + '@react-native/babel-plugin-codegen': 0.78.1(@babel/preset-env@7.26.9(@babel/core@7.27.4)) babel-plugin-syntax-hermes-parser: 0.25.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.26.10) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.27.4) react-refresh: 0.14.2 transitivePeerDependencies: - '@babel/preset-env' - supports-color - '@react-native/codegen@0.78.1(@babel/preset-env@7.26.9(@babel/core@7.26.10))': + '@react-native/codegen@0.78.1(@babel/preset-env@7.26.9(@babel/core@7.27.4))': dependencies: '@babel/parser': 7.27.0 - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/preset-env': 7.26.9(@babel/core@7.27.4) glob: 7.2.3 hermes-parser: 0.25.1 invariant: 2.2.4 - jscodeshift: 17.3.0(@babel/preset-env@7.26.9(@babel/core@7.26.10)) + jscodeshift: 17.3.0(@babel/preset-env@7.26.9(@babel/core@7.27.4)) nullthrows: 1.1.1 yargs: 17.7.2 transitivePeerDependencies: - supports-color - '@react-native/community-cli-plugin@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))': + '@react-native/community-cli-plugin@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))': dependencies: '@react-native/dev-middleware': 0.78.1 - '@react-native/metro-babel-transformer': 0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10)) + '@react-native/metro-babel-transformer': 0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4)) chalk: 4.1.2 debug: 2.6.9 invariant: 2.2.4 @@ -8804,10 +6941,10 @@ snapshots: '@react-native/js-polyfills@0.78.1': {} - '@react-native/metro-babel-transformer@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))': + '@react-native/metro-babel-transformer@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))': dependencies: - '@babel/core': 7.26.10 - '@react-native/babel-preset': 0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10)) + '@babel/core': 7.27.4 + '@react-native/babel-preset': 0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4)) hermes-parser: 0.25.1 nullthrows: 1.1.1 transitivePeerDependencies: @@ -8816,15 +6953,17 @@ snapshots: '@react-native/normalize-colors@0.78.1': {} - '@react-native/virtualized-lists@0.78.1(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0))(react@19.1.0)': + '@react-native/virtualized-lists@0.78.1(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0))(react@19.1.0)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.1.0 - react-native: 0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0) + react-native: 0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0) '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.35': {} + '@sindresorhus/fnv1a@3.1.0': {} '@sinonjs/commons@3.0.1': @@ -8835,8 +6974,17 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + '@topoconfig/extends@0.16.2': {} + '@tybys/wasm-util@0.9.0': + dependencies: + tslib: 2.8.1 + optional: true + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.0 @@ -8902,6 +7050,11 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 + '@types/jest@30.0.0': + dependencies: + expect: 30.0.1 + pretty-format: 30.0.1 + '@types/json-schema@7.0.15': {} '@types/mime@1.3.5': {} @@ -9037,6 +7190,67 @@ snapshots: '@typescript-eslint/types': 8.29.0 eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.3.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.9.0': + optional: true + + '@unrs/resolver-binding-android-arm64@1.9.0': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.9.0': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.9.0': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.9.0': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.9.0': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.9.0': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.9.0': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.9.0': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.9.0': + optional: true + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -9090,6 +7304,10 @@ snapshots: anser@1.4.10: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-escapes@7.0.0: dependencies: environment: 1.1.0 @@ -9145,13 +7363,26 @@ snapshots: transitivePeerDependencies: - debug - babel-jest@29.7.0(@babel/core@7.26.10): + babel-jest@29.7.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.26.10) + babel-preset-jest: 29.6.3(@babel/core@7.27.4) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-jest@30.0.1(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + '@jest/transform': 30.0.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 7.0.0 + babel-preset-jest: 30.0.1(@babel/core@7.27.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -9168,6 +7399,16 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-istanbul@7.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.26.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 6.0.3 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.0 @@ -9175,27 +7416,33 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.26.10): + babel-plugin-jest-hoist@30.0.1: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.27.6 + '@types/babel__core': 7.20.5 + + babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): dependencies: '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) core-js-compat: 3.41.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.26.10): + babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) transitivePeerDependencies: - supports-color @@ -9203,36 +7450,42 @@ snapshots: dependencies: hermes-parser: 0.25.1 - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.26.10): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.27.4): dependencies: - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.10) + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.27.4) transitivePeerDependencies: - '@babel/core' - babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.10): + babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.10) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.10) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.10) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.10) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) + '@babel/core': 7.27.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.27.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) - babel-preset-jest@29.6.3(@babel/core@7.26.10): + babel-preset-jest@29.6.3(@babel/core@7.27.4): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.10) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + + babel-preset-jest@30.0.1(@babel/core@7.27.4): + dependencies: + '@babel/core': 7.27.4 + babel-plugin-jest-hoist: 30.0.1 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) balanced-match@1.0.2: {} @@ -9314,6 +7567,10 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -9371,6 +7628,8 @@ snapshots: chalk@5.4.1: {} + char-regex@1.0.2: {} + chownr@1.1.4: {} chrome-launcher@0.15.2: @@ -9397,6 +7656,10 @@ snapshots: ci-info@3.9.0: {} + ci-info@4.2.0: {} + + cjs-module-lexer@2.1.0: {} + classic-level@1.4.1: dependencies: abstract-level: 1.0.4 @@ -9432,6 +7695,10 @@ snapshots: clone@2.1.2: {} + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -9545,10 +7812,14 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@1.6.0: {} + deep-extend@0.6.0: {} deep-is@0.1.4: {} + deepmerge@4.3.1: {} + delay@6.0.0: {} delayed-stream@1.0.0: {} @@ -9565,6 +7836,8 @@ snapshots: detect-libc@2.0.3: {} + detect-newline@3.1.0: {} + dns-packet@5.6.1: dependencies: '@leichtgewicht/ip-codec': 2.0.5 @@ -9579,8 +7852,14 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.2 + electron-to-chromium@1.5.134: {} + emittery@0.13.1: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} @@ -9724,6 +8003,18 @@ snapshots: eventemitter3@5.0.1: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -9736,8 +8027,19 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + exit-x@0.2.2: {} + expand-template@2.0.3: {} + expect@30.0.1: + dependencies: + '@jest/expect-utils': 30.0.1 + '@jest/get-type': 30.0.1 + jest-matcher-utils: 30.0.1 + jest-message-util: 30.0.1 + jest-mock: 30.0.1 + jest-util: 30.0.1 + exponential-backoff@3.1.2: {} express@5.1.0: @@ -9802,6 +8104,10 @@ snapshots: dependencies: flat-cache: 4.0.1 + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -9933,6 +8239,8 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@6.0.1: {} + get-stream@8.0.1: {} github-from-package@0.0.0: {} @@ -9994,7 +8302,7 @@ snapshots: dependencies: function-bind: 1.1.2 - helia@5.3.0(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)): + helia@5.3.0(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)): dependencies: '@chainsafe/libp2p-noise': 16.1.0 '@chainsafe/libp2p-yamux': 7.0.1 @@ -10019,7 +8327,7 @@ snapshots: '@libp2p/tcp': 10.1.8 '@libp2p/tls': 2.1.1 '@libp2p/upnp-nat': 3.1.11 - '@libp2p/webrtc': 5.2.9(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)) + '@libp2p/webrtc': 5.2.9(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)) '@libp2p/websockets': 9.2.8 '@multiformats/dns': 1.0.6 blockstore-core: 5.0.2 @@ -10041,6 +8349,8 @@ snapshots: dependencies: hermes-estree: 0.25.1 + html-escaper@2.0.2: {} + http-cookie-agent@6.0.8(tough-cookie@5.1.2)(undici@6.21.2): dependencies: agent-base: 7.1.3 @@ -10056,6 +8366,8 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + human-signals@2.1.0: {} + human-signals@5.0.0: {} husky@8.0.3: {} @@ -10082,6 +8394,11 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + imurmurhash@0.1.4: {} inflight@1.0.6: @@ -10197,6 +8514,8 @@ snapshots: dependencies: get-east-asian-width: 1.3.0 + is-generator-fn@2.1.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -10238,7 +8557,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/parser': 7.27.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -10246,6 +8565,35 @@ snapshots: transitivePeerDependencies: - supports-color + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.26.10 + '@babel/parser': 7.27.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + it-all@3.0.7: {} it-batch@3.0.7: {} @@ -10383,6 +8731,147 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@30.0.1: + dependencies: + execa: 5.1.1 + jest-util: 30.0.1 + p-limit: 3.1.0 + + jest-circus@30.0.1: + dependencies: + '@jest/environment': 30.0.1 + '@jest/expect': 30.0.1 + '@jest/test-result': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.6.0 + is-generator-fn: 2.1.0 + jest-each: 30.0.1 + jest-matcher-utils: 30.0.1 + jest-message-util: 30.0.1 + jest-runtime: 30.0.1 + jest-snapshot: 30.0.1 + jest-util: 30.0.1 + p-limit: 3.1.0 + pretty-format: 30.0.1 + pure-rand: 7.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@30.0.1(@types/node@22.13.16): + dependencies: + '@jest/core': 30.0.1 + '@jest/test-result': 30.0.1 + '@jest/types': 30.0.1 + chalk: 4.1.2 + exit-x: 0.2.2 + import-local: 3.2.0 + jest-config: 30.0.1(@types/node@22.13.16) + jest-util: 30.0.1 + jest-validate: 30.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + + jest-config@30.0.1(@types/node@22.13.16): + dependencies: + '@babel/core': 7.27.4 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.1 + '@jest/types': 30.0.1 + babel-jest: 30.0.1(@babel/core@7.27.4) + chalk: 4.1.2 + ci-info: 4.2.0 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.0.1 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.1 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.1 + jest-runner: 30.0.1 + jest-util: 30.0.1 + jest-validate: 30.0.1 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.13.16 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@30.0.1(@types/node@22.14.0): + dependencies: + '@babel/core': 7.27.4 + '@jest/get-type': 30.0.1 + '@jest/pattern': 30.0.1 + '@jest/test-sequencer': 30.0.1 + '@jest/types': 30.0.1 + babel-jest: 30.0.1(@babel/core@7.27.4) + chalk: 4.1.2 + ci-info: 4.2.0 + deepmerge: 4.3.1 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-circus: 30.0.1 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.1 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.1 + jest-runner: 30.0.1 + jest-util: 30.0.1 + jest-validate: 30.0.1 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 30.0.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.14.0 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@30.0.1: + dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + pretty-format: 30.0.1 + + jest-docblock@30.0.1: + dependencies: + detect-newline: 3.1.0 + + jest-each@30.0.1: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.1 + chalk: 4.1.2 + jest-util: 30.0.1 + pretty-format: 30.0.1 + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 @@ -10392,6 +8881,16 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 + jest-environment-node@30.0.1: + dependencies: + '@jest/environment': 30.0.1 + '@jest/fake-timers': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + jest-mock: 30.0.1 + jest-util: 30.0.1 + jest-validate: 30.0.1 + jest-get-type@29.6.3: {} jest-haste-map@29.7.0: @@ -10410,6 +8909,33 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + jest-haste-map@30.0.1: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 30.0.1 + jest-util: 30.0.1 + jest-worker: 30.0.1 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@30.0.1: + dependencies: + '@jest/get-type': 30.0.1 + pretty-format: 30.0.1 + + jest-matcher-utils@30.0.1: + dependencies: + '@jest/get-type': 30.0.1 + chalk: 4.1.2 + jest-diff: 30.0.1 + pretty-format: 30.0.1 + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.26.2 @@ -10422,14 +8948,136 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.0.1: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 30.0.1 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 22.14.0 jest-util: 29.7.0 + jest-mock@30.0.1: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + jest-util: 30.0.1 + + jest-pnp-resolver@1.2.3(jest-resolve@30.0.1): + optionalDependencies: + jest-resolve: 30.0.1 + jest-regex-util@29.6.3: {} + jest-regex-util@30.0.1: {} + + jest-resolve-dependencies@30.0.1: + dependencies: + jest-regex-util: 30.0.1 + jest-snapshot: 30.0.1 + transitivePeerDependencies: + - supports-color + + jest-resolve@30.0.1: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.1 + jest-pnp-resolver: 1.2.3(jest-resolve@30.0.1) + jest-util: 30.0.1 + jest-validate: 30.0.1 + slash: 3.0.0 + unrs-resolver: 1.9.0 + + jest-runner@30.0.1: + dependencies: + '@jest/console': 30.0.1 + '@jest/environment': 30.0.1 + '@jest/test-result': 30.0.1 + '@jest/transform': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + chalk: 4.1.2 + emittery: 0.13.1 + exit-x: 0.2.2 + graceful-fs: 4.2.11 + jest-docblock: 30.0.1 + jest-environment-node: 30.0.1 + jest-haste-map: 30.0.1 + jest-leak-detector: 30.0.1 + jest-message-util: 30.0.1 + jest-resolve: 30.0.1 + jest-runtime: 30.0.1 + jest-util: 30.0.1 + jest-watcher: 30.0.1 + jest-worker: 30.0.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@30.0.1: + dependencies: + '@jest/environment': 30.0.1 + '@jest/fake-timers': 30.0.1 + '@jest/globals': 30.0.1 + '@jest/source-map': 30.0.1 + '@jest/test-result': 30.0.1 + '@jest/transform': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + chalk: 4.1.2 + cjs-module-lexer: 2.1.0 + collect-v8-coverage: 1.0.2 + glob: 10.4.5 + graceful-fs: 4.2.11 + jest-haste-map: 30.0.1 + jest-message-util: 30.0.1 + jest-mock: 30.0.1 + jest-regex-util: 30.0.1 + jest-resolve: 30.0.1 + jest-snapshot: 30.0.1 + jest-util: 30.0.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@30.0.1: + dependencies: + '@babel/core': 7.27.4 + '@babel/generator': 7.27.5 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) + '@babel/types': 7.27.6 + '@jest/expect-utils': 30.0.1 + '@jest/get-type': 30.0.1 + '@jest/snapshot-utils': 30.0.1 + '@jest/transform': 30.0.1 + '@jest/types': 30.0.1 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) + chalk: 4.1.2 + expect: 30.0.1 + graceful-fs: 4.2.11 + jest-diff: 30.0.1 + jest-matcher-utils: 30.0.1 + jest-message-util: 30.0.1 + jest-util: 30.0.1 + pretty-format: 30.0.1 + semver: 7.7.2 + synckit: 0.11.8 + transitivePeerDependencies: + - supports-color + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -10439,6 +9087,15 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 + jest-util@30.0.1: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + chalk: 4.1.2 + ci-info: 4.2.0 + graceful-fs: 4.2.11 + picomatch: 4.0.2 + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -10448,6 +9105,26 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 + jest-validate@30.0.1: + dependencies: + '@jest/get-type': 30.0.1 + '@jest/types': 30.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.0.1 + + jest-watcher@30.0.1: + dependencies: + '@jest/test-result': 30.0.1 + '@jest/types': 30.0.1 + '@types/node': 22.14.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.0.1 + string-length: 4.0.2 + jest-worker@29.7.0: dependencies: '@types/node': 22.14.0 @@ -10455,6 +9132,27 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jest-worker@30.0.1: + dependencies: + '@types/node': 22.14.0 + '@ungap/structured-clone': 1.3.0 + jest-util: 30.0.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.0.1(@types/node@22.13.16): + dependencies: + '@jest/core': 30.0.1 + '@jest/types': 30.0.1 + import-local: 3.2.0 + jest-cli: 30.0.1(@types/node@22.13.16) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - esbuild-register + - supports-color + - ts-node + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -10468,18 +9166,18 @@ snapshots: jsc-safe-url@0.2.4: {} - jscodeshift@17.3.0(@babel/preset-env@7.26.9(@babel/core@7.26.10)): + jscodeshift@17.3.0(@babel/preset-env@7.26.9(@babel/core@7.27.4)): dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/parser': 7.27.0 - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.10) - '@babel/preset-flow': 7.25.9(@babel/core@7.26.10) - '@babel/preset-typescript': 7.27.0(@babel/core@7.26.10) - '@babel/register': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.27.4) + '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.27.4) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.27.4) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.27.4) + '@babel/preset-flow': 7.25.9(@babel/core@7.27.4) + '@babel/preset-typescript': 7.27.0(@babel/core@7.27.4) + '@babel/register': 7.25.9(@babel/core@7.27.4) flow-parser: 0.266.1 graceful-fs: 4.2.11 micromatch: 4.0.8 @@ -10489,7 +9187,7 @@ snapshots: tmp: 0.2.3 write-file-atomic: 5.0.1 optionalDependencies: - '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/preset-env': 7.26.9(@babel/core@7.27.4) transitivePeerDependencies: - supports-color @@ -10501,6 +9199,8 @@ snapshots: json-parse-better-errors@1.0.2: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -10581,6 +9281,8 @@ snapshots: lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} + lint-staged@15.5.0: dependencies: chalk: 5.4.1 @@ -10620,6 +9322,8 @@ snapshots: lodash.debounce@4.0.8: {} + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} lodash.throttle@4.1.1: {} @@ -10660,6 +9364,12 @@ snapshots: pify: 4.0.1 semver: 5.7.2 + make-dir@4.0.0: + dependencies: + semver: 7.7.1 + + make-error@1.3.6: {} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 @@ -10684,7 +9394,7 @@ snapshots: metro-babel-transformer@0.81.4: dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 flow-enums-runtime: 0.0.6 hermes-parser: 0.25.1 nullthrows: 1.1.1 @@ -10778,7 +9488,7 @@ snapshots: metro-transform-plugins@0.81.4: dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/generator': 7.27.0 '@babel/template': 7.27.0 '@babel/traverse': 7.27.0 @@ -10789,7 +9499,7 @@ snapshots: metro-transform-worker@0.81.4: dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/generator': 7.27.0 '@babel/parser': 7.27.0 '@babel/types': 7.27.0 @@ -10810,7 +9520,7 @@ snapshots: metro@0.81.4: dependencies: '@babel/code-frame': 7.26.2 - '@babel/core': 7.26.10 + '@babel/core': 7.27.4 '@babel/generator': 7.27.0 '@babel/parser': 7.27.0 '@babel/template': 7.27.0 @@ -10873,6 +9583,8 @@ snapshots: mime@1.6.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} mimic-function@5.0.1: {} @@ -10883,6 +9595,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -10928,6 +9644,8 @@ snapshots: napi-macros@2.2.2: {} + napi-postinstall@0.2.4: {} + natural-compare@1.4.0: {} negotiator@0.6.3: {} @@ -10960,6 +9678,10 @@ snapshots: normalize-path@3.0.0: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -10990,6 +9712,10 @@ snapshots: dependencies: fn.name: 1.1.0 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 @@ -11068,6 +9794,13 @@ snapshots: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parseurl@1.3.3: {} path-exists@3.0.0: {} @@ -11093,6 +9826,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.6.0: {} pify@4.0.1: {} @@ -11103,6 +9838,10 @@ snapshots: dependencies: find-up: 3.0.0 + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + prebuild-install@7.1.3: dependencies: detect-libc: 2.0.3 @@ -11132,6 +9871,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.0.1: + dependencies: + '@jest/schemas': 30.0.1 + ansi-styles: 5.2.0 + react-is: 18.3.1 + progress-events@1.0.1: {} promise@8.3.0: @@ -11158,6 +9903,8 @@ snapshots: punycode@2.3.1: {} + pure-rand@7.0.1: {} + pvtsutils@1.3.6: dependencies: tslib: 2.8.1 @@ -11216,29 +9963,29 @@ snapshots: react-is@18.3.1: {} - react-native-webrtc@124.0.5(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0)): + react-native-webrtc@124.0.5(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0)): dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 - react-native: 0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0) + react-native: 0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0) transitivePeerDependencies: - supports-color - react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0): + react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.78.1 - '@react-native/codegen': 0.78.1(@babel/preset-env@7.26.9(@babel/core@7.26.10)) - '@react-native/community-cli-plugin': 0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10)) + '@react-native/codegen': 0.78.1(@babel/preset-env@7.26.9(@babel/core@7.27.4)) + '@react-native/community-cli-plugin': 0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4)) '@react-native/gradle-plugin': 0.78.1 '@react-native/js-polyfills': 0.78.1 '@react-native/normalize-colors': 0.78.1 - '@react-native/virtualized-lists': 0.78.1(react-native@0.78.1(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(react@19.1.0))(react@19.1.0) + '@react-native/virtualized-lists': 0.78.1(react-native@0.78.1(@babel/core@7.27.4)(@babel/preset-env@7.26.9(@babel/core@7.27.4))(react@19.1.0))(react@19.1.0) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-jest: 29.7.0(@babel/core@7.26.10) + babel-jest: 29.7.0(@babel/core@7.27.4) babel-plugin-syntax-hermes-parser: 0.25.1 base64-js: 1.5.1 chalk: 4.1.2 @@ -11325,6 +10072,10 @@ snapshots: require-directory@2.1.1: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + resolve-from@3.0.0: {} resolve-from@4.0.0: {} @@ -11403,6 +10154,8 @@ snapshots: semver@7.7.1: {} + semver@7.7.2: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -11527,6 +10280,11 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -11564,6 +10322,11 @@ snapshots: string-argv@0.3.2: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -11594,6 +10357,10 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} strip-json-comments@2.0.1: {} @@ -11623,6 +10390,10 @@ snapshots: '@pkgr/core': 0.2.1 tslib: 2.8.1 + synckit@0.11.8: + dependencies: + '@pkgr/core': 0.2.7 + tar-fs@2.1.2: dependencies: chownr: 1.1.4 @@ -11701,6 +10472,26 @@ snapshots: dependencies: typescript: 5.8.2 + ts-jest@29.4.0(@babel/core@7.27.4)(@jest/transform@30.0.1)(@jest/types@30.0.1)(babel-jest@30.0.1(@babel/core@7.27.4))(jest-util@30.0.1)(jest@30.0.1(@types/node@22.13.16))(typescript@5.8.2): + dependencies: + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 30.0.1(@types/node@22.13.16) + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.7.2 + type-fest: 4.41.0 + typescript: 5.8.2 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.27.4 + '@jest/transform': 30.0.1 + '@jest/types': 30.0.1 + babel-jest: 30.0.1(@babel/core@7.27.4) + jest-util: 30.0.1 + tsc-esm-fix@3.1.2: dependencies: '@topoconfig/extends': 0.16.2 @@ -11728,8 +10519,12 @@ snapshots: type-detect@4.0.8: {} + type-fest@0.21.3: {} + type-fest@0.7.1: {} + type-fest@4.41.0: {} + type-flag@3.0.0: {} type-is@2.0.1: @@ -11784,6 +10579,30 @@ snapshots: unpipe@1.0.0: {} + unrs-resolver@1.9.0: + dependencies: + napi-postinstall: 0.2.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.9.0 + '@unrs/resolver-binding-android-arm64': 1.9.0 + '@unrs/resolver-binding-darwin-arm64': 1.9.0 + '@unrs/resolver-binding-darwin-x64': 1.9.0 + '@unrs/resolver-binding-freebsd-x64': 1.9.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.9.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.9.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.9.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-riscv64-musl': 1.9.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.9.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.9.0 + '@unrs/resolver-binding-linux-x64-musl': 1.9.0 + '@unrs/resolver-binding-wasm32-wasi': 1.9.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.9.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.9.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.9.0 + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: browserslist: 4.24.4 @@ -11800,6 +10619,12 @@ snapshots: utils-merge@1.0.1: {} + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + vary@1.1.2: {} vlq@1.0.1: {} diff --git a/system.txt b/system.txt new file mode 100644 index 0000000..c179db6 --- /dev/null +++ b/system.txt @@ -0,0 +1,1646 @@ +DebrosFramework Development Specification +Overview +DebrosFramework is a comprehensive Node.js framework built on top of OrbitDB and IPFS that provides a model-based abstraction layer for building decentralized applications. The framework automatically handles database partitioning, global indexing, relationships, schema migrations, pinning strategies, and pub/sub communication while providing a clean, familiar API similar to traditional ORMs. +Architecture Principles +Core Design Goals + +Scalability: Handle millions of users through automatic database partitioning +Developer Experience: Provide familiar ORM-like API with decorators and relationships +Automatic Management: Handle pinning, indexing, pub/sub, and migrations automatically +Type Safety: Full TypeScript support with comprehensive type definitions +Performance: Intelligent caching and query optimization +Flexibility: Support different database types and scoping strategies + +Framework Layers +┌─────────────────────────────────────┐ +│ Developer API │ ← Models, decorators, query builder +├─────────────────────────────────────┤ +│ Framework Core │ ← Model management, relationships +├─────────────────────────────────────┤ +│ Database Management │ ← Sharding, indexing, caching +├─────────────────────────────────────┤ +│ Existing @debros/network │ ← IPFS/OrbitDB abstraction +└─────────────────────────────────────┘ +Project Structure +@debros/network/ +├── src/ +│ ├── framework/ # New framework code +│ │ ├── core/ +│ │ │ ├── DebrosFramework.ts # Main framework class +│ │ │ ├── ModelRegistry.ts # Model registration and management +│ │ │ ├── DatabaseManager.ts # Database creation and management +│ │ │ └── ConfigManager.ts # Framework configuration +│ │ ├── models/ +│ │ │ ├── BaseModel.ts # Base model class +│ │ │ ├── decorators/ # Model decorators +│ │ │ │ ├── Model.ts # @Model decorator +│ │ │ │ ├── Field.ts # @Field decorator +│ │ │ │ ├── relationships.ts # @HasMany, @BelongsTo, etc. +│ │ │ │ └── hooks.ts # @BeforeCreate, @AfterUpdate, etc. +│ │ │ └── ModelFactory.ts # Model instantiation +│ │ ├── query/ +│ │ │ ├── QueryBuilder.ts # Main query builder +│ │ │ ├── QueryExecutor.ts # Query execution strategies +│ │ │ ├── QueryOptimizer.ts # Query optimization +│ │ │ └── QueryCache.ts # Query result caching +│ │ ├── relationships/ +│ │ │ ├── RelationshipManager.ts +│ │ │ ├── LazyLoader.ts +│ │ │ └── RelationshipCache.ts +│ │ ├── sharding/ +│ │ │ ├── ShardManager.ts # Database sharding logic +│ │ │ ├── HashSharding.ts # Hash-based sharding +│ │ │ ├── UserSharding.ts # User-scoped databases +│ │ │ └── GlobalIndexManager.ts # Global index management +│ │ ├── migrations/ +│ │ │ ├── MigrationManager.ts # Schema migration handling +│ │ │ ├── VersionManager.ts # Document version management +│ │ │ └── MigrationStrategies.ts +│ │ ├── pinning/ +│ │ │ ├── PinningManager.ts # Automatic pinning strategies +│ │ │ ├── TieredPinning.ts # Tiered pinning implementation +│ │ │ └── PinningStrategies.ts # Various pinning strategies +│ │ ├── pubsub/ +│ │ │ ├── PubSubManager.ts # Pub/sub abstraction +│ │ │ ├── EventEmitter.ts # Model event emission +│ │ │ └── SubscriptionManager.ts +│ │ ├── cache/ +│ │ │ ├── CacheManager.ts # Multi-level caching +│ │ │ ├── MemoryCache.ts # In-memory cache +│ │ │ ├── QueryCache.ts # Query result cache +│ │ │ └── RelationshipCache.ts # Relationship cache +│ │ ├── validation/ +│ │ │ ├── SchemaValidator.ts # Schema validation +│ │ │ ├── TypeValidator.ts # Field type validation +│ │ │ └── CustomValidators.ts # Custom validation rules +│ │ └── types/ +│ │ ├── framework.ts # Framework type definitions +│ │ ├── models.ts # Model type definitions +│ │ ├── decorators.ts # Decorator type definitions +│ │ └── queries.ts # Query type definitions +│ ├── db/ # Existing database service +│ ├── ipfs/ # Existing IPFS service +│ ├── orbit/ # Existing OrbitDB service +│ └── utils/ # Existing utilities +├── examples/ +│ ├── basic-usage/ +│ ├── relationships/ +│ ├── sharding/ +│ └── migrations/ +├── docs/ +│ ├── getting-started.md +│ ├── models.md +│ ├── relationships.md +│ ├── queries.md +│ ├── migrations.md +│ └── advanced.md +└── tests/ + ├── unit/ + ├── integration/ + └── performance/ +Implementation Roadmap +Phase 1: Core Model System (Weeks 1-2) +1.1 Base Model Implementation +File: src/framework/models/BaseModel.ts +typescript// Core functionality every model inherits +export abstract class BaseModel { + // Properties + public id: string; + public createdAt: number; + public updatedAt: number; + protected _loadedRelations: Map = new Map(); + protected _isDirty: boolean = false; + protected _isNew: boolean = true; + + // Static properties + static modelName: string; + static dbType: StoreType; + static scope: 'user' | 'global'; + static sharding?: ShardingConfig; + static pinning?: PinningConfig; + static fields: Map = new Map(); + static relationships: Map = new Map(); + static hooks: Map = new Map(); + + // Constructor + constructor(data: any = {}) { + this.fromJSON(data); + } + + // Core CRUD operations + async save(): Promise; + static async create(data: any): Promise; + static async get(id: string): Promise; + static async find(id: string): Promise; + async update(data: Partial): Promise; + async delete(): Promise; + + // Query operations + static where(field: string, operator: string, value: any): QueryBuilder; + static whereIn(field: string, values: any[]): QueryBuilder; + static orderBy(field: string, direction: 'asc' | 'desc'): QueryBuilder; + static limit(count: number): QueryBuilder; + static all(): Promise; + + // Relationship operations + async load(relationships: string[]): Promise; + async loadRelation(relationName: string): Promise; + + // Serialization + toJSON(): any; + fromJSON(data: any): this; + + // Validation + async validate(): Promise; + + // Hooks + async beforeCreate(): Promise; + async afterCreate(): Promise; + async beforeUpdate(): Promise; + async afterUpdate(): Promise; + async beforeDelete(): Promise; + async afterDelete(): Promise; +} +Implementation Tasks: + + Create BaseModel class with all core methods + Implement toJSON/fromJSON serialization + Add validation framework integration + Implement hook system (beforeCreate, afterUpdate, etc.) + Add dirty tracking for efficient updates + Create static method stubs (will be implemented in later phases) + +1.2 Model Decorators +File: src/framework/models/decorators/Model.ts +typescriptexport interface ModelConfig { + type?: StoreType; + scope?: 'user' | 'global'; + sharding?: ShardingConfig; + pinning?: PinningConfig; + pubsub?: PubSubConfig; + cache?: CacheConfig; + tableName?: string; +} + +export function Model(config: ModelConfig = {}) { + return function (target: T) { + // Set model configuration + target.modelName = config.tableName || target.name; + target.dbType = config.type || autoDetectType(target); + target.scope = config.scope || 'global'; + + // Register with framework + ModelRegistry.register(target.name, target, config); + + // Set up automatic database creation + DatabaseManager.scheduleCreation(target); + + return target; + }; +} + +function autoDetectType(modelClass: any): StoreType { + // Analyze model fields to suggest optimal database type + // Implementation details... +} +File: src/framework/models/decorators/Field.ts +typescriptexport interface FieldConfig { + type: 'string' | 'number' | 'boolean' | 'array' | 'object' | 'date'; + required?: boolean; + unique?: boolean; + index?: boolean | 'global'; + default?: any; + validate?: (value: any) => boolean | string; + transform?: (value: any) => any; +} + +export function Field(config: FieldConfig) { + return function (target: any, propertyKey: string) { + if (!target.constructor.fields) { + target.constructor.fields = new Map(); + } + + target.constructor.fields.set(propertyKey, config); + + // Create getter/setter with validation + const privateKey = `_${propertyKey}`; + + Object.defineProperty(target, propertyKey, { + get() { + return this[privateKey]; + }, + set(value) { + const validationResult = validateFieldValue(value, config); + if (!validationResult.valid) { + throw new ValidationError(validationResult.errors); + } + + this[privateKey] = config.transform ? config.transform(value) : value; + this._isDirty = true; + }, + enumerable: true, + configurable: true + }); + }; +} +File: src/framework/models/decorators/relationships.ts +typescriptexport interface RelationshipConfig { + type: 'belongsTo' | 'hasMany' | 'hasOne' | 'manyToMany'; + model: typeof BaseModel; + foreignKey: string; + localKey?: string; + through?: typeof BaseModel; + lazy?: boolean; +} + +export function BelongsTo(model: typeof BaseModel, foreignKey: string) { + return function (target: any, propertyKey: string) { + const config: RelationshipConfig = { + type: 'belongsTo', + model, + foreignKey, + lazy: true + }; + + registerRelationship(target, propertyKey, config); + createRelationshipProperty(target, propertyKey, config); + }; +} + +export function HasMany(model: typeof BaseModel, foreignKey: string) { + return function (target: any, propertyKey: string) { + const config: RelationshipConfig = { + type: 'hasMany', + model, + foreignKey, + lazy: true + }; + + registerRelationship(target, propertyKey, config); + createRelationshipProperty(target, propertyKey, config); + }; +} + +function createRelationshipProperty(target: any, propertyKey: string, config: RelationshipConfig) { + Object.defineProperty(target, propertyKey, { + get() { + if (!this._loadedRelations.has(propertyKey)) { + if (config.lazy) { + // Return a promise for lazy loading + return this.loadRelation(propertyKey); + } else { + throw new Error(`Relationship '${propertyKey}' not loaded. Use .load(['${propertyKey}']) first.`); + } + } + return this._loadedRelations.get(propertyKey); + }, + enumerable: true, + configurable: true + }); +} +Implementation Tasks: + + Implement @Model decorator with configuration + Create @Field decorator with validation and transformation + Implement relationship decorators (@BelongsTo, @HasMany, @HasOne, @ManyToMany) + Add hook decorators (@BeforeCreate, @AfterUpdate, etc.) + Create auto-detection logic for optimal database types + Add decorator validation and error handling + +1.3 Model Registry +File: src/framework/core/ModelRegistry.ts +typescriptexport class ModelRegistry { + private static models: Map = new Map(); + private static configs: Map = new Map(); + + static register(name: string, modelClass: typeof BaseModel, config: ModelConfig) { + this.models.set(name, modelClass); + this.configs.set(name, config); + + // Validate model configuration + this.validateModel(modelClass, config); + } + + static get(name: string): typeof BaseModel | undefined { + return this.models.get(name); + } + + static getConfig(name: string): ModelConfig | undefined { + return this.configs.get(name); + } + + static getAllModels(): Map { + return this.models; + } + + static getUserScopedModels(): Array { + return Array.from(this.models.values()).filter( + model => model.scope === 'user' + ); + } + + static getGlobalModels(): Array { + return Array.from(this.models.values()).filter( + model => model.scope === 'global' + ); + } + + private static validateModel(modelClass: typeof BaseModel, config: ModelConfig) { + // Validate model configuration + // Check for conflicts, missing requirements, etc. + } +} +Phase 2: Database Management & Sharding (Weeks 3-4) +2.1 Database Manager +File: src/framework/core/DatabaseManager.ts +typescriptexport class DatabaseManager { + private framework: DebrosFramework; + private databases: Map = new Map(); + private userMappings: Map = new Map(); + + constructor(framework: DebrosFramework) { + this.framework = framework; + } + + async initializeAllDatabases() { + // Initialize global databases + await this.initializeGlobalDatabases(); + + // Initialize system databases (user directory, etc.) + await this.initializeSystemDatabases(); + } + + async createUserDatabases(userId: string): Promise { + const userScopedModels = ModelRegistry.getUserScopedModels(); + const databases: any = {}; + + // Create mappings database first + const mappingsDB = await this.createDatabase( + `${userId}-mappings`, + 'keyvalue', + 'user' + ); + + // Create database for each user-scoped model + for (const model of userScopedModels) { + const dbName = `${userId}-${model.modelName.toLowerCase()}`; + const db = await this.createDatabase(dbName, model.dbType, 'user'); + databases[`${model.modelName.toLowerCase()}DB`] = db.address.toString(); + } + + // Store mappings + await mappingsDB.set('mappings', databases); + + // Register in global directory + await this.registerUserInDirectory(userId, mappingsDB.address.toString()); + + return new UserMappings(userId, databases); + } + + async getUserDatabase(userId: string, modelName: string): Promise { + const mappings = await this.getUserMappings(userId); + const dbAddress = mappings[`${modelName.toLowerCase()}DB`]; + + if (!dbAddress) { + throw new Error(`Database not found for user ${userId} and model ${modelName}`); + } + + return await this.openDatabase(dbAddress); + } + + async getUserMappings(userId: string): Promise { + // Check cache first + if (this.userMappings.has(userId)) { + return this.userMappings.get(userId); + } + + // Get from global directory + const directoryShards = await this.getGlobalDirectoryShards(); + const shardIndex = this.getShardIndex(userId, directoryShards.length); + const shard = directoryShards[shardIndex]; + + const mappingsAddress = await shard.get(userId); + if (!mappingsAddress) { + throw new Error(`User ${userId} not found in directory`); + } + + const mappingsDB = await this.openDatabase(mappingsAddress); + const mappings = await mappingsDB.get('mappings'); + + // Cache for future use + this.userMappings.set(userId, mappings); + + return mappings; + } + + private async createDatabase(name: string, type: StoreType, scope: string): Promise { + // Use existing OrbitDB service + return await this.framework.orbitDBService.openDB(name, type); + } + + private getShardIndex(key: string, shardCount: number): number { + // Simple hash-based sharding + let hash = 0; + for (let i = 0; i < key.length; i++) { + hash = ((hash << 5) - hash + key.charCodeAt(i)) & 0xffffffff; + } + return Math.abs(hash) % shardCount; + } +} +2.2 Shard Manager +File: src/framework/sharding/ShardManager.ts +typescriptexport interface ShardingConfig { + strategy: 'hash' | 'range' | 'user'; + count: number; + key: string; +} + +export class ShardManager { + private shards: Map = new Map(); + + async createShards(modelName: string, config: ShardingConfig): Promise { + const shards: any[] = []; + + for (let i = 0; i < config.count; i++) { + const shardName = `${modelName.toLowerCase()}-shard-${i}`; + const shard = await this.createShard(shardName, config); + shards.push(shard); + } + + this.shards.set(modelName, shards); + } + + getShardForKey(modelName: string, key: string): any { + const shards = this.shards.get(modelName); + if (!shards) { + throw new Error(`No shards found for model ${modelName}`); + } + + const shardIndex = this.calculateShardIndex(key, shards.length); + return shards[shardIndex]; + } + + getAllShards(modelName: string): any[] { + return this.shards.get(modelName) || []; + } + + private calculateShardIndex(key: string, shardCount: number): number { + // Hash-based sharding + let hash = 0; + for (let i = 0; i < key.length; i++) { + hash = ((hash << 5) - hash + key.charCodeAt(i)) & 0xffffffff; + } + return Math.abs(hash) % shardCount; + } + + private async createShard(shardName: string, config: ShardingConfig): Promise { + // Create OrbitDB database for this shard + // Implementation depends on existing OrbitDB service + } +} +Phase 3: Query System (Weeks 5-6) +3.1 Query Builder +File: src/framework/query/QueryBuilder.ts +typescriptexport class QueryBuilder { + private model: typeof BaseModel; + private conditions: QueryCondition[] = []; + private relations: string[] = []; + private sorting: SortConfig[] = []; + private limitation?: number; + private offsetValue?: number; + + constructor(model: typeof BaseModel) { + this.model = model; + } + + where(field: string, operator: string, value: any): this { + this.conditions.push({ field, operator, value }); + return this; + } + + whereIn(field: string, values: any[]): this { + return this.where(field, 'in', values); + } + + whereUserIn(userIds: string[]): this { + // Special method for user-scoped queries + this.conditions.push({ + field: 'userId', + operator: 'userIn', + value: userIds + }); + return this; + } + + orderBy(field: string, direction: 'asc' | 'desc' = 'asc'): this { + this.sorting.push({ field, direction }); + return this; + } + + limit(count: number): this { + this.limitation = count; + return this; + } + + offset(count: number): this { + this.offsetValue = count; + return this; + } + + load(relationships: string[]): this { + this.relations = relationships; + return this; + } + + async exec(): Promise { + const executor = new QueryExecutor(this.model, this); + return await executor.execute(); + } + + async first(): Promise { + const results = await this.limit(1).exec(); + return results[0] || null; + } + + async count(): Promise { + const executor = new QueryExecutor(this.model, this); + return await executor.count(); + } + + // Getters for query configuration + getConditions(): QueryCondition[] { return this.conditions; } + getRelations(): string[] { return this.relations; } + getSorting(): SortConfig[] { return this.sorting; } + getLimit(): number | undefined { return this.limitation; } + getOffset(): number | undefined { return this.offsetValue; } +} +3.2 Query Executor +File: src/framework/query/QueryExecutor.ts +typescriptexport class QueryExecutor { + private model: typeof BaseModel; + private query: QueryBuilder; + private framework: DebrosFramework; + + constructor(model: typeof BaseModel, query: QueryBuilder) { + this.model = model; + this.query = query; + this.framework = DebrosFramework.getInstance(); + } + + async execute(): Promise { + if (this.model.scope === 'user') { + return await this.executeUserScopedQuery(); + } else { + return await this.executeGlobalQuery(); + } + } + + private async executeUserScopedQuery(): Promise { + const conditions = this.query.getConditions(); + + // Check if we have user-specific filters + const userFilter = conditions.find(c => c.field === 'userId' || c.operator === 'userIn'); + + if (userFilter) { + return await this.executeUserSpecificQuery(userFilter); + } else { + // Global query on user-scoped data - use global index + return await this.executeGlobalIndexQuery(); + } + } + + private async executeUserSpecificQuery(userFilter: QueryCondition): Promise { + const userIds = userFilter.operator === 'userIn' + ? userFilter.value + : [userFilter.value]; + + const results: T[] = []; + + // Query each user's database in parallel + const promises = userIds.map(async (userId: string) => { + try { + const userDB = await this.framework.databaseManager.getUserDatabase( + userId, + this.model.modelName + ); + + return await this.queryDatabase(userDB); + } catch (error) { + console.warn(`Failed to query user ${userId} database:`, error); + return []; + } + }); + + const userResults = await Promise.all(promises); + + // Flatten and combine results + for (const userResult of userResults) { + results.push(...userResult); + } + + return this.postProcessResults(results); + } + + private async executeGlobalIndexQuery(): Promise { + // Query global index for user-scoped models + const globalIndexName = `${this.model.modelName}Index`; + const indexShards = this.framework.shardManager.getAllShards(globalIndexName); + + const results: any[] = []; + + // Query all shards in parallel + const promises = indexShards.map(shard => this.queryDatabase(shard)); + const shardResults = await Promise.all(promises); + + for (const shardResult of shardResults) { + results.push(...shardResult); + } + + // Now fetch actual documents from user databases + return await this.fetchActualDocuments(results); + } + + private async executeGlobalQuery(): Promise { + // For globally scoped models + if (this.model.sharding) { + return await this.executeShardedQuery(); + } else { + const db = await this.framework.databaseManager.getGlobalDatabase(this.model.modelName); + return await this.queryDatabase(db); + } + } + + private async queryDatabase(database: any): Promise { + // Get all documents from OrbitDB + let documents: any[]; + + if (this.model.dbType === 'eventlog') { + const iterator = database.iterator(); + documents = iterator.collect(); + } else if (this.model.dbType === 'keyvalue') { + documents = Object.values(database.all()); + } else if (this.model.dbType === 'docstore') { + documents = database.query(() => true); + } + + // Apply filters in memory + documents = this.applyFilters(documents); + + // Apply sorting + documents = this.applySorting(documents); + + // Apply limit/offset + documents = this.applyLimitOffset(documents); + + // Convert to model instances + return documents.map(doc => new this.model(doc) as T); + } + + private applyFilters(documents: any[]): any[] { + const conditions = this.query.getConditions(); + + return documents.filter(doc => { + return conditions.every(condition => { + return this.evaluateCondition(doc, condition); + }); + }); + } + + private evaluateCondition(doc: any, condition: QueryCondition): boolean { + const { field, operator, value } = condition; + const docValue = this.getNestedValue(doc, field); + + switch (operator) { + case '=': + case '==': + return docValue === value; + case '!=': + return docValue !== value; + case '>': + return docValue > value; + case '>=': + return docValue >= value; + case '<': + return docValue < value; + case '<=': + return docValue <= value; + case 'in': + return Array.isArray(value) && value.includes(docValue); + case 'contains': + return Array.isArray(docValue) && docValue.includes(value); + case 'like': + return String(docValue).toLowerCase().includes(String(value).toLowerCase()); + default: + throw new Error(`Unsupported operator: ${operator}`); + } + } + + private postProcessResults(results: T[]): T[] { + // Apply global sorting across all results + results = this.applySorting(results); + + // Apply global limit/offset + results = this.applyLimitOffset(results); + + return results; + } +} +Phase 4: Relationships & Loading (Weeks 7-8) +4.1 Relationship Manager +File: src/framework/relationships/RelationshipManager.ts +typescriptexport class RelationshipManager { + private framework: DebrosFramework; + private cache: RelationshipCache; + + constructor(framework: DebrosFramework) { + this.framework = framework; + this.cache = new RelationshipCache(); + } + + async loadRelationship( + instance: BaseModel, + relationshipName: string + ): Promise { + const relationConfig = instance.constructor.relationships.get(relationshipName); + + if (!relationConfig) { + throw new Error(`Relationship '${relationshipName}' not found`); + } + + // Check cache first + const cacheKey = this.getCacheKey(instance, relationshipName); + const cached = this.cache.get(cacheKey); + if (cached) { + return cached; + } + + let result: any; + + switch (relationConfig.type) { + case 'belongsTo': + result = await this.loadBelongsTo(instance, relationConfig); + break; + case 'hasMany': + result = await this.loadHasMany(instance, relationConfig); + break; + case 'hasOne': + result = await this.loadHasOne(instance, relationConfig); + break; + case 'manyToMany': + result = await this.loadManyToMany(instance, relationConfig); + break; + default: + throw new Error(`Unsupported relationship type: ${relationConfig.type}`); + } + + // Cache the result + this.cache.set(cacheKey, result); + + // Store in instance + instance._loadedRelations.set(relationshipName, result); + + return result; + } + + private async loadBelongsTo( + instance: BaseModel, + config: RelationshipConfig + ): Promise { + const foreignKeyValue = instance[config.foreignKey]; + + if (!foreignKeyValue) { + return null; + } + + return await config.model.get(foreignKeyValue); + } + + private async loadHasMany( + instance: BaseModel, + config: RelationshipConfig + ): Promise { + if (config.through) { + return await this.loadManyToMany(instance, config); + } + + // Direct has-many relationship + const query = config.model.where(config.foreignKey, '=', instance.id); + return await query.exec(); + } + + private async loadHasOne( + instance: BaseModel, + config: RelationshipConfig + ): Promise { + const results = await this.loadHasMany(instance, config); + return results[0] || null; + } + + private async loadManyToMany( + instance: BaseModel, + config: RelationshipConfig + ): Promise { + if (!config.through) { + throw new Error('Many-to-many relationships require a through model'); + } + + // Get junction table records + const junctionRecords = await config.through + .where(config.localKey || 'id', '=', instance.id) + .exec(); + + // Extract foreign keys + const foreignKeys = junctionRecords.map(record => record[config.foreignKey]); + + // Get related models + return await config.model.whereIn('id', foreignKeys).exec(); + } + + async eagerLoadRelationships( + instances: BaseModel[], + relationships: string[] + ): Promise { + // Load relationships for multiple instances efficiently + for (const relationshipName of relationships) { + await this.eagerLoadSingleRelationship(instances, relationshipName); + } + } + + private async eagerLoadSingleRelationship( + instances: BaseModel[], + relationshipName: string + ): Promise { + if (instances.length === 0) return; + + const firstInstance = instances[0]; + const relationConfig = firstInstance.constructor.relationships.get(relationshipName); + + if (!relationConfig) { + throw new Error(`Relationship '${relationshipName}' not found`); + } + + switch (relationConfig.type) { + case 'belongsTo': + await this.eagerLoadBelongsTo(instances, relationConfig); + break; + case 'hasMany': + await this.eagerLoadHasMany(instances, relationConfig); + break; + // Add other relationship types... + } + } + + private async eagerLoadBelongsTo( + instances: BaseModel[], + config: RelationshipConfig + ): Promise { + // Get all foreign key values + const foreignKeys = instances + .map(instance => instance[config.foreignKey]) + .filter(key => key != null); + + // Remove duplicates + const uniqueForeignKeys = [...new Set(foreignKeys)]; + + // Load all related models at once + const relatedModels = await config.model.whereIn('id', uniqueForeignKeys).exec(); + + // Create lookup map + const relatedMap = new Map(); + relatedModels.forEach(model => relatedMap.set(model.id, model)); + + // Assign to instances + instances.forEach(instance => { + const foreignKeyValue = instance[config.foreignKey]; + const related = relatedMap.get(foreignKeyValue) || null; + instance._loadedRelations.set(relationshipName, related); + }); + } +} +Phase 5: Automatic Features (Weeks 9-10) +5.1 Pinning Manager +File: src/framework/pinning/PinningManager.ts +typescriptexport class PinningManager { + private framework: DebrosFramework; + private strategies: Map = new Map(); + + constructor(framework: DebrosFramework) { + this.framework = framework; + this.initializeStrategies(); + } + + async pinDocument(model: BaseModel, document: any): Promise { + const modelClass = model.constructor as typeof BaseModel; + const pinningConfig = ModelRegistry.getConfig(modelClass.name)?.pinning; + + if (!pinningConfig) { + // Use default pinning + await this.pinToNodes(document.cid, 2); + return; + } + + const strategy = this.strategies.get(pinningConfig.strategy || 'fixed'); + if (!strategy) { + throw new Error(`Unknown pinning strategy: ${pinningConfig.strategy}`); + } + + const pinningFactor = await strategy.calculatePinningFactor(document, pinningConfig); + await this.pinToNodes(document.cid, pinningFactor); + } + + private async pinToNodes(cid: string, factor: number): Promise { + // Get available nodes from IPFS service + const availableNodes = await this.framework.ipfsService.getConnectedPeers(); + const nodeArray = Array.from(availableNodes.keys()); + + // Select nodes for pinning + const selectedNodes = this.selectPinningNodes(nodeArray, factor); + + // Pin to selected nodes + const pinPromises = selectedNodes.map(nodeId => + this.pinToSpecificNode(nodeId, cid) + ); + + await Promise.allSettled(pinPromises); + } + + private selectPinningNodes(nodes: string[], factor: number): string[] { + // Simple round-robin selection for now + // Could be enhanced with load balancing, geographic distribution, etc. + const shuffled = [...nodes].sort(() => Math.random() - 0.5); + return shuffled.slice(0, Math.min(factor, nodes.length)); + } + + private async pinToSpecificNode(nodeId: string, cid: string): Promise { + try { + // Implementation depends on your IPFS cluster setup + // This could be HTTP API calls, libp2p messages, etc. + await this.framework.ipfsService.pinOnNode(nodeId, cid); + } catch (error) { + console.warn(`Failed to pin ${cid} to node ${nodeId}:`, error); + } + } +} + +export interface PinningStrategy { + calculatePinningFactor(document: any, config: PinningConfig): Promise; +} + +export class PopularityPinningStrategy implements PinningStrategy { + async calculatePinningFactor(document: any, config: PinningConfig): Promise { + const baseFactor = config.factor || 2; + + // Increase pinning based on engagement + const likes = document.likes || 0; + const comments = document.comments || 0; + const engagement = likes + (comments * 2); + + if (engagement > 1000) return baseactor * 5; + if (engagement > 100) return baseactor * 3; + if (engagement > 10) return baseactor * 2; + + return baseFactor; + } +} +5.2 PubSub Manager +File: src/framework/pubsub/PubSubManager.ts +typescriptexport class PubSubManager { + private framework: DebrosFramework; + private subscriptions: Map> = new Map(); + + constructor(framework: DebrosFramework) { + this.framework = framework; + } + + async publishModelEvent( + model: BaseModel, + event: string, + data: any + ): Promise { + const modelClass = model.constructor as typeof BaseModel; + const pubsubConfig = ModelRegistry.getConfig(modelClass.name)?.pubsub; + + if (!pubsubConfig || !pubsubConfig.events.includes(event)) { + return; // No pub/sub configured for this event + } + + // Publish to configured channels + for (const channelTemplate of pubsubConfig.channels) { + const channel = this.resolveChannelTemplate(channelTemplate, model, data); + await this.publishToChannel(channel, { + model: modelClass.name, + event, + data, + timestamp: Date.now() + }); + } + } + + async subscribe( + channel: string, + callback: (data: any) => void + ): Promise<() => void> { + if (!this.subscriptions.has(channel)) { + this.subscriptions.set(channel, new Set()); + + // Subscribe to IPFS pubsub + await this.framework.ipfsService.pubsub.subscribe( + channel, + (message) => this.handleChannelMessage(channel, message) + ); + } + + this.subscriptions.get(channel)!.add(callback); + + // Return unsubscribe function + return () => { + const channelSubs = this.subscriptions.get(channel); + if (channelSubs) { + channelSubs.delete(callback); + if (channelSubs.size === 0) { + this.subscriptions.delete(channel); + this.framework.ipfsService.pubsub.unsubscribe(channel); + } + } + }; + } + + private resolveChannelTemplate( + template: string, + model: BaseModel, + data: any + ): string { + return template + .replace('{userId}', model.userId || 'unknown') + .replace('{modelName}', model.constructor.name) + .replace('{id}', model.id); + } + + private async publishToChannel(channel: string, data: any): Promise { + const message = JSON.stringify(data); + await this.framework.ipfsService.pubsub.publish(channel, message); + } + + private handleChannelMessage(channel: string, message: any): void { + const subscribers = this.subscriptions.get(channel); + if (!subscribers) return; + + try { + const data = JSON.parse(message.data.toString()); + subscribers.forEach(callback => { + try { + callback(data); + } catch (error) { + console.error('Error in pubsub callback:', error); + } + }); + } catch (error) { + console.error('Error parsing pubsub message:', error); + } + } +} +Phase 6: Migration System (Weeks 11-12) +6.1 Migration Manager +File: src/framework/migrations/MigrationManager.ts +typescriptexport abstract class Migration { + abstract version: number; + abstract modelName: string; + + abstract up(document: any): any; + abstract down(document: any): any; + + async validate(document: any): Promise { + // Optional validation after migration + return true; + } +} + +export class MigrationManager { + private migrations: Map = new Map(); + private framework: DebrosFramework; + + constructor(framework: DebrosFramework) { + this.framework = framework; + } + + registerMigration(migration: Migration): void { + const modelName = migration.modelName; + + if (!this.migrations.has(modelName)) { + this.migrations.set(modelName, []); + } + + const modelMigrations = this.migrations.get(modelName)!; + modelMigrations.push(migration); + + // Sort by version + modelMigrations.sort((a, b) => a.version - b.version); + } + + async migrateDocument( + document: any, + modelName: string, + targetVersion?: number + ): Promise { + const currentVersion = document._schemaVersion || 1; + const modelClass = ModelRegistry.get(modelName); + + if (!modelClass) { + throw new Error(`Model ${modelName} not found`); + } + + const finalVersion = targetVersion || modelClass.currentVersion || 1; + + if (currentVersion === finalVersion) { + return document; // No migration needed + } + + if (currentVersion > finalVersion) { + return await this.downgradeDocument(document, modelName, currentVersion, finalVersion); + } else { + return await this.upgradeDocument(document, modelName, currentVersion, finalVersion); + } + } + + private async upgradeDocument( + document: any, + modelName: string, + fromVersion: number, + toVersion: number + ): Promise { + const migrations = this.getMigrationsForModel(modelName); + let current = { ...document }; + + for (const migration of migrations) { + if (migration.version > fromVersion && migration.version <= toVersion) { + try { + current = migration.up(current); + current._schemaVersion = migration.version; + + // Validate migration result + const isValid = await migration.validate(current); + if (!isValid) { + throw new Error(`Migration validation failed for version ${migration.version}`); + } + } catch (error) { + console.error(`Migration failed at version ${migration.version}:`, error); + throw error; + } + } + } + + return current; + } + + private async downgradeDocument( + document: any, + modelName: string, + fromVersion: number, + toVersion: number + ): Promise { + const migrations = this.getMigrationsForModel(modelName).reverse(); + let current = { ...document }; + + for (const migration of migrations) { + if (migration.version <= fromVersion && migration.version > toVersion) { + try { + current = migration.down(current); + current._schemaVersion = migration.version - 1; + } catch (error) { + console.error(`Downgrade failed at version ${migration.version}:`, error); + throw error; + } + } + } + + return current; + } + + private getMigrationsForModel(modelName: string): Migration[] { + return this.migrations.get(modelName) || []; + } + + async migrateAllDocuments(modelName: string): Promise { + // Background migration of all documents for a model + const modelClass = ModelRegistry.get(modelName); + if (!modelClass) { + throw new Error(`Model ${modelName} not found`); + } + + if (modelClass.scope === 'user') { + await this.migrateUserScopedModel(modelName); + } else { + await this.migrateGlobalModel(modelName); + } + } + + private async migrateUserScopedModel(modelName: string): Promise { + // This is complex - would need to iterate through all users + // and migrate their individual databases + console.log(`Background migration for user-scoped model ${modelName} not implemented`); + } + + private async migrateGlobalModel(modelName: string): Promise { + // Migrate documents in global database + const db = await this.framework.databaseManager.getGlobalDatabase(modelName); + // Implementation depends on database type and migration strategy + } +} + +// Example migration +export class PostAddMediaMigration extends Migration { + version = 2; + modelName = 'Post'; + + up(document: any): any { + return { + ...document, + mediaCIDs: [], // Add new field + _schemaVersion: 2 + }; + } + + down(document: any): any { + const { mediaCIDs, ...rest } = document; + return { + ...rest, + _schemaVersion: 1 + }; + } +} +Phase 7: Framework Integration (Weeks 13-14) +7.1 Main Framework Class +File: src/framework/core/DebrosFramework.ts +typescriptexport class DebrosFramework { + private static instance: DebrosFramework; + + public databaseManager: DatabaseManager; + public shardManager: ShardManager; + public queryExecutor: QueryExecutor; + public relationshipManager: RelationshipManager; + public pinningManager: PinningManager; + public pubsubManager: PubSubManager; + public migrationManager: MigrationManager; + public cacheManager: CacheManager; + + public ipfsService: any; + public orbitDBService: any; + + private initialized: boolean = false; + + constructor(config: FrameworkConfig) { + this.databaseManager = new DatabaseManager(this); + this.shardManager = new ShardManager(); + this.relationshipManager = new RelationshipManager(this); + this.pinningManager = new PinningManager(this); + this.pubsubManager = new PubSubManager(this); + this.migrationManager = new MigrationManager(this); + this.cacheManager = new CacheManager(config.cache); + + // Use existing services + this.ipfsService = ipfsService; + this.orbitDBService = orbitDBService; + } + + static getInstance(config?: FrameworkConfig): DebrosFramework { + if (!DebrosFramework.instance) { + if (!config) { + throw new Error('Framework not initialized. Provide config on first call.'); + } + DebrosFramework.instance = new DebrosFramework(config); + } + return DebrosFramework.instance; + } + + async initialize(models: Array = []): Promise { + if (this.initialized) { + return; + } + + // Initialize underlying services + await this.ipfsService.init(); + await this.orbitDBService.init(); + + // Register models + models.forEach(model => { + if (!ModelRegistry.get(model.name)) { + // Auto-register models that weren't registered via decorators + ModelRegistry.register(model.name, model, {}); + } + }); + + // Initialize databases + await this.databaseManager.initializeAllDatabases(); + + // Create shards for global models + const globalModels = ModelRegistry.getGlobalModels(); + for (const model of globalModels) { + if (model.sharding) { + await this.shardManager.createShards(model.name, model.sharding); + } + } + + // Set up model stores + await this.setupModelStores(); + + // Set up automatic event handling + await this.setupEventHandling(); + + this.initialized = true; + } + + async createUser(userData: any): Promise { + return await this.databaseManager.createUserDatabases(userData.id); + } + + async getUser(userId: string): Promise { + return await this.databaseManager.getUserMappings(userId); + } + + private async setupModelStores(): Promise { + const allModels = ModelRegistry.getAllModels(); + + for (const [modelName, modelClass] of allModels) { + // Set the store for each model + if (modelClass.scope === 'global') { + if (modelClass.sharding) { + // Sharded global model + const shards = this.shardManager.getAllShards(modelName); + modelClass.setShards(shards); + } else { + // Single global database + const db = await this.databaseManager.getGlobalDatabase(modelName); + modelClass.setStore(db); + } + } + // User-scoped models get their stores dynamically per query + } + } + + private async setupEventHandling(): Promise { + // Set up automatic pub/sub and pinning for model events + const allModels = ModelRegistry.getAllModels(); + + for (const [modelName, modelClass] of allModels) { + // Hook into model lifecycle events + this.setupModelEventHooks(modelClass); + } + } + + private setupModelEventHooks(modelClass: typeof BaseModel): void { + const originalCreate = modelClass.create; + const originalUpdate = modelClass.prototype.update; + const originalDelete = modelClass.prototype.delete; + + // Override create method + modelClass.create = async function(data: any) { + const instance = await originalCreate.call(this, data); + + // Automatic pinning + await DebrosFramework.getInstance().pinningManager.pinDocument(instance, data); + + // Automatic pub/sub + await DebrosFramework.getInstance().pubsubManager.publishModelEvent( + instance, 'created', data + ); + + return instance; + }; + + // Override update method + modelClass.prototype.update = async function(data: any) { + const result = await originalUpdate.call(this, data); + + // Automatic pub/sub + await DebrosFramework.getInstance().pubsubManager.publishModelEvent( + this, 'updated', data + ); + + return result; + }; + + // Override delete method + modelClass.prototype.delete = async function() { + const result = await originalDelete.call(this); + + // Automatic pub/sub + await DebrosFramework.getInstance().pubsubManager.publishModelEvent( + this, 'deleted', {} + ); + + return result; + }; + } + + async stop(): Promise { + await this.orbitDBService.stop(); + await this.ipfsService.stop(); + this.initialized = false; + } +} + +export interface FrameworkConfig { + cache?: CacheConfig; + defaultPinning?: PinningConfig; + autoMigration?: boolean; +} +Testing Strategy +Unit Tests + +Model Tests: Test model creation, validation, serialization +Decorator Tests: Test all decorators work correctly +Query Tests: Test query builder and execution +Relationship Tests: Test all relationship types +Migration Tests: Test schema migrations +Sharding Tests: Test shard distribution and querying + +Integration Tests + +End-to-End Scenarios: Complete user workflows +Cross-Model Tests: Complex queries across multiple models +Performance Tests: Large dataset handling +Failure Recovery: Network failures, node failures + +Performance Tests + +Scalability Tests: Test with millions of documents +Query Performance: Benchmark query execution times +Memory Usage: Monitor memory consumption +Concurrent Access: Test multiple simultaneous operations + +Documentation Requirements +Developer Documentation + +Getting Started Guide: Basic setup and first model +Model Guide: Comprehensive model documentation +Relationships Guide: All relationship types with examples +Query Guide: Complete query API documentation +Migration Guide: Schema evolution patterns +Advanced Features: Sharding, pinning, pub/sub customization + +API Reference + +Complete TypeScript API documentation +All decorators with examples +Query builder methods +Framework configuration options + +Examples + +Basic blog application +Social media features +Real-time chat +Complex relationship scenarios +Migration examples + +Implementation Priorities +Critical Path (Must implement first) + +BaseModel class with basic CRUD +@Model and @Field decorators +Basic query builder (where, limit, etc.) +User database creation and management +Simple relationships (belongsTo, hasMany) + +High Priority (Implement second) + +Global indexing for cross-user queries +Automatic pinning based on model config +Query optimization and caching +Complete relationship types +Migration system + +Medium Priority (Can be added later) + +Advanced sharding strategies +Complex pinning strategies +Pub/sub system +Performance monitoring +Advanced caching + +Nice to Have (Future enhancements) + +GraphQL integration +Real-time subscriptions +Backup and recovery +Analytics and metrics +Admin dashboard + +Development Workflow +Phase Implementation + +Create feature branch for each phase +Implement core functionality with basic tests +Add comprehensive tests for the feature +Update documentation with examples +Review and integrate with main branch + +Code Quality Standards + +TypeScript strict mode enabled +100% type coverage for public APIs +Unit test coverage minimum 80% +ESLint and Prettier for code formatting +Conventional commits for changelog generation + +Testing Approach + +TDD approach where possible +Mock OrbitDB/IPFS for unit tests +Real OrbitDB for integration tests +Performance benchmarks for critical paths + +This specification provides a comprehensive roadmap for building the DebrosFramework. Each phase builds upon the previous one, allowing for iterative development and testing. The framework will provide a powerful, developer-friendly abstraction over OrbitDB while maintaining the scalability benefits of your original architecture.Crafted comprehensive dev document for AI framework implementation.7sThe user wants a comprehensive development document that can be provided to AI assistants to help build the framework. I've created a very detailed specification that covers: + +Architecture and Design Principles - Clear overview of what we're building and why +Detailed Project Structure - Complete file organization +Phase-by-Phase Implementation Plan - 7 phases over 14 weeks with specific deliverables +Complete Code Examples - Detailed implementation examples for each major component +Testing Strategy - Unit, integration, and performance testing approaches +Documentation Requirements - What docs need to be created +Implementation Priorities - What to build first vs. later +Development Workflow - How to organize the work + +The document is structured so that an AI assistant could: + +Understand the overall architecture +Implement specific components with the provided examples +Follow the testing and documentation requirements +Prioritize work appropriately + +Each phase has specific deliverables and code examples that show exactly what needs to be built. The document balances being comprehensive with being actionable - it provides enough detail that someone (or an AI) could start implementing immediately. +Key strengths of this specification: + +Concrete code examples for all major components +Clear separation of concerns between different modules +Incremental development approach that allows testing at each phase +Realistic timeline with achievable milestones +Comprehensive testing strategy to ensure quality +Scalability considerations built into the design from the start + +The document should give the user everything they need to either implement this themselves or provide to AI assistants for help with implementation.I've created a comprehensive development specification document that covers everything needed to build the DebrosFramework. This document is designed to be provided to AI assistants like Claude for implementation help. +Key Features of This Specification: +Complete Architecture Overview + +Clear design principles and goals +Detailed project structure with file organization +Integration with your existing @debros/network codebase + +Phase-by-Phase Implementation Plan (14 weeks) + +Phase 1-2: Core model system with decorators +Phase 3-4: Database management and sharding +Phase 5-6: Query system and relationships +Phase 7-8: Relationship loading and caching +Phase 9-10: Automatic pinning and pub/sub +Phase 11-12: Migration system +Phase 13-14: Framework integration and optimization + +Detailed Code Examples + +Complete BaseModel implementation +All decorator implementations (@Model, @Field, @BelongsTo, etc.) +Query builder with smart execution strategies +Relationship management across database types +Automatic pinning and pub/sub systems +Schema migration handling + +Comprehensive Implementation Details + +How user-scoped vs global databases work +Sharding strategies for millions of users +Query optimization for different scenarios +Relationship loading across database types +Automatic feature management (pinning, pub/sub, etc.) + +Developer Experience Focus +The framework provides a clean, familiar API while handling all OrbitDB complexity automatically: +typescript// Simple API that developers see +@Model({ scope: 'user', pinning: { factor: 3 } }) +class Post extends BaseModel { + @Field({ type: 'string' }) + content: string; + + @BelongsTo(User, 'userId') + author: User; +} + +// Complex operations work seamlessly +const posts = await Post + .whereUserIn(followedUsers) + .where('isPublic', '=', true) + .load(['author']) + .orderBy('createdAt', 'desc') + .limit(50) + .exec(); +Testing & Quality Assurance + +Unit, integration, and performance testing strategies +Code quality standards and workflows +Documentation requirements + +How to Use This Specification: + +For AI Assistance: Provide this entire document to Claude or other AI assistants when asking for implementation help +For Development Teams: Use as a technical specification and roadmap +For Phase Planning: Each phase has clear deliverables and can be implemented independently \ No newline at end of file diff --git a/tests/e2e/blog-example.test.ts b/tests/e2e/blog-example.test.ts new file mode 100644 index 0000000..78e4e5e --- /dev/null +++ b/tests/e2e/blog-example.test.ts @@ -0,0 +1,996 @@ +import { describe, beforeEach, afterEach, it, expect, jest } from '@jest/globals'; +import { DebrosFramework } from '../../src/framework/DebrosFramework'; +import { BaseModel } from '../../src/framework/models/BaseModel'; +import { Model, Field, HasMany, BelongsTo, HasOne, BeforeCreate, AfterCreate } from '../../src/framework/models/decorators'; +import { createMockServices } from '../mocks/services'; + +// Complete Blog Example Models +@Model({ + scope: 'global', + type: 'docstore' +}) +class User extends BaseModel { + @Field({ type: 'string', required: true, unique: true }) + username: string; + + @Field({ type: 'string', required: true, unique: true }) + email: string; + + @Field({ type: 'string', required: true }) + password: string; // In real app, this would be hashed + + @Field({ type: 'string', required: false }) + displayName?: string; + + @Field({ type: 'string', required: false }) + avatar?: string; + + @Field({ type: 'boolean', required: false, default: true }) + isActive: boolean; + + @Field({ type: 'array', required: false, default: [] }) + roles: string[]; + + @Field({ type: 'number', required: false }) + createdAt: number; + + @Field({ type: 'number', required: false }) + lastLoginAt?: number; + + @HasMany(() => Post, 'authorId') + posts: Post[]; + + @HasMany(() => Comment, 'authorId') + comments: Comment[]; + + @HasOne(() => UserProfile, 'userId') + profile: UserProfile; + + @BeforeCreate() + setTimestamps() { + this.createdAt = Date.now(); + } + + // Helper methods + async updateLastLogin() { + this.lastLoginAt = Date.now(); + await this.save(); + } + + async changePassword(newPassword: string) { + // In a real app, this would hash the password + this.password = newPassword; + await this.save(); + } +} + +@Model({ + scope: 'global', + type: 'docstore' +}) +class UserProfile extends BaseModel { + @Field({ type: 'string', required: true }) + userId: string; + + @Field({ type: 'string', required: false }) + bio?: string; + + @Field({ type: 'string', required: false }) + location?: string; + + @Field({ type: 'string', required: false }) + website?: string; + + @Field({ type: 'object', required: false }) + socialLinks?: { + twitter?: string; + github?: string; + linkedin?: string; + }; + + @Field({ type: 'array', required: false, default: [] }) + interests: string[]; + + @BelongsTo(() => User, 'userId') + user: User; +} + +@Model({ + scope: 'global', + type: 'docstore' +}) +class Category extends BaseModel { + @Field({ type: 'string', required: true, unique: true }) + name: string; + + @Field({ type: 'string', required: true, unique: true }) + slug: string; + + @Field({ type: 'string', required: false }) + description?: string; + + @Field({ type: 'string', required: false }) + color?: string; + + @Field({ type: 'boolean', required: false, default: true }) + isActive: boolean; + + @HasMany(() => Post, 'categoryId') + posts: Post[]; + + @BeforeCreate() + generateSlug() { + if (!this.slug && this.name) { + this.slug = this.name.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, ''); + } + } +} + +@Model({ + scope: 'user', + type: 'docstore' +}) +class Post extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; + + @Field({ type: 'string', required: true, unique: true }) + slug: string; + + @Field({ type: 'string', required: true }) + content: string; + + @Field({ type: 'string', required: false }) + excerpt?: string; + + @Field({ type: 'string', required: true }) + authorId: string; + + @Field({ type: 'string', required: false }) + categoryId?: string; + + @Field({ type: 'array', required: false, default: [] }) + tags: string[]; + + @Field({ type: 'string', required: false, default: 'draft' }) + status: 'draft' | 'published' | 'archived'; + + @Field({ type: 'string', required: false }) + featuredImage?: string; + + @Field({ type: 'boolean', required: false, default: false }) + isFeatured: boolean; + + @Field({ type: 'number', required: false, default: 0 }) + viewCount: number; + + @Field({ type: 'number', required: false, default: 0 }) + likeCount: number; + + @Field({ type: 'number', required: false }) + createdAt: number; + + @Field({ type: 'number', required: false }) + updatedAt: number; + + @Field({ type: 'number', required: false }) + publishedAt?: number; + + @BelongsTo(() => User, 'authorId') + author: User; + + @BelongsTo(() => Category, 'categoryId') + category: Category; + + @HasMany(() => Comment, 'postId') + comments: Comment[]; + + @BeforeCreate() + setTimestamps() { + const now = Date.now(); + this.createdAt = now; + this.updatedAt = now; + } + + @AfterCreate() + generateSlugIfNeeded() { + if (!this.slug && this.title) { + this.slug = this.title.toLowerCase().replace(/\s+/g, '-').replace(/[^a-z0-9-]/g, '') + '-' + this.id.slice(-8); + } + } + + // Helper methods + async publish() { + this.status = 'published'; + this.publishedAt = Date.now(); + this.updatedAt = Date.now(); + await this.save(); + } + + async unpublish() { + this.status = 'draft'; + this.publishedAt = undefined; + this.updatedAt = Date.now(); + await this.save(); + } + + async incrementViews() { + this.viewCount += 1; + await this.save(); + } + + async like() { + this.likeCount += 1; + await this.save(); + } + + async unlike() { + if (this.likeCount > 0) { + this.likeCount -= 1; + await this.save(); + } + } +} + +@Model({ + scope: 'user', + type: 'docstore' +}) +class Comment extends BaseModel { + @Field({ type: 'string', required: true }) + content: string; + + @Field({ type: 'string', required: true }) + postId: string; + + @Field({ type: 'string', required: true }) + authorId: string; + + @Field({ type: 'string', required: false }) + parentId?: string; // For nested comments + + @Field({ type: 'boolean', required: false, default: true }) + isApproved: boolean; + + @Field({ type: 'number', required: false, default: 0 }) + likeCount: number; + + @Field({ type: 'number', required: false }) + createdAt: number; + + @Field({ type: 'number', required: false }) + updatedAt: number; + + @BelongsTo(() => Post, 'postId') + post: Post; + + @BelongsTo(() => User, 'authorId') + author: User; + + @BelongsTo(() => Comment, 'parentId') + parent?: Comment; + + @HasMany(() => Comment, 'parentId') + replies: Comment[]; + + @BeforeCreate() + setTimestamps() { + const now = Date.now(); + this.createdAt = now; + this.updatedAt = now; + } + + // Helper methods + async approve() { + this.isApproved = true; + this.updatedAt = Date.now(); + await this.save(); + } + + async like() { + this.likeCount += 1; + await this.save(); + } +} + +describe('Blog Example - End-to-End Tests', () => { + let framework: DebrosFramework; + let mockServices: any; + + beforeEach(async () => { + mockServices = createMockServices(); + + framework = new DebrosFramework({ + environment: 'test', + features: { + autoMigration: false, + automaticPinning: false, + pubsub: false, + queryCache: true, + relationshipCache: true + } + }); + + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + + // Suppress console output for cleaner test output + jest.spyOn(console, 'log').mockImplementation(); + jest.spyOn(console, 'error').mockImplementation(); + jest.spyOn(console, 'warn').mockImplementation(); + }); + + afterEach(async () => { + if (framework) { + await framework.cleanup(); + } + jest.restoreAllMocks(); + }); + + describe('User Management', () => { + it('should create and manage users', async () => { + // Create a new user + const user = await User.create({ + username: 'johndoe', + email: 'john@example.com', + password: 'secure123', + displayName: 'John Doe', + roles: ['author'] + }); + + expect(user).toBeInstanceOf(User); + expect(user.username).toBe('johndoe'); + expect(user.email).toBe('john@example.com'); + expect(user.displayName).toBe('John Doe'); + expect(user.isActive).toBe(true); + expect(user.roles).toEqual(['author']); + expect(user.createdAt).toBeDefined(); + expect(user.id).toBeDefined(); + }); + + it('should create user profile', async () => { + const user = await User.create({ + username: 'janedoe', + email: 'jane@example.com', + password: 'secure456' + }); + + const profile = await UserProfile.create({ + userId: user.id, + bio: 'Software developer and blogger', + location: 'San Francisco, CA', + website: 'https://janedoe.com', + socialLinks: { + twitter: '@janedoe', + github: 'janedoe' + }, + interests: ['javascript', 'web development', 'open source'] + }); + + expect(profile).toBeInstanceOf(UserProfile); + expect(profile.userId).toBe(user.id); + expect(profile.bio).toBe('Software developer and blogger'); + expect(profile.socialLinks?.twitter).toBe('@janedoe'); + expect(profile.interests).toContain('javascript'); + }); + + it('should handle user authentication workflow', async () => { + const user = await User.create({ + username: 'authuser', + email: 'auth@example.com', + password: 'original123' + }); + + // Simulate login + await user.updateLastLogin(); + expect(user.lastLoginAt).toBeDefined(); + + // Change password + await user.changePassword('newpassword456'); + expect(user.password).toBe('newpassword456'); + }); + }); + + describe('Content Management', () => { + let author: User; + let category: Category; + + beforeEach(async () => { + author = await User.create({ + username: 'contentauthor', + email: 'author@example.com', + password: 'authorpass', + roles: ['author', 'editor'] + }); + + category = await Category.create({ + name: 'Technology', + description: 'Posts about technology and programming' + }); + }); + + it('should create and manage categories', async () => { + expect(category).toBeInstanceOf(Category); + expect(category.name).toBe('Technology'); + expect(category.slug).toBe('technology'); + expect(category.description).toBe('Posts about technology and programming'); + expect(category.isActive).toBe(true); + }); + + it('should create draft posts', async () => { + const post = await Post.create({ + title: 'My First Blog Post', + content: 'This is the content of my first blog post. It contains valuable information about web development.', + excerpt: 'Learn about web development in this comprehensive guide.', + authorId: author.id, + categoryId: category.id, + tags: ['web development', 'tutorial', 'beginner'], + featuredImage: 'https://example.com/image.jpg' + }); + + expect(post).toBeInstanceOf(Post); + expect(post.title).toBe('My First Blog Post'); + expect(post.status).toBe('draft'); // Default status + expect(post.authorId).toBe(author.id); + expect(post.categoryId).toBe(category.id); + expect(post.tags).toEqual(['web development', 'tutorial', 'beginner']); + expect(post.viewCount).toBe(0); + expect(post.likeCount).toBe(0); + expect(post.createdAt).toBeDefined(); + expect(post.slug).toBeDefined(); + }); + + it('should publish and unpublish posts', async () => { + const post = await Post.create({ + title: 'Publishing Test Post', + content: 'This post will be published and then unpublished.', + authorId: author.id + }); + + // Initially draft + expect(post.status).toBe('draft'); + expect(post.publishedAt).toBeUndefined(); + + // Publish the post + await post.publish(); + expect(post.status).toBe('published'); + expect(post.publishedAt).toBeDefined(); + + // Unpublish the post + await post.unpublish(); + expect(post.status).toBe('draft'); + expect(post.publishedAt).toBeUndefined(); + }); + + it('should track post engagement', async () => { + const post = await Post.create({ + title: 'Engagement Test Post', + content: 'This post will test engagement tracking.', + authorId: author.id + }); + + // Track views + await post.incrementViews(); + await post.incrementViews(); + expect(post.viewCount).toBe(2); + + // Track likes + await post.like(); + await post.like(); + expect(post.likeCount).toBe(2); + + // Unlike + await post.unlike(); + expect(post.likeCount).toBe(1); + }); + }); + + describe('Comment System', () => { + let author: User; + let commenter: User; + let post: Post; + + beforeEach(async () => { + author = await User.create({ + username: 'postauthor', + email: 'postauthor@example.com', + password: 'authorpass' + }); + + commenter = await User.create({ + username: 'commenter', + email: 'commenter@example.com', + password: 'commenterpass' + }); + + post = await Post.create({ + title: 'Post with Comments', + content: 'This post will have comments.', + authorId: author.id + }); + await post.publish(); + }); + + it('should create comments on posts', async () => { + const comment = await Comment.create({ + content: 'This is a great post! Thanks for sharing.', + postId: post.id, + authorId: commenter.id + }); + + expect(comment).toBeInstanceOf(Comment); + expect(comment.content).toBe('This is a great post! Thanks for sharing.'); + expect(comment.postId).toBe(post.id); + expect(comment.authorId).toBe(commenter.id); + expect(comment.isApproved).toBe(true); // Default value + expect(comment.likeCount).toBe(0); + expect(comment.createdAt).toBeDefined(); + }); + + it('should support nested comments (replies)', async () => { + // Create parent comment + const parentComment = await Comment.create({ + content: 'This is the parent comment.', + postId: post.id, + authorId: commenter.id + }); + + // Create reply + const reply = await Comment.create({ + content: 'This is a reply to the parent comment.', + postId: post.id, + authorId: author.id, + parentId: parentComment.id + }); + + expect(reply.parentId).toBe(parentComment.id); + expect(reply.content).toBe('This is a reply to the parent comment.'); + }); + + it('should manage comment approval and engagement', async () => { + const comment = await Comment.create({ + content: 'This comment needs approval.', + postId: post.id, + authorId: commenter.id, + isApproved: false + }); + + // Initially not approved + expect(comment.isApproved).toBe(false); + + // Approve comment + await comment.approve(); + expect(comment.isApproved).toBe(true); + + // Like comment + await comment.like(); + expect(comment.likeCount).toBe(1); + }); + }); + + describe('Content Discovery and Queries', () => { + let authors: User[]; + let categories: Category[]; + let posts: Post[]; + + beforeEach(async () => { + // Create test authors + authors = []; + for (let i = 0; i < 3; i++) { + const author = await User.create({ + username: `author${i}`, + email: `author${i}@example.com`, + password: 'password123' + }); + authors.push(author); + } + + // Create test categories + categories = []; + const categoryNames = ['Technology', 'Design', 'Business']; + for (const name of categoryNames) { + const category = await Category.create({ + name, + description: `Posts about ${name.toLowerCase()}` + }); + categories.push(category); + } + + // Create test posts + posts = []; + for (let i = 0; i < 6; i++) { + const post = await Post.create({ + title: `Test Post ${i + 1}`, + content: `This is the content of test post ${i + 1}.`, + authorId: authors[i % authors.length].id, + categoryId: categories[i % categories.length].id, + tags: [`tag${i}`, `common-tag`], + status: i % 2 === 0 ? 'published' : 'draft' + }); + if (post.status === 'published') { + await post.publish(); + } + posts.push(post); + } + }); + + it('should query posts by status', async () => { + const publishedQuery = Post.query().where('status', 'published'); + const draftQuery = Post.query().where('status', 'draft'); + + // These would work in a real implementation with actual database queries + expect(publishedQuery).toBeDefined(); + expect(draftQuery).toBeDefined(); + expect(typeof publishedQuery.find).toBe('function'); + expect(typeof draftQuery.count).toBe('function'); + }); + + it('should query posts by author', async () => { + const authorQuery = Post.query().where('authorId', authors[0].id); + + expect(authorQuery).toBeDefined(); + expect(typeof authorQuery.find).toBe('function'); + }); + + it('should query posts by category', async () => { + const categoryQuery = Post.query().where('categoryId', categories[0].id); + + expect(categoryQuery).toBeDefined(); + expect(typeof categoryQuery.orderBy).toBe('function'); + }); + + it('should support complex queries with multiple conditions', async () => { + const complexQuery = Post.query() + .where('status', 'published') + .where('isFeatured', true) + .where('categoryId', categories[0].id) + .orderBy('publishedAt', 'desc') + .limit(10); + + expect(complexQuery).toBeDefined(); + expect(typeof complexQuery.find).toBe('function'); + expect(typeof complexQuery.count).toBe('function'); + }); + + it('should query posts by tags', async () => { + const tagQuery = Post.query() + .where('tags', 'includes', 'common-tag') + .where('status', 'published') + .orderBy('publishedAt', 'desc'); + + expect(tagQuery).toBeDefined(); + }); + }); + + describe('Relationships and Data Loading', () => { + let user: User; + let profile: UserProfile; + let category: Category; + let post: Post; + let comments: Comment[]; + + beforeEach(async () => { + // Create user with profile + user = await User.create({ + username: 'relationuser', + email: 'relation@example.com', + password: 'password123' + }); + + profile = await UserProfile.create({ + userId: user.id, + bio: 'I am a test user for relationship testing', + interests: ['testing', 'relationships'] + }); + + // Create category and post + category = await Category.create({ + name: 'Relationships', + description: 'Testing relationships' + }); + + post = await Post.create({ + title: 'Post with Relationships', + content: 'This post tests relationship loading.', + authorId: user.id, + categoryId: category.id + }); + await post.publish(); + + // Create comments + comments = []; + for (let i = 0; i < 3; i++) { + const comment = await Comment.create({ + content: `Comment ${i + 1} on the post.`, + postId: post.id, + authorId: user.id + }); + comments.push(comment); + } + }); + + it('should load user relationships', async () => { + const relationshipManager = framework.getRelationshipManager(); + + // Load user's posts + const userPosts = await relationshipManager!.loadRelationship(user, 'posts'); + expect(Array.isArray(userPosts)).toBe(true); + + // Load user's profile + const userProfile = await relationshipManager!.loadRelationship(user, 'profile'); + // Mock implementation might return null, but the method should work + expect(userProfile === null || userProfile instanceof UserProfile).toBe(true); + + // Load user's comments + const userComments = await relationshipManager!.loadRelationship(user, 'comments'); + expect(Array.isArray(userComments)).toBe(true); + }); + + it('should load post relationships', async () => { + const relationshipManager = framework.getRelationshipManager(); + + // Load post's author + const postAuthor = await relationshipManager!.loadRelationship(post, 'author'); + // Mock might return null, but relationship should be loadable + expect(postAuthor === null || postAuthor instanceof User).toBe(true); + + // Load post's category + const postCategory = await relationshipManager!.loadRelationship(post, 'category'); + expect(postCategory === null || postCategory instanceof Category).toBe(true); + + // Load post's comments + const postComments = await relationshipManager!.loadRelationship(post, 'comments'); + expect(Array.isArray(postComments)).toBe(true); + }); + + it('should support eager loading of multiple relationships', async () => { + const relationshipManager = framework.getRelationshipManager(); + + // Eager load multiple relationships on multiple posts + await relationshipManager!.eagerLoadRelationships( + [post], + ['author', 'category', 'comments'] + ); + + // Relationships should be available through the loaded relations + expect(post._loadedRelations.size).toBeGreaterThan(0); + }); + + it('should handle nested relationships', async () => { + const relationshipManager = framework.getRelationshipManager(); + + // Load comments first + const postComments = await relationshipManager!.loadRelationship(post, 'comments'); + + if (Array.isArray(postComments) && postComments.length > 0) { + // Load author relationship on first comment + const commentAuthor = await relationshipManager!.loadRelationship(postComments[0], 'author'); + expect(commentAuthor === null || commentAuthor instanceof User).toBe(true); + } + }); + }); + + describe('Blog Workflow Integration', () => { + it('should support complete blog publishing workflow', async () => { + // 1. Create author + const author = await User.create({ + username: 'blogauthor', + email: 'blog@example.com', + password: 'blogpass', + displayName: 'Blog Author', + roles: ['author'] + }); + + // 2. Create author profile + const profile = await UserProfile.create({ + userId: author.id, + bio: 'Professional blogger and writer', + website: 'https://blogauthor.com' + }); + + // 3. Create category + const category = await Category.create({ + name: 'Web Development', + description: 'Posts about web development and programming' + }); + + // 4. Create draft post + const post = await Post.create({ + title: 'Advanced JavaScript Techniques', + content: 'In this post, we will explore advanced JavaScript techniques...', + excerpt: 'Learn advanced JavaScript techniques to improve your code.', + authorId: author.id, + categoryId: category.id, + tags: ['javascript', 'advanced', 'programming'], + featuredImage: 'https://example.com/js-advanced.jpg' + }); + + expect(post.status).toBe('draft'); + + // 5. Publish the post + await post.publish(); + expect(post.status).toBe('published'); + expect(post.publishedAt).toBeDefined(); + + // 6. Reader discovers and engages with post + await post.incrementViews(); + await post.like(); + expect(post.viewCount).toBe(1); + expect(post.likeCount).toBe(1); + + // 7. Create reader and comment + const reader = await User.create({ + username: 'reader', + email: 'reader@example.com', + password: 'readerpass' + }); + + const comment = await Comment.create({ + content: 'Great post! Very helpful information.', + postId: post.id, + authorId: reader.id + }); + + // 8. Author replies to comment + const reply = await Comment.create({ + content: 'Thank you for the feedback! Glad you found it helpful.', + postId: post.id, + authorId: author.id, + parentId: comment.id + }); + + // Verify the complete workflow + expect(author).toBeInstanceOf(User); + expect(profile).toBeInstanceOf(UserProfile); + expect(category).toBeInstanceOf(Category); + expect(post).toBeInstanceOf(Post); + expect(comment).toBeInstanceOf(Comment); + expect(reply).toBeInstanceOf(Comment); + expect(reply.parentId).toBe(comment.id); + }); + + it('should support content management operations', async () => { + const author = await User.create({ + username: 'contentmgr', + email: 'mgr@example.com', + password: 'mgrpass' + }); + + // Create multiple posts + const posts = []; + for (let i = 0; i < 5; i++) { + const post = await Post.create({ + title: `Management Post ${i + 1}`, + content: `Content for post ${i + 1}`, + authorId: author.id, + tags: [`tag${i}`] + }); + posts.push(post); + } + + // Publish some posts + await posts[0].publish(); + await posts[2].publish(); + await posts[4].publish(); + + // Feature a post + posts[0].isFeatured = true; + await posts[0].save(); + + // Archive a post + posts[1].status = 'archived'; + await posts[1].save(); + + // Verify post states + expect(posts[0].status).toBe('published'); + expect(posts[0].isFeatured).toBe(true); + expect(posts[1].status).toBe('archived'); + expect(posts[2].status).toBe('published'); + expect(posts[3].status).toBe('draft'); + }); + }); + + describe('Performance and Scalability', () => { + it('should handle bulk operations efficiently', async () => { + const startTime = Date.now(); + + // Create multiple users concurrently + const userPromises = []; + for (let i = 0; i < 10; i++) { + userPromises.push(User.create({ + username: `bulkuser${i}`, + email: `bulk${i}@example.com`, + password: 'bulkpass' + })); + } + + const users = await Promise.all(userPromises); + expect(users).toHaveLength(10); + + const endTime = Date.now(); + const duration = endTime - startTime; + + // Should complete reasonably quickly (less than 1 second for mocked operations) + expect(duration).toBeLessThan(1000); + }); + + it('should support concurrent read operations', async () => { + const author = await User.create({ + username: 'concurrentauthor', + email: 'concurrent@example.com', + password: 'concurrentpass' + }); + + const post = await Post.create({ + title: 'Concurrent Read Test', + content: 'Testing concurrent reads', + authorId: author.id + }); + + // Simulate concurrent reads + const readPromises = []; + for (let i = 0; i < 5; i++) { + readPromises.push(post.incrementViews()); + } + + await Promise.all(readPromises); + + // View count should reflect all increments + expect(post.viewCount).toBe(5); + }); + }); + + describe('Data Integrity and Validation', () => { + it('should enforce required field validation', async () => { + await expect(User.create({ + // Missing required fields username and email + password: 'password123' + } as any)).rejects.toThrow(); + }); + + it('should enforce unique constraints', async () => { + await User.create({ + username: 'uniqueuser', + email: 'unique@example.com', + password: 'password123' + }); + + // Attempt to create user with same username should fail + await expect(User.create({ + username: 'uniqueuser', // Duplicate username + email: 'different@example.com', + password: 'password123' + })).rejects.toThrow(); + }); + + it('should validate field types', async () => { + await expect(User.create({ + username: 'typetest', + email: 'typetest@example.com', + password: 'password123', + isActive: 'not-a-boolean' as any // Invalid type + })).rejects.toThrow(); + }); + + it('should apply default values correctly', async () => { + const user = await User.create({ + username: 'defaultuser', + email: 'default@example.com', + password: 'password123' + }); + + expect(user.isActive).toBe(true); // Default value + expect(user.roles).toEqual([]); // Default array + + const post = await Post.create({ + title: 'Default Test', + content: 'Testing defaults', + authorId: user.id + }); + + expect(post.status).toBe('draft'); // Default status + expect(post.tags).toEqual([]); // Default array + expect(post.viewCount).toBe(0); // Default number + expect(post.isFeatured).toBe(false); // Default boolean + }); + }); +}); \ No newline at end of file diff --git a/tests/integration/DebrosFramework.test.ts b/tests/integration/DebrosFramework.test.ts new file mode 100644 index 0000000..5dbcdf2 --- /dev/null +++ b/tests/integration/DebrosFramework.test.ts @@ -0,0 +1,536 @@ +import { describe, beforeEach, afterEach, it, expect, jest } from '@jest/globals'; +import { DebrosFramework, DebrosFrameworkConfig } from '../../src/framework/DebrosFramework'; +import { BaseModel } from '../../src/framework/models/BaseModel'; +import { Model, Field, HasMany, BelongsTo } from '../../src/framework/models/decorators'; +import { createMockServices } from '../mocks/services'; + +// Test models for integration testing +@Model({ + scope: 'global', + type: 'docstore' +}) +class User extends BaseModel { + @Field({ type: 'string', required: true }) + username: string; + + @Field({ type: 'string', required: true }) + email: string; + + @Field({ type: 'boolean', required: false, default: true }) + isActive: boolean; + + @HasMany(() => Post, 'userId') + posts: Post[]; +} + +@Model({ + scope: 'user', + type: 'docstore' +}) +class Post extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; + + @Field({ type: 'string', required: true }) + content: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @Field({ type: 'boolean', required: false, default: false }) + published: boolean; + + @BelongsTo(() => User, 'userId') + user: User; +} + +describe('DebrosFramework Integration Tests', () => { + let framework: DebrosFramework; + let mockServices: any; + let config: DebrosFrameworkConfig; + + beforeEach(() => { + mockServices = createMockServices(); + + config = { + environment: 'test', + features: { + autoMigration: false, + automaticPinning: false, + pubsub: false, + queryCache: true, + relationshipCache: true + }, + performance: { + queryTimeout: 5000, + migrationTimeout: 30000, + maxConcurrentOperations: 10, + batchSize: 100 + }, + monitoring: { + enableMetrics: true, + logLevel: 'info', + metricsInterval: 1000 + } + }; + + framework = new DebrosFramework(config); + + // Suppress console output for cleaner test output + jest.spyOn(console, 'log').mockImplementation(); + jest.spyOn(console, 'error').mockImplementation(); + jest.spyOn(console, 'warn').mockImplementation(); + }); + + afterEach(async () => { + if (framework) { + await framework.cleanup(); + } + jest.restoreAllMocks(); + }); + + describe('Framework Initialization', () => { + it('should initialize successfully with valid services', async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + + const status = framework.getStatus(); + expect(status.initialized).toBe(true); + expect(status.healthy).toBe(true); + expect(status.environment).toBe('test'); + expect(status.services.orbitdb).toBe('connected'); + expect(status.services.ipfs).toBe('connected'); + }); + + it('should throw error when already initialized', async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + + await expect( + framework.initialize(mockServices.orbitDBService, mockServices.ipfsService) + ).rejects.toThrow('Framework is already initialized'); + }); + + it('should throw error without required services', async () => { + await expect(framework.initialize()).rejects.toThrow( + 'IPFS service is required' + ); + }); + + it('should handle initialization failures gracefully', async () => { + // Make IPFS service initialization fail + const failingIPFS = { + ...mockServices.ipfsService, + init: jest.fn().mockRejectedValue(new Error('IPFS init failed')) + }; + + await expect( + framework.initialize(mockServices.orbitDBService, failingIPFS) + ).rejects.toThrow('IPFS init failed'); + + const status = framework.getStatus(); + expect(status.initialized).toBe(false); + expect(status.healthy).toBe(false); + }); + + it('should apply config overrides during initialization', async () => { + const overrideConfig = { + environment: 'production' as const, + features: { queryCache: false } + }; + + await framework.initialize( + mockServices.orbitDBService, + mockServices.ipfsService, + overrideConfig + ); + + const status = framework.getStatus(); + expect(status.environment).toBe('production'); + }); + }); + + describe('Framework Lifecycle', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should provide access to core managers', () => { + expect(framework.getDatabaseManager()).toBeDefined(); + expect(framework.getShardManager()).toBeDefined(); + expect(framework.getRelationshipManager()).toBeDefined(); + expect(framework.getQueryCache()).toBeDefined(); + }); + + it('should provide access to services', () => { + expect(framework.getOrbitDBService()).toBeDefined(); + expect(framework.getIPFSService()).toBeDefined(); + }); + + it('should handle graceful shutdown', async () => { + const initialStatus = framework.getStatus(); + expect(initialStatus.initialized).toBe(true); + + await framework.stop(); + + const finalStatus = framework.getStatus(); + expect(finalStatus.initialized).toBe(false); + }); + + it('should perform health checks', async () => { + const health = await framework.healthCheck(); + + expect(health.healthy).toBe(true); + expect(health.services.ipfs).toBe('connected'); + expect(health.services.orbitdb).toBe('connected'); + expect(health.lastHealthCheck).toBeGreaterThan(0); + }); + + it('should collect metrics', () => { + const metrics = framework.getMetrics(); + + expect(metrics).toHaveProperty('uptime'); + expect(metrics).toHaveProperty('totalModels'); + expect(metrics).toHaveProperty('totalDatabases'); + expect(metrics).toHaveProperty('queriesExecuted'); + expect(metrics).toHaveProperty('memoryUsage'); + expect(metrics).toHaveProperty('performance'); + }); + }); + + describe('Model and Database Integration', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should integrate with model system for database operations', async () => { + // Create a user + const userData = { + username: 'testuser', + email: 'test@example.com', + isActive: true + }; + + const user = await User.create(userData); + + expect(user).toBeInstanceOf(User); + expect(user.username).toBe('testuser'); + expect(user.email).toBe('test@example.com'); + expect(user.isActive).toBe(true); + expect(user.id).toBeDefined(); + }); + + it('should handle user-scoped and global-scoped models differently', async () => { + // Global-scoped model (User) + const user = await User.create({ + username: 'globaluser', + email: 'global@example.com' + }); + + // User-scoped model (Post) - should use user's database + const post = await Post.create({ + title: 'Test Post', + content: 'This is a test post', + userId: user.id, + published: true + }); + + expect(user).toBeInstanceOf(User); + expect(post).toBeInstanceOf(Post); + expect(post.userId).toBe(user.id); + }); + + it('should support relationship loading', async () => { + const user = await User.create({ + username: 'userWithPosts', + email: 'posts@example.com' + }); + + // Create posts for the user + await Post.create({ + title: 'First Post', + content: 'Content 1', + userId: user.id + }); + + await Post.create({ + title: 'Second Post', + content: 'Content 2', + userId: user.id + }); + + // Load user's posts + const relationshipManager = framework.getRelationshipManager(); + const posts = await relationshipManager!.loadRelationship(user, 'posts'); + + expect(Array.isArray(posts)).toBe(true); + expect(posts.length).toBeGreaterThanOrEqual(0); // Mock may return empty array + }); + }); + + describe('Query and Cache Integration', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should integrate query system with cache', async () => { + const queryCache = framework.getQueryCache(); + expect(queryCache).toBeDefined(); + + // Test query caching + const cacheKey = 'test-query-key'; + const testData = [{ id: '1', name: 'Test' }]; + + queryCache!.set(cacheKey, testData, 'User'); + const cachedResult = queryCache!.get(cacheKey); + + expect(cachedResult).toEqual(testData); + }); + + it('should support complex query building', () => { + const query = User.query() + .where('isActive', true) + .where('email', 'like', '%@example.com') + .orderBy('username', 'asc') + .limit(10); + + expect(query).toBeDefined(); + expect(typeof query.find).toBe('function'); + expect(typeof query.count).toBe('function'); + }); + }); + + describe('Sharding Integration', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should integrate with shard manager for model distribution', () => { + const shardManager = framework.getShardManager(); + expect(shardManager).toBeDefined(); + + // Test shard routing + const testKey = 'test-key-123'; + const modelWithShards = 'TestModel'; + + // This would work if we had shards created for TestModel + expect(() => { + shardManager!.getShardCount(modelWithShards); + }).not.toThrow(); + }); + + it('should support cross-shard queries', async () => { + const shardManager = framework.getShardManager(); + + // Test querying across all shards (mock implementation) + const queryFn = async (database: any) => { + return []; // Mock query result + }; + + // This would work if we had shards created + const models = shardManager!.getAllModelsWithShards(); + expect(Array.isArray(models)).toBe(true); + }); + }); + + describe('Migration Integration', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should integrate migration system', () => { + const migrationManager = framework.getMigrationManager(); + expect(migrationManager).toBeDefined(); + + // Test migration registration + const testMigration = { + id: 'test-migration-1', + version: '1.0.0', + name: 'Test Migration', + description: 'A test migration', + targetModels: ['User'], + up: [{ + type: 'add_field' as const, + modelName: 'User', + fieldName: 'newField', + fieldConfig: { type: 'string' as const, required: false } + }], + down: [{ + type: 'remove_field' as const, + modelName: 'User', + fieldName: 'newField' + }], + createdAt: Date.now() + }; + + expect(() => { + migrationManager!.registerMigration(testMigration); + }).not.toThrow(); + + const registered = migrationManager!.getMigration(testMigration.id); + expect(registered).toEqual(testMigration); + }); + + it('should handle pending migrations', () => { + const migrationManager = framework.getMigrationManager(); + + const pendingMigrations = migrationManager!.getPendingMigrations(); + expect(Array.isArray(pendingMigrations)).toBe(true); + }); + }); + + describe('Error Handling and Recovery', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should handle service failures gracefully', async () => { + // Simulate OrbitDB service failure + const orbitDBService = framework.getOrbitDBService(); + jest.spyOn(orbitDBService!, 'getOrbitDB').mockImplementation(() => { + throw new Error('OrbitDB service failed'); + }); + + // Framework should still respond to health checks + const health = await framework.healthCheck(); + expect(health).toBeDefined(); + }); + + it('should provide error information in status', async () => { + const status = framework.getStatus(); + + expect(status).toHaveProperty('services'); + expect(status.services).toHaveProperty('orbitdb'); + expect(status.services).toHaveProperty('ipfs'); + }); + + it('should support manual service recovery', async () => { + // Stop the framework + await framework.stop(); + + // Verify it's stopped + let status = framework.getStatus(); + expect(status.initialized).toBe(false); + + // Restart with new services + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + + // Verify it's running again + status = framework.getStatus(); + expect(status.initialized).toBe(true); + expect(status.healthy).toBe(true); + }); + }); + + describe('Configuration Management', () => { + it('should merge default configuration correctly', () => { + const customConfig: DebrosFrameworkConfig = { + environment: 'production', + features: { + queryCache: false, + automaticPinning: true + }, + performance: { + batchSize: 500 + } + }; + + const customFramework = new DebrosFramework(customConfig); + const status = customFramework.getStatus(); + + expect(status.environment).toBe('production'); + }); + + it('should support configuration updates', async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + + const configManager = framework.getConfigManager(); + expect(configManager).toBeDefined(); + + // Configuration should be accessible through the framework + const currentConfig = configManager!.getFullConfig(); + expect(currentConfig).toBeDefined(); + expect(currentConfig.environment).toBe('test'); + }); + }); + + describe('Performance and Monitoring', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should track uptime correctly', () => { + const metrics = framework.getMetrics(); + expect(metrics.uptime).toBeGreaterThanOrEqual(0); + }); + + it('should collect performance metrics', () => { + const metrics = framework.getMetrics(); + + expect(metrics.performance).toBeDefined(); + expect(metrics.performance.slowQueries).toBeDefined(); + expect(metrics.performance.failedOperations).toBeDefined(); + expect(metrics.performance.averageResponseTime).toBeDefined(); + }); + + it('should track memory usage', () => { + const metrics = framework.getMetrics(); + + expect(metrics.memoryUsage).toBeDefined(); + expect(metrics.memoryUsage.queryCache).toBeDefined(); + expect(metrics.memoryUsage.relationshipCache).toBeDefined(); + expect(metrics.memoryUsage.total).toBeDefined(); + }); + + it('should provide detailed status information', () => { + const status = framework.getStatus(); + + expect(status.version).toBeDefined(); + expect(status.lastHealthCheck).toBeGreaterThanOrEqual(0); + expect(status.services).toBeDefined(); + }); + }); + + describe('Concurrent Operations', () => { + beforeEach(async () => { + await framework.initialize(mockServices.orbitDBService, mockServices.ipfsService); + }); + + it('should handle concurrent model operations', async () => { + const promises = []; + + for (let i = 0; i < 5; i++) { + promises.push(User.create({ + username: `user${i}`, + email: `user${i}@example.com` + })); + } + + const users = await Promise.all(promises); + + expect(users).toHaveLength(5); + users.forEach((user, index) => { + expect(user.username).toBe(`user${index}`); + }); + }); + + it('should handle concurrent relationship loading', async () => { + const user = await User.create({ + username: 'concurrentUser', + email: 'concurrent@example.com' + }); + + const relationshipManager = framework.getRelationshipManager(); + + const promises = [ + relationshipManager!.loadRelationship(user, 'posts'), + relationshipManager!.loadRelationship(user, 'posts'), + relationshipManager!.loadRelationship(user, 'posts') + ]; + + const results = await Promise.all(promises); + + expect(results).toHaveLength(3); + // Results should be consistent (either all arrays or all same result) + expect(Array.isArray(results[0])).toBe(Array.isArray(results[1])); + }); + }); +}); \ No newline at end of file diff --git a/tests/mocks/ipfs.ts b/tests/mocks/ipfs.ts new file mode 100644 index 0000000..d4d610b --- /dev/null +++ b/tests/mocks/ipfs.ts @@ -0,0 +1,244 @@ +// Mock IPFS for testing +export class MockLibp2p { + private peers = new Set(); + + async start() { + // Mock start + } + + async stop() { + // Mock stop + } + + getPeers() { + return Array.from(this.peers); + } + + async dial(peerId: string) { + this.peers.add(peerId); + return { remotePeer: peerId }; + } + + async hangUp(peerId: string) { + this.peers.delete(peerId); + } + + get peerId() { + return { toString: () => 'mock-peer-id' }; + } + + // PubSub mock + pubsub = { + publish: jest.fn(async (topic: string, data: Uint8Array) => { + // Mock publish + }), + subscribe: jest.fn(async (topic: string) => { + // Mock subscribe + }), + unsubscribe: jest.fn(async (topic: string) => { + // Mock unsubscribe + }), + getTopics: jest.fn(() => []), + getPeers: jest.fn(() => []) + }; + + // Services mock + services = { + pubsub: this.pubsub + }; +} + +export class MockHelia { + public libp2p: MockLibp2p; + private content = new Map(); + private pins = new Set(); + + constructor() { + this.libp2p = new MockLibp2p(); + } + + async start() { + await this.libp2p.start(); + } + + async stop() { + await this.libp2p.stop(); + } + + get blockstore() { + return { + put: jest.fn(async (cid: any, block: Uint8Array) => { + const key = cid.toString(); + this.content.set(key, block); + return cid; + }), + get: jest.fn(async (cid: any) => { + const key = cid.toString(); + const block = this.content.get(key); + if (!block) { + throw new Error(`Block not found: ${key}`); + } + return block; + }), + has: jest.fn(async (cid: any) => { + return this.content.has(cid.toString()); + }), + delete: jest.fn(async (cid: any) => { + return this.content.delete(cid.toString()); + }) + }; + } + + get datastore() { + return { + put: jest.fn(async (key: any, value: Uint8Array) => { + this.content.set(key.toString(), value); + }), + get: jest.fn(async (key: any) => { + const value = this.content.get(key.toString()); + if (!value) { + throw new Error(`Key not found: ${key}`); + } + return value; + }), + has: jest.fn(async (key: any) => { + return this.content.has(key.toString()); + }), + delete: jest.fn(async (key: any) => { + return this.content.delete(key.toString()); + }) + }; + } + + get pins() { + return { + add: jest.fn(async (cid: any) => { + this.pins.add(cid.toString()); + }), + rm: jest.fn(async (cid: any) => { + this.pins.delete(cid.toString()); + }), + ls: jest.fn(async function* () { + for (const pin of Array.from(this.pins)) { + yield { cid: pin }; + } + }.bind(this)) + }; + } + + // Add UnixFS mock + get fs() { + return { + addBytes: jest.fn(async (data: Uint8Array) => { + const cid = `mock-cid-${Date.now()}`; + this.content.set(cid, data); + return { toString: () => cid }; + }), + cat: jest.fn(async function* (cid: any) { + const data = this.content.get(cid.toString()); + if (data) { + yield data; + } + }.bind(this)), + addFile: jest.fn(async (file: any) => { + const cid = `mock-file-cid-${Date.now()}`; + return { toString: () => cid }; + }) + }; + } +} + +export const createHelia = jest.fn(async (options: any = {}) => { + const helia = new MockHelia(); + await helia.start(); + return helia; +}); + +export const createLibp2p = jest.fn(async (options: any = {}) => { + return new MockLibp2p(); +}); + +// Mock IPFS service for framework +export class MockIPFSService { + private helia: MockHelia; + + constructor() { + this.helia = new MockHelia(); + } + + async init() { + await this.helia.start(); + } + + async stop() { + await this.helia.stop(); + } + + getHelia() { + return this.helia; + } + + getLibp2pInstance() { + return this.helia.libp2p; + } + + async getConnectedPeers() { + const peers = this.helia.libp2p.getPeers(); + const peerMap = new Map(); + peers.forEach(peer => peerMap.set(peer, peer)); + return peerMap; + } + + async pinOnNode(nodeId: string, cid: string) { + await this.helia.pins.add(cid); + } + + get pubsub() { + return { + publish: jest.fn(async (topic: string, data: string) => { + await this.helia.libp2p.pubsub.publish(topic, new TextEncoder().encode(data)); + }), + subscribe: jest.fn(async (topic: string, handler: Function) => { + // Mock subscribe + }), + unsubscribe: jest.fn(async (topic: string) => { + // Mock unsubscribe + }) + }; + } +} + +// Mock OrbitDB service for framework +export class MockOrbitDBService { + private orbitdb: any; + + constructor() { + this.orbitdb = new (require('./orbitdb').MockOrbitDB)(); + } + + async init() { + await this.orbitdb.start(); + } + + async stop() { + await this.orbitdb.stop(); + } + + async openDB(name: string, type: string) { + return await this.orbitdb.open(name, { type }); + } + + getOrbitDB() { + return this.orbitdb; + } +} + +// Default export +export default { + createHelia, + createLibp2p, + MockHelia, + MockLibp2p, + MockIPFSService, + MockOrbitDBService +}; \ No newline at end of file diff --git a/tests/mocks/orbitdb.ts b/tests/mocks/orbitdb.ts new file mode 100644 index 0000000..f016712 --- /dev/null +++ b/tests/mocks/orbitdb.ts @@ -0,0 +1,154 @@ +// Mock OrbitDB for testing +export class MockOrbitDB { + private databases = new Map(); + private isOpen = false; + + async open(name: string, options: any = {}) { + if (!this.databases.has(name)) { + this.databases.set(name, new MockDatabase(name, options)); + } + return this.databases.get(name); + } + + async stop() { + this.isOpen = false; + for (const db of this.databases.values()) { + await db.close(); + } + } + + async start() { + this.isOpen = true; + } + + get address() { + return 'mock-orbitdb-address'; + } +} + +export class MockDatabase { + private data = new Map(); + private _events: Array<{ type: string; payload: any }> = []; + public name: string; + public type: string; + + constructor(name: string, options: any = {}) { + this.name = name; + this.type = options.type || 'docstore'; + } + + // DocStore methods + async put(doc: any, options?: any) { + const id = doc._id || doc.id || this.generateId(); + const record = { ...doc, _id: id }; + this.data.set(id, record); + this._events.push({ type: 'write', payload: record }); + return id; + } + + async get(id: string) { + return this.data.get(id) || null; + } + + async del(id: string) { + const deleted = this.data.delete(id); + if (deleted) { + this._events.push({ type: 'delete', payload: { _id: id } }); + } + return deleted; + } + + async query(filter?: (doc: any) => boolean) { + const docs = Array.from(this.data.values()); + return filter ? docs.filter(filter) : docs; + } + + async all() { + return Array.from(this.data.values()); + } + + // EventLog methods + async add(data: any) { + const entry = { + payload: data, + hash: this.generateId(), + clock: { time: Date.now() } + }; + this._events.push(entry); + return entry.hash; + } + + async iterator(options?: any) { + const events = this._events.slice(); + return { + collect: () => events, + [Symbol.iterator]: function* () { + for (const event of events) { + yield event; + } + } + }; + } + + // KeyValue methods + async set(key: string, value: any) { + this.data.set(key, value); + this._events.push({ type: 'put', payload: { key, value } }); + return key; + } + + // Counter methods + async inc(amount: number = 1) { + const current = this.data.get('counter') || 0; + const newValue = current + amount; + this.data.set('counter', newValue); + this._events.push({ type: 'increment', payload: { amount, value: newValue } }); + return newValue; + } + + get value() { + return this.data.get('counter') || 0; + } + + // General methods + async close() { + // Mock close + } + + async drop() { + this.data.clear(); + this._events = []; + } + + get address() { + return `mock-db-${this.name}`; + } + + get events() { + return this._events; + } + + // Event emitter mock + on(event: string, callback: Function) { + // Mock event listener + } + + off(event: string, callback: Function) { + // Mock event listener removal + } + + private generateId(): string { + return `mock-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + } +} + +export const createOrbitDB = jest.fn(async (options: any) => { + return new MockOrbitDB(); +}); + +// Default export for ES modules +export default { + createOrbitDB, + MockOrbitDB, + MockDatabase +}; \ No newline at end of file diff --git a/tests/mocks/services.ts b/tests/mocks/services.ts new file mode 100644 index 0000000..a7fc64c --- /dev/null +++ b/tests/mocks/services.ts @@ -0,0 +1,35 @@ +// Mock services factory for testing +import { MockIPFSService, MockOrbitDBService } from './ipfs'; + +export function createMockServices() { + const ipfsService = new MockIPFSService(); + const orbitDBService = new MockOrbitDBService(); + + return { + ipfsService, + orbitDBService, + async initialize() { + await ipfsService.init(); + await orbitDBService.init(); + }, + async cleanup() { + await ipfsService.stop(); + await orbitDBService.stop(); + } + }; +} + +// Test utilities +export function createMockDatabase() { + const { MockDatabase } = require('./orbitdb'); + return new MockDatabase('test-db', { type: 'docstore' }); +} + +export function createMockRecord(overrides: any = {}) { + return { + id: `test-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, + createdAt: Date.now(), + updatedAt: Date.now(), + ...overrides + }; +} \ No newline at end of file diff --git a/tests/setup.ts b/tests/setup.ts new file mode 100644 index 0000000..6110bfa --- /dev/null +++ b/tests/setup.ts @@ -0,0 +1,51 @@ +// Test setup file +import 'reflect-metadata'; + +// Global test configuration +jest.setTimeout(30000); + +// Mock console to reduce noise during testing +global.console = { + ...console, + log: jest.fn(), + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), +}; + +// Setup global test utilities +global.beforeEach(() => { + jest.clearAllMocks(); +}); + +// Add custom matchers if needed +expect.extend({ + toBeValidModel(received: any) { + const pass = received && + typeof received.id === 'string' && + typeof received.save === 'function' && + typeof received.delete === 'function'; + + if (pass) { + return { + message: () => `Expected ${received} not to be a valid model`, + pass: true, + }; + } else { + return { + message: () => `Expected ${received} to be a valid model with id, save, and delete methods`, + pass: false, + }; + } + }, +}); + +// Declare custom matcher types for TypeScript +declare global { + namespace jest { + interface Matchers { + toBeValidModel(): R; + } + } +} \ No newline at end of file diff --git a/tests/unit/core/DatabaseManager.test.ts b/tests/unit/core/DatabaseManager.test.ts new file mode 100644 index 0000000..4fecfa1 --- /dev/null +++ b/tests/unit/core/DatabaseManager.test.ts @@ -0,0 +1,440 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { DatabaseManager, UserMappingsData } from '../../../src/framework/core/DatabaseManager'; +import { FrameworkOrbitDBService } from '../../../src/framework/services/OrbitDBService'; +import { ModelRegistry } from '../../../src/framework/core/ModelRegistry'; +import { createMockServices } from '../../mocks/services'; +import { BaseModel } from '../../../src/framework/models/BaseModel'; +import { Model, Field } from '../../../src/framework/models/decorators'; + +// Test models for DatabaseManager testing +@Model({ + scope: 'global', + type: 'docstore' +}) +class GlobalTestModel extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; +} + +@Model({ + scope: 'user', + type: 'keyvalue' +}) +class UserTestModel extends BaseModel { + @Field({ type: 'string', required: true }) + name: string; +} + +describe('DatabaseManager', () => { + let databaseManager: DatabaseManager; + let mockOrbitDBService: FrameworkOrbitDBService; + let mockDatabase: any; + let mockOrbitDB: any; + + beforeEach(() => { + const mockServices = createMockServices(); + mockOrbitDBService = mockServices.orbitDBService; + + // Create mock database + mockDatabase = { + address: { toString: () => 'mock-address-123' }, + set: jest.fn().mockResolvedValue(undefined), + get: jest.fn().mockResolvedValue(null), + put: jest.fn().mockResolvedValue('mock-hash'), + add: jest.fn().mockResolvedValue('mock-hash'), + del: jest.fn().mockResolvedValue(undefined), + query: jest.fn().mockReturnValue([]), + iterator: jest.fn().mockReturnValue({ + collect: jest.fn().mockReturnValue([]) + }), + all: jest.fn().mockReturnValue({}), + value: 0, + id: 'mock-counter-id', + inc: jest.fn().mockResolvedValue(undefined) + }; + + mockOrbitDB = { + open: jest.fn().mockResolvedValue(mockDatabase) + }; + + // Mock OrbitDB service methods + jest.spyOn(mockOrbitDBService, 'openDatabase').mockResolvedValue(mockDatabase); + jest.spyOn(mockOrbitDBService, 'getOrbitDB').mockReturnValue(mockOrbitDB); + + // Mock ModelRegistry + jest.spyOn(ModelRegistry, 'getGlobalModels').mockReturnValue([ + { modelName: 'GlobalTestModel', dbType: 'docstore' } + ]); + jest.spyOn(ModelRegistry, 'getUserScopedModels').mockReturnValue([ + { modelName: 'UserTestModel', dbType: 'keyvalue' } + ]); + + databaseManager = new DatabaseManager(mockOrbitDBService); + jest.clearAllMocks(); + }); + + describe('Initialization', () => { + it('should initialize all databases correctly', async () => { + await databaseManager.initializeAllDatabases(); + + // Should create global databases + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith( + 'global-globaltestmodel', + 'docstore' + ); + + // Should create system directory shards + for (let i = 0; i < 4; i++) { + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith( + `global-user-directory-shard-${i}`, + 'keyvalue' + ); + } + }); + + it('should not initialize databases twice', async () => { + await databaseManager.initializeAllDatabases(); + const firstCallCount = (mockOrbitDBService.openDatabase as jest.Mock).mock.calls.length; + + await databaseManager.initializeAllDatabases(); + const secondCallCount = (mockOrbitDBService.openDatabase as jest.Mock).mock.calls.length; + + expect(secondCallCount).toBe(firstCallCount); + }); + + it('should handle database creation errors', async () => { + jest.spyOn(mockOrbitDBService, 'openDatabase').mockRejectedValueOnce(new Error('Creation failed')); + + await expect(databaseManager.initializeAllDatabases()).rejects.toThrow('Creation failed'); + }); + }); + + describe('User Database Management', () => { + beforeEach(async () => { + // Initialize global databases first + await databaseManager.initializeAllDatabases(); + }); + + it('should create user databases correctly', async () => { + const userId = 'test-user-123'; + + const userMappings = await databaseManager.createUserDatabases(userId); + + expect(userMappings).toBeInstanceOf(UserMappingsData); + expect(userMappings.userId).toBe(userId); + expect(userMappings.databases).toHaveProperty('usertestmodelDB'); + + // Should create mappings database + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith( + `${userId}-mappings`, + 'keyvalue' + ); + + // Should create user model database + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith( + `${userId}-usertestmodel`, + 'keyvalue' + ); + + // Should store mappings in database + expect(mockDatabase.set).toHaveBeenCalledWith('mappings', expect.any(Object)); + }); + + it('should retrieve user mappings from cache', async () => { + const userId = 'test-user-456'; + + // Create user databases first + const originalMappings = await databaseManager.createUserDatabases(userId); + jest.clearAllMocks(); + + // Get mappings again - should come from cache + const cachedMappings = await databaseManager.getUserMappings(userId); + + expect(cachedMappings).toBe(originalMappings); + expect(mockDatabase.get).not.toHaveBeenCalled(); + }); + + it('should retrieve user mappings from global directory', async () => { + const userId = 'test-user-789'; + const mappingsAddress = 'mock-mappings-address'; + const mappingsData = { usertestmodelDB: 'mock-db-address' }; + + // Mock directory shard return + mockDatabase.get + .mockResolvedValueOnce(mappingsAddress) // From directory shard + .mockResolvedValueOnce(mappingsData); // From mappings DB + + const userMappings = await databaseManager.getUserMappings(userId); + + expect(userMappings).toBeInstanceOf(UserMappingsData); + expect(userMappings.userId).toBe(userId); + expect(userMappings.databases).toEqual(mappingsData); + + // Should open mappings database + expect(mockOrbitDB.open).toHaveBeenCalledWith(mappingsAddress); + }); + + it('should handle user not found in directory', async () => { + const userId = 'nonexistent-user'; + + // Mock directory shard returning null + mockDatabase.get.mockResolvedValue(null); + + await expect(databaseManager.getUserMappings(userId)).rejects.toThrow( + `User ${userId} not found in directory` + ); + }); + + it('should get user database correctly', async () => { + const userId = 'test-user-db'; + const modelName = 'UserTestModel'; + + // Create user databases first + await databaseManager.createUserDatabases(userId); + + const userDB = await databaseManager.getUserDatabase(userId, modelName); + + expect(userDB).toBe(mockDatabase); + }); + + it('should handle missing user database', async () => { + const userId = 'test-user-missing'; + const modelName = 'NonExistentModel'; + + // Create user databases first + await databaseManager.createUserDatabases(userId); + + await expect(databaseManager.getUserDatabase(userId, modelName)).rejects.toThrow( + `Database not found for user ${userId} and model ${modelName}` + ); + }); + }); + + describe('Global Database Management', () => { + beforeEach(async () => { + await databaseManager.initializeAllDatabases(); + }); + + it('should get global database correctly', async () => { + const globalDB = await databaseManager.getGlobalDatabase('GlobalTestModel'); + + expect(globalDB).toBe(mockDatabase); + }); + + it('should handle missing global database', async () => { + await expect(databaseManager.getGlobalDatabase('NonExistentModel')).rejects.toThrow( + 'Global database not found for model: NonExistentModel' + ); + }); + + it('should get global directory shards', async () => { + const shards = await databaseManager.getGlobalDirectoryShards(); + + expect(shards).toHaveLength(4); + expect(shards.every(shard => shard === mockDatabase)).toBe(true); + }); + }); + + describe('Database Operations', () => { + beforeEach(async () => { + await databaseManager.initializeAllDatabases(); + }); + + describe('getAllDocuments', () => { + it('should get all documents from eventlog', async () => { + const mockDocs = [{ id: '1', data: 'test' }]; + mockDatabase.iterator.mockReturnValue({ + collect: jest.fn().mockReturnValue(mockDocs) + }); + + const docs = await databaseManager.getAllDocuments(mockDatabase, 'eventlog'); + + expect(docs).toEqual(mockDocs); + expect(mockDatabase.iterator).toHaveBeenCalled(); + }); + + it('should get all documents from keyvalue', async () => { + const mockData = { key1: { id: '1' }, key2: { id: '2' } }; + mockDatabase.all.mockReturnValue(mockData); + + const docs = await databaseManager.getAllDocuments(mockDatabase, 'keyvalue'); + + expect(docs).toEqual([{ id: '1' }, { id: '2' }]); + expect(mockDatabase.all).toHaveBeenCalled(); + }); + + it('should get all documents from docstore', async () => { + const mockDocs = [{ id: '1' }, { id: '2' }]; + mockDatabase.query.mockReturnValue(mockDocs); + + const docs = await databaseManager.getAllDocuments(mockDatabase, 'docstore'); + + expect(docs).toEqual(mockDocs); + expect(mockDatabase.query).toHaveBeenCalledWith(expect.any(Function)); + }); + + it('should get documents from counter', async () => { + mockDatabase.value = 42; + mockDatabase.id = 'counter-123'; + + const docs = await databaseManager.getAllDocuments(mockDatabase, 'counter'); + + expect(docs).toEqual([{ value: 42, id: 'counter-123' }]); + }); + + it('should handle unsupported database type', async () => { + await expect( + databaseManager.getAllDocuments(mockDatabase, 'unsupported' as any) + ).rejects.toThrow('Unsupported database type: unsupported'); + }); + }); + + describe('addDocument', () => { + it('should add document to eventlog', async () => { + const data = { content: 'test' }; + mockDatabase.add.mockResolvedValue('hash123'); + + const result = await databaseManager.addDocument(mockDatabase, 'eventlog', data); + + expect(result).toBe('hash123'); + expect(mockDatabase.add).toHaveBeenCalledWith(data); + }); + + it('should add document to keyvalue', async () => { + const data = { id: 'key1', content: 'test' }; + + const result = await databaseManager.addDocument(mockDatabase, 'keyvalue', data); + + expect(result).toBe('key1'); + expect(mockDatabase.set).toHaveBeenCalledWith('key1', data); + }); + + it('should add document to docstore', async () => { + const data = { id: 'doc1', content: 'test' }; + mockDatabase.put.mockResolvedValue('hash123'); + + const result = await databaseManager.addDocument(mockDatabase, 'docstore', data); + + expect(result).toBe('hash123'); + expect(mockDatabase.put).toHaveBeenCalledWith(data); + }); + + it('should increment counter', async () => { + const data = { amount: 5 }; + mockDatabase.id = 'counter-123'; + + const result = await databaseManager.addDocument(mockDatabase, 'counter', data); + + expect(result).toBe('counter-123'); + expect(mockDatabase.inc).toHaveBeenCalledWith(5); + }); + }); + + describe('updateDocument', () => { + it('should update document in keyvalue', async () => { + const data = { id: 'key1', content: 'updated' }; + + await databaseManager.updateDocument(mockDatabase, 'keyvalue', 'key1', data); + + expect(mockDatabase.set).toHaveBeenCalledWith('key1', data); + }); + + it('should update document in docstore', async () => { + const data = { id: 'doc1', content: 'updated' }; + + await databaseManager.updateDocument(mockDatabase, 'docstore', 'doc1', data); + + expect(mockDatabase.put).toHaveBeenCalledWith(data); + }); + + it('should add new entry for append-only stores', async () => { + const data = { id: 'event1', content: 'updated' }; + mockDatabase.add.mockResolvedValue('hash123'); + + await databaseManager.updateDocument(mockDatabase, 'eventlog', 'event1', data); + + expect(mockDatabase.add).toHaveBeenCalledWith(data); + }); + }); + + describe('deleteDocument', () => { + it('should delete document from keyvalue', async () => { + await databaseManager.deleteDocument(mockDatabase, 'keyvalue', 'key1'); + + expect(mockDatabase.del).toHaveBeenCalledWith('key1'); + }); + + it('should delete document from docstore', async () => { + await databaseManager.deleteDocument(mockDatabase, 'docstore', 'doc1'); + + expect(mockDatabase.del).toHaveBeenCalledWith('doc1'); + }); + + it('should add deletion marker for append-only stores', async () => { + mockDatabase.add.mockResolvedValue('hash123'); + + await databaseManager.deleteDocument(mockDatabase, 'eventlog', 'event1'); + + expect(mockDatabase.add).toHaveBeenCalledWith({ + _deleted: true, + id: 'event1', + deletedAt: expect.any(Number) + }); + }); + }); + }); + + describe('Shard Index Calculation', () => { + it('should calculate consistent shard indices', async () => { + await databaseManager.initializeAllDatabases(); + + const userId1 = 'user-123'; + const userId2 = 'user-456'; + + // Create users and verify they're stored in shards + await databaseManager.createUserDatabases(userId1); + await databaseManager.createUserDatabases(userId2); + + // The shard index should be consistent for the same user + const calls = (mockDatabase.set as jest.Mock).mock.calls; + const user1Calls = calls.filter(call => call[0] === userId1); + const user2Calls = calls.filter(call => call[0] === userId2); + + expect(user1Calls).toHaveLength(1); + expect(user2Calls).toHaveLength(1); + }); + }); + + describe('Error Handling', () => { + it('should handle database operation errors', async () => { + await databaseManager.initializeAllDatabases(); + + mockDatabase.put.mockRejectedValue(new Error('Database error')); + + await expect( + databaseManager.addDocument(mockDatabase, 'docstore', { id: 'test' }) + ).rejects.toThrow('Database error'); + }); + + it('should handle missing global directory', async () => { + // Don't initialize databases + const userId = 'test-user'; + + await expect(databaseManager.getUserMappings(userId)).rejects.toThrow( + 'Global directory not initialized' + ); + }); + }); + + describe('Cleanup', () => { + it('should stop and clear all resources', async () => { + await databaseManager.initializeAllDatabases(); + await databaseManager.createUserDatabases('test-user'); + + await databaseManager.stop(); + + // After stopping, initialization should be required again + await expect(databaseManager.getGlobalDatabase('GlobalTestModel')).rejects.toThrow(); + }); + }); +}); \ No newline at end of file diff --git a/tests/unit/decorators/decorators.test.ts b/tests/unit/decorators/decorators.test.ts new file mode 100644 index 0000000..f265ac3 --- /dev/null +++ b/tests/unit/decorators/decorators.test.ts @@ -0,0 +1,478 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { BaseModel } from '../../../src/framework/models/BaseModel'; +import { + Model, + Field, + BelongsTo, + HasMany, + HasOne, + ManyToMany, + BeforeCreate, + AfterCreate, + BeforeUpdate, + AfterUpdate, + BeforeDelete, + AfterDelete, + getFieldConfig, + getRelationshipConfig, + getHooks +} from '../../../src/framework/models/decorators'; + +describe('Decorators', () => { + describe('@Model Decorator', () => { + it('should define model metadata correctly', () => { + @Model({ + scope: 'global', + type: 'docstore', + sharding: { + strategy: 'hash', + count: 4, + key: 'id' + } + }) + class TestModel extends BaseModel {} + + expect(TestModel.scope).toBe('global'); + expect(TestModel.storeType).toBe('docstore'); + expect(TestModel.sharding).toEqual({ + strategy: 'hash', + count: 4, + key: 'id' + }); + }); + + it('should apply default model configuration', () => { + @Model({}) + class DefaultModel extends BaseModel {} + + expect(DefaultModel.scope).toBe('global'); + expect(DefaultModel.storeType).toBe('docstore'); + }); + + it('should register model with ModelRegistry', () => { + @Model({ + scope: 'user', + type: 'eventlog' + }) + class RegistryModel extends BaseModel {} + + // The model should be automatically registered + expect(RegistryModel.scope).toBe('user'); + expect(RegistryModel.storeType).toBe('eventlog'); + }); + }); + + describe('@Field Decorator', () => { + @Model({}) + class FieldTestModel extends BaseModel { + @Field({ type: 'string', required: true }) + requiredField: string; + + @Field({ type: 'number', required: false, default: 42 }) + defaultField: number; + + @Field({ + type: 'string', + required: true, + validate: (value: string) => value.length >= 3, + transform: (value: string) => value.toLowerCase() + }) + validatedField: string; + + @Field({ type: 'array', required: false, default: [] }) + arrayField: string[]; + + @Field({ type: 'boolean', required: false, default: true }) + booleanField: boolean; + + @Field({ type: 'object', required: false }) + objectField: Record; + } + + it('should define field metadata correctly', () => { + const requiredFieldConfig = getFieldConfig(FieldTestModel, 'requiredField'); + expect(requiredFieldConfig).toEqual({ + type: 'string', + required: true + }); + + const defaultFieldConfig = getFieldConfig(FieldTestModel, 'defaultField'); + expect(defaultFieldConfig).toEqual({ + type: 'number', + required: false, + default: 42 + }); + }); + + it('should handle field validation configuration', () => { + const validatedFieldConfig = getFieldConfig(FieldTestModel, 'validatedField'); + + expect(validatedFieldConfig.type).toBe('string'); + expect(validatedFieldConfig.required).toBe(true); + expect(typeof validatedFieldConfig.validate).toBe('function'); + expect(typeof validatedFieldConfig.transform).toBe('function'); + }); + + it('should apply field validation', () => { + const validatedFieldConfig = getFieldConfig(FieldTestModel, 'validatedField'); + + expect(validatedFieldConfig.validate!('test')).toBe(true); + expect(validatedFieldConfig.validate!('hi')).toBe(false); // Less than 3 characters + }); + + it('should apply field transformation', () => { + const validatedFieldConfig = getFieldConfig(FieldTestModel, 'validatedField'); + + expect(validatedFieldConfig.transform!('TEST')).toBe('test'); + expect(validatedFieldConfig.transform!('MixedCase')).toBe('mixedcase'); + }); + + it('should handle different field types', () => { + const arrayFieldConfig = getFieldConfig(FieldTestModel, 'arrayField'); + expect(arrayFieldConfig.type).toBe('array'); + expect(arrayFieldConfig.default).toEqual([]); + + const booleanFieldConfig = getFieldConfig(FieldTestModel, 'booleanField'); + expect(booleanFieldConfig.type).toBe('boolean'); + expect(booleanFieldConfig.default).toBe(true); + + const objectFieldConfig = getFieldConfig(FieldTestModel, 'objectField'); + expect(objectFieldConfig.type).toBe('object'); + expect(objectFieldConfig.required).toBe(false); + }); + }); + + describe('Relationship Decorators', () => { + @Model({}) + class User extends BaseModel { + @Field({ type: 'string', required: true }) + username: string; + + @HasMany(() => Post, 'userId') + posts: Post[]; + + @HasOne(() => Profile, 'userId') + profile: Profile; + + @ManyToMany(() => Role, 'user_roles', 'userId', 'roleId') + roles: Role[]; + } + + @Model({}) + class Post extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @BelongsTo(() => User, 'userId') + user: User; + } + + @Model({}) + class Profile extends BaseModel { + @Field({ type: 'string', required: true }) + userId: string; + + @BelongsTo(() => User, 'userId') + user: User; + } + + @Model({}) + class Role extends BaseModel { + @Field({ type: 'string', required: true }) + name: string; + + @ManyToMany(() => User, 'user_roles', 'roleId', 'userId') + users: User[]; + } + + it('should define BelongsTo relationships correctly', () => { + const relationships = getRelationshipConfig(Post); + const userRelation = relationships.find(r => r.propertyKey === 'user'); + + expect(userRelation).toBeDefined(); + expect(userRelation?.type).toBe('belongsTo'); + expect(userRelation?.targetModel()).toBe(User); + expect(userRelation?.foreignKey).toBe('userId'); + }); + + it('should define HasMany relationships correctly', () => { + const relationships = getRelationshipConfig(User); + const postsRelation = relationships.find(r => r.propertyKey === 'posts'); + + expect(postsRelation).toBeDefined(); + expect(postsRelation?.type).toBe('hasMany'); + expect(postsRelation?.targetModel()).toBe(Post); + expect(postsRelation?.foreignKey).toBe('userId'); + }); + + it('should define HasOne relationships correctly', () => { + const relationships = getRelationshipConfig(User); + const profileRelation = relationships.find(r => r.propertyKey === 'profile'); + + expect(profileRelation).toBeDefined(); + expect(profileRelation?.type).toBe('hasOne'); + expect(profileRelation?.targetModel()).toBe(Profile); + expect(profileRelation?.foreignKey).toBe('userId'); + }); + + it('should define ManyToMany relationships correctly', () => { + const relationships = getRelationshipConfig(User); + const rolesRelation = relationships.find(r => r.propertyKey === 'roles'); + + expect(rolesRelation).toBeDefined(); + expect(rolesRelation?.type).toBe('manyToMany'); + expect(rolesRelation?.targetModel()).toBe(Role); + expect(rolesRelation?.through).toBe('user_roles'); + expect(rolesRelation?.foreignKey).toBe('userId'); + expect(rolesRelation?.otherKey).toBe('roleId'); + }); + + it('should support relationship options', () => { + @Model({}) + class TestModel extends BaseModel { + @HasMany(() => Post, 'userId', { + cache: true, + eager: false, + orderBy: 'createdAt', + limit: 10 + }) + posts: Post[]; + } + + const relationships = getRelationshipConfig(TestModel); + const postsRelation = relationships.find(r => r.propertyKey === 'posts'); + + expect(postsRelation?.options).toEqual({ + cache: true, + eager: false, + orderBy: 'createdAt', + limit: 10 + }); + }); + }); + + describe('Hook Decorators', () => { + let hookCallOrder: string[] = []; + + @Model({}) + class HookTestModel extends BaseModel { + @Field({ type: 'string', required: true }) + name: string; + + @BeforeCreate() + beforeCreateHook() { + hookCallOrder.push('beforeCreate'); + } + + @AfterCreate() + afterCreateHook() { + hookCallOrder.push('afterCreate'); + } + + @BeforeUpdate() + beforeUpdateHook() { + hookCallOrder.push('beforeUpdate'); + } + + @AfterUpdate() + afterUpdateHook() { + hookCallOrder.push('afterUpdate'); + } + + @BeforeDelete() + beforeDeleteHook() { + hookCallOrder.push('beforeDelete'); + } + + @AfterDelete() + afterDeleteHook() { + hookCallOrder.push('afterDelete'); + } + } + + beforeEach(() => { + hookCallOrder = []; + }); + + it('should register lifecycle hooks correctly', () => { + const hooks = getHooks(HookTestModel); + + expect(hooks.beforeCreate).toContain('beforeCreateHook'); + expect(hooks.afterCreate).toContain('afterCreateHook'); + expect(hooks.beforeUpdate).toContain('beforeUpdateHook'); + expect(hooks.afterUpdate).toContain('afterUpdateHook'); + expect(hooks.beforeDelete).toContain('beforeDeleteHook'); + expect(hooks.afterDelete).toContain('afterDeleteHook'); + }); + + it('should support multiple hooks of the same type', () => { + @Model({}) + class MultiHookModel extends BaseModel { + @BeforeCreate() + firstBeforeCreate() { + hookCallOrder.push('first'); + } + + @BeforeCreate() + secondBeforeCreate() { + hookCallOrder.push('second'); + } + } + + const hooks = getHooks(MultiHookModel); + expect(hooks.beforeCreate).toHaveLength(2); + expect(hooks.beforeCreate).toContain('firstBeforeCreate'); + expect(hooks.beforeCreate).toContain('secondBeforeCreate'); + }); + }); + + describe('Complex Decorator Combinations', () => { + it('should handle models with all decorator types', () => { + @Model({ + scope: 'user', + type: 'docstore', + sharding: { + strategy: 'user', + count: 2, + key: 'userId' + } + }) + class ComplexModel extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @Field({ + type: 'array', + required: false, + default: [], + transform: (tags: string[]) => tags.map(t => t.toLowerCase()) + }) + tags: string[]; + + @BelongsTo(() => User, 'userId') + user: User; + + @BeforeCreate() + setDefaults() { + this.tags = this.tags || []; + } + + @BeforeUpdate() + updateTimestamp() { + // Update logic + } + } + + // Check model configuration + expect(ComplexModel.scope).toBe('user'); + expect(ComplexModel.storeType).toBe('docstore'); + expect(ComplexModel.sharding).toEqual({ + strategy: 'user', + count: 2, + key: 'userId' + }); + + // Check field configuration + const titleConfig = getFieldConfig(ComplexModel, 'title'); + expect(titleConfig.required).toBe(true); + + const tagsConfig = getFieldConfig(ComplexModel, 'tags'); + expect(tagsConfig.default).toEqual([]); + expect(typeof tagsConfig.transform).toBe('function'); + + // Check relationships + const relationships = getRelationshipConfig(ComplexModel); + const userRelation = relationships.find(r => r.propertyKey === 'user'); + expect(userRelation?.type).toBe('belongsTo'); + + // Check hooks + const hooks = getHooks(ComplexModel); + expect(hooks.beforeCreate).toContain('setDefaults'); + expect(hooks.beforeUpdate).toContain('updateTimestamp'); + }); + }); + + describe('Decorator Error Handling', () => { + it('should handle invalid field types', () => { + expect(() => { + @Model({}) + class InvalidFieldModel extends BaseModel { + @Field({ type: 'invalid-type' as any, required: true }) + invalidField: any; + } + }).toThrow(); + }); + + it('should handle invalid model scope', () => { + expect(() => { + @Model({ scope: 'invalid-scope' as any }) + class InvalidScopeModel extends BaseModel {} + }).toThrow(); + }); + + it('should handle invalid store type', () => { + expect(() => { + @Model({ type: 'invalid-store' as any }) + class InvalidStoreModel extends BaseModel {} + }).toThrow(); + }); + }); + + describe('Metadata Inheritance', () => { + @Model({ + scope: 'global', + type: 'docstore' + }) + class BaseTestModel extends BaseModel { + @Field({ type: 'string', required: true }) + baseField: string; + + @BeforeCreate() + baseHook() { + // Base hook + } + } + + @Model({ + scope: 'user', // Override scope + type: 'eventlog' // Override type + }) + class ExtendedTestModel extends BaseTestModel { + @Field({ type: 'number', required: false }) + extendedField: number; + + @BeforeCreate() + extendedHook() { + // Extended hook + } + } + + it('should inherit field metadata from parent class', () => { + const baseFieldConfig = getFieldConfig(ExtendedTestModel, 'baseField'); + expect(baseFieldConfig).toBeDefined(); + expect(baseFieldConfig.type).toBe('string'); + expect(baseFieldConfig.required).toBe(true); + + const extendedFieldConfig = getFieldConfig(ExtendedTestModel, 'extendedField'); + expect(extendedFieldConfig).toBeDefined(); + expect(extendedFieldConfig.type).toBe('number'); + }); + + it('should override model configuration in child class', () => { + expect(ExtendedTestModel.scope).toBe('user'); + expect(ExtendedTestModel.storeType).toBe('eventlog'); + }); + + it('should inherit and extend hooks', () => { + const hooks = getHooks(ExtendedTestModel); + expect(hooks.beforeCreate).toContain('baseHook'); + expect(hooks.beforeCreate).toContain('extendedHook'); + }); + }); +}); \ No newline at end of file diff --git a/tests/unit/migrations/MigrationManager.test.ts b/tests/unit/migrations/MigrationManager.test.ts new file mode 100644 index 0000000..decede5 --- /dev/null +++ b/tests/unit/migrations/MigrationManager.test.ts @@ -0,0 +1,652 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { + MigrationManager, + Migration, + MigrationOperation, + MigrationResult, + MigrationValidator, + MigrationLogger +} from '../../../src/framework/migrations/MigrationManager'; +import { FieldConfig } from '../../../src/framework/types/models'; +import { createMockServices } from '../../mocks/services'; + +describe('MigrationManager', () => { + let migrationManager: MigrationManager; + let mockDatabaseManager: any; + let mockShardManager: any; + let mockLogger: MigrationLogger; + + const createTestMigration = (overrides: Partial = {}): Migration => ({ + id: 'test-migration-1', + version: '1.0.0', + name: 'Test Migration', + description: 'A test migration for unit testing', + targetModels: ['TestModel'], + up: [ + { + type: 'add_field', + modelName: 'TestModel', + fieldName: 'newField', + fieldConfig: { + type: 'string', + required: false, + default: 'default-value' + } as FieldConfig + } + ], + down: [ + { + type: 'remove_field', + modelName: 'TestModel', + fieldName: 'newField' + } + ], + createdAt: Date.now(), + ...overrides + }); + + beforeEach(() => { + const mockServices = createMockServices(); + + mockDatabaseManager = { + getAllDocuments: jest.fn().mockResolvedValue([]), + addDocument: jest.fn().mockResolvedValue('mock-id'), + updateDocument: jest.fn().mockResolvedValue(undefined), + deleteDocument: jest.fn().mockResolvedValue(undefined), + }; + + mockShardManager = { + getAllShards: jest.fn().mockReturnValue([]), + getShardForKey: jest.fn().mockReturnValue({ name: 'shard-0', database: {} }), + }; + + mockLogger = { + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + debug: jest.fn() + }; + + migrationManager = new MigrationManager(mockDatabaseManager, mockShardManager, mockLogger); + + jest.clearAllMocks(); + }); + + describe('Migration Registration', () => { + it('should register a valid migration', () => { + const migration = createTestMigration(); + + migrationManager.registerMigration(migration); + + const registered = migrationManager.getMigration(migration.id); + expect(registered).toEqual(migration); + expect(mockLogger.info).toHaveBeenCalledWith( + `Registered migration: ${migration.name} (${migration.version})`, + expect.objectContaining({ + migrationId: migration.id, + targetModels: migration.targetModels + }) + ); + }); + + it('should throw error for invalid migration structure', () => { + const invalidMigration = createTestMigration({ + id: '', // Invalid - empty ID + }); + + expect(() => migrationManager.registerMigration(invalidMigration)).toThrow( + 'Migration must have id, version, and name' + ); + }); + + it('should throw error for migration without target models', () => { + const invalidMigration = createTestMigration({ + targetModels: [] // Invalid - empty target models + }); + + expect(() => migrationManager.registerMigration(invalidMigration)).toThrow( + 'Migration must specify target models' + ); + }); + + it('should throw error for migration without up operations', () => { + const invalidMigration = createTestMigration({ + up: [] // Invalid - no up operations + }); + + expect(() => migrationManager.registerMigration(invalidMigration)).toThrow( + 'Migration must have at least one up operation' + ); + }); + + it('should throw error for duplicate version with different ID', () => { + const migration1 = createTestMigration({ id: 'migration-1', version: '1.0.0' }); + const migration2 = createTestMigration({ id: 'migration-2', version: '1.0.0' }); + + migrationManager.registerMigration(migration1); + + expect(() => migrationManager.registerMigration(migration2)).toThrow( + 'Migration version 1.0.0 already exists with different ID' + ); + }); + + it('should allow registering same migration with same ID', () => { + const migration = createTestMigration(); + + migrationManager.registerMigration(migration); + migrationManager.registerMigration(migration); // Should not throw + + expect(migrationManager.getMigrations()).toHaveLength(1); + }); + }); + + describe('Migration Retrieval', () => { + beforeEach(() => { + const migration1 = createTestMigration({ id: 'migration-1', version: '1.0.0' }); + const migration2 = createTestMigration({ id: 'migration-2', version: '2.0.0' }); + const migration3 = createTestMigration({ id: 'migration-3', version: '1.5.0' }); + + migrationManager.registerMigration(migration1); + migrationManager.registerMigration(migration2); + migrationManager.registerMigration(migration3); + }); + + it('should get all migrations sorted by version', () => { + const migrations = migrationManager.getMigrations(); + + expect(migrations).toHaveLength(3); + expect(migrations[0].version).toBe('1.0.0'); + expect(migrations[1].version).toBe('1.5.0'); + expect(migrations[2].version).toBe('2.0.0'); + }); + + it('should get migration by ID', () => { + const migration = migrationManager.getMigration('migration-2'); + + expect(migration).toBeDefined(); + expect(migration?.version).toBe('2.0.0'); + }); + + it('should return null for non-existent migration', () => { + const migration = migrationManager.getMigration('non-existent'); + + expect(migration).toBeNull(); + }); + + it('should get pending migrations', () => { + // Mock applied migrations (empty for this test) + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + + const pending = migrationManager.getPendingMigrations(); + + expect(pending).toHaveLength(3); + }); + + it('should filter pending migrations by model', () => { + const migration4 = createTestMigration({ + id: 'migration-4', + version: '3.0.0', + targetModels: ['OtherModel'] + }); + migrationManager.registerMigration(migration4); + + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + + const pending = migrationManager.getPendingMigrations('TestModel'); + + expect(pending).toHaveLength(3); // Should exclude migration-4 + expect(pending.every(m => m.targetModels.includes('TestModel'))).toBe(true); + }); + }); + + describe('Migration Operations', () => { + it('should validate add_field operation', () => { + const operation: MigrationOperation = { + type: 'add_field', + modelName: 'TestModel', + fieldName: 'newField', + fieldConfig: { type: 'string', required: false } + }; + + expect(() => (migrationManager as any).validateOperation(operation)).not.toThrow(); + }); + + it('should validate remove_field operation', () => { + const operation: MigrationOperation = { + type: 'remove_field', + modelName: 'TestModel', + fieldName: 'oldField' + }; + + expect(() => (migrationManager as any).validateOperation(operation)).not.toThrow(); + }); + + it('should validate rename_field operation', () => { + const operation: MigrationOperation = { + type: 'rename_field', + modelName: 'TestModel', + fieldName: 'oldField', + newFieldName: 'newField' + }; + + expect(() => (migrationManager as any).validateOperation(operation)).not.toThrow(); + }); + + it('should validate transform_data operation', () => { + const operation: MigrationOperation = { + type: 'transform_data', + modelName: 'TestModel', + transformer: (data: any) => data + }; + + expect(() => (migrationManager as any).validateOperation(operation)).not.toThrow(); + }); + + it('should reject invalid operation type', () => { + const operation: MigrationOperation = { + type: 'invalid_type' as any, + modelName: 'TestModel' + }; + + expect(() => (migrationManager as any).validateOperation(operation)).toThrow( + 'Invalid operation type: invalid_type' + ); + }); + + it('should reject operation without model name', () => { + const operation: MigrationOperation = { + type: 'add_field', + modelName: '' + }; + + expect(() => (migrationManager as any).validateOperation(operation)).toThrow( + 'Operation must specify modelName' + ); + }); + }); + + describe('Migration Execution', () => { + let migration: Migration; + + beforeEach(() => { + migration = createTestMigration(); + migrationManager.registerMigration(migration); + + // Mock helper methods + jest.spyOn(migrationManager as any, 'getAllRecordsForModel').mockResolvedValue([ + { id: 'record-1', name: 'Test 1' }, + { id: 'record-2', name: 'Test 2' } + ]); + jest.spyOn(migrationManager as any, 'updateRecord').mockResolvedValue(undefined); + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + jest.spyOn(migrationManager as any, 'recordMigrationResult').mockResolvedValue(undefined); + }); + + it('should run migration successfully', async () => { + const result = await migrationManager.runMigration(migration.id); + + expect(result.success).toBe(true); + expect(result.migrationId).toBe(migration.id); + expect(result.recordsProcessed).toBe(2); + expect(result.rollbackAvailable).toBe(true); + expect(mockLogger.info).toHaveBeenCalledWith( + `Migration completed: ${migration.name}`, + expect.objectContaining({ + migrationId: migration.id, + recordsProcessed: 2 + }) + ); + }); + + it('should perform dry run without modifying data', async () => { + jest.spyOn(migrationManager as any, 'countRecordsForModel').mockResolvedValue(2); + + const result = await migrationManager.runMigration(migration.id, { dryRun: true }); + + expect(result.success).toBe(true); + expect(result.warnings).toContain('This was a dry run - no data was actually modified'); + expect(migrationManager as any).not.toHaveProperty('updateRecord'); + expect(mockLogger.info).toHaveBeenCalledWith( + `Performing dry run for migration: ${migration.name}` + ); + }); + + it('should throw error for non-existent migration', async () => { + await expect(migrationManager.runMigration('non-existent')).rejects.toThrow( + 'Migration non-existent not found' + ); + }); + + it('should throw error for already running migration', async () => { + // Start first migration (don't await) + const promise1 = migrationManager.runMigration(migration.id); + + // Try to start same migration again + await expect(migrationManager.runMigration(migration.id)).rejects.toThrow( + `Migration ${migration.id} is already running` + ); + + // Clean up first migration + await promise1; + }); + + it('should handle migration with dependencies', async () => { + const dependentMigration = createTestMigration({ + id: 'dependent-migration', + version: '2.0.0', + dependencies: ['test-migration-1'] + }); + + migrationManager.registerMigration(dependentMigration); + + // Mock that dependency is not applied + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + + await expect(migrationManager.runMigration(dependentMigration.id)).rejects.toThrow( + 'Migration dependency not satisfied: test-migration-1' + ); + }); + }); + + describe('Migration Rollback', () => { + let migration: Migration; + + beforeEach(() => { + migration = createTestMigration(); + migrationManager.registerMigration(migration); + + jest.spyOn(migrationManager as any, 'getAllRecordsForModel').mockResolvedValue([ + { id: 'record-1', name: 'Test 1', newField: 'default-value' }, + { id: 'record-2', name: 'Test 2', newField: 'default-value' } + ]); + jest.spyOn(migrationManager as any, 'updateRecord').mockResolvedValue(undefined); + jest.spyOn(migrationManager as any, 'recordMigrationResult').mockResolvedValue(undefined); + }); + + it('should rollback applied migration', async () => { + // Mock that migration was applied + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([ + { migrationId: migration.id, success: true } + ]); + + const result = await migrationManager.rollbackMigration(migration.id); + + expect(result.success).toBe(true); + expect(result.migrationId).toBe(migration.id); + expect(result.rollbackAvailable).toBe(false); + expect(mockLogger.info).toHaveBeenCalledWith( + `Rollback completed: ${migration.name}`, + expect.objectContaining({ migrationId: migration.id }) + ); + }); + + it('should throw error for non-existent migration rollback', async () => { + await expect(migrationManager.rollbackMigration('non-existent')).rejects.toThrow( + 'Migration non-existent not found' + ); + }); + + it('should throw error for unapplied migration rollback', async () => { + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + + await expect(migrationManager.rollbackMigration(migration.id)).rejects.toThrow( + `Migration ${migration.id} has not been applied` + ); + }); + + it('should handle migration without rollback operations', async () => { + const migrationWithoutRollback = createTestMigration({ + id: 'no-rollback', + down: [] + }); + migrationManager.registerMigration(migrationWithoutRollback); + + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([ + { migrationId: 'no-rollback', success: true } + ]); + + await expect(migrationManager.rollbackMigration('no-rollback')).rejects.toThrow( + 'Migration has no rollback operations defined' + ); + }); + }); + + describe('Batch Migration Operations', () => { + beforeEach(() => { + const migration1 = createTestMigration({ id: 'migration-1', version: '1.0.0' }); + const migration2 = createTestMigration({ id: 'migration-2', version: '2.0.0' }); + const migration3 = createTestMigration({ id: 'migration-3', version: '3.0.0' }); + + migrationManager.registerMigration(migration1); + migrationManager.registerMigration(migration2); + migrationManager.registerMigration(migration3); + + jest.spyOn(migrationManager as any, 'getAllRecordsForModel').mockResolvedValue([]); + jest.spyOn(migrationManager as any, 'updateRecord').mockResolvedValue(undefined); + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + jest.spyOn(migrationManager as any, 'recordMigrationResult').mockResolvedValue(undefined); + }); + + it('should run all pending migrations', async () => { + const results = await migrationManager.runPendingMigrations(); + + expect(results).toHaveLength(3); + expect(results.every(r => r.success)).toBe(true); + expect(mockLogger.info).toHaveBeenCalledWith( + 'Running 3 pending migrations', + expect.objectContaining({ dryRun: false }) + ); + }); + + it('should run pending migrations for specific model', async () => { + const migration4 = createTestMigration({ + id: 'migration-4', + version: '4.0.0', + targetModels: ['OtherModel'] + }); + migrationManager.registerMigration(migration4); + + const results = await migrationManager.runPendingMigrations({ modelName: 'TestModel' }); + + expect(results).toHaveLength(3); // Should exclude migration-4 + }); + + it('should stop on error when specified', async () => { + // Make second migration fail + jest.spyOn(migrationManager, 'runMigration') + .mockResolvedValueOnce({ success: true } as MigrationResult) + .mockRejectedValueOnce(new Error('Migration failed')); + + await expect( + migrationManager.runPendingMigrations({ stopOnError: true }) + ).rejects.toThrow('Migration failed'); + }); + + it('should continue on error when not specified', async () => { + // Make second migration fail + jest.spyOn(migrationManager, 'runMigration') + .mockResolvedValueOnce({ success: true } as MigrationResult) + .mockRejectedValueOnce(new Error('Migration failed')) + .mockResolvedValueOnce({ success: true } as MigrationResult); + + const results = await migrationManager.runPendingMigrations({ stopOnError: false }); + + expect(results).toHaveLength(2); // Only successful migrations + expect(mockLogger.error).toHaveBeenCalledWith( + 'Skipping failed migration: migration-2', + expect.objectContaining({ error: expect.any(Error) }) + ); + }); + }); + + describe('Migration Validation', () => { + it('should run pre-migration validators', async () => { + const validator: MigrationValidator = { + name: 'Test Validator', + description: 'Tests migration validity', + validate: jest.fn().mockResolvedValue({ + valid: true, + errors: [], + warnings: ['Test warning'] + }) + }; + + const migration = createTestMigration({ + validators: [validator] + }); + + migrationManager.registerMigration(migration); + jest.spyOn(migrationManager as any, 'getAllRecordsForModel').mockResolvedValue([]); + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + jest.spyOn(migrationManager as any, 'recordMigrationResult').mockResolvedValue(undefined); + + await migrationManager.runMigration(migration.id); + + expect(validator.validate).toHaveBeenCalled(); + expect(mockLogger.debug).toHaveBeenCalledWith( + `Running pre-migration validator: ${validator.name}` + ); + }); + + it('should fail migration on validation error', async () => { + const validator: MigrationValidator = { + name: 'Failing Validator', + description: 'Always fails', + validate: jest.fn().mockResolvedValue({ + valid: false, + errors: ['Validation failed'], + warnings: [] + }) + }; + + const migration = createTestMigration({ + validators: [validator] + }); + + migrationManager.registerMigration(migration); + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + + await expect(migrationManager.runMigration(migration.id)).rejects.toThrow( + 'Pre-migration validation failed: Validation failed' + ); + }); + }); + + describe('Migration Progress and Monitoring', () => { + it('should track migration progress', async () => { + const migration = createTestMigration(); + migrationManager.registerMigration(migration); + + jest.spyOn(migrationManager as any, 'getAllRecordsForModel').mockResolvedValue([ + { id: 'record-1' } + ]); + jest.spyOn(migrationManager as any, 'updateRecord').mockResolvedValue(undefined); + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + jest.spyOn(migrationManager as any, 'recordMigrationResult').mockResolvedValue(undefined); + + const migrationPromise = migrationManager.runMigration(migration.id); + + // Check progress while migration is running + const progress = migrationManager.getMigrationProgress(migration.id); + expect(progress).toBeDefined(); + expect(progress?.status).toBe('running'); + + await migrationPromise; + + // Progress should be cleared after completion + const finalProgress = migrationManager.getMigrationProgress(migration.id); + expect(finalProgress).toBeNull(); + }); + + it('should get active migrations', async () => { + const migration1 = createTestMigration({ id: 'migration-1' }); + const migration2 = createTestMigration({ id: 'migration-2' }); + + migrationManager.registerMigration(migration1); + migrationManager.registerMigration(migration2); + + jest.spyOn(migrationManager as any, 'getAllRecordsForModel').mockResolvedValue([]); + jest.spyOn(migrationManager as any, 'getAppliedMigrations').mockReturnValue([]); + jest.spyOn(migrationManager as any, 'recordMigrationResult').mockResolvedValue(undefined); + + // Start migrations but don't await + const promise1 = migrationManager.runMigration(migration1.id); + const promise2 = migrationManager.runMigration(migration2.id); + + const activeMigrations = migrationManager.getActiveMigrations(); + expect(activeMigrations).toHaveLength(2); + expect(activeMigrations.every(p => p.status === 'running')).toBe(true); + + await Promise.all([promise1, promise2]); + }); + + it('should get migration history', () => { + // Manually add some history + const result1: MigrationResult = { + migrationId: 'migration-1', + success: true, + duration: 1000, + recordsProcessed: 10, + recordsModified: 5, + warnings: [], + errors: [], + rollbackAvailable: true + }; + + const result2: MigrationResult = { + migrationId: 'migration-2', + success: false, + duration: 500, + recordsProcessed: 5, + recordsModified: 0, + warnings: [], + errors: ['Test error'], + rollbackAvailable: false + }; + + (migrationManager as any).migrationHistory.set('migration-1', [result1]); + (migrationManager as any).migrationHistory.set('migration-2', [result2]); + + const allHistory = migrationManager.getMigrationHistory(); + expect(allHistory).toHaveLength(2); + + const specificHistory = migrationManager.getMigrationHistory('migration-1'); + expect(specificHistory).toEqual([result1]); + }); + }); + + describe('Version Comparison', () => { + it('should compare versions correctly', () => { + const compareVersions = (migrationManager as any).compareVersions.bind(migrationManager); + + expect(compareVersions('1.0.0', '2.0.0')).toBe(-1); + expect(compareVersions('2.0.0', '1.0.0')).toBe(1); + expect(compareVersions('1.0.0', '1.0.0')).toBe(0); + expect(compareVersions('1.2.0', '1.1.0')).toBe(1); + expect(compareVersions('1.0.1', '1.0.0')).toBe(1); + expect(compareVersions('1.0', '1.0.0')).toBe(0); + }); + }); + + describe('Field Value Conversion', () => { + it('should convert field values correctly', () => { + const convertFieldValue = (migrationManager as any).convertFieldValue.bind(migrationManager); + + expect(convertFieldValue('123', { type: 'number' })).toBe(123); + expect(convertFieldValue(123, { type: 'string' })).toBe('123'); + expect(convertFieldValue('true', { type: 'boolean' })).toBe(true); + expect(convertFieldValue('test', { type: 'array' })).toEqual(['test']); + expect(convertFieldValue(['test'], { type: 'array' })).toEqual(['test']); + expect(convertFieldValue(null, { type: 'string' })).toBeNull(); + }); + }); + + describe('Cleanup', () => { + it('should cleanup resources', async () => { + await migrationManager.cleanup(); + + expect(migrationManager.getActiveMigrations()).toHaveLength(0); + expect(mockLogger.info).toHaveBeenCalledWith('Cleaning up migration manager'); + }); + }); +}); \ No newline at end of file diff --git a/tests/unit/models/BaseModel.test.ts b/tests/unit/models/BaseModel.test.ts new file mode 100644 index 0000000..084fde2 --- /dev/null +++ b/tests/unit/models/BaseModel.test.ts @@ -0,0 +1,458 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { BaseModel } from '../../../src/framework/models/BaseModel'; +import { Model, Field, BeforeCreate, AfterCreate, BeforeUpdate, AfterUpdate } from '../../../src/framework/models/decorators'; +import { createMockServices } from '../../mocks/services'; + +// Test model for testing BaseModel functionality +@Model({ + scope: 'global', + type: 'docstore' +}) +class TestUser extends BaseModel { + @Field({ type: 'string', required: true, unique: true }) + username: string; + + @Field({ type: 'string', required: true, unique: true }) + email: string; + + @Field({ type: 'number', required: false, default: 0 }) + score: number; + + @Field({ type: 'boolean', required: false, default: true }) + isActive: boolean; + + @Field({ type: 'array', required: false, default: [] }) + tags: string[]; + + @Field({ type: 'number', required: false }) + createdAt: number; + + @Field({ type: 'number', required: false }) + updatedAt: number; + + // Hook counters for testing + static beforeCreateCount = 0; + static afterCreateCount = 0; + static beforeUpdateCount = 0; + static afterUpdateCount = 0; + + @BeforeCreate() + beforeCreateHook() { + this.createdAt = Date.now(); + this.updatedAt = Date.now(); + TestUser.beforeCreateCount++; + } + + @AfterCreate() + afterCreateHook() { + TestUser.afterCreateCount++; + } + + @BeforeUpdate() + beforeUpdateHook() { + this.updatedAt = Date.now(); + TestUser.beforeUpdateCount++; + } + + @AfterUpdate() + afterUpdateHook() { + TestUser.afterUpdateCount++; + } + + // Custom validation method + validateEmail(): boolean { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(this.email); + } +} + +// Test model with validation +@Model({ + scope: 'user', + type: 'docstore' +}) +class TestPost extends BaseModel { + @Field({ + type: 'string', + required: true, + validate: (value: string) => { + if (value.length < 3) { + throw new Error('Title must be at least 3 characters'); + } + return true; + } + }) + title: string; + + @Field({ + type: 'string', + required: true, + validate: (value: string) => value.length <= 1000 + }) + content: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @Field({ + type: 'array', + required: false, + default: [], + transform: (tags: string[]) => tags.map(tag => tag.toLowerCase()) + }) + tags: string[]; +} + +describe('BaseModel', () => { + let mockServices: any; + + beforeEach(() => { + mockServices = createMockServices(); + + // Reset hook counters + TestUser.beforeCreateCount = 0; + TestUser.afterCreateCount = 0; + TestUser.beforeUpdateCount = 0; + TestUser.afterUpdateCount = 0; + + // Mock the framework initialization + jest.clearAllMocks(); + }); + + describe('Model Creation', () => { + it('should create a new model instance with required fields', () => { + const user = new TestUser(); + user.username = 'testuser'; + user.email = 'test@example.com'; + + expect(user.username).toBe('testuser'); + expect(user.email).toBe('test@example.com'); + expect(user.score).toBe(0); // Default value + expect(user.isActive).toBe(true); // Default value + expect(user.tags).toEqual([]); // Default value + }); + + it('should generate a unique ID for new instances', () => { + const user1 = new TestUser(); + const user2 = new TestUser(); + + expect(user1.id).toBeDefined(); + expect(user2.id).toBeDefined(); + expect(user1.id).not.toBe(user2.id); + }); + + it('should create instance using static create method', async () => { + const userData = { + username: 'alice', + email: 'alice@example.com', + score: 100 + }; + + const user = await TestUser.create(userData); + + expect(user).toBeInstanceOf(TestUser); + expect(user.username).toBe('alice'); + expect(user.email).toBe('alice@example.com'); + expect(user.score).toBe(100); + expect(user.isActive).toBe(true); // Default value + }); + }); + + describe('Validation', () => { + it('should validate required fields on create', async () => { + await expect(async () => { + await TestUser.create({ + // Missing required username and email + score: 50 + }); + }).rejects.toThrow(); + }); + + it('should validate field constraints', async () => { + await expect(async () => { + await TestPost.create({ + title: 'Hi', // Too short (< 3 characters) + content: 'Test content', + userId: 'user123' + }); + }).rejects.toThrow('Title must be at least 3 characters'); + }); + + it('should apply field transformations', async () => { + const post = await TestPost.create({ + title: 'Test Post', + content: 'Test content', + userId: 'user123', + tags: ['JavaScript', 'TypeScript', 'REACT'] + }); + + // Tags should be transformed to lowercase + expect(post.tags).toEqual(['javascript', 'typescript', 'react']); + }); + + it('should validate field types', async () => { + await expect(async () => { + await TestUser.create({ + username: 'testuser', + email: 'test@example.com', + score: 'invalid-number' as any // Wrong type + }); + }).rejects.toThrow(); + }); + }); + + describe('CRUD Operations', () => { + let user: TestUser; + + beforeEach(async () => { + user = await TestUser.create({ + username: 'testuser', + email: 'test@example.com', + score: 50 + }); + }); + + it('should save a model instance', async () => { + user.score = 100; + await user.save(); + + expect(user.score).toBe(100); + expect(TestUser.beforeUpdateCount).toBe(1); + expect(TestUser.afterUpdateCount).toBe(1); + }); + + it('should find a model by ID', async () => { + const foundUser = await TestUser.findById(user.id); + + expect(foundUser).toBeInstanceOf(TestUser); + expect(foundUser?.id).toBe(user.id); + expect(foundUser?.username).toBe(user.username); + }); + + it('should return null when model not found', async () => { + const foundUser = await TestUser.findById('non-existent-id'); + expect(foundUser).toBeNull(); + }); + + it('should find model by criteria', async () => { + const foundUser = await TestUser.findOne({ username: 'testuser' }); + + expect(foundUser).toBeInstanceOf(TestUser); + expect(foundUser?.username).toBe('testuser'); + }); + + it('should delete a model instance', async () => { + const userId = user.id; + await user.delete(); + + const foundUser = await TestUser.findById(userId); + expect(foundUser).toBeNull(); + }); + + it('should find all models', async () => { + // Create another user + await TestUser.create({ + username: 'testuser2', + email: 'test2@example.com' + }); + + const allUsers = await TestUser.findAll(); + expect(allUsers.length).toBeGreaterThanOrEqual(2); + expect(allUsers.every(u => u instanceof TestUser)).toBe(true); + }); + }); + + describe('Model Hooks', () => { + it('should execute beforeCreate and afterCreate hooks', async () => { + const initialBeforeCount = TestUser.beforeCreateCount; + const initialAfterCount = TestUser.afterCreateCount; + + const user = await TestUser.create({ + username: 'hooktest', + email: 'hook@example.com' + }); + + expect(TestUser.beforeCreateCount).toBe(initialBeforeCount + 1); + expect(TestUser.afterCreateCount).toBe(initialAfterCount + 1); + expect(user.createdAt).toBeDefined(); + expect(user.updatedAt).toBeDefined(); + }); + + it('should execute beforeUpdate and afterUpdate hooks', async () => { + const user = await TestUser.create({ + username: 'updatetest', + email: 'update@example.com' + }); + + const initialBeforeCount = TestUser.beforeUpdateCount; + const initialAfterCount = TestUser.afterUpdateCount; + const initialUpdatedAt = user.updatedAt; + + // Wait a bit to ensure different timestamp + await new Promise(resolve => setTimeout(resolve, 10)); + + user.score = 100; + await user.save(); + + expect(TestUser.beforeUpdateCount).toBe(initialBeforeCount + 1); + expect(TestUser.afterUpdateCount).toBe(initialAfterCount + 1); + expect(user.updatedAt).toBeGreaterThan(initialUpdatedAt!); + }); + }); + + describe('Serialization', () => { + it('should serialize to JSON correctly', async () => { + const user = await TestUser.create({ + username: 'serialtest', + email: 'serial@example.com', + score: 75, + tags: ['test', 'user'] + }); + + const json = user.toJSON(); + + expect(json).toMatchObject({ + id: user.id, + username: 'serialtest', + email: 'serial@example.com', + score: 75, + isActive: true, + tags: ['test', 'user'], + createdAt: expect.any(Number), + updatedAt: expect.any(Number) + }); + }); + + it('should create instance from JSON', () => { + const data = { + id: 'test-id', + username: 'fromjson', + email: 'json@example.com', + score: 80, + isActive: false, + tags: ['json'], + createdAt: Date.now(), + updatedAt: Date.now() + }; + + const user = TestUser.fromJSON(data); + + expect(user).toBeInstanceOf(TestUser); + expect(user.id).toBe('test-id'); + expect(user.username).toBe('fromjson'); + expect(user.email).toBe('json@example.com'); + expect(user.score).toBe(80); + expect(user.isActive).toBe(false); + expect(user.tags).toEqual(['json']); + }); + }); + + describe('Query Interface', () => { + it('should provide query interface', () => { + const queryBuilder = TestUser.query(); + + expect(queryBuilder).toBeDefined(); + expect(typeof queryBuilder.where).toBe('function'); + expect(typeof queryBuilder.find).toBe('function'); + expect(typeof queryBuilder.findOne).toBe('function'); + expect(typeof queryBuilder.count).toBe('function'); + }); + + it('should support method chaining in queries', () => { + const queryBuilder = TestUser.query() + .where('isActive', true) + .where('score', '>', 50) + .orderBy('username') + .limit(10); + + expect(queryBuilder).toBeDefined(); + // The query builder should return itself for chaining + expect(typeof queryBuilder.find).toBe('function'); + }); + }); + + describe('Field Modification Tracking', () => { + it('should track field modifications', async () => { + const user = await TestUser.create({ + username: 'tracktest', + email: 'track@example.com' + }); + + expect(user.isFieldModified('username')).toBe(false); + + user.username = 'newusername'; + expect(user.isFieldModified('username')).toBe(true); + + user.score = 100; + expect(user.isFieldModified('score')).toBe(true); + expect(user.isFieldModified('email')).toBe(false); + }); + + it('should get modified fields', async () => { + const user = await TestUser.create({ + username: 'modifytest', + email: 'modify@example.com' + }); + + user.username = 'newusername'; + user.score = 200; + + const modifiedFields = user.getModifiedFields(); + expect(modifiedFields).toContain('username'); + expect(modifiedFields).toContain('score'); + expect(modifiedFields).not.toContain('email'); + }); + + it('should clear modifications after save', async () => { + const user = await TestUser.create({ + username: 'cleartest', + email: 'clear@example.com' + }); + + user.username = 'newusername'; + expect(user.isFieldModified('username')).toBe(true); + + await user.save(); + expect(user.isFieldModified('username')).toBe(false); + }); + }); + + describe('Error Handling', () => { + it('should handle validation errors gracefully', async () => { + try { + await TestPost.create({ + title: '', // Empty title should fail validation + content: 'Test content', + userId: 'user123' + }); + fail('Should have thrown validation error'); + } catch (error: any) { + expect(error.message).toContain('required'); + } + }); + + it('should handle database errors gracefully', async () => { + // This would test database connection errors, timeouts, etc. + // For now, we'll test with a simple validation error + const user = new TestUser(); + user.username = 'test'; + user.email = 'invalid-email'; // Invalid email format + + await expect(user.save()).rejects.toThrow(); + }); + }); + + describe('Custom Methods', () => { + it('should support custom validation methods', async () => { + const user = await TestUser.create({ + username: 'emailtest', + email: 'valid@example.com' + }); + + expect(user.validateEmail()).toBe(true); + + user.email = 'invalid-email'; + expect(user.validateEmail()).toBe(false); + }); + }); +}); \ No newline at end of file diff --git a/tests/unit/query/QueryBuilder.test.ts b/tests/unit/query/QueryBuilder.test.ts new file mode 100644 index 0000000..df4cdb8 --- /dev/null +++ b/tests/unit/query/QueryBuilder.test.ts @@ -0,0 +1,664 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { QueryBuilder } from '../../../src/framework/query/QueryBuilder'; +import { BaseModel } from '../../../src/framework/models/BaseModel'; +import { Model, Field } from '../../../src/framework/models/decorators'; +import { createMockServices } from '../../mocks/services'; + +// Test models for QueryBuilder testing +@Model({ + scope: 'global', + type: 'docstore' +}) +class TestUser extends BaseModel { + @Field({ type: 'string', required: true }) + username: string; + + @Field({ type: 'string', required: true }) + email: string; + + @Field({ type: 'number', required: false, default: 0 }) + score: number; + + @Field({ type: 'boolean', required: false, default: true }) + isActive: boolean; + + @Field({ type: 'array', required: false, default: [] }) + tags: string[]; + + @Field({ type: 'number', required: false }) + createdAt: number; + + @Field({ type: 'number', required: false }) + lastLoginAt: number; +} + +@Model({ + scope: 'user', + type: 'docstore' +}) +class TestPost extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; + + @Field({ type: 'string', required: true }) + content: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @Field({ type: 'array', required: false, default: [] }) + tags: string[]; + + @Field({ type: 'boolean', required: false, default: true }) + isPublished: boolean; + + @Field({ type: 'number', required: false, default: 0 }) + likeCount: number; + + @Field({ type: 'number', required: false }) + publishedAt: number; +} + +describe('QueryBuilder', () => { + let mockServices: any; + + beforeEach(() => { + mockServices = createMockServices(); + jest.clearAllMocks(); + }); + + describe('Basic Query Construction', () => { + it('should create a QueryBuilder instance', () => { + const queryBuilder = new QueryBuilder(TestUser); + + expect(queryBuilder).toBeInstanceOf(QueryBuilder); + expect(queryBuilder.getModel()).toBe(TestUser); + }); + + it('should support method chaining', () => { + const queryBuilder = new QueryBuilder(TestUser) + .where('isActive', true) + .where('score', '>', 50) + .orderBy('username') + .limit(10); + + expect(queryBuilder).toBeInstanceOf(QueryBuilder); + }); + }); + + describe('Where Clauses', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should handle basic equality conditions', () => { + queryBuilder.where('username', 'testuser'); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(1); + expect(conditions[0]).toEqual({ + field: 'username', + operator: 'eq', + value: 'testuser' + }); + }); + + it('should handle explicit operators', () => { + queryBuilder + .where('score', '>', 50) + .where('score', '<=', 100) + .where('isActive', '!=', false); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(3); + + expect(conditions[0]).toEqual({ + field: 'score', + operator: 'gt', + value: 50 + }); + + expect(conditions[1]).toEqual({ + field: 'score', + operator: 'lte', + value: 100 + }); + + expect(conditions[2]).toEqual({ + field: 'isActive', + operator: 'ne', + value: false + }); + }); + + it('should handle IN and NOT IN operators', () => { + queryBuilder + .where('username', 'in', ['alice', 'bob', 'charlie']) + .where('status', 'not in', ['deleted', 'banned']); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(2); + + expect(conditions[0]).toEqual({ + field: 'username', + operator: 'in', + value: ['alice', 'bob', 'charlie'] + }); + + expect(conditions[1]).toEqual({ + field: 'status', + operator: 'not in', + value: ['deleted', 'banned'] + }); + }); + + it('should handle LIKE and REGEX operators', () => { + queryBuilder + .where('username', 'like', 'test%') + .where('email', 'regex', /@gmail\.com$/); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(2); + + expect(conditions[0]).toEqual({ + field: 'username', + operator: 'like', + value: 'test%' + }); + + expect(conditions[1]).toEqual({ + field: 'email', + operator: 'regex', + value: /@gmail\.com$/ + }); + }); + + it('should handle NULL checks', () => { + queryBuilder + .where('lastLoginAt', 'is null') + .where('email', 'is not null'); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(2); + + expect(conditions[0]).toEqual({ + field: 'lastLoginAt', + operator: 'is null', + value: null + }); + + expect(conditions[1]).toEqual({ + field: 'email', + operator: 'is not null', + value: null + }); + }); + + it('should handle array operations', () => { + queryBuilder + .where('tags', 'includes', 'javascript') + .where('tags', 'includes any', ['react', 'vue', 'angular']) + .where('tags', 'includes all', ['frontend', 'framework']); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(3); + + expect(conditions[0]).toEqual({ + field: 'tags', + operator: 'includes', + value: 'javascript' + }); + + expect(conditions[1]).toEqual({ + field: 'tags', + operator: 'includes any', + value: ['react', 'vue', 'angular'] + }); + + expect(conditions[2]).toEqual({ + field: 'tags', + operator: 'includes all', + value: ['frontend', 'framework'] + }); + }); + }); + + describe('OR Conditions', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should handle OR conditions', () => { + queryBuilder + .where('isActive', true) + .orWhere('lastLoginAt', '>', Date.now() - 24*60*60*1000); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(2); + + expect(conditions[0].operator).toBe('eq'); + expect(conditions[1].operator).toBe('gt'); + expect(conditions[1].logical).toBe('or'); + }); + + it('should handle grouped OR conditions', () => { + queryBuilder + .where('isActive', true) + .where((query) => { + query.where('username', 'like', 'admin%') + .orWhere('email', 'like', '%@admin.com'); + }); + + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(2); + + expect(conditions[0].field).toBe('isActive'); + expect(conditions[1].type).toBe('group'); + expect(conditions[1].conditions).toHaveLength(2); + }); + }); + + describe('Ordering', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should handle single field ordering', () => { + queryBuilder.orderBy('username'); + + const orderBy = queryBuilder.getOrderBy(); + expect(orderBy).toHaveLength(1); + expect(orderBy[0]).toEqual({ + field: 'username', + direction: 'asc' + }); + }); + + it('should handle multiple field ordering', () => { + queryBuilder + .orderBy('score', 'desc') + .orderBy('username', 'asc'); + + const orderBy = queryBuilder.getOrderBy(); + expect(orderBy).toHaveLength(2); + + expect(orderBy[0]).toEqual({ + field: 'score', + direction: 'desc' + }); + + expect(orderBy[1]).toEqual({ + field: 'username', + direction: 'asc' + }); + }); + + it('should handle random ordering', () => { + queryBuilder.orderBy('random'); + + const orderBy = queryBuilder.getOrderBy(); + expect(orderBy).toHaveLength(1); + expect(orderBy[0]).toEqual({ + field: 'random', + direction: 'asc' + }); + }); + }); + + describe('Pagination', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should handle limit', () => { + queryBuilder.limit(10); + + expect(queryBuilder.getLimit()).toBe(10); + }); + + it('should handle offset', () => { + queryBuilder.offset(20); + + expect(queryBuilder.getOffset()).toBe(20); + }); + + it('should handle limit and offset together', () => { + queryBuilder.limit(10).offset(20); + + expect(queryBuilder.getLimit()).toBe(10); + expect(queryBuilder.getOffset()).toBe(20); + }); + + it('should handle cursor-based pagination', () => { + queryBuilder.after('cursor-value').limit(10); + + expect(queryBuilder.getCursor()).toBe('cursor-value'); + expect(queryBuilder.getLimit()).toBe(10); + }); + }); + + describe('Relationship Loading', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should handle simple relationship loading', () => { + queryBuilder.with(['posts']); + + const relationships = queryBuilder.getRelationships(); + expect(relationships).toHaveLength(1); + expect(relationships[0]).toEqual({ + relation: 'posts', + constraints: undefined + }); + }); + + it('should handle nested relationship loading', () => { + queryBuilder.with(['posts.comments', 'profile']); + + const relationships = queryBuilder.getRelationships(); + expect(relationships).toHaveLength(2); + + expect(relationships[0].relation).toBe('posts.comments'); + expect(relationships[1].relation).toBe('profile'); + }); + + it('should handle relationship loading with constraints', () => { + queryBuilder.with(['posts'], (query) => { + query.where('isPublished', true) + .orderBy('publishedAt', 'desc') + .limit(5); + }); + + const relationships = queryBuilder.getRelationships(); + expect(relationships).toHaveLength(1); + expect(relationships[0].relation).toBe('posts'); + expect(typeof relationships[0].constraints).toBe('function'); + }); + }); + + describe('Aggregation Methods', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should support count queries', async () => { + const countQuery = queryBuilder.where('isActive', true); + + // Mock the count execution + jest.spyOn(countQuery, 'count').mockResolvedValue(42); + + const count = await countQuery.count(); + expect(count).toBe(42); + }); + + it('should support sum aggregation', async () => { + const sumQuery = queryBuilder.where('isActive', true); + + // Mock the sum execution + jest.spyOn(sumQuery, 'sum').mockResolvedValue(1250); + + const sum = await sumQuery.sum('score'); + expect(sum).toBe(1250); + }); + + it('should support average aggregation', async () => { + const avgQuery = queryBuilder.where('isActive', true); + + // Mock the average execution + jest.spyOn(avgQuery, 'average').mockResolvedValue(85.5); + + const avg = await avgQuery.average('score'); + expect(avg).toBe(85.5); + }); + + it('should support min/max aggregation', async () => { + const query = queryBuilder.where('isActive', true); + + // Mock the min/max execution + jest.spyOn(query, 'min').mockResolvedValue(10); + jest.spyOn(query, 'max').mockResolvedValue(100); + + const min = await query.min('score'); + const max = await query.max('score'); + + expect(min).toBe(10); + expect(max).toBe(100); + }); + }); + + describe('Query Execution', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should execute find queries', async () => { + const mockResults = [ + { id: '1', username: 'alice', email: 'alice@example.com' }, + { id: '2', username: 'bob', email: 'bob@example.com' } + ]; + + // Mock the find execution + jest.spyOn(queryBuilder, 'find').mockResolvedValue(mockResults as any); + + const results = await queryBuilder + .where('isActive', true) + .orderBy('username') + .find(); + + expect(results).toEqual(mockResults); + }); + + it('should execute findOne queries', async () => { + const mockResult = { id: '1', username: 'alice', email: 'alice@example.com' }; + + // Mock the findOne execution + jest.spyOn(queryBuilder, 'findOne').mockResolvedValue(mockResult as any); + + const result = await queryBuilder + .where('username', 'alice') + .findOne(); + + expect(result).toEqual(mockResult); + }); + + it('should return null for findOne when no results', async () => { + // Mock the findOne execution to return null + jest.spyOn(queryBuilder, 'findOne').mockResolvedValue(null); + + const result = await queryBuilder + .where('username', 'nonexistent') + .findOne(); + + expect(result).toBeNull(); + }); + + it('should execute exists queries', async () => { + // Mock the exists execution + jest.spyOn(queryBuilder, 'exists').mockResolvedValue(true); + + const exists = await queryBuilder + .where('username', 'alice') + .exists(); + + expect(exists).toBe(true); + }); + }); + + describe('Caching', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should support query caching', () => { + queryBuilder.cache(300); // 5 minutes + + expect(queryBuilder.getCacheOptions()).toEqual({ + enabled: true, + ttl: 300, + key: undefined + }); + }); + + it('should support custom cache keys', () => { + queryBuilder.cache(600, 'active-users'); + + expect(queryBuilder.getCacheOptions()).toEqual({ + enabled: true, + ttl: 600, + key: 'active-users' + }); + }); + + it('should disable caching', () => { + queryBuilder.noCache(); + + expect(queryBuilder.getCacheOptions()).toEqual({ + enabled: false, + ttl: undefined, + key: undefined + }); + }); + }); + + describe('Complex Query Building', () => { + it('should handle complex queries with multiple conditions', () => { + const queryBuilder = new QueryBuilder(TestPost) + .where('isPublished', true) + .where('likeCount', '>=', 10) + .where('tags', 'includes any', ['javascript', 'typescript']) + .where((query) => { + query.where('title', 'like', '%tutorial%') + .orWhere('content', 'like', '%guide%'); + }) + .with(['user']) + .orderBy('likeCount', 'desc') + .orderBy('publishedAt', 'desc') + .limit(20) + .cache(300); + + // Verify the query structure + const conditions = queryBuilder.getWhereConditions(); + expect(conditions).toHaveLength(4); + + const orderBy = queryBuilder.getOrderBy(); + expect(orderBy).toHaveLength(2); + + const relationships = queryBuilder.getRelationships(); + expect(relationships).toHaveLength(1); + + expect(queryBuilder.getLimit()).toBe(20); + expect(queryBuilder.getCacheOptions().enabled).toBe(true); + }); + + it('should handle pagination queries', async () => { + // Mock paginate execution + const mockPaginatedResult = { + data: [ + { id: '1', title: 'Post 1' }, + { id: '2', title: 'Post 2' } + ], + total: 100, + page: 1, + perPage: 20, + totalPages: 5, + hasMore: true + }; + + const queryBuilder = new QueryBuilder(TestPost); + jest.spyOn(queryBuilder, 'paginate').mockResolvedValue(mockPaginatedResult as any); + + const result = await queryBuilder + .where('isPublished', true) + .orderBy('publishedAt', 'desc') + .paginate(1, 20); + + expect(result).toEqual(mockPaginatedResult); + }); + }); + + describe('Query Builder State', () => { + it('should clone query builder state', () => { + const originalQuery = new QueryBuilder(TestUser) + .where('isActive', true) + .orderBy('username') + .limit(10); + + const clonedQuery = originalQuery.clone(); + + expect(clonedQuery).not.toBe(originalQuery); + expect(clonedQuery.getWhereConditions()).toEqual(originalQuery.getWhereConditions()); + expect(clonedQuery.getOrderBy()).toEqual(originalQuery.getOrderBy()); + expect(clonedQuery.getLimit()).toEqual(originalQuery.getLimit()); + }); + + it('should reset query builder state', () => { + const queryBuilder = new QueryBuilder(TestUser) + .where('isActive', true) + .orderBy('username') + .limit(10) + .cache(300); + + queryBuilder.reset(); + + expect(queryBuilder.getWhereConditions()).toHaveLength(0); + expect(queryBuilder.getOrderBy()).toHaveLength(0); + expect(queryBuilder.getLimit()).toBeUndefined(); + expect(queryBuilder.getCacheOptions().enabled).toBe(false); + }); + }); + + describe('Error Handling', () => { + let queryBuilder: QueryBuilder; + + beforeEach(() => { + queryBuilder = new QueryBuilder(TestUser); + }); + + it('should handle invalid operators', () => { + expect(() => { + queryBuilder.where('username', 'invalid-operator' as any, 'value'); + }).toThrow(); + }); + + it('should handle invalid field names', () => { + expect(() => { + queryBuilder.where('nonexistentField', 'value'); + }).toThrow(); + }); + + it('should handle invalid order directions', () => { + expect(() => { + queryBuilder.orderBy('username', 'invalid-direction' as any); + }).toThrow(); + }); + + it('should handle negative limits', () => { + expect(() => { + queryBuilder.limit(-1); + }).toThrow(); + }); + + it('should handle negative offsets', () => { + expect(() => { + queryBuilder.offset(-1); + }).toThrow(); + }); + }); +}); \ No newline at end of file diff --git a/tests/unit/relationships/RelationshipManager.test.ts b/tests/unit/relationships/RelationshipManager.test.ts new file mode 100644 index 0000000..3b2a88d --- /dev/null +++ b/tests/unit/relationships/RelationshipManager.test.ts @@ -0,0 +1,575 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { RelationshipManager, RelationshipLoadOptions } from '../../../src/framework/relationships/RelationshipManager'; +import { BaseModel } from '../../../src/framework/models/BaseModel'; +import { Model, Field, BelongsTo, HasMany, HasOne, ManyToMany } from '../../../src/framework/models/decorators'; +import { QueryBuilder } from '../../../src/framework/query/QueryBuilder'; +import { createMockServices } from '../../mocks/services'; + +// Test models for relationship testing +@Model({ + scope: 'global', + type: 'docstore' +}) +class User extends BaseModel { + @Field({ type: 'string', required: true }) + username: string; + + @Field({ type: 'string', required: true }) + email: string; + + @HasMany(() => Post, 'userId') + posts: Post[]; + + @HasOne(() => Profile, 'userId') + profile: Profile; + + @ManyToMany(() => Role, 'user_roles', 'userId', 'roleId') + roles: Role[]; + + // Mock query methods + static where = jest.fn().mockReturnThis(); + static whereIn = jest.fn().mockReturnThis(); + static first = jest.fn(); + static exec = jest.fn(); +} + +@Model({ + scope: 'user', + type: 'docstore' +}) +class Post extends BaseModel { + @Field({ type: 'string', required: true }) + title: string; + + @Field({ type: 'string', required: true }) + content: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @BelongsTo(() => User, 'userId') + user: User; + + // Mock query methods + static where = jest.fn().mockReturnThis(); + static whereIn = jest.fn().mockReturnThis(); + static first = jest.fn(); + static exec = jest.fn(); +} + +@Model({ + scope: 'global', + type: 'docstore' +}) +class Profile extends BaseModel { + @Field({ type: 'string', required: true }) + bio: string; + + @Field({ type: 'string', required: true }) + userId: string; + + @BelongsTo(() => User, 'userId') + user: User; + + // Mock query methods + static where = jest.fn().mockReturnThis(); + static whereIn = jest.fn().mockReturnThis(); + static first = jest.fn(); + static exec = jest.fn(); +} + +@Model({ + scope: 'global', + type: 'docstore' +}) +class Role extends BaseModel { + @Field({ type: 'string', required: true }) + name: string; + + @ManyToMany(() => User, 'user_roles', 'roleId', 'userId') + users: User[]; + + // Mock query methods + static where = jest.fn().mockReturnThis(); + static whereIn = jest.fn().mockReturnThis(); + static first = jest.fn(); + static exec = jest.fn(); +} + +@Model({ + scope: 'global', + type: 'docstore' +}) +class UserRole extends BaseModel { + @Field({ type: 'string', required: true }) + userId: string; + + @Field({ type: 'string', required: true }) + roleId: string; + + // Mock query methods + static where = jest.fn().mockReturnThis(); + static whereIn = jest.fn().mockReturnThis(); + static first = jest.fn(); + static exec = jest.fn(); +} + +describe('RelationshipManager', () => { + let relationshipManager: RelationshipManager; + let mockFramework: any; + let user: User; + let post: Post; + let profile: Profile; + let role: Role; + + beforeEach(() => { + const mockServices = createMockServices(); + mockFramework = { + services: mockServices + }; + + relationshipManager = new RelationshipManager(mockFramework); + + // Create test instances + user = new User(); + user.id = 'user-123'; + user.username = 'testuser'; + user.email = 'test@example.com'; + + post = new Post(); + post.id = 'post-123'; + post.title = 'Test Post'; + post.content = 'Test content'; + post.userId = 'user-123'; + + profile = new Profile(); + profile.id = 'profile-123'; + profile.bio = 'Test bio'; + profile.userId = 'user-123'; + + role = new Role(); + role.id = 'role-123'; + role.name = 'admin'; + + // Clear all mocks + jest.clearAllMocks(); + }); + + describe('BelongsTo Relationships', () => { + it('should load belongsTo relationship correctly', async () => { + const mockUser = new User(); + mockUser.id = 'user-123'; + + User.first.mockResolvedValue(mockUser); + + const result = await relationshipManager.loadRelationship(post, 'user'); + + expect(User.where).toHaveBeenCalledWith('id', '=', 'user-123'); + expect(User.first).toHaveBeenCalled(); + expect(result).toBe(mockUser); + expect(post._loadedRelations.get('user')).toBe(mockUser); + }); + + it('should return null for belongsTo when foreign key is null', async () => { + post.userId = null as any; + + const result = await relationshipManager.loadRelationship(post, 'user'); + + expect(result).toBeNull(); + expect(User.where).not.toHaveBeenCalled(); + }); + + it('should apply constraints to belongsTo queries', async () => { + const mockUser = new User(); + User.first.mockResolvedValue(mockUser); + + const mockQueryBuilder = { + where: jest.fn().mockReturnThis(), + first: jest.fn().mockResolvedValue(mockUser) + }; + User.where.mockReturnValue(mockQueryBuilder); + + const options: RelationshipLoadOptions = { + constraints: (query) => query.where('isActive', true) + }; + + await relationshipManager.loadRelationship(post, 'user', options); + + expect(User.where).toHaveBeenCalledWith('id', '=', 'user-123'); + expect(options.constraints).toBeDefined(); + }); + }); + + describe('HasMany Relationships', () => { + it('should load hasMany relationship correctly', async () => { + const mockPosts = [ + { id: 'post-1', title: 'Post 1', userId: 'user-123' }, + { id: 'post-2', title: 'Post 2', userId: 'user-123' } + ]; + + Post.exec.mockResolvedValue(mockPosts); + + const result = await relationshipManager.loadRelationship(user, 'posts'); + + expect(Post.where).toHaveBeenCalledWith('userId', '=', 'user-123'); + expect(Post.exec).toHaveBeenCalled(); + expect(result).toEqual(mockPosts); + expect(user._loadedRelations.get('posts')).toEqual(mockPosts); + }); + + it('should return empty array for hasMany when local key is null', async () => { + user.id = null as any; + + const result = await relationshipManager.loadRelationship(user, 'posts'); + + expect(result).toEqual([]); + expect(Post.where).not.toHaveBeenCalled(); + }); + + it('should apply ordering and limits to hasMany queries', async () => { + const mockPosts = [{ id: 'post-1', title: 'Post 1' }]; + + const mockQueryBuilder = { + where: jest.fn().mockReturnThis(), + orderBy: jest.fn().mockReturnThis(), + limit: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue(mockPosts) + }; + Post.where.mockReturnValue(mockQueryBuilder); + + const options: RelationshipLoadOptions = { + orderBy: { field: 'createdAt', direction: 'desc' }, + limit: 5 + }; + + await relationshipManager.loadRelationship(user, 'posts', options); + + expect(mockQueryBuilder.orderBy).toHaveBeenCalledWith('createdAt', 'desc'); + expect(mockQueryBuilder.limit).toHaveBeenCalledWith(5); + }); + }); + + describe('HasOne Relationships', () => { + it('should load hasOne relationship correctly', async () => { + const mockProfile = { id: 'profile-1', bio: 'Test bio', userId: 'user-123' }; + + const mockQueryBuilder = { + where: jest.fn().mockReturnThis(), + limit: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue([mockProfile]) + }; + Profile.where.mockReturnValue(mockQueryBuilder); + + const result = await relationshipManager.loadRelationship(user, 'profile'); + + expect(Profile.where).toHaveBeenCalledWith('userId', '=', 'user-123'); + expect(mockQueryBuilder.limit).toHaveBeenCalledWith(1); + expect(result).toBe(mockProfile); + }); + + it('should return null for hasOne when no results found', async () => { + const mockQueryBuilder = { + where: jest.fn().mockReturnThis(), + limit: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue([]) + }; + Profile.where.mockReturnValue(mockQueryBuilder); + + const result = await relationshipManager.loadRelationship(user, 'profile'); + + expect(result).toBeNull(); + }); + }); + + describe('ManyToMany Relationships', () => { + it('should load manyToMany relationship correctly', async () => { + const mockJunctionRecords = [ + { userId: 'user-123', roleId: 'role-1' }, + { userId: 'user-123', roleId: 'role-2' } + ]; + const mockRoles = [ + { id: 'role-1', name: 'admin' }, + { id: 'role-2', name: 'editor' } + ]; + + // Mock UserRole (junction table) + const mockJunctionQuery = { + where: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue(mockJunctionRecords) + }; + + // Mock Role query + const mockRoleQuery = { + whereIn: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue(mockRoles) + }; + + UserRole.where.mockReturnValue(mockJunctionQuery); + Role.whereIn.mockReturnValue(mockRoleQuery); + + // Mock the relationship config to include the through model + const originalRelationships = User.relationships; + User.relationships = new Map(); + User.relationships.set('roles', { + type: 'manyToMany', + model: Role, + through: UserRole, + foreignKey: 'roleId', + localKey: 'id', + propertyKey: 'roles' + }); + + const result = await relationshipManager.loadRelationship(user, 'roles'); + + expect(UserRole.where).toHaveBeenCalledWith('id', '=', 'user-123'); + expect(Role.whereIn).toHaveBeenCalledWith('id', ['role-1', 'role-2']); + expect(result).toEqual(mockRoles); + + // Restore original relationships + User.relationships = originalRelationships; + }); + + it('should handle empty junction table for manyToMany', async () => { + const mockJunctionQuery = { + where: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue([]) + }; + + UserRole.where.mockReturnValue(mockJunctionQuery); + + // Mock the relationship config + const originalRelationships = User.relationships; + User.relationships = new Map(); + User.relationships.set('roles', { + type: 'manyToMany', + model: Role, + through: UserRole, + foreignKey: 'roleId', + localKey: 'id', + propertyKey: 'roles' + }); + + const result = await relationshipManager.loadRelationship(user, 'roles'); + + expect(result).toEqual([]); + + // Restore original relationships + User.relationships = originalRelationships; + }); + + it('should throw error for manyToMany without through model', async () => { + // Mock the relationship config without through model + const originalRelationships = User.relationships; + User.relationships = new Map(); + User.relationships.set('roles', { + type: 'manyToMany', + model: Role, + through: null as any, + foreignKey: 'roleId', + localKey: 'id', + propertyKey: 'roles' + }); + + await expect(relationshipManager.loadRelationship(user, 'roles')).rejects.toThrow( + 'Many-to-many relationships require a through model' + ); + + // Restore original relationships + User.relationships = originalRelationships; + }); + }); + + describe('Eager Loading', () => { + it('should eager load multiple relationships for multiple instances', async () => { + const users = [user, new User()]; + users[1].id = 'user-456'; + + const mockPosts = [ + { id: 'post-1', userId: 'user-123' }, + { id: 'post-2', userId: 'user-456' } + ]; + const mockProfiles = [ + { id: 'profile-1', userId: 'user-123' }, + { id: 'profile-2', userId: 'user-456' } + ]; + + // Mock hasMany query for posts + const mockPostQuery = { + whereIn: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue(mockPosts) + }; + Post.whereIn.mockReturnValue(mockPostQuery); + + // Mock hasOne query for profiles + const mockProfileQuery = { + whereIn: jest.fn().mockReturnThis(), + limit: jest.fn().mockReturnThis(), + exec: jest.fn().mockResolvedValue(mockProfiles) + }; + Profile.whereIn.mockReturnValue(mockProfileQuery); + + await relationshipManager.eagerLoadRelationships(users, ['posts', 'profile']); + + expect(Post.whereIn).toHaveBeenCalledWith('userId', ['user-123', 'user-456']); + expect(Profile.whereIn).toHaveBeenCalledWith('userId', ['user-123', 'user-456']); + + // Check that relationships were loaded on instances + expect(users[0]._loadedRelations.has('posts')).toBe(true); + expect(users[0]._loadedRelations.has('profile')).toBe(true); + expect(users[1]._loadedRelations.has('posts')).toBe(true); + expect(users[1]._loadedRelations.has('profile')).toBe(true); + }); + + it('should handle empty instances array', async () => { + await relationshipManager.eagerLoadRelationships([], ['posts']); + + expect(Post.whereIn).not.toHaveBeenCalled(); + }); + + it('should skip non-existent relationships during eager loading', async () => { + const consoleSpy = jest.spyOn(console, 'warn').mockImplementation(); + + await relationshipManager.eagerLoadRelationships([user], ['nonExistentRelation']); + + expect(consoleSpy).toHaveBeenCalledWith( + "Relationship 'nonExistentRelation' not found on User" + ); + + consoleSpy.mockRestore(); + }); + }); + + describe('Caching', () => { + it('should use cache when available', async () => { + const mockUser = new User(); + + // Mock cache hit + jest.spyOn(relationshipManager['cache'], 'get').mockReturnValue(mockUser); + jest.spyOn(relationshipManager['cache'], 'generateKey').mockReturnValue('cache-key'); + + const result = await relationshipManager.loadRelationship(post, 'user'); + + expect(result).toBe(mockUser); + expect(User.where).not.toHaveBeenCalled(); // Should not query database + }); + + it('should store in cache after loading', async () => { + const mockUser = new User(); + User.first.mockResolvedValue(mockUser); + + const setCacheSpy = jest.spyOn(relationshipManager['cache'], 'set'); + const generateKeySpy = jest.spyOn(relationshipManager['cache'], 'generateKey').mockReturnValue('cache-key'); + + await relationshipManager.loadRelationship(post, 'user'); + + expect(setCacheSpy).toHaveBeenCalledWith('cache-key', mockUser, 'User', 'belongsTo'); + expect(generateKeySpy).toHaveBeenCalled(); + }); + + it('should skip cache when useCache is false', async () => { + const mockUser = new User(); + User.first.mockResolvedValue(mockUser); + + const getCacheSpy = jest.spyOn(relationshipManager['cache'], 'get'); + const setCacheSpy = jest.spyOn(relationshipManager['cache'], 'set'); + + await relationshipManager.loadRelationship(post, 'user', { useCache: false }); + + expect(getCacheSpy).not.toHaveBeenCalled(); + expect(setCacheSpy).not.toHaveBeenCalled(); + }); + }); + + describe('Cache Management', () => { + it('should invalidate relationship cache for specific relationship', () => { + const invalidateSpy = jest.spyOn(relationshipManager['cache'], 'invalidate').mockReturnValue(true); + const generateKeySpy = jest.spyOn(relationshipManager['cache'], 'generateKey').mockReturnValue('cache-key'); + + const result = relationshipManager.invalidateRelationshipCache(user, 'posts'); + + expect(generateKeySpy).toHaveBeenCalledWith(user, 'posts'); + expect(invalidateSpy).toHaveBeenCalledWith('cache-key'); + expect(result).toBe(1); + }); + + it('should invalidate all cache for instance when no relationship specified', () => { + const invalidateByInstanceSpy = jest.spyOn(relationshipManager['cache'], 'invalidateByInstance').mockReturnValue(3); + + const result = relationshipManager.invalidateRelationshipCache(user); + + expect(invalidateByInstanceSpy).toHaveBeenCalledWith(user); + expect(result).toBe(3); + }); + + it('should invalidate cache by model name', () => { + const invalidateByModelSpy = jest.spyOn(relationshipManager['cache'], 'invalidateByModel').mockReturnValue(5); + + const result = relationshipManager.invalidateModelCache('User'); + + expect(invalidateByModelSpy).toHaveBeenCalledWith('User'); + expect(result).toBe(5); + }); + + it('should get cache statistics', () => { + const mockStats = { cache: { hitRate: 0.85 }, performance: { avgLoadTime: 50 } }; + jest.spyOn(relationshipManager['cache'], 'getStats').mockReturnValue(mockStats.cache); + jest.spyOn(relationshipManager['cache'], 'analyzePerformance').mockReturnValue(mockStats.performance); + + const result = relationshipManager.getRelationshipCacheStats(); + + expect(result).toEqual(mockStats); + }); + + it('should warmup cache', async () => { + const warmupSpy = jest.spyOn(relationshipManager['cache'], 'warmup').mockResolvedValue(); + + await relationshipManager.warmupRelationshipCache([user], ['posts']); + + expect(warmupSpy).toHaveBeenCalledWith([user], ['posts'], expect.any(Function)); + }); + + it('should cleanup expired cache', () => { + const cleanupSpy = jest.spyOn(relationshipManager['cache'], 'cleanup').mockReturnValue(10); + + const result = relationshipManager.cleanupExpiredCache(); + + expect(cleanupSpy).toHaveBeenCalled(); + expect(result).toBe(10); + }); + + it('should clear all cache', () => { + const clearSpy = jest.spyOn(relationshipManager['cache'], 'clear'); + + relationshipManager.clearRelationshipCache(); + + expect(clearSpy).toHaveBeenCalled(); + }); + }); + + describe('Error Handling', () => { + it('should throw error for non-existent relationship', async () => { + await expect(relationshipManager.loadRelationship(user, 'nonExistentRelation')).rejects.toThrow( + "Relationship 'nonExistentRelation' not found on User" + ); + }); + + it('should throw error for unsupported relationship type', async () => { + // Mock an invalid relationship type + const originalRelationships = User.relationships; + User.relationships = new Map(); + User.relationships.set('invalidRelation', { + type: 'unsupported' as any, + model: Post, + foreignKey: 'userId', + propertyKey: 'invalidRelation' + }); + + await expect(relationshipManager.loadRelationship(user, 'invalidRelation')).rejects.toThrow( + 'Unsupported relationship type: unsupported' + ); + + // Restore original relationships + User.relationships = originalRelationships; + }); + }); +}); \ No newline at end of file diff --git a/tests/unit/sharding/ShardManager.test.ts b/tests/unit/sharding/ShardManager.test.ts new file mode 100644 index 0000000..27efbd8 --- /dev/null +++ b/tests/unit/sharding/ShardManager.test.ts @@ -0,0 +1,436 @@ +import { describe, beforeEach, it, expect, jest } from '@jest/globals'; +import { ShardManager, ShardInfo } from '../../../src/framework/sharding/ShardManager'; +import { FrameworkOrbitDBService } from '../../../src/framework/services/OrbitDBService'; +import { ShardingConfig } from '../../../src/framework/types/framework'; +import { createMockServices } from '../../mocks/services'; + +describe('ShardManager', () => { + let shardManager: ShardManager; + let mockOrbitDBService: FrameworkOrbitDBService; + let mockDatabase: any; + + beforeEach(() => { + const mockServices = createMockServices(); + mockOrbitDBService = mockServices.orbitDBService; + + // Create mock database + mockDatabase = { + address: { toString: () => 'mock-address-123' }, + set: jest.fn().mockResolvedValue(undefined), + get: jest.fn().mockResolvedValue(null), + del: jest.fn().mockResolvedValue(undefined), + put: jest.fn().mockResolvedValue('mock-hash'), + add: jest.fn().mockResolvedValue('mock-hash'), + query: jest.fn().mockReturnValue([]) + }; + + // Mock OrbitDB service methods + jest.spyOn(mockOrbitDBService, 'openDatabase').mockResolvedValue(mockDatabase); + + shardManager = new ShardManager(); + shardManager.setOrbitDBService(mockOrbitDBService); + + jest.clearAllMocks(); + }); + + describe('Initialization', () => { + it('should set OrbitDB service correctly', () => { + const newShardManager = new ShardManager(); + newShardManager.setOrbitDBService(mockOrbitDBService); + + // No direct way to test this, but we can verify it works in other tests + expect(newShardManager).toBeInstanceOf(ShardManager); + }); + + it('should throw error when OrbitDB service not set', async () => { + const newShardManager = new ShardManager(); + const config: ShardingConfig = { strategy: 'hash', count: 2, key: 'id' }; + + await expect(newShardManager.createShards('TestModel', config)).rejects.toThrow( + 'OrbitDB service not initialized' + ); + }); + }); + + describe('Shard Creation', () => { + it('should create shards with hash strategy', async () => { + const config: ShardingConfig = { strategy: 'hash', count: 3, key: 'id' }; + + await shardManager.createShards('TestModel', config, 'docstore'); + + // Should create 3 shards + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledTimes(3); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('testmodel-shard-0', 'docstore'); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('testmodel-shard-1', 'docstore'); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('testmodel-shard-2', 'docstore'); + + const shards = shardManager.getAllShards('TestModel'); + expect(shards).toHaveLength(3); + expect(shards[0]).toMatchObject({ + name: 'testmodel-shard-0', + index: 0, + address: 'mock-address-123' + }); + }); + + it('should create shards with range strategy', async () => { + const config: ShardingConfig = { strategy: 'range', count: 2, key: 'name' }; + + await shardManager.createShards('RangeModel', config, 'keyvalue'); + + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledTimes(2); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('rangemodel-shard-0', 'keyvalue'); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('rangemodel-shard-1', 'keyvalue'); + }); + + it('should create shards with user strategy', async () => { + const config: ShardingConfig = { strategy: 'user', count: 4, key: 'userId' }; + + await shardManager.createShards('UserModel', config); + + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledTimes(4); + + const shards = shardManager.getAllShards('UserModel'); + expect(shards).toHaveLength(4); + }); + + it('should handle shard creation errors', async () => { + const config: ShardingConfig = { strategy: 'hash', count: 2, key: 'id' }; + + jest.spyOn(mockOrbitDBService, 'openDatabase').mockRejectedValueOnce(new Error('Database creation failed')); + + await expect(shardManager.createShards('FailModel', config)).rejects.toThrow('Database creation failed'); + }); + }); + + describe('Shard Routing', () => { + beforeEach(async () => { + const config: ShardingConfig = { strategy: 'hash', count: 4, key: 'id' }; + await shardManager.createShards('TestModel', config); + }); + + it('should route keys to consistent shards with hash strategy', () => { + const key1 = 'user-123'; + const key2 = 'user-456'; + const key3 = 'user-123'; // Same as key1 + + const shard1 = shardManager.getShardForKey('TestModel', key1); + const shard2 = shardManager.getShardForKey('TestModel', key2); + const shard3 = shardManager.getShardForKey('TestModel', key3); + + // Same keys should route to same shards + expect(shard1.index).toBe(shard3.index); + + // Different keys may route to different shards + expect(shard1.index).toBeGreaterThanOrEqual(0); + expect(shard1.index).toBeLessThan(4); + expect(shard2.index).toBeGreaterThanOrEqual(0); + expect(shard2.index).toBeLessThan(4); + }); + + it('should route keys with range strategy', async () => { + const config: ShardingConfig = { strategy: 'range', count: 3, key: 'name' }; + await shardManager.createShards('RangeModel', config); + + const shardA = shardManager.getShardForKey('RangeModel', 'apple'); + const shardM = shardManager.getShardForKey('RangeModel', 'middle'); + const shardZ = shardManager.getShardForKey('RangeModel', 'zebra'); + + // Keys starting with different letters should potentially route to different shards + expect(shardA.index).toBeGreaterThanOrEqual(0); + expect(shardA.index).toBeLessThan(3); + expect(shardM.index).toBeGreaterThanOrEqual(0); + expect(shardM.index).toBeLessThan(3); + expect(shardZ.index).toBeGreaterThanOrEqual(0); + expect(shardZ.index).toBeLessThan(3); + }); + + it('should handle user strategy routing', async () => { + const config: ShardingConfig = { strategy: 'user', count: 2, key: 'userId' }; + await shardManager.createShards('UserModel', config); + + const shard1 = shardManager.getShardForKey('UserModel', 'user-abc'); + const shard2 = shardManager.getShardForKey('UserModel', 'user-def'); + const shard3 = shardManager.getShardForKey('UserModel', 'user-abc'); // Same as shard1 + + expect(shard1.index).toBe(shard3.index); + expect(shard1.index).toBeGreaterThanOrEqual(0); + expect(shard1.index).toBeLessThan(2); + }); + + it('should throw error for unsupported sharding strategy', async () => { + const config: ShardingConfig = { strategy: 'unsupported' as any, count: 2, key: 'id' }; + await shardManager.createShards('UnsupportedModel', config); + + expect(() => { + shardManager.getShardForKey('UnsupportedModel', 'test-key'); + }).toThrow('Unsupported sharding strategy: unsupported'); + }); + + it('should throw error when no shards exist for model', () => { + expect(() => { + shardManager.getShardForKey('NonExistentModel', 'test-key'); + }).toThrow('No shards found for model NonExistentModel'); + }); + + it('should throw error when no shard configuration exists', async () => { + // Manually clear the config to simulate this error + const config: ShardingConfig = { strategy: 'hash', count: 2, key: 'id' }; + await shardManager.createShards('ConfigTestModel', config); + + // Access private property for testing (not ideal but necessary for this test) + (shardManager as any).shardConfigs.delete('ConfigTestModel'); + + expect(() => { + shardManager.getShardForKey('ConfigTestModel', 'test-key'); + }).toThrow('No shard configuration found for model ConfigTestModel'); + }); + }); + + describe('Shard Management', () => { + beforeEach(async () => { + const config: ShardingConfig = { strategy: 'hash', count: 3, key: 'id' }; + await shardManager.createShards('TestModel', config); + }); + + it('should get all shards for a model', () => { + const shards = shardManager.getAllShards('TestModel'); + + expect(shards).toHaveLength(3); + expect(shards[0].name).toBe('testmodel-shard-0'); + expect(shards[1].name).toBe('testmodel-shard-1'); + expect(shards[2].name).toBe('testmodel-shard-2'); + }); + + it('should return empty array for non-existent model', () => { + const shards = shardManager.getAllShards('NonExistentModel'); + expect(shards).toEqual([]); + }); + + it('should get shard by index', () => { + const shard0 = shardManager.getShardByIndex('TestModel', 0); + const shard1 = shardManager.getShardByIndex('TestModel', 1); + const shard2 = shardManager.getShardByIndex('TestModel', 2); + const shardInvalid = shardManager.getShardByIndex('TestModel', 5); + + expect(shard0?.index).toBe(0); + expect(shard1?.index).toBe(1); + expect(shard2?.index).toBe(2); + expect(shardInvalid).toBeUndefined(); + }); + + it('should get shard count', () => { + const count = shardManager.getShardCount('TestModel'); + expect(count).toBe(3); + + const nonExistentCount = shardManager.getShardCount('NonExistentModel'); + expect(nonExistentCount).toBe(0); + }); + + it('should get all models with shards', () => { + const models = shardManager.getAllModelsWithShards(); + expect(models).toContain('TestModel'); + }); + }); + + describe('Global Index Management', () => { + it('should create global index with shards', async () => { + await shardManager.createGlobalIndex('TestModel', 'username-index'); + + // Should create 4 index shards (default) + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledTimes(4); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('username-index-shard-0', 'keyvalue'); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('username-index-shard-1', 'keyvalue'); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('username-index-shard-2', 'keyvalue'); + expect(mockOrbitDBService.openDatabase).toHaveBeenCalledWith('username-index-shard-3', 'keyvalue'); + + const indexShards = shardManager.getAllShards('username-index'); + expect(indexShards).toHaveLength(4); + }); + + it('should add to global index', async () => { + await shardManager.createGlobalIndex('TestModel', 'email-index'); + + await shardManager.addToGlobalIndex('email-index', 'user@example.com', 'user-123'); + + // Should call set on one of the index shards + expect(mockDatabase.set).toHaveBeenCalledWith('user@example.com', 'user-123'); + }); + + it('should get from global index', async () => { + await shardManager.createGlobalIndex('TestModel', 'id-index'); + + mockDatabase.get.mockResolvedValue('user-456'); + + const result = await shardManager.getFromGlobalIndex('id-index', 'lookup-key'); + + expect(result).toBe('user-456'); + expect(mockDatabase.get).toHaveBeenCalledWith('lookup-key'); + }); + + it('should remove from global index', async () => { + await shardManager.createGlobalIndex('TestModel', 'remove-index'); + + await shardManager.removeFromGlobalIndex('remove-index', 'key-to-remove'); + + expect(mockDatabase.del).toHaveBeenCalledWith('key-to-remove'); + }); + + it('should handle missing global index', async () => { + await expect( + shardManager.addToGlobalIndex('non-existent-index', 'key', 'value') + ).rejects.toThrow('Global index non-existent-index not found'); + + await expect( + shardManager.getFromGlobalIndex('non-existent-index', 'key') + ).rejects.toThrow('Global index non-existent-index not found'); + + await expect( + shardManager.removeFromGlobalIndex('non-existent-index', 'key') + ).rejects.toThrow('Global index non-existent-index not found'); + }); + + it('should handle global index operation errors', async () => { + await shardManager.createGlobalIndex('TestModel', 'error-index'); + + mockDatabase.set.mockRejectedValue(new Error('Database error')); + mockDatabase.get.mockRejectedValue(new Error('Database error')); + mockDatabase.del.mockRejectedValue(new Error('Database error')); + + await expect( + shardManager.addToGlobalIndex('error-index', 'key', 'value') + ).rejects.toThrow('Database error'); + + const result = await shardManager.getFromGlobalIndex('error-index', 'key'); + expect(result).toBeNull(); // Should return null on error + + await expect( + shardManager.removeFromGlobalIndex('error-index', 'key') + ).rejects.toThrow('Database error'); + }); + }); + + describe('Query Operations', () => { + beforeEach(async () => { + const config: ShardingConfig = { strategy: 'hash', count: 2, key: 'id' }; + await shardManager.createShards('QueryModel', config); + }); + + it('should query all shards', async () => { + const mockQueryFn = jest.fn() + .mockResolvedValueOnce([{ id: '1', name: 'test1' }]) + .mockResolvedValueOnce([{ id: '2', name: 'test2' }]); + + const results = await shardManager.queryAllShards('QueryModel', mockQueryFn); + + expect(mockQueryFn).toHaveBeenCalledTimes(2); + expect(results).toEqual([ + { id: '1', name: 'test1' }, + { id: '2', name: 'test2' } + ]); + }); + + it('should handle query errors gracefully', async () => { + const mockQueryFn = jest.fn() + .mockResolvedValueOnce([{ id: '1', name: 'test1' }]) + .mockRejectedValueOnce(new Error('Query failed')); + + const results = await shardManager.queryAllShards('QueryModel', mockQueryFn); + + expect(results).toEqual([{ id: '1', name: 'test1' }]); + }); + + it('should throw error when querying non-existent model', async () => { + const mockQueryFn = jest.fn(); + + await expect( + shardManager.queryAllShards('NonExistentModel', mockQueryFn) + ).rejects.toThrow('No shards found for model NonExistentModel'); + }); + }); + + describe('Statistics and Monitoring', () => { + beforeEach(async () => { + const config: ShardingConfig = { strategy: 'hash', count: 3, key: 'id' }; + await shardManager.createShards('StatsModel', config); + }); + + it('should get shard statistics', () => { + const stats = shardManager.getShardStatistics('StatsModel'); + + expect(stats).toEqual({ + modelName: 'StatsModel', + shardCount: 3, + shards: [ + { name: 'statsmodel-shard-0', index: 0, address: 'mock-address-123' }, + { name: 'statsmodel-shard-1', index: 1, address: 'mock-address-123' }, + { name: 'statsmodel-shard-2', index: 2, address: 'mock-address-123' } + ] + }); + }); + + it('should return null for non-existent model statistics', () => { + const stats = shardManager.getShardStatistics('NonExistentModel'); + expect(stats).toBeNull(); + }); + + it('should list all models with shards', async () => { + const config1: ShardingConfig = { strategy: 'hash', count: 2, key: 'id' }; + const config2: ShardingConfig = { strategy: 'range', count: 3, key: 'name' }; + + await shardManager.createShards('Model1', config1); + await shardManager.createShards('Model2', config2); + + const models = shardManager.getAllModelsWithShards(); + + expect(models).toContain('StatsModel'); // From beforeEach + expect(models).toContain('Model1'); + expect(models).toContain('Model2'); + expect(models.length).toBeGreaterThanOrEqual(3); + }); + }); + + describe('Hash Function Consistency', () => { + it('should produce consistent hash results', () => { + // Test the hash function directly by creating shards and checking consistency + const testKeys = ['user-123', 'user-456', 'user-789', 'user-abc', 'user-def']; + const shardCount = 4; + + // Get shard indices for each key multiple times + const config: ShardingConfig = { strategy: 'hash', count: shardCount, key: 'id' }; + + return shardManager.createShards('HashTestModel', config).then(() => { + testKeys.forEach(key => { + const shard1 = shardManager.getShardForKey('HashTestModel', key); + const shard2 = shardManager.getShardForKey('HashTestModel', key); + const shard3 = shardManager.getShardForKey('HashTestModel', key); + + // Same key should always route to same shard + expect(shard1.index).toBe(shard2.index); + expect(shard2.index).toBe(shard3.index); + + // Shard index should be within valid range + expect(shard1.index).toBeGreaterThanOrEqual(0); + expect(shard1.index).toBeLessThan(shardCount); + }); + }); + }); + }); + + describe('Cleanup', () => { + it('should stop and clear all resources', async () => { + const config: ShardingConfig = { strategy: 'hash', count: 2, key: 'id' }; + await shardManager.createShards('CleanupModel', config); + await shardManager.createGlobalIndex('CleanupModel', 'cleanup-index'); + + expect(shardManager.getAllShards('CleanupModel')).toHaveLength(2); + expect(shardManager.getAllShards('cleanup-index')).toHaveLength(4); + + await shardManager.stop(); + + expect(shardManager.getAllShards('CleanupModel')).toHaveLength(0); + expect(shardManager.getAllShards('cleanup-index')).toHaveLength(0); + expect(shardManager.getAllModelsWithShards()).toHaveLength(0); + }); + }); +}); \ No newline at end of file