Skip to content

chore: simplify tooling to oxlint + tsc - #184

Merged
dinwwwh merged 8 commits into
mainfrom
claude/simplify-lint-build-tools-wo4j8a
Nov 5, 2026
Merged

dinwwwh merged 8 commits into
mainfrom
claude/simplify-lint-build-tools-wo4j8a

Conversation

@dinwwwh

@dinwwwh dinwwwh commented Nov 5, 2026 •

Copy link
Copy Markdown
Member

Replaces uncheck and unbuild with a smaller setup: oxlint for lint and type checks, oxfmt for formatting, and plain tsc (TypeScript 7) for builds.

Lint and type check

  • pnpm check / pnpm fix run oxlint, with type-aware rules and type checking enabled in oxlint.config.ts (via oxlint-tsgolint). One pass covers lint, type-aware rules and TypeScript errors, including *.test-d.ts.
  • pnpm format runs oxfmt. Formatting is no longer checked in CI.
  • pnpm repo:fix runs sherif --fix, which fixes monorepo issues such as unordered or mismatched dependencies. It runs by hand, not in CI.
  • Removed uncheck and the pre-commit hook. The former presets are written out in oxlint.config.ts, oxfmt.config.ts and the tsconfigs.
  • The correctness and suspicious categories are errors, plus a short list of hand-picked rules. All existing warnings are fixed. In public types this only drops union members that unknown or ? already cover (for example StandardBody), so the types are identical, including under exactOptionalPropertyTypes.
  • Dependabot: removed the uncheck group. Minor and patch dev-dependency updates, oxlint and oxfmt included, still come grouped in one PR (dev-dependencies-minor-patch).

TypeScript

  • TypeScript 7 for builds, type checks and the playgrounds.
  • module: nodenext and verbatimModuleSyntax. Relative imports now use explicit .ts extensions, which rewriteRelativeImportExtensions turns into .js on build.
  • Options that are already covered are left out. allowImportingTsExtensions is implied by rewriteRelativeImportExtensions, and resolveJsonModule by nodenext, so JSON imports written with { type: 'json' } are still typed.
  • fastify and aws-lambda use the same lib as node (Node types, no DOM), so project references and composite are no longer needed.
  • Shared settings live in tsconfig.lib.json, including include (src) and exclude. Most package tsconfigs are now a single extends.

Build

  • prepack runs plain tsc, which emits one .js and one .d.ts per source file into dist. publishConfig.exports now points at dist/index.js and dist/index.d.ts, replacing the .mjs and .d.mts files unbuild produced.
  • Tested by packing all 7 packages and installing the tarballs in a fresh project. It type-checks with skipLibCheck: false under nodenext and bundler resolution, and runs in Node.

Editors and agents

  • VS Code recommends the oxc extension.
  • Zed formats and fixes on save through the Oxc extension's oxfmt and oxlint language servers.
  • Added AGENTS.md. .agents/ and .claude/ are now tracked, except .claude/worktrees/, which .gitignore and vitest both skip.
  • oxlint and oxfmt skip installed agent skills (.agents/skills/**, .claude/skills/**).

Misc

  • oxlint 1.91 and oxfmt 0.76. Vitest is unchanged.
  • pnpm is pinned through packageManager instead of devEngines.

Notes

  • A clean pnpm check takes about 1.7 s, against about 8.3 s for the old uncheck on a fresh checkout.
  • Errors that only come from generating .d.ts files show up at build time (prepack), not in pnpm check. CI still catches them, because publish_preview packs every package.
  • Contributors using Zed need to install the Oxc extension themselves, since Zed only accepts auto_install_extensions in personal settings.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p

Lint and type check
- `check`/`fix` run oxlint with type-aware rules and type checking enabled
  in oxlint.config.ts (via oxlint-tsgolint); `format` runs oxfmt and is no
  longer checked in CI
- remove uncheck, sherif and the pre-commit hook; inline the oxlint/oxfmt
  presets
- `correctness` and `suspicious` categories as errors, plus a short list of
  hand-picked rules; fix all existing warnings (public types unchanged)
- drop dependabot groups

TypeScript
- TypeScript 7 for the build, type checks and playgrounds
- inline the tsconfig presets into tsconfig.json + tsconfig.lib.json,
  dropping options that are already the default
- `module: nodenext`, `verbatimModuleSyntax`; relative imports use explicit
  `.ts` extensions, rewritten to `.js` on build
- fastify and aws-lambda use the same lib as node (no DOM), so project
  references are no longer needed
- package tsconfigs share include (src + package.json) and exclude from
  tsconfig.lib.json; drop root include patterns that matched nothing

Build
- replace unbuild with plain `tsc` (per-file .js + .d.ts in dist)

Editors and agents
- VS Code recommends the oxc extension
- Zed formats and fixes on save through the Oxc extension's oxfmt and
  oxlint language servers
- add AGENTS.md; track .agents and .claude, but ignore .claude/worktrees
  (also excluded from vitest)

Misc
- oxlint 1.91, oxfmt 0.76
- pin pnpm via `packageManager` instead of `devEngines`

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
@pkg-pr-new

pkg-pr-new Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
@standard-server/aws-lambda

npm i https://pkg.pr.new/@standard-server/aws-lambda@184

@standard-server/core

npm i https://pkg.pr.new/@standard-server/core@184

@standard-server/fastify

npm i https://pkg.pr.new/@standard-server/fastify@184

@standard-server/fetch

npm i https://pkg.pr.new/@standard-server/fetch@184

@standard-server/node

npm i https://pkg.pr.new/@standard-server/node@184

@standard-server/peer

npm i https://pkg.pr.new/@standard-server/peer@184

@standard-server/shared

npm i https://pkg.pr.new/@standard-server/shared@184

commit: 4d68707

@codecov

codecov Bot commented Nov 5, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@codspeed

codspeed Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

1 warning

⚠️ 4 benchmarks are dominated by system calls

System calls cannot be simulated consistently and are left out of the measure. The reported value understates the real cost. Switch to the Walltime instrument to measure them.

Learn more about system calls

See affected benchmarks

✅ 26 untouched benchmarks
⏩ 108 skipped benchmarks1


Comparing claude/simplify-lint-build-tools-wo4j8a (4d68707) with main (a840ead)

Open in CodSpeed

Footnotes

  1. 108 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

  • Lint and type checking: pnpm check now runs oxlint with type-aware rules and TS compiler diagnostics through oxlint-tsgolint, and pnpm format runs oxfmt. Probe files confirmed it catches plain TS errors plus .test.ts and .test-d.ts errors.
  • Build: prepack runs tsc per package and publishConfig.exports points at dist/index.js / dist/index.d.ts; all 7 packages pack, and packed types resolve under TS 5.9, 6.0 and 7 with nodenext and bundler resolution.
  • TypeScript config: module: nodenext, verbatimModuleSyntax, allowImportingTsExtensions / rewriteRelativeImportExtensions, and a shared tsconfig.lib.json; TS 7 already defaults strict, noUncheckedSideEffectImports and moduleDetection to the old preset's effective values.
  • Source changes: .ts relative imports and the mechanical type cleanups (StandardBody = unknown, redundant | undefined removal, void-ing ignored promises) are behavior-preserving; the express test handler now forwards errors through next.
  • Repo tooling: oxlint / oxfmt configs reproduce the former presets, pnpm is pinned via packageManager, and AGENTS.md / editor configs are added.

Verified locally: pnpm check (0 errors), pnpm exec vitest run (60 files / 1485 tests), pnpm run -r prepack (all 7 packages), pnpm exec oxfmt --check, clean git status.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

rewriteRelativeImportExtensions already allows .ts imports, and no file
imports JSON (TypeScript 7 handles `with { type: 'json' }` under nodenext
without it). Build output is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the follow-up commit 8827510, which removes two compiler options from the root tsconfig.json, and re-ran type checking and all package builds under TypeScript 7.0.2.

  • Dropped allowImportingTsExtensions: TS 7 implicitly enables it when rewriteRelativeImportExtensions is on (confirmed via tsc --showConfig), so the existing .ts relative specifiers still type-check and the build still rewrites them to .js.
  • Dropped resolveJsonModule: no source file imports JSON, and all packages still compile with package.json in the program.

Verified locally: pnpm check (0 warnings, 0 errors across 164 files) and pnpm run -r prepack (all 7 packages).

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

An imported package.json is part of the program anyway; the include entry
only mattered with composite projects. Build output is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
Skills under .agents/skills and .claude/skills are usually installed from
elsewhere, so oxlint and oxfmt leave them as they are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the single commit since the prior pullfrog review.

  • Agent skills excluded from tooling: oxlint.config.ts and oxfmt.config.ts now set ignorePatterns: ['.agents/skills/**', '.claude/skills/**'], so locally installed skills are neither linted nor reformatted.

Verified with throwaway probe files: skills/** files are skipped by both tools, while non-skill files under .agents/ are still linted and formatted. pnpm exec oxlint reports 164 files / 0 warnings / 0 errors and pnpm exec oxfmt --check 210 files, both unchanged; probes removed and git status is clean.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

sherif --fix fixes monorepo issues (unordered or mismatched dependencies
and similar); AGENTS.md says to run it after changing a package.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

This run reviewed the two commits pushed since 1869c21 (the last reviewed commit):

  • d0e1ee9 — sherif back as pnpm repo:fix: re-adds sherif ^1.13.0 as a devDependency and adds the repo:fix script (sherif --fix) plus matching AGENTS.md guidance. The lockfile additions are consistent (pnpm install --frozen-lockfile succeeds), pnpm exec sherif reports no issues, and pnpm check (164 files, 0 warnings, 0 errors) and oxfmt --check (210 files) are unchanged. Tree clean.
  • a091220 — Dependabot grouping: restores the dev-dependencies-minor-patch group and removes the now-obsolete uncheck group and its exclude-patterns, matching the PR description. Valid YAML, no functional impact.

Notes

  • sherif now runs by hand only. The base uncheck ran oxlint/oxfmt/tsc/sherif together in CI (per its README), so the check job no longer validates monorepo dependency consistency. The PR description documents this as intentional; plain pnpm exec sherif runs fine in CI if the safety net is ever wanted back.
  • pnpm repo:fix exits 1 under GitHub Actions (Cannot fix issues inside a CI environment, because sherif refuses --fix in CI), so the new AGENTS.md instruction to run it after changing a package.json cannot be followed by agents running in Actions. A short "run locally" note would avoid confusion.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏

dinwwwh added a commit to middleapi/orpc that referenced this pull request Nov 5, 2026
Follows middleapi/standard-server#184: replace ESLint and obuild with
oxlint, oxfmt and plain `tsc`, matching standard-server's configs except
where oRPC needs something different (listed below).

## Lint and type check

- `pnpm check` / `pnpm fix` run oxlint with type-aware rules and type
checking (via oxlint-tsgolint). This covers packages, tests,
`*.test-d.ts`, playgrounds and the docs site, and replaces both `pnpm
lint` and `pnpm type:check`.
- `pnpm format` runs oxfmt. CI doesn't check formatting.
- The config starts from standard-server's and keeps oRPC's
restrictions: `JSON.stringify`, `.bytes`, `throwIfAborted` and
`AbortSignal.any` as banned properties, plus restricted globals and
restricted imports.
- Findings are fixed in code rather than turned off where possible:
  - `void` on intentional fire-and-forget promises
  - `import * as z from 'zod'`
  - explicit `return undefined`
  - `toSorted`/`toReversed` outside packages
  - inline `oxlint-disable-next-line` at the few deliberate sites
- Removed: eslint and its plugins, lint-staged and simple-git-hooks.

## TypeScript and build

- TypeScript 7 with `module: nodenext` and `verbatimModuleSyntax`.
Relative imports use explicit `.ts` extensions, which `tsc` rewrites to
`.js`.
- `tsconfig.base.json` is folded into `tsconfig.json` +
`tsconfig.lib.json`, and project references are dropped.
- Packages build with `tsc` (per-file `.js` + `.d.ts`). Exports change
from `.mjs`/`.d.mts` to `.js`/`.d.ts`. obuild, `build.config.ts` and
`verifyDist` are removed.
- bun, cloudflare and nest type check with `tsconfig.json` (which
includes their tests) and build with `tsconfig.build.json`.
- `packages/next/src/server-function.test.tsx` shared its name with
`server-function.test.ts`, so TypeScript skipped it and it was never
type checked. It's renamed to `server-function.action-state.test.tsx`.

## Formatting

The repo is reformatted with oxfmt, including code samples in docs
`.mdx` files, in its own commit (`chore: format with oxfmt`) to keep
review manageable. `@ts-expect-error` directives that the reformat moved
away from their error lines are moved back.

## Repo

- Editor settings for VS Code and Zed now use oxc. CI runs `pnpm check`.
- Dependabot groups `@standard-server/*`, `@openapi-spec/*` and
dev-dependency minor/patch updates.
- `pnpm repo:fix` runs `sherif --fix`, ignoring `typescript` versions
because the next and nest playgrounds stay on TypeScript 6 on purpose.
sherif only matches exact versions, so a version-specific ignore would
stop working after the next bump.
- pnpm is pinned via `packageManager: pnpm@12.16.1`.
- `CLAUDE.md` and the Claude Code format hook are removed; `AGENTS.md`
is the concise instructions file.
- The vendored agent skills stay committed and are excluded from lint
and format via `ignorePatterns`. `skills-lock.json` doesn't pin
versions, so git is the pin.

## Differences from standard-server

- **Rules off everywhere:**
- `no-generated-empty-object-type`: fixing it would change public types.
- `no-unnecessary-type-assertion`: its auto-fix broke type checking on
generic code.
- `unbound-method`: about 400 false positives on `next` taken from
interceptor options.
  - `no-shadow`: 127 hits in package source.
- **Relaxed override:** the override for tests and playgrounds also
covers `apps/content`, and turns off `require-yield`,
`no-unsafe-optional-chaining` and `await-thenable` for test fixtures.
- **Kept on purpose:**
  - `jsx` and the `.test.tsx` / `__tests__` entries in the tsconfigs.
- The `typescript-6` alias for the docs JSDoc checker, which needs the
TS compiler API that TS7 doesn't have.
  - TypeScript 6 in the next and nest playgrounds, for the same reason.
  - The `docs:validate` step in CI.

## Verification

- `pnpm check` and `oxfmt --check` pass.
- Tests pass: vitest 4390, `@orpc/cloudflare` 81 (workerd), `@orpc/bun`
100.
- All 29 packages build with `tsc`.
- `pnpm docs:validate` passes, and `blume build` succeeds.
- The playground type checks pass (next and nest on TS6, cloudflare on
TS7).

For contributors: existing clones still have simple-git-hooks'
pre-commit hook, which calls the removed `lint-staged`. Delete it once
with `rm .git/hooks/pre-commit`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01VVaw7NPXNhdw5kppy7fFNE

---------

Co-authored-by: Claude <noreply@anthropic.com>
@dinwwwh
dinwwwh merged commit a382274 into main Nov 5, 2026
11 checks passed
dinwwwh added a commit to middleapi/openapi-spec that referenced this pull request Nov 5, 2026
Applies the same tooling setup as
[middleapi/standard-server#184](middleapi/standard-server#184):
oxlint for lint and type checks, oxfmt for formatting, and plain `tsc`
for builds, replacing `uncheck` and `unbuild`.

## Lint and type check

- `pnpm check` / `pnpm fix` run `oxlint`, with type-aware rules and type
checking enabled in `oxlint.config.ts` (via `oxlint-tsgolint`). One pass
covers lint, type-aware rules and TypeScript errors, including
`*.test-d.ts`.
- `pnpm format` runs `oxfmt`. Formatting is no longer checked in CI.
- `pnpm repo:fix` runs `sherif --fix`, which fixes monorepo issues such
as unordered or mismatched dependencies. It runs by hand, not in CI.
- Removed `uncheck`, the pre-commit hook, and the Stop hook in
`.claude/settings.json` that ran `uncheck` after every Claude Code turn.
The former presets are written out in `oxlint.config.ts`,
`oxfmt.config.ts` and the tsconfigs.
- The `correctness` and `suspicious` categories are errors, plus a short
list of hand-picked rules, with `unicorn/no-thenable` still off. Rules
that the old preset had and these don't cover are dropped on purpose,
matching standard-server. The 49 new findings are handled:
- 2 in package source: renamed shadowed names in
`downgrader/src/v3.1-to-v3.0.ts`. A callback's `value` became `item`,
and the `inline` parameter, which shadowed the `inline()` function,
became `isInline`.
- 15 fixed in tests: 12 unnecessary assertions (autofixed) and 3
`.sort()` calls changed to `.toSorted()`.
- 32 turned off for test files and bench helpers: `no-shadow`,
`consistent-function-scoping`, and `no-generated-empty-object-type`. The
`namespace.test-d.ts` checks build a `{}` type on purpose.
- Removed the `oxc/no-accumulating-spread` disable/enable comments in
`router/src/index.ts`. That rule is no longer on, so the comments did
nothing.
- Dependabot: removed the `uncheck` group. Minor and patch
dev-dependency updates, oxlint and oxfmt included, still come grouped in
one PR (`dev-dependencies-minor-patch`).

## TypeScript

- `module: nodenext` and `verbatimModuleSyntax`. Relative imports now
use explicit `.ts` extensions, which `rewriteRelativeImportExtensions`
turns into `.js` on build.
- Options that are already covered are left out.
`allowImportingTsExtensions` is implied by
`rewriteRelativeImportExtensions`, and `resolveJsonModule` by
`nodenext`, so JSON imports written `with { type: 'json' }` are still
typed.
- Shared settings live in `tsconfig.lib.json`, including `include`
(`src`) and `exclude`. Each package tsconfig is now a single `extends`,
with no project references.
- Unchanged: `exactOptionalPropertyTypes`, `lib: ES2024` for tests and
scripts, and `ES2022` with no DOM types for package source.
`@typescript/typescript6` stays because `namespace.test.ts` uses
TypeScript's JS API.

## Build and CI

- `prepack` runs plain `tsc`, which emits one `.js` and one `.d.ts` per
source file into `dist`. `publishConfig.exports` now points at `.js` /
`.d.ts` instead of `.mjs` / `.d.mts`. Removed the leftover `unbuild`
config from each package's `package.json`.
- New `publish_preview` CI job, the same as standard-server's:
`pkg-pr-new` packs every package on each PR and publishes installable
previews. Packing runs `prepack`, so errors that only come from
generating `.d.ts` files fail on the PR instead of first showing at
release. The old `uncheck` caught them through `tsc -b`.
- Tested against the published 0.6.0: every entry point's runtime
exports are identical. A consumer project's types check the same way
under `nodenext` and `bundler`, with `exactOptionalPropertyTypes` and
`skipLibCheck: false`.

## Editors and agents

- VS Code: format and fix on save with the oxc extension, which it
recommends.
- Zed: formats and fixes on save through the Oxc extension's language
servers. `.zed/settings.json` is now identical to standard-server's, so
the old `typescript-language-server` auto-import preference is gone.
- Replaced the empty `.claude/CLAUDE.md` with `AGENTS.md`.
- Ignored `.claude/worktrees/`, which vitest also skips now.
- oxlint and oxfmt skip installed agent skills (`.agents/skills/**`,
`.claude/skills/**`).

## Misc

- oxlint 1.91 and oxfmt 0.76.
- pnpm 12.16.1 is pinned through `packageManager` instead of
`devEngines`.

## Verification

- `pnpm check`: no warnings or errors. It still catches type errors in
package source and in `*.test-d.ts`.
- `oxfmt --check`: clean.
- Tests: all 372 in 11 files pass, the same as before. The benches run.
- Packaging: all 3 packages build and pack with only `dist`, `LICENSE`,
`README.md` and `package.json`. A test export that only fails during
`.d.ts` generation (TS4094) fails the build, while `pnpm check` alone
passes.

## Notes

- Contributors using Zed need to install the Oxc extension themselves.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants