From ca8121ab7b09268a17a0121e8efce9d7835b5cea Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:44:46 +0100 Subject: [PATCH 1/4] feat: shareable oxlint config --- .changeset/beige-rats-lie.md | 5 + .github/labeler.yml | 4 + .yarnrc.yml | 1 + .../battery-status/eslint.config.js | 1 - .../battery-status/package.json | 1 - .../battery-status/src/NativeBatteryStatus.ts | 2 +- .../web-storage/eslint.config.js | 1 - .../web-storage/package.json | 1 - .../web-storage/src/NativeWebStorage.ts | 2 +- .../build-plugin-firebase/eslint.config.js | 4 - incubator/build-plugin-firebase/package.json | 1 - incubator/build/eslint.config.js | 4 - incubator/build/package.json | 1 - incubator/fork-sync/eslint.config.js | 2 +- incubator/fork-sync/oxlint.config.ts | 11 + incubator/fork-sync/package.json | 1 + incubator/fork-sync/test/proc.test.ts | 2 +- incubator/fork-sync/test/tty-ui.test.ts | 2 +- incubator/lint-lockfile/eslint.config.js | 1 - incubator/lint-lockfile/package.json | 1 - incubator/polyfills/eslint.config.js | 1 - incubator/polyfills/package.json | 1 - incubator/reporter/eslint.config.js | 3 - incubator/reporter/package.json | 1 - incubator/reporter/test/levels.test.ts | 2 +- incubator/reporter/test/output.test.ts | 6 +- incubator/reporter/test/session.test.ts | 2 +- incubator/reporter/test/utils.test.ts | 8 +- .../rn-changelog-generator/src/generator.ts | 4 +- incubator/rn-changelog-generator/src/index.ts | 2 +- .../test/utils/validateChangelog.test.ts | 2 +- incubator/tools-typescript/eslint.config.js | 1 - incubator/tools-typescript/package.json | 1 - .../eslint.config.js | 1 - .../package.json | 1 - .../eslint.config.js | 1 - .../package.json | 1 - .../src/index.ts | 2 +- .../yarn-plugin-install-to/eslint.config.js | 1 - incubator/yarn-plugin-install-to/package.json | 1 - incubator/yarn-plugin-install-to/src/index.ts | 2 +- package.json | 59 +++- packages/align-deps/eslint.config.js | 1 - packages/align-deps/package.json | 1 - .../eslint.config.js | 1 - .../package.json | 1 - .../eslint.config.js | 1 - .../package.json | 1 - .../test/__fixtures__/App.ts | 2 +- packages/bundle-diff/eslint.config.js | 1 - packages/bundle-diff/package.json | 1 - packages/cli/eslint.config.js | 1 - packages/cli/package.json | 1 - packages/commitlint-lite/eslint.config.js | 4 - packages/commitlint-lite/package.json | 1 - packages/config/eslint.config.js | 1 - packages/config/package.json | 1 - packages/console/eslint.config.js | 1 - packages/console/package.json | 1 - .../eslint.config.js | 1 - .../package.json | 1 - ...sbuild-plugin-import-path-remapper.test.ts | 3 +- packages/eslint-plugin/package.json | 5 +- packages/eslint-plugin/src/configs/eslint.js | 4 +- packages/jest-preset/eslint.config.js | 1 - packages/metro-config/eslint.config.js | 1 - packages/metro-config/package.json | 1 - .../eslint.config.js | 1 - .../package.json | 1 - .../src/index.ts | 2 +- .../test/detectCycles.test.ts | 2 +- .../eslint.config.js | 1 - .../package.json | 1 - .../src/index.ts | 2 +- .../metro-plugin-typescript/eslint.config.js | 1 - packages/metro-plugin-typescript/package.json | 1 - packages/metro-plugin-typescript/src/index.ts | 2 +- .../metro-resolver-symlinks/eslint.config.js | 1 - packages/metro-resolver-symlinks/package.json | 1 - packages/metro-resolver-symlinks/src/index.ts | 2 +- .../test/remappers/remapImportPath.test.ts | 2 +- .../metro-serializer-esbuild/eslint.config.js | 1 - .../metro-serializer-esbuild/package.json | 1 - .../test/__fixtures__/exportAllPublic.ts | 2 +- .../__fixtures__/nestedExportAllInternal.ts | 2 +- .../__fixtures__/nestedExportAllPublic.ts | 2 +- .../test/index.test.ts | 2 +- packages/metro-serializer/eslint.config.js | 1 - packages/metro-serializer/package.json | 1 - packages/metro-service/eslint.config.js | 1 - packages/metro-service/package.json | 1 - packages/oxlint-config/README.md | 95 ++++++ packages/oxlint-config/package.json | 84 +++++ packages/oxlint-config/private.ts | 27 ++ .../src/configs/eslint-recommended.ts | 33 ++ .../oxlint-config/src/configs/recommended.ts | 36 +++ .../oxlint-config/src/configs/sdl-common.ts | 22 ++ .../oxlint-config/src/configs/sdl-node.ts | 16 + .../oxlint-config/src/configs/sdl-react.ts | 18 ++ packages/oxlint-config/src/configs/strict.ts | 13 + .../oxlint-config/src/configs/types-only.ts | 20 ++ .../src/configs/typescript-recommended.ts | 51 +++ .../src/configs/typescript-stylistic.ts | 24 ++ packages/oxlint-config/tsconfig.json | 7 + packages/react-native-auth/eslint.config.js | 1 - packages/react-native-auth/package.json | 1 - packages/react-native-auth/src/NativeAuth.ts | 2 +- .../react-native-lazy-index/eslint.config.js | 1 - packages/react-native-lazy-index/package.json | 1 - packages/template/eslint.config.js | 1 - packages/template/package.json | 1 - packages/test-app-macos/eslint.config.js | 1 - packages/test-app-windows/eslint.config.js | 1 - packages/test-app/eslint.config.js | 1 - packages/third-party-notices/eslint.config.js | 1 - packages/third-party-notices/package.json | 1 - .../third-party-notices/src/extractors.js | 2 +- packages/third-party-notices/src/index.ts | 2 +- packages/tools-android/eslint.config.js | 4 - packages/tools-android/package.json | 1 - packages/tools-apple/eslint.config.js | 4 - packages/tools-apple/package.json | 1 - packages/tools-filesystem/eslint.config.js | 1 - packages/tools-filesystem/package.json | 1 - packages/tools-language/eslint.config.js | 1 - packages/tools-language/package.json | 1 - packages/tools-node/eslint.config.js | 1 - packages/tools-node/package.json | 1 - packages/tools-packages/eslint.config.js | 1 - packages/tools-packages/package.json | 1 - packages/tools-react-native/eslint.config.js | 1 - packages/tools-react-native/package.json | 1 - .../tools-react-native/test/metro.test.ts | 2 +- packages/tools-shell/eslint.config.js | 4 - packages/tools-shell/package.json | 1 - packages/tools-windows/eslint.config.js | 4 - packages/tools-windows/package.json | 1 - packages/tools-workspaces/eslint.config.js | 1 - packages/tools-workspaces/package.json | 1 - packages/types-bundle-config/eslint.config.js | 1 - packages/types-bundle-config/oxlint.config.ts | 2 + packages/types-bundle-config/package.json | 2 +- .../types-bundle-config/src/allPlatforms.ts | 2 +- packages/types-bundle-config/src/index.ts | 2 +- packages/types-kit-config/eslint.config.js | 1 - packages/types-kit-config/oxlint.config.ts | 2 + packages/types-kit-config/package.json | 2 +- .../eslint.config.js | 1 - .../oxlint.config.ts | 2 + .../package.json | 2 +- packages/types-node/eslint.config.js | 1 - packages/types-node/oxlint.config.ts | 2 + packages/types-node/package.json | 2 +- .../eslint.config.js | 1 - .../oxlint.config.ts | 2 + .../package.json | 2 +- .../eslint.config.js | 1 - .../oxlint.config.ts | 2 + .../package.json | 2 +- .../types-plugin-typescript/eslint.config.js | 1 - .../types-plugin-typescript/oxlint.config.ts | 2 + packages/types-plugin-typescript/package.json | 2 +- packages/typescript-service/eslint.config.js | 1 - packages/typescript-service/package.json | 1 - .../typescript-service/test/__fixtures__/c.ts | 2 +- .../typescript-service/test/config.test.ts | 2 +- scripts/dependencies.config.js | 22 +- scripts/eslint.config.js | 2 +- scripts/package.json | 1 - scripts/src/commands/lint.js | 48 ++- yarn.lock | 298 ++++++++++++++---- 171 files changed, 876 insertions(+), 260 deletions(-) create mode 100644 .changeset/beige-rats-lie.md delete mode 100644 incubator/@react-native-webapis/battery-status/eslint.config.js delete mode 100644 incubator/@react-native-webapis/web-storage/eslint.config.js delete mode 100644 incubator/build-plugin-firebase/eslint.config.js delete mode 100644 incubator/build/eslint.config.js create mode 100644 incubator/fork-sync/oxlint.config.ts delete mode 100644 incubator/lint-lockfile/eslint.config.js delete mode 100644 incubator/polyfills/eslint.config.js delete mode 100644 incubator/reporter/eslint.config.js delete mode 100644 incubator/tools-typescript/eslint.config.js delete mode 100644 incubator/yarn-plugin-dynamic-extensions/eslint.config.js delete mode 100644 incubator/yarn-plugin-external-workspaces/eslint.config.js delete mode 100644 incubator/yarn-plugin-install-to/eslint.config.js delete mode 100644 packages/align-deps/eslint.config.js delete mode 100644 packages/babel-plugin-import-path-remapper/eslint.config.js delete mode 100644 packages/babel-preset-metro-react-native/eslint.config.js delete mode 100644 packages/bundle-diff/eslint.config.js delete mode 100644 packages/cli/eslint.config.js delete mode 100644 packages/commitlint-lite/eslint.config.js delete mode 100644 packages/config/eslint.config.js delete mode 100644 packages/console/eslint.config.js delete mode 100644 packages/esbuild-plugin-import-path-remapper/eslint.config.js delete mode 100644 packages/jest-preset/eslint.config.js delete mode 100644 packages/metro-config/eslint.config.js delete mode 100644 packages/metro-plugin-cyclic-dependencies-detector/eslint.config.js delete mode 100644 packages/metro-plugin-duplicates-checker/eslint.config.js delete mode 100644 packages/metro-plugin-typescript/eslint.config.js delete mode 100644 packages/metro-resolver-symlinks/eslint.config.js delete mode 100644 packages/metro-serializer-esbuild/eslint.config.js delete mode 100644 packages/metro-serializer/eslint.config.js delete mode 100644 packages/metro-service/eslint.config.js create mode 100644 packages/oxlint-config/README.md create mode 100644 packages/oxlint-config/package.json create mode 100644 packages/oxlint-config/private.ts create mode 100644 packages/oxlint-config/src/configs/eslint-recommended.ts create mode 100644 packages/oxlint-config/src/configs/recommended.ts create mode 100644 packages/oxlint-config/src/configs/sdl-common.ts create mode 100644 packages/oxlint-config/src/configs/sdl-node.ts create mode 100644 packages/oxlint-config/src/configs/sdl-react.ts create mode 100644 packages/oxlint-config/src/configs/strict.ts create mode 100644 packages/oxlint-config/src/configs/types-only.ts create mode 100644 packages/oxlint-config/src/configs/typescript-recommended.ts create mode 100644 packages/oxlint-config/src/configs/typescript-stylistic.ts create mode 100644 packages/oxlint-config/tsconfig.json delete mode 100644 packages/react-native-auth/eslint.config.js delete mode 100644 packages/react-native-lazy-index/eslint.config.js delete mode 100644 packages/template/eslint.config.js delete mode 100644 packages/test-app-macos/eslint.config.js delete mode 100644 packages/test-app-windows/eslint.config.js delete mode 100644 packages/test-app/eslint.config.js delete mode 100644 packages/third-party-notices/eslint.config.js delete mode 100644 packages/tools-android/eslint.config.js delete mode 100644 packages/tools-apple/eslint.config.js delete mode 100644 packages/tools-filesystem/eslint.config.js delete mode 100644 packages/tools-language/eslint.config.js delete mode 100644 packages/tools-node/eslint.config.js delete mode 100644 packages/tools-packages/eslint.config.js delete mode 100644 packages/tools-react-native/eslint.config.js delete mode 100644 packages/tools-shell/eslint.config.js delete mode 100644 packages/tools-windows/eslint.config.js delete mode 100644 packages/tools-workspaces/eslint.config.js delete mode 100644 packages/types-bundle-config/eslint.config.js create mode 100644 packages/types-bundle-config/oxlint.config.ts delete mode 100644 packages/types-kit-config/eslint.config.js create mode 100644 packages/types-kit-config/oxlint.config.ts delete mode 100644 packages/types-metro-serializer-esbuild/eslint.config.js create mode 100644 packages/types-metro-serializer-esbuild/oxlint.config.ts delete mode 100644 packages/types-node/eslint.config.js create mode 100644 packages/types-node/oxlint.config.ts delete mode 100644 packages/types-plugin-cyclic-dependencies/eslint.config.js create mode 100644 packages/types-plugin-cyclic-dependencies/oxlint.config.ts delete mode 100644 packages/types-plugin-duplicates-checker/eslint.config.js create mode 100644 packages/types-plugin-duplicates-checker/oxlint.config.ts delete mode 100644 packages/types-plugin-typescript/eslint.config.js create mode 100644 packages/types-plugin-typescript/oxlint.config.ts delete mode 100644 packages/typescript-service/eslint.config.js diff --git a/.changeset/beige-rats-lie.md b/.changeset/beige-rats-lie.md new file mode 100644 index 0000000000..e432a9bdf6 --- /dev/null +++ b/.changeset/beige-rats-lie.md @@ -0,0 +1,5 @@ +--- +"@rnx-kit/oxlint-config": major +--- + +Shareable oxlint configurations diff --git a/.github/labeler.yml b/.github/labeler.yml index 42833a4205..fd5adf8d8b 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -31,6 +31,10 @@ - packages/babel-preset-metro-react-native/**/* - packages/metro-*/**/* - packages/typescript-service/**/* +"feature: oxlint": + - changed-files: + - any-glob-to-any-file: + - packages/oxlint-*/**/* "feature: sdk": - changed-files: - any-glob-to-any-file: diff --git a/.yarnrc.yml b/.yarnrc.yml index 36b45536ec..38618dec71 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -75,4 +75,5 @@ catalog: eslint: ^9.0.0 jest: ^29.2.1 oxfmt: ^0.35.0 + oxlint: ^1.50.0 typescript: ^5.0.0 diff --git a/incubator/@react-native-webapis/battery-status/eslint.config.js b/incubator/@react-native-webapis/battery-status/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/@react-native-webapis/battery-status/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/@react-native-webapis/battery-status/package.json b/incubator/@react-native-webapis/battery-status/package.json index 8ddf015559..be0cd2e1b9 100644 --- a/incubator/@react-native-webapis/battery-status/package.json +++ b/incubator/@react-native-webapis/battery-status/package.json @@ -36,7 +36,6 @@ "devDependencies": { "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/incubator/@react-native-webapis/battery-status/src/NativeBatteryStatus.ts b/incubator/@react-native-webapis/battery-status/src/NativeBatteryStatus.ts index 7b2bd07cc4..06f1fe1030 100644 --- a/incubator/@react-native-webapis/battery-status/src/NativeBatteryStatus.ts +++ b/incubator/@react-native-webapis/battery-status/src/NativeBatteryStatus.ts @@ -9,7 +9,7 @@ export type BatteryStatus = { level: number; }; -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +// oxlint-disable-next-line typescript/consistent-type-definitions export interface Spec extends TurboModule { getStatus(): Promise; } diff --git a/incubator/@react-native-webapis/web-storage/eslint.config.js b/incubator/@react-native-webapis/web-storage/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/@react-native-webapis/web-storage/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/@react-native-webapis/web-storage/package.json b/incubator/@react-native-webapis/web-storage/package.json index 0cac858727..bfbc546cb9 100644 --- a/incubator/@react-native-webapis/web-storage/package.json +++ b/incubator/@react-native-webapis/web-storage/package.json @@ -37,7 +37,6 @@ "devDependencies": { "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "react": "19.2.0", diff --git a/incubator/@react-native-webapis/web-storage/src/NativeWebStorage.ts b/incubator/@react-native-webapis/web-storage/src/NativeWebStorage.ts index 4dd382fde6..315d2e380d 100644 --- a/incubator/@react-native-webapis/web-storage/src/NativeWebStorage.ts +++ b/incubator/@react-native-webapis/web-storage/src/NativeWebStorage.ts @@ -2,7 +2,7 @@ import type { TurboModule } from "react-native"; import { TurboModuleRegistry } from "react-native"; // https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +// oxlint-disable-next-line typescript/consistent-type-definitions export interface Spec extends TurboModule { length: () => number; key(index: number): string | null; diff --git a/incubator/build-plugin-firebase/eslint.config.js b/incubator/build-plugin-firebase/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/incubator/build-plugin-firebase/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/incubator/build-plugin-firebase/package.json b/incubator/build-plugin-firebase/package.json index e959f29783..63752c6272 100644 --- a/incubator/build-plugin-firebase/package.json +++ b/incubator/build-plugin-firebase/package.json @@ -34,7 +34,6 @@ }, "devDependencies": { "@rnx-kit/build": "*", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/incubator/build/eslint.config.js b/incubator/build/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/incubator/build/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/incubator/build/package.json b/incubator/build/package.json index 887ae2720b..29a7ed08a1 100644 --- a/incubator/build/package.json +++ b/incubator/build/package.json @@ -91,7 +91,6 @@ "yargs": "^16.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/incubator/fork-sync/eslint.config.js b/incubator/fork-sync/eslint.config.js index 366180d8fe..d5d2b041fa 100644 --- a/incubator/fork-sync/eslint.config.js +++ b/incubator/fork-sync/eslint.config.js @@ -1,6 +1,6 @@ import config from "@rnx-kit/eslint-config"; -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default [ ...config, { diff --git a/incubator/fork-sync/oxlint.config.ts b/incubator/fork-sync/oxlint.config.ts new file mode 100644 index 0000000000..1e5851bdaf --- /dev/null +++ b/incubator/fork-sync/oxlint.config.ts @@ -0,0 +1,11 @@ +import config from "@rnx-kit/oxlint-config/private"; +import { defineConfig } from "oxlint"; + +export default defineConfig({ + extends: [config], + rules: { + // fork-sync uses interfaces extensively; allow both interface and type + "typescript/consistent-type-definitions": "off", + "no-new-array": "off", + }, +}); diff --git a/incubator/fork-sync/package.json b/incubator/fork-sync/package.json index 53b0f33ba9..4d0d861d53 100644 --- a/incubator/fork-sync/package.json +++ b/incubator/fork-sync/package.json @@ -41,6 +41,7 @@ }, "devDependencies": { "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/incubator/fork-sync/test/proc.test.ts b/incubator/fork-sync/test/proc.test.ts index b69122c92b..83160aca24 100644 --- a/incubator/fork-sync/test/proc.test.ts +++ b/incubator/fork-sync/test/proc.test.ts @@ -12,7 +12,7 @@ import { /** Strip ANSI escape codes from string (colors, etc.) */ function stripAnsi(str: string): string { - // eslint-disable-next-line no-control-regex + // oxlint-disable-next-line no-control-regex return str.replace(/\x1B\[[0-9;]*m/g, ""); } diff --git a/incubator/fork-sync/test/tty-ui.test.ts b/incubator/fork-sync/test/tty-ui.test.ts index c65fadfe54..7d03d63952 100644 --- a/incubator/fork-sync/test/tty-ui.test.ts +++ b/incubator/fork-sync/test/tty-ui.test.ts @@ -13,7 +13,7 @@ import type { ProgressLine, ProgressState } from "../src/modules/tty-ui.ts"; import * as ui from "../src/modules/tty-ui.ts"; // Helper to strip ANSI escape codes for test assertions -// eslint-disable-next-line no-control-regex +// oxlint-disable-next-line no-control-regex const stripAnsi = (s: string) => s.replace(/\x1b\[[0-9;]*m/g, ""); // ============================================================================= diff --git a/incubator/lint-lockfile/eslint.config.js b/incubator/lint-lockfile/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/lint-lockfile/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/lint-lockfile/package.json b/incubator/lint-lockfile/package.json index df9aa5c5aa..213bea0ede 100644 --- a/incubator/lint-lockfile/package.json +++ b/incubator/lint-lockfile/package.json @@ -32,7 +32,6 @@ "js-yaml": "^4.1.1" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/js-yaml": "^4.0.5" diff --git a/incubator/polyfills/eslint.config.js b/incubator/polyfills/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/polyfills/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/polyfills/package.json b/incubator/polyfills/package.json index ec5e5730ad..8c5aa515c1 100644 --- a/incubator/polyfills/package.json +++ b/incubator/polyfills/package.json @@ -34,7 +34,6 @@ "@rnx-kit/tools-node": "^3.0.3" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/babel__core": "^7.0.0", diff --git a/incubator/reporter/eslint.config.js b/incubator/reporter/eslint.config.js deleted file mode 100644 index 13da4b0f42..0000000000 --- a/incubator/reporter/eslint.config.js +++ /dev/null @@ -1,3 +0,0 @@ -import config from "@rnx-kit/eslint-config"; -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/incubator/reporter/package.json b/incubator/reporter/package.json index f2711bef13..bfea243893 100644 --- a/incubator/reporter/package.json +++ b/incubator/reporter/package.json @@ -35,7 +35,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/incubator/reporter/test/levels.test.ts b/incubator/reporter/test/levels.test.ts index daa467468b..214f7c2949 100644 --- a/incubator/reporter/test/levels.test.ts +++ b/incubator/reporter/test/levels.test.ts @@ -51,7 +51,7 @@ describe("levels", () => { // Attempting to modify should not change the array assert.throws(() => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any (ALL_LOG_LEVELS as any).push("new-level"); }); diff --git a/incubator/reporter/test/output.test.ts b/incubator/reporter/test/output.test.ts index 743c27bc7a..f40970f0ec 100644 --- a/incubator/reporter/test/output.test.ts +++ b/incubator/reporter/test/output.test.ts @@ -156,7 +156,7 @@ describe("output", () => { it("should handle invalid log level gracefully", () => { // Use an invalid log level and verify it defaults to first level - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any const output = createOutput("invalid" as any); // Should only have error function (first level) @@ -405,7 +405,7 @@ describe("output", () => { describe("edge cases", () => { it("should handle undefined log level gracefully", () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any const output = createOutput(undefined as any); // Should default to default log level behavior @@ -416,7 +416,7 @@ describe("output", () => { }); it("should handle null output functions", () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any const output = createOutput("log", null as any, null as any); // Should fall back to console outputs diff --git a/incubator/reporter/test/session.test.ts b/incubator/reporter/test/session.test.ts index ccc82ab0da..9a554d24f6 100644 --- a/incubator/reporter/test/session.test.ts +++ b/incubator/reporter/test/session.test.ts @@ -455,7 +455,7 @@ describe("session", () => { const session = createSession(options, undefined, mockCreateReporter); // Use the internal behavior - when finish is called without explicit result, it's undefined - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any const result = (session as any).finish(); assert.strictEqual(result, undefined); diff --git a/incubator/reporter/test/utils.test.ts b/incubator/reporter/test/utils.test.ts index 496b1641a2..5602ce0ec3 100644 --- a/incubator/reporter/test/utils.test.ts +++ b/incubator/reporter/test/utils.test.ts @@ -8,7 +8,7 @@ import { serialize, } from "../src/utils.ts"; -// eslint-disable-next-line @typescript-eslint/no-explicit-any +// oxlint-disable-next-line typescript/no-explicit-any type TestAny = any; describe("utils", () => { @@ -96,7 +96,7 @@ describe("utils", () => { describe("resolveFunction", () => { it("should handle synchronous functions that succeed", () => { const syncFn = () => "sync result"; - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any let finalResult: any; const result = resolveFunction(syncFn, (res): string => { @@ -116,10 +116,10 @@ describe("utils", () => { const syncFn = (): never => { throw new Error("sync error"); }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any let finalResult: any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any const result = resolveFunction(syncFn, (res): any => { finalResult = res; if ("error" in res) { diff --git a/incubator/rn-changelog-generator/src/generator.ts b/incubator/rn-changelog-generator/src/generator.ts index 5382a589ba..29552c5dad 100755 --- a/incubator/rn-changelog-generator/src/generator.ts +++ b/incubator/rn-changelog-generator/src/generator.ts @@ -79,7 +79,7 @@ function filterRevertCommits(commits: Commit[]) { }) .filter((item) => { const text = item.commit.message.split("\n")[0].toLowerCase(); - // eslint-disable-next-line @rnx-kit/no-foreach-with-captured-variables + // oxlint-disable-next-line @rnx-kit/no-foreach-with-captured-variables revertCommits.forEach((revertCommit) => { if (levenshtein.get(text, revertCommit) < 0.5 * revertCommit.length) { revertCommits = revertCommits.filter(function (e) { @@ -311,7 +311,7 @@ export function getChangelogDesc( const acc = deepmerge(CHANGES_TEMPLATE, {}); const commitsWithoutExactChangelogTemplate: string[] = []; - // eslint-disable-next-line @rnx-kit/no-foreach-with-captured-variables + // oxlint-disable-next-line @rnx-kit/no-foreach-with-captured-variables commits.forEach((item) => { const { changeCategory, diff --git a/incubator/rn-changelog-generator/src/index.ts b/incubator/rn-changelog-generator/src/index.ts index 947c9429de..4e2a64de7a 100644 --- a/incubator/rn-changelog-generator/src/index.ts +++ b/incubator/rn-changelog-generator/src/index.ts @@ -26,7 +26,7 @@ if (require.main === module) { .help("help").argv; } -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default { validate: validateChangelog, }; diff --git a/incubator/rn-changelog-generator/test/utils/validateChangelog.test.ts b/incubator/rn-changelog-generator/test/utils/validateChangelog.test.ts index e9fac3c7c9..53b4f4d58f 100644 --- a/incubator/rn-changelog-generator/test/utils/validateChangelog.test.ts +++ b/incubator/rn-changelog-generator/test/utils/validateChangelog.test.ts @@ -1,4 +1,4 @@ -import validateChangelog from "../../src/utils/validateChangelog"; +import { validateChangelog } from "../../src/utils/validateChangelog"; const missing = ` This is a changelog that is missing the formatted changelog. diff --git a/incubator/tools-typescript/eslint.config.js b/incubator/tools-typescript/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/tools-typescript/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/tools-typescript/package.json b/incubator/tools-typescript/package.json index 816bae2be2..e950f4c62d 100644 --- a/incubator/tools-typescript/package.json +++ b/incubator/tools-typescript/package.json @@ -44,7 +44,6 @@ "@rnx-kit/typescript-service": "^2.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/incubator/yarn-plugin-dynamic-extensions/eslint.config.js b/incubator/yarn-plugin-dynamic-extensions/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/yarn-plugin-dynamic-extensions/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/yarn-plugin-dynamic-extensions/package.json b/incubator/yarn-plugin-dynamic-extensions/package.json index b4fa2a019c..7136d3d528 100644 --- a/incubator/yarn-plugin-dynamic-extensions/package.json +++ b/incubator/yarn-plugin-dynamic-extensions/package.json @@ -27,7 +27,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@yarnpkg/core": "^4.0.0", diff --git a/incubator/yarn-plugin-external-workspaces/eslint.config.js b/incubator/yarn-plugin-external-workspaces/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/yarn-plugin-external-workspaces/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/yarn-plugin-external-workspaces/package.json b/incubator/yarn-plugin-external-workspaces/package.json index 042c0d8a3f..d30eab0510 100644 --- a/incubator/yarn-plugin-external-workspaces/package.json +++ b/incubator/yarn-plugin-external-workspaces/package.json @@ -35,7 +35,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/incubator/yarn-plugin-external-workspaces/src/index.ts b/incubator/yarn-plugin-external-workspaces/src/index.ts index 73ad3234b6..fc02b62467 100644 --- a/incubator/yarn-plugin-external-workspaces/src/index.ts +++ b/incubator/yarn-plugin-external-workspaces/src/index.ts @@ -40,5 +40,5 @@ const plugin: Plugin = { commands: [OutputWorkspaces], }; -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default plugin; diff --git a/incubator/yarn-plugin-install-to/eslint.config.js b/incubator/yarn-plugin-install-to/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/incubator/yarn-plugin-install-to/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/incubator/yarn-plugin-install-to/package.json b/incubator/yarn-plugin-install-to/package.json index 8b14e93b7b..fa7ba70869 100644 --- a/incubator/yarn-plugin-install-to/package.json +++ b/incubator/yarn-plugin-install-to/package.json @@ -28,7 +28,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/incubator/yarn-plugin-install-to/src/index.ts b/incubator/yarn-plugin-install-to/src/index.ts index 106349c881..b2d4cf6561 100644 --- a/incubator/yarn-plugin-install-to/src/index.ts +++ b/incubator/yarn-plugin-install-to/src/index.ts @@ -8,5 +8,5 @@ const plugin: Plugin = { commands: [InstallTo], }; -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default plugin; diff --git a/package.json b/package.json index 3857d585ba..ad982ca99c 100644 --- a/package.json +++ b/package.json @@ -97,14 +97,15 @@ "swiftlint" ], "ignoreDependencies": [ - "@rnx-kit/jest-preset", - "@types/*", - "eslint", - "jest", - "oxfmt" + "@types/*" ], "metro": false, "workspaces": { + ".": { + "ignoreDependencies": [ + "eslint" + ] + }, "incubator/*": { "entry": [ "src/index.{js,ts}" @@ -153,6 +154,11 @@ ] }, "incubator/ignore": {}, + "incubator/fork-sync": { + "entry": [ + "oxlint.config.ts" + ] + }, "incubator/lint-lockfile": { "entry": [ "src/{cli,index}.ts", @@ -160,9 +166,17 @@ ] }, "incubator/react-native-test-app-msal": {}, + "incubator/rn-changelog-generator": { + "ignoreDependencies": [ + "@rnx-kit/jest-preset" + ] + }, "incubator/tools-typescript": { "entry": [ "test/**/*.test.ts" + ], + "ignoreDependencies": [ + "@rnx-kit/jest-preset" ] }, "incubator/yarn-plugin-dynamic-extensions": { @@ -181,7 +195,6 @@ }, "packages/babel-preset-metro-react-native": { "entry": [ - "*.js", "test/**/*.test.js", "test/__fixtures__/**/*.ts" ], @@ -205,7 +218,8 @@ ], "ignoreDependencies": [ "@babel/core", - "@babel/preset-env" + "@babel/preset-env", + "@rnx-kit/jest-preset" ] }, "packages/eslint-config": { @@ -239,6 +253,16 @@ "test/**/*.{js,ts}" ] }, + "packages/metro-plugin-typescript": { + "ignoreDependencies": [ + "@rnx-kit/jest-preset" + ] + }, + "packages/metro-resolver-symlinks": { + "ignoreDependencies": [ + "@rnx-kit/jest-preset" + ] + }, "packages/metro-serializer-esbuild": { "entry": [ "metro.config.js", @@ -249,6 +273,11 @@ "@babel/preset-env" ] }, + "packages/oxlint-config": { + "entry": [ + "src/**/*.ts" + ] + }, "packages/react-native-auth": { "ignoreDependencies": [ "@babel/core", @@ -266,7 +295,6 @@ }, "packages/react-native-lazy-index": { "entry": [ - "*.js", "test/**/*.test.ts", "test/__fixtures__/**/*.js" ], @@ -277,8 +305,7 @@ "packages/test-app*": { "entry": [ "*.js", - "src/**/*.{ts,tsx}", - "test/**/*.{js,mjs,ts,tsx}" + "test/*.{js,mjs,ts,tsx}" ], "ignoreDependencies": [ "@babel/preset-env", @@ -289,10 +316,15 @@ "@rnx-kit/*" ] }, + "packages/tools-shell": { + "ignoreDependencies": [ + "@rnx-kit/jest-preset" + ] + }, "packages/tsconfig": {}, - "packages/types-metro-serializer-esbuild": { + "packages/types-*": { "entry": [ - "*.js", + "oxlint.config.ts", "src/*.ts" ] }, @@ -300,6 +332,9 @@ "entry": [ "*.{cjs,js}", "src/**/*.js" + ], + "ignoreDependencies": [ + "jest" ] } } diff --git a/packages/align-deps/eslint.config.js b/packages/align-deps/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/align-deps/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/align-deps/package.json b/packages/align-deps/package.json index 4c57490bbf..1fefe85bb1 100644 --- a/packages/align-deps/package.json +++ b/packages/align-deps/package.json @@ -50,7 +50,6 @@ "@react-native-community/cli-types": "^20.0.0", "@rnx-kit/config": "*", "@rnx-kit/console": "*", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tools-language": "*", "@rnx-kit/tools-node": "*", diff --git a/packages/babel-plugin-import-path-remapper/eslint.config.js b/packages/babel-plugin-import-path-remapper/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/babel-plugin-import-path-remapper/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/babel-plugin-import-path-remapper/package.json b/packages/babel-plugin-import-path-remapper/package.json index 304e0dcbc1..94ec1f1852 100644 --- a/packages/babel-plugin-import-path-remapper/package.json +++ b/packages/babel-plugin-import-path-remapper/package.json @@ -29,7 +29,6 @@ "@rnx-kit/tools-node": "^3.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/babel__core": "^7.0.0", diff --git a/packages/babel-preset-metro-react-native/eslint.config.js b/packages/babel-preset-metro-react-native/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/babel-preset-metro-react-native/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/babel-preset-metro-react-native/package.json b/packages/babel-preset-metro-react-native/package.json index 419c168c3e..3aeecbe842 100644 --- a/packages/babel-preset-metro-react-native/package.json +++ b/packages/babel-preset-metro-react-native/package.json @@ -33,7 +33,6 @@ "@babel/runtime": "^7.20.0", "@react-native/babel-preset": "^0.83.0", "@rnx-kit/babel-plugin-import-path-remapper": "*", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/babel__core": "^7.0.0", diff --git a/packages/babel-preset-metro-react-native/test/__fixtures__/App.ts b/packages/babel-preset-metro-react-native/test/__fixtures__/App.ts index c38fa224a0..ea4ab43129 100644 --- a/packages/babel-preset-metro-react-native/test/__fixtures__/App.ts +++ b/packages/babel-preset-metro-react-native/test/__fixtures__/App.ts @@ -1,7 +1,7 @@ require("typescript/lib/remap-test/lib/lib"); // @ts-expect-error Intentional use of non-erasable syntax -// eslint-disable-next-line @rnx-kit/no-const-enum +// oxlint-disable-next-line @rnx-kit/no-const-enum const enum Direction { Up, Down, diff --git a/packages/bundle-diff/eslint.config.js b/packages/bundle-diff/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/bundle-diff/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/bundle-diff/package.json b/packages/bundle-diff/package.json index 4d3885a6bf..6f11eceeb1 100644 --- a/packages/bundle-diff/package.json +++ b/packages/bundle-diff/package.json @@ -29,7 +29,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/cli/eslint.config.js b/packages/cli/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/cli/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/cli/package.json b/packages/cli/package.json index 5d107f0ee4..cc12c8fabf 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -68,7 +68,6 @@ "@babel/preset-env": "^7.20.0", "@react-native-community/cli-types": "^20.0.0", "@react-native-windows/cli": "^0.79.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/commitlint-lite/eslint.config.js b/packages/commitlint-lite/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/packages/commitlint-lite/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/packages/commitlint-lite/package.json b/packages/commitlint-lite/package.json index 641fa8dfea..5f2a91be0d 100644 --- a/packages/commitlint-lite/package.json +++ b/packages/commitlint-lite/package.json @@ -33,7 +33,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/config/eslint.config.js b/packages/config/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/config/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/config/package.json b/packages/config/package.json index b78116ee91..c598b74701 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -45,7 +45,6 @@ "semver": "^7.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/lodash.merge": "^4.6.9", diff --git a/packages/console/eslint.config.js b/packages/console/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/console/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/console/package.json b/packages/console/package.json index 4580383011..c47d307b3b 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -35,7 +35,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/esbuild-plugin-import-path-remapper/eslint.config.js b/packages/esbuild-plugin-import-path-remapper/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/esbuild-plugin-import-path-remapper/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/esbuild-plugin-import-path-remapper/package.json b/packages/esbuild-plugin-import-path-remapper/package.json index fcb9f4dce8..273ad3a110 100644 --- a/packages/esbuild-plugin-import-path-remapper/package.json +++ b/packages/esbuild-plugin-import-path-remapper/package.json @@ -27,7 +27,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/packages/esbuild-plugin-import-path-remapper/test/esbuild-plugin-import-path-remapper.test.ts b/packages/esbuild-plugin-import-path-remapper/test/esbuild-plugin-import-path-remapper.test.ts index 7da876fe9f..558ebf5ddf 100644 --- a/packages/esbuild-plugin-import-path-remapper/test/esbuild-plugin-import-path-remapper.test.ts +++ b/packages/esbuild-plugin-import-path-remapper/test/esbuild-plugin-import-path-remapper.test.ts @@ -1,7 +1,8 @@ import esbuild from "esbuild"; import { doesNotMatch, match } from "node:assert/strict"; import { describe, it } from "node:test"; -import ImportPathRemapperPlugin from "../src/index.ts"; + +const ImportPathRemapperPlugin = require("../src/index.ts"); describe("@rnx-kit/esbuild-plugin-import-path-remapper", () => { it("remaps main imports from lib to src.", async () => { diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index c93eb4ea7e..cc41971f83 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -43,7 +43,7 @@ "test": "rnx-kit-scripts test" }, "dependencies": { - "@react-native/eslint-plugin": "^0.76.0", + "@react-native/eslint-plugin": "^0.84.0", "enhanced-resolve": "^5.8.3", "eslint-plugin-react": "^7.35.2", "eslint-plugin-react-hooks": "^5.2.0", @@ -58,7 +58,8 @@ "@types/estree": "*", "@types/node": "^24.0.0", "@typescript-eslint/parser": "^8.0.0", - "@typescript-eslint/types": "^8.0.0" + "@typescript-eslint/types": "^8.0.0", + "eslint": "^9.0.0" }, "peerDependencies": { "eslint": ">=8.57.0" diff --git a/packages/eslint-plugin/src/configs/eslint.js b/packages/eslint-plugin/src/configs/eslint.js index b3eecb3839..3b9e7566b9 100644 --- a/packages/eslint-plugin/src/configs/eslint.js +++ b/packages/eslint-plugin/src/configs/eslint.js @@ -6,11 +6,11 @@ const path = require("node:path"); try { const eslint = path.dirname(require.resolve("eslint/package.json")); const eslintjs = require.resolve("@eslint/js", { paths: [eslint] }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // oxlint-disable-next-line typescriptban-ts-comment // @ts-ignore `tsgo` trips on this because it's not top level enough module.exports = require(eslintjs); } catch (_) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // oxlint-disable-next-line typescriptban-ts-comment // @ts-ignore `tsgo` trips on this because it's not top level enough module.exports = require("@eslint/js"); } diff --git a/packages/jest-preset/eslint.config.js b/packages/jest-preset/eslint.config.js deleted file mode 100644 index 406ae12ff1..0000000000 --- a/packages/jest-preset/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("../eslint-plugin/private/eslint.config.js"); diff --git a/packages/metro-config/eslint.config.js b/packages/metro-config/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-config/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-config/package.json b/packages/metro-config/package.json index f95ce35791..7d513825db 100644 --- a/packages/metro-config/package.json +++ b/packages/metro-config/package.json @@ -31,7 +31,6 @@ "devDependencies": { "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/babel__core": "^7.0.0", diff --git a/packages/metro-plugin-cyclic-dependencies-detector/eslint.config.js b/packages/metro-plugin-cyclic-dependencies-detector/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-plugin-cyclic-dependencies-detector/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-plugin-cyclic-dependencies-detector/package.json b/packages/metro-plugin-cyclic-dependencies-detector/package.json index ba1cde8cee..85dc692587 100644 --- a/packages/metro-plugin-cyclic-dependencies-detector/package.json +++ b/packages/metro-plugin-cyclic-dependencies-detector/package.json @@ -39,7 +39,6 @@ "@rnx-kit/types-plugin-cyclic-dependencies": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/metro-serializer": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/metro-plugin-cyclic-dependencies-detector/src/index.ts b/packages/metro-plugin-cyclic-dependencies-detector/src/index.ts index e9f9d6b7dc..dc18af3068 100644 --- a/packages/metro-plugin-cyclic-dependencies-detector/src/index.ts +++ b/packages/metro-plugin-cyclic-dependencies-detector/src/index.ts @@ -15,5 +15,5 @@ export function CyclicDependencies( CyclicDependencies.type = "serializer"; // `export default` required for plugin interface -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default CyclicDependencies; diff --git a/packages/metro-plugin-cyclic-dependencies-detector/test/detectCycles.test.ts b/packages/metro-plugin-cyclic-dependencies-detector/test/detectCycles.test.ts index d3c08d45f9..e5384fd157 100644 --- a/packages/metro-plugin-cyclic-dependencies-detector/test/detectCycles.test.ts +++ b/packages/metro-plugin-cyclic-dependencies-detector/test/detectCycles.test.ts @@ -9,7 +9,7 @@ import { repoRoot, } from "./testData.ts"; -// eslint-disable-next-line @typescript-eslint/no-empty-function +// oxlint-disable-next-line no-empty-function function noop() {} function stripRepoRootFromPaths( diff --git a/packages/metro-plugin-duplicates-checker/eslint.config.js b/packages/metro-plugin-duplicates-checker/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-plugin-duplicates-checker/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-plugin-duplicates-checker/package.json b/packages/metro-plugin-duplicates-checker/package.json index ec123baeab..2f03443388 100644 --- a/packages/metro-plugin-duplicates-checker/package.json +++ b/packages/metro-plugin-duplicates-checker/package.json @@ -42,7 +42,6 @@ "@rnx-kit/types-plugin-duplicates-checker": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/metro-serializer": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/metro-plugin-duplicates-checker/src/index.ts b/packages/metro-plugin-duplicates-checker/src/index.ts index 7565692f98..d87c99bdfc 100644 --- a/packages/metro-plugin-duplicates-checker/src/index.ts +++ b/packages/metro-plugin-duplicates-checker/src/index.ts @@ -91,5 +91,5 @@ if (require.main === module) { } // `export default` required for plugin interface -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default DuplicateDependencies; diff --git a/packages/metro-plugin-typescript/eslint.config.js b/packages/metro-plugin-typescript/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-plugin-typescript/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-plugin-typescript/package.json b/packages/metro-plugin-typescript/package.json index 3b878fe896..9ff8a0a128 100644 --- a/packages/metro-plugin-typescript/package.json +++ b/packages/metro-plugin-typescript/package.json @@ -43,7 +43,6 @@ "typescript": ">=4.7.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/metro-plugin-typescript/src/index.ts b/packages/metro-plugin-typescript/src/index.ts index e914cc3226..a8d9c8f499 100644 --- a/packages/metro-plugin-typescript/src/index.ts +++ b/packages/metro-plugin-typescript/src/index.ts @@ -3,5 +3,5 @@ import { TypeScriptPlugin } from "./serializerHook.ts"; export { TypeScriptPlugin }; // `export default` required for plugin interface -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default TypeScriptPlugin; diff --git a/packages/metro-resolver-symlinks/eslint.config.js b/packages/metro-resolver-symlinks/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-resolver-symlinks/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-resolver-symlinks/package.json b/packages/metro-resolver-symlinks/package.json index d4d8a03c10..e30a67f4dc 100644 --- a/packages/metro-resolver-symlinks/package.json +++ b/packages/metro-resolver-symlinks/package.json @@ -32,7 +32,6 @@ "enhanced-resolve": "^5.8.3" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/metro-resolver-symlinks/src/index.ts b/packages/metro-resolver-symlinks/src/index.ts index 69fd51d57b..e119cab887 100644 --- a/packages/metro-resolver-symlinks/src/index.ts +++ b/packages/metro-resolver-symlinks/src/index.ts @@ -2,5 +2,5 @@ import { makeResolver } from "./symlinkResolver.ts"; module.exports = makeResolver; -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default makeResolver; diff --git a/packages/metro-resolver-symlinks/test/remappers/remapImportPath.test.ts b/packages/metro-resolver-symlinks/test/remappers/remapImportPath.test.ts index c2b0b0106e..5c49145c75 100644 --- a/packages/metro-resolver-symlinks/test/remappers/remapImportPath.test.ts +++ b/packages/metro-resolver-symlinks/test/remappers/remapImportPath.test.ts @@ -25,7 +25,7 @@ describe("remap-import-path", () => { expect(() => remapImportPath()).toThrow( "A test function is required for this plugin" ); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any expect(() => remapImportPath({} as any)).toThrow( "Expected option `test` to be a function" ); diff --git a/packages/metro-serializer-esbuild/eslint.config.js b/packages/metro-serializer-esbuild/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-serializer-esbuild/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-serializer-esbuild/package.json b/packages/metro-serializer-esbuild/package.json index d20b79511c..78ab776234 100644 --- a/packages/metro-serializer-esbuild/package.json +++ b/packages/metro-serializer-esbuild/package.json @@ -50,7 +50,6 @@ "@react-native/metro-config": "^0.83.0", "@rnx-kit/babel-plugin-import-path-remapper": "*", "@rnx-kit/babel-preset-metro-react-native": "*", - "@rnx-kit/eslint-config": "*", "@rnx-kit/metro-config": "*", "@rnx-kit/metro-serializer": "*", "@rnx-kit/metro-service": "*", diff --git a/packages/metro-serializer-esbuild/test/__fixtures__/exportAllPublic.ts b/packages/metro-serializer-esbuild/test/__fixtures__/exportAllPublic.ts index b83826e2b5..8669aed8fe 100644 --- a/packages/metro-serializer-esbuild/test/__fixtures__/exportAllPublic.ts +++ b/packages/metro-serializer-esbuild/test/__fixtures__/exportAllPublic.ts @@ -1,2 +1,2 @@ -// eslint-disable-next-line @rnx-kit/no-export-all +// oxlint-disable-next-line @rnx-kit/no-export-all export * from "./base.ts"; diff --git a/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllInternal.ts b/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllInternal.ts index df12b334fa..580da59c9f 100644 --- a/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllInternal.ts +++ b/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllInternal.ts @@ -1,2 +1,2 @@ -// eslint-disable-next-line @rnx-kit/no-export-all +// oxlint-disable-next-line @rnx-kit/no-export-all export * from "./exportAllPublic.ts"; diff --git a/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllPublic.ts b/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllPublic.ts index 1c4605bc3e..eb45b330af 100644 --- a/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllPublic.ts +++ b/packages/metro-serializer-esbuild/test/__fixtures__/nestedExportAllPublic.ts @@ -1,2 +1,2 @@ -// eslint-disable-next-line @rnx-kit/no-export-all +// oxlint-disable-next-line @rnx-kit/no-export-all export * from "./nestedExportAllInternal.ts"; diff --git a/packages/metro-serializer-esbuild/test/index.test.ts b/packages/metro-serializer-esbuild/test/index.test.ts index 8c54bddb47..35d2de6fc0 100644 --- a/packages/metro-serializer-esbuild/test/index.test.ts +++ b/packages/metro-serializer-esbuild/test/index.test.ts @@ -62,7 +62,7 @@ describe("metro-serializer-esbuild", () => { assets: [], commands: [], healthChecks: [], - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any platforms: { android: {}, ios: {} } as any, project: {}, reactNativeVersion: "", diff --git a/packages/metro-serializer/eslint.config.js b/packages/metro-serializer/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-serializer/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-serializer/package.json b/packages/metro-serializer/package.json index 03fc350545..ca5944f45e 100644 --- a/packages/metro-serializer/package.json +++ b/packages/metro-serializer/package.json @@ -37,7 +37,6 @@ "@rnx-kit/tools-react-native": "^2.3.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/packages/metro-service/eslint.config.js b/packages/metro-service/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/metro-service/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/metro-service/package.json b/packages/metro-service/package.json index f652d5f688..69336a752d 100644 --- a/packages/metro-service/package.json +++ b/packages/metro-service/package.json @@ -41,7 +41,6 @@ }, "devDependencies": { "@react-native-community/cli-types": "^20.0.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/packages/oxlint-config/README.md b/packages/oxlint-config/README.md new file mode 100644 index 0000000000..840e5f5bd5 --- /dev/null +++ b/packages/oxlint-config/README.md @@ -0,0 +1,95 @@ +# @rnx-kit/oxlint-config + +[![Build](https://github.com/microsoft/rnx-kit/actions/workflows/build.yml/badge.svg)](https://github.com/microsoft/rnx-kit/actions/workflows/build.yml) +[![npm version](https://img.shields.io/npm/v/@rnx-kit/oxlint-config)](https://www.npmjs.com/package/@rnx-kit/oxlint-config) + +`@rnx-kit/oxlint-config` is a set of configurations that can be used as is, or +extended in your own oxlint config. + +## Install + +``` +yarn add @rnx-kit/oxlint-config --dev +``` + +or if you're using npm: + +``` +npm add --save-dev @rnx-kit/oxlint-config +``` + +## Usage + +Several configurations are exported by this package. For instance, to use the +[`recommended`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/recommended.ts) +configuration, you can re-export it in your config like so: + +```ts +import config from "@rnx-kit/oxlint-config"; +export default config; +``` + +Alternatively, if you want to add customizations: + +```ts +import recommended from "@rnx-kit/oxlint-config"; +import { defineConfig } from "oxlint"; + +export default defineConfig({ + extends: [recommended], + plugins: ["import"], + rules: { + "import/no-default-export": "error", + "no-unneeded-ternary": "error", + }, +}); +``` + +## Recommended Configurations + +- [`@rnx-kit/oxlint-config/recommended`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/recommended.ts) + (or `@rnx-kit/oxlint-config` for short) enables: + - `correctness` rules for `eslint`, `import`, `node`, `oxc`, `react`, + `typescript`, `unicorn` + - All the equivalent rules found in (where possible): + - [`eslint:recommended`](https://eslint.org/docs/rules/) + - [`@typescript-eslint/recommended`](https://typescript-eslint.io/linting/configs#recommended) + - [`react-hooks/recommended`](https://github.com/facebook/react/tree/main/packages/eslint-plugin-react-hooks#readme) + - [`react/recommended`](https://github.com/yannickcr/eslint-plugin-react#recommended) + - It also includes and enables the following rules: + - [`@react-native/platform-colors`](https://github.com/facebook/react-native/tree/main/packages/eslint-plugin-react-native#readme) + (as JS plugin) +- [`@rnx-kit/oxlint-config/strict`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/strict.ts) + extends `@rnx-kit/oxlint-config/recommended` with rules that enables better + tree shaking: + - [`@rnx-kit/no-const-enum`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/no-const-enum.js) + (as JS plugin) + - [`@rnx-kit/no-export-all`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/no-export-all.js) + (as JS plugin) + - [`@rnx-kit/no-foreach-with-captured-variables`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/no-foreach-with-captured-variables.js) + (as JS plugin) + - [`import/no-default-export`](https://oxc.rs/docs/guide/usage/linter/rules/import/no-default-export.html) + - [`no-unneeded-ternary`](https://oxc.rs/docs/guide/usage/linter/rules/eslint/no-unneeded-ternary.html) +- [`@rnx-kit/oxlint-config/types-only`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/types-only.ts) + enables rules for types only modules + +Additionally, we also export the following configurations to ease the migration +from ESLint: + +- [`eslint:recommended`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/eslint-recommended.ts) +- [`@typescript-eslint/recommended`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/typescript-recommended.ts) +- [`@microsoft/sdl/common`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/sdl-common.ts) +- [`@microsoft/sdl/node`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/sdl-node.ts) +- [`@microsoft/sdl/react`](https://github.com/microsoft/rnx-kit/blob/main/packages/oxlint-config/src/configs/sdl-react.ts) + +## Supported Rules + +- ✓: Enabled with `@rnx-kit/oxlint-config/recommended` +- 🔧: Fixable with `--fix` + +| ✓ | 🔧 | Rule | Description | +| :-: | :-: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ✓ | | [`@rnx-kit/no-const-enum`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/no-const-enum.js) | disallow `const enum` ([why is it bad?](https://hackmd.io/bBcd6R-1TB6Zq95PSquooQ)) | +| ✓ | 🔧 | [`@rnx-kit/no-export-all`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/no-export-all.js) | disallow `export *` ([why is it bad?](https://hackmd.io/Z021hgSGStKlYLwsqNMOcg)) | +| ✓ | | [`@rnx-kit/no-foreach-with-captured-variables`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/no-foreach-with-captured-variables.js) | disallow `forEach` with outside variables; JavaScript is not efficient when it comes to using variables defined outside of its scope, and repeatedly calling that function can lead to performance issues. By using a `for...of` loop, you can avoid these performance pitfalls and also it is easier to debug. | +| | | [`@rnx-kit/type-definitions-only`](https://github.com/microsoft/rnx-kit/blob/main/packages/eslint-plugin/src/rules/type-definitions-only.js) | disallow anything but type definitions; useful for types only files or packages | diff --git a/packages/oxlint-config/package.json b/packages/oxlint-config/package.json new file mode 100644 index 0000000000..a0aeb47c7b --- /dev/null +++ b/packages/oxlint-config/package.json @@ -0,0 +1,84 @@ +{ + "name": "@rnx-kit/oxlint-config", + "version": "0.0.1", + "description": "Shareable oxlint configs", + "homepage": "https://github.com/microsoft/rnx-kit/tree/main/packages/oxlint-config#readme", + "license": "MIT", + "author": { + "name": "Microsoft Open Source", + "email": "microsoftopensource@users.noreply.github.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/microsoft/rnx-kit", + "directory": "packages/oxlint-config" + }, + "files": [ + "src" + ], + "type": "module", + "main": "src/configs/recommended.ts", + "exports": { + ".": { + "default": "./src/configs/recommended.ts" + }, + "./eslint-recommended": { + "default": "./src/configs/eslint-recommended.ts" + }, + "./private": { + "default": "./private.ts" + }, + "./recommended": { + "default": "./src/configs/recommended.ts" + }, + "./sdl-common": { + "default": "./src/configs/sdl-common.ts" + }, + "./sdl-node": { + "default": "./src/configs/sdl-node.ts" + }, + "./sdl-react": { + "default": "./src/configs/sdl-react.ts" + }, + "./strict": { + "default": "./src/configs/strict.ts" + }, + "./types-only": { + "default": "./src/configs/types-only.ts" + }, + "./typescript-recommended": { + "default": "./src/configs/typescript-recommended.ts" + }, + "./typescript-stylistic": { + "default": "./src/configs/typescript-stylistic.ts" + }, + "./package.json": "./package.json" + }, + "scripts": { + "build": "rnx-kit-scripts build", + "format": "rnx-kit-scripts format" + }, + "dependencies": { + "@microsoft/eslint-plugin-sdl": "^1.0.0", + "@react-native/eslint-plugin": "^0.84.0", + "@rnx-kit/eslint-plugin": "^0.9.6" + }, + "devDependencies": { + "@rnx-kit/scripts": "*", + "@rnx-kit/tsconfig": "*", + "eslint": "^9.0.0", + "oxlint": "^1.50.0" + }, + "peerDependencies": { + "eslint": "^9.0.0", + "oxlint": "^1.50.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + }, + "engines": { + "node": ">=22.11" + } +} diff --git a/packages/oxlint-config/private.ts b/packages/oxlint-config/private.ts new file mode 100644 index 0000000000..8998d668ef --- /dev/null +++ b/packages/oxlint-config/private.ts @@ -0,0 +1,27 @@ +import { defineConfig } from "oxlint"; +import sdlCommon from "./src/configs/sdl-common.ts"; +import sdlNode from "./src/configs/sdl-node.ts"; +import sdlReact from "./src/configs/sdl-react.ts"; +import strict from "./src/configs/strict.ts"; +import stylistic from "./src/configs/typescript-stylistic.ts"; + +export default defineConfig({ + extends: [sdlCommon, sdlNode, sdlReact, strict, stylistic], + rules: { + "@rnx-kit/no-foreach-with-captured-variables": "error", + }, + overrides: [ + { + files: ["**/oxlint.config.ts"], + rules: { + "import/no-default-export": "off", + }, + }, + { + files: ["**/types.ts"], + rules: { + "@rnx-kit/type-definitions-only": "error", + }, + }, + ], +}); diff --git a/packages/oxlint-config/src/configs/eslint-recommended.ts b/packages/oxlint-config/src/configs/eslint-recommended.ts new file mode 100644 index 0000000000..4476565ef2 --- /dev/null +++ b/packages/oxlint-config/src/configs/eslint-recommended.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "oxlint"; + +export default defineConfig({ + categories: { + correctness: "error", + }, + plugins: ["eslint", "unicorn"], + rules: { + "no-case-declarations": "error", // eslint/pedantic + "no-empty": "error", // eslint/restriction + "no-empty-file": "off", // unicorn/correctness + "no-empty-function": "error", // eslint/restriction + "no-fallthrough": "error", // eslint/pedantic + "no-new-func": "error", // eslint/style + "no-prototype-builtins": "error", // eslint/pedantic + "no-redeclare": "error", // eslint/pedantic + "no-regex-spaces": "error", // eslint/restriction + "no-unexpected-multiline": "error", // eslint/suspicious + "no-unused-vars": [ + "error", + { + args: "all", + argsIgnorePattern: "^_", + caughtErrors: "all", + caughtErrorsIgnorePattern: "^_", + destructuredArrayIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + "no-unneeded-ternary": "warn", // eslint/suspicious + }, +}); diff --git a/packages/oxlint-config/src/configs/recommended.ts b/packages/oxlint-config/src/configs/recommended.ts new file mode 100644 index 0000000000..b6ca5eae44 --- /dev/null +++ b/packages/oxlint-config/src/configs/recommended.ts @@ -0,0 +1,36 @@ +import { defineConfig } from "oxlint"; +import eslint from "./eslint-recommended.ts"; +import typescript from "./typescript-recommended.ts"; + +export default defineConfig({ + extends: [eslint, typescript], + // https://oxc.rs/docs/guide/usage/linter/config.html#enable-groups-of-rules-with-categories + categories: { + correctness: "error", + }, + // https://oxc.rs/docs/guide/usage/linter/plugins.html#supported-plugins + plugins: ["node", "oxc", "react"], + // https://oxc.rs/docs/guide/usage/linter/config.html#configure-js-plugins-experimental + jsPlugins: [ + { + name: "@react-native", + specifier: import.meta.resolve("@react-native/eslint-plugin"), + }, + { + name: "@rnx-kit", + specifier: import.meta.resolve("@rnx-kit/eslint-plugin"), + }, + ], + // https://oxc.rs/docs/guide/usage/linter/rules.html + rules: { + "@react-native/platform-colors": "error", + "@rnx-kit/no-const-enum": "warn", + "@rnx-kit/no-export-all": "warn", + "@rnx-kit/no-foreach-with-captured-variables": "warn", + "no-unused-expressions": "off", // Catches valid expressions like template literals + "typescript/consistent-type-imports": [ + "error", // typescript/style + { disallowTypeAnnotations: false }, + ], + }, +}); diff --git a/packages/oxlint-config/src/configs/sdl-common.ts b/packages/oxlint-config/src/configs/sdl-common.ts new file mode 100644 index 0000000000..5db32c5fd0 --- /dev/null +++ b/packages/oxlint-config/src/configs/sdl-common.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "oxlint"; + +// https://github.com/microsoft/eslint-plugin-sdl/blob/main/config/common.js +export default defineConfig({ + jsPlugins: [ + { + name: "@microsoft/sdl", + specifier: import.meta.resolve("@microsoft/eslint-plugin-sdl"), + }, + ], + rules: { + "@microsoft/sdl/no-cookies": "error", + "@microsoft/sdl/no-document-domain": "error", + "@microsoft/sdl/no-document-write": "error", + "@microsoft/sdl/no-html-method": "error", + "@microsoft/sdl/no-inner-html": "error", + "@microsoft/sdl/no-insecure-url": "error", + "@microsoft/sdl/no-msapp-exec-unsafe": "error", + "@microsoft/sdl/no-postmessage-star-origin": "error", + "@microsoft/sdl/no-winjs-html-unsafe": "error", + }, +}); diff --git a/packages/oxlint-config/src/configs/sdl-node.ts b/packages/oxlint-config/src/configs/sdl-node.ts new file mode 100644 index 0000000000..5ae0a22066 --- /dev/null +++ b/packages/oxlint-config/src/configs/sdl-node.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "oxlint"; + +// https://github.com/microsoft/eslint-plugin-sdl/blob/main/config/node.js +export default defineConfig({ + plugins: ["typescript"], + jsPlugins: [ + { + name: "@microsoft/sdl", + specifier: import.meta.resolve("@microsoft/eslint-plugin-sdl"), + }, + ], + rules: { + "@microsoft/sdl/no-unsafe-alloc": "error", + "typescript/no-deprecated": "error", + }, +}); diff --git a/packages/oxlint-config/src/configs/sdl-react.ts b/packages/oxlint-config/src/configs/sdl-react.ts new file mode 100644 index 0000000000..01848156ed --- /dev/null +++ b/packages/oxlint-config/src/configs/sdl-react.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "oxlint"; + +// https://github.com/microsoft/eslint-plugin-sdl/blob/main/config/react.js +export default defineConfig({ + plugins: ["react"], + rules: { + "react/iframe-missing-sandbox": "error", + "react/jsx-no-target-blank": [ + "error", + { + allowReferrer: false, + enforceDynamicLinks: "always", + warnOnSpreadAttributes: true, + }, + ], + "react/no-danger": "error", + }, +}); diff --git a/packages/oxlint-config/src/configs/strict.ts b/packages/oxlint-config/src/configs/strict.ts new file mode 100644 index 0000000000..2ebe25716c --- /dev/null +++ b/packages/oxlint-config/src/configs/strict.ts @@ -0,0 +1,13 @@ +import { defineConfig } from "oxlint"; +import recommended from "./recommended.ts"; + +export default defineConfig({ + extends: [recommended], + plugins: ["import"], + rules: { + "@rnx-kit/no-const-enum": "error", + "@rnx-kit/no-export-all": "error", + "import/no-default-export": "error", + "no-unneeded-ternary": "error", + }, +}); diff --git a/packages/oxlint-config/src/configs/types-only.ts b/packages/oxlint-config/src/configs/types-only.ts new file mode 100644 index 0000000000..6b04909f63 --- /dev/null +++ b/packages/oxlint-config/src/configs/types-only.ts @@ -0,0 +1,20 @@ +import { defineConfig } from "oxlint"; +import strict from "./strict.ts"; +import stylistic from "./typescript-stylistic.ts"; + +export default defineConfig({ + extends: [strict, stylistic], + rules: { + "@rnx-kit/type-definitions-only": "error", + "typescript/consistent-type-definitions": ["error", "type"], + }, + overrides: [ + { + files: ["**/oxlint.config.ts"], + rules: { + "@rnx-kit/type-definitions-only": "off", + "import/no-default-export": "off", + }, + }, + ], +}); diff --git a/packages/oxlint-config/src/configs/typescript-recommended.ts b/packages/oxlint-config/src/configs/typescript-recommended.ts new file mode 100644 index 0000000000..8421a3ab88 --- /dev/null +++ b/packages/oxlint-config/src/configs/typescript-recommended.ts @@ -0,0 +1,51 @@ +import { defineConfig } from "oxlint"; + +export default defineConfig({ + categories: { + correctness: "error", + }, + // TODO: These rules should be declared under `overrides` and only apply + // to TypeScript files. However, it doesn't seem like they work properly with + // deeply nested configs at the moment. + plugins: ["eslint", "typescript", "unicorn"], + rules: { + "no-array-constructor": "error", // eslint/pedantic + "no-var": "error", // eslint/restriction + "prefer-const": [ + "error", // eslint/style + { destructuring: "any", ignoreReadBeforeAssign: false }, + ], + "prefer-rest-params": "error", // eslint/style + "prefer-spread": "error", // eslint/style + "typescript/ban-ts-comment": "error", // typescript/pedantic + "typescript/no-confusing-non-null-assertion": "error", // typescript/suspicious + "typescript/no-empty-object-type": "error", // typescript/restriction + "typescript/no-explicit-any": "error", // typescript/restriction + "typescript/no-namespace": "error", // typescript/restriction + "typescript/no-unnecessary-type-constraint": "error", // typescript/suspicious + "typescript/no-unsafe-function-type": "error", // typescript/pedantic + "typescript/prefer-ts-expect-error": "error", // typescript/pedantic + }, + overrides: [ + { + files: ["**/*.{cts,mts,ts,tsx}"], + plugins: ["typescript"], + rules: { + "no-class-assign": "off", // turned off by @typescript-eslint/recommended + "no-const-assign": "off", // turned off by @typescript-eslint/recommended + "no-dupe-class-members": "off", // turned off by @typescript-eslint/recommended + "no-dupe-keys": "off", // turned off by @typescript-eslint/recommended + "no-func-assign": "off", // turned off by @typescript-eslint/recommended + "no-import-assign": "off", // turned off by @typescript-eslint/recommended + "no-new-native-nonconstructor": "off", // turned off by @typescript-eslint/recommended + "no-obj-calls": "off", // turned off by @typescript-eslint/recommended + "no-redeclare": "off", // turned off by @typescript-eslint/recommended + "no-setter-return": "off", // turned off by @typescript-eslint/recommended + "no-this-before-super": "off", // turned off by @typescript-eslint/recommended + "no-unreachable": "off", // turned off by @typescript-eslint/recommended + "no-unsafe-negation": "off", // turned off by @typescript-eslint/recommended + "no-with": "off", // turned off by @typescript-eslint/recommended + }, + }, + ], +}); diff --git a/packages/oxlint-config/src/configs/typescript-stylistic.ts b/packages/oxlint-config/src/configs/typescript-stylistic.ts new file mode 100644 index 0000000000..4759d278e4 --- /dev/null +++ b/packages/oxlint-config/src/configs/typescript-stylistic.ts @@ -0,0 +1,24 @@ +import { defineConfig } from "oxlint"; + +export default defineConfig({ + categories: { + correctness: "error", + }, + // TODO: These rules should be declared under `overrides` and only apply + // to TypeScript files. However, it doesn't seem like they work properly with + // deeply nested configs at the moment. + plugins: ["typescript"], + rules: { + "typescript/adjacent-overload-signatures": "error", + "typescript/array-type": "error", + "typescript/ban-tslint-comment": "error", + "typescript/class-literal-property-style": "error", + "typescript/consistent-generic-constructors": "error", + "typescript/consistent-indexed-object-style": "error", + "typescript/consistent-type-assertions": "error", + "typescript/consistent-type-definitions": ["error", "type"], + "typescript/no-inferrable-types": "error", + "typescript/prefer-for-of": "error", + "typescript/prefer-function-type": "error", + }, +}); diff --git a/packages/oxlint-config/tsconfig.json b/packages/oxlint-config/tsconfig.json new file mode 100644 index 0000000000..7aaa50e589 --- /dev/null +++ b/packages/oxlint-config/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@rnx-kit/tsconfig/tsconfig.node.json", + "compilerOptions": { + "noEmit": true + }, + "include": ["src", "private.ts"] +} diff --git a/packages/react-native-auth/eslint.config.js b/packages/react-native-auth/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/react-native-auth/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/react-native-auth/package.json b/packages/react-native-auth/package.json index dccdbe3dfd..e8f6e0f891 100644 --- a/packages/react-native-auth/package.json +++ b/packages/react-native-auth/package.json @@ -38,7 +38,6 @@ "@react-native-community/cli-platform-android": "^20.0.0", "@react-native-community/cli-platform-ios": "^20.0.0", "@react-native/metro-config": "^0.83.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "react": "19.2.0", diff --git a/packages/react-native-auth/src/NativeAuth.ts b/packages/react-native-auth/src/NativeAuth.ts index 9ff8d67bbc..f9c89880b3 100644 --- a/packages/react-native-auth/src/NativeAuth.ts +++ b/packages/react-native-auth/src/NativeAuth.ts @@ -48,7 +48,7 @@ type AccountType = string; /** * Specification for the native auth module. */ -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +// oxlint-disable-next-line typescript/consistent-type-definitions export interface Spec extends TurboModule { acquireTokenWithResource( resource: string, diff --git a/packages/react-native-lazy-index/eslint.config.js b/packages/react-native-lazy-index/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/react-native-lazy-index/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/react-native-lazy-index/package.json b/packages/react-native-lazy-index/package.json index 814872a4d0..f67713d28b 100644 --- a/packages/react-native-lazy-index/package.json +++ b/packages/react-native-lazy-index/package.json @@ -43,7 +43,6 @@ }, "devDependencies": { "@babel/core": "^7.20.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/template/eslint.config.js b/packages/template/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/template/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/template/package.json b/packages/template/package.json index 4e232a538a..63136a4386 100644 --- a/packages/template/package.json +++ b/packages/template/package.json @@ -27,7 +27,6 @@ "test": "rnx-kit-scripts test" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/packages/test-app-macos/eslint.config.js b/packages/test-app-macos/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/test-app-macos/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/test-app-windows/eslint.config.js b/packages/test-app-windows/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/test-app-windows/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/test-app/eslint.config.js b/packages/test-app/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/test-app/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/third-party-notices/eslint.config.js b/packages/third-party-notices/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/third-party-notices/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/third-party-notices/package.json b/packages/third-party-notices/package.json index 924c380179..58cf964b34 100644 --- a/packages/third-party-notices/package.json +++ b/packages/third-party-notices/package.json @@ -45,7 +45,6 @@ }, "devDependencies": { "@react-native-community/cli-types": "^20.0.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/metro-serializer": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/third-party-notices/src/extractors.js b/packages/third-party-notices/src/extractors.js index e03e8c82bb..a58b94e60b 100644 --- a/packages/third-party-notices/src/extractors.js +++ b/packages/third-party-notices/src/extractors.js @@ -32,7 +32,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// oxlint-disable // @ts-nocheck "use strict"; diff --git a/packages/third-party-notices/src/index.ts b/packages/third-party-notices/src/index.ts index b5e45dffa1..eff1d284d6 100644 --- a/packages/third-party-notices/src/index.ts +++ b/packages/third-party-notices/src/index.ts @@ -32,5 +32,5 @@ export function ThirdPartyNotices( ThirdPartyNotices.type = "serializer"; // `export default` required for plugin interface -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default ThirdPartyNotices; diff --git a/packages/tools-android/eslint.config.js b/packages/tools-android/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/packages/tools-android/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/packages/tools-android/package.json b/packages/tools-android/package.json index c9034f0a85..d089eadb1f 100644 --- a/packages/tools-android/package.json +++ b/packages/tools-android/package.json @@ -37,7 +37,6 @@ "@rnx-kit/tools-shell": "^0.2.2" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/tools-apple/eslint.config.js b/packages/tools-apple/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/packages/tools-apple/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/packages/tools-apple/package.json b/packages/tools-apple/package.json index d73ee9db9f..5c94e1e8f0 100644 --- a/packages/tools-apple/package.json +++ b/packages/tools-apple/package.json @@ -58,7 +58,6 @@ "fast-xml-parser": "^5.3.4" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/tools-filesystem/eslint.config.js b/packages/tools-filesystem/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/tools-filesystem/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/tools-filesystem/package.json b/packages/tools-filesystem/package.json index 2a35a0820f..583b71a93a 100644 --- a/packages/tools-filesystem/package.json +++ b/packages/tools-filesystem/package.json @@ -41,7 +41,6 @@ "update-readme": "rnx-kit-scripts update-api-readme" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/packages/tools-language/eslint.config.js b/packages/tools-language/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/tools-language/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/tools-language/package.json b/packages/tools-language/package.json index c297c9d3cb..8e51fd41fd 100644 --- a/packages/tools-language/package.json +++ b/packages/tools-language/package.json @@ -43,7 +43,6 @@ "update-readme": "rnx-kit-scripts update-api-readme" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/tools-node/eslint.config.js b/packages/tools-node/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/tools-node/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/tools-node/package.json b/packages/tools-node/package.json index bc56f2e920..12dd363d82 100644 --- a/packages/tools-node/package.json +++ b/packages/tools-node/package.json @@ -60,7 +60,6 @@ "@rnx-kit/types-node": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/tools-packages/eslint.config.js b/packages/tools-packages/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/tools-packages/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/tools-packages/package.json b/packages/tools-packages/package.json index e3a98c3d4c..45fff69caf 100644 --- a/packages/tools-packages/package.json +++ b/packages/tools-packages/package.json @@ -39,7 +39,6 @@ "@rnx-kit/types-node": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/tools-react-native/eslint.config.js b/packages/tools-react-native/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/tools-react-native/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/tools-react-native/package.json b/packages/tools-react-native/package.json index adb7c017c7..2baa3e01ac 100644 --- a/packages/tools-react-native/package.json +++ b/packages/tools-react-native/package.json @@ -78,7 +78,6 @@ "devDependencies": { "@react-native-community/cli": "^20.0.0", "@react-native-community/cli-types": "^20.0.0", - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0", diff --git a/packages/tools-react-native/test/metro.test.ts b/packages/tools-react-native/test/metro.test.ts index 13c9e9d5bd..8e135dff05 100644 --- a/packages/tools-react-native/test/metro.test.ts +++ b/packages/tools-react-native/test/metro.test.ts @@ -7,7 +7,7 @@ import { requireModuleFromMetro } from "../src/metro.ts"; import { fixturePath } from "./fixtures.ts"; describe("requireModuleFromMetro", () => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // oxlint-disable-next-line typescript/no-explicit-any const context: any = {}; function getMetroResolver(fromDir: string) { diff --git a/packages/tools-shell/eslint.config.js b/packages/tools-shell/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/packages/tools-shell/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/packages/tools-shell/package.json b/packages/tools-shell/package.json index 5e3fd93a4d..966b0e6dcd 100644 --- a/packages/tools-shell/package.json +++ b/packages/tools-shell/package.json @@ -50,7 +50,6 @@ "update-readme": "rnx-kit-scripts update-api-readme" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", diff --git a/packages/tools-windows/eslint.config.js b/packages/tools-windows/eslint.config.js deleted file mode 100644 index 40c96d3f51..0000000000 --- a/packages/tools-windows/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "@rnx-kit/eslint-config"; - -// eslint-disable-next-line no-restricted-exports -export default config; diff --git a/packages/tools-windows/package.json b/packages/tools-windows/package.json index f7596aa040..d7be59ef95 100644 --- a/packages/tools-windows/package.json +++ b/packages/tools-windows/package.json @@ -38,7 +38,6 @@ "fast-xml-parser": "^5.3.4" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/tools-workspaces/eslint.config.js b/packages/tools-workspaces/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/tools-workspaces/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/tools-workspaces/package.json b/packages/tools-workspaces/package.json index 8ee7a98a0d..0d49403bcb 100644 --- a/packages/tools-workspaces/package.json +++ b/packages/tools-workspaces/package.json @@ -43,7 +43,6 @@ "strip-json-comments": "^3.1.1" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/micromatch": "^4.0.0", diff --git a/packages/types-bundle-config/eslint.config.js b/packages/types-bundle-config/eslint.config.js deleted file mode 100644 index 9f7f00b934..0000000000 --- a/packages/types-bundle-config/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config/types-only"); diff --git a/packages/types-bundle-config/oxlint.config.ts b/packages/types-bundle-config/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-bundle-config/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-bundle-config/package.json b/packages/types-bundle-config/package.json index 69bf1ef852..d71c01d28b 100644 --- a/packages/types-bundle-config/package.json +++ b/packages/types-bundle-config/package.json @@ -40,7 +40,7 @@ "@rnx-kit/types-plugin-typescript": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "metro": "^0.83.3" diff --git a/packages/types-bundle-config/src/allPlatforms.ts b/packages/types-bundle-config/src/allPlatforms.ts index cb8dd7f937..8949fcb691 100644 --- a/packages/types-bundle-config/src/allPlatforms.ts +++ b/packages/types-bundle-config/src/allPlatforms.ts @@ -3,7 +3,7 @@ */ // Possible values for AllPlatforms -// eslint-disable-next-line @rnx-kit/type-definitions-only +// oxlint-disable-next-line @rnx-kit/type-definitions-only export const ALL_PLATFORM_VALUES = [ "android", "ios", diff --git a/packages/types-bundle-config/src/index.ts b/packages/types-bundle-config/src/index.ts index 21eb200e1f..fff20d93d9 100644 --- a/packages/types-bundle-config/src/index.ts +++ b/packages/types-bundle-config/src/index.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line @rnx-kit/type-definitions-only +// oxlint-disable-next-line @rnx-kit/type-definitions-only export { ALL_PLATFORM_VALUES } from "./allPlatforms.ts"; export type { AllPlatforms } from "./allPlatforms.ts"; export type { diff --git a/packages/types-kit-config/eslint.config.js b/packages/types-kit-config/eslint.config.js deleted file mode 100644 index 9f7f00b934..0000000000 --- a/packages/types-kit-config/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config/types-only"); diff --git a/packages/types-kit-config/oxlint.config.ts b/packages/types-kit-config/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-kit-config/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-kit-config/package.json b/packages/types-kit-config/package.json index 632224dfd6..a7d3919945 100644 --- a/packages/types-kit-config/package.json +++ b/packages/types-kit-config/package.json @@ -33,7 +33,7 @@ "@rnx-kit/types-bundle-config": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/packages/types-metro-serializer-esbuild/eslint.config.js b/packages/types-metro-serializer-esbuild/eslint.config.js deleted file mode 100644 index 9f7f00b934..0000000000 --- a/packages/types-metro-serializer-esbuild/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config/types-only"); diff --git a/packages/types-metro-serializer-esbuild/oxlint.config.ts b/packages/types-metro-serializer-esbuild/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-metro-serializer-esbuild/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-metro-serializer-esbuild/package.json b/packages/types-metro-serializer-esbuild/package.json index 10ba8c9cb4..2e4f728a0b 100644 --- a/packages/types-metro-serializer-esbuild/package.json +++ b/packages/types-metro-serializer-esbuild/package.json @@ -29,7 +29,7 @@ "lint": "rnx-kit-scripts lint" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "esbuild": "^0.27.1" diff --git a/packages/types-node/eslint.config.js b/packages/types-node/eslint.config.js deleted file mode 100644 index 9f7f00b934..0000000000 --- a/packages/types-node/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config/types-only"); diff --git a/packages/types-node/oxlint.config.ts b/packages/types-node/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-node/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-node/package.json b/packages/types-node/package.json index 6df56e8da6..da44e2f3dd 100644 --- a/packages/types-node/package.json +++ b/packages/types-node/package.json @@ -33,7 +33,7 @@ "@rnx-kit/types-kit-config": "^1.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/packages/types-plugin-cyclic-dependencies/eslint.config.js b/packages/types-plugin-cyclic-dependencies/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/types-plugin-cyclic-dependencies/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/types-plugin-cyclic-dependencies/oxlint.config.ts b/packages/types-plugin-cyclic-dependencies/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-plugin-cyclic-dependencies/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-plugin-cyclic-dependencies/package.json b/packages/types-plugin-cyclic-dependencies/package.json index e6f09ae594..a6bb0a15bb 100644 --- a/packages/types-plugin-cyclic-dependencies/package.json +++ b/packages/types-plugin-cyclic-dependencies/package.json @@ -30,7 +30,7 @@ "lint": "rnx-kit-scripts lint" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/packages/types-plugin-duplicates-checker/eslint.config.js b/packages/types-plugin-duplicates-checker/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/types-plugin-duplicates-checker/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/types-plugin-duplicates-checker/oxlint.config.ts b/packages/types-plugin-duplicates-checker/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-plugin-duplicates-checker/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-plugin-duplicates-checker/package.json b/packages/types-plugin-duplicates-checker/package.json index 62093d0256..c8cfdf3376 100644 --- a/packages/types-plugin-duplicates-checker/package.json +++ b/packages/types-plugin-duplicates-checker/package.json @@ -30,7 +30,7 @@ "lint": "rnx-kit-scripts lint" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/packages/types-plugin-typescript/eslint.config.js b/packages/types-plugin-typescript/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/types-plugin-typescript/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/types-plugin-typescript/oxlint.config.ts b/packages/types-plugin-typescript/oxlint.config.ts new file mode 100644 index 0000000000..c1c3da440a --- /dev/null +++ b/packages/types-plugin-typescript/oxlint.config.ts @@ -0,0 +1,2 @@ +import config from "@rnx-kit/oxlint-config/types-only"; +export default config; diff --git a/packages/types-plugin-typescript/package.json b/packages/types-plugin-typescript/package.json index f1a6100953..f1d093dd5f 100644 --- a/packages/types-plugin-typescript/package.json +++ b/packages/types-plugin-typescript/package.json @@ -30,7 +30,7 @@ "lint": "rnx-kit-scripts lint" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", + "@rnx-kit/oxlint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*" }, diff --git a/packages/typescript-service/eslint.config.js b/packages/typescript-service/eslint.config.js deleted file mode 100644 index 89ed77c6f5..0000000000 --- a/packages/typescript-service/eslint.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@rnx-kit/eslint-config"); diff --git a/packages/typescript-service/package.json b/packages/typescript-service/package.json index 0457ec77c6..f32134ae56 100644 --- a/packages/typescript-service/package.json +++ b/packages/typescript-service/package.json @@ -37,7 +37,6 @@ "@rnx-kit/tools-node": "^3.0.0" }, "devDependencies": { - "@rnx-kit/eslint-config": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^24.0.0" diff --git a/packages/typescript-service/test/__fixtures__/c.ts b/packages/typescript-service/test/__fixtures__/c.ts index 596a6ed8bb..cda1b4d0b8 100644 --- a/packages/typescript-service/test/__fixtures__/c.ts +++ b/packages/typescript-service/test/__fixtures__/c.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { b } from "./b"; -// eslint-disable-next-line @typescript-eslint/no-unused-vars +// oxlint-disable-next-line no-unused-vars export function c(x: any) { return "123" + b() + "456"; } diff --git a/packages/typescript-service/test/config.test.ts b/packages/typescript-service/test/config.test.ts index fb128aeff7..9638769d6b 100644 --- a/packages/typescript-service/test/config.test.ts +++ b/packages/typescript-service/test/config.test.ts @@ -24,7 +24,7 @@ describe("readConfigFile()", () => { const configFileName = path.join(fixturePath, "invalid-tsconfig.json"); const config = readConfigFile(configFileName); - ok(config?.errors.length ?? 0 > 0); + ok((config?.errors.length ?? 0) > 0); }); it("returns a valid config", () => { diff --git a/scripts/dependencies.config.js b/scripts/dependencies.config.js index ed83102560..6e13dfbbf7 100644 --- a/scripts/dependencies.config.js +++ b/scripts/dependencies.config.js @@ -24,7 +24,23 @@ function lookForFile(filename) { * @returns {boolean} */ function needsJest(cwd, manifest) { - return "jest" in manifest || fs.existsSync(path.join(cwd, "jest.config.js")); + return ( + Object.hasOwn(manifest, "jest") || + fs.existsSync(path.join(cwd, "jest.config.js")) + ); +} + +/** + * @param {string} _cwd + * @param {Record>} manifest + * @returns {boolean} + */ +function needsLint(_cwd, manifest) { + return ( + Object.hasOwn(manifest, "scripts") && + Object.hasOwn(manifest["scripts"], "lint") && + manifest["scripts"]["lint"].includes("rnx-kit-scripts lint") + ); } const needsTypeScript = lookForFile("tsconfig.json"); @@ -32,13 +48,13 @@ const needsTypeScript = lookForFile("tsconfig.json"); const COMMON_DEPENDENCIES = /** @type {const} */ ([ ["@types/jest", needsJest], ["@typescript/native-preview", needsTypeScript], - ["eslint", lookForFile("eslint.config.js")], + ["oxlint", needsLint], ["jest", needsJest], ["oxfmt", always], ["typescript", needsTypeScript], ]); -/* eslint-disable-next-line no-restricted-exports */ +/* oxlint-disable-next-line no-default-export */ export default function ({ cwd, manifest }) { let extensions = undefined; diff --git a/scripts/eslint.config.js b/scripts/eslint.config.js index aa8fbbd03a..3e3a76380c 100644 --- a/scripts/eslint.config.js +++ b/scripts/eslint.config.js @@ -1,4 +1,4 @@ import config from "../packages/eslint-plugin/private/eslint.config.js"; -// eslint-disable-next-line no-restricted-exports +// oxlint-disable-next-line no-default-export export default config; diff --git a/scripts/package.json b/scripts/package.json index d285dc7e5e..ca6e121107 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -27,7 +27,6 @@ "@yarnpkg/cli": "^4.6.0", "clipanion": "^4.0.0-rc.4", "esbuild": "^0.27.1", - "eslint": "catalog:", "jest": "^29.2.1", "markdown-table": "^3.0.0", "oxfmt": "catalog:", diff --git a/scripts/src/commands/lint.js b/scripts/src/commands/lint.js index ad59a804ad..2bb1f84e73 100644 --- a/scripts/src/commands/lint.js +++ b/scripts/src/commands/lint.js @@ -1,8 +1,9 @@ // @ts-check import { Command, Option } from "clipanion"; -import { spawnSync } from "node:child_process"; -import { runScript } from "../process.js"; +import * as fs from "node:fs"; +import * as path from "node:path"; +import { URL, fileURLToPath } from "node:url"; export class LintCommand extends Command { /** @override */ @@ -11,25 +12,42 @@ export class LintCommand extends Command { /** @override */ static usage = Command.Usage({ description: "Lints the current package", - details: "This command lints the current package using ESLint.", + details: "This command lints the current package using oxlint.", examples: [["Lint the current package", "$0 lint"]], }); args = Option.Proxy(); async execute() { - const args = this.args.length > 0 ? this.args : []; - const files = listFiles("*.cjs", "*.js", "*.jsx", "*.mjs", "*.ts", "*.tsx"); - return await runScript("eslint", "--no-warn-ignored", ...files, ...args); + // oxlint currently only exports "." so we need to make some assumptions + // about where to find `cli.js` + const oxlint = new URL("./cli.js", import.meta.resolve("oxlint")); + + process.argv = [ + process.argv0, + fileURLToPath(oxlint), + "-c", + this.configPath, + "--ignore-pattern=__fixtures__", + ...this.args, + ]; + await import(oxlint.href); + + if (process.exitCode == null) { + return 0; + } + + return typeof process.exitCode === "number" ? process.exitCode : -1; } -} -/** - * @param {...string} patterns - * @returns {string[]} - */ -function listFiles(...patterns) { - const args = ["ls-files", ...patterns]; - const { stdout } = spawnSync("git", args, { encoding: "utf-8" }); - return stdout.trim().split("\n"); + get configPath() { + const localConfig = path.join(process.cwd(), "oxlint.config.ts"); + if (fs.existsSync(localConfig)) { + return localConfig; + } + + return fileURLToPath( + import.meta.resolve("../../../packages/oxlint-config/private.ts") + ); + } } diff --git a/yarn.lock b/yarn.lock index 79a85f0445..8c28f892d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3546,6 +3546,139 @@ __metadata: languageName: node linkType: hard +"@oxlint/binding-android-arm-eabi@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-android-arm-eabi@npm:1.50.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxlint/binding-android-arm64@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-android-arm64@npm:1.50.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxlint/binding-darwin-arm64@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-darwin-arm64@npm:1.50.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxlint/binding-darwin-x64@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-darwin-x64@npm:1.50.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxlint/binding-freebsd-x64@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-freebsd-x64@npm:1.50.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm-gnueabihf@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-arm-gnueabihf@npm:1.50.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm-musleabihf@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-arm-musleabihf@npm:1.50.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm64-gnu@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-arm64-gnu@npm:1.50.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-arm64-musl@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-arm64-musl@npm:1.50.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxlint/binding-linux-ppc64-gnu@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-ppc64-gnu@npm:1.50.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-riscv64-gnu@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-riscv64-gnu@npm:1.50.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-riscv64-musl@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-riscv64-musl@npm:1.50.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxlint/binding-linux-s390x-gnu@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-s390x-gnu@npm:1.50.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-x64-gnu@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-x64-gnu@npm:1.50.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxlint/binding-linux-x64-musl@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-linux-x64-musl@npm:1.50.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxlint/binding-openharmony-arm64@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-openharmony-arm64@npm:1.50.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxlint/binding-win32-arm64-msvc@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-win32-arm64-msvc@npm:1.50.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxlint/binding-win32-ia32-msvc@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-win32-ia32-msvc@npm:1.50.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxlint/binding-win32-x64-msvc@npm:1.50.0": + version: 1.50.0 + resolution: "@oxlint/binding-win32-x64-msvc@npm:1.50.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -4149,7 +4282,6 @@ __metadata: dependencies: "@babel/core": "npm:^7.20.0" "@babel/preset-env": "npm:^7.20.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -4167,7 +4299,6 @@ __metadata: dependencies: "@babel/core": "npm:^7.20.0" "@babel/preset-env": "npm:^7.20.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" react: "npm:19.2.0" @@ -4714,10 +4845,10 @@ __metadata: languageName: node linkType: hard -"@react-native/eslint-plugin@npm:^0.76.0": - version: 0.76.6 - resolution: "@react-native/eslint-plugin@npm:0.76.6" - checksum: 10c0/f60f354567db41cb4979210b53af73662cfaf790c6466f907817a4a497ddd258fcf5a8f8ca7aae888950dab2a1d0ceef5dfc4fe3ea0bfc82ff30c0683bfde307 +"@react-native/eslint-plugin@npm:^0.84.0": + version: 0.84.0 + resolution: "@react-native/eslint-plugin@npm:0.84.0" + checksum: 10c0/cae751b5c458ae704769504c8aee2c728a0a4e49394e209f1f910093ee6b5e5c205020e603f37401dcd4a7d9974df14a41a9a78d40bcc1b81c1feff8d420f28b languageName: node linkType: hard @@ -4922,7 +5053,6 @@ __metadata: "@react-native-community/cli-types": "npm:^20.0.0" "@rnx-kit/config": "npm:*" "@rnx-kit/console": "npm:*" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-language": "npm:*" "@rnx-kit/tools-node": "npm:*" @@ -4954,7 +5084,6 @@ __metadata: dependencies: "@babel/core": "npm:^7.0.0" "@babel/helper-plugin-utils": "npm:^7.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.0" "@rnx-kit/tsconfig": "npm:*" @@ -4974,7 +5103,6 @@ __metadata: "@react-native/babel-preset": "npm:^0.83.0" "@rnx-kit/babel-plugin-import-path-remapper": "npm:*" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/babel__core": "npm:^7.0.0" @@ -4996,7 +5124,6 @@ __metadata: resolution: "@rnx-kit/build-plugin-firebase@workspace:incubator/build-plugin-firebase" dependencies: "@rnx-kit/build": "npm:*" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" peerDependencies: @@ -5013,7 +5140,6 @@ __metadata: "@octokit/plugin-rest-endpoint-methods": "npm:^17.0.0" "@octokit/request-error": "npm:^7.0.0" "@rnx-kit/config": "npm:^0.7.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-android": "npm:^0.2.0" "@rnx-kit/tools-apple": "npm:^0.2.0" @@ -5040,7 +5166,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/bundle-diff@workspace:packages/bundle-diff" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5060,7 +5185,6 @@ __metadata: "@rnx-kit/align-deps": "npm:^3.4.2" "@rnx-kit/config": "npm:^0.7.5" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/metro-plugin-cyclic-dependencies-detector": "npm:^2.0.3" "@rnx-kit/metro-plugin-duplicates-checker": "npm:^3.0.3" @@ -5111,7 +5235,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/commitlint-lite@workspace:packages/commitlint-lite" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5125,7 +5248,6 @@ __metadata: resolution: "@rnx-kit/config@workspace:packages/config" dependencies: "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.4" "@rnx-kit/tools-packages": "npm:^0.1.2" @@ -5146,7 +5268,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/console@workspace:packages/console" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5157,7 +5278,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/esbuild-plugin-import-path-remapper@workspace:packages/esbuild-plugin-import-path-remapper" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5177,13 +5297,13 @@ __metadata: languageName: unknown linkType: soft -"@rnx-kit/eslint-plugin@workspace:*, @rnx-kit/eslint-plugin@workspace:packages/eslint-plugin": +"@rnx-kit/eslint-plugin@npm:^0.9.6, @rnx-kit/eslint-plugin@workspace:*, @rnx-kit/eslint-plugin@workspace:packages/eslint-plugin": version: 0.0.0-use.local resolution: "@rnx-kit/eslint-plugin@workspace:packages/eslint-plugin" dependencies: "@eslint/js": "npm:^9.0.0" "@microsoft/eslint-plugin-sdl": "npm:^1.0.0" - "@react-native/eslint-plugin": "npm:^0.76.0" + "@react-native/eslint-plugin": "npm:^0.84.0" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/eslint": "npm:^9.0.0" @@ -5192,6 +5312,7 @@ __metadata: "@typescript-eslint/parser": "npm:^8.0.0" "@typescript-eslint/types": "npm:^8.0.0" enhanced-resolve: "npm:^5.8.3" + eslint: "npm:^9.0.0" eslint-plugin-react: "npm:^7.35.2" eslint-plugin-react-hooks: "npm:^5.2.0" typescript-eslint: "npm:^8.0.0" @@ -5205,6 +5326,7 @@ __metadata: resolution: "@rnx-kit/fork-sync@workspace:incubator/fork-sync" dependencies: "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5250,7 +5372,6 @@ __metadata: resolution: "@rnx-kit/lint-lockfile@workspace:incubator/lint-lockfile" dependencies: "@rnx-kit/config": "npm:^0.7.5" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-workspaces": "npm:^0.2.3" "@rnx-kit/tsconfig": "npm:*" @@ -5268,7 +5389,6 @@ __metadata: dependencies: "@babel/core": "npm:^7.20.0" "@babel/preset-env": "npm:^7.20.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.0" "@rnx-kit/tools-react-native": "npm:^2.3.1" @@ -5297,7 +5417,6 @@ __metadata: resolution: "@rnx-kit/metro-plugin-cyclic-dependencies-detector@workspace:packages/metro-plugin-cyclic-dependencies-detector" dependencies: "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/metro-serializer": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.4" @@ -5313,7 +5432,6 @@ __metadata: resolution: "@rnx-kit/metro-plugin-duplicates-checker@workspace:packages/metro-plugin-duplicates-checker" dependencies: "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/metro-serializer": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.4" @@ -5333,7 +5451,6 @@ __metadata: resolution: "@rnx-kit/metro-plugin-typescript@workspace:packages/metro-plugin-typescript" dependencies: "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.4" @@ -5353,7 +5470,6 @@ __metadata: resolution: "@rnx-kit/metro-resolver-symlinks@workspace:packages/metro-resolver-symlinks" dependencies: "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.3" @@ -5384,7 +5500,6 @@ __metadata: "@rnx-kit/babel-plugin-import-path-remapper": "npm:*" "@rnx-kit/babel-preset-metro-react-native": "npm:*" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/metro-config": "npm:*" "@rnx-kit/metro-serializer": "npm:*" "@rnx-kit/metro-service": "npm:*" @@ -5409,7 +5524,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/metro-serializer@workspace:packages/metro-serializer" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-react-native": "npm:^2.3.0" "@rnx-kit/tsconfig": "npm:*" @@ -5424,7 +5538,6 @@ __metadata: dependencies: "@react-native-community/cli-types": "npm:^20.0.0" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.3" "@rnx-kit/tools-react-native": "npm:^2.3.2" @@ -5451,6 +5564,26 @@ __metadata: languageName: unknown linkType: soft +"@rnx-kit/oxlint-config@npm:*, @rnx-kit/oxlint-config@workspace:packages/oxlint-config": + version: 0.0.0-use.local + resolution: "@rnx-kit/oxlint-config@workspace:packages/oxlint-config" + dependencies: + "@microsoft/eslint-plugin-sdl": "npm:^1.0.0" + "@react-native/eslint-plugin": "npm:^0.84.0" + "@rnx-kit/eslint-plugin": "npm:^0.9.6" + "@rnx-kit/scripts": "npm:*" + "@rnx-kit/tsconfig": "npm:*" + eslint: "npm:^9.0.0" + oxlint: "npm:^1.50.0" + peerDependencies: + eslint: ^9.0.0 + oxlint: ^1.50.0 + peerDependenciesMeta: + eslint: + optional: true + languageName: unknown + linkType: soft + "@rnx-kit/polyfills@workspace:*, @rnx-kit/polyfills@workspace:incubator/polyfills": version: 0.0.0-use.local resolution: "@rnx-kit/polyfills@workspace:incubator/polyfills" @@ -5459,7 +5592,6 @@ __metadata: "@babel/helper-plugin-utils": "npm:^7.0.0" "@babel/template": "npm:^7.0.0" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.3" "@rnx-kit/tsconfig": "npm:*" @@ -5486,7 +5618,6 @@ __metadata: "@react-native-community/cli-platform-android": "npm:^20.0.0" "@react-native-community/cli-platform-ios": "npm:^20.0.0" "@react-native/metro-config": "npm:^0.83.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" react: "npm:19.2.0" @@ -5512,7 +5643,6 @@ __metadata: resolution: "@rnx-kit/react-native-lazy-index@workspace:packages/react-native-lazy-index" dependencies: "@babel/core": "npm:^7.20.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5538,7 +5668,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/reporter@workspace:incubator/reporter" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" languageName: unknown @@ -5576,7 +5705,6 @@ __metadata: "@yarnpkg/cli": "npm:^4.6.0" clipanion: "npm:^4.0.0-rc.4" esbuild: "npm:^0.27.1" - eslint: "catalog:" jest: "npm:^29.2.1" markdown-table: "npm:^3.0.0" oxfmt: "catalog:" @@ -5593,7 +5721,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/template@workspace:packages/template" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" languageName: unknown @@ -5736,7 +5863,6 @@ __metadata: dependencies: "@react-native-community/cli-types": "npm:^20.0.0" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/metro-serializer": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.0" @@ -5755,7 +5881,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-android@workspace:packages/tools-android" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-shell": "npm:^0.2.2" "@rnx-kit/tsconfig": "npm:*" @@ -5767,7 +5892,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-apple@workspace:packages/tools-apple" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-shell": "npm:^0.2.2" "@rnx-kit/tsconfig": "npm:*" @@ -5780,7 +5904,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-filesystem@workspace:packages/tools-filesystem" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5797,7 +5920,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-language@workspace:packages/tools-language" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -5808,7 +5930,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-node@workspace:packages/tools-node" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@rnx-kit/types-node": "npm:^1.0.0" @@ -5820,7 +5941,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-packages@workspace:packages/tools-packages" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.4" "@rnx-kit/tools-workspaces": "npm:^0.2.1" @@ -5836,7 +5956,6 @@ __metadata: dependencies: "@react-native-community/cli": "npm:^20.0.0" "@react-native-community/cli-types": "npm:^20.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-filesystem": "npm:^0.2.0" "@rnx-kit/tools-node": "npm:^3.0.4" @@ -5856,7 +5975,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-shell@workspace:packages/tools-shell" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" @@ -5870,7 +5988,6 @@ __metadata: dependencies: "@rnx-kit/config": "npm:^0.7.5" "@rnx-kit/console": "npm:^2.0.0" - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.4" @@ -5890,7 +6007,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-windows@workspace:packages/tools-windows" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-shell": "npm:^0.2.0" "@rnx-kit/tsconfig": "npm:*" @@ -5903,7 +6019,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/tools-workspaces@workspace:packages/tools-workspaces" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/micromatch": "npm:^4.0.0" @@ -5926,7 +6041,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-bundle-config@workspace:packages/types-bundle-config" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@rnx-kit/types-metro-serializer-esbuild": "npm:^1.0.0" @@ -5946,7 +6061,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-kit-config@workspace:packages/types-kit-config" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@rnx-kit/types-bundle-config": "npm:^1.0.0" @@ -5957,7 +6072,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-metro-serializer-esbuild@workspace:packages/types-metro-serializer-esbuild" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" esbuild: "npm:^0.27.1" @@ -5968,7 +6083,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-node@workspace:packages/types-node" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@rnx-kit/types-kit-config": "npm:^1.0.0" @@ -5979,7 +6094,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-plugin-cyclic-dependencies@workspace:packages/types-plugin-cyclic-dependencies" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" languageName: unknown @@ -5989,7 +6104,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-plugin-duplicates-checker@workspace:packages/types-plugin-duplicates-checker" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" languageName: unknown @@ -5999,7 +6114,7 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/types-plugin-typescript@workspace:packages/types-plugin-typescript" dependencies: - "@rnx-kit/eslint-config": "npm:*" + "@rnx-kit/oxlint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" languageName: unknown @@ -6009,7 +6124,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/typescript-service@workspace:packages/typescript-service" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tools-node": "npm:^3.0.0" "@rnx-kit/tsconfig": "npm:*" @@ -6023,7 +6137,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/yarn-plugin-dynamic-extensions@workspace:incubator/yarn-plugin-dynamic-extensions" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@yarnpkg/core": "npm:^4.0.0" @@ -6035,7 +6148,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/yarn-plugin-external-workspaces@workspace:incubator/yarn-plugin-external-workspaces" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -6053,7 +6165,6 @@ __metadata: version: 0.0.0-use.local resolution: "@rnx-kit/yarn-plugin-install-to@workspace:incubator/yarn-plugin-install-to" dependencies: - "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^24.0.0" @@ -14478,6 +14589,79 @@ __metadata: languageName: node linkType: hard +"oxlint@npm:^1.50.0": + version: 1.50.0 + resolution: "oxlint@npm:1.50.0" + dependencies: + "@oxlint/binding-android-arm-eabi": "npm:1.50.0" + "@oxlint/binding-android-arm64": "npm:1.50.0" + "@oxlint/binding-darwin-arm64": "npm:1.50.0" + "@oxlint/binding-darwin-x64": "npm:1.50.0" + "@oxlint/binding-freebsd-x64": "npm:1.50.0" + "@oxlint/binding-linux-arm-gnueabihf": "npm:1.50.0" + "@oxlint/binding-linux-arm-musleabihf": "npm:1.50.0" + "@oxlint/binding-linux-arm64-gnu": "npm:1.50.0" + "@oxlint/binding-linux-arm64-musl": "npm:1.50.0" + "@oxlint/binding-linux-ppc64-gnu": "npm:1.50.0" + "@oxlint/binding-linux-riscv64-gnu": "npm:1.50.0" + "@oxlint/binding-linux-riscv64-musl": "npm:1.50.0" + "@oxlint/binding-linux-s390x-gnu": "npm:1.50.0" + "@oxlint/binding-linux-x64-gnu": "npm:1.50.0" + "@oxlint/binding-linux-x64-musl": "npm:1.50.0" + "@oxlint/binding-openharmony-arm64": "npm:1.50.0" + "@oxlint/binding-win32-arm64-msvc": "npm:1.50.0" + "@oxlint/binding-win32-ia32-msvc": "npm:1.50.0" + "@oxlint/binding-win32-x64-msvc": "npm:1.50.0" + peerDependencies: + oxlint-tsgolint: ">=0.14.1" + dependenciesMeta: + "@oxlint/binding-android-arm-eabi": + optional: true + "@oxlint/binding-android-arm64": + optional: true + "@oxlint/binding-darwin-arm64": + optional: true + "@oxlint/binding-darwin-x64": + optional: true + "@oxlint/binding-freebsd-x64": + optional: true + "@oxlint/binding-linux-arm-gnueabihf": + optional: true + "@oxlint/binding-linux-arm-musleabihf": + optional: true + "@oxlint/binding-linux-arm64-gnu": + optional: true + "@oxlint/binding-linux-arm64-musl": + optional: true + "@oxlint/binding-linux-ppc64-gnu": + optional: true + "@oxlint/binding-linux-riscv64-gnu": + optional: true + "@oxlint/binding-linux-riscv64-musl": + optional: true + "@oxlint/binding-linux-s390x-gnu": + optional: true + "@oxlint/binding-linux-x64-gnu": + optional: true + "@oxlint/binding-linux-x64-musl": + optional: true + "@oxlint/binding-openharmony-arm64": + optional: true + "@oxlint/binding-win32-arm64-msvc": + optional: true + "@oxlint/binding-win32-ia32-msvc": + optional: true + "@oxlint/binding-win32-x64-msvc": + optional: true + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + bin: + oxlint: bin/oxlint + checksum: 10c0/a898f02ac9b114f16f3f51f04de778f752db8c83afd5d2de02132ef80901794c64e208a87585ea2342f59cc39e4dcf6d2e25fb10e62b30c407b89fd7ef439b0b + languageName: node + linkType: hard + "p-cancelable@npm:^2.0.0": version: 2.1.1 resolution: "p-cancelable@npm:2.1.1" From 8ff0de1e8beefc77d5fb886ff676f69d7efc382d Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Tue, 3 Mar 2026 10:03:36 +0100 Subject: [PATCH 2/4] replace suppressions in fork-sync --- incubator/fork-sync/eslint.config.js | 13 ++++++++++++- incubator/fork-sync/oxlint.config.ts | 14 ++++++++++++++ incubator/fork-sync/test/proc.test.ts | 1 - incubator/fork-sync/test/tty-ui.test.ts | 1 - 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/incubator/fork-sync/eslint.config.js b/incubator/fork-sync/eslint.config.js index d5d2b041fa..43914a8fdc 100644 --- a/incubator/fork-sync/eslint.config.js +++ b/incubator/fork-sync/eslint.config.js @@ -1,6 +1,5 @@ import config from "@rnx-kit/eslint-config"; -// oxlint-disable-next-line no-default-export export default [ ...config, { @@ -9,4 +8,16 @@ export default [ "@typescript-eslint/consistent-type-definitions": "off", }, }, + { + files: ["eslint.config.js", "oxlint.config.ts"], + rules: { + "no-restricted-exports": "off", + }, + }, + { + files: ["test/proc.test.ts", "test/tty-ui.test.ts"], + rules: { + "no-control-regex": "off", + }, + }, ]; diff --git a/incubator/fork-sync/oxlint.config.ts b/incubator/fork-sync/oxlint.config.ts index 1e5851bdaf..eedff12c8c 100644 --- a/incubator/fork-sync/oxlint.config.ts +++ b/incubator/fork-sync/oxlint.config.ts @@ -8,4 +8,18 @@ export default defineConfig({ "typescript/consistent-type-definitions": "off", "no-new-array": "off", }, + overrides: [ + { + files: ["eslint.config.js", "oxlint.config.ts"], + rules: { + "import/no-default-export": "off", + }, + }, + { + files: ["test/proc.test.ts", "test/tty-ui.test.ts"], + rules: { + "no-control-regex": "off", + }, + }, + ], }); diff --git a/incubator/fork-sync/test/proc.test.ts b/incubator/fork-sync/test/proc.test.ts index 83160aca24..ebfb66ea38 100644 --- a/incubator/fork-sync/test/proc.test.ts +++ b/incubator/fork-sync/test/proc.test.ts @@ -12,7 +12,6 @@ import { /** Strip ANSI escape codes from string (colors, etc.) */ function stripAnsi(str: string): string { - // oxlint-disable-next-line no-control-regex return str.replace(/\x1B\[[0-9;]*m/g, ""); } diff --git a/incubator/fork-sync/test/tty-ui.test.ts b/incubator/fork-sync/test/tty-ui.test.ts index 7d03d63952..f69112d446 100644 --- a/incubator/fork-sync/test/tty-ui.test.ts +++ b/incubator/fork-sync/test/tty-ui.test.ts @@ -13,7 +13,6 @@ import type { ProgressLine, ProgressState } from "../src/modules/tty-ui.ts"; import * as ui from "../src/modules/tty-ui.ts"; // Helper to strip ANSI escape codes for test assertions -// oxlint-disable-next-line no-control-regex const stripAnsi = (s: string) => s.replace(/\x1b\[[0-9;]*m/g, ""); // ============================================================================= From 278a22d82f5a2b398e31206bbb314e5dfc74b721 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Tue, 3 Mar 2026 10:22:07 +0100 Subject: [PATCH 3/4] changes to oxlint-config should invalidate cache --- nx.json | 1 + packages/eslint-plugin/src/configs/eslint.js | 4 +- .../src/configs/typescript-recommended.ts | 39 +++++++------------ .../src/configs/typescript-stylistic.ts | 3 -- scripts/eslint.config.js | 4 -- 5 files changed, 17 insertions(+), 34 deletions(-) delete mode 100644 scripts/eslint.config.js diff --git a/nx.json b/nx.json index f54d7116bd..d0b826d963 100644 --- a/nx.json +++ b/nx.json @@ -8,6 +8,7 @@ "{workspaceRoot}/packages/eslint-config/*", "{workspaceRoot}/packages/eslint-plugin/*", "{workspaceRoot}/packages/jest-preset/*", + "{workspaceRoot}/packages/oxlint-config/*", "{workspaceRoot}/packages/tsconfig/*", "{workspaceRoot}/yarn.lock" ], diff --git a/packages/eslint-plugin/src/configs/eslint.js b/packages/eslint-plugin/src/configs/eslint.js index 3b9e7566b9..b3eecb3839 100644 --- a/packages/eslint-plugin/src/configs/eslint.js +++ b/packages/eslint-plugin/src/configs/eslint.js @@ -6,11 +6,11 @@ const path = require("node:path"); try { const eslint = path.dirname(require.resolve("eslint/package.json")); const eslintjs = require.resolve("@eslint/js", { paths: [eslint] }); - // oxlint-disable-next-line typescriptban-ts-comment + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore `tsgo` trips on this because it's not top level enough module.exports = require(eslintjs); } catch (_) { - // oxlint-disable-next-line typescriptban-ts-comment + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore `tsgo` trips on this because it's not top level enough module.exports = require("@eslint/js"); } diff --git a/packages/oxlint-config/src/configs/typescript-recommended.ts b/packages/oxlint-config/src/configs/typescript-recommended.ts index 8421a3ab88..44a26172f2 100644 --- a/packages/oxlint-config/src/configs/typescript-recommended.ts +++ b/packages/oxlint-config/src/configs/typescript-recommended.ts @@ -4,13 +4,24 @@ export default defineConfig({ categories: { correctness: "error", }, - // TODO: These rules should be declared under `overrides` and only apply - // to TypeScript files. However, it doesn't seem like they work properly with - // deeply nested configs at the moment. plugins: ["eslint", "typescript", "unicorn"], rules: { "no-array-constructor": "error", // eslint/pedantic + "no-class-assign": "off", // turned off by @typescript-eslint/recommended + "no-const-assign": "off", // turned off by @typescript-eslint/recommended + "no-dupe-class-members": "off", // turned off by @typescript-eslint/recommended + "no-dupe-keys": "off", // turned off by @typescript-eslint/recommended + "no-func-assign": "off", // turned off by @typescript-eslint/recommended + "no-import-assign": "off", // turned off by @typescript-eslint/recommended + "no-new-native-nonconstructor": "off", // turned off by @typescript-eslint/recommended + "no-obj-calls": "off", // turned off by @typescript-eslint/recommended + "no-redeclare": "off", // turned off by @typescript-eslint/recommended + "no-setter-return": "off", // turned off by @typescript-eslint/recommended + "no-this-before-super": "off", // turned off by @typescript-eslint/recommended + "no-unreachable": "off", // turned off by @typescript-eslint/recommended + "no-unsafe-negation": "off", // turned off by @typescript-eslint/recommended "no-var": "error", // eslint/restriction + "no-with": "off", // turned off by @typescript-eslint/recommended "prefer-const": [ "error", // eslint/style { destructuring: "any", ignoreReadBeforeAssign: false }, @@ -26,26 +37,4 @@ export default defineConfig({ "typescript/no-unsafe-function-type": "error", // typescript/pedantic "typescript/prefer-ts-expect-error": "error", // typescript/pedantic }, - overrides: [ - { - files: ["**/*.{cts,mts,ts,tsx}"], - plugins: ["typescript"], - rules: { - "no-class-assign": "off", // turned off by @typescript-eslint/recommended - "no-const-assign": "off", // turned off by @typescript-eslint/recommended - "no-dupe-class-members": "off", // turned off by @typescript-eslint/recommended - "no-dupe-keys": "off", // turned off by @typescript-eslint/recommended - "no-func-assign": "off", // turned off by @typescript-eslint/recommended - "no-import-assign": "off", // turned off by @typescript-eslint/recommended - "no-new-native-nonconstructor": "off", // turned off by @typescript-eslint/recommended - "no-obj-calls": "off", // turned off by @typescript-eslint/recommended - "no-redeclare": "off", // turned off by @typescript-eslint/recommended - "no-setter-return": "off", // turned off by @typescript-eslint/recommended - "no-this-before-super": "off", // turned off by @typescript-eslint/recommended - "no-unreachable": "off", // turned off by @typescript-eslint/recommended - "no-unsafe-negation": "off", // turned off by @typescript-eslint/recommended - "no-with": "off", // turned off by @typescript-eslint/recommended - }, - }, - ], }); diff --git a/packages/oxlint-config/src/configs/typescript-stylistic.ts b/packages/oxlint-config/src/configs/typescript-stylistic.ts index 4759d278e4..1895f8c686 100644 --- a/packages/oxlint-config/src/configs/typescript-stylistic.ts +++ b/packages/oxlint-config/src/configs/typescript-stylistic.ts @@ -4,9 +4,6 @@ export default defineConfig({ categories: { correctness: "error", }, - // TODO: These rules should be declared under `overrides` and only apply - // to TypeScript files. However, it doesn't seem like they work properly with - // deeply nested configs at the moment. plugins: ["typescript"], rules: { "typescript/adjacent-overload-signatures": "error", diff --git a/scripts/eslint.config.js b/scripts/eslint.config.js deleted file mode 100644 index 3e3a76380c..0000000000 --- a/scripts/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import config from "../packages/eslint-plugin/private/eslint.config.js"; - -// oxlint-disable-next-line no-default-export -export default config; From 9578a199a1f48e2d2f74a5468d51312c79eafa4d Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Tue, 3 Mar 2026 10:39:07 +0100 Subject: [PATCH 4/4] use export-default syntax --- packages/oxlint-config/README.md | 3 +-- packages/types-bundle-config/oxlint.config.ts | 3 +-- packages/types-kit-config/oxlint.config.ts | 3 +-- packages/types-metro-serializer-esbuild/oxlint.config.ts | 3 +-- packages/types-node/oxlint.config.ts | 3 +-- packages/types-plugin-cyclic-dependencies/oxlint.config.ts | 3 +-- packages/types-plugin-duplicates-checker/oxlint.config.ts | 3 +-- packages/types-plugin-typescript/oxlint.config.ts | 3 +-- 8 files changed, 8 insertions(+), 16 deletions(-) diff --git a/packages/oxlint-config/README.md b/packages/oxlint-config/README.md index 840e5f5bd5..59cc29e4c1 100644 --- a/packages/oxlint-config/README.md +++ b/packages/oxlint-config/README.md @@ -25,8 +25,7 @@ Several configurations are exported by this package. For instance, to use the configuration, you can re-export it in your config like so: ```ts -import config from "@rnx-kit/oxlint-config"; -export default config; +export { default } from "@rnx-kit/oxlint-config"; ``` Alternatively, if you want to add customizations: diff --git a/packages/types-bundle-config/oxlint.config.ts b/packages/types-bundle-config/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-bundle-config/oxlint.config.ts +++ b/packages/types-bundle-config/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only"; diff --git a/packages/types-kit-config/oxlint.config.ts b/packages/types-kit-config/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-kit-config/oxlint.config.ts +++ b/packages/types-kit-config/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only"; diff --git a/packages/types-metro-serializer-esbuild/oxlint.config.ts b/packages/types-metro-serializer-esbuild/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-metro-serializer-esbuild/oxlint.config.ts +++ b/packages/types-metro-serializer-esbuild/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only"; diff --git a/packages/types-node/oxlint.config.ts b/packages/types-node/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-node/oxlint.config.ts +++ b/packages/types-node/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only"; diff --git a/packages/types-plugin-cyclic-dependencies/oxlint.config.ts b/packages/types-plugin-cyclic-dependencies/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-plugin-cyclic-dependencies/oxlint.config.ts +++ b/packages/types-plugin-cyclic-dependencies/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only"; diff --git a/packages/types-plugin-duplicates-checker/oxlint.config.ts b/packages/types-plugin-duplicates-checker/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-plugin-duplicates-checker/oxlint.config.ts +++ b/packages/types-plugin-duplicates-checker/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only"; diff --git a/packages/types-plugin-typescript/oxlint.config.ts b/packages/types-plugin-typescript/oxlint.config.ts index c1c3da440a..5318fa1578 100644 --- a/packages/types-plugin-typescript/oxlint.config.ts +++ b/packages/types-plugin-typescript/oxlint.config.ts @@ -1,2 +1 @@ -import config from "@rnx-kit/oxlint-config/types-only"; -export default config; +export { default } from "@rnx-kit/oxlint-config/types-only";