/** * ESLint Design Tokens 配置(P6 硬化) * * 强制设计令牌规范(project_rules §3.10): * - 禁止 #hex 颜色字面量(用 var(--*) 或 Tailwind bg-* 类) * - 禁止 'Inter'/'Fraunces'/'JetBrains Mono' 字体名字面量(用 var(--font-family-*)) * * 这是独立配置文件,不修改主 eslint 配置。 * 使用方式:eslint -c .eslintrc.tokens.js src * * 白名单(允许硬编码): * - primitive.css(Layer 1 原始色板定义) * - email-channel(邮件模板内联样式,邮件客户端不支持 CSS 变量) * - manifest.ts(PWA manifest 需要字面量颜色值) * * 关联:project_rules §3.10、02-architecture-design.md §9 */ // 使用 @typescript-eslint/parser 以支持 TS/TSX 语法 // (通过 Node.js 向上查找从根 node_modules 解析) let tsParser; try { tsParser = require('@typescript-eslint/parser'); } catch { // 依赖未安装时降级到默认 espree(仅 JS/JSX) tsParser = undefined; } /** @type {import('eslint').Linter.Config[]} */ module.exports = [ { // 目标文件:所有 TS/TSX/JS/JSX 源码 files: ['**/*.{ts,tsx,js,jsx}'], languageOptions: { parser: tsParser, ecmaVersion: 2024, sourceType: 'module', parserOptions: { ecmaFeatures: { jsx: true }, }, }, rules: { 'no-restricted-syntax': [ 'error', { // 禁止 #hex 颜色字面量(如 "#fff"、"#000000"、"#f5f5f5") selector: 'Literal[value=/^#[0-9a-fA-F]{3,8}$/]', message: '禁止硬编码颜色 #hex,使用 var(--*) 或 Tailwind bg-* 类(project_rules §3.10)', }, { // 禁止字体名字面量(next/font 的 import 标识符不受影响) selector: 'Literal[value=/^(Inter|Fraunces|JetBrains Mono)$/]', message: '禁止硬编码字体名字面量,使用 var(--font-family-sans/serif/mono)(project_rules §3.10)', }, ], }, }, { // 白名单:令牌原始定义、邮件通道、PWA manifest files: ['**/primitive.css', '**/email-channel*', '**/manifest.ts'], rules: { 'no-restricted-syntax': 'off', }, }, ];