Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 18:46:18 +08:00
commit d17645f670
10 changed files with 744 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
# Dependencies
node_modules
package-lock.json
yarn.lock
pnpm-lock.yaml
# Build outputs
.next
out
dist
build
coverage
# Logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Environment files
.env*.local
# Public assets
public/static
public/images
# Generated files
*.min.js
*.min.css
# IDE
.vscode
.idea

View File

@@ -0,0 +1,13 @@
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"useTabs": false,
"trailingComma": "es5",
"printWidth": 100,
"arrowParens": "always",
"endOfLine": "lf",
"bracketSpacing": true,
"jsxSingleQuote": false,
"proseWrap": "preserve"
}

View File

@@ -0,0 +1,112 @@
import js from '@eslint/js';
import react from 'eslint-plugin-react';
import reactHooks from 'eslint-plugin-react-hooks';
import jsxA11y from 'eslint-plugin-jsx-a11y';
import tseslint from 'typescript-eslint';
import prettier from 'eslint-config-prettier';
export default [
// Ignore patterns
{
ignores: [
'.next/**',
'out/**',
'dist/**',
'build/**',
'node_modules/**',
'*.config.js',
'*.config.mjs',
'coverage/**',
],
},
// Base JavaScript config
js.configs.recommended,
// TypeScript config
...tseslint.configs.recommended,
// React plugin config
{
files: ['**/*.{js,jsx,ts,tsx}'],
plugins: {
react,
'react-hooks': reactHooks,
'jsx-a11y': jsxA11y,
},
languageOptions: {
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
ecmaFeatures: {
jsx: true,
},
},
globals: {
window: 'readonly',
document: 'readonly',
navigator: 'readonly',
console: 'readonly',
setTimeout: 'readonly',
clearTimeout: 'readonly',
setInterval: 'readonly',
clearInterval: 'readonly',
Promise: 'readonly',
fetch: 'readonly',
FormData: 'readonly',
Headers: 'readonly',
Request: 'readonly',
Response: 'readonly',
URL: 'readonly',
URLSearchParams: 'readonly',
process: 'readonly',
},
},
settings: {
react: {
version: 'detect',
},
},
rules: {
// React rules
'react/react-in-jsx-scope': 'off', // Not needed in Next.js
'react/prop-types': 'off', // Using TypeScript for prop validation
'react/jsx-uses-react': 'error',
'react/jsx-uses-vars': 'error',
'react/jsx-key': 'error',
'react/no-array-index-key': 'warn',
'react/no-unescaped-entities': 'warn',
// React Hooks rules
'react-hooks/rules-of-hooks': 'error',
'react-hooks/exhaustive-deps': 'warn',
// Accessibility rules
'jsx-a11y/alt-text': 'warn',
'jsx-a11y/anchor-is-valid': 'warn',
'jsx-a11y/aria-props': 'warn',
'jsx-a11y/aria-unsupported-elements': 'warn',
'jsx-a11y/role-has-required-aria-props': 'warn',
// TypeScript rules
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/explicit-module-boundary-types': 'off',
// General rules
'no-console': ['warn', { allow: ['warn', 'error'] }],
'no-unused-vars': 'off', // Using TypeScript version instead
'prefer-const': 'error',
'no-var': 'error',
},
},
// Prettier config (must be last to override other formatting rules)
prettier,
];

View File

@@ -0,0 +1,30 @@
name: Lint
on:
push:
branches: [main, master]
pull_request:
branches: [main, master]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run ESLint
run: npm run lint
- name: Check formatting
run: npm run format:check