WIP! A BB-style forum, on the ATmosphere! We're still working... we'll be back soon when we have something to show off!
node typescript hono htmx atproto

feat: add oxlint and lefthook pre-commit automation (#18)

* fix: prevent unhandled rejection in reconnection-manager test

Attach the rejection handler before advancing fake timers to avoid
a timing window where the promise rejects without a handler attached.
This eliminates the 'Unhandled Rejection' warning from Vitest.

* build: add oxlint and lefthook dependencies

* build: add oxlint configuration with recommended rules

* build: add lefthook pre-commit hook configuration

* test: verify pre-commit hooks execute

* docs: add pre-commit checks section to CLAUDE.md

* fix: add missing lint:fix scripts to 3 packages and register task in turbo

- Add lint:fix script to @atbb/appview, @atbb/web, and @atbb/db
- Register lint:fix task in turbo.json with cache disabled
- Enables documented 'pnpm turbo lint:fix' command
- Fixes critical blocker from code review

* docs: add oxlint/lefthook implementation plan

- Detailed 8-task breakdown for oxlint and lefthook setup
- Step-by-step instructions with expected outputs
- Documents PATH requirement for pnpm in Nix environment
- Records baseline TypeScript errors (32 total)

* fix: resolve oxlint unused variable errors and duplicate script

- Prefix unused parameters with underscore (appview)
- Remove unused imports from topics.test.ts
- Fix duplicate lint:fix script in lexicon package.json

All packages now pass oxlint with 0 warnings and 0 errors.

authored by

Malpercio and committed by
GitHub
6d32d665 3b1de782

+643 -262
+10
.oxlintrc.json
··· 1 + { 2 + "categories": { 3 + "correctness": "error" 4 + }, 5 + "env": { 6 + "node": true, 7 + "es2022": true 8 + }, 9 + "ignorePatterns": ["dist", "node_modules", ".turbo", ".devenv"] 10 + }
+46
CLAUDE.md
··· 60 60 - `APPVIEW_URL` — URL the web package uses to reach the appview API 61 61 - `FORUM_HANDLE`, `FORUM_PASSWORD` — forum service account credentials (for spike/writes) 62 62 63 + ## Pre-Commit Checks 64 + 65 + Every commit automatically runs three checks in parallel via lefthook: 66 + 67 + 1. **Lint** — oxlint scans staged TypeScript/JavaScript files for code quality issues 68 + 2. **Typecheck** — `pnpm turbo lint` runs type checking on affected packages 69 + 3. **Test** — Vitest runs tests in packages with staged changes 70 + 71 + ### Auto-Fixing Lint Issues 72 + 73 + Before committing, auto-fix safe lint violations: 74 + 75 + ```sh 76 + # Fix all packages 77 + pnpm turbo lint:fix 78 + 79 + # Fix specific package 80 + pnpm --filter @atbb/appview lint:fix 81 + ``` 82 + 83 + ### Bypassing Hooks (Emergency Only) 84 + 85 + In urgent situations, bypass hooks with: 86 + 87 + ```sh 88 + git commit --no-verify -m "emergency: your message" 89 + ``` 90 + 91 + Use sparingly — hooks catch issues that would fail in CI. 92 + 93 + ### How Hooks Work 94 + 95 + - **Lefthook** manages git hooks (`.lefthook.yml`) 96 + - **Oxlint** provides fast linting (`.oxlintrc.json`) 97 + - **Turbo** filters checks to affected packages only 98 + - Hooks auto-install after `pnpm install` via `prepare` script 99 + 100 + ### Known Issues 101 + 102 + **Baseline TypeScript errors:** The codebase currently has 32 TypeScript errors that will cause the typecheck hook to block commits: 103 + - 23 errors in generated lexicon code (`packages/lexicon/dist/types/**/*.ts`) 104 + - 9 errors in source/test code (test context types, OAuth types) 105 + 106 + These are pre-existing issues that need to be resolved. Until fixed, use `--no-verify` when committing or temporarily disable the typecheck command in `.lefthook.yml`. 107 + 108 + 63 109 ## Testing Standards 64 110 65 111 **CRITICAL: Always run tests before committing code or requesting code review.**
+2
README.md
··· 120 120 ## License 121 121 122 122 [AGPL-3.0](LICENSE) 123 + 124 + <!-- Testing pre-commit hooks -->
+1 -1
apps/appview/src/lib/__tests__/firehose.test.ts
··· 5 5 // Mock Jetstream 6 6 vi.mock("@skyware/jetstream", () => { 7 7 return { 8 - Jetstream: vi.fn().mockImplementation((config) => { 8 + Jetstream: vi.fn().mockImplementation((_config) => { 9 9 return { 10 10 onCreate: vi.fn(), 11 11 onUpdate: vi.fn(),
+5 -6
apps/appview/src/lib/__tests__/reconnection-manager.test.ts
··· 109 109 const error = new Error("Reconnection failed"); 110 110 reconnectFn.mockRejectedValueOnce(error); 111 111 112 - // Run the reconnection attempt and catch the expected error 113 - await expect(async () => { 114 - const promise = reconnectionManager.attemptReconnect(reconnectFn); 115 - await vi.runAllTimersAsync(); 116 - await promise; 117 - }).rejects.toThrow("Reconnection failed"); 112 + // Attach rejection handler BEFORE advancing timers 113 + const promise = reconnectionManager.attemptReconnect(reconnectFn); 114 + const assertion = expect(promise).rejects.toThrow("Reconnection failed"); 115 + await vi.runAllTimersAsync(); 116 + await assertion; 118 117 }); 119 118 }); 120 119
+1 -1
apps/appview/src/lib/event-handler-registry.ts
··· 8 8 /** 9 9 * Handler function signature for any event operation 10 10 */ 11 - export type EventHandler<T extends string = string> = (event: any) => Promise<void>; 11 + export type EventHandler<_T extends string = string> = (event: any) => Promise<void>; 12 12 13 13 /** 14 14 * Configuration for a single collection's event handlers
+1 -1
apps/appview/src/lib/firehose.ts
··· 210 210 this.isRunning = false; 211 211 await this.start(); 212 212 }); 213 - } catch (error) { 213 + } catch { 214 214 console.error( 215 215 `[FATAL] Firehose indexing has stopped. The appview will continue serving stale data.` 216 216 );
+1 -1
apps/appview/src/routes/__tests__/topics.test.ts
··· 1 - import { describe, it, expect, beforeEach, afterEach, vi, beforeAll, afterAll } from "vitest"; 1 + import { describe, it, expect, beforeEach, afterEach, vi } from "vitest"; 2 2 import { Hono } from "hono"; 3 3 import type { Variables } from "../../types.js"; 4 4 import { createTestContext, type TestContext } from "../../lib/__tests__/test-context.js";
+1 -1
apps/appview/src/routes/auth.ts
··· 162 162 // - Validate state and PKCE 163 163 // - Exchange code for tokens with DPoP 164 164 // - Store session in sessionStore 165 - const { session, state } = await ctx.oauthClient.callback(params); 165 + const { session, state: _state } = await ctx.oauthClient.callback(params); 166 166 167 167 // Fetch user profile to get handle 168 168 let handle: string | undefined;
+471
docs/plans/2026-02-10-oxlint-lefthook-implementation.md
··· 1 + # Oxlint and Lefthook Implementation Plan 2 + 3 + > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. 4 + 5 + **Goal:** Add automated linting and testing to pre-commit hooks using oxlint and lefthook. 6 + 7 + **Architecture:** Single oxlint config at monorepo root inherited by all packages. Lefthook runs lint, typecheck, and test in parallel on staged files. Turbo filters to affected packages only. 8 + 9 + **Tech Stack:** oxlint (Rust linter), lefthook (Go git hook manager), turbo (monorepo task runner) 10 + 11 + --- 12 + 13 + ## Task 1: Install Dependencies 14 + 15 + **Files:** 16 + - Modify: `package.json:12-16` 17 + 18 + **Step 1: Add oxlint and lefthook to devDependencies** 19 + 20 + Edit `package.json`: 21 + 22 + ```json 23 + { 24 + "name": "atbb-monorepo", 25 + "private": true, 26 + "packageManager": "pnpm@9.15.4", 27 + "scripts": { 28 + "build": "turbo run build", 29 + "dev": "turbo run dev", 30 + "lint": "turbo run lint", 31 + "clean": "turbo run clean", 32 + "test": "turbo run test", 33 + "prepare": "lefthook install" 34 + }, 35 + "devDependencies": { 36 + "lefthook": "^1.9.0", 37 + "oxlint": "^0.17.0", 38 + "turbo": "^2.4.0", 39 + "typescript": "^5.7.0", 40 + "vitest": "^4.0.18" 41 + } 42 + } 43 + ``` 44 + 45 + **Step 2: Install packages** 46 + 47 + Run: `export PATH="/Users/jacob.zweifel/workspace/malpercio-dev/atbb-monorepo/.devenv/profile/bin:$PATH" && pnpm install` 48 + 49 + Expected: See "lefthook" and "oxlint" in installation output 50 + 51 + **Step 3: Verify oxlint is available** 52 + 53 + Run: `npx oxlint --version` 54 + 55 + Expected: Output shows oxlint version (e.g., "oxlint v0.17.0") 56 + 57 + **Step 4: Verify lefthook is available** 58 + 59 + Run: `npx lefthook version` 60 + 61 + Expected: Output shows lefthook version (e.g., "1.9.0") 62 + 63 + **Step 5: Commit dependency changes** 64 + 65 + ```bash 66 + git add package.json pnpm-lock.yaml 67 + git commit -m "build: add oxlint and lefthook dependencies" 68 + ``` 69 + 70 + --- 71 + 72 + ## Task 2: Configure Oxlint 73 + 74 + **Files:** 75 + - Create: `.oxlintrc.json` 76 + 77 + **Step 1: Create oxlint configuration** 78 + 79 + Create `.oxlintrc.json` at repository root: 80 + 81 + ```json 82 + { 83 + "rules": { 84 + "oxc/recommended": "error" 85 + }, 86 + "env": { 87 + "node": true, 88 + "es2022": true 89 + }, 90 + "ignorePatterns": ["dist", "node_modules", ".turbo"] 91 + } 92 + ``` 93 + 94 + **Step 2: Test oxlint on existing code** 95 + 96 + Run: `npx oxlint .` 97 + 98 + Expected: Should scan all TypeScript/JavaScript files and report any violations (if any exist) 99 + 100 + **Step 3: Verify ignore patterns work** 101 + 102 + Run: `npx oxlint dist/ 2>&1 | grep -c "No files to lint" || echo "Files found (config may be wrong)"` 103 + 104 + Expected: Should output "No files to lint" or similar (dist/ should be ignored) 105 + 106 + **Step 4: Commit oxlint config** 107 + 108 + ```bash 109 + git add .oxlintrc.json 110 + git commit -m "build: add oxlint configuration with recommended rules" 111 + ``` 112 + 113 + --- 114 + 115 + ## Task 3: Configure Lefthook 116 + 117 + **Files:** 118 + - Create: `.lefthook.yml` 119 + 120 + **Step 1: Create lefthook configuration** 121 + 122 + Create `.lefthook.yml` at repository root: 123 + 124 + ```yaml 125 + pre-commit: 126 + parallel: true 127 + commands: 128 + lint: 129 + glob: "*.{ts,tsx,js,jsx}" 130 + run: npx oxlint {staged_files} 131 + typecheck: 132 + glob: "*.{ts,tsx}" 133 + run: pnpm turbo lint --filter=...[HEAD] 134 + test: 135 + glob: "*.{ts,tsx,js,jsx}" 136 + run: pnpm turbo test --filter=...[HEAD] --force 137 + ``` 138 + 139 + **Step 2: Install git hooks** 140 + 141 + Run: `npx lefthook install` 142 + 143 + Expected: Output shows "Lefthook hooks installed successfully" or similar 144 + 145 + **Step 3: Verify hook file was created** 146 + 147 + Run: `ls -la .git/hooks/pre-commit` 148 + 149 + Expected: File exists and is executable (permissions like `-rwxr-xr-x`) 150 + 151 + **Step 4: Verify hook points to lefthook** 152 + 153 + Run: `head -n 5 .git/hooks/pre-commit` 154 + 155 + Expected: Should contain reference to "lefthook" in the shebang or script 156 + 157 + **Step 5: Commit lefthook config** 158 + 159 + ```bash 160 + git add .lefthook.yml 161 + git commit -m "build: add lefthook pre-commit hook configuration" 162 + ``` 163 + 164 + --- 165 + 166 + ## Task 4: Add lint:fix Scripts to Packages 167 + 168 + **Files:** 169 + - Modify: `apps/appview/package.json:10` 170 + - Modify: `apps/web/package.json:10` 171 + - Modify: `packages/db/package.json` (add scripts section if missing) 172 + - Modify: `packages/lexicon/package.json:6` 173 + 174 + **Step 1: Add lint:fix to appview** 175 + 176 + Edit `apps/appview/package.json` - add to scripts section: 177 + 178 + ```json 179 + { 180 + "scripts": { 181 + "build": "tsc", 182 + "dev": "tsx watch --env-file=../../.env src/index.ts", 183 + "start": "node dist/index.js", 184 + "lint": "tsc --noEmit", 185 + "lint:fix": "oxlint --fix src/", 186 + "test": "vitest run", 187 + "clean": "rm -rf dist", 188 + "db:generate": "drizzle-kit generate", 189 + "db:migrate": "drizzle-kit migrate" 190 + } 191 + } 192 + ``` 193 + 194 + **Step 2: Add lint:fix to web** 195 + 196 + Edit `apps/web/package.json` - add to scripts section: 197 + 198 + ```json 199 + { 200 + "scripts": { 201 + "build": "tsc", 202 + "dev": "tsx watch --env-file=../../.env src/index.ts", 203 + "start": "node dist/index.js", 204 + "lint": "tsc --noEmit", 205 + "lint:fix": "oxlint --fix src/", 206 + "test": "vitest run", 207 + "clean": "rm -rf dist" 208 + } 209 + } 210 + ``` 211 + 212 + **Step 3: Add lint:fix to lexicon** 213 + 214 + Edit `packages/lexicon/package.json` - add to scripts section: 215 + 216 + ```json 217 + { 218 + "scripts": { 219 + "build": "pnpm run build:json && pnpm run build:types", 220 + "build:json": "tsx scripts/build.ts", 221 + "build:types": "bash -c 'shopt -s globstar && lex gen-api --yes ./dist/types ./dist/json/**/*.json'", 222 + "lint": "tsc --noEmit", 223 + "lint:fix": "oxlint --fix scripts/ lexicons/", 224 + "test": "vitest run", 225 + "clean": "rm -rf dist" 226 + } 227 + } 228 + ``` 229 + 230 + **Step 4: Check if db package needs lint:fix** 231 + 232 + Run: `ls -la packages/db/src/` 233 + 234 + Expected: If src/ directory exists with TypeScript files, add lint:fix script. If not, skip. 235 + 236 + If src/ exists, edit `packages/db/package.json`: 237 + 238 + ```json 239 + { 240 + "scripts": { 241 + "build": "tsc", 242 + "lint": "tsc --noEmit", 243 + "lint:fix": "oxlint --fix src/", 244 + "test": "vitest run", 245 + "clean": "rm -rf dist" 246 + } 247 + } 248 + ``` 249 + 250 + **Step 5: Test lint:fix script** 251 + 252 + Run: `export PATH="/Users/jacob.zweifel/workspace/malpercio-dev/atbb-monorepo/.devenv/profile/bin:$PATH" && pnpm --filter @atbb/appview lint:fix` 253 + 254 + Expected: Oxlint runs and fixes any auto-fixable issues (or reports "No issues found") 255 + 256 + **Step 6: Commit package.json changes** 257 + 258 + ```bash 259 + git add apps/*/package.json packages/*/package.json 260 + git commit -m "build: add lint:fix scripts to all packages" 261 + ``` 262 + 263 + --- 264 + 265 + ## Task 5: Test Pre-Commit Hook 266 + 267 + **Files:** 268 + - Create: `apps/appview/src/test-lint.ts` (temporary test file) 269 + 270 + **Step 1: Create a file with intentional lint violation** 271 + 272 + Create `apps/appview/src/test-lint.ts`: 273 + 274 + ```typescript 275 + // Intentional console.log for testing lint hook 276 + console.log("This should be caught by oxlint"); 277 + 278 + export function testFunction() { 279 + return "test"; 280 + } 281 + ``` 282 + 283 + **Step 2: Stage the file** 284 + 285 + Run: `git add apps/appview/src/test-lint.ts` 286 + 287 + Expected: File staged successfully 288 + 289 + **Step 3: Attempt commit to trigger hook** 290 + 291 + Run: `git commit -m "test: trigger pre-commit hook"` 292 + 293 + Expected: Hook should run and MAY fail if oxlint catches the console.log. If it passes, that's OK too (oxlint recommended rules may not include no-console). 294 + 295 + **Step 4: Verify hook execution** 296 + 297 + Check the commit output for evidence that lefthook ran (should see "lint", "typecheck", "test" commands mentioned) 298 + 299 + Expected: Output shows lefthook running the three parallel commands 300 + 301 + **Step 5: Remove test file** 302 + 303 + Run: `git reset HEAD apps/appview/src/test-lint.ts && rm apps/appview/src/test-lint.ts` 304 + 305 + Expected: Test file unstaged and deleted 306 + 307 + --- 308 + 309 + ## Task 6: Verify Hook Behavior with Real Changes 310 + 311 + **Files:** 312 + - Modify: `README.md` (add a comment) 313 + 314 + **Step 1: Make a harmless change to verify hooks run** 315 + 316 + Edit `README.md` - add a comment at the end: 317 + 318 + ```markdown 319 + <!-- Testing pre-commit hooks --> 320 + ``` 321 + 322 + **Step 2: Stage and commit** 323 + 324 + Run: 325 + ```bash 326 + git add README.md 327 + git commit -m "test: verify pre-commit hooks execute" 328 + ``` 329 + 330 + Expected: 331 + - Lefthook runs lint (skips because no .ts files staged) 332 + - Lefthook runs typecheck (may run or skip depending on turbo filter) 333 + - Lefthook runs test (may run or skip depending on turbo filter) 334 + - Commit succeeds 335 + 336 + **Step 3: Verify commit was created** 337 + 338 + Run: `git log -1 --oneline` 339 + 340 + Expected: Should show the "test: verify pre-commit hooks execute" commit 341 + 342 + **Step 4: Keep this commit (it's useful documentation)** 343 + 344 + No action needed - commit stays in history 345 + 346 + --- 347 + 348 + ## Task 7: Update Documentation 349 + 350 + **Files:** 351 + - Modify: `CLAUDE.md` (add Pre-Commit Checks section) 352 + 353 + **Step 1: Add Pre-Commit Checks section to CLAUDE.md** 354 + 355 + Add this section after the "Development" section and before "Testing Standards": 356 + 357 + ```markdown 358 + ## Pre-Commit Checks 359 + 360 + Every commit automatically runs three checks in parallel via lefthook: 361 + 362 + 1. **Lint** — oxlint scans staged TypeScript/JavaScript files for code quality issues 363 + 2. **Typecheck** — `tsc --noEmit` verifies type correctness in affected packages 364 + 3. **Test** — Vitest runs tests in packages with staged changes 365 + 366 + ### Auto-Fixing Lint Issues 367 + 368 + Before committing, auto-fix safe lint violations: 369 + 370 + ```sh 371 + # Fix all packages 372 + pnpm turbo lint:fix 373 + 374 + # Fix specific package 375 + pnpm --filter @atbb/appview lint:fix 376 + ``` 377 + 378 + ### Bypassing Hooks (Emergency Only) 379 + 380 + In urgent situations, bypass hooks with: 381 + 382 + ```sh 383 + git commit --no-verify -m "emergency: your message" 384 + ``` 385 + 386 + Use sparingly — hooks catch issues that would fail in CI. 387 + 388 + ### How Hooks Work 389 + 390 + - **Lefthook** manages git hooks (`.lefthook.yml`) 391 + - **Oxlint** provides fast linting (`.oxlintrc.json`) 392 + - **Turbo** filters checks to affected packages only 393 + - Hooks auto-install after `pnpm install` via `prepare` script 394 + ``` 395 + 396 + **Step 2: Verify documentation renders correctly** 397 + 398 + Run: `head -n 50 CLAUDE.md | grep -A 10 "Pre-Commit"` 399 + 400 + Expected: Should show the new section properly formatted 401 + 402 + **Step 3: Commit documentation** 403 + 404 + ```bash 405 + git add CLAUDE.md 406 + git commit -m "docs: add pre-commit checks section to CLAUDE.md" 407 + ``` 408 + 409 + --- 410 + 411 + ## Task 8: Final Verification 412 + 413 + **Files:** 414 + - None (verification only) 415 + 416 + **Step 1: Run full test suite** 417 + 418 + Run: `export PATH="/Users/jacob.zweifel/workspace/malpercio-dev/atbb-monorepo/.devenv/profile/bin:$PATH" && pnpm test` 419 + 420 + Expected: All 134 tests pass (same as baseline) 421 + 422 + **Step 2: Verify oxlint works on codebase** 423 + 424 + Run: `npx oxlint apps/ packages/` 425 + 426 + Expected: Scans complete (may show violations or clean, depending on code) 427 + 428 + **Step 3: Verify turbo lint works** 429 + 430 + Run: `export PATH="/Users/jacob.zweifel/workspace/malpercio-dev/atbb-monorepo/.devenv/profile/bin:$PATH" && pnpm turbo lint:fix` 431 + 432 + Expected: Runs lint:fix on all packages that have the script 433 + 434 + **Step 4: Check git status is clean** 435 + 436 + Run: `git status` 437 + 438 + Expected: Should show "nothing to commit, working tree clean" 439 + 440 + **Step 5: Review commit history** 441 + 442 + Run: `git log --oneline -10` 443 + 444 + Expected: Should see all commits from this implementation in order: 445 + 1. build: add oxlint and lefthook dependencies 446 + 2. build: add oxlint configuration with recommended rules 447 + 3. build: add lefthook pre-commit hook configuration 448 + 4. build: add lint:fix scripts to all packages 449 + 5. test: verify pre-commit hooks execute 450 + 6. docs: add pre-commit checks section to CLAUDE.md 451 + 452 + --- 453 + 454 + ## Completion Checklist 455 + 456 + - [ ] Dependencies installed (oxlint, lefthook) 457 + - [ ] Oxlint configured (`.oxlintrc.json`) 458 + - [ ] Lefthook configured (`.lefthook.yml`) 459 + - [ ] Git hooks installed (`.git/hooks/pre-commit`) 460 + - [ ] All packages have `lint:fix` scripts 461 + - [ ] Pre-commit hook tested and working 462 + - [ ] Documentation updated in CLAUDE.md 463 + - [ ] All tests still passing (134 tests) 464 + - [ ] All commits follow conventional commit format 465 + 466 + **Next Steps After Completion:** 467 + 468 + 1. Merge this branch to main (or open PR for review) 469 + 2. Other developers pull latest and run `pnpm install` (hooks auto-install) 470 + 3. Monitor first few commits to ensure hooks work smoothly 471 + 4. Adjust oxlint rules if too strict/lenient based on team feedback
+12 -42
lefthook.yml
··· 1 - # EXAMPLE USAGE: 2 - # 3 - # Refer for explanation to following link: 4 - # https://lefthook.dev/configuration/ 5 - # 6 - # pre-push: 7 - # jobs: 8 - # - name: packages audit 9 - # tags: 10 - # - frontend 11 - # - security 12 - # run: yarn audit 13 - # 14 - # - name: gems audit 15 - # tags: 16 - # - backend 17 - # - security 18 - # run: bundle audit 19 - # 20 - # pre-commit: 21 - # parallel: true 22 - # jobs: 23 - # - run: yarn eslint {staged_files} 24 - # glob: "*.{js,ts,jsx,tsx}" 25 - # 26 - # - name: rubocop 27 - # glob: "*.rb" 28 - # exclude: 29 - # - config/application.rb 30 - # - config/routes.rb 31 - # run: bundle exec rubocop --force-exclusion {all_files} 32 - # 33 - # - name: govet 34 - # files: git ls-files -m 35 - # glob: "*.go" 36 - # run: go vet {files} 37 - # 38 - # - script: "hello.js" 39 - # runner: node 40 - # 41 - # - script: "hello.go" 42 - # runner: go run 1 + pre-commit: 2 + parallel: true 3 + commands: 4 + lint: 5 + glob: "**/*.{ts,tsx,js,jsx}" 6 + run: pnpm exec oxlint {staged_files} 7 + typecheck: 8 + glob: "**/*.{ts,tsx}" 9 + run: pnpm turbo lint --filter='...[HEAD]' 10 + test: 11 + glob: "**/*.{ts,tsx,js,jsx}" 12 + run: pnpm turbo test --filter='...[HEAD]'
+2 -2
package.json
··· 11 11 "prepare": "lefthook install" 12 12 }, 13 13 "devDependencies": { 14 - "lefthook": "^2.1.0", 15 - "oxlint": "^1.46.0", 14 + "lefthook": "^1.9.0", 15 + "oxlint": "^0.17.0", 16 16 "turbo": "^2.4.0", 17 17 "typescript": "^5.7.0", 18 18 "vitest": "^4.0.18"
+2 -1
packages/lexicon/package.json
··· 14 14 "build": "pnpm run build:json && pnpm run build:types", 15 15 "build:json": "tsx scripts/build.ts", 16 16 "build:types": "bash -c 'shopt -s globstar && lex gen-api --yes ./dist/types ./dist/json/**/*.json'", 17 - "lint:fix": "oxlint --fix scripts/ lexicons/", 18 17 "test": "vitest run", 18 + "lint": "tsc --noEmit", 19 + "lint:fix": "oxlint --fix scripts/ lexicons/ __tests__/", 19 20 "clean": "rm -rf dist" 20 21 }, 21 22 "dependencies": {
+2
packages/spike/package.json
··· 5 5 "type": "module", 6 6 "scripts": { 7 7 "spike": "tsx --env-file=../../.env src/index.ts", 8 + "lint": "tsc --noEmit", 9 + "lint:fix": "oxlint --fix src/", 8 10 "clean": "rm -rf dist" 9 11 }, 10 12 "dependencies": {
+83 -206
pnpm-lock.yaml
··· 9 9 .: 10 10 devDependencies: 11 11 lefthook: 12 - specifier: ^2.1.0 13 - version: 2.1.0 12 + specifier: ^1.9.0 13 + version: 1.13.6 14 14 oxlint: 15 - specifier: ^1.46.0 16 - version: 1.46.0 15 + specifier: ^0.17.0 16 + version: 0.17.0 17 17 turbo: 18 18 specifier: ^2.4.0 19 19 version: 2.8.3 ··· 752 752 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 753 753 engines: {node: '>= 8'} 754 754 755 - '@oxlint/binding-android-arm-eabi@1.46.0': 756 - resolution: {integrity: sha512-vLPcE+HcZ/W/0cVA1KLuAnoUSejGougDH/fDjBFf0Q+rbBIyBNLevOhgx3AnBNAt3hcIGY7U05ISbJCKZeVa3w==} 757 - engines: {node: ^20.19.0 || >=22.12.0} 758 - cpu: [arm] 759 - os: [android] 760 - 761 - '@oxlint/binding-android-arm64@1.46.0': 762 - resolution: {integrity: sha512-b8IqCczUsirdtJ3R/be4cRm64I5pMPafMO/9xyTAZvc+R/FxZHMQuhw0iNT9hQwRn+Uo5rNAoA8QS7QurG2QeA==} 763 - engines: {node: ^20.19.0 || >=22.12.0} 764 - cpu: [arm64] 765 - os: [android] 766 - 767 - '@oxlint/binding-darwin-arm64@1.46.0': 768 - resolution: {integrity: sha512-CfC/KGnNMhI01dkfCMjquKnW4zby3kqD5o/9XA7+pgo9I4b+Nipm+JVFyZPWMNwKqLXNmi35GTLWjs9svPxlew==} 769 - engines: {node: ^20.19.0 || >=22.12.0} 755 + '@oxlint/darwin-arm64@0.17.0': 756 + resolution: {integrity: sha512-py/N0yTMbdy5Kd1RFMMgFqzO5Qwc5MbHSCA0BvSx/GnC3n7yPstcEFSSdZzb+HaANI00xn4dwjYo6HVEFHhuWA==} 770 757 cpu: [arm64] 771 758 os: [darwin] 772 759 773 - '@oxlint/binding-darwin-x64@1.46.0': 774 - resolution: {integrity: sha512-m38mKPsV3rBdWOJ4TAGZiUjWU8RGrBxsmdSeMQ0bPr/8O6CUOm/RJkPBf0GAfPms2WRVcbkfEXvIiPshAeFkeA==} 775 - engines: {node: ^20.19.0 || >=22.12.0} 760 + '@oxlint/darwin-x64@0.17.0': 761 + resolution: {integrity: sha512-rQUFu6Ci8gmBHTgb2EMKYNZWCmBB8sSW7SAxBes9k0esonKsioDNjT51CsfKZhXyaMtaM70hiVhSCBc0NqUEJg==} 776 762 cpu: [x64] 777 763 os: [darwin] 778 764 779 - '@oxlint/binding-freebsd-x64@1.46.0': 780 - resolution: {integrity: sha512-YaFRKslSAfuMwn7ejS1/wo9jENqQigpGBjjThX+mrpmEROLYGky+zIC5xSVGRng28U92VEDVbSNJ/sguz3dUAA==} 781 - engines: {node: ^20.19.0 || >=22.12.0} 782 - cpu: [x64] 783 - os: [freebsd] 784 - 785 - '@oxlint/binding-linux-arm-gnueabihf@1.46.0': 786 - resolution: {integrity: sha512-Nlw+5mSZQtkg1Oj0N8ulxzG8ATpmSDz5V2DNaGhaYAVlcdR8NYSm/xTOnweOXc/UOOv3LwkPPYzqcfPhu2lEkA==} 787 - engines: {node: ^20.19.0 || >=22.12.0} 788 - cpu: [arm] 789 - os: [linux] 790 - 791 - '@oxlint/binding-linux-arm-musleabihf@1.46.0': 792 - resolution: {integrity: sha512-d3Y5y4ukMqAGnWLMKpwqj8ftNUaac7pA0NrId4AZ77JvHzezmxEcm2gswaBw2HW8y1pnq6KDB0vEPPvpTfDLrA==} 793 - engines: {node: ^20.19.0 || >=22.12.0} 794 - cpu: [arm] 795 - os: [linux] 796 - 797 - '@oxlint/binding-linux-arm64-gnu@1.46.0': 798 - resolution: {integrity: sha512-jkjx+XSOPuFR+C458prQmehO+v0VK19/3Hj2mOYDF4hHUf3CzmtA4fTmQUtkITZiGHnky7Oao6JeJX24mrX7WQ==} 799 - engines: {node: ^20.19.0 || >=22.12.0} 765 + '@oxlint/linux-arm64-gnu@0.17.0': 766 + resolution: {integrity: sha512-NoAWscdfVj6Sci3NdbHHc1OivSSKpwtkLff5SoAM8XgJ9t7flf+zW7XOy3OeSgZAxNbcF4QGruv+XcBLR7tWMA==} 800 767 cpu: [arm64] 801 768 os: [linux] 802 769 803 - '@oxlint/binding-linux-arm64-musl@1.46.0': 804 - resolution: {integrity: sha512-X/aPB1rpJUdykjWSeeGIbjk6qbD8VDulgLuTSMWgr/t6m1ljcAjqHb1g49pVG9bZl55zjECgzvlpPLWnfb4FMQ==} 805 - engines: {node: ^20.19.0 || >=22.12.0} 770 + '@oxlint/linux-arm64-musl@0.17.0': 771 + resolution: {integrity: sha512-VQRmSdbuc0rpSZoLqdhKJG9nUjJmEymOU60dO3lKlCT5YXME4dxA+jf1AigtnmJS5FgOxQm54ECF9lh6dyP0ew==} 806 772 cpu: [arm64] 807 773 os: [linux] 808 774 809 - '@oxlint/binding-linux-ppc64-gnu@1.46.0': 810 - resolution: {integrity: sha512-AymyOxGWwKY2KJa8b+h8iLrYJZbWKYCjqctSc2q6uIAkYPrCsxcWlge1JP6XZ14Sa80DVMwI/QvktbytSV+xVw==} 811 - engines: {node: ^20.19.0 || >=22.12.0} 812 - cpu: [ppc64] 813 - os: [linux] 814 - 815 - '@oxlint/binding-linux-riscv64-gnu@1.46.0': 816 - resolution: {integrity: sha512-PkeVdPKCDA59rlMuucsel2LjlNEpslQN5AhkMMorIJZItbbqi/0JSuACCzaiIcXYv0oNfbeQ8rbOBikv+aT6cg==} 817 - engines: {node: ^20.19.0 || >=22.12.0} 818 - cpu: [riscv64] 819 - os: [linux] 820 - 821 - '@oxlint/binding-linux-riscv64-musl@1.46.0': 822 - resolution: {integrity: sha512-snQaRLO/X+Ry/CxX1px1g8GUbmXzymdRs+/RkP2bySHWZFhFDtbLm2hA1ujX/jKlTLMJDZn4hYzFGLDwG/Rh2w==} 823 - engines: {node: ^20.19.0 || >=22.12.0} 824 - cpu: [riscv64] 825 - os: [linux] 826 - 827 - '@oxlint/binding-linux-s390x-gnu@1.46.0': 828 - resolution: {integrity: sha512-kZhDMwUe/sgDTluGao9c0Dqc1JzV6wPzfGo0l/FLQdh5Zmp39Yg1FbBsCgsJfVKmKl1fNqsHyFLTShWMOlOEhA==} 829 - engines: {node: ^20.19.0 || >=22.12.0} 830 - cpu: [s390x] 831 - os: [linux] 832 - 833 - '@oxlint/binding-linux-x64-gnu@1.46.0': 834 - resolution: {integrity: sha512-n5a7VtQTxHZ13cNAKQc3ziARv5bE1Fx868v/tnhZNVUjaRNYe5uiUrRJ/LZghdAzOxVuQGarjjq/q4QM2+9OPA==} 835 - engines: {node: ^20.19.0 || >=22.12.0} 775 + '@oxlint/linux-x64-gnu@0.17.0': 776 + resolution: {integrity: sha512-KcaXWkBfqt7weerU1EXJysEupEHB8AtJytufBOQMuLE5vx2OoAbjAk0vt2V14W8Lss9Sz+ET7nXo6ZAEku4vCA==} 836 777 cpu: [x64] 837 778 os: [linux] 838 779 839 - '@oxlint/binding-linux-x64-musl@1.46.0': 840 - resolution: {integrity: sha512-KpsDU/BhdVn3iKCLxMXAOZIpO8fS0jEA5iluRoK1rhHPwKtpzEm/OCwERsu/vboMSZm66qnoTUVXRPJ8M+iKVQ==} 841 - engines: {node: ^20.19.0 || >=22.12.0} 780 + '@oxlint/linux-x64-musl@0.17.0': 781 + resolution: {integrity: sha512-yWbFXWKKTrH4zR0FI1V6KDJp5NqOLFe1LZbKNeaoS1wtq5/aFPeM+d9dttGLoA5u6G9uhIK/nSnrPmtuNLPU4Q==} 842 782 cpu: [x64] 843 783 os: [linux] 844 784 845 - '@oxlint/binding-openharmony-arm64@1.46.0': 846 - resolution: {integrity: sha512-jtbqUyEXlsDlRmMtTZqNbw49+1V/WxqNAR5l0S3OEkdat9diI5I+eqq9IT+jb5cSDdszTGcXpn7S3+gUYSydxQ==} 847 - engines: {node: ^20.19.0 || >=22.12.0} 848 - cpu: [arm64] 849 - os: [openharmony] 850 - 851 - '@oxlint/binding-win32-arm64-msvc@1.46.0': 852 - resolution: {integrity: sha512-EE8NjpqEZPwHQVigNvdyJ11dZwWIfsfn4VeBAuiJeAdrnY4HFX27mIjJINJgP5ZdBYEFV1OWH/eb9fURCYel8w==} 853 - engines: {node: ^20.19.0 || >=22.12.0} 785 + '@oxlint/win32-arm64@0.17.0': 786 + resolution: {integrity: sha512-zdoB3mbvcx3eGOh6ElPJ01S2MOzyZo/gijeHw7yb2PXcRis+3clVje6kpnG7/TN69zoHv7WwDX6poJu8FURTqg==} 854 787 cpu: [arm64] 855 788 os: [win32] 856 789 857 - '@oxlint/binding-win32-ia32-msvc@1.46.0': 858 - resolution: {integrity: sha512-BHyk3H/HRdXs+uImGZ/2+qCET+B8lwGHOm7m54JiJEEUWf3zYCFX/Df1SPqtozWWmnBvioxoTG1J3mPRAr8KUA==} 859 - engines: {node: ^20.19.0 || >=22.12.0} 860 - cpu: [ia32] 861 - os: [win32] 862 - 863 - '@oxlint/binding-win32-x64-msvc@1.46.0': 864 - resolution: {integrity: sha512-DJbQsSJUr4KSi9uU0QqOgI7PX2C+fKGZX+YDprt3vM2sC0dWZsgVTLoN2vtkNyEWJSY2mnvRFUshWXT3bmo0Ug==} 865 - engines: {node: ^20.19.0 || >=22.12.0} 790 + '@oxlint/win32-x64@0.17.0': 791 + resolution: {integrity: sha512-gxVYAOy/8IAWgmsaXDxRJvOr7l61DUDj6s7tXImzXqBAH/An6yJZGr1tR+5BsACVw/3hcCPOUbotXGS4+vZNZQ==} 866 792 cpu: [x64] 867 793 os: [win32] 868 794 ··· 1362 1288 js-tokens@9.0.1: 1363 1289 resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 1364 1290 1365 - lefthook-darwin-arm64@2.1.0: 1366 - resolution: {integrity: sha512-u2hjHLQXWSFfzO7ln2n/uEydSzfC9sc5cDC7tvKSuOdhvBwaJ0AQ7ZeuqqCQ4YfVIJfYOom1SVE9CBd10FVyig==} 1291 + lefthook-darwin-arm64@1.13.6: 1292 + resolution: {integrity: sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==} 1367 1293 cpu: [arm64] 1368 1294 os: [darwin] 1369 1295 1370 - lefthook-darwin-x64@2.1.0: 1371 - resolution: {integrity: sha512-zz5rcyrtOZpxon7uE+c0KC/o2ypJeLZql5CL0Y9oaTuECbmhfokm8glsGnyWstW/++PuMpZYYr/qsCJA5elxkQ==} 1296 + lefthook-darwin-x64@1.13.6: 1297 + resolution: {integrity: sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==} 1372 1298 cpu: [x64] 1373 1299 os: [darwin] 1374 1300 1375 - lefthook-freebsd-arm64@2.1.0: 1376 - resolution: {integrity: sha512-+mXNCNuFHNGYLrDqYWDeHH7kWCLCJFPpspx5PAAm+PD37PRMZJrTqDbaNK9qCghC1tdmT4/Lvilf/ewXHPlaKw==} 1301 + lefthook-freebsd-arm64@1.13.6: 1302 + resolution: {integrity: sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==} 1377 1303 cpu: [arm64] 1378 1304 os: [freebsd] 1379 1305 1380 - lefthook-freebsd-x64@2.1.0: 1381 - resolution: {integrity: sha512-+AU2HD7szuDsUdHue/E3OnF84B2ae/h7CGKpuIUHJntgoJ4kxf89oDvq2/xl8kDCn9cT76UUjgeZUgFYLRj+6Q==} 1306 + lefthook-freebsd-x64@1.13.6: 1307 + resolution: {integrity: sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==} 1382 1308 cpu: [x64] 1383 1309 os: [freebsd] 1384 1310 1385 - lefthook-linux-arm64@2.1.0: 1386 - resolution: {integrity: sha512-KM70eV1tsEib1/tk+3TFxIdH84EaYlIg5KTQWAg+LB1N23nTQ7lL4Dnh1je6f6KW4tf21nmoMUqsh0xvMkQk8Q==} 1311 + lefthook-linux-arm64@1.13.6: 1312 + resolution: {integrity: sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==} 1387 1313 cpu: [arm64] 1388 1314 os: [linux] 1389 1315 1390 - lefthook-linux-x64@2.1.0: 1391 - resolution: {integrity: sha512-6Bxmv+l7LiYq9W0IE6v2lmlRtBp6pisnlzhcouMGvH3rDwEGw11NAyRJZA3IPGEMAkIuhnlnVTUwAUzKomfJLg==} 1316 + lefthook-linux-x64@1.13.6: 1317 + resolution: {integrity: sha512-uJl9vjCIIBTBvMZkemxCE+3zrZHlRO7Oc+nZJ+o9Oea3fu+W82jwX7a7clw8jqNfaeBS+8+ZEQgiMHWCloTsGw==} 1392 1318 cpu: [x64] 1393 1319 os: [linux] 1394 1320 1395 - lefthook-openbsd-arm64@2.1.0: 1396 - resolution: {integrity: sha512-ppJNK0bBSPLC8gqksRw5zI/0uLeMA5cK+hmZ4ofcuGNmdrN1dfl2Tx84fdeef0NcQY0ii9Y3j3icIKngIoid/g==} 1321 + lefthook-openbsd-arm64@1.13.6: 1322 + resolution: {integrity: sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==} 1397 1323 cpu: [arm64] 1398 1324 os: [openbsd] 1399 1325 1400 - lefthook-openbsd-x64@2.1.0: 1401 - resolution: {integrity: sha512-8k9lQsMYqQGu4spaQ8RNSOJidxIcOyfaoF2FPZhthtBfRV3cgVFGrsQ0hbIi5pvQRGUlCqYuCN79qauXHmnL3Q==} 1326 + lefthook-openbsd-x64@1.13.6: 1327 + resolution: {integrity: sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==} 1402 1328 cpu: [x64] 1403 1329 os: [openbsd] 1404 1330 1405 - lefthook-windows-arm64@2.1.0: 1406 - resolution: {integrity: sha512-0WN+grrxt9zP9NGRcztoPXcz25tteem91rfLWgQFab+50csJ47zldlsB7/eOS/eHG5mUg5g5NPR4XefnXtjOcQ==} 1331 + lefthook-windows-arm64@1.13.6: 1332 + resolution: {integrity: sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==} 1407 1333 cpu: [arm64] 1408 1334 os: [win32] 1409 1335 1410 - lefthook-windows-x64@2.1.0: 1411 - resolution: {integrity: sha512-XbO/5nAZQLpUn0tPpgCYfFBFJHnymSglQ73jD6wymNrR1j8I5EcXGlP6YcLhnZ83yzsdLC+gup+N6IqUeiyRdw==} 1336 + lefthook-windows-x64@1.13.6: 1337 + resolution: {integrity: sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==} 1412 1338 cpu: [x64] 1413 1339 os: [win32] 1414 1340 1415 - lefthook@2.1.0: 1416 - resolution: {integrity: sha512-+vS+yywGQW6CN1J1hbGkez//6ixGHIQqfxDN/d3JDm531w9GfGt2lAWTDfZTw/CEl80XsN0raFcnEraR3ldw9g==} 1341 + lefthook@1.13.6: 1342 + resolution: {integrity: sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==} 1417 1343 hasBin: true 1418 1344 1419 1345 loupe@3.2.1: ··· 1471 1397 obug@2.1.1: 1472 1398 resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 1473 1399 1474 - oxlint@1.46.0: 1475 - resolution: {integrity: sha512-I9h42QDtAVsRwoueJ4PL/7qN5jFzIUXvbO4Z5ddtII92ZCiD7uiS/JW2V4viBSfGLsbZkQp3YEs6Ls4I8q+8tA==} 1476 - engines: {node: ^20.19.0 || >=22.12.0} 1400 + oxlint@0.17.0: 1401 + resolution: {integrity: sha512-LCXomDhPGbDUZ/T+ScFA0tjh7A5QgYwPRCw7XFlJxRD2URBV8wj2lLvepbQ9yS/Q6SGhVfHQMpziQytajl8NcQ==} 1402 + engines: {node: '>=8.*'} 1477 1403 hasBin: true 1478 - peerDependencies: 1479 - oxlint-tsgolint: '>=0.11.2' 1480 - peerDependenciesMeta: 1481 - oxlint-tsgolint: 1482 - optional: true 1483 1404 1484 1405 package-json-from-dist@1.0.1: 1485 1406 resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} ··· 2279 2200 '@nodelib/fs.scandir': 2.1.5 2280 2201 fastq: 1.20.1 2281 2202 2282 - '@oxlint/binding-android-arm-eabi@1.46.0': 2203 + '@oxlint/darwin-arm64@0.17.0': 2283 2204 optional: true 2284 2205 2285 - '@oxlint/binding-android-arm64@1.46.0': 2206 + '@oxlint/darwin-x64@0.17.0': 2286 2207 optional: true 2287 2208 2288 - '@oxlint/binding-darwin-arm64@1.46.0': 2209 + '@oxlint/linux-arm64-gnu@0.17.0': 2289 2210 optional: true 2290 2211 2291 - '@oxlint/binding-darwin-x64@1.46.0': 2212 + '@oxlint/linux-arm64-musl@0.17.0': 2292 2213 optional: true 2293 2214 2294 - '@oxlint/binding-freebsd-x64@1.46.0': 2215 + '@oxlint/linux-x64-gnu@0.17.0': 2295 2216 optional: true 2296 2217 2297 - '@oxlint/binding-linux-arm-gnueabihf@1.46.0': 2218 + '@oxlint/linux-x64-musl@0.17.0': 2298 2219 optional: true 2299 2220 2300 - '@oxlint/binding-linux-arm-musleabihf@1.46.0': 2221 + '@oxlint/win32-arm64@0.17.0': 2301 2222 optional: true 2302 2223 2303 - '@oxlint/binding-linux-arm64-gnu@1.46.0': 2304 - optional: true 2305 - 2306 - '@oxlint/binding-linux-arm64-musl@1.46.0': 2307 - optional: true 2308 - 2309 - '@oxlint/binding-linux-ppc64-gnu@1.46.0': 2310 - optional: true 2311 - 2312 - '@oxlint/binding-linux-riscv64-gnu@1.46.0': 2313 - optional: true 2314 - 2315 - '@oxlint/binding-linux-riscv64-musl@1.46.0': 2316 - optional: true 2317 - 2318 - '@oxlint/binding-linux-s390x-gnu@1.46.0': 2319 - optional: true 2320 - 2321 - '@oxlint/binding-linux-x64-gnu@1.46.0': 2322 - optional: true 2323 - 2324 - '@oxlint/binding-linux-x64-musl@1.46.0': 2325 - optional: true 2326 - 2327 - '@oxlint/binding-openharmony-arm64@1.46.0': 2328 - optional: true 2329 - 2330 - '@oxlint/binding-win32-arm64-msvc@1.46.0': 2331 - optional: true 2332 - 2333 - '@oxlint/binding-win32-ia32-msvc@1.46.0': 2334 - optional: true 2335 - 2336 - '@oxlint/binding-win32-x64-msvc@1.46.0': 2224 + '@oxlint/win32-x64@0.17.0': 2337 2225 optional: true 2338 2226 2339 2227 '@rollup/rollup-android-arm-eabi@4.57.1': ··· 2771 2659 2772 2660 js-tokens@9.0.1: {} 2773 2661 2774 - lefthook-darwin-arm64@2.1.0: 2662 + lefthook-darwin-arm64@1.13.6: 2775 2663 optional: true 2776 2664 2777 - lefthook-darwin-x64@2.1.0: 2665 + lefthook-darwin-x64@1.13.6: 2778 2666 optional: true 2779 2667 2780 - lefthook-freebsd-arm64@2.1.0: 2668 + lefthook-freebsd-arm64@1.13.6: 2781 2669 optional: true 2782 2670 2783 - lefthook-freebsd-x64@2.1.0: 2671 + lefthook-freebsd-x64@1.13.6: 2784 2672 optional: true 2785 2673 2786 - lefthook-linux-arm64@2.1.0: 2674 + lefthook-linux-arm64@1.13.6: 2787 2675 optional: true 2788 2676 2789 - lefthook-linux-x64@2.1.0: 2677 + lefthook-linux-x64@1.13.6: 2790 2678 optional: true 2791 2679 2792 - lefthook-openbsd-arm64@2.1.0: 2680 + lefthook-openbsd-arm64@1.13.6: 2793 2681 optional: true 2794 2682 2795 - lefthook-openbsd-x64@2.1.0: 2683 + lefthook-openbsd-x64@1.13.6: 2796 2684 optional: true 2797 2685 2798 - lefthook-windows-arm64@2.1.0: 2686 + lefthook-windows-arm64@1.13.6: 2799 2687 optional: true 2800 2688 2801 - lefthook-windows-x64@2.1.0: 2689 + lefthook-windows-x64@1.13.6: 2802 2690 optional: true 2803 2691 2804 - lefthook@2.1.0: 2692 + lefthook@1.13.6: 2805 2693 optionalDependencies: 2806 - lefthook-darwin-arm64: 2.1.0 2807 - lefthook-darwin-x64: 2.1.0 2808 - lefthook-freebsd-arm64: 2.1.0 2809 - lefthook-freebsd-x64: 2.1.0 2810 - lefthook-linux-arm64: 2.1.0 2811 - lefthook-linux-x64: 2.1.0 2812 - lefthook-openbsd-arm64: 2.1.0 2813 - lefthook-openbsd-x64: 2.1.0 2814 - lefthook-windows-arm64: 2.1.0 2815 - lefthook-windows-x64: 2.1.0 2694 + lefthook-darwin-arm64: 1.13.6 2695 + lefthook-darwin-x64: 1.13.6 2696 + lefthook-freebsd-arm64: 1.13.6 2697 + lefthook-freebsd-x64: 1.13.6 2698 + lefthook-linux-arm64: 1.13.6 2699 + lefthook-linux-x64: 1.13.6 2700 + lefthook-openbsd-arm64: 1.13.6 2701 + lefthook-openbsd-x64: 1.13.6 2702 + lefthook-windows-arm64: 1.13.6 2703 + lefthook-windows-x64: 1.13.6 2816 2704 2817 2705 loupe@3.2.1: {} 2818 2706 ··· 2853 2741 2854 2742 obug@2.1.1: {} 2855 2743 2856 - oxlint@1.46.0: 2744 + oxlint@0.17.0: 2857 2745 optionalDependencies: 2858 - '@oxlint/binding-android-arm-eabi': 1.46.0 2859 - '@oxlint/binding-android-arm64': 1.46.0 2860 - '@oxlint/binding-darwin-arm64': 1.46.0 2861 - '@oxlint/binding-darwin-x64': 1.46.0 2862 - '@oxlint/binding-freebsd-x64': 1.46.0 2863 - '@oxlint/binding-linux-arm-gnueabihf': 1.46.0 2864 - '@oxlint/binding-linux-arm-musleabihf': 1.46.0 2865 - '@oxlint/binding-linux-arm64-gnu': 1.46.0 2866 - '@oxlint/binding-linux-arm64-musl': 1.46.0 2867 - '@oxlint/binding-linux-ppc64-gnu': 1.46.0 2868 - '@oxlint/binding-linux-riscv64-gnu': 1.46.0 2869 - '@oxlint/binding-linux-riscv64-musl': 1.46.0 2870 - '@oxlint/binding-linux-s390x-gnu': 1.46.0 2871 - '@oxlint/binding-linux-x64-gnu': 1.46.0 2872 - '@oxlint/binding-linux-x64-musl': 1.46.0 2873 - '@oxlint/binding-openharmony-arm64': 1.46.0 2874 - '@oxlint/binding-win32-arm64-msvc': 1.46.0 2875 - '@oxlint/binding-win32-ia32-msvc': 1.46.0 2876 - '@oxlint/binding-win32-x64-msvc': 1.46.0 2746 + '@oxlint/darwin-arm64': 0.17.0 2747 + '@oxlint/darwin-x64': 0.17.0 2748 + '@oxlint/linux-arm64-gnu': 0.17.0 2749 + '@oxlint/linux-arm64-musl': 0.17.0 2750 + '@oxlint/linux-x64-gnu': 0.17.0 2751 + '@oxlint/linux-x64-musl': 0.17.0 2752 + '@oxlint/win32-arm64': 0.17.0 2753 + '@oxlint/win32-x64': 0.17.0 2877 2754 2878 2755 package-json-from-dist@1.0.1: {} 2879 2756
+3
turbo.json
··· 14 14 "lint": { 15 15 "dependsOn": ["^build"] 16 16 }, 17 + "lint:fix": { 18 + "cache": false 19 + }, 17 20 "test": { 18 21 "dependsOn": ["^build"] 19 22 },