src_lint

This lint prevents imports from src directories of unrelated file hierarchies.

Basically, the same as the built-in implementation_imports lint, but for src imports within the same package.

So, given this project structure:

📁 lib
├── 📄 app.dart
├── 📁 auth
│   ├── 📄 auth_page.dart
│   └── 📁 src
│       └── 📄 sign_in_section.dart
└── 📁 home
    ├── 📄 home_page.dart
    └── 📁 src
        ├── 📁 social_tab
        │   ├── 📄 social_tab.dart
        │   └── 📁 src
        │       └── 📄 posts_list.dart
        └── 📁 settings_tab
            ├── 📄 settings_tab.dart
            └── 📁 src
                └── 📄 privacy_section.dart

BAD:

// 📄 app.dart

import 'auth/src/sign_in_section.dart';
import 'package:app/auth/src/sign_in_section.dart';

import 'home/src/social_tab/social_tab.dart';
import 'package:app/home/src/social_tab/social_tab.dart';

import 'home/src/social_tab/src/posts_list.dart';
import 'package:app/home/src/social_tab/src/posts_list.dart';

import 'home/src/settings_tab/settings_tab.dart';
import 'package:app/home/src/settings_tab/settings_tab.dart';

import 'home/src/settings_tab/src/privacy_section.dart';
import 'package:app/home/src/settings_tab/src/privacy_section.dart';

BAD:

// 📄 social_tab.dart

import '../settings_tab/src/privacy_section.dart';
import 'package:app/home/src/settings_tab/src/privacy_section.dart';

import '../../../../auth/src/sign_in_section.dart';
import 'package:app/auth/src/sign_in_section.dart';

GOOD:

// 📄 app.dart

import 'auth/auth_page.dart';
import 'package:app/auth/auth_page.dart';

import 'home/home_page.dart';
import 'package:app/home/home_page.dart';

GOOD:

// 📄 home_page.dart

import 'src/social_tab/social_tab.dart';
import 'package:app/home/src/social_tab/social_tab.dart';

import 'src/settings_tab/settings_tab.dart';
import 'package:app/home/src/settings_tab/settings_tab.dart';

GOOD:

// 📄 social_tab.dart

import 'src/posts_list.dart';
import 'package:app/home/src/social_tab/src/posts_list.dart';

Installation

Requires Dart 3.10+ (analyzer plugins). Add src_lint to your pubspec.yaml:

dart pub add --dev src_lint

Enable the plugin in the top-level plugins section of analysis_options.yaml (not under analyzer:):

plugins:
  src_lint: ^1.0.0

For a path dependency while developing:

plugins:
  src_lint:
    path: ../src_lint

Suppressions use the package_name / rule_name form, for example:

// ignore: src_lint/no_unrelated_src_imports

Credits

This package is inspired by subpackage_lint and solves the same problem, but with less ceremony required.

Libraries

main