Skip to content

Commit d5e767a

Browse files
Copilotkalwalt
andcommitted
Add ESLint, Husky, lint-staged and CI workflow for format/lint enforcement
Co-authored-by: kalwalt <[email protected]>
1 parent 51cc5a2 commit d5e767a

File tree

6 files changed

+1579
-5
lines changed

6 files changed

+1579
-5
lines changed

.editorconfig

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
insert_final_newline = true
6+
charset = utf-8
7+
indent_style = space
8+
indent_size = 2
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: Format and Lint
2+
3+
on:
4+
pull_request:
5+
push:
6+
branches: [main, dev, 'copilot/**']
7+
8+
jobs:
9+
format-lint:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- name: Checkout
13+
uses: actions/checkout@v4
14+
15+
- name: Use Node
16+
uses: actions/setup-node@v4
17+
with:
18+
node-version: 20
19+
cache: npm
20+
21+
- name: Install
22+
run: npm ci
23+
24+
- name: Prettier check
25+
run: npm run format-check
26+
27+
- name: ESLint
28+
run: npm run lint

.husky/pre-commit

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env sh
2+
. "$(dirname -- "$0")/_/husky.sh"
3+
4+
# Only format and lint what's staged (fast)
5+
npx lint-staged

eslint.config.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import js from '@eslint/js';
2+
import prettier from 'eslint-config-prettier';
3+
4+
export default [
5+
{
6+
ignores: ['dist/', 'node_modules/', 'coverage/', 'types/'],
7+
},
8+
js.configs.recommended,
9+
prettier,
10+
{
11+
languageOptions: {
12+
ecmaVersion: 2022,
13+
sourceType: 'module',
14+
globals: {
15+
// Browser globals
16+
window: 'readonly',
17+
document: 'readonly',
18+
navigator: 'readonly',
19+
console: 'readonly',
20+
alert: 'readonly',
21+
HTMLElement: 'readonly',
22+
HTMLVideoElement: 'readonly',
23+
HTMLCanvasElement: 'readonly',
24+
Image: 'readonly',
25+
ImageData: 'readonly',
26+
fetch: 'readonly',
27+
CustomEvent: 'readonly',
28+
MediaStream: 'readonly',
29+
performance: 'readonly',
30+
screen: 'readonly',
31+
location: 'readonly',
32+
WebAssembly: 'readonly',
33+
setTimeout: 'readonly',
34+
clearTimeout: 'readonly',
35+
setInterval: 'readonly',
36+
clearInterval: 'readonly',
37+
requestAnimationFrame: 'readonly',
38+
cancelAnimationFrame: 'readonly',
39+
// Node.js globals
40+
process: 'readonly',
41+
__dirname: 'readonly',
42+
__filename: 'readonly',
43+
require: 'readonly',
44+
module: 'readonly',
45+
exports: 'readonly',
46+
// Testing globals (vitest)
47+
describe: 'readonly',
48+
test: 'readonly',
49+
it: 'readonly',
50+
expect: 'readonly',
51+
beforeEach: 'readonly',
52+
afterEach: 'readonly',
53+
beforeAll: 'readonly',
54+
afterAll: 'readonly',
55+
vi: 'readonly',
56+
// AR.js specific globals
57+
ArToolkitContext: 'writable',
58+
ArMarkerControls: 'writable',
59+
},
60+
},
61+
rules: {
62+
// Relax rules for existing codebase patterns
63+
'no-empty': 'off',
64+
'no-unused-vars': 'off',
65+
'no-unused-private-class-members': 'off',
66+
'no-redeclare': 'off',
67+
},
68+
},
69+
];

0 commit comments

Comments
 (0)