New
Introducing React Bench, see how different models perform on React code

react-doctor/rn-no-deep-imports

Import from the "react-native" package root, not the deprecated "react-native/Libraries/..." subpath: import { Alert } from "react-native"

  • Category: Bugs
  • Severity: warn
  • Source: oxlint-plugin-react-doctor
  • Framework: react-native
  • Enabled when: framework=react-native and capabilities=react-native
  • Tags: react-native
  • Default: Enabled

Validate the diagnostic

Confirm the reported code matches this rule before you edit it.

Fires on an ImportDeclaration, re-export ExportNamedDeclaration (one with a source), or ExportAllDeclaration whose module string starts with "react-native/Libraries/" AND whose final path segment is one of the curated PUBLIC_RN_ROOT_EXPORTS (View, Text, Image, ScrollView, FlatList, TextInput, Pressable, Button, StyleSheet, Alert, Animated, Platform, Dimensions, Keyboard, StatusBar, etc.) — or any path under "react-native/Libraries/NewAppScreen", which gets a tailored message. Default and named value imports both count; a mixed import like { View, type ViewProps } still fires because a value specifier is present. Suppress: it must NOT fire on a pure type-only import/re-export — "import type { ViewProps } from ..." OR the inline all-type form "import { type ColorSchemeName } from ..." / "export { type ViewProps } from ..." — since many RN internal types are not root-exported. Also suppress on Codegen/internal-only deep paths with no root equivalent whose leaf segment is NOT in the set (TurboModule/RCTExport, Image/resolveAssetSource, Utilities/PolyfillFunctions), on namespace-module sub-exports like { linear } from "react-native/Libraries/Animated/Easing" (root only exports the Easing object), on tooling subpaths outside Libraries/ ("react-native/jest-preset", "react-native/jest/setup"), on relative paths that merely contain the substring ("./react-native/Libraries/Alert/Alert"), and on jest.mock("react-native/Libraries/...") calls since those are not import statements.

How to fix

Follow the rule guidance while preserving unrelated behavior.

Copyable fix prompt

Copy this self-contained prompt into your coding agent after you confirm the diagnostic.

Rewrite the module string from the deprecated internal subpath to the package root: change import { Alert } from "react-native/Libraries/Alert/Alert" to import { Alert } from "react-native" (same for default imports like import View from ".../View/View" becoming import View from "react-native", and for re-exports: export { Text } from "react-native/Libraries/Text/Text" becoming export { Text } from "react-native"). For any "react-native/Libraries/NewAppScreen" path, repoint it to the extracted package instead: import { Colors } from "@react-native/new-app-screen". Do not touch type-only or internal-only deep imports the rule left alone.

More Bugs rules from the rules reference: