From f77216d8f4d197227da56cdf8f04494aeaf9ad44 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 3 Dec 2025 16:11:51 +0800 Subject: [PATCH] feat: lint add pnpm config --- .../lint-configs/eslint-config/package.json | 1 + .../eslint-config/src/configs/index.ts | 1 + .../eslint-config/src/configs/pnpm.ts | 41 +++++++++++++++++++ .../lint-configs/eslint-config/src/index.ts | 2 + package.json | 22 +--------- pnpm-lock.yaml | 34 +++++++++++++++ pnpm-workspace.yaml | 16 ++++++++ 7 files changed, 96 insertions(+), 21 deletions(-) create mode 100644 internal/lint-configs/eslint-config/src/configs/pnpm.ts diff --git a/internal/lint-configs/eslint-config/package.json b/internal/lint-configs/eslint-config/package.json index 82206c55d..0727fd6ce 100644 --- a/internal/lint-configs/eslint-config/package.json +++ b/internal/lint-configs/eslint-config/package.json @@ -43,6 +43,7 @@ "eslint-plugin-n": "catalog:", "eslint-plugin-no-only-tests": "catalog:", "eslint-plugin-perfectionist": "catalog:", + "eslint-plugin-pnpm": "catalog:", "eslint-plugin-prettier": "catalog:", "eslint-plugin-regexp": "catalog:", "eslint-plugin-unicorn": "catalog:", diff --git a/internal/lint-configs/eslint-config/src/configs/index.ts b/internal/lint-configs/eslint-config/src/configs/index.ts index 3e08921f7..50f8e1cd5 100644 --- a/internal/lint-configs/eslint-config/src/configs/index.ts +++ b/internal/lint-configs/eslint-config/src/configs/index.ts @@ -8,6 +8,7 @@ export * from './jsdoc'; export * from './jsonc'; export * from './node'; export * from './perfectionist'; +export * from './pnpm'; export * from './prettier'; export * from './regexp'; export * from './test'; diff --git a/internal/lint-configs/eslint-config/src/configs/pnpm.ts b/internal/lint-configs/eslint-config/src/configs/pnpm.ts new file mode 100644 index 000000000..a3b28a7f6 --- /dev/null +++ b/internal/lint-configs/eslint-config/src/configs/pnpm.ts @@ -0,0 +1,41 @@ +import type { Linter } from 'eslint'; + +import { interopDefault } from '../util'; + +export async function pnpm(): Promise { + const [pluginPnpm, parserPnpm, parserJsonc] = await Promise.all([ + interopDefault(import('eslint-plugin-pnpm')), + interopDefault(import('yaml-eslint-parser')), + interopDefault(import('jsonc-eslint-parser')), + ] as const); + + return [ + { + files: ['package.json', '**/package.json'], + languageOptions: { + parser: parserJsonc, + }, + plugins: { + pnpm: pluginPnpm, + }, + rules: { + 'pnpm/json-enforce-catalog': 'error', + 'pnpm/json-prefer-workspace-settings': 'error', + 'pnpm/json-valid-catalog': 'error', + }, + }, + { + files: ['pnpm-workspace.yaml'], + languageOptions: { + parser: parserPnpm, + }, + plugins: { + pnpm: pluginPnpm, + }, + rules: { + 'pnpm/yaml-no-duplicate-catalog-item': 'error', + 'pnpm/yaml-no-unused-catalog-item': 'error', + }, + }, + ]; +} diff --git a/internal/lint-configs/eslint-config/src/index.ts b/internal/lint-configs/eslint-config/src/index.ts index ae710544b..d3bbf5754 100644 --- a/internal/lint-configs/eslint-config/src/index.ts +++ b/internal/lint-configs/eslint-config/src/index.ts @@ -11,6 +11,7 @@ import { jsonc, node, perfectionist, + pnpm, prettier, regexp, test, @@ -50,6 +51,7 @@ async function defineConfig(config: FlatConfig[] = []) { command(), turbo(), yaml(), + pnpm(), ...customConfig, ...config, ]; diff --git a/package.json b/package.json index 0d6b6c908..cd1e0f733 100644 --- a/package.json +++ b/package.json @@ -100,25 +100,5 @@ "node": ">=20.12.0", "pnpm": ">=10.0.0" }, - "packageManager": "pnpm@10.22.0", - "pnpm": { - "peerDependencyRules": { - "allowedVersions": { - "eslint": "*" - } - }, - "overrides": { - "@ast-grep/napi": "catalog:", - "@ctrl/tinycolor": "catalog:", - "clsx": "catalog:", - "esbuild": "0.25.3", - "jiti": "catalog:", - "pinia": "catalog:", - "vue": "catalog:" - }, - "neverBuiltDependencies": [ - "canvas", - "node-gyp" - ] - } + "packageManager": "pnpm@10.22.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f99739f92..b4aa20be9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -255,6 +255,9 @@ catalogs: eslint-plugin-perfectionist: specifier: ^4.15.1 version: 4.15.1 + eslint-plugin-pnpm: + specifier: ^1.3.0 + version: 1.3.0 eslint-plugin-prettier: specifier: ^5.5.4 version: 5.5.4 @@ -1026,6 +1029,9 @@ importers: eslint-plugin-perfectionist: specifier: 'catalog:' version: 4.15.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-pnpm: + specifier: 'catalog:' + version: 1.3.0(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-prettier: specifier: 'catalog:' version: 5.5.4(@types/eslint@9.6.1)(eslint@9.39.1(jiti@2.6.1))(prettier@3.7.4) @@ -6213,6 +6219,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -6423,6 +6433,11 @@ packages: peerDependencies: eslint: '>=8.45.0' + eslint-plugin-pnpm@1.3.0: + resolution: {integrity: sha512-Lkdnj3afoeUIkDUu8X74z60nrzjQ2U55EbOeI+qz7H1He4IO4gmUKT2KQIl0It52iMHJeuyLDWWNgjr6UIK8nw==} + peerDependencies: + eslint: ^9.0.0 + eslint-plugin-prettier@5.5.4: resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -8449,6 +8464,9 @@ packages: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} + pnpm-workspace-yaml@1.3.0: + resolution: {integrity: sha512-Krb5q8Totd5mVuLx7we+EFHq/AfxA75nbfTm25Q1pIf606+RlaKUG+PXH8SDihfe5b5k4H09gE+sL47L1t5lbw==} + popmotion@11.0.5: resolution: {integrity: sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==} @@ -15521,6 +15539,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@2.0.0: {} + encodeurl@2.0.0: {} encoding-sniffer@0.2.1: @@ -15819,6 +15839,16 @@ snapshots: - supports-color - typescript + eslint-plugin-pnpm@1.3.0(eslint@9.39.1(jiti@2.6.1)): + dependencies: + empathic: 2.0.0 + eslint: 9.39.1(jiti@2.6.1) + jsonc-eslint-parser: 2.4.1 + pathe: 2.0.3 + pnpm-workspace-yaml: 1.3.0 + tinyglobby: 0.2.15 + yaml-eslint-parser: 1.3.1 + eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint@9.39.1(jiti@2.6.1))(prettier@3.7.4): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -17940,6 +17970,10 @@ snapshots: pngjs@5.0.0: {} + pnpm-workspace-yaml@1.3.0: + dependencies: + yaml: 2.8.2 + popmotion@11.0.5: dependencies: framesync: 6.1.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b01e1f7b1..814b007c1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,6 @@ +neverBuiltDependencies: + - canvas + - node-gyp packages: - internal/* - internal/lint-configs/* @@ -101,6 +104,7 @@ catalog: eslint-plugin-n: ^17.23.1 eslint-plugin-no-only-tests: ^3.3.0 eslint-plugin-perfectionist: ^4.15.1 + eslint-plugin-pnpm: ^1.3.0 eslint-plugin-prettier: ^5.5.4 eslint-plugin-regexp: ^2.10.0 eslint-plugin-unicorn: ^62.0.0 @@ -197,3 +201,15 @@ catalog: yaml-eslint-parser: ^1.3.1 zod: ^3.25.67 zod-defaults: 0.1.3 + esbuild: 0.25.3 +peerDependencyRules: + allowedVersions: + eslint: '*' +overrides: + '@ast-grep/napi': 'catalog:' + '@ctrl/tinycolor': 'catalog:' + clsx: 'catalog:' + esbuild: 'catalog:' + jiti: 'catalog:' + pinia: 'catalog:' + vue: 'catalog:'