AR-Test-Demo/avatar-h5-renderer/eslint.config.mjs
zyc 72e7df09cd Initial commit: AR avatar prototype
包含三个子项目:
- avatar-h5-renderer: Live2D Cubism 4 H5 渲染器 (Vite + TS)
- avatar_flutter_app: Flutter 容器 App (打包 H5 进 WebView)
- gif-export: puppeteer 导出 32 个动作的透明 GIF (供 ESP32 圆屏播放)

模型资源: Haru, Natori (含贴图、moc3、motions, expressions)
设计文档: AI驱动虚拟形象渲染方案_v5.1.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 11:14:10 +08:00

169 lines
4.4 KiB
JavaScript

import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import globals from 'globals';
import eslintConfigPrettier from 'eslint-config-prettier';
import eslintPluginPrettier from 'eslint-plugin-prettier';
export default tseslint.config(
eslint.configs.recommended,
tseslint.configs.eslintRecommended,
...tseslint.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
eslintConfigPrettier,
{
languageOptions:
{
parserOptions:
{
sourceType: 'module',
ecmaVersion: 2020,
project: './tsconfig.json',
},
globals:
{
...globals.browser,
},
},
plugins:
{
'prettier': eslintPluginPrettier,
},
rules:
{
'prettier/prettier': [
'error',
{
singleQuote: true,
trailingComma: 'none',
arrowParens: 'avoid',
}
],
camelcase: 'off',
'@typescript-eslint/naming-convention': [
'warn',
{
selector: 'default',
format: ['camelCase'],
},
{
selector: 'import',
format: ['PascalCase'],
},
{
selector: 'variable',
format: [],
custom: {
// 指定の文字列で始まるものと特定の文字を含むものは許容
regex: '^[A-Z]|^csm|^iterator|Shader',
match: true,
},
modifiers: ['exported', 'const'],
},
{
selector: 'variable',
format: ['camelCase'],
},
{
selector: 'variable',
format: [],
custom: {
// 指定の文字列で始まるものは許容
regex: '^[A-Z]|^s_',
match: true,
},
modifiers: ['global']
},
{
selector: 'enum',
format: ['PascalCase'],
},
{
selector: 'enumMember',
format: [],
custom: {
// 大文字から始まること
regex: '^[A-Z]',
match: true,
}
},
{
selector: 'classProperty',
format: ['PascalCase'],
modifiers: ['static', 'readonly']
},
{
selector: 'classProperty',
format: ['camelCase'],
leadingUnderscore: 'allow',
},
{
selector: 'class',
format: [],
custom: {
// 指定の文字列で始まるか、指定の文字列で終わること
regex: '^[A-Z]|^csm|^iterator|_WebGL$',
match: true,
}
},
{
selector: 'interface',
format: ['camelCase', 'PascalCase'],
},
{
selector: 'parameter',
format: ['camelCase'],
},
{
selector: 'classMethod',
format: ['camelCase'],
},
{
selector: 'objectLiteralProperty',
format: ['camelCase', 'PascalCase'],
},
{
selector: 'typeAlias',
format: [],
custom: {
// 指定の文字列で始まるものは許容
regex: '^[A-Z]|^[a-z]|^CSM_|^csm|^iterator',
match: true,
},
modifiers: ['exported']
},
{
selector: 'typeAlias',
format: ['camelCase'],
},
{
selector: 'typeParameter',
format: [],
custom:
{
// 「大文字+アンダースコア以外の文字」、あるいは「大文字1文字」
// あるいは、「`T`+アンダースコア」で始まる場合
regex: '^[A-Z][^_]|^[A-Z]|^T_$',
match: true,
},
leadingUnderscore: 'allow',
},
], // @typescript-eslint/naming-convention
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/unbound-method': 'off',
'@typescript-eslint/no-unsafe-assignment': 'off',
'@typescript-eslint/no-unsafe-return': 'off',
'@typescript-eslint/no-floating-promises': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-explicit-any': 'off',
},
},
{
// ignores property はなぜか単独で指定していないと効果がない。
ignores: [
'**/*.*',
'!src/**/*.ts',
],
},
);