diff --git a/.eslintrc.json b/.eslintrc.json index b2b3e9a..425d737 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,37 @@ { "extends": [ "next/core-web-vitals", - "plugin:storybook/recommended" - ] -} \ No newline at end of file + "plugin:storybook/recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } + }, + "plugins": ["@typescript-eslint", "react"], + "settings": { + "react": { + "version": "detect" + } + }, + "rules": { + "no-console": "warn", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "@typescript-eslint/no-explicit-any": "warn", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "react/react-in-jsx-scope": "off", + "react/prop-types": "off" + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index b4b44fa..6914739 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ 본 프로젝트는 [시맨틱 버저닝(Semantic Versioning)](https://semver.org/lang/ko/) 규칙을 따릅니다. 버전 표기 방식은 `MAJOR.MINOR.PATCH`(예: 1.2.3)입니다. +## [1.2.2] - 2025-12-29 + +**Branch**: `YD-v1.2.2-YD-DATAS컨텐츠추가` + +### 추가 + +- feat: side-proejcts컴포넌트추가 +- feat: eslint 규칙 고도화 + +### 변경 + +- refactor: 컴포넌트이름변경 area-chart -> posting-data-chart +- refactor: 미사용 interafce선언 제거 및 상위폴더명변경 charts -> yd-datas +- refactor: eslint 규칙 고도화에 따른 소스코드 대규모 수정 + +### 수정 + +### 제거 + +--- + ## [1.2.1] - 2025-12-12 **Branch**: `YD-v1.2.1-포스팅가지치기` diff --git a/package-lock.json b/package-lock.json index d5eee5b..7707282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "yd-blog", - "version": "1.1.3", + "version": "1.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "yd-blog", - "version": "1.1.3", + "version": "1.2.2", "dependencies": { "@gsap/react": "^2.1.2", "@radix-ui/react-slot": "^1.0.2", @@ -59,10 +59,14 @@ "@types/react-dom": "^18", "@types/react-syntax-highlighter": "^15.5.11", "@types/rss": "^0.0.32", + "@typescript-eslint/eslint-plugin": "^8.51.0", + "@typescript-eslint/parser": "^8.51.0", "autoprefixer": "^10.0.1", "chromatic": "^11.20.2", "eslint": "^8", "eslint-config-next": "15.2.3", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-storybook": "^0.11.1", "http-server": "^14.1.1", "husky": "^9.1.7", @@ -2355,9 +2359,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -7820,21 +7824,20 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.27.0.tgz", - "integrity": "sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.51.0.tgz", + "integrity": "sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/type-utils": "8.27.0", - "@typescript-eslint/utils": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/type-utils": "8.51.0", + "@typescript-eslint/utils": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7844,22 +7847,32 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "@typescript-eslint/parser": "^8.51.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.27.0.tgz", - "integrity": "sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.51.0.tgz", + "integrity": "sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/typescript-estree": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4" }, "engines": { @@ -7871,18 +7884,40 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.51.0.tgz", + "integrity": "sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.51.0", + "@typescript-eslint/types": "^8.51.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.27.0.tgz", - "integrity": "sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.51.0.tgz", + "integrity": "sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0" + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7892,17 +7927,35 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.51.0.tgz", + "integrity": "sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.27.0.tgz", - "integrity": "sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.51.0.tgz", + "integrity": "sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.27.0", - "@typescript-eslint/utils": "8.27.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0", + "@typescript-eslint/utils": "8.51.0", "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7913,13 +7966,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.27.0.tgz", - "integrity": "sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.51.0.tgz", + "integrity": "sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==", "dev": true, "license": "MIT", "engines": { @@ -7931,20 +7984,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.27.0.tgz", - "integrity": "sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.51.0.tgz", + "integrity": "sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/visitor-keys": "8.27.0", + "@typescript-eslint/project-service": "8.51.0", + "@typescript-eslint/tsconfig-utils": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/visitor-keys": "8.51.0", "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7954,49 +8008,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -8014,16 +8038,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.27.0.tgz", - "integrity": "sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.51.0.tgz", + "integrity": "sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.27.0", - "@typescript-eslint/types": "8.27.0", - "@typescript-eslint/typescript-estree": "8.27.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.51.0", + "@typescript-eslint/types": "8.51.0", + "@typescript-eslint/typescript-estree": "8.51.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8034,18 +8058,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.27.0.tgz", - "integrity": "sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.51.0.tgz", + "integrity": "sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.27.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.51.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8056,9 +8080,9 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -11738,6 +11762,19 @@ } } }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -11957,9 +11994,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", - "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { @@ -11973,7 +12010,7 @@ "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", @@ -11990,13 +12027,20 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" @@ -12397,10 +12441,13 @@ } }, "node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -13538,6 +13585,23 @@ "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", "license": "MIT" }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -17684,9 +17748,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { "node": ">=12" @@ -21089,14 +21153,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -21179,9 +21243,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.3.0.tgz", + "integrity": "sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==", "dev": true, "license": "MIT", "engines": { @@ -22926,6 +22990,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index 26d786f..3445b7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yd-blog", - "version": "1.2.1", + "version": "1.2.2", "private": true, "engines": { "node": ">=22.0.0" @@ -68,10 +68,14 @@ "@types/react-dom": "^18", "@types/react-syntax-highlighter": "^15.5.11", "@types/rss": "^0.0.32", + "@typescript-eslint/eslint-plugin": "^8.51.0", + "@typescript-eslint/parser": "^8.51.0", "autoprefixer": "^10.0.1", "chromatic": "^11.20.2", "eslint": "^8", "eslint-config-next": "15.2.3", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-storybook": "^0.11.1", "http-server": "^14.1.1", "husky": "^9.1.7", diff --git a/src/app/algorithms/page.tsx b/src/app/algorithms/page.tsx index aafa0d7..7d71fb7 100644 --- a/src/app/algorithms/page.tsx +++ b/src/app/algorithms/page.tsx @@ -8,13 +8,11 @@ import { getAllAlgorithms } from "../api/algorithms/api"; import PostCards from "@/app/shared/_components/post/post-cards/post-cards"; import TagNavbar from "@/app/algorithms/components/tag-navbar/tag-navbar"; -interface Ipage {} - -const page: React.FC = () => { +const page = () => { const algorithms = getAllAlgorithms(); return ( -
+
diff --git a/src/app/api/algorithms/api.ts b/src/app/api/algorithms/api.ts index 57d654a..b3d2184 100644 --- a/src/app/api/algorithms/api.ts +++ b/src/app/api/algorithms/api.ts @@ -40,6 +40,7 @@ export function getPostBySlug(slug: string) { // 3-1 파일이 없는 경우 예외 처리 if (!targetFile) { + // eslint-disable-next-line no-console console.error(`File not found: ${decodedSlug}`); return null; // 에러 던지는 대신 null 반환하여 컴포넌트에서 처리 } @@ -77,16 +78,18 @@ export function getFilteredAlgorithms(filterWord: string): Post[] { return filteredPost; } -export function getAllCategoriesArray(): any { +export function getAllCategoriesArray(): [string, number][] { const posts = getAllAlgorithms(); - const categoryMap = new Map(); + const categoryMap = new Map(); categoryMap.set("All Algorithms", posts.length); - posts.map((item) => { + posts.forEach((item) => { const category = item.category; - categoryMap.has(category) - ? categoryMap.set(category, categoryMap.get(category) + 1) - : categoryMap.set(category, 1); + if (categoryMap.has(category)) { + categoryMap.set(category, categoryMap.get(category)! + 1); + } else { + categoryMap.set(category, 1); + } }); return Array.from(categoryMap.entries()); @@ -94,14 +97,16 @@ export function getAllCategoriesArray(): any { export function getAllCategoriesID(): string[] { const posts = getAllAlgorithms(); - const categoryMap = new Map(); + const categoryMap = new Map(); categoryMap.set("All Algorithms", posts.length); - posts.map((item) => { + posts.forEach((item) => { const category = item.category; - categoryMap.has(category) - ? categoryMap.set(category, categoryMap.get(category) + 1) - : categoryMap.set(category, 1); + if (categoryMap.has(category)) { + categoryMap.set(category, categoryMap.get(category)! + 1); + } else { + categoryMap.set(category, 1); + } }); return Array.from(categoryMap.keys()); @@ -126,7 +131,6 @@ export function getAlgorithmStatsByMonth(): MonthlyStats[] { const year = date.getFullYear(); const month = date.getMonth() + 1; // 0-based이므로 +1 const key = `${year}-${month.toString().padStart(2, "0")}`; - const label = `${year.toString().slice(-2)}.${month.toString().padStart(2, "0")}`; monthlyMap.set(key, (monthlyMap.get(key) || 0) + 1); } @@ -185,6 +189,7 @@ export const generateRSS2 = () => { return feed.xml(); } catch (err) { + // eslint-disable-next-line no-console console.error("Error generating Rss feed", err); return null; } diff --git a/src/app/api/algorithms/stats/route.ts b/src/app/api/algorithms/stats/route.ts index 5a42154..16e99ee 100644 --- a/src/app/api/algorithms/stats/route.ts +++ b/src/app/api/algorithms/stats/route.ts @@ -6,6 +6,7 @@ export async function GET() { const stats = getAlgorithmStatsByMonth(); return NextResponse.json(stats); } catch (error) { + // eslint-disable-next-line no-console console.error("Error fetching algorithm stats:", error); return NextResponse.json( { error: "Failed to fetch algorithm statistics" }, diff --git a/src/app/api/blog/api.ts b/src/app/api/blog/api.ts index 48e9d69..695e80f 100644 --- a/src/app/api/blog/api.ts +++ b/src/app/api/blog/api.ts @@ -40,6 +40,7 @@ export function getPostBySlug(slug: string) { // 3-1 파일이 없는 경우 예외 처리 if (!targetFile) { + // eslint-disable-next-line no-console console.error(`File not found: ${decodedSlug}`); return null; // 에러 던지는 대신 null 반환하여 컴포넌트에서 처리 } @@ -77,16 +78,18 @@ export function getFilteredPosts(filterWord: string): Post[] { return filteredPost; } -export function getAllCategoriesArray(): any { +export function getAllCategoriesArray(): [string, number][] { const posts = getAllPosts(); - const categoryMap = new Map(); + const categoryMap = new Map(); categoryMap.set("All Posts", posts.length); - posts.map((item) => { + posts.forEach((item) => { const category = item.category; - categoryMap.has(category) - ? categoryMap.set(category, categoryMap.get(category) + 1) - : categoryMap.set(category, 1); + if (categoryMap.has(category)) { + categoryMap.set(category, categoryMap.get(category)! + 1); + } else { + categoryMap.set(category, 1); + } }); return Array.from(categoryMap.entries()); @@ -94,14 +97,16 @@ export function getAllCategoriesArray(): any { export function getAllCategoriesID(): string[] { const posts = getAllPosts(); - const categoryMap = new Map(); + const categoryMap = new Map(); categoryMap.set("All Posts", posts.length); - posts.map((item) => { + posts.forEach((item) => { const category = item.category; - categoryMap.has(category) - ? categoryMap.set(category, categoryMap.get(category) + 1) - : categoryMap.set(category, 1); + if (categoryMap.has(category)) { + categoryMap.set(category, categoryMap.get(category)! + 1); + } else { + categoryMap.set(category, 1); + } }); return Array.from(categoryMap.keys()); @@ -184,6 +189,7 @@ export const generateRSS = () => { return feed.xml(); } catch (err) { + // eslint-disable-next-line no-console console.error("Error generating Rss feed", err); return null; } diff --git a/src/app/api/blog/stats/route.ts b/src/app/api/blog/stats/route.ts index 8ccae39..43178ed 100644 --- a/src/app/api/blog/stats/route.ts +++ b/src/app/api/blog/stats/route.ts @@ -6,10 +6,11 @@ export async function GET() { const stats = getBlogStatsByMonth(); return NextResponse.json(stats); } catch (error) { + // eslint-disable-next-line no-console console.error("Error fetching blog stats:", error); return NextResponse.json( { error: "Failed to fetch blog statistics" }, { status: 500 }, ); } -} \ No newline at end of file +} diff --git a/src/app/api/scrap/apis.ts b/src/app/api/scrap/apis.ts index 35bfaec..8ad22f2 100644 --- a/src/app/api/scrap/apis.ts +++ b/src/app/api/scrap/apis.ts @@ -65,7 +65,7 @@ export async function getAllScrapList() { })); return mappedResults; - } catch (error) { + } catch { return []; } } diff --git a/src/app/home/components/profile/profile.tsx b/src/app/home/components/profile/profile.tsx index 91883c8..ebab125 100644 --- a/src/app/home/components/profile/profile.tsx +++ b/src/app/home/components/profile/profile.tsx @@ -5,14 +5,8 @@ */ "use client"; import Image from "next/image"; -import React, { useState } from "react"; -import GithubIcon from "@public/assets/svg/github.svg"; -import NotionIcon from "@public/assets/svg/notion.svg"; -import Link from "next/link"; - -interface Iprofile {} - -const Profile: React.FC = () => { +import { useState } from "react"; +const Profile = () => { //SECTION HOOK호출 영역 const [rotation, setRotation] = useState<{ x: number; y: number }>({ x: 0, diff --git a/src/app/home/components/scrap/scrap-item/scrap-item.tsx b/src/app/home/components/scrap/scrap-item/scrap-item.tsx index 79c335e..f378b3a 100644 --- a/src/app/home/components/scrap/scrap-item/scrap-item.tsx +++ b/src/app/home/components/scrap/scrap-item/scrap-item.tsx @@ -29,7 +29,7 @@ const ScrapHeader = () => ( // 스크랩 목록 컴포넌트 분리 const ScrapList = ({ scrapList }: { scrapList: IScrapItem[] }) => (
- {scrapList.map((item: IScrapItem, index: number) => ( + {scrapList.map((item: IScrapItem) => ( { ); } catch (error) { + // eslint-disable-next-line no-console console.error(error); return ( <> diff --git a/src/app/home/components/charts/charts-funnel/ChartsFunnel.tsx b/src/app/home/components/yd-datas/charts-funnel/ChartsFunnel.tsx similarity index 62% rename from src/app/home/components/charts/charts-funnel/ChartsFunnel.tsx rename to src/app/home/components/yd-datas/charts-funnel/ChartsFunnel.tsx index 9ea7fc3..5742b10 100644 --- a/src/app/home/components/charts/charts-funnel/ChartsFunnel.tsx +++ b/src/app/home/components/yd-datas/charts-funnel/ChartsFunnel.tsx @@ -5,17 +5,16 @@ */ "use client"; -import AreaChart from "../area-chart/area-chart"; +import PostingDataChart from "../posting-data-chart/posting-data-chart"; import { ChevronLeft, ChevronRight } from "lucide-react"; import useFunnel from "@/app/shared/_components/funnel/hooks/useFunnel"; import Funnel from "@/app/shared/_components/funnel/components/funnel"; +import SideProjects from "../side-projects/side-projects"; -interface IChartsFunnel {} - -const ChartsFunnel: React.FC = () => { +const ChartsFunnel = () => { //SECTION HOOK호출 영역 const { step, nextStep, prevStep, stepLength, currentStep } = useFunnel({ - steps: ["areaChart", "lineChart", "barChart"], + steps: ["postingDataChart", "sideProjects", "barChart"], mode: "loop", }); @@ -30,8 +29,8 @@ const ChartsFunnel: React.FC = () => { //!SECTION 메서드 영역 return ( -
-
+
+
YD Datas
@@ -49,17 +48,19 @@ const ChartsFunnel: React.FC = () => {
- - - - - -
준비중입니다.
-
- -
준비중입니다.
-
-
+
+ + + + + + + + +
준비중입니다.
+
+
+
); }; diff --git a/src/app/home/components/charts/area-chart/area-chart.stories.tsx b/src/app/home/components/yd-datas/posting-data-chart/posting-data-chart.stories.tsx similarity index 80% rename from src/app/home/components/charts/area-chart/area-chart.stories.tsx rename to src/app/home/components/yd-datas/posting-data-chart/posting-data-chart.stories.tsx index 6e80bd4..376bcda 100644 --- a/src/app/home/components/charts/area-chart/area-chart.stories.tsx +++ b/src/app/home/components/yd-datas/posting-data-chart/posting-data-chart.stories.tsx @@ -1,18 +1,16 @@ import GridBoxWrapper from "../../grid-box-wrapper/grid-box-wrapper"; -import AreaChart from "./area-chart"; +import PostingDataChart from "./posting-data-chart"; import { Meta, StoryObj } from "@storybook/react"; -const meta: Meta = { - title: "pages/Home/Components/Charts/AreaChart", - component: AreaChart, +const meta: Meta = { + title: "pages/Home/Components/YdDatas/PostingDataChart", + component: PostingDataChart, decorators: [ (Story) => (
- {/* */} {Story()} - {/* */}
@@ -22,7 +20,7 @@ const meta: Meta = { export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Desktop: Story = { parameters: { diff --git a/src/app/home/components/charts/area-chart/area-chart.tsx b/src/app/home/components/yd-datas/posting-data-chart/posting-data-chart.tsx similarity index 97% rename from src/app/home/components/charts/area-chart/area-chart.tsx rename to src/app/home/components/yd-datas/posting-data-chart/posting-data-chart.tsx index b7451af..7c6f966 100644 --- a/src/app/home/components/charts/area-chart/area-chart.tsx +++ b/src/app/home/components/yd-datas/posting-data-chart/posting-data-chart.tsx @@ -20,8 +20,6 @@ import { } from "chart.js"; import { Line } from "react-chartjs-2"; -interface IAreaChart {} - interface MonthlyStats { year: number; month: number; @@ -29,7 +27,7 @@ interface MonthlyStats { label: string; } -const AreaChart: React.FC = () => { +const PostingDataChart = () => { //SECTION HOOK호출 영역 ChartJS.register( CategoryScale, @@ -140,6 +138,7 @@ const AreaChart: React.FC = () => { setAlgorithmStats(algorithmStats); setBlogStats(blogStats); } catch (error) { + // eslint-disable-next-line no-console console.error("Error fetching stats:", error); } finally { setIsLoading(false); @@ -174,4 +173,4 @@ const AreaChart: React.FC = () => { ); }; -export default AreaChart; +export default PostingDataChart; diff --git a/src/app/home/components/yd-datas/side-projects/assets/bdks.png b/src/app/home/components/yd-datas/side-projects/assets/bdks.png new file mode 100644 index 0000000..968971d Binary files /dev/null and b/src/app/home/components/yd-datas/side-projects/assets/bdks.png differ diff --git a/src/app/home/components/yd-datas/side-projects/assets/diagonal.svg b/src/app/home/components/yd-datas/side-projects/assets/diagonal.svg new file mode 100644 index 0000000..b369623 --- /dev/null +++ b/src/app/home/components/yd-datas/side-projects/assets/diagonal.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/app/home/components/yd-datas/side-projects/assets/yds.png b/src/app/home/components/yd-datas/side-projects/assets/yds.png new file mode 100644 index 0000000..b497af6 Binary files /dev/null and b/src/app/home/components/yd-datas/side-projects/assets/yds.png differ diff --git a/src/app/home/components/yd-datas/side-projects/side-projects.stories.tsx b/src/app/home/components/yd-datas/side-projects/side-projects.stories.tsx new file mode 100644 index 0000000..ab55a46 --- /dev/null +++ b/src/app/home/components/yd-datas/side-projects/side-projects.stories.tsx @@ -0,0 +1,69 @@ +import GridBoxWrapper from "../../grid-box-wrapper/grid-box-wrapper"; +import SideProjects from "./side-projects"; +import { Meta, StoryObj } from "@storybook/react"; +import { userEvent, within } from "@storybook/test"; + +const meta: Meta = { + title: "pages/Home/Components/YdDatas/SideProjects", + component: SideProjects, + decorators: [ + (Story) => ( +
+
+ + {Story()} + +
+
+ ), + ], +}; + +export default meta; + +type Story = StoryObj; + +export const Desktop: Story = { + parameters: { + layout: "fullscreen", + viewport: { + defaultViewport: "desktop", + }, + }, +}; + +export const Ipad12Pro: Story = { + parameters: { + layout: "fullscreen", + viewport: { + defaultViewport: "ipad12p", + }, + }, +}; + +export const Mobile: Story = { + parameters: { + layout: "fullscreen", + viewport: { + defaultViewport: "iphone6", + }, + }, +}; + +export const LinkClick: Story = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + canvasElement.addEventListener("click", (e) => { + e.preventDefault(); + }); + + const bdksLink = await canvas.findByText( + "도르트문트팬들을 위한 실시간 평점 입력 서비스", + ); + await userEvent.click(bdksLink); + + const ydsLink = await canvas.findByText("YDS 기반 UI라이브러리"); + await userEvent.click(ydsLink); + }, +}; diff --git a/src/app/home/components/yd-datas/side-projects/side-projects.tsx b/src/app/home/components/yd-datas/side-projects/side-projects.tsx new file mode 100644 index 0000000..6f17588 --- /dev/null +++ b/src/app/home/components/yd-datas/side-projects/side-projects.tsx @@ -0,0 +1,70 @@ +/** + * 작성자: KYD + * 기능: + * 프로세스 설명: 프로세스 복잡시 노션링크 첨부권장 + */ +import React from "react"; +import Image from "next/image"; +import BdksPng from "./assets/bdks.png"; +import YdsPng from "./assets/yds.png"; +import DiagonalSvg from "./assets/diagonal.svg"; +import Link from "next/link"; + +const SideProjects = () => { + //SECTION HOOK호출 영역 + //!SECTION HOOK호출 영역 + + //SECTION 상태값 영역 + + //!SECTION 상태값 영역 + + //SECTION 메서드 영역 + + //!SECTION 메서드 영역 + + return ( +
+ + {/* 왼쪽 상단 - YDS */} +
+ Yds +
+

@youngduck/yd-ui

+ + YDS 기반 UI라이브러리 + +
+
+ {/* 오른쪽 하단 - 보돌코스코어드 */} +
+
+ Bdks +
+
+

보돌코스코어드

+ + 도르트문트팬들을 위한 실시간 평점 입력 서비스 + +
+
+
+ ); +}; + +export default SideProjects; diff --git a/src/app/page.tsx b/src/app/page.tsx index cac8a55..7650283 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,6 @@ import GridBoxWrapper from "@/app/home/components/grid-box-wrapper/grid-box-wrapper"; import ScrapItem from "./home/components/scrap/scrap-item/scrap-item"; -import ChartsFunnel from "./home/components/charts/charts-funnel/ChartsFunnel"; +import ChartsFunnel from "./home/components/yd-datas/charts-funnel/ChartsFunnel"; import Profile from "./home/components/profile/profile"; import PostCards from "./shared/_components/post/post-cards/post-cards"; @@ -9,10 +9,7 @@ import { Post } from "./shared/_components/post/interfaces/posts"; export default async function Home() { const posts = await fetchBlogData(); const algorithms = await fetchAlgorithmsData(); - console.log( - "process.env.NEXT_PUBLIC_SENTRY_DSN", - process.env.NEXT_PUBLIC_SENTRY_DSN, - ); + return (
{/* 첫 번째 행 */} @@ -90,6 +87,7 @@ const fetchBlogData = async () => { const data: Post[] = await response.json(); return data; } catch (error) { + // eslint-disable-next-line no-console console.error("Error fetching blog data:", error); return []; } @@ -106,6 +104,7 @@ const fetchAlgorithmsData = async () => { const data: Post[] = await response.json(); return data; } catch (error) { + // eslint-disable-next-line no-console console.error("Error fetching algorithms data:", error); return []; } diff --git a/src/app/sentry-example-page/page.tsx b/src/app/sentry-example-page/page.tsx deleted file mode 100644 index 6b63990..0000000 --- a/src/app/sentry-example-page/page.tsx +++ /dev/null @@ -1,200 +0,0 @@ -"use client"; - -import Head from "next/head"; -import * as Sentry from "@sentry/nextjs"; -import { useState, useEffect } from "react"; - -class SentryExampleFrontendError extends Error { - constructor(message: string | undefined) { - super(message); - this.name = "SentryExampleFrontendError"; - } -} - -export default function Page() { - const [hasSentError, setHasSentError] = useState(false); - const [isConnected, setIsConnected] = useState(true); - - useEffect(() => { - async function checkConnectivity() { - const result = await Sentry.diagnoseSdkConnectivity(); - setIsConnected(result !== 'sentry-unreachable'); - } - checkConnectivity(); - }, []); - - return ( -
- - sentry-example-page - - - -
-
- - - -

- sentry-example-page -

- -

- Click the button below, and view the sample error on the Sentry Issues Page. - For more details about setting up Sentry, read our docs. -

- - - - {hasSentError ? ( -

- Sample error was sent to Sentry. -

- ) : !isConnected ? ( -
-

The Sentry SDK is not able to reach Sentry right now - this may be due to an adblocker. For more information, see the troubleshooting guide.

-
- ) : ( -
- )} - -
- -

- Adblockers will prevent errors from being sent to Sentry. -

-
- - -
- ); -} diff --git a/src/app/shared/_components/funnel/components/step/components/step.tsx b/src/app/shared/_components/funnel/components/step/components/step.tsx index 407baf9..63a3915 100644 --- a/src/app/shared/_components/funnel/components/step/components/step.tsx +++ b/src/app/shared/_components/funnel/components/step/components/step.tsx @@ -27,7 +27,7 @@ const Step: React.FC = ({ children, name }) => { //!SECTION 메서드 영역 if (step === name) { - return <>{children}; + return
{children}
; } return null; diff --git a/src/app/shared/_components/layout/button/list-button/list-button.stories.tsx b/src/app/shared/_components/layout/button/list-button/list-button.stories.tsx index df363ba..9513a26 100644 --- a/src/app/shared/_components/layout/button/list-button/list-button.stories.tsx +++ b/src/app/shared/_components/layout/button/list-button/list-button.stories.tsx @@ -15,6 +15,7 @@ type Story = StoryObj; export const Mobile: Story = { args: { + // eslint-disable-next-line no-console onClick: () => console.log("Button clicked"), }, parameters: { diff --git a/src/app/shared/_components/layout/header/header-percent/header-percent-bar.tsx b/src/app/shared/_components/layout/header/header-percent/header-percent-bar.tsx index 1698a6c..2a1340e 100644 --- a/src/app/shared/_components/layout/header/header-percent/header-percent-bar.tsx +++ b/src/app/shared/_components/layout/header/header-percent/header-percent-bar.tsx @@ -7,9 +7,7 @@ "use client"; import React, { useEffect, useState } from "react"; -interface IHeaderPercentBar {} - -const HeaderPercentBar: React.FC = () => { +const HeaderPercentBar = () => { //SECTION HOOK호출 영역 const [scrollPosition, setScrollPosition] = useState(0); useEffect(() => { diff --git a/src/app/shared/_components/lottie/CustomLottie.tsx b/src/app/shared/_components/lottie/CustomLottie.tsx index afbe93e..349143e 100644 --- a/src/app/shared/_components/lottie/CustomLottie.tsx +++ b/src/app/shared/_components/lottie/CustomLottie.tsx @@ -2,6 +2,7 @@ import Lottie from "react-lottie-player"; interface ICustomLottie { + // eslint-disable-next-line @typescript-eslint/no-explicit-any animationData: any; } diff --git a/src/app/shared/_components/post/post-body/post-body.tsx b/src/app/shared/_components/post/post-body/post-body.tsx index 59080de..3127e14 100644 --- a/src/app/shared/_components/post/post-body/post-body.tsx +++ b/src/app/shared/_components/post/post-body/post-body.tsx @@ -13,6 +13,7 @@ type MarkdownPostProps = { const PostBody: React.FC = ({ content }) => { // 단락을 처리하는 컴포넌트: 이미지가 있으면 div, 없으면 p로 렌더링 + // eslint-disable-next-line @typescript-eslint/no-explicit-any const ParagraphRenderer = ({ children, ...rest }: any) => { const hasImage = rest.node.children[0].tagName === "img"; diff --git a/src/app/shared/_components/post/post-card/post-card.stories.tsx b/src/app/shared/_components/post/post-card/post-card.stories.tsx index 44db207..be38878 100644 --- a/src/app/shared/_components/post/post-card/post-card.stories.tsx +++ b/src/app/shared/_components/post/post-card/post-card.stories.tsx @@ -1,5 +1,5 @@ import PostCard from "./post-card"; -import { Meta, StoryObj } from "@storybook/react"; +import { StoryObj } from "@storybook/react"; export default { title: "Components/Post/PostCard", component: PostCard, diff --git a/src/app/shared/_components/post/post-card/post-card.tsx b/src/app/shared/_components/post/post-card/post-card.tsx index 4bdf4f1..2cf607b 100644 --- a/src/app/shared/_components/post/post-card/post-card.tsx +++ b/src/app/shared/_components/post/post-card/post-card.tsx @@ -22,11 +22,11 @@ const getDomainUrl = (domain: string) => { } }; -// 카드의 고정 높이 상수 정의 -const CARD_HEIGHT_PX = 350; -const IMAGE_HEIGHT_PX = 180; -const METADATA_HEIGHT_PX = 40; // 카테고리와 날짜를 위한 공간 -const PADDING_PX = 16 * 2; // 상하 패딩 +// 카드의 고정 높이 상수 정의 (향후 사용 예정) +// const CARD_HEIGHT_PX = 350; +// const IMAGE_HEIGHT_PX = 180; +// const METADATA_HEIGHT_PX = 40; // 카테고리와 날짜를 위한 공간 +// const PADDING_PX = 16 * 2; // 상하 패딩 const PostCard: React.FC = ({ title, diff --git a/src/app/shared/_components/post/post-cards/post-cards.stories.tsx b/src/app/shared/_components/post/post-cards/post-cards.stories.tsx index 0063e18..86a0dbd 100644 --- a/src/app/shared/_components/post/post-cards/post-cards.stories.tsx +++ b/src/app/shared/_components/post/post-cards/post-cards.stories.tsx @@ -1,5 +1,5 @@ import PostCards from "./post-cards"; -import { Meta, StoryObj } from "@storybook/react"; +import { StoryObj } from "@storybook/react"; export default { title: "Components/Post/PostCards", diff --git a/src/app/shared/_components/post/post-cards/post-cards.tsx b/src/app/shared/_components/post/post-cards/post-cards.tsx index 81acdad..f8dd0a9 100644 --- a/src/app/shared/_components/post/post-cards/post-cards.tsx +++ b/src/app/shared/_components/post/post-cards/post-cards.tsx @@ -1,5 +1,4 @@ import React from "react"; -import Image from "next/image"; import PostCard from "../post-card/post-card"; type IPostCards = { diff --git a/src/app/shared/_components/post/post-comment.tsx b/src/app/shared/_components/post/post-comment.tsx index 2d558dd..6d4eabb 100644 --- a/src/app/shared/_components/post/post-comment.tsx +++ b/src/app/shared/_components/post/post-comment.tsx @@ -1,10 +1,10 @@ "use client"; -import React, { useCallback, useContext, useEffect, useState } from "react"; +import React, { useCallback, useEffect } from "react"; import { useTheme } from "next-themes"; const Giscus = () => { - const { resolvedTheme, setTheme } = useTheme(); + const { resolvedTheme } = useTheme(); const loadGiscus = useCallback(() => { const script = document.createElement("script"); diff --git a/src/app/shared/_components/post/post-toc/post-toc.stories.tsx b/src/app/shared/_components/post/post-toc/post-toc.stories.tsx index b822aa8..e7b747e 100644 --- a/src/app/shared/_components/post/post-toc/post-toc.stories.tsx +++ b/src/app/shared/_components/post/post-toc/post-toc.stories.tsx @@ -1,5 +1,5 @@ import PostToc from "./post-toc"; -import { Meta, StoryObj, Decorator } from "@storybook/react"; +import { StoryObj, Decorator } from "@storybook/react"; const withHeadings: Decorator = (Story) => ( <>
diff --git a/src/app/shared/_components/post/post-toc/post-toc.tsx b/src/app/shared/_components/post/post-toc/post-toc.tsx index 81f761e..ab4ed7c 100644 --- a/src/app/shared/_components/post/post-toc/post-toc.tsx +++ b/src/app/shared/_components/post/post-toc/post-toc.tsx @@ -21,6 +21,7 @@ const PostToc = () => { (a.target as HTMLElement).offsetTop - (b.target as HTMLElement).offsetTop, ); + // eslint-disable-next-line no-console console.log(visibleHeadings, "visibleHeadings"); if (visibleHeadings.length > 0) { setActiveId((visibleHeadings[0].target as HTMLElement).id); diff --git a/src/app/shared/_components/post/styled-markdown.tsx b/src/app/shared/_components/post/styled-markdown.tsx index 19d92c4..e033bb9 100644 --- a/src/app/shared/_components/post/styled-markdown.tsx +++ b/src/app/shared/_components/post/styled-markdown.tsx @@ -127,6 +127,7 @@ export const H3: React.FC<{ children: React.ReactNode }> = ({ ); }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export const Code: React.FC<{ children: React.ReactNode; className: any }> = ({ children, className, diff --git a/src/mocks/handlers.ts b/src/mocks/handlers.ts index f622689..f206592 100644 --- a/src/mocks/handlers.ts +++ b/src/mocks/handlers.ts @@ -1,3 +1,2 @@ -import { http, HttpResponse } from "msw"; import { handler } from "./handlers/index"; export const handlers = [...handler];