diff --git a/.changeset/big-geese-change.md b/.changeset/big-geese-change.md new file mode 100644 index 0000000..6bb2671 --- /dev/null +++ b/.changeset/big-geese-change.md @@ -0,0 +1,7 @@ +--- +"@naverpay/eslint-plugin": patch +--- + +improve report location in peer-deps-in-dev-deps + +PR: [[eslint-plugin] peer-deps-in-dev-deps](https://github.com/NaverPayDev/code-style/pull/102) diff --git a/.changeset/polite-carpets-raise.md b/.changeset/polite-carpets-raise.md new file mode 100644 index 0000000..954c94b --- /dev/null +++ b/.changeset/polite-carpets-raise.md @@ -0,0 +1,9 @@ +--- +"@naverpay/eslint-plugin": patch +"@naverpay/prettier-config": patch +"@naverpay/stylelint-config": patch +--- + +Add dependency in peerDependencies into devDependencies + +PR: [[eslint-plugin] peer-deps-in-dev-deps](https://github.com/NaverPayDev/code-style/pull/102) diff --git a/eslint.config.mjs b/eslint.config.mjs index 3ff2372..60ed863 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,5 @@ import naverpay from '@naverpay/eslint-config' +import naverpayPlugin from '@naverpay/eslint-plugin' export default [ { @@ -6,4 +7,11 @@ export default [ }, ...naverpay.configs.node, ...naverpay.configs.packageJson, + { + files: ['**/package.json'], + plugins: {'@naverpay': naverpayPlugin}, + rules: { + '@naverpay/peer-deps-in-dev-deps': 'error', + }, + }, ] diff --git a/packages/eslint-plugin/docs/peer-deps-in-dev-deps.md b/packages/eslint-plugin/docs/peer-deps-in-dev-deps.md index 0f938cc..57dcdce 100644 --- a/packages/eslint-plugin/docs/peer-deps-in-dev-deps.md +++ b/packages/eslint-plugin/docs/peer-deps-in-dev-deps.md @@ -71,12 +71,19 @@ ## 설정 -```json -{ - "rules": { - "@naverpay/peer-deps-in-dev-deps": "error" - } -} +```js +import naverpayPlugin from '@naverpay/eslint-plugin' + +// eslint.config.js +export default [ + { + files: ["**/package.json"], + plugins: {'@naverpay': naverpayPlugin}, + rules: { + '@naverpay/peer-deps-in-dev-deps': 'error', + }, + }, +] ``` ## 제한 @@ -84,3 +91,23 @@ - 이 규칙은 수정(fixable) 기능을 제공하지 않으므로, 자동으로 `devDependencies`에 패키지를 추가해주지 않습니다. 경고 혹은 에러를 보고하면 수동으로 `package.json` 파일을 수정해야 합니다. - 개발하시는 패키지에서 필요한 버전을 특정할 수 없어 발생한 제약 입니다. - 파일명이 정확히 `package.json`이 아니면 검사 대상에서 제외됩니다. +- 만약, eslint.config.js 내에 json 파일에 대해 이미 사용하고 parser가 없다면 jsonc-eslint-parser를 추가해주세요. + + ```js + // eslint.config.js + import naverpayPlugin from '@naverpay/eslint-plugin' + import * as parserJsonc from 'jsonc-eslint-parser' + + export default [ + { + files: ["**/package.json"], + languageOptions: { + parser: parserJsonc, + }, + plugins: {'@naverpay': naverpayPlugin}, + rules: { + '@naverpay/peer-deps-in-dev-deps': 'error', + }, + }, + ] + ``` diff --git a/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js b/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js index 0cccbad..877dcae 100644 --- a/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js +++ b/packages/eslint-plugin/lib/rules/peer-deps-in-dev-deps.js @@ -1,5 +1,8 @@ import path from 'path' +/** + * @type {import('eslint').Rule.RuleModule} + */ export default { meta: { type: 'problem', @@ -22,11 +25,11 @@ export default { return } - const sourceCode = context.getSourceCode().getText() + const sourceCode = context.sourceCode ?? context.getSourceCode() let json try { - json = JSON.parse(sourceCode) + json = JSON.parse(sourceCode.getText()) } catch (error) { // eslint-disable-next-line no-console console.error('Failed to parse package.json:', error) @@ -36,12 +39,20 @@ export default { const peerDeps = json.peerDependencies || {} const devDeps = json.devDependencies || {} + const peerDepsNode = sourceCode.ast.body[0].expression.properties.find( + (property) => property.key.value === 'peerDependencies', + ) + const devDepsNode = sourceCode.ast.body[0].expression.properties.find( + (property) => property.key.value === 'devDependencies', + ) + for (const [depName] of Object.entries(peerDeps)) { if (!Object.prototype.hasOwnProperty.call(devDeps, depName)) { context.report({ node, messageId: 'missingInDevDeps', data: {packageName: depName}, + loc: devDepsNode?.loc || peerDepsNode?.loc, }) } } diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index c58fbde..d9e077b 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -48,6 +48,7 @@ "@babel/preset-react": "^7.24.7", "@typescript-eslint/parser": "^8.15.0", "builtin-modules": "^4.0.0", + "eslint": "^9.17.0", "vitest": "^2.1.5" }, "peerDependencies": { diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index 2c8cf6a..4631eb1 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -16,6 +16,9 @@ "license": "MIT", "author": "@NaverPayDev/frontend", "main": "index.json", + "devDependencies": { + "prettier": "^3.5.3" + }, "peerDependencies": { "prettier": "^2.8.8 || ^3.0.0" } diff --git a/packages/stylelint-config/package.json b/packages/stylelint-config/package.json index c03c6bb..94ffdfe 100644 --- a/packages/stylelint-config/package.json +++ b/packages/stylelint-config/package.json @@ -16,6 +16,13 @@ "license": "MIT", "author": "@NaverPayDev/frontend", "main": "index.js", + "devDependencies": { + "postcss": "^8.4.8", + "postcss-scss": "^4.0.3", + "stylelint": "^14.2.0", + "stylelint-order": "^5.0.0", + "stylelint-scss": "^4.1.0" + }, "peerDependencies": { "postcss": "^8.4.8", "postcss-scss": "^4.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e853bf5..2e28742 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,9 +113,6 @@ importers: '@naverpay/ast-parser': specifier: ^0.0.2 version: 0.0.2(typescript@5.3.3) - eslint: - specifier: '>=8.57.0' - version: 9.17.0 micromatch: specifier: ^4.0.8 version: 4.0.8 @@ -138,6 +135,9 @@ importers: builtin-modules: specifier: ^4.0.0 version: 4.0.0 + eslint: + specifier: ^9.17.0 + version: 9.17.0 vitest: specifier: ^2.1.5 version: 2.1.5(sass-embedded@1.85.1)(terser@5.36.0) @@ -159,13 +159,13 @@ importers: version: 0.32.1 packages/prettier-config: - dependencies: + devDependencies: prettier: - specifier: ^2.8.8 || ^3.0.0 - version: 3.2.5 + specifier: ^3.5.3 + version: 3.5.3 packages/stylelint-config: - dependencies: + devDependencies: postcss: specifier: ^8.4.8 version: 8.4.49 @@ -3898,6 +3898,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6093,7 +6098,7 @@ snapshots: '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -9231,6 +9236,8 @@ snapshots: prettier@3.2.5: {} + prettier@3.5.3: {} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3