diff --git a/examples/counter_example/pubspec.lock b/examples/counter_example/pubspec.lock index f49ef922..9294f043 100644 --- a/examples/counter_example/pubspec.lock +++ b/examples/counter_example/pubspec.lock @@ -734,6 +734,13 @@ packages: relative: true source: path version: "0.3.0" + stac_logger: + dependency: "direct overridden" + description: + path: "../../packages/stac_logger" + relative: true + source: path + version: "1.0.0" stack_trace: dependency: transitive description: diff --git a/examples/counter_example/pubspec_overrides.yaml b/examples/counter_example/pubspec_overrides.yaml index bb35d5b9..bea7478c 100644 --- a/examples/counter_example/pubspec_overrides.yaml +++ b/examples/counter_example/pubspec_overrides.yaml @@ -1,6 +1,8 @@ -# melos_managed_dependency_overrides: stac,stac_framework +# melos_managed_dependency_overrides: stac,stac_framework,stac_logger dependency_overrides: stac: path: ../../packages/stac stac_framework: path: ../../packages/stac_framework + stac_logger: + path: ../../packages/stac_logger diff --git a/examples/movie_app/pubspec.lock b/examples/movie_app/pubspec.lock index d516b37f..af767377 100644 --- a/examples/movie_app/pubspec.lock +++ b/examples/movie_app/pubspec.lock @@ -454,6 +454,13 @@ packages: relative: true source: path version: "0.3.0" + stac_logger: + dependency: "direct overridden" + description: + path: "../../packages/stac_logger" + relative: true + source: path + version: "1.0.0" stack_trace: dependency: transitive description: diff --git a/examples/movie_app/pubspec_overrides.yaml b/examples/movie_app/pubspec_overrides.yaml index bb35d5b9..bea7478c 100644 --- a/examples/movie_app/pubspec_overrides.yaml +++ b/examples/movie_app/pubspec_overrides.yaml @@ -1,6 +1,8 @@ -# melos_managed_dependency_overrides: stac,stac_framework +# melos_managed_dependency_overrides: stac,stac_framework,stac_logger dependency_overrides: stac: path: ../../packages/stac stac_framework: path: ../../packages/stac_framework + stac_logger: + path: ../../packages/stac_logger diff --git a/examples/stac_gallery/pubspec.lock b/examples/stac_gallery/pubspec.lock index 4770afeb..1499e42f 100644 --- a/examples/stac_gallery/pubspec.lock +++ b/examples/stac_gallery/pubspec.lock @@ -734,6 +734,13 @@ packages: relative: true source: path version: "0.3.0" + stac_logger: + dependency: "direct overridden" + description: + path: "../../packages/stac_logger" + relative: true + source: path + version: "1.0.0" stac_webview: dependency: "direct main" description: diff --git a/examples/stac_gallery/pubspec_overrides.yaml b/examples/stac_gallery/pubspec_overrides.yaml index eaa0c70a..3770b035 100644 --- a/examples/stac_gallery/pubspec_overrides.yaml +++ b/examples/stac_gallery/pubspec_overrides.yaml @@ -1,8 +1,10 @@ -# melos_managed_dependency_overrides: stac,stac_framework,stac_webview +# melos_managed_dependency_overrides: stac,stac_framework,stac_webview,stac_logger dependency_overrides: stac: path: ../../packages/stac stac_framework: path: ../../packages/stac_framework + stac_logger: + path: ../../packages/stac_logger stac_webview: path: ../../packages/stac_webview diff --git a/packages/stac/lib/src/framework/stac.dart b/packages/stac/lib/src/framework/stac.dart index e7a5799a..6bd5cbf7 100644 --- a/packages/stac/lib/src/framework/stac.dart +++ b/packages/stac/lib/src/framework/stac.dart @@ -10,10 +10,10 @@ import 'package:stac/src/parsers/parsers.dart'; import 'package:stac/src/parsers/widgets/stac_inkwell/stac_inkwell_parser.dart'; import 'package:stac/src/parsers/widgets/stac_set_value/stac_set_value_parser.dart'; import 'package:stac/src/services/stac_network_service.dart'; -import 'package:stac/src/utils/log.dart'; import 'package:stac/src/utils/variable_resolver.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_logger/stac_logger.dart'; typedef ErrorWidgetBuilder = Widget Function( BuildContext context, diff --git a/packages/stac/lib/src/framework/stac_registry.dart b/packages/stac/lib/src/framework/stac_registry.dart index f393554e..5f951ec0 100644 --- a/packages/stac/lib/src/framework/stac_registry.dart +++ b/packages/stac/lib/src/framework/stac_registry.dart @@ -1,4 +1,4 @@ -import 'package:stac/src/utils/log.dart'; +import 'package:stac_logger/stac_logger.dart'; import 'package:stac_framework/stac_framework.dart'; class StacRegistry { diff --git a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart index d1fbd23b..03c98cd1 100644 --- a/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart +++ b/packages/stac/lib/src/parsers/actions/stac_network_request/stac_network_request_parser.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; -import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; import 'package:stac/src/framework/framework.dart'; +import 'package:stac/src/parsers/actions/stac_network_request/stac_network_request.dart'; import 'package:stac/src/services/stac_network_service.dart'; import 'package:stac/src/utils/action_type.dart'; -import 'package:stac/src/utils/log.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_logger/stac_logger.dart'; class StacNetworkRequestParser extends StacActionParser { const StacNetworkRequestParser(); diff --git a/packages/stac/lib/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller_parser.dart index 8a197170..ebc1d6bb 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller_parser.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:stac/src/framework/framework.dart'; import 'package:stac/src/parsers/widgets/stac_default_bottom_navigation_controller/stac_default_bottom_navigation_controller.dart'; -import 'package:stac/src/utils/log.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_logger/stac_logger.dart'; class StacDefaultBottomNavigationControllerParser extends StacParser { diff --git a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart index 2cfb7d6e..2d257faa 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view_parser.dart @@ -5,9 +5,9 @@ import 'package:flutter/material.dart'; import 'package:stac/src/framework/framework.dart'; import 'package:stac/src/parsers/widgets/stac_dynamic_view/stac_dynamic_view.dart'; import 'package:stac/src/services/stac_network_service.dart'; -import 'package:stac/src/utils/log.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_logger/stac_logger.dart'; class StacDynamicViewParser extends StacParser { const StacDynamicViewParser(); diff --git a/packages/stac/lib/src/parsers/widgets/stac_form/stac_form_scope.dart b/packages/stac/lib/src/parsers/widgets/stac_form/stac_form_scope.dart index 1ae23fdc..69914464 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_form/stac_form_scope.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_form/stac_form_scope.dart @@ -1,5 +1,5 @@ import 'package:flutter/cupertino.dart'; -import 'package:stac/src/utils/log.dart'; +import 'package:stac_logger/stac_logger.dart'; class StacFormScope extends InheritedWidget { const StacFormScope({ diff --git a/packages/stac/lib/src/parsers/widgets/stac_icon/stac_icon_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_icon/stac_icon_parser.dart index 724b2bbc..018f810b 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_icon/stac_icon_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_icon/stac_icon_parser.dart @@ -2,9 +2,9 @@ import 'package:flutter/cupertino.dart'; import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart'; import 'package:stac/src/utils/color_utils.dart'; import 'package:stac/src/utils/icon_utils.dart'; -import 'package:stac/src/utils/log.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_logger/stac_logger.dart'; import 'stac_icon.dart'; diff --git a/packages/stac/lib/src/parsers/widgets/stac_radio_group/stac_radio_group_scope.dart b/packages/stac/lib/src/parsers/widgets/stac_radio_group/stac_radio_group_scope.dart index cf0148bd..533e9865 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_radio_group/stac_radio_group_scope.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_radio_group/stac_radio_group_scope.dart @@ -1,5 +1,5 @@ import 'package:flutter/widgets.dart'; -import 'package:stac/src/utils/log.dart'; +import 'package:stac_logger/stac_logger.dart'; class StacRadioGroupScope extends InheritedWidget { const StacRadioGroupScope({ diff --git a/packages/stac/lib/src/parsers/widgets/stac_text_form_field/stac_text_form_field_parser.dart b/packages/stac/lib/src/parsers/widgets/stac_text_form_field/stac_text_form_field_parser.dart index ae71e35c..3e4e1f83 100644 --- a/packages/stac/lib/src/parsers/widgets/stac_text_form_field/stac_text_form_field_parser.dart +++ b/packages/stac/lib/src/parsers/widgets/stac_text_form_field/stac_text_form_field_parser.dart @@ -3,9 +3,9 @@ import 'package:stac/src/parsers/parsers.dart'; import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart'; import 'package:stac/src/utils/color_utils.dart'; import 'package:stac/src/utils/input_validations.dart'; -import 'package:stac/src/utils/log.dart'; import 'package:stac/src/utils/widget_type.dart'; import 'package:stac_framework/stac_framework.dart'; +import 'package:stac_logger/stac_logger.dart'; class StacTextFormFieldParser extends StacParser { const StacTextFormFieldParser(); diff --git a/packages/stac/lib/src/utils/input_formatters.dart b/packages/stac/lib/src/utils/input_formatters.dart index 0b206d65..2bc3ff15 100644 --- a/packages/stac/lib/src/utils/input_formatters.dart +++ b/packages/stac/lib/src/utils/input_formatters.dart @@ -1,5 +1,5 @@ import 'package:flutter/services.dart'; -import 'package:stac/src/utils/log.dart'; +import 'package:stac_logger/stac_logger.dart'; enum InputFormatterType { allow, diff --git a/packages/stac/lib/src/utils/log.dart b/packages/stac/lib/src/utils/log.dart deleted file mode 100644 index e39b1b4d..00000000 --- a/packages/stac/lib/src/utils/log.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:logger/logger.dart'; - -class Log { - const Log._(); - - static final _log = Logger(); - - static void d(dynamic message) => _log.d(message); - static void i(dynamic message) => _log.i(message); - static void w(dynamic message) => _log.w(message); - static void e(dynamic message) => _log.e(message); -} diff --git a/packages/stac/pubspec.yaml b/packages/stac/pubspec.yaml index bee544e0..d5dca22a 100644 --- a/packages/stac/pubspec.yaml +++ b/packages/stac/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: stac_framework: ^0.3.0 cached_network_image: ^3.4.1 flutter_svg: ^2.1.0 + stac_logger: ^1.0.0 dev_dependencies: flutter_test: diff --git a/packages/stac/pubspec_overrides.yaml b/packages/stac/pubspec_overrides.yaml index f2bee052..60c0b6b8 100644 --- a/packages/stac/pubspec_overrides.yaml +++ b/packages/stac/pubspec_overrides.yaml @@ -1,4 +1,6 @@ -# melos_managed_dependency_overrides: stac_framework +# melos_managed_dependency_overrides: stac_framework,stac_logger dependency_overrides: stac_framework: path: ../stac_framework + stac_logger: + path: ../stac_logger diff --git a/packages/stac_logger/.gitignore b/packages/stac_logger/.gitignore new file mode 100644 index 00000000..eb6c05cd --- /dev/null +++ b/packages/stac_logger/.gitignore @@ -0,0 +1,31 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/packages/stac_logger/.metadata b/packages/stac_logger/.metadata new file mode 100644 index 00000000..231eccaf --- /dev/null +++ b/packages/stac_logger/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "b25305a8832cfc6ba632a7f87ad455e319dccce8" + channel: "stable" + +project_type: package diff --git a/packages/stac_logger/CHANGELOG.md b/packages/stac_logger/CHANGELOG.md new file mode 100644 index 00000000..fa024b4d --- /dev/null +++ b/packages/stac_logger/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +* Initial release of the stac_logger package \ No newline at end of file diff --git a/packages/stac_logger/LICENSE b/packages/stac_logger/LICENSE new file mode 100644 index 00000000..bdc7bbd7 --- /dev/null +++ b/packages/stac_logger/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Stac + +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. diff --git a/packages/stac_logger/README.md b/packages/stac_logger/README.md new file mode 100644 index 00000000..995830bb --- /dev/null +++ b/packages/stac_logger/README.md @@ -0,0 +1,53 @@ +# Stac Logger + +A lightweight and reusable logging utility for the Stac framework. It switches between implementations—using Flutter's debugPrint on web/WASM platforms and the robust logger package on native platforms—ensuring optimal performance and compatibility across all environments. + +## Getting started + +Add the package to your `pubspec.yaml`: + +```yaml +dependencies: + stac_logger: ^1.0.0 +``` + +Then run: + +```bash +flutter pub get +``` + +## Usage + +Import the package and use the `Log` class to log messages: + +```dart +import 'package:stac_logger/stac_logger.dart'; + +void main() { + // Log a debug message + Log.d('Debug message'); + + // Log an info message + Log.i('Info message'); + + // Log a warning message + Log.w('Warning message'); + + // Log an error message + Log.e('Error message'); +} +``` + +## Implementation Details + +This package uses conditional imports to select the appropriate logging implementation based on the platform: + +- On native platforms (iOS, Android, desktop), it uses a full-featured logger implementation +- On web/WASM platforms, it uses a simplified implementation compatible with those environments + +The conditional import approach ensures that no `dart:io` code is included in web/WASM builds, making the package fully compatible with WebAssembly. + +## Additional information + +This package is part of the Stac framework ecosystem and is designed to provide logging functionality that works across all platforms, including WASM environments diff --git a/packages/stac_logger/analysis_options.yaml b/packages/stac_logger/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/packages/stac_logger/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/packages/stac_logger/lib/src/log.dart b/packages/stac_logger/lib/src/log.dart new file mode 100644 index 00000000..aff9b91a --- /dev/null +++ b/packages/stac_logger/lib/src/log.dart @@ -0,0 +1,24 @@ +import 'package:stac_logger/src/log_interface.dart'; + +import 'log_io.dart' // Default implementation for non-web platforms + if (dart.library.html) 'log_web.dart'; // Web/WASM implementation + +class Log { + const Log._(); + + // Get the logger instance directly from the conditionally imported file + // The compiler will select the appropriate implementation at compile time + static final LogInterface _logger = createLogger(); + + /// Logs a debug message + static void d(dynamic message) => _logger.d(message); + + /// Logs an info message + static void i(dynamic message) => _logger.i(message); + + /// Logs a warning message + static void w(dynamic message) => _logger.w(message); + + /// Logs an error message + static void e(dynamic message) => _logger.e(message); +} diff --git a/packages/stac_logger/lib/src/log_interface.dart b/packages/stac_logger/lib/src/log_interface.dart new file mode 100644 index 00000000..12e4ac22 --- /dev/null +++ b/packages/stac_logger/lib/src/log_interface.dart @@ -0,0 +1,14 @@ +/// Abstract interface for logging functionality +abstract class LogInterface { + /// Log a debug message + void d(dynamic message); + + /// Log an info message + void i(dynamic message); + + /// Log a warning message + void w(dynamic message); + + /// Log an error message + void e(dynamic message); +} diff --git a/packages/stac_logger/lib/src/log_io.dart b/packages/stac_logger/lib/src/log_io.dart new file mode 100644 index 00000000..02ccddf9 --- /dev/null +++ b/packages/stac_logger/lib/src/log_io.dart @@ -0,0 +1,26 @@ +import 'package:logger/logger.dart'; +import 'log_interface.dart'; + +LogInterface createLogger() => LogIO.instance; + +/// IO-based implementation of LogInterface +class LogIO implements LogInterface { + LogIO._(); + + static final LogIO _instance = LogIO._(); + static LogIO get instance => _instance; + + final _log = Logger(); + + @override + void d(dynamic message) => _log.d(message); + + @override + void i(dynamic message) => _log.i(message); + + @override + void w(dynamic message) => _log.w(message); + + @override + void e(dynamic message) => _log.e(message); +} diff --git a/packages/stac_logger/lib/src/log_web.dart b/packages/stac_logger/lib/src/log_web.dart new file mode 100644 index 00000000..bd2057b2 --- /dev/null +++ b/packages/stac_logger/lib/src/log_web.dart @@ -0,0 +1,40 @@ +import 'package:flutter/foundation.dart'; +import 'package:stac_logger/src/log_interface.dart'; + +LogInterface createLogger() => LogWeb.instance; + +/// Web/WASM-compatible implementation of LogInterface +class LogWeb implements LogInterface { + LogWeb._(); + + static final LogWeb _instance = LogWeb._(); + static LogWeb get instance => _instance; + + @override + void d(dynamic message) { + if (kDebugMode) { + debugPrint('[DEBUG] $message'); + } + } + + @override + void i(dynamic message) { + if (kDebugMode) { + debugPrint('[INFO] $message'); + } + } + + @override + void w(dynamic message) { + if (kDebugMode) { + debugPrint('[WARNING] $message'); + } + } + + @override + void e(dynamic message) { + if (kDebugMode) { + debugPrint('[ERROR] $message'); + } + } +} diff --git a/packages/stac_logger/lib/stac_logger.dart b/packages/stac_logger/lib/stac_logger.dart new file mode 100644 index 00000000..6b3e5d1d --- /dev/null +++ b/packages/stac_logger/lib/stac_logger.dart @@ -0,0 +1,3 @@ +library; + +export 'src/log.dart'; diff --git a/packages/stac_logger/pubspec.yaml b/packages/stac_logger/pubspec.yaml new file mode 100644 index 00000000..a155e8f1 --- /dev/null +++ b/packages/stac_logger/pubspec.yaml @@ -0,0 +1,56 @@ +name: stac_logger +description: A lightweight and reusable logging utility for the Stac framework. +version: 1.0.0 +homepage: https://github.com/StacDev/stac +repository: https://github.com/StacDev/stac/tree/dev/packages/stac_logger + +environment: + sdk: ^3.8.1 + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + logger: ^2.5.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package