Files
upstream-twenty/packages/twenty-oxlint-rules/OXLINT_MIGRATION_TODO.md
upstream-mirror e7da97194a
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 2s
snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
2026-09-17 23:28:13 +05:00

3.9 KiB

Oxlint Migration TODO

This file tracks what was lost or temporarily disabled during the ESLint to Oxlint migration, and what needs to be re-activated or addressed.

Temporarily Disabled Rules

twenty-server

Rule Reason Violations Auto-fixable
typescript/consistent-type-imports 3814 pre-existing violations. Cannot be auto-fixed because NestJS relies on emitDecoratorMetadata for DI — the auto-fixer converts constructor parameter imports to import type, which erases them at runtime and breaks dependency injection. 3814 No (unsafe auto-fix)
twenty/max-consts-per-file 94 pre-existing violations across 24 constant files with >1 export 94 No

Re-activated Rules

twenty-front

Rule Violations Fixed Method
twenty/sort-css-properties-alphabetically 578 Auto-fix via npx nx lint twenty-front --configuration=fix

Dropped Plugins (No Oxlint Equivalent)

These plugins were in use but have no oxlint equivalent. Consider whether alternative tooling is needed.

Plugin Where Used What It Did Replacement / Status
eslint-plugin-project-structure Frontend Enforced folder naming and structure conventions for src/modules/ (kebab-case dirs, allowed subdirs like hooks/utils/components, file naming for hooks/utils). Config still in folderStructure.json. Re-implemented as twenty/folder-structure custom oxlint rule. Enabled as "warn" — 403 pre-existing violations (160 non-kebab-case names, 215 depth > 4, 28 naming).
lingui/* Frontend, emails i18n extraction and consistency rules No equivalent
@stylistic/* Server Formatting rules (indentation, spacing) Use Prettier instead
import/order, simple-import-sort/imports Server Import sorting and ordering No equivalent
prefer-arrow/prefer-arrow-functions Frontend Enforced arrow functions over function declarations No equivalent
eslint-plugin-mdx Docs MDX file linting Not supported by oxlint
@next/eslint-plugin-next Website Next.js-specific rules (no <img>, link handling, etc.) Not supported by oxlint
eslint-plugin-unused-imports Frontend Removed unused imports on save Partially covered by no-unused-vars
eslint-plugin-storybook Frontend Storybook best practices (story structure, naming) No equivalent
eslint-plugin-jsx-a11y Frontend Accessibility rules (alt text, aria, roles, etc.) Partial equivalent in Oxlint (jsx-a11y plugin), but coverage is limited.
eslint-plugin-react-refresh Frontend React Refresh boundary validation (HMR) No equivalent

IDE Integration

The oxc.oxc-vscode extension provides inline diagnostics for built-in oxlint rules but does not yet support jsPlugins (custom twenty/* rules). Custom rule violations are only caught by nx lint and CI.

Remaining Re-activation Plan

  1. Consistent type imports (twenty-server): Cannot safely auto-fix due to NestJS emitDecoratorMetadata. Options:
    • Manually add import type only where safe (not for DI constructor params)
    • Enable TypeScript's verbatimModuleSyntax (major migration)
    • Keep disabled until oxlint supports decorator-aware type import analysis
  2. Max consts per file (twenty-server): Manually split 24 constant files to have at most 1 exported const each, then re-enable the rule.
  3. Folder structure enforcement (twenty-front): Re-implemented as twenty/folder-structure custom oxlint rule (enabled as "warn"). 403 pre-existing violations to address:
    • 160 non-kebab-case module folder names (e.g. graphWidgetBarChart → graph-widget-bar-chart)
    • 215 modules nested deeper than 4 levels
    • 28 util/hook file naming violations (.util.ts suffixes, kebab-case filenames, PascalCase)
    • Promote to "error" once violations are resolved