diff --git a/package.json b/package.json index 7fdff01..bf86dc2 100644 --- a/package.json +++ b/package.json @@ -37,14 +37,12 @@ "release": "semantic-release" }, "dependencies": { - "dayjs": "^1.11.0", - "dotenv": "^16.0.0", - "lodash": "^4.17.0", - "react": "^19.0.0", - "react-dom": "^19.0.0", - "tslib": "^2.5.0", - "winston": "^3.10.0", - "zod": "^3.22.0" + "dayjs": "^1.11.13", + "dotenv": "^16.4.7", + "lodash": "^4.17.21", + "pino": "^9.6.0", + "tslib": "^2.8.1", + "zod": "^3.24.1" }, "peerDependencies": { "react": "^19.0.0", @@ -54,36 +52,37 @@ "devDependencies": { "@commitlint/cli": "^19.6.1", "@commitlint/config-conventional": "^19.6.0", - "@semantic-release/changelog": "latest", - "@semantic-release/git": "latest", - "@semantic-release/npm": "latest", - "@testing-library/dom": "latest", - "@testing-library/jest-dom": "latest", - "@testing-library/react": "latest", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^12.0.1", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.1.0", "@types/lodash": "^4.17.14", "@types/node": "^22.10.5", - "@types/react": "latest", - "@types/react-dom": "latest", - "@typescript-eslint/eslint-plugin": "latest", - "@typescript-eslint/parser": "latest", - "@vitest/coverage-v8": "latest", - "@vitest/expect": "latest", - "cross-env": "latest", - "eslint": "latest", - "eslint-config-prettier": "latest", - "eslint-define-config": "latest", - "eslint-plugin-prettier": "latest", + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "@typescript-eslint/eslint-plugin": "^8.19.0", + "@typescript-eslint/parser": "^8.19.0", + "@vitejs/plugin-react": "^4.3.4", + "@vitest/coverage-v8": "^2.1.8", + "@vitest/expect": "^2.1.8", + "cross-env": "^7.0.3", + "eslint": "^9.17.0", + "eslint-config-prettier": "^9.1.0", + "eslint-define-config": "^2.1.0", + "eslint-plugin-prettier": "^5.2.1", "husky": "^9.1.7", - "jsdom": "latest", - "lint-staged": "latest", - "msw": "latest", - "prettier": "latest", - "rimraf": "latest", + "jsdom": "^25.0.1", + "lint-staged": "^15.3.0", + "msw": "^2.7.0", + "prettier": "^3.4.2", + "rimraf": "^6.0.1", "semantic-release": "^24.2.1", - "ts-node": "latest", - "tsx": "latest", - "typescript": "latest", - "vitest": "latest" + "ts-node": "^10.9.2", + "tsx": "^4.19.2", + "typescript": "^5.7.2", + "vitest": "^2.1.8" }, "license": "MIT", "repository": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2704128..d9b5fd7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,17 @@ importers: .: dependencies: dayjs: - specifier: ^1.11.0 + specifier: ^1.11.13 version: 1.11.13 dotenv: - specifier: ^16.0.0 + specifier: ^16.4.7 version: 16.4.7 lodash: - specifier: ^4.17.0 + specifier: ^4.17.21 version: 4.17.21 + pino: + specifier: ^9.6.0 + version: 9.6.0 react: specifier: ^19.0.0 version: 19.0.0 @@ -24,13 +27,10 @@ importers: specifier: ^19.0.0 version: 19.0.0(react@19.0.0) tslib: - specifier: ^2.5.0 + specifier: ^2.8.1 version: 2.8.1 - winston: - specifier: ^3.10.0 - version: 3.17.0 zod: - specifier: ^3.22.0 + specifier: ^3.24.1 version: 3.24.1 devDependencies: '@commitlint/cli': @@ -40,22 +40,22 @@ importers: specifier: ^19.6.0 version: 19.6.0 '@semantic-release/changelog': - specifier: latest + specifier: ^6.0.3 version: 6.0.3(semantic-release@24.2.1(typescript@5.7.2)) '@semantic-release/git': - specifier: latest + specifier: ^10.0.1 version: 10.0.1(semantic-release@24.2.1(typescript@5.7.2)) '@semantic-release/npm': - specifier: latest + specifier: ^12.0.1 version: 12.0.1(semantic-release@24.2.1(typescript@5.7.2)) '@testing-library/dom': - specifier: latest + specifier: ^10.4.0 version: 10.4.0 '@testing-library/jest-dom': - specifier: latest + specifier: ^6.6.3 version: 6.6.3 '@testing-library/react': - specifier: latest + specifier: ^16.1.0 version: 16.1.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.2(@types/react@19.0.2))(@types/react@19.0.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@types/lodash': specifier: ^4.17.14 @@ -64,70 +64,73 @@ importers: specifier: ^22.10.5 version: 22.10.5 '@types/react': - specifier: latest + specifier: ^19.0.2 version: 19.0.2 '@types/react-dom': - specifier: latest + specifier: ^19.0.2 version: 19.0.2(@types/react@19.0.2) '@typescript-eslint/eslint-plugin': - specifier: latest + specifier: ^8.19.0 version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) '@typescript-eslint/parser': - specifier: latest + specifier: ^8.19.0 version: 8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@5.4.11(@types/node@22.10.5)) '@vitest/coverage-v8': - specifier: latest + specifier: ^2.1.8 version: 2.1.8(vitest@2.1.8(@types/node@22.10.5)(jsdom@25.0.1)(msw@2.7.0(@types/node@22.10.5)(typescript@5.7.2))) '@vitest/expect': - specifier: latest + specifier: ^2.1.8 version: 2.1.8 cross-env: - specifier: latest + specifier: ^7.0.3 version: 7.0.3 eslint: - specifier: latest + specifier: ^9.17.0 version: 9.17.0(jiti@2.4.2) eslint-config-prettier: - specifier: latest + specifier: ^9.1.0 version: 9.1.0(eslint@9.17.0(jiti@2.4.2)) eslint-define-config: - specifier: latest + specifier: ^2.1.0 version: 2.1.0 eslint-plugin-prettier: - specifier: latest + specifier: ^5.2.1 version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.17.0(jiti@2.4.2)))(eslint@9.17.0(jiti@2.4.2))(prettier@3.4.2) husky: specifier: ^9.1.7 version: 9.1.7 jsdom: - specifier: latest + specifier: ^25.0.1 version: 25.0.1 lint-staged: - specifier: latest + specifier: ^15.3.0 version: 15.3.0 msw: - specifier: latest + specifier: ^2.7.0 version: 2.7.0(@types/node@22.10.5)(typescript@5.7.2) prettier: - specifier: latest + specifier: ^3.4.2 version: 3.4.2 rimraf: - specifier: latest + specifier: ^6.0.1 version: 6.0.1 semantic-release: specifier: ^24.2.1 version: 24.2.1(typescript@5.7.2) ts-node: - specifier: latest + specifier: ^10.9.2 version: 10.9.2(@types/node@22.10.5)(typescript@5.7.2) tsx: - specifier: latest + specifier: ^4.19.2 version: 4.19.2 typescript: - specifier: latest + specifier: ^5.7.2 version: 5.7.2 vitest: - specifier: latest + specifier: ^2.1.8 version: 2.1.8(@types/node@22.10.5)(jsdom@25.0.1)(msw@2.7.0(@types/node@22.10.5)(typescript@5.7.2)) packages: @@ -143,6 +146,36 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + 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'} @@ -151,15 +184,43 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.26.3': resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-transform-react-jsx-self@7.25.9': + 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'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.3': resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} @@ -180,10 +241,6 @@ packages: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - '@commitlint/cli@19.6.1': resolution: {integrity: sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ==} engines: {node: '>=v18'} @@ -257,9 +314,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -645,8 +699,8 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@mswjs/interceptors@0.37.3': - resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} + '@mswjs/interceptors@0.37.4': + resolution: {integrity: sha512-YUenGsnvhhuBkabJZrga8dv/8QFRBe/isTb5CYvmzaI/IISLIkKp8kItSu9URY9tsJLvkPkq2W48OU/piDvfnA==} engines: {node: '>=18'} '@nodelib/fs.scandir@2.1.5': @@ -665,8 +719,8 @@ packages: resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} - '@octokit/core@6.1.2': - resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} + '@octokit/core@6.1.3': + resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} engines: {node: '>= 18'} '@octokit/endpoint@10.1.2': @@ -842,8 +896,8 @@ packages: peerDependencies: semantic-release: '>=18.0.0' - '@semantic-release/commit-analyzer@13.0.0': - resolution: {integrity: sha512-KtXWczvTAB1ZFZ6B4O+w8HkfYm/OgQb1dUGNFZtDgQ0csggrmkq8sTxhd+lwGF8kMb59/RnG9o4Tn7M/I8dQ9Q==} + '@semantic-release/commit-analyzer@13.0.1': + resolution: {integrity: sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==} engines: {node: '>=20.8.1'} peerDependencies: semantic-release: '>=20.1.0' @@ -874,8 +928,8 @@ packages: peerDependencies: semantic-release: '>=20.1.0' - '@semantic-release/release-notes-generator@14.0.2': - resolution: {integrity: sha512-ur2l2tVLBfX3fSEO2rCy2X6Kzg5S7BHGqdwTHvJrpWp4mOEN7W4K/2kWAjvfAlwMenEKjMnDIhBbxxjnP0S9hw==} + '@semantic-release/release-notes-generator@14.0.3': + resolution: {integrity: sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw==} engines: {node: '>=20.8.1'} peerDependencies: semantic-release: '>=20.1.0' @@ -930,6 +984,18 @@ packages: '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} @@ -968,9 +1034,6 @@ packages: '@types/tough-cookie@4.0.5': resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@typescript-eslint/eslint-plugin@8.19.0': resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1018,6 +1081,12 @@ packages: resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@vitest/coverage-v8@2.1.8': resolution: {integrity: sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==} peerDependencies: @@ -1150,12 +1219,13 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1175,6 +1245,11 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1183,6 +1258,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} @@ -1260,18 +1338,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1324,6 +1393,9 @@ packages: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -1444,6 +1516,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} + emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -1456,9 +1531,6 @@ packages: emojilib@2.4.0: resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1595,8 +1667,8 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - fast-content-type-parse@2.0.0: - resolution: {integrity: sha512-fCqg/6Sps8tqk8p+kqyKqYfOF0VjPNYrqpLiqNl0RBKmD80B080AJWVV6EkSkscjToNExcXg1+Mfzftrx6+iSA==} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1614,15 +1686,16 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + fast-uri@3.0.3: resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} engines: {node: '>=4'} @@ -1666,9 +1739,6 @@ packages: flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -1693,6 +1763,10 @@ packages: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} + gensync@1.0.0-beta.2: + 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.*} @@ -1749,6 +1823,10 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} + globals@11.12.0: + 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'} @@ -1845,10 +1923,6 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-from-esm@1.3.4: - resolution: {integrity: sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==} - engines: {node: '>=16.20'} - import-from-esm@2.0.0: resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} engines: {node: '>=18.20'} @@ -1889,9 +1963,6 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2007,6 +2078,11 @@ packages: canvas: optional: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2025,6 +2101,11 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -2035,9 +2116,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2123,10 +2201,6 @@ packages: 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'} - loupe@3.1.2: resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} @@ -2137,6 +2211,9 @@ packages: resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} engines: {node: 20 || >=22} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -2269,6 +2346,9 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} @@ -2370,8 +2450,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} @@ -2541,6 +2622,16 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} + pino-abstract-transport@2.0.0: + resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.6.0: + resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + hasBin: true + pkg-conf@2.1.0: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} @@ -2573,6 +2664,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@4.0.1: + resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -2589,6 +2683,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -2601,6 +2698,10 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react@19.0.0: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} @@ -2616,9 +2717,9 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -2683,9 +2784,6 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -2713,6 +2811,10 @@ packages: resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} engines: {node: '>=12'} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -2740,9 +2842,6 @@ packages: resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} engines: {node: '>=6'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - skin-tone@2.0.0: resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} engines: {node: '>=8'} @@ -2759,6 +2858,9 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} + sonic-boom@4.2.0: + resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2789,9 +2891,6 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2827,9 +2926,6 @@ packages: string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2905,9 +3001,6 @@ packages: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2915,6 +3008,9 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -2970,10 +3066,6 @@ packages: resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} engines: {node: '>= 0.4'} - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -3062,6 +3154,12 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3172,14 +3270,6 @@ packages: engines: {node: '>=8'} hasBin: true - winston-transport@4.9.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'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -3230,6 +3320,9 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.6.1: resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} engines: {node: '>= 14'} @@ -3289,18 +3382,109 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/compat-data@7.26.3': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + 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.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-string-parser@7.25.9': {} '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + '@babel/parser@7.26.3': dependencies: '@babel/types': 7.26.3 + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -3324,8 +3508,6 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@colors/colors@1.6.0': {} - '@commitlint/cli@19.6.1(@types/node@22.10.5)(typescript@5.7.2)': dependencies: '@commitlint/format': 19.5.0 @@ -3440,12 +3622,6 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@dabh/diagnostics@2.0.3': - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - '@esbuild/aix-ppc64@0.21.5': optional: true @@ -3700,7 +3876,7 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mswjs/interceptors@0.37.3': + '@mswjs/interceptors@0.37.4': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -3723,7 +3899,7 @@ snapshots: '@octokit/auth-token@5.1.1': {} - '@octokit/core@6.1.2': + '@octokit/core@6.1.3': dependencies: '@octokit/auth-token': 5.1.1 '@octokit/graphql': 8.1.2 @@ -3746,21 +3922,21 @@ snapshots: '@octokit/openapi-types@22.2.0': {} - '@octokit/plugin-paginate-rest@11.3.6(@octokit/core@6.1.2)': + '@octokit/plugin-paginate-rest@11.3.6(@octokit/core@6.1.3)': dependencies: - '@octokit/core': 6.1.2 + '@octokit/core': 6.1.3 '@octokit/types': 13.6.2 - '@octokit/plugin-retry@7.1.2(@octokit/core@6.1.2)': + '@octokit/plugin-retry@7.1.2(@octokit/core@6.1.3)': dependencies: - '@octokit/core': 6.1.2 + '@octokit/core': 6.1.3 '@octokit/request-error': 6.1.6 '@octokit/types': 13.6.2 bottleneck: 2.19.5 - '@octokit/plugin-throttling@9.3.2(@octokit/core@6.1.2)': + '@octokit/plugin-throttling@9.3.2(@octokit/core@6.1.3)': dependencies: - '@octokit/core': 6.1.2 + '@octokit/core': 6.1.3 '@octokit/types': 13.6.2 bottleneck: 2.19.5 @@ -3773,7 +3949,7 @@ snapshots: '@octokit/endpoint': 10.1.2 '@octokit/request-error': 6.1.6 '@octokit/types': 13.6.2 - fast-content-type-parse: 2.0.0 + fast-content-type-parse: 2.0.1 universal-user-agent: 7.0.2 '@octokit/types@13.6.2': @@ -3873,14 +4049,14 @@ snapshots: lodash: 4.17.21 semantic-release: 24.2.1(typescript@5.7.2) - '@semantic-release/commit-analyzer@13.0.0(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.2.1(typescript@5.7.2))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.0.0 debug: 4.4.0 - import-from-esm: 1.3.4 + import-from-esm: 2.0.0 lodash-es: 4.17.21 micromatch: 4.0.8 semantic-release: 24.2.1(typescript@5.7.2) @@ -3907,10 +4083,10 @@ snapshots: '@semantic-release/github@11.0.1(semantic-release@24.2.1(typescript@5.7.2))': dependencies: - '@octokit/core': 6.1.2 - '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.2) - '@octokit/plugin-retry': 7.1.2(@octokit/core@6.1.2) - '@octokit/plugin-throttling': 9.3.2(@octokit/core@6.1.2) + '@octokit/core': 6.1.3 + '@octokit/plugin-paginate-rest': 11.3.6(@octokit/core@6.1.3) + '@octokit/plugin-retry': 7.1.2(@octokit/core@6.1.3) + '@octokit/plugin-throttling': 9.3.2(@octokit/core@6.1.3) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 debug: 4.4.0 @@ -3944,7 +4120,7 @@ snapshots: semver: 7.6.3 tempy: 3.1.0 - '@semantic-release/release-notes-generator@14.0.2(semantic-release@24.2.1(typescript@5.7.2))': + '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.2.1(typescript@5.7.2))': dependencies: conventional-changelog-angular: 8.0.0 conventional-changelog-writer: 8.0.0 @@ -3952,7 +4128,7 @@ snapshots: conventional-commits-parser: 6.0.0 debug: 4.4.0 get-stream: 7.0.1 - import-from-esm: 1.3.4 + import-from-esm: 2.0.0 into-stream: 7.0.0 lodash-es: 4.17.21 read-package-up: 11.0.0 @@ -4007,6 +4183,27 @@ snapshots: '@types/aria-query@5.0.4': {} + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.3 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.3 + '@types/conventional-commits-parser@5.0.1': dependencies: '@types/node': 22.10.5 @@ -4039,8 +4236,6 @@ snapshots: '@types/tough-cookie@4.0.5': {} - '@types/triple-beam@1.3.5': {} - '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2))(eslint@9.17.0(jiti@2.4.2))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -4118,6 +4313,17 @@ snapshots: '@typescript-eslint/types': 8.19.0 eslint-visitor-keys: 4.2.0 + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.10.5))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.11(@types/node@22.10.5) + transitivePeerDependencies: + - supports-color + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.5)(jsdom@25.0.1)(msw@2.7.0(@types/node@22.10.5)(typescript@5.7.2)))': dependencies: '@ampproject/remapping': 2.3.0 @@ -4260,10 +4466,10 @@ snapshots: assertion-error@2.0.1: {} - async@3.2.6: {} - asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} + balanced-match@1.0.2: {} before-after-hook@3.0.2: {} @@ -4283,10 +4489,19 @@ snapshots: dependencies: fill-range: 7.1.1 + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.76 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + cac@6.7.14: {} callsites@3.1.0: {} + caniuse-lite@1.0.30001690: {} + chai@5.1.2: dependencies: assertion-error: 2.0.1 @@ -4373,23 +4588,8 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - colorette@2.0.20: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -4443,6 +4643,8 @@ snapshots: convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} + cookie@0.7.2: {} core-util-is@1.0.3: {} @@ -4534,6 +4736,8 @@ snapshots: eastasianwidth@0.2.0: {} + electron-to-chromium@1.5.76: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} @@ -4542,8 +4746,6 @@ snapshots: emojilib@2.4.0: {} - enabled@2.0.0: {} - entities@4.5.0: {} env-ci@11.1.0: @@ -4752,7 +4954,7 @@ snapshots: expect-type@1.1.0: {} - fast-content-type-parse@2.0.0: {} + fast-content-type-parse@2.0.1: {} fast-deep-equal@3.1.3: {} @@ -4770,14 +4972,14 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-redact@3.5.0: {} + fast-uri@3.0.3: {} fastq@1.18.0: dependencies: reusify: 1.0.4 - fecha@4.2.3: {} - figures@2.0.0: dependencies: escape-string-regexp: 1.0.5 @@ -4823,8 +5025,6 @@ snapshots: flatted@3.3.2: {} - fn.name@1.1.0: {} - foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -4852,6 +5052,8 @@ snapshots: function-timeout@1.0.2: {} + gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} get-east-asian-width@1.3.0: {} @@ -4916,6 +5118,8 @@ snapshots: dependencies: ini: 4.1.1 + globals@11.12.0: {} + globals@14.0.0: {} globby@14.0.2: @@ -5001,13 +5205,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-from-esm@1.3.4: - dependencies: - debug: 4.4.0 - import-meta-resolve: 4.1.0 - transitivePeerDependencies: - - supports-color - import-from-esm@2.0.0: dependencies: debug: 4.4.0 @@ -5038,8 +5235,6 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -5157,6 +5352,8 @@ snapshots: - supports-color - utf-8-validate + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -5169,6 +5366,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -5181,8 +5380,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kuler@2.0.0: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -5274,21 +5471,16 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.4.1 - loupe@3.1.2: {} lru-cache@10.4.3: {} lru-cache@11.0.2: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lz-string@1.5.0: {} magic-string@0.30.17: @@ -5373,7 +5565,7 @@ snapshots: '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 '@inquirer/confirm': 5.1.1(@types/node@22.10.5) - '@mswjs/interceptors': 0.37.3 + '@mswjs/interceptors': 0.37.4 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 @@ -5415,6 +5607,8 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 + node-releases@2.0.19: {} + normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -5442,9 +5636,7 @@ snapshots: object-assign@4.1.1: {} - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 + on-exit-leak-free@2.1.2: {} onetime@5.1.2: dependencies: @@ -5585,6 +5777,26 @@ snapshots: pify@3.0.0: {} + pino-abstract-transport@2.0.0: + dependencies: + split2: 4.2.0 + + pino-std-serializers@7.0.0: {} + + pino@9.6.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 2.0.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.1 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.0 + thread-stream: 3.1.0 + pkg-conf@2.1.0: dependencies: find-up: 2.1.0 @@ -5616,6 +5828,8 @@ snapshots: process-nextick-args@2.0.1: {} + process-warning@4.0.1: {} + proto-list@1.2.4: {} psl@1.15.0: @@ -5628,6 +5842,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -5642,6 +5858,8 @@ snapshots: react-is@17.0.2: {} + react-refresh@0.14.2: {} + react@19.0.0: {} read-package-up@11.0.0: @@ -5668,11 +5886,7 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + real-require@0.2.0: {} redent@3.0.0: dependencies: @@ -5744,8 +5958,6 @@ snapshots: safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} - safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} @@ -5758,11 +5970,11 @@ snapshots: semantic-release@24.2.1(typescript@5.7.2): dependencies: - '@semantic-release/commit-analyzer': 13.0.0(semantic-release@24.2.1(typescript@5.7.2)) + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.2.1(typescript@5.7.2)) '@semantic-release/error': 4.0.0 '@semantic-release/github': 11.0.1(semantic-release@24.2.1(typescript@5.7.2)) '@semantic-release/npm': 12.0.1(semantic-release@24.2.1(typescript@5.7.2)) - '@semantic-release/release-notes-generator': 14.0.2(semantic-release@24.2.1(typescript@5.7.2)) + '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.2.1(typescript@5.7.2)) aggregate-error: 5.0.0 cosmiconfig: 9.0.0(typescript@5.7.2) debug: 4.4.0 @@ -5797,6 +6009,8 @@ snapshots: semver-regex@4.0.5: {} + semver@6.3.1: {} + semver@7.6.3: {} shebang-command@2.0.0: @@ -5817,10 +6031,6 @@ snapshots: figures: 2.0.0 pkg-conf: 2.1.0 - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - skin-tone@2.0.0: dependencies: unicode-emoji-modifier-base: 1.0.0 @@ -5837,6 +6047,10 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 + sonic-boom@4.2.0: + dependencies: + atomic-sleep: 1.0.0 + source-map-js@1.2.1: {} source-map@0.6.1: {} @@ -5863,8 +6077,6 @@ snapshots: split2@4.2.0: {} - stack-trace@0.0.10: {} - stackback@0.0.2: {} statuses@2.0.1: {} @@ -5902,10 +6114,6 @@ snapshots: dependencies: safe-buffer: 5.1.2 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -5972,8 +6180,6 @@ snapshots: text-extensions@2.4.0: {} - text-hex@1.0.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -5982,6 +6188,10 @@ snapshots: dependencies: any-promise: 1.3.0 + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -6030,8 +6240,6 @@ snapshots: traverse@0.6.8: {} - triple-beam@1.4.1: {} - ts-api-utils@1.4.3(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -6098,6 +6306,12 @@ snapshots: universalify@2.0.1: {} + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -6207,26 +6421,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - winston-transport@4.9.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.17.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.9.0 - word-wrap@1.2.5: {} wordwrap@1.0.0: {} @@ -6265,6 +6459,8 @@ snapshots: y18n@5.0.8: {} + yallist@3.1.1: {} + yaml@2.6.1: {} yargs-parser@20.2.9: {} diff --git a/src/index.ts b/src/index.ts index 157bdf6..99537e6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -27,4 +27,11 @@ export * from './utils/validation/uuidUtils'; export * from './constants'; +export { JsonFormatter } from './logging/formatters/JsonFormatter'; +export { TextFormatter } from './logging/formatters/TextFormatter'; +export { logger } from './logging/loggerConfig'; +export { PinoLogger } from './logging/PinoLogger'; +export { ConsoleTransport } from './logging/transports/ConsoleTransport'; +export { FileTransport } from './logging/transports/FileTransport'; + export type { DeepPartial as TypesDeepPartial } from './types'; diff --git a/src/logging/LoggerFactory.ts b/src/logging/LoggerFactory.ts new file mode 100644 index 0000000..696b461 --- /dev/null +++ b/src/logging/LoggerFactory.ts @@ -0,0 +1,29 @@ +// /src/logging/LoggerFactory.ts +import { JsonFormatter } from './formatters/JsonFormatter'; +import { TextFormatter } from './formatters/TextFormatter'; +import { PinoLogger } from './PinoLogger'; +import { ConsoleTransport } from './transports/ConsoleTransport'; +import { FileTransport } from './transports/FileTransport'; + +export class LoggerFactory { + static createLogger(transportType: 'console' | 'file', formatType: 'json' | 'text'): PinoLogger { + let transport; + let formatter; + + // Choix du transport + if (transportType === 'console') { + transport = new ConsoleTransport(); + } else { + transport = new FileTransport(); + } + + // Choix du format + if (formatType === 'json') { + formatter = new JsonFormatter(); + } else { + formatter = new TextFormatter(); + } + + return new PinoLogger(transport, formatter); + } +} diff --git a/src/logging/PinoLogger.ts b/src/logging/PinoLogger.ts new file mode 100644 index 0000000..41b5e37 --- /dev/null +++ b/src/logging/PinoLogger.ts @@ -0,0 +1,84 @@ +import pino from 'pino'; +import { z } from 'zod'; +import type { LogFormatter } from './interfaces/LogFormatter'; +import type { LogTransport } from './interfaces/LogTransport'; +import type { Logger } from './interfaces/Logger'; + +// Schéma de validation des messages +const messageSchema = z.union([ + z.string(), + z.number(), + z.boolean(), + z.null(), + z.undefined(), + z.object({}).passthrough(), +]); + +export class PinoLogger implements Logger { + private transport: LogTransport; + private formatter: LogFormatter; + private logger: pino.Logger; + + constructor( + transport: LogTransport, + formatter: LogFormatter, + loggerInstance: pino.Logger = pino(), // Permet l'injection de mock pour les tests + ) { + this.transport = transport; + this.formatter = formatter; + this.logger = loggerInstance; + } + + log(message: unknown): void { + this.logAtLevel('info', message); + } + + error(message: unknown): void { + this.logAtLevel('error', `ERROR: ${message}`); + } + + warn(message: unknown): void { + this.logAtLevel('warn', `WARNING: ${message}`); + } + + private logAtLevel(level: 'info' | 'warn' | 'error', message: unknown): void { + const formattedMessage: string = `formatted: ${this.safeFormatMessage(message)}`; + this.logger[level](formattedMessage); // Appelle l'instance logger pour enregistrer + this.transport.send(formattedMessage); // Envoie le message formaté au transport + } + + private safeFormatMessage(message: unknown): string { + const parsedMessage = messageSchema.safeParse(message); + + if (!parsedMessage.success) { + return '[Invalid Type]'; + } + + const validMessage = parsedMessage.data; + + if (validMessage === null) return 'null'; + if (validMessage === undefined) return 'undefined'; + if (typeof validMessage === 'boolean') return validMessage ? 'true' : 'false'; + if (typeof validMessage === 'number') return validMessage.toString(); + if (typeof validMessage === 'string') return validMessage; + + // Détection des objets circulaires + try { + const seen = new WeakSet(); + const isCircular = (obj: object): boolean => { + if (typeof obj !== 'object' || obj === null) return false; + if (seen.has(obj)) return true; + seen.add(obj); + return Object.values(obj).some((value) => isCircular(value as object)); + }; + + if (isCircular(validMessage as object)) { + return '[Circular Object]'; + } + + return JSON.stringify(validMessage); + } catch { + return '[Circular Object]'; + } + } +} diff --git a/src/logging/formatters/JsonFormatter.ts b/src/logging/formatters/JsonFormatter.ts new file mode 100644 index 0000000..82f19d0 --- /dev/null +++ b/src/logging/formatters/JsonFormatter.ts @@ -0,0 +1,8 @@ +// /src/logging/formatters/JsonFormatter.ts +import type { LogFormatter } from '../interfaces/LogFormatter'; + +export class JsonFormatter implements LogFormatter { + format(message: string): string { + return JSON.stringify({ message }); // Formate le log en JSON + } +} diff --git a/src/logging/formatters/TextFormatter.ts b/src/logging/formatters/TextFormatter.ts new file mode 100644 index 0000000..5183368 --- /dev/null +++ b/src/logging/formatters/TextFormatter.ts @@ -0,0 +1,8 @@ +// /src/logging/formatters/TextFormatter.ts +import type { LogFormatter } from '../interfaces/LogFormatter'; + +export class TextFormatter implements LogFormatter { + format(message: string): string { + return `LOG: ${message}`; // Formate le log en texte simple + } +} diff --git a/src/logging/interfaces/LogFormatter.ts b/src/logging/interfaces/LogFormatter.ts new file mode 100644 index 0000000..620b224 --- /dev/null +++ b/src/logging/interfaces/LogFormatter.ts @@ -0,0 +1,3 @@ +export interface LogFormatter { + format(message: unknown): string; +} diff --git a/src/logging/interfaces/LogTransport.ts b/src/logging/interfaces/LogTransport.ts new file mode 100644 index 0000000..3059ffd --- /dev/null +++ b/src/logging/interfaces/LogTransport.ts @@ -0,0 +1,3 @@ +export interface LogTransport { + send(message: string): void; +} diff --git a/src/logging/interfaces/Logger.ts b/src/logging/interfaces/Logger.ts new file mode 100644 index 0000000..42b4585 --- /dev/null +++ b/src/logging/interfaces/Logger.ts @@ -0,0 +1,5 @@ +export interface Logger { + log(message: unknown): void; + error(message: unknown): void; + warn(message: unknown): void; +} diff --git a/src/logging/loggerConfig.ts b/src/logging/loggerConfig.ts new file mode 100644 index 0000000..9f9d12a --- /dev/null +++ b/src/logging/loggerConfig.ts @@ -0,0 +1,13 @@ +// src/logging/loggerConfig.ts +import { JsonFormatter } from './formatters/JsonFormatter'; +import { TextFormatter } from './formatters/TextFormatter'; +import { PinoLogger } from './PinoLogger'; +import { ConsoleTransport } from './transports/ConsoleTransport'; +import { FileTransport } from './transports/FileTransport'; + +const isProduction = process['env']['NODE_ENV'] === 'production'; + +export const logger = new PinoLogger( + isProduction ? new FileTransport() : new ConsoleTransport(), + isProduction ? new JsonFormatter() : new TextFormatter(), +); diff --git a/src/logging/transports/ConsoleTransport.ts b/src/logging/transports/ConsoleTransport.ts new file mode 100644 index 0000000..402c7ae --- /dev/null +++ b/src/logging/transports/ConsoleTransport.ts @@ -0,0 +1,8 @@ +import fs from 'fs'; +import type { LogTransport } from '../interfaces/LogTransport'; + +export class ConsoleTransport implements LogTransport { + send(message: string): void { + fs.appendFileSync('logs.txt', message + '\n'); + } +} diff --git a/src/logging/transports/FileTransport.ts b/src/logging/transports/FileTransport.ts new file mode 100644 index 0000000..cf40188 --- /dev/null +++ b/src/logging/transports/FileTransport.ts @@ -0,0 +1,9 @@ +// /src/logging/transports/FileTransport.ts +import fs from 'fs'; +import type { LogTransport } from '../interfaces/LogTransport'; + +export class FileTransport implements LogTransport { + send(message: string): void { + fs.appendFileSync('logs.txt', message + '\n'); + } +} diff --git a/src/utils/logger.ts b/src/utils/logger.ts index c78dc30..58c508f 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -1,65 +1,5 @@ -import fs from 'fs'; -import winston from 'winston'; -import type { ILogger } from './interfaces/ILogger'; +import { LoggerFactory } from '../logging/LoggerFactory'; -const LOG_DIRECTORY = process.env['LOG_DIRECTORY'] || 'logs'; -const LOG_LEVEL = process.env['LOG_LEVEL'] || 'info'; -const COMBINED_LOG = `${LOG_DIRECTORY}/combined.log`; +const logger = LoggerFactory.createLogger('console', 'json'); -export class WinstonLogger implements ILogger { - private logger: winston.Logger; - - constructor() { - this.createLogDirectory(); - - this.logger = winston.createLogger({ - level: LOG_LEVEL, - format: winston.format.combine( - winston.format.timestamp(), - winston.format.printf((info) => `[${info['timestamp']}] ${info.level}: ${info.message}`), - ), - transports: [ - new winston.transports.Console({ - format: winston.format.combine(winston.format.colorize(), winston.format.simple()), - }), - new winston.transports.File({ filename: COMBINED_LOG }), - ], - }); - } - - private createLogDirectory(): void { - if (!fs.existsSync(LOG_DIRECTORY)) { - fs.mkdirSync(LOG_DIRECTORY, { recursive: true }); - } - } - - info(message: unknown): void { - this.logger.info(this.formatMessage(message)); - } - - error(message: unknown): void { - this.logger.error(this.formatMessage(message)); - } - - warn(message: unknown): void { - this.logger.warn(this.formatMessage(message)); - } - - private formatMessage(message: unknown): string { - if (message instanceof Error) { - return message.stack || message.message; - } - if (message === null) return 'null'; - if (message === undefined) return 'undefined'; - if (typeof message === 'object') { - try { - return JSON.stringify(message); - } catch { - return '[Circular Object]'; - } - } - return String(message); - } -} - -export default WinstonLogger; +export default logger; diff --git a/tests/logger.test.ts b/tests/logger.test.ts deleted file mode 100644 index 8994d7c..0000000 --- a/tests/logger.test.ts +++ /dev/null @@ -1,173 +0,0 @@ -import fs from 'fs'; -import { beforeEach, describe, expect, it, type MockInstance, vi } from 'vitest'; -import winston, { Logger, type LoggerOptions } from 'winston'; -import { WinstonLogger } from '../src/utils/logger'; - -vi.mock('fs', async () => { - const actual = await vi.importActual('fs'); - return { - ...actual, - existsSync: vi.fn(), - mkdirSync: vi.fn(), - }; -}); - -vi.mock('winston', async () => { - const actual = await vi.importActual('winston'); - return { - ...actual, - createLogger: vi.fn() as MockInstance<(options?: LoggerOptions) => Logger>, - transports: { - Console: vi.fn().mockImplementation(() => ({ - log: vi.fn(), - format: {}, - level: undefined, - })), - File: vi.fn().mockImplementation(() => ({ - log: vi.fn(), - filename: 'logs/combined.log', - format: {}, - level: undefined, - })), - }, - }; -}); - -describe('WinstonLogger', () => { - let mockCreateLogger: MockInstance<(options: LoggerOptions) => Logger>; - let mockLoggerInstance: { - info: MockInstance; - error: MockInstance; - warn: MockInstance; - }; - - beforeEach(() => { - vi.clearAllMocks(); - - mockLoggerInstance = { - info: vi.fn(), - error: vi.fn(), - warn: vi.fn(), - }; - - mockCreateLogger = vi.spyOn(winston, 'createLogger').mockImplementation( - (options?: LoggerOptions) => - ({ - ...mockLoggerInstance, - ...options, - }) as unknown as Logger, - ); - }); - - describe('Initialization', () => { - it('should handle default log level', () => { - delete process.env['LOG_LEVEL']; - - new WinstonLogger(); - - expect(mockCreateLogger).toHaveBeenCalledWith( - expect.objectContaining({ - level: 'info', - }), - ); - }); - - it('should create the logs directory if it does not exist', () => { - const mkdirSyncMock = vi.spyOn(fs, 'mkdirSync'); - vi.spyOn(fs, 'existsSync').mockReturnValue(false); - - new WinstonLogger(); - - expect(mkdirSyncMock).toHaveBeenCalledWith('logs', { recursive: true }); - }); - - it('should not recreate the logs directory if it already exists', () => { - const mkdirSyncMock = vi.spyOn(fs, 'mkdirSync'); - vi.spyOn(fs, 'existsSync').mockReturnValue(true); - - new WinstonLogger(); - - expect(mkdirSyncMock).not.toHaveBeenCalled(); - }); - }); - - describe('Logging Methods', () => { - let logger: WinstonLogger; - - beforeEach(() => { - logger = new WinstonLogger(); - }); - - it('should log info messages', () => { - logger.info('Test info'); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('Test info'); - }); - - it('should log error messages', () => { - logger.error('Test error'); - expect(mockLoggerInstance.error).toHaveBeenCalledWith('Test error'); - }); - - it('should log warning messages', () => { - logger.warn('Test warning'); - expect(mockLoggerInstance.warn).toHaveBeenCalledWith('Test warning'); - }); - }); - - describe('Message Formatting', () => { - let logger: WinstonLogger; - - beforeEach(() => { - logger = new WinstonLogger(); - }); - - it('should format null values as "null"', () => { - logger.info(null); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('null'); - }); - - it('should format undefined values as "undefined"', () => { - logger.info(undefined); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('undefined'); - }); - - it('should format objects correctly', () => { - const obj = { key: 'value' }; - logger.info(obj); - expect(mockLoggerInstance.info).toHaveBeenCalledWith(JSON.stringify(obj)); - }); - - it('should handle circular references in objects', () => { - const circular: Record = {}; - circular['self'] = circular; - - logger.info(circular); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('[Circular Object]'); - }); - - it('should format primitive values correctly', () => { - logger.info(123); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('123'); - - logger.info('test string'); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('test string'); - - logger.info(true); - expect(mockLoggerInstance.info).toHaveBeenCalledWith('true'); - }); - - it('should handle errors with stack trace', () => { - const error = new Error('Test error'); - error.stack = 'Error stack trace'; - logger.error(error); - expect(mockLoggerInstance.error).toHaveBeenCalledWith(error.stack); - }); - - it('should handle errors without stack trace', () => { - const error = new Error('Test error'); - (error.stack as string | undefined) = undefined; - logger.error(error); - expect(mockLoggerInstance.error).toHaveBeenCalledWith('Test error'); - }); - }); -}); diff --git a/tests/mocks/pino.mocks.ts b/tests/mocks/pino.mocks.ts new file mode 100644 index 0000000..f49edf5 --- /dev/null +++ b/tests/mocks/pino.mocks.ts @@ -0,0 +1,89 @@ +import type { Logger } from 'pino'; +import { vi } from 'vitest'; + +// Mock des méthodes de Pino +const mockInfo = vi.fn(); +const mockError = vi.fn(); +const mockWarn = vi.fn(); +const mockChild = vi.fn().mockReturnValue({ info: vi.fn() }); // Simule la méthode `child` de Pino +const mockFlush = vi.fn(); +const mockIsLevelEnabled = vi.fn().mockReturnValue(true); +const mockSilent = vi.fn(); + +// Ajout des méthodes d'événements nécessaires +const mockOn = vi.fn(); +const mockAddListener = vi.fn(); +const mockOnce = vi.fn(); +const mockPrependListener = vi.fn(); +const mockRemoveListener = vi.fn(); +const mockEmit = vi.fn(); +const mockPrependOnceListener = vi.fn(); +const mockBindings = vi.fn().mockReturnValue({}); +const mockSetBindings = vi.fn(); +const mockOff = vi.fn(); + +// Création d'un mock de logger Pino avec toutes les propriétés nécessaires +const mockLogger: Logger & { [key: string]: any } = { + info: mockInfo, + error: mockError, + warn: mockWarn, + child: mockChild, + flush: mockFlush, + isLevelEnabled: mockIsLevelEnabled, + level: 'info', + levels: { values: {}, labels: {} }, + silent: mockSilent, + fatal: vi.fn(), + debug: vi.fn(), + trace: vi.fn(), + version: '1.0.0', // Propriétés nécessaires + useLevelLabels: true, + levelVal: 0, + onChild: vi.fn(), + customLevels: {}, + useOnlyCustomLevels: false, + + // Méthodes d'événements nécessaires pour correspondre à `LoggerExtras` + on: mockOn, + addListener: mockAddListener, + once: mockOnce, + prependListener: mockPrependListener, + removeListener: mockRemoveListener, + emit: mockEmit, + prependOnceListener: mockPrependOnceListener, + bindings: mockBindings, + setBindings: mockSetBindings, + off: mockOff, + removeAllListeners: vi.fn(), + setMaxListeners: vi.fn(), + getMaxListeners: vi.fn(), + listeners: vi.fn(), + rawListeners: vi.fn(), + eventNames: vi.fn(), + listenerCount: vi.fn(), +}; + +// Mock de la fonction `pino` +const pino = vi.fn().mockReturnValue(mockLogger); + +export { + pino as default, + mockAddListener, + mockBindings, + mockChild, + mockEmit, + mockError, + mockFlush, + mockInfo, + mockIsLevelEnabled, + mockLogger, + mockOff, + mockOn, + mockOnce, + mockPrependListener, + mockPrependOnceListener, + mockRemoveListener, + mockSetBindings, + mockSilent, + mockWarn, +}; diff --git a/tests/mocks/winston.mock.ts b/tests/mocks/winston.mock.ts deleted file mode 100644 index 87c3f36..0000000 --- a/tests/mocks/winston.mock.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { vi } from 'vitest'; - -const mockFormat = { - combine: vi.fn().mockReturnThis(), - timestamp: vi.fn().mockReturnThis(), - printf: vi.fn().mockReturnThis(), - colorize: vi.fn().mockReturnThis(), - simple: vi.fn().mockReturnThis(), - json: vi.fn().mockReturnThis(), -}; - -const mockConsoleTransport = vi.fn(); -const mockFileTransport = vi.fn(); - -const mockLogger = { - info: vi.fn(), - error: vi.fn(), - warn: vi.fn(), -}; - -const winston = { - createLogger: vi.fn().mockReturnValue(mockLogger), - format: mockFormat, - transports: { - Console: mockConsoleTransport, - File: mockFileTransport, - }, -}; - -export { winston as default, mockLogger, mockConsoleTransport, mockFileTransport }; diff --git a/tests/mockLogger.test.ts b/tests/unit/mocks/mockLogger.test.ts similarity index 94% rename from tests/mockLogger.test.ts rename to tests/unit/mocks/mockLogger.test.ts index b0616ef..c2ac503 100644 --- a/tests/mockLogger.test.ts +++ b/tests/unit/mocks/mockLogger.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { MockLogger } from './mocks/MockLogger'; +import { MockLogger } from '../../mocks/MockLogger'; describe('MockLogger', () => { it('should log messages in the correct categories', () => { diff --git a/tests/arrayUtils.test.ts b/tests/unit/utils/arrayUtils.test.ts similarity index 95% rename from tests/arrayUtils.test.ts rename to tests/unit/utils/arrayUtils.test.ts index e09b097..4aaff73 100644 --- a/tests/arrayUtils.test.ts +++ b/tests/unit/utils/arrayUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { removeDuplicates, shuffle, unique } from '../src/utils/arrayUtils'; +import { removeDuplicates, shuffle, unique } from '../../../src/utils/arrayUtils'; describe('ArrayUtils', () => { describe('unique', () => { diff --git a/tests/dates/advancedDateUtils.test.ts b/tests/unit/utils/dates/advancedDateUtils.test.ts similarity index 95% rename from tests/dates/advancedDateUtils.test.ts rename to tests/unit/utils/dates/advancedDateUtils.test.ts index 34c6533..b60266c 100644 --- a/tests/dates/advancedDateUtils.test.ts +++ b/tests/unit/utils/dates/advancedDateUtils.test.ts @@ -6,7 +6,7 @@ import { isValidDate, isWeekend, subtractDays, -} from '../../src/utils/dates/advancedDateUtils'; +} from '../../../../src/utils/dates/advancedDateUtils'; describe('Advanced Date Utilities', () => { it('should check if a date is a weekend', () => { diff --git a/tests/dates/dateUtils.test.ts b/tests/unit/utils/dates/dateUtils.test.ts similarity index 93% rename from tests/dates/dateUtils.test.ts rename to tests/unit/utils/dates/dateUtils.test.ts index dd47f2a..01e2a26 100644 --- a/tests/dates/dateUtils.test.ts +++ b/tests/unit/utils/dates/dateUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { formatDate } from '../../src/utils/dates/dateUtils'; +import { formatDate } from '../../../../src/utils/dates/dateUtils'; describe('formatDate', () => { it("should format date in French when locale is 'fr-FR'", () => { diff --git a/tests/dates/differenceUtils.test.ts b/tests/unit/utils/dates/differenceUtils.test.ts similarity index 93% rename from tests/dates/differenceUtils.test.ts rename to tests/unit/utils/dates/differenceUtils.test.ts index 4596453..ebaf1d2 100644 --- a/tests/dates/differenceUtils.test.ts +++ b/tests/unit/utils/dates/differenceUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { dateDifference } from '../../src/utils/dates/differenceUtils'; +import { dateDifference } from '../../../../src/utils/dates/differenceUtils'; describe('DifferenceUtils', () => { it('devrait calculer la différence en jours', () => { diff --git a/tests/dates/formatUtils.test.ts b/tests/unit/utils/dates/formatUtils.test.ts similarity index 98% rename from tests/dates/formatUtils.test.ts rename to tests/unit/utils/dates/formatUtils.test.ts index e13205f..3789874 100644 --- a/tests/dates/formatUtils.test.ts +++ b/tests/unit/utils/dates/formatUtils.test.ts @@ -3,7 +3,7 @@ import { formatDate, formatDateDifference, formatLocalized, -} from '../../src/utils/dates/formatUtils'; +} from '../../../../src/utils/dates/formatUtils'; describe('FormatUtils', () => { describe('formatDate', () => { diff --git a/tests/dates/manipulationUtils.test.ts b/tests/unit/utils/dates/manipulationUtils.test.ts similarity index 95% rename from tests/dates/manipulationUtils.test.ts rename to tests/unit/utils/dates/manipulationUtils.test.ts index 3217f07..cce92df 100644 --- a/tests/dates/manipulationUtils.test.ts +++ b/tests/unit/utils/dates/manipulationUtils.test.ts @@ -4,7 +4,7 @@ import { addMonths, subtractDays, subtractMonths, -} from '../../src/utils/dates/manipulationUtils'; +} from '../../../../src/utils/dates/manipulationUtils'; describe('ManipulationUtils', () => { describe('addDays', () => { diff --git a/tests/dates/rangeUtils.test.ts b/tests/unit/utils/dates/rangeUtils.test.ts similarity index 84% rename from tests/dates/rangeUtils.test.ts rename to tests/unit/utils/dates/rangeUtils.test.ts index 9bec08a..cb69bdc 100644 --- a/tests/dates/rangeUtils.test.ts +++ b/tests/unit/utils/dates/rangeUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { generateDateRange, isDateInRange } from '../../src/utils/dates/rangeUtils'; +import { generateDateRange, isDateInRange } from '../../../../src/utils/dates/rangeUtils'; describe('Range Utilities', () => { it('should check if a date is in range', () => { diff --git a/tests/dates/validationUtils.test.ts b/tests/unit/utils/dates/validationUtils.test.ts similarity index 95% rename from tests/dates/validationUtils.test.ts rename to tests/unit/utils/dates/validationUtils.test.ts index 9c5a011..3d5025a 100644 --- a/tests/dates/validationUtils.test.ts +++ b/tests/unit/utils/dates/validationUtils.test.ts @@ -1,5 +1,9 @@ import { describe, expect, it } from 'vitest'; -import { isPublicHoliday, isValidDate, isWeekend } from '../../src/utils/dates/validationUtils'; +import { + isPublicHoliday, + isValidDate, + isWeekend, +} from '../../../../src/utils/dates/validationUtils'; describe('Validation Utilities', () => { describe('isValidDate', () => { diff --git a/tests/envUtils.test.ts b/tests/unit/utils/envUtils.test.ts similarity index 95% rename from tests/envUtils.test.ts rename to tests/unit/utils/envUtils.test.ts index 7418d2c..94599d5 100644 --- a/tests/envUtils.test.ts +++ b/tests/unit/utils/envUtils.test.ts @@ -1,6 +1,6 @@ // Tests for envUtils import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { getEnv, requireEnv } from '../src/utils/envUtils'; +import { getEnv, requireEnv } from '../../../src/utils/envUtils'; describe('EnvUtils', () => { const originalEnv = process.env; diff --git a/tests/error.test.ts b/tests/unit/utils/error.test.ts similarity index 94% rename from tests/error.test.ts rename to tests/unit/utils/error.test.ts index 6031f5d..d104df3 100644 --- a/tests/error.test.ts +++ b/tests/unit/utils/error.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; -import { CustomError, handleError } from '../src/utils/error'; +import { CustomError, handleError } from '../../../src/utils/error'; describe('CustomError', () => { it('devrait créer une erreur avec un code et un message', () => { diff --git a/tests/fileUtils.test.ts b/tests/unit/utils/fileUtils.test.ts similarity index 80% rename from tests/fileUtils.test.ts rename to tests/unit/utils/fileUtils.test.ts index cd647a1..17cbcd5 100644 --- a/tests/fileUtils.test.ts +++ b/tests/unit/utils/fileUtils.test.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import { expect, test } from 'vitest'; -import { deleteFile, readFile, writeFile } from '../src/utils/fileUtils'; +import { deleteFile, readFile, writeFile } from '../../../src/utils/fileUtils'; test('should write, read, and delete a file', () => { const path = './test.txt'; diff --git a/tests/index.test.ts b/tests/unit/utils/index.test.ts similarity index 94% rename from tests/index.test.ts rename to tests/unit/utils/index.test.ts index fe5b572..02bc69f 100644 --- a/tests/index.test.ts +++ b/tests/unit/utils/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import * as indexExports from '../src/index'; +import * as indexExports from '../../../src/index'; describe('Index exports', () => { it('devrait contenir les exports obligatoires', () => { @@ -21,7 +21,7 @@ describe('Index exports', () => { 'readFile', 'writeFile', 'deleteFile', - 'WinstonLogger', + 'PinoLogger', 'deepClone', 'generateRandomNumber', 'capitalize', diff --git a/tests/unit/utils/logger.test.ts b/tests/unit/utils/logger.test.ts new file mode 100644 index 0000000..54b60f4 --- /dev/null +++ b/tests/unit/utils/logger.test.ts @@ -0,0 +1,102 @@ +import type { Logger as PinoLoggerType } from 'pino'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { PinoLogger } from '../../../src/logging/PinoLogger'; +import type { LogFormatter } from '../../../src/logging/interfaces/LogFormatter'; +import type { LogTransport } from '../../../src/logging/interfaces/LogTransport'; + +// Mock complet de pino.Logger +vi.mock('pino', () => { + const mockLogger: Partial = { + info: vi.fn(), + error: vi.fn(), + warn: vi.fn(), + debug: vi.fn(), + trace: vi.fn(), + fatal: vi.fn(), + silent: vi.fn(), + level: 'info', + }; + + return { + default: vi.fn(() => mockLogger), + }; +}); + +describe('PinoLogger', (): void => { + let mockLoggerInstance: Partial; + const mockTransport: LogTransport = { + send: vi.fn(), + }; + + const mockFormatter: LogFormatter = { + format: (message: unknown): string => `formatted: ${message}`, + }; + + let logger: PinoLogger; + + beforeEach((): void => { + vi.clearAllMocks(); + + // Création du mock complet + mockLoggerInstance = { + info: vi.fn(), + error: vi.fn(), + warn: vi.fn(), + debug: vi.fn(), + trace: vi.fn(), + fatal: vi.fn(), + silent: vi.fn(), + level: 'info', + }; + + // Injecter le mock dans PinoLogger + logger = new PinoLogger(mockTransport, mockFormatter, mockLoggerInstance as PinoLoggerType); + }); + + describe('Logging Methods', (): void => { + it('should log info messages', (): void => { + logger.log('Test info'); + expect(mockLoggerInstance.info).toHaveBeenCalledWith('formatted: Test info'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: Test info'); + }); + + it('should log error messages', (): void => { + logger.error('Test error'); + expect(mockLoggerInstance.error).toHaveBeenCalledWith('formatted: ERROR: Test error'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: ERROR: Test error'); + }); + }); + + describe('Message Formatting', (): void => { + it('should handle null and undefined', (): void => { + logger.log(null); + expect(mockLoggerInstance.info).toHaveBeenCalledWith('formatted: null'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: null'); + + logger.log(undefined); + expect(mockLoggerInstance.info).toHaveBeenCalledWith('formatted: undefined'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: undefined'); + }); + + it('should format objects correctly', (): void => { + logger.log({ key: 'value' }); + expect(mockLoggerInstance.info).toHaveBeenCalledWith('formatted: {"key":"value"}'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: {"key":"value"}'); + }); + + it('should handle circular objects gracefully', (): void => { + const circular: { self?: unknown } = {}; + circular.self = circular; + logger.log(circular); + expect(mockLoggerInstance.info).toHaveBeenCalledWith('formatted: [Circular Object]'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: [Circular Object]'); + }); + + it('should reject invalid types', (): void => { + const invalidInput = (): void => {}; + logger.log(invalidInput); + expect(mockLoggerInstance.info).toHaveBeenCalledWith('formatted: [Invalid Type]'); + expect(mockTransport.send).toHaveBeenCalledWith('formatted: [Invalid Type]'); + }); + }); +}); diff --git a/tests/objectUtils.test.ts b/tests/unit/utils/objectUtils.test.ts similarity index 93% rename from tests/objectUtils.test.ts rename to tests/unit/utils/objectUtils.test.ts index 675f67d..23e6f7a 100644 --- a/tests/objectUtils.test.ts +++ b/tests/unit/utils/objectUtils.test.ts @@ -1,5 +1,10 @@ import { describe, expect, it } from 'vitest'; -import { deepClone, deepMerge, type DeepPartial, mergeObjects } from '../src/utils/objectUtils'; +import { + deepClone, + deepMerge, + type DeepPartial, + mergeObjects, +} from '../../../src/utils/objectUtils'; describe('ObjectUtils', () => { describe('deepMerge', () => { @@ -8,7 +13,7 @@ describe('ObjectUtils', () => { const obj2: DeepPartial = { b: { d: 3 }, e: 4, - }; // Typage explicite ici + }; const merged = deepMerge(obj1, obj2); expect(merged).toEqual({ diff --git a/tests/randomUtils.test.ts b/tests/unit/utils/randomUtils.test.ts similarity index 96% rename from tests/randomUtils.test.ts rename to tests/unit/utils/randomUtils.test.ts index 9043186..9f61c1c 100644 --- a/tests/randomUtils.test.ts +++ b/tests/unit/utils/randomUtils.test.ts @@ -1,6 +1,6 @@ // Tests for randomUtils import { describe, expect, it } from 'vitest'; -import { generateRandomNumber, generateUUID, randomString } from '../src/utils/randomUtils'; +import { generateRandomNumber, generateUUID, randomString } from '../../../src/utils/randomUtils'; describe('randomUtils', () => { it('should generate a random string of specified length', () => { diff --git a/tests/stringUtils.test.ts b/tests/unit/utils/stringUtils.test.ts similarity index 96% rename from tests/stringUtils.test.ts rename to tests/unit/utils/stringUtils.test.ts index ad493f9..917cc98 100644 --- a/tests/stringUtils.test.ts +++ b/tests/unit/utils/stringUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { capitalize, slugify, snakeToCamel } from '../src/utils/stringUtils'; +import { capitalize, slugify, snakeToCamel } from '../../../src/utils/stringUtils'; describe('StringUtils', () => { describe('capitalize', () => { diff --git a/tests/validation/emailUtils.test.ts b/tests/unit/utils/validation/emailUtils.test.ts similarity index 89% rename from tests/validation/emailUtils.test.ts rename to tests/unit/utils/validation/emailUtils.test.ts index 9b45a25..3c7eef9 100644 --- a/tests/validation/emailUtils.test.ts +++ b/tests/unit/utils/validation/emailUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { validateEmail } from '../../src/utils/validation/emailUtils'; +import { validateEmail } from '../../../../src/utils/validation/emailUtils'; describe('EmailUtils', () => { it('devrait valider les adresses email correctes', () => { diff --git a/tests/validation/uuidUtils.test.ts b/tests/unit/utils/validation/uuidUtils.test.ts similarity index 90% rename from tests/validation/uuidUtils.test.ts rename to tests/unit/utils/validation/uuidUtils.test.ts index d172a34..f6a9e54 100644 --- a/tests/validation/uuidUtils.test.ts +++ b/tests/unit/utils/validation/uuidUtils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { validateUUID } from '../../src/utils/validation/uuidUtils'; +import { validateUUID } from '../../../../src/utils/validation/uuidUtils'; describe('UUIDUtils', () => { it('devrait valider les UUIDs corrects', () => {