mirror of
https://github.com/acamarata/acamarata_lints.git
synced 2026-06-30 18:54:24 +00:00
initial release: shared Dart and Flutter lint rules for acamarata packages
This commit is contained in:
commit
e5f84e6d15
10 changed files with 374 additions and 0 deletions
65
.github/workflows/ci.yml
vendored
Normal file
65
.github/workflows/ci.yml
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Test (Dart ${{ matrix.dart-version }})
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
dart-version: [stable]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Dart ${{ matrix.dart-version }}
|
||||
uses: dart-lang/setup-dart@v1
|
||||
with:
|
||||
sdk: ${{ matrix.dart-version }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: dart pub get
|
||||
|
||||
- name: Analyze
|
||||
run: dart analyze
|
||||
|
||||
- name: Test
|
||||
run: dart test
|
||||
|
||||
format:
|
||||
name: Format
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Dart stable
|
||||
uses: dart-lang/setup-dart@v1
|
||||
with:
|
||||
sdk: stable
|
||||
|
||||
- name: Install dependencies
|
||||
run: dart pub get
|
||||
|
||||
- name: Check formatting
|
||||
run: dart format --set-exit-if-changed .
|
||||
|
||||
publish-check:
|
||||
name: Publish Check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Dart stable
|
||||
uses: dart-lang/setup-dart@v1
|
||||
with:
|
||||
sdk: stable
|
||||
|
||||
- name: Install dependencies
|
||||
run: dart pub get
|
||||
|
||||
- name: Dry-run publish
|
||||
run: dart pub publish --dry-run
|
||||
27
.gitignore
vendored
Normal file
27
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
# Dart build artifacts
|
||||
.dart_tool/
|
||||
build/
|
||||
.packages
|
||||
pubspec.lock
|
||||
doc/api/
|
||||
|
||||
# IDE files
|
||||
*.iml
|
||||
.idea/
|
||||
.vscode/*
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
|
||||
# AI agent directories (not source code)
|
||||
.claude/
|
||||
.env
|
||||
.env.*
|
||||
.codex/
|
||||
.cursor/
|
||||
.aider/
|
||||
.aider.chat.history.md
|
||||
.continue/
|
||||
.windsurf/
|
||||
.gemini/
|
||||
.codeium/
|
||||
32
CHANGELOG.md
Normal file
32
CHANGELOG.md
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
# Changelog
|
||||
|
||||
All notable changes to this project are documented here.
|
||||
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
||||
This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [1.0.0] - 2026-05-28
|
||||
|
||||
### Added
|
||||
|
||||
- Initial release: `analysis_options.yaml` extending `flutter_lints/flutter.yaml`
|
||||
- Strict acamarata rule overrides:
|
||||
- `prefer_single_quotes` — consistent string quoting
|
||||
- `always_declare_return_types` — explicit return types on all functions
|
||||
- `avoid_print` — no print() in library code
|
||||
- `require_trailing_commas` — cleaner diffs and merge conflict reduction
|
||||
- `prefer_const_constructors` + const variants — reduces Flutter rebuilds
|
||||
- `avoid_dynamic_calls` — no dynamic type invocations
|
||||
- `public_member_api_docs` — all public APIs documented
|
||||
- `use_super_parameters` — Dart 2.17+ initializer syntax
|
||||
- `avoid_positional_boolean_parameters` — boolean parameters must be named
|
||||
- `sort_constructors_first` — consistent class member ordering
|
||||
- `curly_braces_in_flow_control_structures` — always use braces
|
||||
- Analyzer strict mode: `strict-casts`, `strict-inference`, `strict-raw-types`
|
||||
- `example/analysis_options.yaml` showing the consumer include pattern
|
||||
- `lib/acamarata_lints.dart` placeholder (lint packages export nothing)
|
||||
- MIT license, README with install/usage/rule rationale table
|
||||
|
||||
[Unreleased]: https://github.com/acamarata/acamarata_lints/compare/v1.0.0...HEAD
|
||||
[1.0.0]: https://github.com/acamarata/acamarata_lints/releases/tag/v1.0.0
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2026 Aric Camarata
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
84
README.md
Normal file
84
README.md
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
# acamarata_lints
|
||||
|
||||
Shared Dart and Flutter lint rules for [acamarata](https://github.com/acamarata) packages.
|
||||
|
||||
Extends [`flutter_lints`](https://pub.dev/packages/flutter_lints) with additional strict rules used across all acamarata Dart and Flutter packages. One include, consistent style everywhere.
|
||||
|
||||
## Install
|
||||
|
||||
Add to your `pubspec.yaml`:
|
||||
|
||||
```yaml
|
||||
dev_dependencies:
|
||||
acamarata_lints: ^1.0.0
|
||||
```
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
dart pub get
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
In your `analysis_options.yaml`:
|
||||
|
||||
```yaml
|
||||
include: package:acamarata_lints/analysis_options.yaml
|
||||
```
|
||||
|
||||
That is the entire setup. The package resolves the flutter_lints transitive include automatically.
|
||||
|
||||
To add project-specific overrides beneath the include:
|
||||
|
||||
```yaml
|
||||
include: package:acamarata_lints/analysis_options.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
- "**/*.g.dart"
|
||||
- "**/*.freezed.dart"
|
||||
|
||||
linter:
|
||||
rules:
|
||||
public_member_api_docs: false # disable for app code if preferred
|
||||
```
|
||||
|
||||
See `example/analysis_options.yaml` for a full annotated example.
|
||||
|
||||
## Rule Rationale
|
||||
|
||||
| Rule | Rationale |
|
||||
|---|---|
|
||||
| `prefer_single_quotes` | Consistent string quoting across all files. Matches JS convention. |
|
||||
| `always_declare_return_types` | Inference alone does not communicate intent on public APIs. |
|
||||
| `avoid_print` | `print()` leaks into production logs. Use a real logger. |
|
||||
| `require_trailing_commas` | Trailing commas produce cleaner diffs and reduce merge conflicts. |
|
||||
| `prefer_const_constructors` | Const constructors reduce Flutter widget rebuilds. |
|
||||
| `avoid_dynamic_calls` | Dynamic calls bypass the type system and cause runtime errors. |
|
||||
| `public_member_api_docs` | All public APIs must be documented — these are library packages. |
|
||||
| `use_super_parameters` | Dart 2.17+ super-initializer syntax reduces boilerplate. |
|
||||
| `avoid_positional_boolean_parameters` | Boolean positional parameters are unreadable at call sites. |
|
||||
| `sort_constructors_first` | Consistent class structure across all files. |
|
||||
| `curly_braces_in_flow_control_structures` | Braces prevent off-by-one bugs when adding statements to control flow. |
|
||||
|
||||
## Strict analyzer modes
|
||||
|
||||
This package enables three strict analyzer modes:
|
||||
|
||||
- `strict-casts` — no implicit casts between types
|
||||
- `strict-inference` — type inference failures are reported
|
||||
- `strict-raw-types` — raw generic types (List without a type argument) are flagged
|
||||
|
||||
## Requirements
|
||||
|
||||
- Dart SDK: `>=3.0.0 <4.0.0`
|
||||
- Depends on: [`flutter_lints`](https://pub.dev/packages/flutter_lints) `>=3.0.0 <6.0.0`
|
||||
|
||||
## Changelog
|
||||
|
||||
See [CHANGELOG.md](CHANGELOG.md).
|
||||
|
||||
## License
|
||||
|
||||
MIT. See [LICENSE](LICENSE).
|
||||
78
analysis_options.yaml
Normal file
78
analysis_options.yaml
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
include: package:flutter_lints/flutter.yaml
|
||||
|
||||
analyzer:
|
||||
exclude:
|
||||
# The example directory includes package:acamarata_lints/analysis_options.yaml
|
||||
# which cannot be resolved from within the package itself. Consumers will
|
||||
# resolve it from their own pub cache after installing the package.
|
||||
- "example/**"
|
||||
language:
|
||||
strict-casts: true
|
||||
strict-inference: true
|
||||
strict-raw-types: true
|
||||
errors:
|
||||
# Treat these as errors, not warnings
|
||||
missing_return: error
|
||||
dead_code: warning
|
||||
unused_import: warning
|
||||
|
||||
linter:
|
||||
rules:
|
||||
# Prefer single quotes for strings — keeps code consistent and matches JS conventions.
|
||||
prefer_single_quotes: true
|
||||
|
||||
# Every function must declare its return type explicitly.
|
||||
# Inference alone is not sufficient for public APIs.
|
||||
always_declare_return_types: true
|
||||
|
||||
# Avoid print() in library code. Use a proper logging mechanism instead.
|
||||
avoid_print: true
|
||||
|
||||
# Always use trailing commas in argument lists, parameter lists, etc.
|
||||
# This makes diffs cleaner and reduces merge conflicts.
|
||||
require_trailing_commas: true
|
||||
|
||||
# Prefer const constructors wherever possible — reduces rebuilds in Flutter.
|
||||
prefer_const_constructors: true
|
||||
prefer_const_constructors_in_immutables: true
|
||||
prefer_const_declarations: true
|
||||
prefer_const_literals_to_create_immutables: true
|
||||
|
||||
# Avoid unnecessary type annotations where they can be inferred,
|
||||
# but keep them where they communicate intent on public APIs.
|
||||
avoid_redundant_argument_values: true
|
||||
|
||||
# Prefer using is! for type checks rather than negated is.
|
||||
prefer_is_not_operator: true
|
||||
|
||||
# Avoid empty catch blocks — either handle the error or rethrow.
|
||||
avoid_empty_else: true
|
||||
empty_catches: true
|
||||
|
||||
# Prefer final for variables that are never reassigned.
|
||||
prefer_final_fields: true
|
||||
prefer_final_locals: true
|
||||
|
||||
# Avoid dynamic types — use proper types or generics.
|
||||
avoid_dynamic_calls: true
|
||||
|
||||
# Sort constructors before other members.
|
||||
sort_constructors_first: true
|
||||
|
||||
# Use named parameters for booleans — improves call-site readability.
|
||||
avoid_positional_boolean_parameters: true
|
||||
|
||||
# Document all public APIs.
|
||||
public_member_api_docs: true
|
||||
|
||||
# Use super-initializer parameters where possible (Dart 2.17+).
|
||||
use_super_parameters: true
|
||||
|
||||
# Always use curly braces for control flow, even for single statements.
|
||||
curly_braces_in_flow_control_structures: true
|
||||
|
||||
# Avoid returning null for void-typed return types.
|
||||
avoid_returning_null_for_void: true
|
||||
|
||||
# Use raw string literals only when they add clarity.
|
||||
use_raw_strings: false
|
||||
20
example/analysis_options.yaml
Normal file
20
example/analysis_options.yaml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
# Example: how consumers use acamarata_lints.
|
||||
#
|
||||
# In your pubspec.yaml, add:
|
||||
#
|
||||
# dev_dependencies:
|
||||
# acamarata_lints: ^1.0.0
|
||||
#
|
||||
# Then create or update your analysis_options.yaml with this single include:
|
||||
|
||||
include: package:acamarata_lints/analysis_options.yaml
|
||||
|
||||
# You can add project-specific overrides below:
|
||||
# analyzer:
|
||||
# exclude:
|
||||
# - "**/*.g.dart" # Generated files
|
||||
# - "**/*.freezed.dart"
|
||||
#
|
||||
# linter:
|
||||
# rules:
|
||||
# public_member_api_docs: false # Optional: disable for app code
|
||||
12
lib/acamarata_lints.dart
Normal file
12
lib/acamarata_lints.dart
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
/// Shared Dart and Flutter lint rules for acamarata packages.
|
||||
///
|
||||
/// This library exports nothing. Lint rules are applied by including
|
||||
/// the analysis_options.yaml file in your project:
|
||||
///
|
||||
/// ```yaml
|
||||
/// # In your analysis_options.yaml:
|
||||
/// include: package:acamarata_lints/analysis_options.yaml
|
||||
/// ```
|
||||
///
|
||||
/// See the package README for the full rule list and rationale.
|
||||
library;
|
||||
24
pubspec.yaml
Normal file
24
pubspec.yaml
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
name: acamarata_lints
|
||||
description: >
|
||||
Shared Dart and Flutter lint rules for acamarata packages.
|
||||
Extends flutter_lints with strict acamarata-specific overrides
|
||||
for consistent code style across all packages.
|
||||
version: 1.0.0
|
||||
homepage: https://github.com/acamarata/acamarata_lints
|
||||
repository: https://github.com/acamarata/acamarata_lints
|
||||
|
||||
topics:
|
||||
- lints
|
||||
- analysis
|
||||
- flutter
|
||||
- dart
|
||||
- style
|
||||
|
||||
environment:
|
||||
sdk: ">=3.0.0 <4.0.0"
|
||||
|
||||
dependencies:
|
||||
flutter_lints: ">=3.0.0 <6.0.0"
|
||||
|
||||
dev_dependencies:
|
||||
test: ^1.25.0
|
||||
11
test/acamarata_lints_test.dart
Normal file
11
test/acamarata_lints_test.dart
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
// ignore_for_file: avoid_print
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('acamarata_lints package is importable', () {
|
||||
// This package exports no Dart symbols.
|
||||
// Lint rules are applied via analysis_options.yaml.
|
||||
// This test exists to satisfy `dart test` in CI.
|
||||
expect(true, isTrue);
|
||||
});
|
||||
}
|
||||
Loading…
Reference in a new issue