diff --git a/.eslintignore b/.eslintignore index 9246fa5..9780a83 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,4 +7,6 @@ readme.md Dockerfile .vscode .swc -.github \ No newline at end of file +.github +.eslintrc.js +node_modules \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..e0b0fb0 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,44 @@ +module.exports = { + root: true, + env: { browser: true, node: true, jest: true }, + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 2022, sourceType: 'module', project: './tsconfig.json' }, + globals: { React: true, NodeJS: true }, + plugins: [ + '@typescript-eslint', + 'react', + 'jest', + 'jest-dom', + 'testing-library', + 'import', + 'prettier', + ], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:@typescript-eslint/strict', + 'plugin:react/recommended', + 'plugin:jest/recommended', + 'plugin:jest-dom/recommended', + 'plugin:testing-library/react', + 'plugin:import/recommended', + 'plugin:prettier/recommended', + 'plugin:@next/next/recommended', + 'prettier', + ], + rules: { + 'prettier/prettier': ['error', { printWidth: 100 }], + 'import/order': ['error', { groups: ['builtin', 'external', 'internal'] }], + 'no-restricted-imports': ['warn', { patterns: ['../../*'] }], + 'react/react-in-jsx-scope': 'off', + 'testing-library/no-container': 'warn', + 'testing-library/no-node-access': 'warn', + '@typescript-eslint/promise-function-async': 'error', + '@typescript-eslint/consistent-type-assertions': 'error', + '@typescript-eslint/naming-convention': 'off', + }, + settings: { + 'import/resolver': { typescript: { project: './tsconfig.json' }, node: true }, + react: { version: 'detect' }, + }, +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 3722418..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["next/core-web-vitals", "next/typescript"] -} diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 3e775ef..0000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -auto-install-peers=true diff --git a/.vscode/settings.json b/.vscode/settings.json index 30bd786..e4c8837 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,17 +7,8 @@ "vsicons.dontShowNewVersionMessage": true, "typescript.updateImportsOnFileMove.enabled": "always", "javascript.updateImportsOnFileMove.enabled": "always", - "makefile.configureOnOpen": true, "liveServer.settings.donotShowInfoMsg": true, "editor.formatOnSave": true, - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "always" - }, - "eslint.validate": [ - "javascript", - "javascriptreact", - "typescript", - "typescriptreact" - ], - "discord.enabled": true + "editor.codeActionsOnSave": { "source.fixAll.eslint": "always" }, + "eslint.validate": ["javascript", "javascriptreact", "typescript", "typescriptreact"] } diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index e356bfa..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,57 +0,0 @@ -import pluginJs from '@eslint/js'; -import { configs as tseslint } from 'typescript-eslint'; -import pluginReact from 'eslint-plugin-react'; -import pluginJest from 'eslint-plugin-jest'; -import pluginJestDom from 'eslint-plugin-jest-dom'; -import pluginTest from 'eslint-plugin-testing-library'; -import pluginPrettier from 'eslint-plugin-prettier/recommended'; -import configPrettier from 'eslint-config-prettier'; -import pluginImport from 'eslint-plugin-import'; - -/** @type {import('eslint').Linter.Config[]} */ -export default [ - { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] }, - { - languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - React: true, - NodeJS: true, - }, - }, - }, - ...tseslint.strict, - ...tseslint.recommended, - pluginJs.configs.recommended, - pluginReact.configs.flat.recommended, - pluginJest.configs['flat/recommended'], - pluginJestDom.configs['flat/recommended'], - pluginTest.configs['flat/react'], - pluginPrettier, - configPrettier, - pluginImport.flatConfigs.recommended, - { - rules: { - 'prettier/prettier': ['error', { printWidth: 100 }], - 'import/order': ['error', { groups: ['builtin', 'external', 'internal'] }], - 'testing-library/no-container': 'warn', - 'testing-library/no-node-access': 'warn', - 'react/react-in-jsx-scope': 'off', - '@typescript-eslint/promise-function-async': 'error', - '@typescript-eslint/consistent-type-assertions': 'error', - '@typescript-eslint/naming-convention': 'off', - 'no-restricted-imports': ['warn', { patterns: ['..*'] }], - }, - languageOptions: { - parserOptions: { project: true, tsconfigRootDir: import.meta.dirname }, - }, - settings: { - 'import/resolver': { - typescript: true, - node: true, - }, - 'import/extensions': ['.js', '.jsx', '.ts', '.tsx'], - }, - }, -]; diff --git a/next.config.mjs b/next.config.mjs index a1d38a1..00db339 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -42,5 +42,5 @@ export default withSentryConfig(nextConfig, { reactComponentAnnotation: { enabled: true }, // 세션 리플레이와 브레드크럼에서 상세한 컴포넌트명 표시 - tunnelRoute: '/monitoring', // ad-blocker 우회를 위한 경로 (저희가 이전에 왜 생기는지 이유를 추측했던 그 경로 맞습니다..) + tunnelRoute: '/monitoring', // ad-blocker 우회용 엔드포인트 (이벤트 로깅 관련) }); diff --git a/package.json b/package.json index 1eea6cf..e7f5496 100644 --- a/package.json +++ b/package.json @@ -20,16 +20,13 @@ }, "dependencies": { "@channel.io/channel-web-sdk-loader": "^2.0.0", + "@next/eslint-plugin-next": "^15.3.2", "@next/third-parties": "^15.1.7", "@sentry/core": "^8.47.0", "@sentry/nextjs": "^8.47.0", - "@sentry/webpack-plugin": "^3.3.1", "@tailwindcss/typography": "^0.5.16", "@tanstack/react-query": "^5.69.0", - "@tanstack/react-query-devtools": "^5.69.0", - "@types/gtag.js": "^0.0.20", "chart.js": "^4.4.7", - "js-cookie": "^3.0.5", "next": "14.2.18", "react": "^18", "react-chartjs-2": "^5.2.0", @@ -38,21 +35,26 @@ "react-intersection-observer": "^9.14.0", "react-toastify": "^10.0.6", "return-fetch": "^0.4.6", - "sharp": "^0.33.5", + "tailwind-merge": "^3.2.0", "zustand": "^5.0.3" }, "devDependencies": { + "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.15.0", + "@sentry/webpack-plugin": "^3.4.0", "@svgr/webpack": "^8.1.0", + "@tanstack/react-query-devtools": "5.69.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.1", "@testing-library/user-event": "^14.5.2", "@types/eslint-config-prettier": "^6.11.3", + "@types/gtag.js": "^0.0.20", "@types/jest": "^29.5.14", "@types/js-cookie": "^3.0.6", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "@typescript-eslint/eslint-plugin": "^8.32.0", "babel-plugin-inline-react-svg": "^2.0.2", "eslint": "^8.57.1", "eslint-config-next": "14.2.18", @@ -73,6 +75,7 @@ "msw": "^2.7.3", "postcss": "^8", "prettier": "^3.3.3", + "sharp": "^0.34.1", "tailwindcss": "^3.4.1", "ts-node": "^10.9.2", "typescript": "^5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e652a7..f893a7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@channel.io/channel-web-sdk-loader': specifier: ^2.0.0 version: 2.0.0 + '@next/eslint-plugin-next': + specifier: ^15.3.2 + version: 15.3.2 '@next/third-parties': specifier: ^15.1.7 version: 15.1.7(next@14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) @@ -20,27 +23,15 @@ importers: '@sentry/nextjs': specifier: ^8.47.0 version: 8.47.0(@opentelemetry/core@1.30.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.56.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.0(@opentelemetry/api@1.9.0))(next@14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.97.1) - '@sentry/webpack-plugin': - specifier: ^3.3.1 - version: 3.3.1(webpack@5.97.1) '@tailwindcss/typography': specifier: ^0.5.16 version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2))) '@tanstack/react-query': specifier: ^5.69.0 version: 5.69.0(react@18.3.1) - '@tanstack/react-query-devtools': - specifier: ^5.69.0 - version: 5.69.0(@tanstack/react-query@5.69.0(react@18.3.1))(react@18.3.1) - '@types/gtag.js': - specifier: ^0.0.20 - version: 0.0.20 chart.js: specifier: ^4.4.7 version: 4.4.7 - js-cookie: - specifier: ^3.0.5 - version: 3.0.5 next: specifier: 14.2.18 version: 14.2.18(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -65,19 +56,28 @@ importers: return-fetch: specifier: ^0.4.6 version: 0.4.6 - sharp: - specifier: ^0.33.5 - version: 0.33.5 + tailwind-merge: + specifier: ^3.2.0 + version: 3.2.0 zustand: specifier: ^5.0.3 version: 5.0.3(@types/react@18.3.18)(react@18.3.1) devDependencies: + '@eslint/eslintrc': + specifier: ^3.3.1 + version: 3.3.1 '@eslint/js': specifier: ^9.15.0 version: 9.17.0 + '@sentry/webpack-plugin': + specifier: ^3.4.0 + version: 3.4.0(webpack@5.97.1) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.7.2) + '@tanstack/react-query-devtools': + specifier: 5.69.0 + version: 5.69.0(@tanstack/react-query@5.69.0(react@18.3.1))(react@18.3.1) '@testing-library/jest-dom': specifier: ^6.6.3 version: 6.6.3 @@ -90,6 +90,9 @@ importers: '@types/eslint-config-prettier': specifier: ^6.11.3 version: 6.11.3 + '@types/gtag.js': + specifier: ^0.0.20 + version: 0.0.20 '@types/jest': specifier: ^29.5.14 version: 29.5.14 @@ -105,6 +108,9 @@ importers: '@types/react-dom': specifier: ^18 version: 18.3.5(@types/react@18.3.18) + '@typescript-eslint/eslint-plugin': + specifier: ^8.32.0 + version: 8.32.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) babel-plugin-inline-react-svg: specifier: ^2.0.2 version: 2.0.2(@babel/core@7.26.0) @@ -122,7 +128,7 @@ importers: version: 2.31.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) eslint-plugin-jest: specifier: ^28.9.0 - version: 28.10.0(@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2) + version: 28.10.0(@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2) eslint-plugin-jest-dom: specifier: ^5.5.0 version: 5.5.0(@testing-library/dom@10.4.0)(eslint@8.57.1) @@ -165,6 +171,9 @@ importers: prettier: specifier: ^3.3.3 version: 3.4.2 + sharp: + specifier: ^0.34.1 + version: 0.34.1 tailwindcss: specifier: ^3.4.1 version: 3.4.17(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)) @@ -828,8 +837,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} @@ -837,6 +846,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -845,6 +860,10 @@ packages: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -866,107 +885,112 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -1117,6 +1141,9 @@ packages: '@next/eslint-plugin-next@14.2.18': resolution: {integrity: sha512-KyYTbZ3GQwWOjX3Vi1YcQbekyGP0gdammb7pbmmi25HBUCINzDReyrzCMOJIeZisK1Q3U6DT5Rlc4nm2/pQeXA==} + '@next/eslint-plugin-next@15.3.2': + resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} + '@next/swc-darwin-arm64@14.2.18': resolution: {integrity: sha512-tOBlDHCjGdyLf0ube/rDUs6VtwNOajaWV+5FV/ajPgrvHeisllEdymY/oDgv2cx561+gJksfMUtqf8crug7sbA==} engines: {node: '>= 10'} @@ -1473,8 +1500,8 @@ packages: resolution: {integrity: sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ==} engines: {node: '>= 14'} - '@sentry/babel-plugin-component-annotate@3.3.1': - resolution: {integrity: sha512-5GOxGT7lZN+I8A7Vp0rWY+726FDKEw8HnFiebe51rQrMbfGfCu2Aw9uSM0nT9OG6xhV6WvGccIcCszTPs4fUZQ==} + '@sentry/babel-plugin-component-annotate@3.4.0': + resolution: {integrity: sha512-tSzfc3aE7m0PM0Aj7HBDet5llH9AB9oc+tBQ8AvOqUSnWodLrNCuWeQszJ7mIBovD3figgCU3h0cvI6U5cDtsg==} engines: {node: '>= 14'} '@sentry/browser@8.47.0': @@ -1485,8 +1512,8 @@ packages: resolution: {integrity: sha512-ouQh5sqcB8vsJ8yTTe0rf+iaUkwmeUlGNFi35IkCFUQlWJ22qS6OfvNjOqFI19e6eGUXks0c/2ieFC4+9wJ+1g==} engines: {node: '>= 14'} - '@sentry/bundler-plugin-core@3.3.1': - resolution: {integrity: sha512-Dd6xaWb293j9otEJ1yJqG2Ra6zB49OPzMNdIkdP8wdY+S9UFQE5PyKTyredmPY7hqCc005OrUQZolIIo9Zl13A==} + '@sentry/bundler-plugin-core@3.4.0': + resolution: {integrity: sha512-X1Q41AsQ6xcT6hB4wYmBDBukndKM/inT4IsR7pdKLi7ICpX2Qq6lisamBAEPCgEvnLpazSFguaiC0uiwMKAdqw==} engines: {node: '>= 14'} '@sentry/cli-darwin@2.39.1': @@ -1621,8 +1648,8 @@ packages: peerDependencies: webpack: '>=4.40.0' - '@sentry/webpack-plugin@3.3.1': - resolution: {integrity: sha512-AFRnGNUnlIvq3M+ADdfWb+DIXWKK6yYEkVPAyOppkjO+cL/19gjXMdvAwv+CMFts28YCFKF8Kr3pamUiCmwodA==} + '@sentry/webpack-plugin@3.4.0': + resolution: {integrity: sha512-i+nAxxniJV5ovijojjTF5n+Yj08Xk8my+vm8+oo0C0I7xcnI2gOKft6B0sJOq01CNbo85X5m/3/edL0PKoWE9w==} engines: {node: '>= 14'} peerDependencies: webpack: '>=4.40.0' @@ -1909,6 +1936,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/eslint-plugin@8.32.0': + resolution: {integrity: sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/parser@8.18.2': resolution: {integrity: sha512-y7tcq4StgxQD4mDr9+Jb26dZ+HTZ/SkfqpXSiqeUXZHxOUyjWDKsmwKhJ0/tApR08DgOhrFAoAhyB80/p3ViuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1924,6 +1959,10 @@ packages: resolution: {integrity: sha512-YJFSfbd0CJjy14r/EvWapYgV4R5CHzptssoag2M7y3Ra7XNta6GPAJPPP5KGB9j14viYXyrzRO5GkX7CRfo8/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.32.0': + resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.18.2': resolution: {integrity: sha512-AB/Wr1Lz31bzHfGm/jgbFR0VB0SML/hd2P1yxzKDM48YmP7vbyJNHRExUE/wZsQj2wUCvbWH8poNHFuxLqCTnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1931,6 +1970,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/type-utils@8.32.0': + resolution: {integrity: sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1939,6 +1985,10 @@ packages: resolution: {integrity: sha512-Z/zblEPp8cIvmEn6+tPDIHUbRu/0z5lqZ+NvolL5SvXWT5rQy7+Nch83M0++XzO0XrWRFWECgOAyE8bsJTl1GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.32.0': + resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1954,6 +2004,12 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/typescript-estree@8.32.0': + resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1967,6 +2023,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@8.32.0': + resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1975,6 +2038,10 @@ packages: resolution: {integrity: sha512-zORcwn4C3trOWiCqFQP1x6G3xTRyZ1LYydnj51cRnJ6hxBlr/cKPckk+PKPUw/fXmvfKTcw7bwY3w9izgx5jZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.32.0': + resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} @@ -2565,8 +2632,8 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} detect-newline@3.1.0: @@ -2877,6 +2944,10 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2938,6 +3009,10 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -3091,6 +3166,10 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + globals@15.14.0: resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} @@ -3559,10 +3638,6 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4373,6 +4448,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -4384,8 +4464,8 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -4611,6 +4691,9 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} + tailwind-merge@3.2.0: + resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} + tailwindcss@3.4.17: resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} engines: {node: '>=14.0.0'} @@ -4682,6 +4765,12 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -5817,7 +5906,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.3.1': + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 optional: true @@ -5827,6 +5916,11 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': @@ -5843,6 +5937,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} '@eslint/js@9.17.0': {} @@ -5859,79 +5967,82 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@img/sharp-darwin-arm64@0.33.5': + '@img/sharp-darwin-arm64@0.34.1': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.1.0 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.34.1': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.1.0': optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-darwin-x64@1.1.0': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-linux-arm64@1.1.0': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-arm@1.1.0': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-ppc64@1.1.0': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-s390x@1.1.0': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linux-x64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-libvips-linuxmusl-x64@1.1.0': optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-linux-arm64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-arm64': 1.1.0 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-arm@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm': 1.1.0 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-s390x@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.1.0 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-x64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.1.0 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linuxmusl-arm64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linuxmusl-x64@0.34.1': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-wasm32@0.34.1': dependencies: - '@emnapi/runtime': 1.3.1 + '@emnapi/runtime': 1.4.3 optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-ia32@0.34.1': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-x64@0.34.1': optional: true '@inquirer/confirm@5.1.8(@types/node@20.17.10)': @@ -6185,6 +6296,10 @@ snapshots: dependencies: glob: 10.3.10 + '@next/eslint-plugin-next@15.3.2': + dependencies: + fast-glob: 3.3.1 + '@next/swc-darwin-arm64@14.2.18': optional: true @@ -6578,7 +6693,7 @@ snapshots: '@sentry/babel-plugin-component-annotate@2.22.7': {} - '@sentry/babel-plugin-component-annotate@3.3.1': {} + '@sentry/babel-plugin-component-annotate@3.4.0': {} '@sentry/browser@8.47.0': dependencies: @@ -6602,10 +6717,10 @@ snapshots: - encoding - supports-color - '@sentry/bundler-plugin-core@3.3.1': + '@sentry/bundler-plugin-core@3.4.0': dependencies: '@babel/core': 7.26.0 - '@sentry/babel-plugin-component-annotate': 3.3.1 + '@sentry/babel-plugin-component-annotate': 3.4.0 '@sentry/cli': 2.42.2 dotenv: 16.4.7 find-up: 5.0.0 @@ -6795,9 +6910,9 @@ snapshots: - encoding - supports-color - '@sentry/webpack-plugin@3.3.1(webpack@5.97.1)': + '@sentry/webpack-plugin@3.4.0(webpack@5.97.1)': dependencies: - '@sentry/bundler-plugin-core': 3.3.1 + '@sentry/bundler-plugin-core': 3.4.0 unplugin: 1.0.1 uuid: 9.0.1 webpack: 5.97.1 @@ -7127,6 +7242,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.18.2(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.32.0 + '@typescript-eslint/type-utils': 8.32.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 8.32.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.32.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.18.2 @@ -7149,6 +7281,11 @@ snapshots: '@typescript-eslint/types': 8.18.2 '@typescript-eslint/visitor-keys': 8.18.2 + '@typescript-eslint/scope-manager@8.32.0': + dependencies: + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/visitor-keys': 8.32.0 + '@typescript-eslint/type-utils@8.18.2(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.18.2(typescript@5.7.2) @@ -7160,10 +7297,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.32.0(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.32.0(eslint@8.57.1)(typescript@5.7.2) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 2.1.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@8.18.2': {} + '@typescript-eslint/types@8.32.0': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -7192,6 +7342,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.32.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/visitor-keys': 8.32.0 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.1.0(typescript@5.7.2) + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) @@ -7218,6 +7382,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.32.0(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.32.0 + '@typescript-eslint/types': 8.32.0 + '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.7.2) + eslint: 8.57.1 + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -7228,6 +7403,11 @@ snapshots: '@typescript-eslint/types': 8.18.2 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.32.0': + dependencies: + '@typescript-eslint/types': 8.32.0 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.1': {} '@webassemblyjs/ast@1.14.1': @@ -7890,7 +8070,7 @@ snapshots: dequal@2.0.3: {} - detect-libc@2.0.3: {} + detect-libc@2.0.4: {} detect-newline@3.1.0: {} @@ -8109,7 +8289,7 @@ snapshots: dependencies: '@next/eslint-plugin-next': 14.2.18 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) '@typescript-eslint/parser': 8.18.2(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 @@ -8201,12 +8381,12 @@ snapshots: optionalDependencies: '@testing-library/dom': 10.4.0 - eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2): + eslint-plugin-jest@28.10.0(@typescript-eslint/eslint-plugin@8.32.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(jest@29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)))(typescript@5.7.2): dependencies: '@typescript-eslint/utils': 8.18.2(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.18.2(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.32.0(@typescript-eslint/parser@8.18.2(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) jest: 29.7.0(@types/node@20.17.10)(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)) transitivePeerDependencies: - supports-color @@ -8332,6 +8512,12 @@ snapshots: transitivePeerDependencies: - supports-color + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@9.6.1: dependencies: acorn: 8.14.0 @@ -8398,6 +8584,14 @@ snapshots: fast-diff@1.3.0: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8569,6 +8763,8 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + globals@15.14.0: {} globalthis@1.0.4: @@ -9231,8 +9427,6 @@ snapshots: jiti@1.21.7: {} - js-cookie@3.0.5: {} - js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -10033,6 +10227,8 @@ snapshots: semver@7.6.3: {} + semver@7.7.1: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -10053,31 +10249,32 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - sharp@0.33.5: + sharp@0.34.1: dependencies: color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.6.3 + detect-libc: 2.0.4 + semver: 7.7.1 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 shebang-command@2.0.0: dependencies: @@ -10329,6 +10526,8 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 + tailwind-merge@3.2.0: {} + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -10415,6 +10614,10 @@ snapshots: dependencies: typescript: 5.7.2 + ts-api-utils@2.1.0(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + ts-interface-checker@0.1.13: {} ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2): diff --git a/src/__test__/login.test.tsx b/src/__test__/login.test.tsx index 6055bca..f9794fb 100644 --- a/src/__test__/login.test.tsx +++ b/src/__test__/login.test.tsx @@ -11,12 +11,8 @@ jest.mock('next/navigation', () => ({ const getElements = () => { const buttonEl = screen.getByRole('button'); - const accessInputEl = screen.getByPlaceholderText( - 'Access Token을 입력하세요', - ); - const refreshInputEl = screen.getByPlaceholderText( - 'Refresh Token을 입력하세요', - ); + const accessInputEl = screen.getByPlaceholderText('Access Token을 입력하세요'); + const refreshInputEl = screen.getByPlaceholderText('Refresh Token을 입력하세요'); return { buttonEl, accessInputEl, refreshInputEl }; }; diff --git a/src/__test__/main.test.tsx b/src/__test__/main.test.tsx index 8030066..f9ce6d2 100644 --- a/src/__test__/main.test.tsx +++ b/src/__test__/main.test.tsx @@ -68,9 +68,8 @@ describe('메인(대시보드) 페이지에서', () => { const { container } = renderWithQueryClient(); await waitFor(() => - expect(container.querySelector('span#totalViews')?.innerHTML).toBe( - '100회', - ), + // eslint-disable-next-line + expect(container.querySelector('span#totalViews')?.innerHTML).toBe('100회'), ); }); }); diff --git a/src/apis/dashboard.request.ts b/src/apis/dashboard.request.ts index 4ca2615..0d750e8 100644 --- a/src/apis/dashboard.request.ts +++ b/src/apis/dashboard.request.ts @@ -14,10 +14,7 @@ export const postList = async (sort: SortType, cursor?: string) => : `${PATHS.POSTS}?asc=${sort.asc}&sort=${sort.sort}`, ); -export const postSummary = async () => - await instance(PATHS.SUMMARY); +export const postSummary = async () => await instance(PATHS.SUMMARY); export const postDetail = async (path: string, start: string, end: string) => - await instance( - `${PATHS.DETAIL}/${path}?start=${start}&end=${end}`, - ); + await instance(`${PATHS.DETAIL}/${path}?start=${start}&end=${end}`); diff --git a/src/apis/instance.request.ts b/src/apis/instance.request.ts index 1834ef3..744bb7c 100644 --- a/src/apis/instance.request.ts +++ b/src/apis/instance.request.ts @@ -60,9 +60,9 @@ export const instance = async ( ...init, headers: cookieHeader ? { - ...init?.headers, - Cookie: cookieHeader, - } + ...init?.headers, + Cookie: cookieHeader, + } : init?.headers, body: init?.body ? JSON.stringify(init.body) : undefined, signal: AbortSignal.timeout diff --git a/src/apis/notice.request.ts b/src/apis/notice.request.ts index 9dfe217..4787250 100644 --- a/src/apis/notice.request.ts +++ b/src/apis/notice.request.ts @@ -2,5 +2,4 @@ import { PATHS } from '@/constants'; import { NotiListDto } from '@/types'; import { instance } from './instance.request'; -export const notiList = async () => - await instance(PATHS.NOTIS); +export const notiList = async () => await instance(PATHS.NOTIS); diff --git a/src/apis/user.request.ts b/src/apis/user.request.ts index 459bdbe..68868fc 100644 --- a/src/apis/user.request.ts +++ b/src/apis/user.request.ts @@ -8,17 +8,12 @@ export const login = async (body: LoginVo) => PATHS.LOGIN, { method: 'POST', body }, { - '404': new NotFoundError( - '일치하는 계정을 찾을 수 없습니다', - 'CannotFindAccount', - ), + '404': new NotFoundError('일치하는 계정을 찾을 수 없습니다', 'CannotFindAccount'), }, ); export const me = async () => await instance(PATHS.ME); -export const logout = async () => - await instance(PATHS.LOGOUT, { method: 'POST', body: undefined }); +export const logout = async () => await instance(PATHS.LOGOUT, { method: 'POST', body: undefined }); -export const sampleLogin = async () => - await instance(PATHS.SAMPLELOGIN, { method: 'POST' }); +export const sampleLogin = async () => await instance(PATHS.SAMPLELOGIN, { method: 'POST' }); diff --git a/src/app/(auth-required)/components/notice/Modal.tsx b/src/app/(auth-required)/components/notice/Modal.tsx index 39ad689..94541af 100644 --- a/src/app/(auth-required)/components/notice/Modal.tsx +++ b/src/app/(auth-required)/components/notice/Modal.tsx @@ -1,39 +1,20 @@ 'use client'; -import { useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { notiList } from '@/apis'; import { PATHS } from '@/constants'; -import { useModal } from '@/hooks/useModal'; -import { Icon } from '@/components'; +import { Modal as Layout } from '@/components'; export const Modal = () => { - const { close } = useModal(); const { data } = useQuery({ queryKey: [PATHS.NOTIS], queryFn: notiList }); - useEffect(() => { - const handleClose = (e: KeyboardEvent) => e.key === 'Escape' && close(); - - window.addEventListener('keydown', handleClose); - return () => window.removeEventListener('keydown', handleClose); - }, [close]); - return ( -
-
-

- 공지사항 -

- -
- + {data?.posts?.map(({ content, created_at, id, title }) => (

{title}

-

- {created_at.split('T')[0]} -

+

{created_at.split('T')[0]}

{ />
))} -
+
); }; diff --git a/src/app/(auth-required)/main/components/Section/index.tsx b/src/app/(auth-required)/main/components/Section/index.tsx index bf9e7c2..eece1b2 100644 --- a/src/app/(auth-required)/main/components/Section/index.tsx +++ b/src/app/(auth-required)/main/components/Section/index.tsx @@ -11,9 +11,7 @@ import { Graph } from './Graph'; export const Section = (p: PostType) => { const [open, setOpen] = useState(false); - const username = ( - getQueryClient().getQueryData([PATHS.ME]) as Partial - )?.username; + const username = (getQueryClient().getQueryData([PATHS.ME]) as Partial)?.username; const url = `${env.VELOG_URL}/@${username}/${p.slug}`; @@ -36,9 +34,7 @@ export const Section = (p: PostType) => { - {p.title.length > 30 - ? p.title.slice(0, 29).trim() + '..' - : p.title} + {p.title.length > 30 ? p.title.slice(0, 29).trim() + '..' : p.title}
@@ -50,9 +46,7 @@ export const Section = (p: PostType) => {
{p.releasedAt.split('T')[0]}
- - {parseNumber(p.views)} - + {parseNumber(p.views)} {parseNumber(p.views - p.yesterdayViews)} diff --git a/src/app/(auth-required)/main/components/Summary/BarContent.tsx b/src/app/(auth-required)/main/components/Summary/BarContent.tsx index 3c4a752..ba32190 100644 --- a/src/app/(auth-required)/main/components/Summary/BarContent.tsx +++ b/src/app/(auth-required)/main/components/Summary/BarContent.tsx @@ -11,13 +11,7 @@ interface IProp { const afterContent = 'before:text-PRIMARY-SUB before:content-[attr(data-increasement)_"↑"] before:mr-2 before:text-T5'; -export const BarContent = ({ - title, - content, - increasement, - prefix = '개', - id, -}: IProp) => { +export const BarContent = ({ title, content, increasement, prefix = '개', id }: IProp) => { return (
{title} diff --git a/src/app/(auth-required)/main/components/Summary/SidebarContent.tsx b/src/app/(auth-required)/main/components/Summary/SidebarContent.tsx index e4266a5..8f6dcbe 100644 --- a/src/app/(auth-required)/main/components/Summary/SidebarContent.tsx +++ b/src/app/(auth-required)/main/components/Summary/SidebarContent.tsx @@ -11,18 +11,10 @@ interface IProp { const afterContent = 'after:text-PRIMARY-SUB after:content-[attr(data-increasement)_"↑"] after:ml-2 after:text-ST3 max-TBL:after:text-ST4 transition-all'; -export const SidebarContent = ({ - title, - content, - increasement, - prefix = '개', - id, -}: IProp) => { +export const SidebarContent = ({ title, content, increasement, prefix = '개', id }: IProp) => { return (
- - {title} - + {title} { increasement={stats?.totalLikes - stats?.yesterdayLikes} id="totalLikes" /> - +
{ increasement={stats?.totalLikes - stats?.yesterdayLikes} id="totalLikes" /> - +
)} diff --git a/src/app/global-error.tsx b/src/app/global-error.tsx index 4b6ac69..c767795 100644 --- a/src/app/global-error.tsx +++ b/src/app/global-error.tsx @@ -4,11 +4,7 @@ import { captureException } from '@sentry/nextjs'; import NextError from 'next/error'; import { useEffect } from 'react'; -export default function GlobalError({ - error, -}: { - error: Error & { digest?: string }; -}) { +export default function GlobalError({ error }: { error: Error & { digest?: string } }) { useEffect(() => { captureException(error); }, [error]); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 517b854..c6833b9 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -6,11 +6,7 @@ import { ErrorBoundary } from '@sentry/nextjs'; import { ReactNode, Suspense } from 'react'; import type { Metadata } from 'next'; import './globals.css'; -import { - ChannelTalkProvider, - QueryProvider, - ModalProvider, -} from '@/components'; +import { ChannelTalkProvider, QueryProvider, ModalProvider } from '@/components'; import { env } from '@/constants'; import { TopBarProvider } from '@/components/Providers/TopBarProvider'; @@ -24,8 +20,7 @@ export const metadata: Metadata = { alternates: { canonical: BASE }, openGraph: { siteName: 'Velog Dashboard', - description: - '어디서든 편리하게 확인하는 Velog 통계 서비스, Velog Dashboard', + description: '어디서든 편리하게 확인하는 Velog 통계 서비스, Velog Dashboard', url: BASE, images: [{ url: '/opengraph-image.png', alt: 'Velog Dashboard' }], type: 'website', @@ -34,9 +29,7 @@ export const metadata: Metadata = { const NotoSansKr = Noto_Sans_KR({ subsets: ['latin'] }); -export default function RootLayout({ - children, -}: Readonly<{ children: ReactNode }>) { +export default function RootLayout({ children }: Readonly<{ children: ReactNode }>) { return ( diff --git a/src/components/ArriveSoon.tsx b/src/components/ArriveSoon.tsx index b0bc5e2..bf8cd1c 100644 --- a/src/components/ArriveSoon.tsx +++ b/src/components/ArriveSoon.tsx @@ -1,12 +1,8 @@ export const ArriveSoon = () => { return (
- - 곧 만나뵙겠습니다! - - - (열심히 개발하고 있습니다) - + 곧 만나뵙겠습니다! + (열심히 개발하고 있습니다)
); }; diff --git a/src/components/Check.tsx b/src/components/Check.tsx index 8a54254..d99ae35 100644 --- a/src/components/Check.tsx +++ b/src/components/Check.tsx @@ -5,31 +5,17 @@ interface IProp extends React.HTMLAttributes { direction?: 'left' | 'right'; } -export const Check = ({ - checked, - label, - onChange, - direction = 'left', - ...rest -}: IProp) => { +export const Check = ({ checked, label, onChange, direction = 'left', ...rest }: IProp) => { return (