From 485b5e91ba38a407ffff916fe48b9596cb445e34 Mon Sep 17 00:00:00 2001 From: yceffort Date: Wed, 26 Feb 2025 23:33:49 +0900 Subject: [PATCH 1/2] [#82] feat: add ESLint rule to ensure peerDependencies are also in devDependencies --- packages/eslint-plugin/lib/index.js | 2 + .../lib/rules/peer-deps-in-dev-deps.js.js | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js.js diff --git a/packages/eslint-plugin/lib/index.js b/packages/eslint-plugin/lib/index.js index cb66792..ad56814 100644 --- a/packages/eslint-plugin/lib/index.js +++ b/packages/eslint-plugin/lib/index.js @@ -2,6 +2,7 @@ import pkg from '../package.json' import importServerOnly from './rules/import-server-only' import memoReactComponents from './rules/memo-react-components.js' import optimizeSvgComponents from './rules/optimize-svg-components.js' +import peerDepsInDevDeps from './rules/peer-deps-in-dev-deps.js' import preventDefaultImport from './rules/prevent-default-import.js' import sortExports from './rules/sort-exports.js' import svgUniqueId from './rules/svg-unique-id.js' @@ -18,6 +19,7 @@ const plugin = { 'sort-exports': sortExports, 'svg-unique-id': svgUniqueId, 'import-server-only': importServerOnly, + 'peer-deps-in-dev-deps': peerDepsInDevDeps, }, } diff --git a/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js.js b/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js.js new file mode 100644 index 0000000..0cccbad --- /dev/null +++ b/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js.js @@ -0,0 +1,51 @@ +import path from 'path' + +export default { + meta: { + type: 'problem', + docs: { + description: 'Ensure that all peerDependencies are also declared in devDependencies.', + recommended: false, + }, + fixable: null, + schema: [], + messages: { + missingInDevDeps: "'{{packageName}}' is declared in peerDependencies but not in devDependencies.", + }, + }, + + create(context) { + return { + Program(node) { + const filename = path.basename(context.getFilename()) + if (filename !== 'package.json') { + return + } + + const sourceCode = context.getSourceCode().getText() + let json + + try { + json = JSON.parse(sourceCode) + } catch (error) { + // eslint-disable-next-line no-console + console.error('Failed to parse package.json:', error) + return + } + + const peerDeps = json.peerDependencies || {} + const devDeps = json.devDependencies || {} + + for (const [depName] of Object.entries(peerDeps)) { + if (!Object.prototype.hasOwnProperty.call(devDeps, depName)) { + context.report({ + node, + messageId: 'missingInDevDeps', + data: {packageName: depName}, + }) + } + } + }, + } + }, +} From 5ba84c584c0010a436275e19bf72a677a3481c35 Mon Sep 17 00:00:00 2001 From: yceffort_naver <158988311+yceffort-naver@users.noreply.github.com> Date: Wed, 26 Feb 2025 23:56:25 +0900 Subject: [PATCH 2/2] Create clever-ghosts-smell.md --- .changeset/clever-ghosts-smell.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/clever-ghosts-smell.md diff --git a/.changeset/clever-ghosts-smell.md b/.changeset/clever-ghosts-smell.md new file mode 100644 index 0000000..3946ebb --- /dev/null +++ b/.changeset/clever-ghosts-smell.md @@ -0,0 +1,7 @@ +--- +"@naverpay/eslint-plugin": minor +--- + +Add ESLint rule ensuring peerDependencies are also declared in devDependencies + +PR: [Add ESLint rule ensuring peerDependencies are also declared in devDependencies](https://github.com/NaverPayDev/code-style/pull/90)