This commit is contained in:
Stephen Zhou
2026-02-06 20:57:56 +08:00
parent fec5c10195
commit 3a130a5630
6 changed files with 13 additions and 122 deletions

View File

@ -2,9 +2,7 @@ import consistentPlaceholders from './rules/consistent-placeholders.js'
import noAsAnyInT from './rules/no-as-any-in-t.js'
import noExtraKeys from './rules/no-extra-keys.js'
import noLegacyNamespacePrefix from './rules/no-legacy-namespace-prefix.js'
import noVersionPrefix from './rules/no-version-prefix.js'
import requireNsOption from './rules/require-ns-option.js'
import validI18nKeys from './rules/valid-i18n-keys.js'
/** @type {import('eslint').ESLint.Plugin} */
const plugin = {
@ -17,9 +15,7 @@ const plugin = {
'no-as-any-in-t': noAsAnyInT,
'no-extra-keys': noExtraKeys,
'no-legacy-namespace-prefix': noLegacyNamespacePrefix,
'no-version-prefix': noVersionPrefix,
'require-ns-option': requireNsOption,
'valid-i18n-keys': validI18nKeys,
},
}

View File

@ -1,45 +0,0 @@
const DEPENDENCY_KEYS = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']
const VERSION_PREFIXES = ['^', '~']
/** @type {import('eslint').Rule.RuleModule} */
export default {
meta: {
type: 'problem',
docs: {
description: `Ensure package.json dependencies do not use version prefixes (${VERSION_PREFIXES.join(' or ')})`,
},
fixable: 'code',
},
create(context) {
const { filename } = context
if (!filename.endsWith('package.json'))
return {}
const selector = `JSONProperty:matches(${DEPENDENCY_KEYS.map(k => `[key.value="${k}"]`).join(', ')}) > JSONObjectExpression > JSONProperty`
return {
[selector](node) {
const versionNode = node.value
if (versionNode && versionNode.type === 'JSONLiteral' && typeof versionNode.value === 'string') {
const version = versionNode.value
const foundPrefix = VERSION_PREFIXES.find(prefix => version.startsWith(prefix))
if (foundPrefix) {
const packageName = node.key.value || node.key.name
const cleanVersion = version.substring(1)
const canAutoFix = /^\d+\.\d+\.\d+$/.test(cleanVersion)
context.report({
node: versionNode,
message: `Dependency "${packageName}" has version prefix "${foundPrefix}" that should be removed (found: "${version}", expected: "${cleanVersion}")`,
fix: canAutoFix
? fixer => fixer.replaceText(versionNode, `"${cleanVersion}"`)
: undefined,
})
}
}
},
}
},
}

View File

@ -1,61 +0,0 @@
import { cleanJsonText } from '../utils.js'
/** @type {import('eslint').Rule.RuleModule} */
export default {
meta: {
type: 'problem',
docs: {
description: 'Ensure i18n JSON keys are flat and valid as object paths',
},
},
create(context) {
return {
Program(node) {
const { filename, sourceCode } = context
if (!filename.endsWith('.json'))
return
let json
try {
json = JSON.parse(cleanJsonText(sourceCode.text))
}
catch {
context.report({
node,
message: 'Invalid JSON format',
})
return
}
const keys = Object.keys(json)
const keyPrefixes = new Set()
for (const key of keys) {
if (key.includes('.')) {
const parts = key.split('.')
for (let i = 1; i < parts.length; i++) {
const prefix = parts.slice(0, i).join('.')
if (keys.includes(prefix)) {
context.report({
node,
message: `Invalid key structure: '${key}' conflicts with '${prefix}'`,
})
}
keyPrefixes.add(prefix)
}
}
}
for (const key of keys) {
if (keyPrefixes.has(key)) {
context.report({
node,
message: `Invalid key structure: '${key}' is a prefix of another key`,
})
}
}
},
}
},
}

View File

@ -80,13 +80,14 @@ export default antfu(
},
},
{
plugins: { dify },
name: 'dify/custom/setup',
plugins: {
dify,
hyoban,
},
},
{
files: ['**/*.tsx'],
plugins: {
hyoban,
},
rules: {
'hyoban/prefer-tailwind-icons': ['warn', {
prefix: 'i-',
@ -128,7 +129,7 @@ export default antfu(
'max-lines': 'off',
'jsonc/sort-keys': 'error',
'dify/valid-i18n-keys': 'error',
'hyoban/i18n-flat-key': 'error',
'dify/no-extra-keys': 'error',
'dify/consistent-placeholders': 'error',
},
@ -136,7 +137,7 @@ export default antfu(
{
files: ['**/package.json'],
rules: {
'dify/no-version-prefix': 'error',
'hyoban/no-dependency-version-prefix': 'error',
},
},
)

View File

@ -217,7 +217,7 @@
"esbuild": "0.27.2",
"eslint": "9.39.2",
"eslint-plugin-better-tailwindcss": "https://pkg.pr.new/hyoban/eslint-plugin-better-tailwindcss@c0161c7",
"eslint-plugin-hyoban": "0.9.4",
"eslint-plugin-hyoban": "0.10.1",
"eslint-plugin-react-hooks": "7.0.1",
"eslint-plugin-react-refresh": "0.5.0",
"eslint-plugin-sonarjs": "3.0.6",

10
web/pnpm-lock.yaml generated
View File

@ -526,8 +526,8 @@ importers:
specifier: https://pkg.pr.new/hyoban/eslint-plugin-better-tailwindcss@c0161c7
version: https://pkg.pr.new/hyoban/eslint-plugin-better-tailwindcss@c0161c7(eslint@9.39.2(jiti@1.21.7))(tailwindcss@3.4.19(tsx@4.21.0)(yaml@2.8.2))(typescript@5.9.3)
eslint-plugin-hyoban:
specifier: 0.9.4
version: 0.9.4(eslint@9.39.2(jiti@1.21.7))
specifier: 0.10.1
version: 0.10.1(eslint@9.39.2(jiti@1.21.7))
eslint-plugin-react-hooks:
specifier: 7.0.1
version: 7.0.1(eslint@9.39.2(jiti@1.21.7))
@ -4577,8 +4577,8 @@ packages:
peerDependencies:
eslint: '>=8'
eslint-plugin-hyoban@0.9.4:
resolution: {integrity: sha512-3UUeMLkcox88/i5TyDm6r5f1K1TWW9X7L1N7byXtOhPTbB2D7Fe9y3fT9poMiFjkBa5na9tAbcjaTQ2VMn683Q==}
eslint-plugin-hyoban@0.10.1:
resolution: {integrity: sha512-fQhK6COgm4branMemO0c52XNRYMLNW19jAhjBLS90Lup+QdzTEsFF9xDq8UA7JhID2wF+wDXBjTjEqUux6ZjfA==}
peerDependencies:
eslint: '*'
@ -12113,7 +12113,7 @@ snapshots:
eslint: 9.39.2(jiti@1.21.7)
eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@1.21.7))
eslint-plugin-hyoban@0.9.4(eslint@9.39.2(jiti@1.21.7)):
eslint-plugin-hyoban@0.10.1(eslint@9.39.2(jiti@1.21.7)):
dependencies:
eslint: 9.39.2(jiti@1.21.7)