diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 000000000..5ee7abd87 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged diff --git a/package.json b/package.json index 7a4549cba..942c86f0d 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "test": "vitest run", "test:coverage": "vitest run --coverage", "test:e2e": "playwright test", - "supabase:generate-types": "npx supabase@latest gen types typescript --local > src/types/supabase.ts" + "supabase:generate-types": "npx supabase@latest gen types typescript --local > src/types/supabase.ts", + "prepare": "husky" }, "dependencies": { "@anthropic-ai/sdk": "^0.107.0", @@ -57,6 +58,15 @@ "swagger-ui-react": "5.32.6", "tailwind-merge": "^3.6.0" }, + "lint-staged": { + "*.{js,jsx,ts,tsx}": [ + "eslint --fix", + "prettier --write" + ], + "*.{json,css,md}": [ + "prettier --write" + ] + }, "devDependencies": { "@emnapi/core": "^1.11.0", "@emnapi/runtime": "^1.11.0", @@ -77,8 +87,11 @@ "autoprefixer": "^10.5.2", "eslint": "^9.39.4", "eslint-config-next": "16.2.9", + "husky": "^9.1.7", "jsdom": "^29.1.1", + "lint-staged": "^17.2.0", "postcss": "^8.5.16", + "prettier": "^3.9.6", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1", "tree-sitter": "^0.25.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 69cd44ce1..77204e4ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -195,18 +195,27 @@ importers: eslint-config-next: specifier: 16.2.9 version: 16.2.9(@typescript-eslint/parser@8.62.1(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) + husky: + specifier: ^9.1.7 + version: 9.1.7 jsdom: specifier: ^29.1.1 version: 29.1.1 + lint-staged: + specifier: ^17.2.0 + version: 17.2.0 postcss: specifier: '>=8.4.31' version: 8.5.16 + prettier: + specifier: ^3.9.6 + version: 3.9.6 tailwind-scrollbar: specifier: ^3.1.0 - version: 3.1.0(tailwindcss@3.4.19) + version: 3.1.0(tailwindcss@3.4.19(yaml@2.9.0)) tailwindcss: specifier: ^3.4.1 - version: 3.4.19 + version: 3.4.19(yaml@2.9.0) tree-sitter: specifier: ^0.25.0 version: 0.25.0 @@ -218,7 +227,7 @@ importers: version: 6.0.3 vitest: specifier: ^4.1.8 - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0)) web-tree-sitter: specifier: ^0.26.10 version: 0.26.10 @@ -4343,6 +4352,11 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + iceberg-js@0.8.1: resolution: {integrity: sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==} engines: {node: '>=20.0.0'} @@ -4870,6 +4884,11 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lint-staged@17.2.0: + resolution: {integrity: sha512-FchGnFe4i4B1C/a35SPU9bNGPEHSC1+1iV0plLjzBmKVe9klZrlRfSgK6Cw4VeHyqOXbJUXP0vON61uRftNQ0A==} + engines: {node: '>=22.22.1'} + hasBin: true + loader-runner@4.3.2: resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} @@ -5412,6 +5431,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -5512,6 +5535,11 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -6023,6 +6051,10 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -6870,6 +6902,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -9927,7 +9964,7 @@ snapshots: obug: 2.1.3 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)) + vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0)) '@vitest/expect@4.1.9': dependencies: @@ -9938,13 +9975,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0))': + '@vitest/mocker@4.1.9(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0) + vite: 6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.9': dependencies: @@ -11231,6 +11268,10 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + fflate@0.8.3: {} file-entry-cache@8.0.0: @@ -11538,6 +11579,8 @@ snapshots: human-signals@2.1.0: {} + husky@9.1.7: {} + iceberg-js@0.8.1: {} icu-minify@4.13.0: @@ -11945,7 +11988,7 @@ snapshots: jest-regex-util: 30.4.0 jest-util: 30.4.1 jest-worker: 30.4.1 - picomatch: 4.0.4 + picomatch: 4.0.5 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -11970,7 +12013,7 @@ snapshots: chalk: 4.1.2 graceful-fs: 4.2.11 jest-util: 30.4.1 - picomatch: 4.0.4 + picomatch: 4.0.5 pretty-format: 30.4.1 slash: 3.0.0 stack-utils: 2.0.6 @@ -12092,7 +12135,7 @@ snapshots: chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 - picomatch: 4.0.4 + picomatch: 4.0.5 jest-validate@30.4.1: dependencies: @@ -12261,6 +12304,14 @@ snapshots: lines-and-columns@1.2.4: {} + lint-staged@17.2.0: + dependencies: + picomatch: 4.0.5 + string-argv: 0.3.2 + tinyexec: 1.2.4 + optionalDependencies: + yaml: 2.9.0 + loader-runner@4.3.2: {} loader-utils@2.0.4: @@ -12930,6 +12981,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.5: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -12970,12 +13023,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.16 - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.16): + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.16)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 1.21.7 postcss: 8.5.16 + yaml: 2.9.0 postcss-nested@6.2.0(postcss@8.5.16): dependencies: @@ -13004,6 +13058,8 @@ snapshots: prelude-ls@1.2.1: {} + prettier@3.9.6: {} + pretty-bytes@5.6.0: {} pretty-format@27.5.1: @@ -13637,6 +13693,8 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + string-argv@0.3.2: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -13851,11 +13909,11 @@ snapshots: tailwind-merge@3.6.0: {} - tailwind-scrollbar@3.1.0(tailwindcss@3.4.19): + tailwind-scrollbar@3.1.0(tailwindcss@3.4.19(yaml@2.9.0)): dependencies: - tailwindcss: 3.4.19 + tailwindcss: 3.4.19(yaml@2.9.0) - tailwindcss@3.4.19: + tailwindcss@3.4.19(yaml@2.9.0): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -13874,7 +13932,7 @@ snapshots: postcss: 8.5.16 postcss-import: 15.1.0(postcss@8.5.16) postcss-js: 4.1.0(postcss@8.5.16) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.16) + postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.16)(yaml@2.9.0) postcss-nested: 6.2.0(postcss@8.5.16) postcss-selector-parser: 6.1.4 resolve: 1.22.12 @@ -13938,8 +13996,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyrainbow@3.1.0: {} @@ -14279,11 +14337,11 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0): + vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 postcss: 8.5.16 rollup: 4.62.2 tinyglobby: 0.2.17 @@ -14292,11 +14350,12 @@ snapshots: fsevents: 2.3.3 jiti: 1.21.7 terser: 5.48.0 + yaml: 2.9.0 - vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)): + vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@20.19.43)(@vitest/coverage-v8@4.1.9)(jsdom@29.1.1)(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)) + '@vitest/mocker': 4.1.9(vite@6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.9 '@vitest/runner': 4.1.9 '@vitest/snapshot': 4.1.9 @@ -14313,7 +14372,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0) + vite: 6.4.3(@types/node@20.19.43)(jiti@1.21.7)(terser@5.48.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -14795,6 +14854,9 @@ snapshots: yallist@4.0.0: {} + yaml@2.9.0: + optional: true + yargs-parser@21.1.1: {} yargs@17.7.3: