diff --git a/packages/neon/neon/analysis_options.yaml b/packages/neon/neon/analysis_options.yaml index 66de1efd..d67880af 100644 --- a/packages/neon/neon/analysis_options.yaml +++ b/packages/neon/neon/analysis_options.yaml @@ -1,4 +1,9 @@ -include: package:neon_lints/flutter.yaml +include: package:neon_lints/flutter_package.yaml + +linter: + rules: + # should be enabled for release. https://github.com/nextcloud/neon/issues/692 + public_member_api_docs: false analyzer: exclude: diff --git a/packages/neon/neon/lib/src/pages/login.dart b/packages/neon/neon/lib/src/pages/login.dart index e51291b7..ddcfd9e9 100644 --- a/packages/neon/neon/lib/src/pages/login.dart +++ b/packages/neon/neon/lib/src/pages/login.dart @@ -13,7 +13,7 @@ class LoginPage extends StatefulWidget { }); @override - _LoginPageState createState() => _LoginPageState(); + State createState() => _LoginPageState(); } class _LoginPageState extends State { diff --git a/packages/neon/neon/lib/src/settings/models/storage.dart b/packages/neon/neon/lib/src/settings/models/storage.dart index 409ea3ff..3ce552af 100644 --- a/packages/neon/neon/lib/src/settings/models/storage.dart +++ b/packages/neon/neon/lib/src/settings/models/storage.dart @@ -38,6 +38,8 @@ enum StorageKeys implements Storable { @internal final class NeonStorage { + const NeonStorage._(); + /// Shared preferences instance. /// /// Use [database] to access it. diff --git a/packages/neon/neon/lib/src/utils/global.dart b/packages/neon/neon/lib/src/utils/global.dart index 8b8968b5..7fcef20d 100644 --- a/packages/neon/neon/lib/src/utils/global.dart +++ b/packages/neon/neon/lib/src/utils/global.dart @@ -3,6 +3,8 @@ import 'package:neon/src/models/push_notification.dart'; @internal class Global { + const Global._(); + static Function(String accountID)? onPushNotificationReceived; static Function(PushNotification notification)? onPushNotificationClicked; } diff --git a/packages/neon/neon/lib/src/utils/push_utils.dart b/packages/neon/neon/lib/src/utils/push_utils.dart index 35b7cd1a..6e91d933 100644 --- a/packages/neon/neon/lib/src/utils/push_utils.dart +++ b/packages/neon/neon/lib/src/utils/push_utils.dart @@ -21,6 +21,8 @@ import 'package:nextcloud/nextcloud.dart'; @internal @immutable class PushUtils { + const PushUtils._(); + static Future loadRSAKeypair() async { const storage = AppStorage(StorageKeys.notifications); const keyDevicePrivateKey = 'device-private-key'; diff --git a/packages/neon/neon/lib/src/widgets/exception.dart b/packages/neon/neon/lib/src/widgets/exception.dart index 22426f35..fdd6460c 100644 --- a/packages/neon/neon/lib/src/widgets/exception.dart +++ b/packages/neon/neon/lib/src/widgets/exception.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:meta/meta.dart'; import 'package:neon/l10n/localizations.dart'; import 'package:neon/src/blocs/accounts.dart'; import 'package:neon/src/router.dart'; @@ -109,48 +110,49 @@ class NeonException extends StatelessWidget { ); } - static _ExceptionDetails getDetails(final BuildContext context, final dynamic exception) { + @internal + static ExceptionDetails getDetails(final BuildContext context, final dynamic exception) { if (exception is String) { - return _ExceptionDetails( + return ExceptionDetails( text: exception, ); } if (exception is MissingPermissionException) { - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorMissingPermission(exception.permission.toString().split('.')[1]), ); } if (exception is UnableToOpenFileException) { - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorUnableToOpenFile, ); } if (exception is InvalidQrcodeException) { - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorInvalidQrcode, ); } if (exception is DynamiteApiException) { if (exception.statusCode == 401) { - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorCredentialsForAccountNoLongerMatch, isUnauthorized: true, ); } if (exception.statusCode >= 500 && exception.statusCode <= 599) { - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorServerHadAProblemProcessingYourRequest, ); } } if (exception is SocketException) { - return _ExceptionDetails( + return ExceptionDetails( text: exception.address != null ? AppLocalizations.of(context).errorUnableToReachServerAt(exception.address!.host) : AppLocalizations.of(context).errorUnableToReachServer, @@ -158,7 +160,7 @@ class NeonException extends StatelessWidget { } if (exception is ClientException) { - return _ExceptionDetails( + return ExceptionDetails( text: exception.uri != null ? AppLocalizations.of(context).errorUnableToReachServerAt(exception.uri!.host) : AppLocalizations.of(context).errorUnableToReachServer, @@ -166,7 +168,7 @@ class NeonException extends StatelessWidget { } if (exception is HttpException) { - return _ExceptionDetails( + return ExceptionDetails( text: exception.uri != null ? AppLocalizations.of(context).errorUnableToReachServerAt(exception.uri!.host) : AppLocalizations.of(context).errorUnableToReachServer, @@ -174,12 +176,12 @@ class NeonException extends StatelessWidget { } if (exception is TimeoutException) { - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorConnectionTimedOut, ); } - return _ExceptionDetails( + return ExceptionDetails( text: AppLocalizations.of(context).errorSomethingWentWrongTryAgainLater, ); } @@ -193,8 +195,9 @@ class NeonException extends StatelessWidget { } } -class _ExceptionDetails { - _ExceptionDetails({ +@internal +class ExceptionDetails { + ExceptionDetails({ required this.text, this.isUnauthorized = false, }); diff --git a/packages/neon/neon/lib/widgets.dart b/packages/neon/neon/lib/widgets.dart index 1ef9e379..09d78aee 100644 --- a/packages/neon/neon/lib/widgets.dart +++ b/packages/neon/neon/lib/widgets.dart @@ -1,6 +1,6 @@ export 'package:neon/src/widgets/cached_image.dart'; export 'package:neon/src/widgets/dialog.dart'; -export 'package:neon/src/widgets/exception.dart'; +export 'package:neon/src/widgets/exception.dart' hide ExceptionDetails; export 'package:neon/src/widgets/image_wrapper.dart'; export 'package:neon/src/widgets/linear_progress_indicator.dart'; export 'package:neon/src/widgets/list_view.dart'; diff --git a/packages/neon/neon_notes/lib/utils/category_color.dart b/packages/neon/neon_notes/lib/utils/category_color.dart index 1ce2dbb1..71a2dbb2 100644 --- a/packages/neon/neon_notes/lib/utils/category_color.dart +++ b/packages/neon/neon_notes/lib/utils/category_color.dart @@ -1,6 +1,8 @@ part of '../neon_notes.dart'; class NotesCategoryColor { + const NotesCategoryColor._(); + static final Map _colors = {}; static Color compute(final String category) { diff --git a/packages/neon_lints/lib/dart.yaml b/packages/neon_lints/lib/dart.yaml index 76b61b44..c9c11c24 100644 --- a/packages/neon_lints/lib/dart.yaml +++ b/packages/neon_lints/lib/dart.yaml @@ -1,227 +1 @@ -analyzer: - language: - strict-casts: true - errors: - flutter_style_todos: ignore - todo: ignore - exclude: - - "**.g.dart" - - "**.mocks.dart" -linter: - rules: - always_declare_return_types: true - always_put_control_body_on_new_line: true - always_put_required_named_parameters_first: true - always_specify_types: false - always_use_package_imports: true - annotate_overrides: true - avoid_annotating_with_dynamic: false - avoid_bool_literals_in_conditional_expressions: true - avoid_catches_without_on_clauses: false - avoid_catching_errors: false - avoid_classes_with_only_static_members: false - avoid_double_and_int_checks: true - avoid_dynamic_calls: true - avoid_empty_else: true - avoid_equals_and_hash_code_on_mutable_classes: true - avoid_escaping_inner_quotes: true - avoid_field_initializers_in_const_classes: true - avoid_final_parameters: false - avoid_function_literals_in_foreach_calls: true - avoid_implementing_value_types: true - avoid_init_to_null: true - avoid_js_rounded_ints: true - avoid_multiple_declarations_per_line: true - avoid_null_checks_in_equality_operators: true - avoid_positional_boolean_parameters: true - avoid_print: false - avoid_private_typedef_functions: true - avoid_redundant_argument_values: true - avoid_relative_lib_imports: true - avoid_renaming_method_parameters: true - avoid_return_types_on_setters: true - avoid_returning_null_for_void: true - avoid_returning_this: true - avoid_setters_without_getters: true - avoid_shadowing_type_parameters: true - avoid_single_cascade_in_expression_statements: true - avoid_slow_async_io: true - avoid_type_to_string: true - avoid_types_as_parameter_names: true - avoid_types_on_closure_parameters: true - avoid_unnecessary_containers: true - avoid_unused_constructor_parameters: true - avoid_void_async: true - avoid_web_libraries_in_flutter: true - await_only_futures: true - camel_case_extensions: true - camel_case_types: true - cancel_subscriptions: true - cascade_invocations: true - cast_nullable_to_non_nullable: true - close_sinks: true - collection_methods_unrelated_type: true - combinators_ordering: true - comment_references: true - conditional_uri_does_not_exist: true - constant_identifier_names: true - control_flow_in_finally: true - curly_braces_in_flow_control_structures: true - dangling_library_doc_comments: true - depend_on_referenced_packages: true - deprecated_consistency: true - deprecated_member_use_from_same_package: true - diagnostic_describe_all_properties: false - directives_ordering: true - discarded_futures: true - do_not_use_environment: true - empty_catches: true - empty_constructor_bodies: true - empty_statements: true - eol_at_end_of_file: true - exhaustive_cases: true - file_names: true - flutter_style_todos: true - hash_and_equals: true - implementation_imports: true - implicit_call_tearoffs: true - implicit_reopen: true - invalid_case_patterns: true - join_return_with_assignment: true - leading_newlines_in_multiline_strings: true - library_annotations: true - library_names: true - library_prefixes: true - library_private_types_in_public_api: true - lines_longer_than_80_chars: false - literal_only_boolean_expressions: true - matching_super_parameters: true - missing_whitespace_between_adjacent_strings: true - no_adjacent_strings_in_list: true - no_default_cases: false - no_duplicate_case_values: true - no_leading_underscores_for_library_prefixes: true - no_leading_underscores_for_local_identifiers: true - no_literal_bool_comparisons: true - no_logic_in_create_state: true - no_runtimeType_toString: true - no_self_assignments: true - no_wildcard_variable_uses: true - non_constant_identifier_names: true - noop_primitive_operations: true - null_check_on_nullable_type_parameter: true - null_closures: true - omit_local_variable_types: true - one_member_abstracts: false - only_throw_errors: true - overridden_fields: true - package_api_docs: true - package_names: true - package_prefixed_library_names: true - parameter_assignments: true - prefer_adjacent_string_concatenation: true - prefer_asserts_in_initializer_lists: true - prefer_asserts_with_message: true - prefer_collection_literals: true - prefer_conditional_assignment: true - prefer_const_constructors: true - prefer_const_constructors_in_immutables: true - prefer_const_declarations: true - prefer_const_literals_to_create_immutables: true - prefer_constructors_over_static_methods: true - prefer_contains: true - prefer_double_quotes: false - prefer_expression_function_bodies: true - prefer_final_fields: true - prefer_final_in_for_each: true - prefer_final_locals: true - prefer_final_parameters: true - prefer_for_elements_to_map_fromIterable: true - prefer_foreach: true - prefer_function_declarations_over_variables: true - prefer_generic_function_type_aliases: true - prefer_if_elements_to_conditional_expressions: true - prefer_if_null_operators: true - prefer_initializing_formals: true - prefer_inlined_adds: true - prefer_int_literals: true - prefer_interpolation_to_compose_strings: true - prefer_is_empty: true - prefer_is_not_empty: true - prefer_is_not_operator: true - prefer_iterable_whereType: true - prefer_mixin: true - prefer_null_aware_method_calls: true - prefer_null_aware_operators: true - prefer_relative_imports: false - prefer_single_quotes: true - prefer_spread_collections: true - prefer_typing_uninitialized_variables: true - prefer_void_to_null: true - provide_deprecation_message: true - public_member_api_docs: true - recursive_getters: true - require_trailing_commas: true - secure_pubspec_urls: true - sized_box_for_whitespace: true - sized_box_shrink_expand: true - slash_for_doc_comments: true - sort_child_properties_last: true - sort_constructors_first: true - sort_pub_dependencies: true - sort_unnamed_constructors_first: true - test_types_in_equals: true - throw_in_finally: true - tighten_type_of_initializing_formals: true - type_annotate_public_apis: true - type_init_formals: true - type_literal_in_constant_pattern: true - unawaited_futures: true - unnecessary_await_in_return: true - unnecessary_brace_in_string_interps: true - unnecessary_breaks: true - unnecessary_const: true - unnecessary_constructor_name: true - unnecessary_final: false - unnecessary_getters_setters: true - unnecessary_lambdas: true - unnecessary_late: true - unnecessary_library_directive: true - unnecessary_new: true - unnecessary_null_aware_assignments: true - unnecessary_null_aware_operator_on_extension_on_nullable: true - unnecessary_null_checks: true - unnecessary_null_in_if_null_operators: true - unnecessary_nullable_for_final_variable_declarations: true - unnecessary_overrides: true - unnecessary_parenthesis: true - unnecessary_raw_strings: true - unnecessary_statements: true - unnecessary_string_escapes: true - unnecessary_string_interpolations: true - unnecessary_this: true - unnecessary_to_list_in_spreads: true - unreachable_from_main: true - unrelated_type_equality_checks: true - unsafe_html: true - use_build_context_synchronously: true - use_colored_box: true - use_decorated_box: true - use_enums: true - use_full_hex_values_for_flutter_colors: true - use_function_type_syntax_for_parameters: true - use_if_null_to_convert_nulls_to_bools: true - use_is_even_rather_than_modulo: true - use_key_in_widget_constructors: true - use_late_for_private_fields_and_variables: true - use_named_constants: true - use_raw_strings: true - use_rethrow_when_possible: true - use_setters_to_change_properties: true - use_string_buffers: true - use_string_in_part_of_directives: true - use_super_parameters: true - use_test_throws_matchers: true - use_to_and_as_if_applicable: true - valid_regexps: true - void_checks: true +include: package:neon_lints/src/base.yaml diff --git a/packages/neon_lints/lib/flutter.yaml b/packages/neon_lints/lib/flutter.yaml index 46ae78a6..67303d7c 100644 --- a/packages/neon_lints/lib/flutter.yaml +++ b/packages/neon_lints/lib/flutter.yaml @@ -1,9 +1,7 @@ -include: package:neon_lints/dart.yaml +include: package:neon_lints/src/base.yaml + linter: rules: public_member_api_docs: false library_private_types_in_public_api: false avoid_print: true -analyzer: - exclude: - - 'lib/generated_plugin_registrant.dart' diff --git a/packages/neon_lints/lib/flutter_package.yaml b/packages/neon_lints/lib/flutter_package.yaml new file mode 100644 index 00000000..65e82b6c --- /dev/null +++ b/packages/neon_lints/lib/flutter_package.yaml @@ -0,0 +1,5 @@ +include: package:neon_lints/src/base.yaml + +linter: + rules: + avoid_print: true diff --git a/packages/neon_lints/lib/src/base.yaml b/packages/neon_lints/lib/src/base.yaml new file mode 100644 index 00000000..0aa65d92 --- /dev/null +++ b/packages/neon_lints/lib/src/base.yaml @@ -0,0 +1,227 @@ +analyzer: + language: + strict-casts: true + errors: + flutter_style_todos: ignore + todo: ignore + exclude: + - "**.g.dart" + - "**.mocks.dart" +linter: + rules: + always_declare_return_types: true + always_put_control_body_on_new_line: true + always_put_required_named_parameters_first: true + always_specify_types: false + always_use_package_imports: true + annotate_overrides: true + avoid_annotating_with_dynamic: false + avoid_bool_literals_in_conditional_expressions: true + avoid_catches_without_on_clauses: false + avoid_catching_errors: true + avoid_classes_with_only_static_members: true + avoid_double_and_int_checks: true + avoid_dynamic_calls: true + avoid_empty_else: true + avoid_equals_and_hash_code_on_mutable_classes: true + avoid_escaping_inner_quotes: true + avoid_field_initializers_in_const_classes: true + avoid_final_parameters: false + avoid_function_literals_in_foreach_calls: true + avoid_implementing_value_types: true + avoid_init_to_null: true + avoid_js_rounded_ints: true + avoid_multiple_declarations_per_line: true + avoid_null_checks_in_equality_operators: true + avoid_positional_boolean_parameters: true + avoid_print: false + avoid_private_typedef_functions: true + avoid_redundant_argument_values: true + avoid_relative_lib_imports: true + avoid_renaming_method_parameters: true + avoid_return_types_on_setters: true + avoid_returning_null_for_void: true + avoid_returning_this: true + avoid_setters_without_getters: true + avoid_shadowing_type_parameters: true + avoid_single_cascade_in_expression_statements: true + avoid_slow_async_io: true + avoid_type_to_string: true + avoid_types_as_parameter_names: true + avoid_types_on_closure_parameters: true + avoid_unnecessary_containers: true + avoid_unused_constructor_parameters: true + avoid_void_async: true + avoid_web_libraries_in_flutter: true + await_only_futures: true + camel_case_extensions: true + camel_case_types: true + cancel_subscriptions: true + cascade_invocations: true + cast_nullable_to_non_nullable: true + close_sinks: true + collection_methods_unrelated_type: true + combinators_ordering: true + comment_references: true + conditional_uri_does_not_exist: true + constant_identifier_names: true + control_flow_in_finally: true + curly_braces_in_flow_control_structures: true + dangling_library_doc_comments: true + depend_on_referenced_packages: true + deprecated_consistency: true + deprecated_member_use_from_same_package: true + diagnostic_describe_all_properties: false + directives_ordering: true + discarded_futures: true + do_not_use_environment: true + empty_catches: true + empty_constructor_bodies: true + empty_statements: true + eol_at_end_of_file: true + exhaustive_cases: true + file_names: true + flutter_style_todos: true + hash_and_equals: true + implementation_imports: true + implicit_call_tearoffs: true + implicit_reopen: true + invalid_case_patterns: true + join_return_with_assignment: true + leading_newlines_in_multiline_strings: true + library_annotations: true + library_names: true + library_prefixes: true + library_private_types_in_public_api: true + lines_longer_than_80_chars: false + literal_only_boolean_expressions: true + matching_super_parameters: true + missing_whitespace_between_adjacent_strings: true + no_adjacent_strings_in_list: true + no_default_cases: false + no_duplicate_case_values: true + no_leading_underscores_for_library_prefixes: true + no_leading_underscores_for_local_identifiers: true + no_literal_bool_comparisons: true + no_logic_in_create_state: true + no_runtimeType_toString: true + no_self_assignments: true + no_wildcard_variable_uses: true + non_constant_identifier_names: true + noop_primitive_operations: true + null_check_on_nullable_type_parameter: true + null_closures: true + omit_local_variable_types: true + one_member_abstracts: false + only_throw_errors: true + overridden_fields: true + package_api_docs: true + package_names: true + package_prefixed_library_names: true + parameter_assignments: true + prefer_adjacent_string_concatenation: true + prefer_asserts_in_initializer_lists: true + prefer_asserts_with_message: true + prefer_collection_literals: true + prefer_conditional_assignment: true + prefer_const_constructors: true + prefer_const_constructors_in_immutables: true + prefer_const_declarations: true + prefer_const_literals_to_create_immutables: true + prefer_constructors_over_static_methods: true + prefer_contains: true + prefer_double_quotes: false + prefer_expression_function_bodies: true + prefer_final_fields: true + prefer_final_in_for_each: true + prefer_final_locals: true + prefer_final_parameters: true + prefer_for_elements_to_map_fromIterable: true + prefer_foreach: true + prefer_function_declarations_over_variables: true + prefer_generic_function_type_aliases: true + prefer_if_elements_to_conditional_expressions: true + prefer_if_null_operators: true + prefer_initializing_formals: true + prefer_inlined_adds: true + prefer_int_literals: true + prefer_interpolation_to_compose_strings: true + prefer_is_empty: true + prefer_is_not_empty: true + prefer_is_not_operator: true + prefer_iterable_whereType: true + prefer_mixin: true + prefer_null_aware_method_calls: true + prefer_null_aware_operators: true + prefer_relative_imports: false + prefer_single_quotes: true + prefer_spread_collections: true + prefer_typing_uninitialized_variables: true + prefer_void_to_null: true + provide_deprecation_message: true + public_member_api_docs: true + recursive_getters: true + require_trailing_commas: true + secure_pubspec_urls: true + sized_box_for_whitespace: true + sized_box_shrink_expand: true + slash_for_doc_comments: true + sort_child_properties_last: true + sort_constructors_first: true + sort_pub_dependencies: true + sort_unnamed_constructors_first: true + test_types_in_equals: true + throw_in_finally: true + tighten_type_of_initializing_formals: true + type_annotate_public_apis: true + type_init_formals: true + type_literal_in_constant_pattern: true + unawaited_futures: true + unnecessary_await_in_return: true + unnecessary_brace_in_string_interps: true + unnecessary_breaks: true + unnecessary_const: true + unnecessary_constructor_name: true + unnecessary_final: false + unnecessary_getters_setters: true + unnecessary_lambdas: true + unnecessary_late: true + unnecessary_library_directive: true + unnecessary_new: true + unnecessary_null_aware_assignments: true + unnecessary_null_aware_operator_on_extension_on_nullable: true + unnecessary_null_checks: true + unnecessary_null_in_if_null_operators: true + unnecessary_nullable_for_final_variable_declarations: true + unnecessary_overrides: true + unnecessary_parenthesis: true + unnecessary_raw_strings: true + unnecessary_statements: true + unnecessary_string_escapes: true + unnecessary_string_interpolations: true + unnecessary_this: true + unnecessary_to_list_in_spreads: true + unreachable_from_main: true + unrelated_type_equality_checks: true + unsafe_html: true + use_build_context_synchronously: true + use_colored_box: true + use_decorated_box: true + use_enums: true + use_full_hex_values_for_flutter_colors: true + use_function_type_syntax_for_parameters: true + use_if_null_to_convert_nulls_to_bools: true + use_is_even_rather_than_modulo: true + use_key_in_widget_constructors: true + use_late_for_private_fields_and_variables: true + use_named_constants: true + use_raw_strings: true + use_rethrow_when_possible: true + use_setters_to_change_properties: true + use_string_buffers: true + use_string_in_part_of_directives: true + use_super_parameters: true + use_test_throws_matchers: true + use_to_and_as_if_applicable: true + valid_regexps: true + void_checks: true diff --git a/packages/neon_lints/lint_maker.yaml b/packages/neon_lints/lint_maker.yaml index bce60456..f7070cc1 100644 --- a/packages/neon_lints/lint_maker.yaml +++ b/packages/neon_lints/lint_maker.yaml @@ -1,13 +1,11 @@ dart: commitHash: 0a567d0 - output: 'lib/dart.yaml' + output: 'lib/src/base.yaml' disabledRules: - always_specify_types - avoid_annotating_with_dynamic - avoid_as - avoid_catches_without_on_clauses - - avoid_catching_errors - - avoid_classes_with_only_static_members - avoid_final_parameters - avoid_print - diagnostic_describe_all_properties