Repository navigation
chore: simplify tooling to oxlint + tsc - #184
Conversation
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
@standard-server/aws-lambda
@standard-server/core
@standard-server/fastify
@standard-server/fetch
@standard-server/node
@standard-server/peer
@standard-server/shared
commit: |
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Merging this PR will not alter performance1 warning
Comparing Footnotes
|
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
- Lint and type checking:
pnpm checknow runsoxlintwith type-aware rules and TS compiler diagnostics throughoxlint-tsgolint, andpnpm formatrunsoxfmt. Probe files confirmed it catches plain TS errors plus.test.tsand.test-d.tserrors. - Build:
prepackrunstscper package andpublishConfig.exportspoints atdist/index.js/dist/index.d.ts; all 7 packages pack, and packed types resolve under TS 5.9, 6.0 and 7 withnodenextandbundlerresolution. - TypeScript config:
module: nodenext,verbatimModuleSyntax,allowImportingTsExtensions/rewriteRelativeImportExtensions, and a sharedtsconfig.lib.json; TS 7 already defaultsstrict,noUncheckedSideEffectImportsandmoduleDetectionto the old preset's effective values. - Source changes:
.tsrelative imports and the mechanical type cleanups (StandardBody = unknown, redundant| undefinedremoval,void-ing ignored promises) are behavior-preserving; the express test handler now forwards errors throughnext. - Repo tooling:
oxlint/oxfmtconfigs reproduce the former presets, pnpm is pinned viapackageManager, andAGENTS.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.
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
There was a problem hiding this comment.
✅ 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 whenrewriteRelativeImportExtensionsis on (confirmed viatsc --showConfig), so the existing.tsrelative specifiers still type-check and the build still rewrites them to.js. - Dropped
resolveJsonModule: no source file imports JSON, and all packages still compile withpackage.jsonin the program.
Verified locally: pnpm check (0 warnings, 0 errors across 164 files) and pnpm run -r prepack (all 7 packages).
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
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
This run reviewed the single commit since the prior pullfrog review.
- Agent skills excluded from tooling:
oxlint.config.tsandoxfmt.config.tsnow setignorePatterns: ['.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.
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
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes
This run reviewed the two commits pushed since 1869c21 (the last reviewed commit):
d0e1ee9—sherifback aspnpm repo:fix: re-addssherif^1.13.0as a devDependency and adds therepo:fixscript (sherif --fix) plus matchingAGENTS.mdguidance. The lockfile additions are consistent (pnpm install --frozen-lockfilesucceeds),pnpm exec sherifreports no issues, andpnpm check(164 files, 0 warnings, 0 errors) andoxfmt --check(210 files) are unchanged. Tree clean.a091220— Dependabot grouping: restores thedev-dependencies-minor-patchgroup and removes the now-obsoleteuncheckgroup and itsexclude-patterns, matching the PR description. Valid YAML, no functional impact.
Notes
sherifnow runs by hand only. The baseuncheckran oxlint/oxfmt/tsc/sherif together in CI (per its README), so thecheckjob no longer validates monorepo dependency consistency. The PR description documents this as intentional; plainpnpm exec sherifruns fine in CI if the safety net is ever wanted back.pnpm repo:fixexits 1 under GitHub Actions (Cannot fix issues inside a CI environment, because sherif refuses--fixin CI), so the newAGENTS.mdinstruction to run it after changing apackage.jsoncannot be followed by agents running in Actions. A short "run locally" note would avoid confusion.
deepseek-v4.1-flash-1017 (free via Pullfrog for OSS) | 𝕏
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p
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>
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>

Replaces
uncheckandunbuildwith a smaller setup: oxlint for lint and type checks, oxfmt for formatting, and plaintsc(TypeScript 7) for builds.Lint and type check
pnpm check/pnpm fixrunoxlint, with type-aware rules and type checking enabled inoxlint.config.ts(viaoxlint-tsgolint). One pass covers lint, type-aware rules and TypeScript errors, including*.test-d.ts.pnpm formatrunsoxfmt. Formatting is no longer checked in CI.pnpm repo:fixrunssherif --fix, which fixes monorepo issues such as unordered or mismatched dependencies. It runs by hand, not in CI.uncheckand the pre-commit hook. The former presets are written out inoxlint.config.ts,oxfmt.config.tsand the tsconfigs.correctnessandsuspiciouscategories are errors, plus a short list of hand-picked rules. All existing warnings are fixed. In public types this only drops union members thatunknownor?already cover (for exampleStandardBody), so the types are identical, including underexactOptionalPropertyTypes.uncheckgroup. Minor and patch dev-dependency updates, oxlint and oxfmt included, still come grouped in one PR (dev-dependencies-minor-patch).TypeScript
module: nodenextandverbatimModuleSyntax. Relative imports now use explicit.tsextensions, whichrewriteRelativeImportExtensionsturns into.json build.allowImportingTsExtensionsis implied byrewriteRelativeImportExtensions, andresolveJsonModulebynodenext, so JSON imports writtenwith { type: 'json' }are still typed.fastifyandaws-lambdause the samelibasnode(Node types, no DOM), so project references andcompositeare no longer needed.tsconfig.lib.json, includinginclude(src) andexclude. Most package tsconfigs are now a singleextends.Build
prepackruns plaintsc, which emits one.jsand one.d.tsper source file intodist.publishConfig.exportsnow points atdist/index.jsanddist/index.d.ts, replacing the.mjsand.d.mtsfiles unbuild produced.skipLibCheck: falseundernodenextandbundlerresolution, and runs in Node.Editors and agents
oxfmtandoxlintlanguage servers.AGENTS.md..agents/and.claude/are now tracked, except.claude/worktrees/, which.gitignoreand vitest both skip..agents/skills/**,.claude/skills/**).Misc
packageManagerinstead ofdevEngines.Notes
pnpm checktakes about 1.7 s, against about 8.3 s for the olduncheckon a fresh checkout..d.tsfiles show up at build time (prepack), not inpnpm check. CI still catches them, becausepublish_previewpacks every package.auto_install_extensionsin personal settings.🤖 Generated with Claude Code
https://claude.ai/code/session_01VVaw7QpWMUaPoB4z52Dy9p