# This file configures the analyzer, which statically analyzes Dart code to # check for errors, warnings, and lints. # # The issues identified by the analyzer are surfaced in the UI of Dart-enabled # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be # invoked from the command line by running `flutter analyze`. # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` # included above or to enable additional rules. A list of all available lints # and their documentation is published at # https://dart-lang.github.io/linter/lints/index.html. # # Instead of disabling a lint rule for the entire project in the # section below, it can also be suppressed for a single line of code # or a specific dart file by using the `// ignore: name_of_lint` and # `// ignore_for_file: name_of_lint` syntax on the line or in the file # producing the lint. rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule use_build_context_synchronously: false require_trailing_commas: true unrelated_type_equality_checks: true prefer_const_constructors: true # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options analyzer: exclude: - openapi/** - lib/generated_plugin_registrant.dart plugins: - custom_lint custom_lint: debug: true rules: - avoid_build_context_in_providers: false - avoid_public_notifier_properties: false - avoid_manual_providers_as_generated_provider_dependency: false - unsupported_provider_value: false - import_rule_photo_manager: message: photo_manager must only be used in MediaRepositories restrict: package:photo_manager allowed: # required / wanted - 'lib/repositories/{album,asset,file}_media.repository.dart' # acceptable exceptions for the time being - lib/entities/asset.entity.dart # to provide local AssetEntity for now - lib/providers/image/immich_local_{image,thumbnail}_provider.dart # accesses thumbnails via PhotoManager # refactor to make the providers and services testable - lib/providers/backup/{backup,manual_upload}.provider.dart # uses only PMProgressHandler - lib/services/{background,backup}.service.dart # uses only PMProgressHandler - import_rule_isar: message: isar must only be used in entities and repositories restrict: package:isar allowed: # required / wanted - lib/entities/*.entity.dart - lib/repositories/{album,asset,backup,database,etag,exif_info,user,timeline,partner}.repository.dart - lib/infrastructure/entities/*.entity.dart - lib/infrastructure/repositories/{store,db,log}.repository.dart - lib/providers/infrastructure/db.provider.dart # acceptable exceptions for the time being (until Isar is fully replaced) - integration_test/test_utils/general_helper.dart - lib/main.dart - lib/pages/album/album_asset_selection.page.dart - lib/routing/router.dart - lib/services/immich_logger.service.dart # not really a service... more a util - lib/utils/{db,migration}.dart - lib/utils/bootstrap.dart - lib/widgets/asset_grid/asset_grid_data_structure.dart - test/**.dart # refactor the remaining providers - lib/providers/db.provider.dart - import_rule_openapi: message: openapi must only be used through ApiRepositories restrict: package:openapi allowed: # required / wanted - lib/repositories/*_api.repository.dart # acceptable exceptions for the time being - lib/entities/{album,asset,exif_info,user}.entity.dart # to convert DTOs to entities - lib/utils/{image_url_builder,openapi_patching}.dart # utils are fine - test/modules/utils/openapi_patching_test.dart # filename is self-explanatory... # refactor - lib/models/map/map_marker.model.dart - lib/models/server_info/server_{config,disk_info,features,version}.model.dart - lib/models/shared_link/shared_link.model.dart - lib/providers/asset_viewer/asset_people.provider.dart - lib/providers/auth.provider.dart - lib/providers/image/immich_remote_{image,thumbnail}_provider.dart - lib/providers/map/map_state.provider.dart - lib/providers/search/{search,search_filter}.provider.dart - lib/providers/websocket.provider.dart - lib/routing/auth_guard.dart - lib/services/{api,asset,backup,memory,oauth,search,shared_link,stack,trash}.service.dart - lib/widgets/album/album_thumbnail_listtile.dart - lib/widgets/forms/login/login_form.dart - lib/widgets/search/search_filter/{camera_picker,location_picker,people_picker}.dart - lib/services/auth.service.dart # on ApiException - test/services/auth.service_test.dart # on ApiException # allow import from test - test/**.dart dart_code_metrics: extends: - recommended rules: # Common - arguments-ordering: last: - child - children - avoid-accessing-other-classes-private-members - avoid-assigning-to-static-field - avoid-assignments-as-conditions - avoid-async-call-in-sync-function - avoid-collapsible-if - avoid-collection-equality-checks - avoid-complex-loop-conditions - avoid-declaring-call-method - avoid-extensions-on-records - avoid-function-type-in-records - avoid-future-ignore - avoid-global-state - avoid-inverted-boolean-checks - avoid-late-final-reassignment - avoid-local-functions - avoid-negated-conditions - avoid-nested-streams-and-futures - avoid-referencing-subclasses - avoid-unnecessary-continue - avoid-unnecessary-nullable-return-type: false - binary-expression-operand-order - move-variable-outside-iteration - pattern-fields-ordering - prefer-abstract-final-static-class - prefer-commenting-future-delayed - prefer-early-return - prefer-first - prefer-immediate-return - prefer-last - prefer-simpler-boolean-expressions - prefer-switch-expression - prefer-type-over-var - use-existing-destructuring - use-existing-variable # Flutter - avoid-border-all - avoid-complex-arithmetic-expressions - avoid-expanded-as-spacer - avoid-if-with-many-branches - avoid-inherited-widget-in-initstate - avoid-late-context - avoid-returning-widgets - avoid-shrink-wrap-in-lists - avoid-single-child-column-or-row - avoid-stateless-widget-initialized-fields - avoid-wrapping-in-padding - prefer-align-over-container - prefer-const-border-radius - prefer-correct-callback-field-name: false - prefer-correct-edge-insets-constructor - prefer-define-hero-tag - prefer-extracting-callbacks - prefer-for-loop-in-children - prefer-match-file-name: false - prefer-sliver-prefix - prefer-spacing - prefer-text-rich - prefer-transform-over-container - prefer-using-list-view - prefer-widget-private-members: ignore-static: true - use-closest-build-context # riverpod - avoid-calling-notifier-members-inside-build - avoid-notifier-constructors - avoid-ref-read-inside-build - avoid-ref-watch-outside-build - avoid-unnecessary-consumer-widgets - dispose-provided-instances - use-ref-read-synchronously