Skip to content

Replace deno lint with Oxlint - #1358

Open
dahlia wants to merge 24 commits into
fedify-dev:mainfrom
dahlia:chore/replace-deno-lint-with-oxlint
Open

dahlia wants to merge 24 commits into
fedify-dev:mainfrom
dahlia:chore/replace-deno-lint-with-oxlint

Conversation

@dahlia

@dahlia dahlia commented Nov 3, 2026

Copy link
Copy Markdown
Member

Closes #1286, part of #1281.

Why

Deno is no longer the right default for repository tooling, but Fedify still needs Deno and JSR compatibility. This change moves the default lint path to Oxlint without replacing the formatter, changing type checking, or altering published package behavior. Keeping those concerns separate avoids a large formatting diff and leaves Oxfmt to #1285.

How

The root .oxlintrc.json disables every Oxlint category and lists the rules explicitly. That keeps the migration tied to the Deno recommended set instead of silently adopting Oxlint's broader defaults. LINTING.md documents non-obvious mappings, option differences, and accepted gaps, including the omitted Fresh rules.

Existing deno-lint-ignore comments are translated to named Oxlint directives. A small audit script rejects bare oxlint-disable and eslint-disable comments, unknown rule names, and directives outside the configured set. The generated vocabulary file is gitignored, so the lint task names it explicitly.

Additional Oxlint rules land one per commit. This pull request includes only the first-tier rules agreed in the issue; react, jsx-a11y, vitest, tier 2 and tier 3 rules, and type-aware rules are deferred. no-await-in-loop and no-console stay at warning level, with the CLI exempted from no-console.

All direct @logtape/* packages are aligned on 2.4.2, and @logtape/lint is wired into Oxlint with its recommended rule set. Anti-slop is vendored under tools/oxlint/anti-slop/ with its license and provenance; only the rules that already pass are enabled, and the rest are tracked as follow-ups.

Editor settings disable deno.lint and recommend the Oxc extension, so Deno keeps formatting and type diagnostics while Oxlint owns lint diagnostics.

Enabled rules

Deno parity

Rule Severity Why enabled
typescript/adjacent-overload-signatures error Mirrors the corresponding Deno recommended rule.
typescript/ban-ts-comment error Mirrors Deno's ban-ts-comment, including description requirements.
typescript/no-wrapper-object-types error Covers the wrapper-type half of Deno's ban-types.
typescript/no-unsafe-function-type error Covers the Function half of Deno's ban-types.
eslint/constructor-super error Mirrors the corresponding Deno recommended rule.
eslint/for-direction error Mirrors the corresponding Deno recommended rule.
eslint/getter-return error Mirrors the corresponding Deno recommended rule.
react/jsx-boolean-value error Mirrors the corresponding Deno recommended rule.
react/button-has-type error Mirrors the corresponding Deno recommended rule.
react/jsx-curly-brace-presence error Mirrors the corresponding Deno recommended rule.
react/jsx-key error Mirrors the corresponding Deno recommended rule.
react/no-children-prop error Mirrors the corresponding Deno recommended rule.
react/jsx-no-comment-textnodes error Mirrors the corresponding Deno recommended rule.
react/jsx-no-duplicate-props error Mirrors the corresponding Deno recommended rule.
react/no-unescaped-entities error Mirrors the corresponding Deno recommended rule.
react/jsx-no-useless-fragment error Mirrors the corresponding Deno recommended rule.
react/jsx-props-no-spread-multi error Mirrors the corresponding Deno recommended rule.
react/void-dom-elements-no-children error Mirrors the corresponding Deno recommended rule.
eslint/no-array-constructor error Mirrors the corresponding Deno recommended rule.
eslint/no-async-promise-executor error Mirrors the corresponding Deno recommended rule.
eslint/no-case-declarations error Mirrors the corresponding Deno recommended rule.
eslint/no-class-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-compare-neg-zero error Mirrors the corresponding Deno recommended rule.
eslint/no-cond-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-const-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-constant-condition error Mirrors Deno's rule and allows constant loop conditions.
eslint/no-control-regex error Mirrors the corresponding Deno recommended rule.
eslint/no-debugger error Mirrors the corresponding Deno recommended rule.
eslint/no-delete-var error Mirrors the corresponding Deno recommended rule.
eslint/no-dupe-class-members error Mirrors the corresponding Deno recommended rule.
eslint/no-dupe-else-if error Mirrors the corresponding Deno recommended rule.
eslint/no-dupe-keys error Mirrors the corresponding Deno recommended rule.
eslint/no-duplicate-case error Mirrors the corresponding Deno recommended rule.
eslint/no-empty error Mirrors the corresponding Deno recommended rule.
eslint/no-empty-character-class error Mirrors the corresponding Deno recommended rule.
typescript/no-empty-interface error Mirrors Deno's no-empty-interface and allows single-base empty interfaces.
typescript/no-empty-object-type error Covers Deno's ban-types for {}; empty interfaces are handled separately.
eslint/no-empty-pattern error Mirrors the corresponding Deno recommended rule.
eslint/no-ex-assign error Mirrors the corresponding Deno recommended rule.
typescript/no-explicit-any error Mirrors Deno's no-explicit-any.
eslint/no-extra-boolean-cast error Mirrors the corresponding Deno recommended rule.
typescript/no-extra-non-null-assertion error Mirrors the corresponding Deno recommended rule.
eslint/no-fallthrough error Mirrors the corresponding Deno recommended rule.
eslint/no-func-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-global-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-import-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-inner-declarations error Mirrors the corresponding Deno recommended rule.
eslint/no-invalid-regexp error Mirrors the corresponding Deno recommended rule.
eslint/no-irregular-whitespace error Mirrors the corresponding Deno recommended rule.
typescript/no-misused-new error Mirrors the corresponding Deno recommended rule.
typescript/no-namespace error Mirrors the corresponding Deno recommended rule.
eslint/no-new-native-nonconstructor error Covers Deno's no-new-symbol and BigInt.
eslint/no-obj-calls error Mirrors the corresponding Deno recommended rule.
eslint/no-prototype-builtins error Mirrors the corresponding Deno recommended rule.
eslint/no-redeclare error Mirrors the corresponding Deno recommended rule.
eslint/no-regex-spaces error Mirrors the corresponding Deno recommended rule.
eslint/no-self-assign error Mirrors the corresponding Deno recommended rule.
eslint/no-setter-return error Mirrors the corresponding Deno recommended rule.
eslint/no-shadow-restricted-names error Mirrors the corresponding Deno recommended rule.
typescript/no-this-alias error Mirrors the corresponding Deno recommended rule.
eslint/no-this-before-super error Mirrors the corresponding Deno recommended rule.
eslint/no-unreachable error Mirrors the corresponding Deno recommended rule.
eslint/no-unsafe-finally error Mirrors the corresponding Deno recommended rule.
eslint/no-unsafe-negation error Mirrors the corresponding Deno recommended rule.
eslint/no-unused-labels error Mirrors the corresponding Deno recommended rule.
eslint/no-unused-vars error Mirrors Deno's no-unused-vars with _ ignore patterns.
eslint/no-var error Mirrors the corresponding Deno recommended rule.
eslint/no-with error Mirrors the corresponding Deno recommended rule.
typescript/prefer-as-const error Mirrors the corresponding Deno recommended rule.
eslint/prefer-const error Mirrors Deno's destructuring behavior.
typescript/prefer-namespace-keyword error Mirrors the corresponding Deno recommended rule.
eslint/require-await error Mirrors the corresponding Deno recommended rule.
eslint/require-yield error Mirrors the corresponding Deno recommended rule.
eslint/use-isnan error Mirrors the corresponding Deno recommended rule.
eslint/valid-typeof error Mirrors the corresponding Deno recommended rule.
react/no-danger error Matches Deno's fresh tag for the Fresh examples.
react/no-danger-with-children error Matches Deno's fresh tag for the Fresh examples.
react/rules-of-hooks error Matches Deno's fresh tag for the Fresh examples.

Additional Oxlint rules

Rule Severity Why enabled
eslint/no-await-in-loop warn Warns on sequential awaits; many existing loops are intentionally sequential.
eslint/no-console warn Warns outside @fedify/cli, where console output is the user interface.
import/no-duplicates error Catches duplicate imports after merges.
promise/no-nesting error Rejects nested promise chains.
promise/no-return-wrap error Rejects unnecessary Promise.resolve() and reject() wrapping.
eslint/no-throw-literal error Requires throwing errors; error classes keep throw this with suppressions.
eslint/no-unsafe-optional-chaining error Prevents indexing or casting through optional chains.
eslint/no-self-compare error Caught two real ?? and > precedence bugs in nodeinfo.
eslint/no-useless-escape error Removes identity escapes from regular expressions and templates.
unicorn/prefer-node-protocol error Keeps Node.js built-in imports unambiguous.
unicorn/prefer-includes error Prefers includes() for membership checks.
unicorn/error-message error Requires messages on Error and AggregateError.
unicorn/no-array-for-each error Prefers for...of and preserves batch filter semantics.
typescript/no-import-type-side-effects error Avoids empty side-effect imports left by inline type specifiers.
typescript/prefer-for-of error Simplifies index loops; the UTF-16 loop is exempted.
typescript/no-extraneous-class error Rejects static-only classes; NestJS modules are exempted.

Anti-slop rules

Rule Severity Why enabled
oxc/no-accumulating-spread error Companion to the anti-slop reducer rules.
anti-slop/no-module-mocking error Prefers real dependency seams over module mocks.
anti-slop/no-reduce-accumulator-copy error Rejects reducer accumulator copies.
anti-slop/no-unknown-type-aliases error Rejects aliases that erase to unknown.
anti-slop/no-widen-then-assert error Rejects widening and asserting back to a narrower type.
anti-slop/no-array-filter-map error Rejects eager adjacent filter/map passes.
anti-slop/no-reflect-get error Prefers typed property access; Proxy and cache paths are exempted.
anti-slop/no-reflect-apply error Prefers typed calls; Proxy forwarding paths are exempted.

LogTape rules

Rule Severity Why enabled
@logtape/no-message-interpolation error Requires structured LogTape messages.
@logtape/prefer-lazy-evaluation warn Warns when log properties are computed eagerly.
@logtape/no-unawaited-log error Prevents dropped log promises.
@logtape/require-meta-sink warn Warns when the meta logger has no dedicated sink.

Follow-ups

Type-aware linting, the deferred anti-slop rules, and the remaining Oxlint rule tiers are intentionally out of scope. Oxfmt remains #1285.

@dahlia dahlia added this to the Fedify 2.5 milestone Nov 3, 2026
@dahlia dahlia self-assigned this Nov 3, 2026
@dahlia dahlia added runtime/deno Deno runtime related component/build Build system and packaging labels Nov 3, 2026
@dahlia
dahlia requested a review from 2chanhaeng as a code owner November 3, 2026 03:21
@netlify

netlify Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for fedify-json-schema canceled.

Name Link
🔨 Latest commit f4006f4
🔍 Latest deploy log https://app.netlify.com/projects/fedify-json-schema/deploys/6aec1ffbd826661852c0c588

@dahlia
dahlia requested a review from sij411 as a code owner November 3, 2026 03:21
@coderabbitai

coderabbitai Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 232 files, which is 82 over the limit of 150.

To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration

  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 8de4f025-e89f-4141-bded-546fe36a85f0
Commits

Reviewing files that changed from the base of the PR and between a776599 and f4006f4.

Files ignored due to path filters: 5

  • deno.lock is excluded by !**/*.lock
  • packages/vocab-tools/src/__snapshots__/class.test.ts.deno.snap is excluded by !**/*.snap
  • packages/vocab-tools/src/__snapshots__/class.test.ts.node.snap is excluded by !**/*.snap
  • packages/vocab-tools/src/__snapshots__/class.test.ts.snap is excluded by !**/*.snap
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
Files selected for processing: 232

  • .agents/skills/create-integration-package/package/deno.jsonc
  • .devcontainer/devcontainer.json
  • .hongdown.toml
  • .oxlintrc.json
  • .vscode/extensions.json
  • .vscode/settings.json
  • .zed/settings.json
  • CONTRIBUTING.md
  • LINTING.md
  • deno.json
  • examples/actor-lookup-cli/main.ts
  • examples/adonisjs/start/container_bindings_middleware.ts
  • examples/astro/src/lib/store.ts
  • examples/fresh/deno.json
  • examples/hono-sample/deno.json
  • examples/lint/oxlint/deno.json
  • examples/next14-app-router/app/layout.tsx
  • examples/next14-app-router/data/store.ts
  • examples/next15-app-router/data/store.ts
  • examples/next15-app-router/eslint.config.mjs
  • examples/rfc-9421-test/app.ts
  • examples/rfc-9421-test/main.ts
  • examples/solidstart/src/routes/users/[identifier].tsx
  • examples/sveltekit-sample/src/lib/fetch.ts
  • examples/sveltekit-sample/src/lib/store.ts
  • examples/test-examples/mod.test.ts
  • mise.toml
  • package.json
  • packages/adonisjs/providers/fedify_provider.ts
  • packages/adonisjs/src/types.ts
  • packages/amqp/deno.json
  • packages/amqp/src/mq.ts
  • packages/astro/deno.json
  • packages/backfill/deno.json
  • packages/backfill/src/types.ts
  • packages/cfworkers/deno.json
  • packages/cfworkers/src/mod.test.ts
  • packages/cfworkers/src/mod.ts
  • packages/cli/deno.json
  • packages/cli/src/bench/result/build.ts
  • packages/cli/src/bench/result/expect/evaluate.test.ts
  • packages/cli/src/bench/scenarios/inbox.test.ts
  • packages/cli/src/bench/scenarios/mixed.ts
  • packages/cli/src/diagnostics.ts
  • packages/cli/src/inbox.tsx
  • packages/cli/src/inbox/view.tsx
  • packages/cli/src/lookup.ts
  • packages/cli/src/nodeinfo.ts
  • packages/cli/src/portable.test.ts
  • packages/cli/src/relay.ts
  • packages/cli/src/tunnel.test.ts
  • packages/cli/src/webfinger/action.ts
  • packages/cli/src/webfinger/error.ts
  • packages/cli/src/webfinger/mod.test.ts
  • packages/cli/test/bench/fixture.ts
  • packages/debugger/deno.json
  • packages/debugger/src/mod.test.ts
  • packages/debugger/src/mod.tsx
  • packages/denokv/deno.json
  • packages/denokv/src/mod.ts
  • packages/elysia/deno.json
  • packages/elysia/src/index.ts
  • packages/express/deno.json
  • packages/express/src/index.ts
  • packages/fastify/deno.json
  • packages/fedify/deno.json
  • packages/fedify/src/cfworkers/runner.ts
  • packages/fedify/src/federation/activity-listener.ts
  • packages/fedify/src/federation/builder.test.ts
  • packages/fedify/src/federation/builder.ts
  • packages/fedify/src/federation/compound-fanout.test.ts
  • packages/fedify/src/federation/federation.ts
  • packages/fedify/src/federation/handler.ts
  • packages/fedify/src/federation/inbox-observation.ts
  • packages/fedify/src/federation/inbox-report.test.ts
  • packages/fedify/src/federation/inbox-view.ts
  • packages/fedify/src/federation/middleware.test.ts
  • packages/fedify/src/federation/middleware.ts
  • packages/fedify/src/federation/mq.ts
  • packages/fedify/src/federation/negotiation.ts
  • packages/fedify/src/federation/outbound-report.test.ts
  • packages/fedify/src/federation/outgoing-proof.test.ts
  • packages/fedify/src/federation/portable-collection.test.ts
  • packages/fedify/src/federation/send.test.ts
  • packages/fedify/src/federation/tasks/codec.ts
  • packages/fedify/src/federation/tasks/enqueue.test.ts
  • packages/fedify/src/nodeinfo/client.test.ts
  • packages/fedify/src/sig/http.test.ts
  • packages/fedify/src/sig/key.ts
  • packages/fedify/src/sig/portable-collection.test.ts
  • packages/fedify/src/sig/proof.test.ts
  • packages/fedify/src/sig/proof.ts
  • packages/fedify/src/utils/docloader.test.ts
  • packages/fedify/src/utils/kv-cache.test.ts
  • packages/fixture/deno.json
  • packages/fixture/src/docloader.ts
  • packages/fixture/src/test.ts
  • packages/fresh/deno.json
  • packages/fresh/src/mod.test.ts
  • packages/h3/deno.json
  • packages/hono/deno.json
  • packages/hono/src/mod.test.ts
  • packages/init/deno.json
  • packages/init/src/action/utils.ts
  • packages/init/src/json/deps.json
  • packages/init/src/test/fill.ts
  • packages/init/src/test/lookup.ts
  • packages/interaction-controls/deno.json
  • packages/interaction-controls/src/collection.ts
  • packages/interaction-controls/src/control.ts
  • packages/interaction-controls/src/feature.test.ts
  • packages/koa/deno.json
  • packages/koa/src/index.ts
  • packages/lint/deno.json
  • packages/lint/src/lib/oxlint.ts
  • packages/lint/src/lib/property-checker.ts
  • packages/lint/src/lib/reachability.ts
  • packages/lint/src/rules/outbox-listener-delivery-not-awaited.ts
  • packages/lint/src/tests/integration.test.ts
  • packages/mysql/deno.json
  • packages/mysql/src/mq.ts
  • packages/nestjs/src/fedify.middleware.ts
  • packages/nestjs/src/fedify.module.ts
  • packages/netlify/deno.json
  • packages/netlify/test/kv.test.ts
  • packages/nuxt/deno.json
  • packages/nuxt/src/module.ts
  • packages/nuxt/src/runtime/server/plugin.ts
  • packages/pglite/deno.json
  • packages/postgres/deno.json
  • packages/postgres/src/kv.expiry.test.ts
  • packages/postgres/src/kv.index.test.ts
  • packages/postgres/src/kv.test.ts
  • packages/postgres/src/kv.ts
  • packages/postgres/src/mq.test.ts
  • packages/postgres/src/mq.ts
  • packages/postgres/src/utils.ts
  • packages/redis/deno.json
  • packages/redis/src/mq.ts
  • packages/relay/deno.json
  • packages/relay/src/litepub.test.ts
  • packages/relay/src/mastodon.test.ts
  • packages/solidstart/deno.json
  • packages/solidstart/src/response.test.ts
  • packages/solidstart/src/response.ts
  • packages/sqlite/deno.json
  • packages/sqlite/src/kv.ts
  • packages/sqlite/src/mq.ts
  • packages/sveltekit/deno.json
  • packages/testing/deno.json
  • packages/testing/src/context.ts
  • packages/testing/src/docloader.ts
  • packages/testing/src/mock.test.ts
  • packages/testing/src/mock.ts
  • packages/uri-template/deno.json
  • packages/uri-template/old/uri-template-router.test.ts
  • packages/uri-template/old/url-template.test.ts
  • packages/uri-template/src/template/errors.ts
  • packages/uri-template/src/template/expand.ts
  • packages/uri-template/src/template/match.ts
  • packages/vocab-runtime/deno.json
  • packages/vocab-runtime/src/docloader.test.ts
  • packages/vocab-runtime/src/key.ts
  • packages/vocab-runtime/src/langstr.ts
  • packages/vocab-runtime/src/link.ts
  • packages/vocab-runtime/src/multibase/base.ts
  • packages/vocab-runtime/src/multibase/rfc4648.ts
  • packages/vocab-runtime/src/portable-media.test.ts
  • packages/vocab-runtime/src/public-fetch.test.ts
  • packages/vocab-runtime/src/request.test.ts
  • packages/vocab-runtime/src/testdata/public-fetch-deno-worker.ts
  • packages/vocab-runtime/src/url.ts
  • packages/vocab-tools/deno.json
  • packages/vocab-tools/src/class.ts
  • packages/vocab-tools/src/schema.ts
  • packages/vocab/deno.json
  • packages/vocab/src/deep-clone.test.ts
  • packages/vocab/src/gateway.test.ts
  • packages/vocab/src/lookup.test.ts
  • packages/vocab/src/lookup.ts
  • packages/vocab/src/portable-lookup.test.ts
  • packages/vocab/src/sparse-arrays.test.ts
  • packages/vocab/src/utils.ts
  • packages/vocab/src/vocab.test.ts
  • packages/webfinger/deno.json
  • packages/webfinger/src/lookup.test.ts
  • pnpm-workspace.yaml
  • scripts/check_changelog_pr_refs.ts
  • scripts/check_lint_directives.test.ts
  • scripts/check_lint_directives.ts
  • scripts/sponsors.ts
  • scripts/test_tooling_no_deno.mjs
  • tools/oxlint/anti-slop/LICENSE
  • tools/oxlint/anti-slop/UPSTREAM.md
  • tools/oxlint/anti-slop/effect/index.ts
  • tools/oxlint/anti-slop/effect/rules/no-manual-effect-error-tag.ts
  • tools/oxlint/anti-slop/effect/rules/no-manual-tag-comparison.ts
  • tools/oxlint/anti-slop/effect/rules/no-manual-tagged-construction.ts
  • tools/oxlint/anti-slop/effect/rules/no-service-constructor-imports.ts
  • tools/oxlint/anti-slop/effect/rules/prefer-effect-match.ts
  • tools/oxlint/anti-slop/effect/shared/tagged-values.ts
  • tools/oxlint/anti-slop/index.ts
  • tools/oxlint/anti-slop/rules/no-array-filter-map.ts
  • tools/oxlint/anti-slop/rules/no-chained-type-assertions.ts
  • tools/oxlint/anti-slop/rules/no-conditional-empty-object-spread.ts
  • tools/oxlint/anti-slop/rules/no-known-value-widening.ts
  • tools/oxlint/anti-slop/rules/no-module-mocking.ts
  • tools/oxlint/anti-slop/rules/no-object-parameters.ts
  • tools/oxlint/anti-slop/rules/no-reduce-accumulator-copy.ts
  • tools/oxlint/anti-slop/rules/no-reflect-apply.ts
  • tools/oxlint/anti-slop/rules/no-reflect-get.ts
  • tools/oxlint/anti-slop/rules/no-runtime-typeof.ts
  • tools/oxlint/anti-slop/rules/no-shape-in-symbol-names.ts
  • tools/oxlint/anti-slop/rules/no-unknown-parameters.ts
  • tools/oxlint/anti-slop/rules/no-unknown-returns.ts
  • tools/oxlint/anti-slop/rules/no-unknown-type-aliases.ts
  • tools/oxlint/anti-slop/rules/no-unsafe-dictionary-type.ts
  • tools/oxlint/anti-slop/rules/no-widen-then-assert.ts
  • tools/oxlint/anti-slop/rules/require-readable-spacing.ts
  • tools/oxlint/anti-slop/rules/require-safety-comment-for-type-assertion.ts
  • tools/oxlint/anti-slop/shared/array-method.ts
  • tools/oxlint/anti-slop/shared/dictionary-types.ts
  • tools/oxlint/anti-slop/shared/function-parameters.ts
  • tools/oxlint/anti-slop/shared/lexical-type-parameters.ts
  • tools/oxlint/anti-slop/shared/reflect-method.ts
  • tools/oxlint/anti-slop/shared/scope.ts
  • tools/oxlint/anti-slop/shared/type-alias-resolution.ts
  • tools/oxlint/anti-slop/vendor/eslint-stylistic/LICENSE
  • tools/oxlint/anti-slop/vendor/eslint-stylistic/UPSTREAM.md
  • tools/oxlint/anti-slop/vendor/eslint-stylistic/padding-line-ast.ts
  • tools/oxlint/anti-slop/vendor/eslint-stylistic/padding-line-between-statements.ts
  • tools/oxlint/anti-slop/vendor/eslint-stylistic/padding-line-options.d.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Tip

🎯 Customize your risk assessments

Guide how CodeRabbit assesses merge risk and security architecture risk. Highlight sensitive changes and explain your security boundaries using Merge Risk Instructions and Security Risk Instructions in your review settings. Security architecture risk assessments require the Advanced plan or above.

✅ Automatic approvals, with your rules

Let CodeRabbit approve pull requests once required threads are resolved, pre-merge checks pass, and your risk limits are met. Enable Automatic approvals in review settings, with overrides for teams or file paths.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-05T06:30:08.016461Z f4006f4 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@dahlia
dahlia force-pushed the chore/replace-deno-lint-with-oxlint branch from 2b4d01f to b16306b Compare November 3, 2026 03:26
@codecov

codecov Bot commented Nov 3, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 78.86179% with 52 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
scripts/check_lint_directives.ts 84.31% 18 Missing and 6 partials ⚠️
packages/vocab-runtime/src/link.ts 55.55% 6 Missing and 2 partials ⚠️
packages/lint/src/lib/oxlint.ts 0.00% 5 Missing ⚠️
packages/elysia/src/index.ts 0.00% 4 Missing ⚠️
packages/fedify/src/sig/key.ts 40.00% 2 Missing and 1 partial ⚠️
packages/cli/src/bench/result/build.ts 33.33% 0 Missing and 2 partials ⚠️
packages/cli/src/nodeinfo.ts 0.00% 2 Missing ⚠️
packages/cli/src/lookup.ts 50.00% 1 Missing ⚠️
packages/lint/src/lib/property-checker.ts 0.00% 1 Missing ⚠️
...b-runtime/src/testdata/public-fetch-deno-worker.ts 87.50% 0 Missing and 1 partial ⚠️
... and 1 more
Files with missing lines Coverage Δ
packages/amqp/src/mq.ts 86.93% <ø> (ø)
packages/cli/src/bench/scenarios/mixed.ts 81.23% <100.00%> (-0.06%) ⬇️
packages/cli/src/diagnostics.ts 90.35% <ø> (ø)
packages/cli/src/webfinger/action.ts 80.48% <ø> (ø)
packages/cli/src/webfinger/error.ts 86.44% <ø> (ø)
packages/cli/test/bench/fixture.ts 92.24% <100.00%> (ø)
packages/debugger/src/mod.tsx 90.55% <ø> (ø)
packages/denokv/src/mod.ts 82.31% <ø> (ø)
packages/express/src/index.ts 88.97% <100.00%> (ø)
...ackages/fedify/src/federation/activity-listener.ts 97.72% <ø> (ø)
... and 49 more

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

dahlia added 19 commits November 4, 2026 01:06
The generated vocabulary classes rely on a Deno-specific file-level
suppression header.  Add an equivalent Oxlint directive while keeping the
Deno header so generated code remains lintable under both tools during the
migration.

The Oxlint header disables the three rules the generator currently
triggers: no-explicit-any, no-unused-vars, and prefer-const.  Line-level
Oxlint directives are deliberately omitted because the file-level disable
already covers them.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Add a root Oxlint configuration that explicitly lists the Deno
recommended rule set instead of relying on Oxlint's default categories.
The config also mirrors Deno's rule options for comment directives,
unused variables, empty interfaces, JSX, and constant conditions.

Pin Oxlint to 1.90.0 in the pnpm catalog and add it as a root
development dependency.  The default lint task is not switched yet; that
happens in the following commit together with the suppression
translation.

Changelog: none
Assisted-by: Claude Code:claude-fable-5-1
Assisted-by: OpenCode:gpt-6-astra
Assisted-by: OpenCode:deepseek-flash
Switch the default lint tasks to Oxlint and translate the existing
deno-lint-ignore comments to oxlint-disable directives.  Small
rule-semantics differences are fixed or suppressed with explicit reasons;
Oxlint's unused-directive reporting keeps the remaining suppressions
honest.

Remove deno lint segments from the package and example Deno tasks, drop
dead lint configuration, and add a directive audit so a bare
oxlint-disable cannot silently disable every rule.  Update contributor
documentation and editor settings: Oxlint now owns lint diagnostics while
Deno remains the formatter until the Oxfmt migration.

The generated vocabulary file keeps its Deno suppression header and gains
an Oxlint file-level directive.  It is gitignored, so the lint tasks name
it explicitly.

Changelog: none
Assisted-by: OpenCode:kimi-k3.1-pro
Assisted-by: Claude Code:claude-fable-5-1
Assisted-by: OpenCode:gpt-6-astra
Assisted-by: OpenCode:deepseek-flash
Enable `no-await-in-loop` as a warning to surface sequential awaits that
could be parallelized.  Existing code intentionally awaits in loops in
tests and protocol code, so the rule stays advisory rather than blocking
the default gate.

Keep `check:lint` and `check-each` quiet so the warning set does not flood
CI and pre-commit output; `mise run lint` still shows warnings for local
work and editors.

Changelog: none
Assisted-by: OpenCode:kimi-for-coding
Assisted-by: OpenCode:deepseek-flash
Git pre-commit hooks export GIT_DIR, GIT_WORK_TREE, GIT_INDEX_FILE, and
GIT_PREFIX.  The directive audit and its temporary-repository tests
inherited those variables, so a test `git add` could stage a file in the
parent repository's index.

Strip the four repository-location variables before invoking Git in both
the audit and its tests.  The tests still create isolated repositories
and now behave the same inside and outside hooks.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Enable `no-console` as a warning for library, script, and example code,
while turning it off for `@fedify/cli`, where console output is the user
interface.  Keep the one intentional init warning with an explicit
suppression and explanation.

The default gate stays quiet, so these warnings surface in `mise run
lint` and editors without flooding CI.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Copy the upstream anti-slop plugin into tools/oxlint/anti-slop with the
upstream MIT license and a provenance record.  Pin @oxlint/plugins to
the same exact version as oxlint.

Enable the generic rules that currently pass: accumulating-spread,
array-filter-map, module-mocking, reduce-accumulator-copy,
reflect-apply, reflect-get, unknown-type-aliases, and
widen-then-assert.  Rewrite the filter/map chains to flatMap and keep
the deliberate Proxy reflection sites with reasoned suppressions.

The remaining anti-slop rules and require-readable-spacing stay disabled
until their type or formatting refactors are handled separately.  Exclude
the vendored directory from Oxlint, Deno formatting, and Hongdown.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Oxlint honors both `oxlint-*` and `eslint-*` suppression comments.  The
directive audit only inspected the former, so a bare `eslint-disable`
could still silence every rule.  Match both prefixes and normalize
`@typescript-eslint/...` names to the corresponding Oxlint namespace.

Skip the generated Cloudflare Workers declaration file, which Oxlint
already ignores, and add regression coverage for the ESLint forms.

Changelog: none
Assisted-by: OpenCode:gpt-6-astra
Assisted-by: OpenCode:deepseek-flash
Flatten the nested promise chains using async callbacks or an async
IIFE.  Resolution values, rejection behavior, and ordering are
preserved, and the rule now rejects new nested promise chains.

Rebasing onto the outbound observation work takes the upstream async
forwarding implementation.  Fix the new upstream lint findings there and
in the observation tests: merge duplicate LogTape imports, suppress the
intentional internal and Proxy `Reflect.get` accesses, and throw an
Error object in the observer failure test.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Rewrite the timeout document-loader fixture to throw inside an async
callback instead of returning Promise.reject.  The rejection value and
timing stay the same, and the rule now rejects unnecessary promise
wrapping.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Turn on the rule and keep the four error classes' `throw()` methods,
which intentionally throw the receiver instance.  Each site carries a
reasoned suppression.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Widen the casts in four test assertions and use optional indexing so a
missing value fails the assertion instead of throwing a TypeError.  The
rule now rejects new unsafe optional-chain indexing.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Fix the two nodeinfo service-length checks where `??` and `>` were
mis-parenthesized, so the expression compared the length with a boolean
instead of zero.  The corrected checks preserve the intended behavior
and the rule prevents the same mistake elsewhere.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Remove identity escapes from regular expressions and template literals
where they add no meaning.  Match results and emitted text are
unchanged, and the rule now flags new unnecessary escapes.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Use the `node:` prefix for Node.js built-in imports in the Next.js 15
example config, and enable the rule to keep new built-in imports
unambiguous.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Replace the alphabet membership indexOf check with includes, and enable
the rule to prefer the clearer existence check.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Give the remaining Error and AggregateError constructions descriptive
messages.  Tests that only inspect stack traces or error kinds keep
their behavior, and the rule now requires a message for new errors.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
The pnpm catalog moved to Oxlint 1.90.0, but the Deno import map still
pinned 1.66.0.  Deno then relinked node_modules to the old version,
causing `pnpm exec oxlint` to run a different linter than the lockfile
and making newer rules unavailable.

Update the Deno import map and example task specifiers to 1.90.0 and
refresh deno.lock.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Replace the remaining forEach calls with for...of loops.  Header
iteration uses the Headers tuple order, and the example store keeps the
original filter-before-insert batch semantics.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Use `import type` in three examples so TypeScript elides the imports
entirely instead of leaving an empty side-effect import.  The runtime
module graph stays the same.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Convert simple index loops to for...of, except the URI-template matcher,
which must count UTF-16 code units so surrogate halves split across
tokens cancel correctly.  That loop keeps a reasoned suppression.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Keep the NestJS dynamic-module class, which is a static factory by
framework convention, with a reasoned suppression.  The rule now flags
new classes that only hold static members.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
Register @logtape/lint and enable its recommended rules:
no-message-interpolation and no-unawaited-log as errors, and
prefer-lazy-evaluation and require-meta-sink as warnings.

Align @logtape/file, @logtape/logtape, and @logtape/lint on 2.4.2 in the
pnpm catalog, Deno import maps, and the initializer dependency list.
Rewrite the benchmark-mode warning as a structured LogTape template and
update its test to assert both the raw template and the summary
property.

Changelog: none
Assisted-by: OpenCode:deepseek-flash
@dahlia
dahlia force-pushed the chore/replace-deno-lint-with-oxlint branch from b16306b to 7e6f446 Compare November 3, 2026 16:11
Comment thread .oxlintrc.json Resolved
Oxlint's getter-return rule does not report TypeScript getters that
return nothing, although Deno lint does.  Document the gap and enable
no-useless-return to catch the common bare-return form.  Remove the
redundant returns it found.

fedify-dev#1358 (comment)

Changelog: none
Assisted-by: OpenCode:deepseek-flash
@dahlia

dahlia commented Nov 5, 2026

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep them coming!

Reviewed commit: f4006f477e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@dahlia
dahlia requested a review from sij411 November 5, 2026 08:57

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component/build Build system and packaging runtime/deno Deno runtime related

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Replace Deno lint with Oxlint

2 participants