diff --git a/.eslintrc.js b/.eslintrc.js index 829535a3520..8d4f88b4931 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -10,16 +10,12 @@ 'use strict'; -const path = require('node:path'); - -require('eslint-plugin-lint').load(path.join(__dirname, 'tools/eslint/rules')); - module.exports = { root: true, extends: ['@react-native'], - plugins: ['@react-native/eslint-plugin-specs', 'lint'], + plugins: ['@react-native/monorepo', '@react-native/specs'], overrides: [ // overriding the JS config from @react-native/eslint-config to ensure @@ -28,6 +24,7 @@ module.exports = { files: ['*.js', '*.js.flow', '*.jsx'], parser: 'hermes-eslint', rules: { + '@react-native/monorepo/sort-imports': 1, 'eslint-comments/no-unlimited-disable': 0, 'ft-flow/require-valid-file-annotation': [2, 'always'], 'no-extra-boolean-cast': 0, @@ -35,7 +32,6 @@ module.exports = { // These rules are not required with hermes-eslint 'ft-flow/define-flow-type': 0, 'ft-flow/use-flow-type': 0, - 'lint/sort-imports': 1, // Flow handles these checks for us, so they aren't required 'no-undef': 0, 'no-unreachable': 0, @@ -55,7 +51,7 @@ module.exports = { ], parser: 'hermes-eslint', rules: { - 'lint/no-commonjs-exports': 1, + '@react-native/monorepo/no-commonjs-exports': 1, }, }, { @@ -65,14 +61,14 @@ module.exports = { { files: ['package.json'], rules: { - 'lint/react-native-manifest': 2, + '@react-native/monorepo/react-native-manifest': 2, }, }, { files: ['flow-typed/**/*.js', 'packages/react-native/flow/**/*'], rules: { + '@react-native/monorepo/valid-flow-typed-signature': 2, 'ft-flow/require-valid-file-annotation': 0, - 'lint/valid-flow-typed-signature': 2, 'no-shadow': 0, 'no-unused-vars': 0, quotes: 0, @@ -84,14 +80,14 @@ module.exports = { 'packages/react-native/src/**/*.js', ], rules: { + '@react-native/monorepo/no-haste-imports': 2, + '@react-native/monorepo/no-react-default-imports': 2, + '@react-native/monorepo/no-react-named-type-imports': 2, + '@react-native/monorepo/no-react-native-imports': 2, + '@react-native/monorepo/no-react-node-imports': 2, + '@react-native/monorepo/require-extends-error': 2, '@react-native/platform-colors': 2, '@react-native/specs/react-native-modules': 2, - 'lint/no-haste-imports': 2, - 'lint/no-react-native-imports': 2, - 'lint/require-extends-error': 2, - 'lint/no-react-node-imports': 2, - 'lint/no-react-default-imports': 2, - 'lint/no-react-named-type-imports': 2, }, }, { @@ -145,7 +141,7 @@ module.exports = { { files: ['**/__tests__/**'], rules: { - 'lint/no-react-native-imports': 'off', + '@react-native/monorepo/no-react-native-imports': 'off', }, }, ], diff --git a/jest/preprocessor.js b/jest/preprocessor.js index e1084b1972a..7436bac2d09 100644 --- a/jest/preprocessor.js +++ b/jest/preprocessor.js @@ -12,7 +12,7 @@ 'use strict'; -// eslint-disable-next-line lint/sort-imports +// eslint-disable-next-line @react-native/monorepo/sort-imports const { transformFromAstSync: babelTransformFromAstSync, transformSync: babelTransformSync, diff --git a/package.json b/package.json index 3e34e5985dd..da64b27fd67 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "workspaces": [ "packages/*", + "private/*", "tools/*", "!packages/helloworld" ], @@ -73,7 +74,6 @@ "eslint-plugin-ft-flow": "^2.0.1", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-jsx-a11y": "^6.6.0", - "eslint-plugin-lint": "^1.0.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-native": "^4.0.0", diff --git a/packages/assets/registry.js b/packages/assets/registry.js index f4f1a722eb5..435bd519411 100644 --- a/packages/assets/registry.js +++ b/packages/assets/registry.js @@ -40,5 +40,5 @@ function getAssetByID(assetId /*: number */) /*: PackagerAsset */ { return assets[assetId - 1]; } -// eslint-disable-next-line lint/no-commonjs-exports +// eslint-disable-next-line @react-native/monorepo/no-commonjs-exports module.exports = {registerAsset, getAssetByID}; diff --git a/packages/helloworld/cli.js b/packages/helloworld/cli.js index 130210dd9a8..3dfd0fbc853 100644 --- a/packages/helloworld/cli.js +++ b/packages/helloworld/cli.js @@ -12,7 +12,7 @@ import {Command} from 'commander'; */ -// eslint-disable-next-line lint/sort-imports +// eslint-disable-next-line @react-native/monorepo/sort-imports const {patchCoreCLIUtilsPackageJSON} = require('./scripts/monorepo'); function injectCoreCLIUtilsRuntimePatch() { diff --git a/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestConfig.js b/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestConfig.js index 7ec2c962ecd..92b6b07beb2 100644 --- a/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestConfig.js +++ b/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestConfig.js @@ -8,8 +8,6 @@ * @format */ -// These don't actually exist anywhere in the code. - 'use strict'; import type {ModuleConfig} from '../NativeModules'; @@ -35,5 +33,5 @@ const MessageQueueTestConfig = { remoteModuleConfig: remoteModulesConfig, }; -// eslint-disable-next-line lint/no-commonjs-exports +// eslint-disable-next-line @react-native/monorepo/no-commonjs-exports module.exports = MessageQueueTestConfig; diff --git a/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js b/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js index f015faeac65..fa691273e51 100644 --- a/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js +++ b/packages/react-native/Libraries/BatchedBridge/__mocks__/MessageQueueTestModule.js @@ -20,5 +20,5 @@ const MessageQueueTestModule = { testHook2: function () {}, }; -// eslint-disable-next-line lint/no-commonjs-exports +// eslint-disable-next-line @react-native/monorepo/no-commonjs-exports module.exports = MessageQueueTestModule; diff --git a/packages/react-native/Libraries/Image/RelativeImageStub.js b/packages/react-native/Libraries/Image/RelativeImageStub.js index b31526af542..ba1f050a0f8 100644 --- a/packages/react-native/Libraries/Image/RelativeImageStub.js +++ b/packages/react-native/Libraries/Image/RelativeImageStub.js @@ -27,5 +27,5 @@ const RelativeImageStub = (AssetRegistry.registerAsset({ type: 'png', }): number); -// eslint-disable-next-line lint/no-commonjs-exports +// eslint-disable-next-line @react-native/monorepo/no-commonjs-exports module.exports = RelativeImageStub; diff --git a/packages/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js b/packages/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js index adaa496047d..3caf81f8c06 100644 --- a/packages/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js +++ b/packages/react-native/Libraries/ReactPrivate/ReactNativePrivateInterface.js @@ -51,7 +51,7 @@ export type {PublicRootInstance} from '../ReactNative/ReactFabricPublicInstance/ export type PublicTextInstance = ReturnType; // flowlint unsafe-getters-setters:off -// eslint-disable-next-line lint/no-commonjs-exports +// eslint-disable-next-line @react-native/monorepo/no-commonjs-exports module.exports = { get BatchedBridge(): BatchedBridge { return require('../BatchedBridge/BatchedBridge').default; diff --git a/packages/react-native/src/private/webapis/errors/DOMException.js b/packages/react-native/src/private/webapis/errors/DOMException.js index 3dbb0469f12..b759632d0a9 100644 --- a/packages/react-native/src/private/webapis/errors/DOMException.js +++ b/packages/react-native/src/private/webapis/errors/DOMException.js @@ -70,7 +70,7 @@ const ERROR_CODES: {[string]: number} = { DATA_CLONE_ERR: 25, }; -/* eslint-disable lint/require-extends-error */ +/* eslint-disable @react-native/monorepo/require-extends-error */ // $FlowExpectedError[incompatible-variance] name is writable in Error but not in DOMException, but this is how it works on Web. export default class DOMException extends Error { static +INDEX_SIZE_ERR: 1; diff --git a/packages/react-native/src/private/webapis/performance/__tests__/Performance-test.js b/packages/react-native/src/private/webapis/performance/__tests__/Performance-test.js index 606e6ee2615..292ee6674ce 100644 --- a/packages/react-native/src/private/webapis/performance/__tests__/Performance-test.js +++ b/packages/react-native/src/private/webapis/performance/__tests__/Performance-test.js @@ -8,8 +8,9 @@ * @format */ -// eslint-disable-next-line lint/sort-imports +// eslint-disable-next-line @react-native/monorepo/sort-imports import type Performance from '../Performance'; + import {performanceEntryTypeToRaw} from '../internals/RawPerformanceEntry'; import {reportEntry} from '../specs/__mocks__/NativePerformanceMock'; diff --git a/packages/rn-tester/cli.js b/packages/rn-tester/cli.js index 130210dd9a8..3dfd0fbc853 100644 --- a/packages/rn-tester/cli.js +++ b/packages/rn-tester/cli.js @@ -12,7 +12,7 @@ import {Command} from 'commander'; */ -// eslint-disable-next-line lint/sort-imports +// eslint-disable-next-line @react-native/monorepo/sort-imports const {patchCoreCLIUtilsPackageJSON} = require('./scripts/monorepo'); function injectCoreCLIUtilsRuntimePatch() { diff --git a/private/eslint-plugin-monorepo/README.md b/private/eslint-plugin-monorepo/README.md new file mode 100644 index 00000000000..8b6f2ed7f32 --- /dev/null +++ b/private/eslint-plugin-monorepo/README.md @@ -0,0 +1,7 @@ +# @react-native/eslint-plugin-monorepo + +This is a private package that contains ESLint rules for `react-native` itself. +They are configured in the `.eslintrc.js` at the repository root. + +For ESLint rules intended for projects that consume React Native, add them to +the `@react-native-community/eslint-plugin` package instead. diff --git a/tools/eslint/__tests__/eslintrc-test.js b/private/eslint-plugin-monorepo/__tests__/eslintrc-test.js similarity index 89% rename from tools/eslint/__tests__/eslintrc-test.js rename to private/eslint-plugin-monorepo/__tests__/eslintrc-test.js index 8037b65e5e1..9cf50d6dd57 100644 --- a/tools/eslint/__tests__/eslintrc-test.js +++ b/private/eslint-plugin-monorepo/__tests__/eslintrc-test.js @@ -15,7 +15,7 @@ import path from 'path'; const REPO_DIR = path.resolve(__dirname, '..', '..', '..'); describe('react-native/.eslintrc.js', () => { - describe('lint/sort-imports', () => { + describe('@react-native/monorepo/sort-imports', () => { const testDirectories = [ '.', 'packages/react-native', @@ -35,7 +35,7 @@ describe('react-native/.eslintrc.js', () => { expect(config).toHaveProperty( 'rules', expect.objectContaining({ - 'lint/sort-imports': expect.arrayContaining([1]), + '@react-native/monorepo/sort-imports': expect.arrayContaining([1]), }), ); }); diff --git a/private/eslint-plugin-monorepo/index.js b/private/eslint-plugin-monorepo/index.js new file mode 100644 index 00000000000..6b34791bc03 --- /dev/null +++ b/private/eslint-plugin-monorepo/index.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + * @format + */ + +exports.rules = { + 'no-commonjs-exports': require('./rules/no-commonjs-exports'), + 'no-haste-imports': require('./rules/no-haste-imports'), + 'no-react-default-imports': require('./rules/no-react-default-imports'), + 'no-react-named-type-imports': require('./rules/no-react-named-type-imports'), + 'no-react-native-imports': require('./rules/no-react-native-imports'), + 'no-react-node-imports': require('./rules/no-react-node-imports'), + 'react-native-manifest': require('./rules/react-native-manifest'), + 'require-extends-error': require('./rules/require-extends-error'), + 'sort-imports': require('./rules/sort-imports'), + 'valid-flow-typed-signature': require('./rules/valid-flow-typed-signature'), +}; diff --git a/tools/eslint/package.json b/private/eslint-plugin-monorepo/package.json similarity index 59% rename from tools/eslint/package.json rename to private/eslint-plugin-monorepo/package.json index 8a45d1133bb..ed92f37d19c 100644 --- a/tools/eslint/package.json +++ b/private/eslint-plugin-monorepo/package.json @@ -1,7 +1,8 @@ { - "name": "@react-native/eslint", + "name": "@react-native/eslint-plugin-monorepo", "private": true, "version": "0.0.0", + "main": "index.js", "dependencies": { "jsonc-eslint-parser": "^2.3.0" } diff --git a/tools/eslint/rules/__tests__/no-commonjs-exports-test.js b/private/eslint-plugin-monorepo/rules/__tests__/no-commonjs-exports-test.js similarity index 100% rename from tools/eslint/rules/__tests__/no-commonjs-exports-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/no-commonjs-exports-test.js diff --git a/tools/eslint/rules/__tests__/no-haste-imports-test.js b/private/eslint-plugin-monorepo/rules/__tests__/no-haste-imports-test.js similarity index 100% rename from tools/eslint/rules/__tests__/no-haste-imports-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/no-haste-imports-test.js diff --git a/tools/eslint/rules/__tests__/no-react-default-imports.js b/private/eslint-plugin-monorepo/rules/__tests__/no-react-default-imports.js similarity index 100% rename from tools/eslint/rules/__tests__/no-react-default-imports.js rename to private/eslint-plugin-monorepo/rules/__tests__/no-react-default-imports.js diff --git a/tools/eslint/rules/__tests__/no-react-named-type-imports.js b/private/eslint-plugin-monorepo/rules/__tests__/no-react-named-type-imports.js similarity index 100% rename from tools/eslint/rules/__tests__/no-react-named-type-imports.js rename to private/eslint-plugin-monorepo/rules/__tests__/no-react-named-type-imports.js diff --git a/tools/eslint/rules/__tests__/no-react-native-imports-test.js b/private/eslint-plugin-monorepo/rules/__tests__/no-react-native-imports-test.js similarity index 100% rename from tools/eslint/rules/__tests__/no-react-native-imports-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/no-react-native-imports-test.js diff --git a/tools/eslint/rules/__tests__/no-react-node-imports-test.js b/private/eslint-plugin-monorepo/rules/__tests__/no-react-node-imports-test.js similarity index 100% rename from tools/eslint/rules/__tests__/no-react-node-imports-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/no-react-node-imports-test.js diff --git a/tools/eslint/rules/__tests__/react-native-manifest-test.js b/private/eslint-plugin-monorepo/rules/__tests__/react-native-manifest-test.js similarity index 100% rename from tools/eslint/rules/__tests__/react-native-manifest-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/react-native-manifest-test.js diff --git a/tools/eslint/rules/__tests__/require-extends-error-test.js b/private/eslint-plugin-monorepo/rules/__tests__/require-extends-error-test.js similarity index 100% rename from tools/eslint/rules/__tests__/require-extends-error-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/require-extends-error-test.js diff --git a/tools/eslint/rules/__tests__/valid-flow-typed-signature-test.js b/private/eslint-plugin-monorepo/rules/__tests__/valid-flow-typed-signature-test.js similarity index 100% rename from tools/eslint/rules/__tests__/valid-flow-typed-signature-test.js rename to private/eslint-plugin-monorepo/rules/__tests__/valid-flow-typed-signature-test.js diff --git a/tools/eslint/rules/no-commonjs-exports.js b/private/eslint-plugin-monorepo/rules/no-commonjs-exports.js similarity index 100% rename from tools/eslint/rules/no-commonjs-exports.js rename to private/eslint-plugin-monorepo/rules/no-commonjs-exports.js diff --git a/tools/eslint/rules/no-haste-imports.js b/private/eslint-plugin-monorepo/rules/no-haste-imports.js similarity index 100% rename from tools/eslint/rules/no-haste-imports.js rename to private/eslint-plugin-monorepo/rules/no-haste-imports.js diff --git a/tools/eslint/rules/no-react-default-imports.js b/private/eslint-plugin-monorepo/rules/no-react-default-imports.js similarity index 100% rename from tools/eslint/rules/no-react-default-imports.js rename to private/eslint-plugin-monorepo/rules/no-react-default-imports.js diff --git a/tools/eslint/rules/no-react-named-type-imports.js b/private/eslint-plugin-monorepo/rules/no-react-named-type-imports.js similarity index 100% rename from tools/eslint/rules/no-react-named-type-imports.js rename to private/eslint-plugin-monorepo/rules/no-react-named-type-imports.js diff --git a/tools/eslint/rules/no-react-native-imports.js b/private/eslint-plugin-monorepo/rules/no-react-native-imports.js similarity index 100% rename from tools/eslint/rules/no-react-native-imports.js rename to private/eslint-plugin-monorepo/rules/no-react-native-imports.js diff --git a/tools/eslint/rules/no-react-node-imports.js b/private/eslint-plugin-monorepo/rules/no-react-node-imports.js similarity index 100% rename from tools/eslint/rules/no-react-node-imports.js rename to private/eslint-plugin-monorepo/rules/no-react-node-imports.js diff --git a/tools/eslint/rules/react-native-manifest.js b/private/eslint-plugin-monorepo/rules/react-native-manifest.js similarity index 100% rename from tools/eslint/rules/react-native-manifest.js rename to private/eslint-plugin-monorepo/rules/react-native-manifest.js diff --git a/tools/eslint/rules/require-extends-error.js b/private/eslint-plugin-monorepo/rules/require-extends-error.js similarity index 100% rename from tools/eslint/rules/require-extends-error.js rename to private/eslint-plugin-monorepo/rules/require-extends-error.js diff --git a/tools/eslint/rules/sort-imports.js b/private/eslint-plugin-monorepo/rules/sort-imports.js similarity index 100% rename from tools/eslint/rules/sort-imports.js rename to private/eslint-plugin-monorepo/rules/sort-imports.js diff --git a/tools/eslint/rules/valid-flow-typed-signature.js b/private/eslint-plugin-monorepo/rules/valid-flow-typed-signature.js similarity index 100% rename from tools/eslint/rules/valid-flow-typed-signature.js rename to private/eslint-plugin-monorepo/rules/valid-flow-typed-signature.js diff --git a/tools/eslint/README.md b/tools/eslint/README.md deleted file mode 100644 index 116e749329d..00000000000 --- a/tools/eslint/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# react-native/tools/eslint - -This directory contains ESLint rules for the `react-native` repository itself. -They are configured in `.eslintrc.js` using the `eslint-plugin-lint` package. - -For ESLint rules intended for projects that consume React Native, add them to -the `@react-native-community/eslint-plugin` package instead. diff --git a/yarn.lock b/yarn.lock index 23b8950d557..092522edcff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4027,11 +4027,6 @@ eslint-plugin-jsx-a11y@^6.6.0: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.0" -eslint-plugin-lint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-lint/-/eslint-plugin-lint-1.0.0.tgz#bfc98ad0d1b5ea437b0072ec735c459df4d084b5" - integrity sha512-hYl6F/lYLjycZmHYnpTk3dlliNxjy9breG/9URhdQmPZibmENjM378EPKvSdIDBOV+Zw/Z0d3EaJhLTjcWTovA== - eslint-plugin-react-hooks@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz#1be0080901e6ac31ce7971beed3d3ec0a423d9e3"