diff --git a/.env.example b/.env.example index 343989b..be39d82 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ NEXT_PUBLIC_APP_URL=http://localhost:3000 -NEXT_PUBLIC_ERROR_REPORTING_URL= -NEXT_PUBLIC_ERROR_REPORTING_APP_ID= +NEXT_PUBLIC_CONTENT_API_URL= +NEXT_PUBLIC_APP_ID= +NEXT_PUBLIC_SENTINEL_API_URL= diff --git a/.eslintrc.json b/.eslintrc.json index 2fab55d..e03d6a6 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,6 +8,7 @@ "simple-import-sort/exports": "error", "@typescript-eslint/no-unused-vars": "error", "import/no-extraneous-dependencies": "error", - "react/jsx-no-literals": [2, {"noStrings": true, "ignoreProps": true}] + "react/jsx-no-literals": [2, {"noStrings": true, "ignoreProps": true}], + "no-console": "error" } } diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 00479f2..2bfb008 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -10,8 +10,9 @@ jobs: runs-on: ubuntu-latest env: NEXT_PUBLIC_APP_URL: http://localhost:3000 - NEXT_PUBLIC_ERROR_REPORTING_URL: ${{ vars.NEXT_PUBLIC_ERROR_REPORTING_URL }} - NEXT_PUBLIC_ERROR_REPORTING_APP_ID: ${{ vars.NEXT_PUBLIC_ERROR_REPORTING_APP_ID }} + NEXT_PUBLIC_CONTENT_API_URL: ${{ vars.NEXT_PUBLIC_CONTENT_API_URL }} + NEXT_PUBLIC_APP_ID: ${{ vars.NEXT_PUBLIC_APP_ID }} + NEXT_PUBLIC_SENTINEL_API_URL: ${{ vars.NEXT_PUBLIC_SENTINEL_API_URL }} steps: - uses: actions/checkout@v3 - uses: pnpm/action-setup@v2 diff --git a/.nvmrc b/.nvmrc index a79492b..376d262 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.4.0 +v20.7.0 diff --git a/next.config.mjs b/next.config.mjs index f0ed980..b5aa967 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -2,22 +2,30 @@ import './src/env.mjs' /** @type {import('next').NextConfig} */ const nextConfig = { + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: 'api.palladians.xyz' + } + ] + }, async redirects() { return [ { source: '/accounts/:path*', destination: '/mainnet/accounts/:path*', - permanent: true, + permanent: true }, { source: '/staking/:path*', destination: '/mainnet/staking/:path*', - permanent: true, + permanent: true }, { source: '/transactions/:path*', destination: '/mainnet/transactions/:path*', - permanent: true, + permanent: true }, ] }, diff --git a/package.json b/package.json index b1e1395..58772ea 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "minaverse", - "version": "1.0.2", + "version": "1.1.0", "private": true, "packageManager": "pnpm@8.7.0", "scripts": { @@ -19,7 +19,6 @@ "preinstall": "npx only-allow pnpm" }, "dependencies": { - "@formatjs/intl-localematcher": "^0.4.0", "@hookform/resolvers": "^3.2.0", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-alert-dialog": "^1.0.4", @@ -62,12 +61,14 @@ "dayjs": "^1.11.9", "es-cookie": "^1.4.0", "eslint": "8.47.0", - "eslint-config-next": "13.4.18", + "eslint-config-next": "13.5.2", "graphql-request": "^6.1.0", "i18next": "^23.4.6", "lucide-react": "^0.268.0", - "next": "13.4.18", + "match-sorter": "^6.3.1", + "next": "13.5.2", "next-themes": "^0.2.1", + "pocketbase": "^0.18.0", "postcss": "8.4.28", "pupa": "^3.1.0", "rambda": "^8.3.0", @@ -75,22 +76,23 @@ "react-day-picker": "^8.8.0", "react-dom": "18.2.0", "react-hook-form": "^7.45.4", + "reading-time-estimator": "^1.9.0", "server-only": "^0.0.1", + "sharp": "^0.32.6", "swr": "^2.2.1", "tailwind-merge": "^1.14.0", "tailwindcss": "3.3.3", "tailwindcss-animate": "^1.0.6", "typescript": "5.2.2", - "zod": "^3.22.1", + "zod": "^3.22.2", "zustand": "^4.4.1" }, "devDependencies": { - "@next/eslint-plugin-next": "^13.4.19", - "@playwright/test": "^1.37.1", + "@next/eslint-plugin-next": "^13.5.2", + "@playwright/test": "^1.38.1", "@testing-library/react": "^14.0.0", "@total-typescript/ts-reset": "^0.5.1", "@types/jest": "^29.5.4", - "@types/negotiator": "^0.6.1", "@typescript-eslint/eslint-plugin": "^6.4.0", "@typescript-eslint/parser": "^6.4.0", "encoding": "^0.1.13", @@ -99,9 +101,9 @@ "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-simple-import-sort": "^10.0.0", - "happy-dom": "^11.0.2", - "husky": "^8.0.0", - "prettier": "^3.0.2", - "vitest": "^0.34.3" + "happy-dom": "^12.1.6", + "husky": "^8.0.3", + "prettier": "^3.0.3", + "vitest": "^0.34.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03af066..e94abde 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,9 +5,6 @@ settings: excludeLinksFromLockfile: false dependencies: - '@formatjs/intl-localematcher': - specifier: ^0.4.0 - version: 0.4.0 '@hookform/resolvers': specifier: ^3.2.0 version: 3.2.0(react-hook-form@7.45.4) @@ -91,7 +88,7 @@ dependencies: version: 1.0.6(@types/react-dom@18.2.7)(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@t3-oss/env-nextjs': specifier: ^0.6.1 - version: 0.6.1(typescript@5.2.2)(zod@3.22.1) + version: 0.6.1(typescript@5.2.2)(zod@3.22.2) '@tanstack/react-table': specifier: ^8.9.3 version: 8.9.3(react-dom@18.2.0)(react@18.2.0) @@ -135,8 +132,8 @@ dependencies: specifier: 8.47.0 version: 8.47.0 eslint-config-next: - specifier: 13.4.18 - version: 13.4.18(eslint@8.47.0)(typescript@5.2.2) + specifier: 13.5.2 + version: 13.5.2(eslint@8.47.0)(typescript@5.2.2) graphql-request: specifier: ^6.1.0 version: 6.1.0(encoding@0.1.13)(graphql@16.8.0) @@ -146,12 +143,18 @@ dependencies: lucide-react: specifier: ^0.268.0 version: 0.268.0(react@18.2.0) + match-sorter: + specifier: ^6.3.1 + version: 6.3.1 next: - specifier: 13.4.18 - version: 13.4.18(react-dom@18.2.0)(react@18.2.0) + specifier: 13.5.2 + version: 13.5.2(react-dom@18.2.0)(react@18.2.0) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@13.4.18)(react-dom@18.2.0)(react@18.2.0) + version: 0.2.1(next@13.5.2)(react-dom@18.2.0)(react@18.2.0) + pocketbase: + specifier: ^0.18.0 + version: 0.18.0 postcss: specifier: 8.4.28 version: 8.4.28 @@ -173,9 +176,15 @@ dependencies: react-hook-form: specifier: ^7.45.4 version: 7.45.4(react@18.2.0) + reading-time-estimator: + specifier: ^1.9.0 + version: 1.9.0 server-only: specifier: ^0.0.1 version: 0.0.1 + sharp: + specifier: ^0.32.6 + version: 0.32.6 swr: specifier: ^2.2.1 version: 2.2.1(react@18.2.0) @@ -192,19 +201,19 @@ dependencies: specifier: 5.2.2 version: 5.2.2 zod: - specifier: ^3.22.1 - version: 3.22.1 + specifier: ^3.22.2 + version: 3.22.2 zustand: specifier: ^4.4.1 version: 4.4.1(@types/react@18.2.20)(react@18.2.0) devDependencies: '@next/eslint-plugin-next': - specifier: ^13.4.19 - version: 13.4.19 + specifier: ^13.5.2 + version: 13.5.2 '@playwright/test': - specifier: ^1.37.1 - version: 1.37.1 + specifier: ^1.38.1 + version: 1.38.1 '@testing-library/react': specifier: ^14.0.0 version: 14.0.0(react-dom@18.2.0)(react@18.2.0) @@ -214,9 +223,6 @@ devDependencies: '@types/jest': specifier: ^29.5.4 version: 29.5.4 - '@types/negotiator': - specifier: ^0.6.1 - version: 0.6.1 '@typescript-eslint/eslint-plugin': specifier: ^6.4.0 version: 6.4.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0)(typescript@5.2.2) @@ -231,10 +237,10 @@ devDependencies: version: 9.0.0(eslint@8.47.0) eslint-plugin-import: specifier: ^2.28.0 - version: 2.28.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) + version: 2.28.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0) eslint-plugin-prettier: specifier: ^5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.2) + version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.3) eslint-plugin-react: specifier: ^7.33.2 version: 7.33.2(eslint@8.47.0) @@ -242,17 +248,17 @@ devDependencies: specifier: ^10.0.0 version: 10.0.0(eslint@8.47.0) happy-dom: - specifier: ^11.0.2 - version: 11.0.2 + specifier: ^12.1.6 + version: 12.1.6 husky: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^8.0.3 + version: 8.0.3 prettier: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^3.0.3 + version: 3.0.3 vitest: - specifier: ^0.34.3 - version: 0.34.3(happy-dom@11.0.2) + specifier: ^0.34.5 + version: 0.34.5(happy-dom@12.1.6) packages: @@ -576,12 +582,6 @@ packages: resolution: {integrity: sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==} dev: false - /@formatjs/intl-localematcher@0.4.0: - resolution: {integrity: sha512-bRTd+rKomvfdS4QDlVJ6TA/Jx1F2h/TBVO5LjvhQ7QPPHp19oPNMIum7W2CMEReq/zPxpmCeB31F9+5gl/qtvw==} - dependencies: - tslib: 2.6.1 - dev: false - /@graphql-typed-document-node/core@3.2.0(graphql@16.8.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: @@ -691,24 +691,17 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /@next/env@13.4.18: - resolution: {integrity: sha512-ZUG5Y/KSSerggdeD2LIYgiYziKTuSE9oE2RnW8bhNw6WunA8MrVfrWaCDTYSx/UG8qzPpSF+BiZNiHUiALxCdA==} + /@next/env@13.5.2: + resolution: {integrity: sha512-dUseBIQVax+XtdJPzhwww4GetTjlkRSsXeQnisIJWBaHsnxYcN2RGzsPHi58D6qnkATjnhuAtQTJmR1hKYQQPg==} dev: false - /@next/eslint-plugin-next@13.4.18: - resolution: {integrity: sha512-GlOmUjZYYTjKl782mKk5a0bYEmKaouGaxPhi6t9yDILqrppU7JTIyONzLKQPszRXDCVZge0NFd4gwRs1ARZsMg==} + /@next/eslint-plugin-next@13.5.2: + resolution: {integrity: sha512-Ew8DOUerJYGRo8pI84SVwn9wxxx8sH92AanCXSkkLJM2W0RJEWy+BqWSCfrlA/3ZIczEl4l4o4lOeTGBPYfBJg==} dependencies: glob: 7.1.7 - dev: false - - /@next/eslint-plugin-next@13.4.19: - resolution: {integrity: sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==} - dependencies: - glob: 7.1.7 - dev: true - /@next/swc-darwin-arm64@13.4.18: - resolution: {integrity: sha512-d/73jvZe7dNTjLugDsIIy2AdQrwE2dFC9/QRr7yHmFm8mS5EiIHeDKzaqIsv9+JXKD9ZB1i/c0x7+F0PlKo1vQ==} + /@next/swc-darwin-arm64@13.5.2: + resolution: {integrity: sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -716,8 +709,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.4.18: - resolution: {integrity: sha512-PwfvxgxG5rvUJppF02IdVAVx4HTtbZrS/Nz9qHfYfeFOQ9a+PijL8Xr9BJ21jiIS+dPQjwzvpsOdsC+DOrlzhg==} + /@next/swc-darwin-x64@13.5.2: + resolution: {integrity: sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -725,8 +718,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.4.18: - resolution: {integrity: sha512-Nayn6yFeox9wKaRTLaWRvO3DjB8xEM3BnXu7QnQeZb0AgD484XmdxK13TYZW4jdNy3VJ5OyYIpL4mhkgWEVq/A==} + /@next/swc-linux-arm64-gnu@13.5.2: + resolution: {integrity: sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -734,8 +727,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.4.18: - resolution: {integrity: sha512-sQzJ5DFPvGlKjI97R17v2RxKJYYzHw4lJZ4xhK6wvyYJYYcn9JfIMyKCvLtfLgpU1tOUcbkmx7i8XC28sB1BsQ==} + /@next/swc-linux-arm64-musl@13.5.2: + resolution: {integrity: sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -743,8 +736,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.4.18: - resolution: {integrity: sha512-zqCLvGdz+T0V+set8zRHbkl3PQq0quUp5Dtuj1yGw0N9htp3beL1RVyhfSusbgxT82TRTXJe94IREgM8iYq6wg==} + /@next/swc-linux-x64-gnu@13.5.2: + resolution: {integrity: sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -752,8 +745,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.4.18: - resolution: {integrity: sha512-V/+dWy32eo3iiWkro+0M4/vNp1anGrVzNp90teVKG5tl5t5qNGc/qWOgmgTG8JhowdJAxj7+fp+WltrcezqsDA==} + /@next/swc-linux-x64-musl@13.5.2: + resolution: {integrity: sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -761,8 +754,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.4.18: - resolution: {integrity: sha512-anytZjyD1tAgfA/crOrVcUlm0yrSNKYKpg53NQ+Y83nAungrghBthZZiA1/QvmIs1Igu0Rqw/O6hqCOH63o8pw==} + /@next/swc-win32-arm64-msvc@13.5.2: + resolution: {integrity: sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -770,8 +763,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.4.18: - resolution: {integrity: sha512-lgsZDjbU0FQQH2pDSYeKIbVX9g8dqA7fUtgcAcwbj4eEuVW/K41rKFQceMM1kt0ktVUZ4uF2qOHsgebOWpDJIw==} + /@next/swc-win32-ia32-msvc@13.5.2: + resolution: {integrity: sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -779,8 +772,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.4.18: - resolution: {integrity: sha512-cS72bVNqICglP/uEzqNy26lfRH30zf4AbqnnhPhe+UxRg6d+OTtRQpFX7C4xtBP09FKA+MSSflNVkrn2ZfaWrA==} + /@next/swc-win32-x64-msvc@13.5.2: + resolution: {integrity: sha512-LfTHt+hTL8w7F9hnB3H4nRasCzLD/fP+h4/GUVBTxrkMJOnh/7OZ0XbYDKO/uuWwryJS9kZjhxcruBiYwc5UDw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -818,15 +811,12 @@ packages: tslib: 2.6.1 dev: true - /@playwright/test@1.37.1: - resolution: {integrity: sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==} + /@playwright/test@1.38.1: + resolution: {integrity: sha512-NqRp8XMwj3AK+zKLbZShl0r/9wKgzqI/527bkptKXomtuo+dOjU9NdMASQ8DNC9z9zLOMbG53T4eihYr3XR+BQ==} engines: {node: '>=16'} hasBin: true dependencies: - '@types/node': 20.5.0 - playwright-core: 1.37.1 - optionalDependencies: - fsevents: 2.3.2 + playwright: 1.38.1 dev: true /@radix-ui/number@1.0.1: @@ -2211,31 +2201,31 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@swc/helpers@0.5.1: - resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + /@swc/helpers@0.5.2: + resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: tslib: 2.6.1 dev: false - /@t3-oss/env-core@0.6.1(typescript@5.2.2)(zod@3.22.1): + /@t3-oss/env-core@0.6.1(typescript@5.2.2)(zod@3.22.2): resolution: {integrity: sha512-KQD7qEDJtkWIWWmTVjNvk0wnHpkvAQ6CRbUxbWMFNG/fiosBQDQvtRpBNu6USxBscJCoC4z6y7P9MN52/mLOzw==} peerDependencies: typescript: '>=4.7.2' zod: ^3.0.0 dependencies: typescript: 5.2.2 - zod: 3.22.1 + zod: 3.22.2 dev: false - /@t3-oss/env-nextjs@0.6.1(typescript@5.2.2)(zod@3.22.1): + /@t3-oss/env-nextjs@0.6.1(typescript@5.2.2)(zod@3.22.2): resolution: {integrity: sha512-z1dIC++Vxj9kmzX5nSPfcrCSkszy3dTEPC4Ssx7Ap5AqR3c2Qa7S0xf8axn6coy7D/vCXDAAnHYnCMDhtcY3SQ==} peerDependencies: typescript: '>=4.7.2' zod: ^3.0.0 dependencies: - '@t3-oss/env-core': 0.6.1(typescript@5.2.2)(zod@3.22.1) + '@t3-oss/env-core': 0.6.1(typescript@5.2.2)(zod@3.22.2) typescript: 5.2.2 - zod: 3.22.1 + zod: 3.22.2 dev: false /@tanstack/react-table@8.9.3(react-dom@18.2.0)(react@18.2.0): @@ -2394,10 +2384,6 @@ packages: /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - /@types/negotiator@0.6.1: - resolution: {integrity: sha512-c4mvXFByghezQ/eVGN5HvH/jI63vm3B7FiE81BUzDAWmuiohRecCO6ddU60dfq29oKUMiQujsoB2h0JQC7JHKA==} - dev: true - /@types/node@20.5.0: resolution: {integrity: sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==} @@ -2563,38 +2549,38 @@ packages: '@typescript-eslint/types': 6.4.0 eslint-visitor-keys: 3.4.3 - /@vitest/expect@0.34.3: - resolution: {integrity: sha512-F8MTXZUYRBVsYL1uoIft1HHWhwDbSzwAU9Zgh8S6WFC3YgVb4AnFV2GXO3P5Em8FjEYaZtTnQYoNwwBrlOMXgg==} + /@vitest/expect@0.34.5: + resolution: {integrity: sha512-/3RBIV9XEH+nRpRMqDJBufKIOQaYUH2X6bt0rKSCW0MfKhXFLYsR5ivHifeajRSTsln0FwJbitxLKHSQz/Xwkw==} dependencies: - '@vitest/spy': 0.34.3 - '@vitest/utils': 0.34.3 + '@vitest/spy': 0.34.5 + '@vitest/utils': 0.34.5 chai: 4.3.8 dev: true - /@vitest/runner@0.34.3: - resolution: {integrity: sha512-lYNq7N3vR57VMKMPLVvmJoiN4bqwzZ1euTW+XXYH5kzr3W/+xQG3b41xJn9ChJ3AhYOSoweu974S1V3qDcFESA==} + /@vitest/runner@0.34.5: + resolution: {integrity: sha512-RDEE3ViVvl7jFSCbnBRyYuu23XxmvRTSZWW6W4M7eC5dOsK75d5LIf6uhE5Fqf809DQ1+9ICZZNxhIolWHU4og==} dependencies: - '@vitest/utils': 0.34.3 + '@vitest/utils': 0.34.5 p-limit: 4.0.0 pathe: 1.1.1 dev: true - /@vitest/snapshot@0.34.3: - resolution: {integrity: sha512-QyPaE15DQwbnIBp/yNJ8lbvXTZxS00kRly0kfFgAD5EYmCbYcA+1EEyRalc93M0gosL/xHeg3lKAClIXYpmUiQ==} + /@vitest/snapshot@0.34.5: + resolution: {integrity: sha512-+ikwSbhu6z2yOdtKmk/aeoDZ9QPm2g/ZO5rXT58RR9Vmu/kB2MamyDSx77dctqdZfP3Diqv4mbc/yw2kPT8rmA==} dependencies: magic-string: 0.30.3 pathe: 1.1.1 pretty-format: 29.6.3 dev: true - /@vitest/spy@0.34.3: - resolution: {integrity: sha512-N1V0RFQ6AI7CPgzBq9kzjRdPIgThC340DGjdKdPSE8r86aUSmeliTUgkTqLSgtEwWWsGfBQ+UetZWhK0BgJmkQ==} + /@vitest/spy@0.34.5: + resolution: {integrity: sha512-epsicsfhvBjRjCMOC/3k00mP/TBGQy8/P0DxOFiWyLt55gnZ99dqCfCiAsKO17BWVjn4eZRIjKvcqNmSz8gvmg==} dependencies: tinyspy: 2.1.1 dev: true - /@vitest/utils@0.34.3: - resolution: {integrity: sha512-kiSnzLG6m/tiT0XEl4U2H8JDBjFtwVlaE8I3QfGiMFR0QvnRDfYfdP3YvTBWM/6iJDAyaPY6yVQiCTUc7ZzTHA==} + /@vitest/utils@0.34.5: + resolution: {integrity: sha512-ur6CmmYQoeHMwmGb0v+qwkwN3yopZuZyf4xt1DBBSGBed8Hf9Gmbm/5dEWqgpLPdRx6Av6jcWXrjcKfkTzg/pw==} dependencies: diff-sequences: 29.6.3 loupe: 2.3.6 @@ -2798,9 +2784,17 @@ packages: dequal: 2.0.3 dev: false + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} @@ -2811,6 +2805,14 @@ packages: engines: {node: '>=8'} dev: false + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -2841,6 +2843,13 @@ packages: update-browserslist-db: 1.0.11(browserslist@4.21.10) dev: false + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -2891,7 +2900,7 @@ packages: assertion-error: 1.1.0 check-error: 1.0.2 deep-eql: 4.1.3 - get-func-name: 2.0.0 + get-func-name: 2.0.2 loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 @@ -2932,6 +2941,10 @@ packages: fsevents: 2.3.2 dev: false + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /ci-info@3.8.0: resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} @@ -2989,6 +3002,21 @@ 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==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /command-score@0.1.2: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false @@ -3145,6 +3173,13 @@ packages: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} dev: false + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} @@ -3175,6 +3210,11 @@ packages: which-typed-array: 1.1.11 dev: true + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3213,6 +3253,11 @@ packages: engines: {node: '>=6'} dev: false + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -3278,6 +3323,12 @@ packages: dependencies: iconv-lite: 0.6.3 + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} engines: {node: '>=10.13.0'} @@ -3445,8 +3496,8 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /eslint-config-next@13.4.18(eslint@8.47.0)(typescript@5.2.2): - resolution: {integrity: sha512-G15CYbsIHwV6Fzoly5SXo/Mj3pNqNkOzbf+wQcPod3LgVNviWVYlb9czjdiREXHq2VF6oV79Kv0Wunguj6RMEw==} + /eslint-config-next@13.5.2(eslint@8.47.0)(typescript@5.2.2): + resolution: {integrity: sha512-kCF7k7fHBtFtxfP6J6AP6Mo0vW3CrFeoIuoZ7NHGIvLFc/RUaIspJ6inO/R33zE1o9t/lbJgTnsqnRB++sxCUQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -3454,13 +3505,13 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.4.18 + '@next/eslint-plugin-next': 13.5.2 '@rushstack/eslint-patch': 1.3.3 '@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.2.2) eslint: 8.47.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.0)(eslint@8.47.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.47.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@8.47.0) eslint-plugin-react: 7.33.2(eslint@8.47.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.47.0) @@ -3488,7 +3539,7 @@ packages: transitivePeerDependencies: - supports-color - /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.0)(eslint@8.47.0): + /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.47.0): resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3499,7 +3550,7 @@ packages: enhanced-resolve: 5.15.0 eslint: 8.47.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) - eslint-plugin-import: 2.28.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) fast-glob: 3.3.1 get-tsconfig: 4.7.0 is-core-module: 2.13.0 @@ -3535,11 +3586,11 @@ packages: debug: 3.2.7 eslint: 8.47.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.0)(eslint@8.47.0) + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.47.0) transitivePeerDependencies: - supports-color - /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0): + /eslint-plugin-import@2.28.0(@typescript-eslint/parser@6.4.0)(eslint@8.47.0): resolution: {integrity: sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==} engines: {node: '>=4'} peerDependencies: @@ -3573,6 +3624,41 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: true + + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.4.0(eslint@8.47.0)(typescript@5.2.2) + array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.2 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.4.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.47.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.0 + object.values: 1.1.6 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color /eslint-plugin-jsx-a11y@6.7.1(eslint@8.47.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} @@ -3599,7 +3685,7 @@ packages: semver: 6.3.1 dev: false - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.2): + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.3): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3615,7 +3701,7 @@ packages: dependencies: eslint: 8.47.0 eslint-config-prettier: 9.0.0(eslint@8.47.0) - prettier: 3.0.2 + prettier: 3.0.3 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 dev: true @@ -3779,6 +3865,11 @@ packages: strip-final-newline: 3.0.0 dev: true + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + /expect@29.6.4: resolution: {integrity: sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3802,6 +3893,10 @@ packages: engines: {node: '>=6.0.0'} dev: false + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -3861,6 +3956,10 @@ packages: resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} dev: false + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3886,8 +3985,8 @@ packages: /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true /get-intrinsic@1.2.1: @@ -3920,6 +4019,10 @@ packages: dependencies: resolve-pkg-maps: 1.0.0 + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -4018,8 +4121,8 @@ packages: engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} dev: false - /happy-dom@11.0.2: - resolution: {integrity: sha512-0yyYIBCByZVgWNuM+/tXXaAR+YUjsoXmzDisQ/KPI7Dt9kXtsPUOU6JAc/isVxridmeSb9/icthsaAhUBKJa4g==} + /happy-dom@12.1.6: + resolution: {integrity: sha512-5ul/0itJ6HJszSJAc9NbwTrTAY1wwEqxS92zUb8j+FBA62g0BplpBA1xjox1gecvCRw16lUfZo4fjVL0P2h6Cg==} dependencies: css.escape: 1.5.1 entities: 4.5.0 @@ -4076,8 +4179,8 @@ packages: engines: {node: '>=14.18.0'} dev: true - /husky@8.0.0: - resolution: {integrity: sha512-4qbE/5dzNDNxFEkX9MNRPKl5+omTXQzdILCUWiqG/lWIAioiM5vln265/l6I2Zx8gpW8l1ukZwGQeCFbBZ6+6w==} + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} hasBin: true dev: true @@ -4094,6 +4197,10 @@ packages: dependencies: safer-buffer: 2.1.2 + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} @@ -4118,6 +4225,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -4152,6 +4263,10 @@ packages: get-intrinsic: 1.2.1 is-typed-array: 1.1.12 + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} @@ -4477,7 +4592,7 @@ packages: /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lru-cache@6.0.0: @@ -4506,6 +4621,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /match-sorter@6.3.1: + resolution: {integrity: sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==} + dependencies: + '@babel/runtime': 7.22.10 + remove-accents: 0.4.2 + dev: false + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true @@ -4531,6 +4653,11 @@ packages: engines: {node: '>=12'} dev: true + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -4539,6 +4666,10 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + /mlly@1.4.2: resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} dependencies: @@ -4567,24 +4698,28 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /next-themes@0.2.1(next@13.4.18)(react-dom@18.2.0)(react@18.2.0): + /next-themes@0.2.1(next@13.5.2)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 13.4.18(react-dom@18.2.0)(react@18.2.0) + next: 13.5.2(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /next@13.4.18(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-V/IIFA/znYYnOFlZQegrlhlWRpyIuCLXLGuH6pzCjwyxThNBZl4ItqoE3ffUyYY9f0X6XIQ2dX6UUBpNVSKZ8A==} - engines: {node: '>=16.8.0'} + /next@13.5.2(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-vog4UhUaMYAzeqfiAAmgB/QWLW7p01/sg+2vn6bqc/CxHFYizMzLv6gjxKzl31EVFkfl/F+GbxlKizlkTE9RdA==} + engines: {node: '>=16.14.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -4597,8 +4732,8 @@ packages: sass: optional: true dependencies: - '@next/env': 13.4.18 - '@swc/helpers': 0.5.1 + '@next/env': 13.5.2 + '@swc/helpers': 0.5.2 busboy: 1.6.0 caniuse-lite: 1.0.30001521 postcss: 8.4.14 @@ -4608,20 +4743,31 @@ packages: watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - '@next/swc-darwin-arm64': 13.4.18 - '@next/swc-darwin-x64': 13.4.18 - '@next/swc-linux-arm64-gnu': 13.4.18 - '@next/swc-linux-arm64-musl': 13.4.18 - '@next/swc-linux-x64-gnu': 13.4.18 - '@next/swc-linux-x64-musl': 13.4.18 - '@next/swc-win32-arm64-msvc': 13.4.18 - '@next/swc-win32-ia32-msvc': 13.4.18 - '@next/swc-win32-x64-msvc': 13.4.18 + '@next/swc-darwin-arm64': 13.5.2 + '@next/swc-darwin-x64': 13.5.2 + '@next/swc-linux-arm64-gnu': 13.5.2 + '@next/swc-linux-arm64-musl': 13.5.2 + '@next/swc-linux-x64-gnu': 13.5.2 + '@next/swc-linux-x64-musl': 13.5.2 + '@next/swc-win32-arm64-msvc': 13.5.2 + '@next/swc-win32-ia32-msvc': 13.5.2 + '@next/swc-win32-x64-msvc': 13.5.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros dev: false + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + /node-fetch@2.6.13(encoding@0.1.13): resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==} engines: {node: 4.x || >=6.0.0} @@ -4856,12 +5002,26 @@ packages: pathe: 1.1.1 dev: true - /playwright-core@1.37.1: - resolution: {integrity: sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==} + /playwright-core@1.38.1: + resolution: {integrity: sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg==} engines: {node: '>=16'} hasBin: true dev: true + /playwright@1.38.1: + resolution: {integrity: sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow==} + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: 1.38.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /pocketbase@0.18.0: + resolution: {integrity: sha512-09ri0Rnm4JjboU4OJeibd6pgvKi4DPg/r/Uu/QI3mKSZsrROoMT75zyiOldbBBMWZUDG1TRlv6BjQj30SFsrVw==} + dev: false + /postcss-import@15.1.0(postcss@8.4.28): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -4944,6 +5104,25 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4955,8 +5134,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@3.0.2: - resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} + /prettier@3.0.3: + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} engines: {node: '>=14'} hasBin: true dev: true @@ -4986,6 +5165,13 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} @@ -5000,10 +5186,24 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + /rambda@8.3.0: resolution: {integrity: sha512-XN5B8zIB6efO9Y9SrzdLQyk6XX3U7OyWESIvNYnm7AH8KCbXBtzsUVFaJYpUcIx5VahmvNV7fNjevR/ohc90jw==} dev: false + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + /react-day-picker@8.8.0(date-fns@2.30.0)(react@18.2.0): resolution: {integrity: sha512-QIC3uOuyGGbtypbd5QEggsCSqVaPNu8kzUWquZ7JjW9fuWB9yv7WyixKmnaFelTLXFdq7h7zU6n/aBleBqe/dA==} peerDependencies: @@ -5183,6 +5383,15 @@ packages: pify: 2.3.0 dev: false + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -5190,6 +5399,10 @@ packages: picomatch: 2.3.1 dev: false + /reading-time-estimator@1.9.0: + resolution: {integrity: sha512-fVuTlAfcYXE9A4KrTOq0Ao4vn9vJxYVFpATjS6KFA5xCK5RTmq6q74ICrO7ykF3Mg2XTgL9mBrwADgXQgEolIw==} + dev: false + /recharts-scale@0.4.5: resolution: {integrity: sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==} dependencies: @@ -5247,6 +5460,10 @@ packages: define-properties: 1.2.0 functions-have-names: 1.2.3 + /remove-accents@0.4.2: + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} + dev: false + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5309,6 +5526,10 @@ packages: has-symbols: 1.0.3 isarray: 2.0.5 + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: @@ -5339,6 +5560,21 @@ packages: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} dev: false + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -5364,6 +5600,24 @@ packages: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5399,6 +5653,13 @@ packages: engines: {node: '>=10.0.0'} dev: false + /streamx@2.15.1: + resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + /string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: @@ -5433,6 +5694,12 @@ packages: define-properties: 1.2.0 es-abstract: 1.22.1 + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5453,6 +5720,11 @@ packages: engines: {node: '>=12'} dev: true + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -5580,6 +5852,42 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.1 + dev: false + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -5648,6 +5956,12 @@ packages: /tslib@2.6.1: resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -5797,8 +6111,8 @@ packages: d3-timer: 3.0.1 dev: false - /vite-node@0.34.3(@types/node@20.5.0): - resolution: {integrity: sha512-+0TzJf1g0tYXj6tR2vEyiA42OPq68QkRZCu/ERSo2PtsDJfBpDyEfuKbRvLmZqi/CgC7SCBtyC+WjTGNMRIaig==} + /vite-node@0.34.5(@types/node@20.5.0): + resolution: {integrity: sha512-RNZ+DwbCvDoI5CbCSQSyRyzDTfFvFauvMs6Yq4ObJROKlIKuat1KgSX/Ako5rlDMfVCyMcpMRMTkJBxd6z8YRA==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: @@ -5855,8 +6169,8 @@ packages: fsevents: 2.3.2 dev: true - /vitest@0.34.3(happy-dom@11.0.2): - resolution: {integrity: sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==} + /vitest@0.34.5(happy-dom@12.1.6): + resolution: {integrity: sha512-CPI68mmnr2DThSB3frSuE5RLm9wo5wU4fbDrDwWQQB1CWgq9jQVoQwnQSzYAjdoBOPoH2UtXpOgHVge/uScfZg==} engines: {node: '>=v14.18.0'} hasBin: true peerDependencies: @@ -5889,17 +6203,17 @@ packages: '@types/chai': 4.3.6 '@types/chai-subset': 1.3.3 '@types/node': 20.5.0 - '@vitest/expect': 0.34.3 - '@vitest/runner': 0.34.3 - '@vitest/snapshot': 0.34.3 - '@vitest/spy': 0.34.3 - '@vitest/utils': 0.34.3 + '@vitest/expect': 0.34.5 + '@vitest/runner': 0.34.5 + '@vitest/snapshot': 0.34.5 + '@vitest/spy': 0.34.5 + '@vitest/utils': 0.34.5 acorn: 8.10.0 acorn-walk: 8.2.0 cac: 6.7.14 chai: 4.3.8 debug: 4.3.4 - happy-dom: 11.0.2 + happy-dom: 12.1.6 local-pkg: 0.4.3 magic-string: 0.30.3 pathe: 1.1.1 @@ -5909,7 +6223,7 @@ packages: tinybench: 2.5.0 tinypool: 0.7.0 vite: 4.4.9(@types/node@20.5.0) - vite-node: 0.34.3(@types/node@20.5.0) + vite-node: 0.34.5(@types/node@20.5.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -6041,8 +6355,8 @@ packages: resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false - /zod@3.22.1: - resolution: {integrity: sha512-+qUhAMl414+Elh+fRNtpU+byrwjDFOS1N7NioLY+tSlcADTx4TkCUua/hxJvxwDXcV4397/nZ420jy4n4+3WUg==} + /zod@3.22.2: + resolution: {integrity: sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==} dev: false /zustand@4.4.1(@types/react@18.2.20)(react@18.2.0): diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..deb9e34 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,9 @@ +# * +User-agent: * +Allow: / + +# Host +Host: https://minaverse.xyz + +# Sitemaps +Sitemap: https://minaverse.xyz/sitemap.xml diff --git a/src/app/[network]/accounts/[publicKey]/page.tsx b/src/app/[network]/accounts/[publicKey]/page.tsx index 7b63984..d19bd42 100644 --- a/src/app/[network]/accounts/[publicKey]/page.tsx +++ b/src/app/[network]/accounts/[publicKey]/page.tsx @@ -1,9 +1,12 @@ import { Metadata } from 'next' import { AccountDetails } from '@/components/accounts/account-details' +import { AccountReportDialog } from '@/components/accounts/account-report-dialog' +import { AccountSuspiciousAlert } from '@/components/accounts/account-suspicious-alert' import { AccountTransactions } from '@/components/accounts/account-transactions' import { fetchAccount } from '@/data/accounts' import { Network } from '@/data/api' +import { fetchRestrictions } from '@/data/restrictions' import { getLocale, getT } from '@/lib/i18n/server' export const generateMetadata = async ({ @@ -27,9 +30,22 @@ const AccountPage = async ({ publicKey: params.publicKey, network: params.network as Network }) + const restrictions = await fetchRestrictions({ + publicKey: params.publicKey + }) return (
-

{t('accounts.accountOverview')}

+
+

{t('accounts.accountOverview')}

+ +
+ {restrictions.items.length > 0 && ( + + )} 0) { + return NextResponse.json({ + found: true, + type: 'accounts', + id: accounts.data[0].public_key + }) + } + const transactions = await fetchTransactions({ + length: 1, + start: 0, + search: query, + network + }) + if (transactions.data.length > 0) { + return NextResponse.json({ + found: true, + type: 'transactions', + id: transactions.data[0].hash + }) + } + return NextResponse.json({ found: false, query }) +} diff --git a/src/app/blog/[slug]/page.tsx b/src/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..7a124df --- /dev/null +++ b/src/app/blog/[slug]/page.tsx @@ -0,0 +1,65 @@ +import { Metadata } from 'next' +import NextImage from 'next/image' + +import { PostMeta } from '@/components/blog/post-meta' +import { AspectRatio } from '@/components/ui/aspect-ratio' +import { pocketbase } from '@/lib/pocketbase' +import { ApiPost } from '@/types' + +import styles from './styles.module.css' + +export const generateMetadata = async ({ + params +}: { + params: { slug: string } +}): Promise => { + const post: ApiPost = await pocketbase + .collection('blog_posts') + .getFirstListItem(`slug="${params.slug}"`, { + expand: 'author', + requestKey: null + }) + return { + title: `${post.title} - Minaverse Blog`, + description: post.excerpt, + openGraph: { + images: pocketbase.files.getUrl(post, post.coverImage), + description: post.excerpt + } + } +} + +interface BlogPostPageProps { + params: { slug: string } +} + +const BlogPostPage = async ({ params }: BlogPostPageProps) => { + const post: ApiPost = await pocketbase + .collection('blog_posts') + .getFirstListItem(`slug="${params.slug}"`, { + expand: 'author', + requestKey: null + }) + const highlightCoverImage = pocketbase.files.getUrl(post, post.coverImage) + return ( +
+ + + +

{post.title}

+ +
+
+ ) +} + +export default BlogPostPage diff --git a/src/app/blog/[slug]/styles.module.css b/src/app/blog/[slug]/styles.module.css new file mode 100644 index 0000000..628fabd --- /dev/null +++ b/src/app/blog/[slug]/styles.module.css @@ -0,0 +1,37 @@ +.article { + display: flex; + flex-direction: column; + gap: 1rem; + font-size: 17.6px; + line-height: 1.75; + font-weight: 300; +} + +.article strong { + font-weight: 500; +} + +.article h2 { + font-size: 1.75rem; + font-weight: 600; +} + +.article h3 { + font-size: 1.5rem; + font-weight: 600; +} + +.article h4 { + font-size: 1.25rem; + font-weight: 600; +} + +.article ul { + list-style: disc !important; + padding-left: 1.5rem; +} + +.article ol { + list-style: auto !important; + padding-left: 1.125rem; +} diff --git a/src/app/blog/page.tsx b/src/app/blog/page.tsx new file mode 100644 index 0000000..245fe07 --- /dev/null +++ b/src/app/blog/page.tsx @@ -0,0 +1,48 @@ +import { Metadata } from 'next' +import NextLink from 'next/link' + +import { BlogCard } from '@/components/blog/blog-card' +import { HighlightCard } from '@/components/blog/highlight-card' +import { getT } from '@/lib/i18n/server' +import { titleTemplate } from '@/lib/metadata' +import { pocketbase } from '@/lib/pocketbase' +import { ApiPost } from '@/types' + +export const generateMetadata = async (): Promise => { + const t = await getT() + return { + title: titleTemplate(t('common.blog')) + } +} + +const BlogPage = async () => { + const t = await getT() + const posts: ApiPost[] = await pocketbase + .collection('blog_posts') + .getFullList({ + expand: 'author', + sort: '-publishedAt', + filter: 'published = true', + requestKey: null + }) + const [highlight, ...restOfPosts] = posts + return ( +
+

+ {t('common.blog')} +

+ + + +
+ {restOfPosts?.map((post) => ( + + + + ))} +
+
+ ) +} + +export default BlogPage diff --git a/src/app/error.tsx b/src/app/error.tsx index ce48f6a..a7757b2 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -1,20 +1,24 @@ 'use client' -import { useEffect } from 'react' - import { reportError } from '@/data/error' import { useTranslation } from '@/lib/i18n/client' +import { useAppStore } from '@/store/app' const Error = ({ error, reset }: { error: Error; reset: () => void }) => { const { t } = useTranslation() - useEffect(() => { - reportError(error) - }, [error]) + const locale = useAppStore((state) => state.locale) || 'en' + const network = useAppStore((state) => state.network) || 'mainnet' + const tryAgain = async () => { + await reportError({ payload: error, context: { locale, network } }) + return reset() + } return (
-

{t('somethingWentWrong')}

- +

+ {t('common.somethingWentWrong')} +

+
) } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 2a89f5a..0c3dd0c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -24,8 +24,13 @@ export const metadata: Metadata = { title: 'Minaverse', description: 'The truly open Mina Explorer. Get insight into the Mina Protocol.', + keywords: + 'Mina, Blockchain, Explorer, Mina Protocol, Mina Price, Price of Mina, Mina Explorer, Market Cap, Mina Market Cap, zkApps, zkProofs, Succinct Blockchain', manifest: '/manifest.json', - themeColor: '#1e3a8a' + themeColor: '#1e3a8a', + openGraph: { + images: 'https://minaverse.xyz/og.jpg' + } } export default function RootLayout({ @@ -50,14 +55,9 @@ export default function RootLayout({ data-ackee-server="https://ackee.sh.palladians.xyz" data-ackee-domain-id="a9e7a3ac-8c7c-4f25-91b8-34975a33b9e7" /> - - - - - -
+
}> @@ -74,18 +74,18 @@ export default function RootLayout({ }> -
{children}
+
+ {children} +
}>
}> - }> - -
+ ) diff --git a/src/app/page.tsx b/src/app/page.tsx index d264265..880ec28 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,13 +1,18 @@ import { Metadata } from 'next' import React from 'react' +import { MyAccounts } from '@/components/dashboard/my-accounts' import { QuickStats } from '@/components/dashboard/quick-stats' import { SummaryOverview } from '@/components/dashboard/summary-overview' import { fetchCoinData } from '@/data/coin' import { getLocale, getT } from '@/lib/i18n/server' +import { titleTemplate } from '@/lib/metadata' -export const metadata: Metadata = { - title: 'The universe of Mina Protocol - Minaverse' +export const generateMetadata = async (): Promise => { + const t = await getT() + return { + title: titleTemplate(t('common.title')) + } } const HomePage = async () => { @@ -26,6 +31,7 @@ const HomePage = async () => { marketCaps={coinData.marketCaps} locale={locale} /> +
) diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts new file mode 100644 index 0000000..a933e5c --- /dev/null +++ b/src/app/sitemap.ts @@ -0,0 +1,90 @@ +import { MetadataRoute } from 'next' + +import { fetchAccounts } from '@/data/accounts' +import { Network } from '@/data/api' +import { fetchStaking } from '@/data/staking' +import { env } from '@/env.mjs' +import { pocketbase } from '@/lib/pocketbase' +import { ApiPost } from '@/types' + +const APP_URL = env.NEXT_PUBLIC_APP_URL + +const networks = [Network.MAINNET, Network.DEVNET, Network.BERKELEY] + +const getAccountsRoutes = ({ + network, + accountIds +}: { + network: Network + accountIds: string[] +}) => + accountIds.map((id) => ({ + url: `${APP_URL}/${network}/accounts/${id}`, + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8 + })) + +const getNetworkRoutes = async (network: Network) => { + const { data: stakePools } = await fetchStaking({ search: null, network }) + const { data: accounts } = await fetchAccounts({ search: null, network }) + return [ + { + url: `${APP_URL}/${network}/accounts`, + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8 + }, + ...getAccountsRoutes({ + accountIds: accounts.map(({ public_key }) => public_key), + network + }), + { + url: `${APP_URL}/${network}/transactions`, + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8 + }, + { + url: `${APP_URL}/${network}/staking`, + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 0.8 + }, + ...getAccountsRoutes({ + accountIds: stakePools.map(({ _id }) => _id.delegate), + network + }) + ] +} + +export default async function sitemap(): Promise { + const routes = (await Promise.all( + networks.map(async (network) => await getNetworkRoutes(network)) + )) as MetadataRoute.Sitemap[] + const postsRaw: ApiPost[] = await pocketbase + .collection('blog_posts') + .getFullList({ + sort: '-publishedAt', + filter: 'published = true', + requestKey: null + }) + const posts = postsRaw.map((post) => ({ + url: `${APP_URL}/blog/${post.slug}`, + lastModified: new Date(), + changeFrequency: 'weekly' as never, + priority: 0.8 + })) + return [ + { + url: APP_URL, + lastModified: new Date(), + changeFrequency: 'weekly', + priority: 1 + }, + ...posts, + ...routes.flat() + ] +} + +export const runtime = 'edge' diff --git a/src/components/accounts/account-report-dialog.tsx b/src/components/accounts/account-report-dialog.tsx new file mode 100644 index 0000000..9d2aabe --- /dev/null +++ b/src/components/accounts/account-report-dialog.tsx @@ -0,0 +1,105 @@ +'use client' + +import { type FormEvent, useState } from 'react' +import { z } from 'zod' + +import { Button } from '@/components/ui/button' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger +} from '@/components/ui/dialog' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Textarea } from '@/components/ui/textarea' +import { useToast } from '@/components/ui/use-toast' +import { useTranslation } from '@/lib/i18n/client' +import { SentinelCollections, sentinelPocketbase } from '@/lib/pocketbase' + +interface AccountReportDialogProps { + publicKey: string +} + +interface ReportBody { + publicKey: string + description: string + attachment?: File +} + +const AllowedFileTypes = ['application/pdf', 'image/jpeg', 'image/png'] +const Megabyte = Math.pow(1024, 2) + +const FormSchema = z.object({ + reason: z.string().trim().min(3).max(256), + evidence: z.instanceof(File) +}) + +export const AccountReportDialog = ({ + publicKey +}: AccountReportDialogProps) => { + const [open, setOpen] = useState(false) + const { t } = useTranslation() + const { toast } = useToast() + const handleSubmit = async (event: FormEvent) => { + event.preventDefault() + const formData = new FormData(event.currentTarget) + const validation = FormSchema.safeParse(Object.fromEntries(formData)) + if (!validation.success) return // invalid form + const { reason, evidence } = validation.data + const reportBody: ReportBody = { publicKey, description: reason } + if (evidence.size) { + if (evidence.size > Megabyte) return // invalid file size + if (!AllowedFileTypes.includes(evidence.type)) return // invalid file type + reportBody.attachment = evidence + } + await sentinelPocketbase + .collection(SentinelCollections.reports) + .create(reportBody) + .then(() => { + setOpen(false) + toast({ description: t('accountReport.toast') }) + }) + } + return ( + + + + + + + {t('accountReport.title')} + +
+
+ +