From c4a224f7cd3b552b92af39c452f214c6c647171a Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Thu, 27 Mar 2025 09:47:05 +0100 Subject: [PATCH 1/8] change: Upgrade to catalyst_builder ^5.0.0-dev.1 --- .github/workflows/flutter.yml | 6 +- CHANGELOG.md | 7 + UPGRADE.md | 27 ++++ build.yaml | 5 + example/build.yaml | 8 -- .../xcshareddata/xcschemes/Runner.xcscheme | 1 + example/lib/home/home_screen.dart | 2 +- example/lib/home/routes.dart | 2 +- example/lib/main.dart | 12 +- example/lib/other/other_screen.dart | 2 +- example/lib/other/routes.dart | 2 +- example/lib/other/variables_screen.dart | 2 +- example/lib/splash/routes.dart | 2 +- example/lib/splash/splash_screen.dart | 2 +- example/pubspec.lock | 132 +++++++++--------- example/pubspec.yaml | 17 ++- lib/explorator.catalyst_builder.plugin.g.dart | 54 +++++++ lib/explorator.dart | 6 + lib/src/extensions.dart | 14 +- lib/src/registered_route.dart | 2 +- lib/src/route_matcher.dart | 2 +- lib/src/route_resolver.dart | 2 +- lib/src/routing.dart | 2 + pubspec.yaml | 11 +- run_tests.sh | 5 +- test/mocks.dart | 18 ++- test/provider_extension_test.dart | 40 +----- test/route_resolver_test.dart | 2 +- 28 files changed, 233 insertions(+), 154 deletions(-) create mode 100644 UPGRADE.md create mode 100644 build.yaml delete mode 100644 example/build.yaml create mode 100644 lib/explorator.catalyst_builder.plugin.g.dart diff --git a/.github/workflows/flutter.yml b/.github/workflows/flutter.yml index ab4276e..4ad3644 100644 --- a/.github/workflows/flutter.yml +++ b/.github/workflows/flutter.yml @@ -16,6 +16,9 @@ jobs: with: flutter-version: '3.27.3' channel: 'stable' + + - name: Setup LCOV + uses: hrishikesh-kadam/setup-lcov@v1 - name: Install dependencies run: dart pub get @@ -27,6 +30,5 @@ jobs: - name: Generate the mocks run: flutter pub run build_runner build --delete-conflicting-outputs - - name: Run tests - run: flutter test \ No newline at end of file + run: chmod +x run_tests.sh && ./run_tests.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 98a8cce..ca14458 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2.0.0-dev.1 + +### Breaking Changes + +- `catalyst_builder: ^5.0.0-dev.1` is required +- Configuration has changed. Take a look in [UPGRADE.md](UPGRADE.md) for guidance. + ## 1.2.0 Changes: diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 0000000..c59ffe6 --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,27 @@ +# Upgrade from v1 to v2 + +## catalyst_builder + +Update catalyst_builder to ^5.0.0 + +## Service registration + +Update your code: +```diff + @GenerateServiceProvider() + void main() { + // Create an instance of the service provider + var provider = DefaultServiceProvider(); + provider + // Extension method from the explorator package + ..useExplorator( +- routeBuilder: MaterialRouteBuilder(), + ) ++ ..setupExplorator( ++ routeBuilder: MaterialRouteBuilder(), ++ ) + ..boot(); + // Run the app + runApp(MyApp(provider)); + } +``` diff --git a/build.yaml b/build.yaml new file mode 100644 index 0000000..2a9825b --- /dev/null +++ b/build.yaml @@ -0,0 +1,5 @@ +targets: + $default: + sources: + exclude: + - example/** diff --git a/example/build.yaml b/example/build.yaml deleted file mode 100644 index 2894ecf..0000000 --- a/example/build.yaml +++ /dev/null @@ -1,8 +0,0 @@ -targets: - $default: - auto_apply_builders: true - builders: - catalyst_builder|buildServiceProvider: - options: - providerClassName: 'DefaultServiceProvider' - includePackageDependencies: true diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 5e31d3d..c53e2b3 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -48,6 +48,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/example/lib/home/home_screen.dart b/example/lib/home/home_screen.dart index ced03c8..24ef7b0 100644 --- a/example/lib/home/home_screen.dart +++ b/example/lib/home/home_screen.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/material.dart'; diff --git a/example/lib/home/routes.dart b/example/lib/home/routes.dart index 5ec5b19..e267f76 100644 --- a/example/lib/home/routes.dart +++ b/example/lib/home/routes.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:explorator_example/home/home_screen.dart'; diff --git a/example/lib/main.dart b/example/lib/main.dart index adc9820..e2d84e1 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,22 +1,22 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/material.dart'; -import 'package:url_strategy/url_strategy.dart'; +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'main.catalyst_builder.g.dart'; @GenerateServiceProvider( - providerClassName: 'DefaultServiceProvider', - includePackageDependencies: true + providerClassName: 'DefaultServiceProvider', ) void main() { - setPathUrlStrategy(); + usePathUrlStrategy(); // Create an instance of the service provider var provider = DefaultServiceProvider(); provider // Extension method from the explorator package - ..useExplorator( + ..useExplorator() + ..setupExplorator( routeBuilder: MaterialRouteBuilder(), ) ..boot(); diff --git a/example/lib/other/other_screen.dart b/example/lib/other/other_screen.dart index 8d5ec74..2d5eeb9 100644 --- a/example/lib/other/other_screen.dart +++ b/example/lib/other/other_screen.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:flutter/material.dart'; @Service() diff --git a/example/lib/other/routes.dart b/example/lib/other/routes.dart index 727ed65..aab0c82 100644 --- a/example/lib/other/routes.dart +++ b/example/lib/other/routes.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:explorator_example/other/variables_screen.dart'; diff --git a/example/lib/other/variables_screen.dart b/example/lib/other/variables_screen.dart index 93de981..ed51fe4 100644 --- a/example/lib/other/variables_screen.dart +++ b/example/lib/other/variables_screen.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/material.dart'; diff --git a/example/lib/splash/routes.dart b/example/lib/splash/routes.dart index 0085539..4e39d64 100644 --- a/example/lib/splash/routes.dart +++ b/example/lib/splash/routes.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:explorator_example/splash/splash_screen.dart'; diff --git a/example/lib/splash/splash_screen.dart b/example/lib/splash/splash_screen.dart index e536fe2..8d46ab2 100644 --- a/example/lib/splash/splash_screen.dart +++ b/example/lib/splash/splash_screen.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/material.dart'; diff --git a/example/pubspec.lock b/example/pubspec.lock index 9239418..c88a2c6 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -21,26 +21,26 @@ packages: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" build: dependency: transitive description: @@ -101,26 +101,34 @@ packages: dependency: transitive description: name: built_value - sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 url: "https://pub.dev" source: hosted - version: "8.9.3" + version: "8.9.5" catalyst_builder: - dependency: "direct main" + dependency: "direct dev" description: name: catalyst_builder - sha256: "9727e5f63174dd0bdb2aa215a0d19269c4428f4df0611f8607cb4b7fd1126aeb" + sha256: ec82d1e6164fd6b4e9488ec72d8fd4d47b06900fdc4fefa7de463c1e03b32b7b url: "https://pub.dev" source: hosted - version: "4.1.0" + version: "5.0.0-dev.1" + catalyst_builder_contracts: + dependency: "direct main" + description: + name: catalyst_builder_contracts + sha256: "70c5279d1b9bf4976290ccdf327a2126c062f84ca572f30279e819aa8442afd6" + url: "https://pub.dev" + source: hosted + version: "2.0.0-dev.1" characters: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" checked_yaml: dependency: transitive description: @@ -133,10 +141,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -149,10 +157,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" convert: dependency: transitive description: @@ -191,15 +199,15 @@ packages: path: ".." relative: true source: path - version: "1.2.0" + version: "2.0.0-dev.1" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" file: dependency: transitive description: @@ -225,17 +233,17 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "5.0.0" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" flutter_web_plugins: - dependency: transitive + dependency: "direct main" description: flutter source: sdk version: "0.0.0" @@ -299,10 +307,10 @@ packages: dependency: transitive description: name: js - sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" url: "https://pub.dev" source: hosted - version: "0.7.1" + version: "0.7.2" json_annotation: dependency: transitive description: @@ -315,18 +323,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -339,10 +347,10 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "5.1.1" logging: dependency: transitive description: @@ -355,10 +363,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -371,10 +379,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -395,18 +403,18 @@ packages: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" path: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" pool: dependency: transitive description: @@ -419,10 +427,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" pubspec_parse: dependency: transitive description: @@ -464,26 +472,26 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -496,26 +504,26 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" timing: dependency: transitive description: @@ -532,14 +540,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - url_strategy: - dependency: "direct main" - description: - name: url_strategy - sha256: "42b68b42a9864c4d710401add17ad06e28f1c1d5500c93b98c431f6b0ea4ab87" - url: "https://pub.dev" - source: hosted - version: "0.2.0" vector_math: dependency: transitive description: @@ -552,10 +552,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" watcher: dependency: transitive description: @@ -568,10 +568,10 @@ packages: dependency: transitive description: name: web - sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web_socket: dependency: transitive description: @@ -597,5 +597,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.6.0 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index a84b05d..a3bdbd4 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=2.18.6 <3.0.0' + sdk: ^3.6.0 # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -31,16 +31,16 @@ environment: dependencies: flutter: sdk: flutter - + flutter_web_plugins: + sdk: flutter # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.2 - catalyst_builder: ^4.1.0 + cupertino_icons: ^1.0.8 + catalyst_builder_contracts: ^2.0.0-dev.1 explorator: path: .. build_runner: ^2.3.3 - url_strategy: ^0.2.0 dev_dependencies: flutter_test: @@ -51,7 +51,8 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^5.0.0 + catalyst_builder: ^5.0.0-dev.1 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -93,6 +94,4 @@ flutter: # weight: 700 # # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages - -catalyst_builder: { cacheDir: '.cache/catalyst_builder' } \ No newline at end of file + # see https://flutter.dev/custom-fonts/#from-packages \ No newline at end of file diff --git a/lib/explorator.catalyst_builder.plugin.g.dart b/lib/explorator.catalyst_builder.plugin.g.dart new file mode 100644 index 0000000..8ed8a54 --- /dev/null +++ b/lib/explorator.catalyst_builder.plugin.g.dart @@ -0,0 +1,54 @@ +// ignore_for_file: prefer_relative_imports, public_member_api_docs, implementation_imports +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart' + as _i1; +import 'package:explorator/src/route_matcher.dart' as _i4; +import 'package:explorator/src/route_resolver.dart' as _i3; +import 'package:explorator/src/routing.dart' as _i2; + +class Explorator implements _i1.ServiceProviderPlugin { + @override + Map provideKnownServices(_i1.ServiceProvider p) { + return { + _i2.Routing: _i1.ServiceDescriptor( + const _i1.Service(exposeAs: _i2.Routing), + () => _i2.Routing( + navigatorKey: p.resolveOrGetParameter(_i2.Routing, 'navigatorKey'), + ), + ), + _i3.RouteResolver: _i1.ServiceDescriptor( + const _i1.Service(), + () => _i3.RouteResolver( + p.resolveOrGetParameter(_i3.RouteResolver, '_routeMatcher'), + p.resolveOrGetParameter(_i3.RouteResolver, '_routeBuilder'), + p.resolveOrGetParameter(_i3.RouteResolver, '_serviceProvider'), + ), + ), + _i4.RouteMatcher: _i1.ServiceDescriptor( + const _i1.Service(), + () => _i4.RouteMatcher(p.resolveByTag(#routeProvider).cast()), + ), + }; + } + + @override + Map provideExposes() { + return {_i2.Routing: _i2.Routing}; + } + + @override + List providePreloadedTypes() { + return []; + } + + @override + Map> provideServiceTags() { + return >{}; + } +} + +extension ExploratorExtension on _i1.ServiceProvider { + void useExplorator() { + applyPlugin(Explorator()); + } +} diff --git a/lib/explorator.dart b/lib/explorator.dart index 2977503..88867df 100644 --- a/lib/explorator.dart +++ b/lib/explorator.dart @@ -1,5 +1,8 @@ library explorator; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; + +export 'explorator.catalyst_builder.plugin.g.dart'; export 'src/exception/unbalanced_curly_braces_exception.dart'; export 'src/exception/unexpected_char_exception.dart'; export 'src/extensions.dart'; @@ -12,3 +15,6 @@ export 'src/route_matcher.dart'; export 'src/route_provider.dart'; export 'src/route_resolver.dart'; export 'src/routing.dart'; + +@GenerateServiceProviderPlugin(pluginClassName: 'Explorator') +void _() {} // ignore: unused_element diff --git a/lib/src/extensions.dart b/lib/src/extensions.dart index 0a24c84..5cd2c3b 100644 --- a/lib/src/extensions.dart +++ b/lib/src/extensions.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/widgets.dart'; @@ -8,7 +8,7 @@ extension ServiceProviderExtension on ServiceProvider { /// The [routeBuilder] is used to construct the [Route] instance. /// The [navigatorKey] is necessary to navigate using the [Routing] class. /// If the [navigatorKey] is null, a new key will be created and registered. - void useExplorator({ + void setupExplorator({ RouteBuilder? routeBuilder, GlobalKey? navigatorKey, }) { @@ -17,7 +17,6 @@ extension ServiceProviderExtension on ServiceProvider { _addServiceProvider(); _addRouteBuilder(routeBuilder); _addNavigatorKey(navigatorKey ?? GlobalKey()); - _addRouting(); } void _addServiceProvider() { @@ -55,13 +54,4 @@ extension ServiceProviderExtension on ServiceProvider { ), ); } - - void _addRouting() { - if (has(Routing)) return; - - (this as ServiceRegistry).register( - (p) => Routing(navigatorKey: p.resolve>()), - const Service(exposeAs: Routing, lifetime: ServiceLifetime.singleton), - ); - } } diff --git a/lib/src/registered_route.dart b/lib/src/registered_route.dart index 5c9a8ed..6d23c60 100644 --- a/lib/src/registered_route.dart +++ b/lib/src/registered_route.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:flutter/widgets.dart'; import 'route_expression_builder.dart'; diff --git a/lib/src/route_matcher.dart b/lib/src/route_matcher.dart index b61b5ac..bbe1bf5 100644 --- a/lib/src/route_matcher.dart +++ b/lib/src/route_matcher.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; /// The RouteMatcher is used to match raw paths (/books/1234) against the diff --git a/lib/src/route_resolver.dart b/lib/src/route_resolver.dart index d782bff..c3d9bc7 100644 --- a/lib/src/route_resolver.dart +++ b/lib/src/route_resolver.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/widgets.dart'; diff --git a/lib/src/routing.dart b/lib/src/routing.dart index 32eb2e7..29087e0 100644 --- a/lib/src/routing.dart +++ b/lib/src/routing.dart @@ -1,6 +1,8 @@ +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:flutter/widgets.dart'; /// Provides logic for routing +@Service(exposeAs: Routing, lifetime: ServiceLifetime.singleton) class Routing { final GlobalKey _navigatorKey; diff --git a/pubspec.yaml b/pubspec.yaml index 56e4020..9542dd0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,20 +1,21 @@ name: explorator description: A routing system which fits perfectly between catalyst_builder and the flutter router. -version: 1.2.0 +version: 2.0.0-dev.1 repository: https://github.com/mintware-de/explorator environment: - sdk: '>=2.18.6 <4.0.0' - flutter: ">=1.17.0" + sdk: ^3.6.0 + flutter: '>=3.0.0' dependencies: - catalyst_builder: '>=3.2.2 <5.0.0' + catalyst_builder_contracts: ^2.0.0-dev.1 flutter: sdk: flutter mockito: ^5.0.0 dev_dependencies: - flutter_lints: ^2.0.0 + flutter_lints: ^5.0.0 build_runner: ^2.2.0 test: ^1.22.1 + catalyst_builder: ^5.0.0-dev.1 diff --git a/run_tests.sh b/run_tests.sh index c4de963..4a20b21 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -1,4 +1,7 @@ #!/bin/sh -flutter pub run build_runner build --delete-conflicting-outputs +rm -rf .dart_tool +rm lib/explorator.catalyst_builder.plugin.g.dart +dart run build_runner build --delete-conflicting-outputs flutter test --coverage +lcov --remove coverage/lcov.info 'lib/explorator.dart' 'lib/explorator.catalyst_builder.plugin.g.dart' -o coverage/lcov.info genhtml ./coverage/lcov.info -o ./coverage/html diff --git a/test/mocks.dart b/test/mocks.dart index 6049d0f..700c788 100644 --- a/test/mocks.dart +++ b/test/mocks.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/cupertino.dart'; import 'package:mockito/annotations.dart'; @@ -57,4 +57,20 @@ class ServiceProviderForTest ]) { throw UnimplementedError(); } + + @override + void applyPlugin(ServiceProviderPlugin plugin) { + throw UnimplementedError(); + } + + @override + T resolveOrGetParameter(Type requiredBy, String param, + [String? parameter]) { + throw UnimplementedError(); + } + + @override + T? tryResolveOrGetParameter(String parameter) { + throw UnimplementedError(); + } } diff --git a/test/provider_extension_test.dart b/test/provider_extension_test.dart index 0e91d0a..42f55e5 100644 --- a/test/provider_extension_test.dart +++ b/test/provider_extension_test.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/cupertino.dart'; import 'package:mockito/mockito.dart'; @@ -29,10 +29,10 @@ void main() { when(mockServiceProvider.has(Routing)).thenReturn(routing); } - test('useExplorator register the service provider itself', () { + test('setupExplorator register the service provider itself', () { activateKnownServices(serviceProvider: false); - mockServiceProvider.useExplorator(); + mockServiceProvider.setupExplorator(); verify(mockServiceProvider.has(ServiceProvider)); var captured = verify(mockServiceProvider.register( @@ -44,11 +44,11 @@ void main() { expect(captured.captured[1], const TypeMatcher()); }); - test('useExplorator register route builder', () { + test('setupExplorator register route builder', () { activateKnownServices(routeBuilder: false); var routeBuilder = MaterialRouteBuilder(); - mockServiceProvider.useExplorator(routeBuilder: routeBuilder); + mockServiceProvider.setupExplorator(routeBuilder: routeBuilder); verify(mockServiceProvider.has(RouteBuilder)); var captured = verify( @@ -62,11 +62,11 @@ void main() { expect(captured.captured[1], const TypeMatcher()); }); - test('useExplorator register a global key for the navigator state', () { + test('setupExplorator register a global key for the navigator state', () { activateKnownServices(navigatorKey: false); var navigatorKey = GlobalKey(); - mockServiceProvider.useExplorator(navigatorKey: navigatorKey); + mockServiceProvider.setupExplorator(navigatorKey: navigatorKey); verify(mockServiceProvider.has(GlobalKey)); var captured = verify( @@ -82,31 +82,5 @@ void main() { ); expect(captured.captured[1], const TypeMatcher()); }); - - test('useExplorator register the routing class', () { - activateKnownServices(routing: false); - - when(mockServiceProvider.noSuchMethod(Invocation.genericMethod( - #resolve, - [GlobalKey], - [], - ))).thenReturn(MockNavigatorKey()); - - mockServiceProvider.useExplorator(); - verify(mockServiceProvider.has(Routing)); - - var captured = verify( - mockServiceProvider.register( - captureAny, - captureAny, - ), - ); - - expect( - captured.captured[0](mockServiceProvider), - const TypeMatcher(), - ); - expect(captured.captured[1], const TypeMatcher()); - }); }); } diff --git a/test/route_resolver_test.dart b/test/route_resolver_test.dart index cd8d760..b844da2 100644 --- a/test/route_resolver_test.dart +++ b/test/route_resolver_test.dart @@ -1,4 +1,4 @@ -import 'package:catalyst_builder/catalyst_builder.dart'; +import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/widgets.dart'; import 'package:mockito/mockito.dart'; From ae0fdd48627cb8eb6fd2b5e696bf705bb0f708b6 Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Thu, 27 Mar 2025 09:53:07 +0100 Subject: [PATCH 2/8] fix: update quick-start.md --- doc/quick-start.md | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/doc/quick-start.md b/doc/quick-start.md index 2bbb923..91cb91f 100644 --- a/doc/quick-start.md +++ b/doc/quick-start.md @@ -3,22 +3,6 @@ - Follow the setup steps for [catalyst_builder](https://pub.dev/packages/catalyst_builder). - Follow the setup steps for [explorator](https://pub.dev/packages/explorator/install). -### Update the build.yaml - -Make sure that you set includePackageDependencies to true in the build.yaml: - -```yaml -# build.yaml -targets: - $default: - auto_apply_builders: true - builders: - catalyst_builder|buildServiceProvider: - options: - providerClassName: 'DefaultServiceProvider' - includePackageDependencies: true -``` - ### Register the RouteResolver ```dart @@ -28,7 +12,8 @@ void main() { var provider = DefaultServiceProvider(); provider // Extension method from the explorator package - ..useExplorator( + ..useExplorator() + ..setupExplorator( routeBuilder: MaterialRouteBuilder(), ) ..boot(); From 947cc0f1386be3a9c680095a1005a37ab965f6af Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Tue, 15 Apr 2025 07:59:31 +0200 Subject: [PATCH 3/8] change: Upgrade to catalyst_builder ^5.0.0-rc.1 --- CHANGELOG.md | 6 ++++ UPGRADE.md | 10 +++--- doc/quick-start.md | 31 +++++++++---------- doc/under-the-hood.md | 18 +++++------ example/lib/main.dart | 24 +++++++------- example/pubspec.lock | 12 +++---- example/pubspec.yaml | 4 +-- lib/explorator.catalyst_builder.plugin.g.dart | 18 ++++++----- lib/explorator.dart | 2 +- lib/src/extensions.dart | 8 ++--- lib/src/route_resolver.dart | 14 +++------ pubspec.yaml | 6 ++-- test/mocks.dart | 10 +++--- test/provider_extension_test.dart | 10 +++--- test/route_resolver_test.dart | 4 +-- 15 files changed, 92 insertions(+), 85 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca14458..e027ba8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.0.0-rc.1 + +### Breaking Changes + +- `catalyst_builder: ^5.0.0-rc.1` is required + ## 2.0.0-dev.1 ### Breaking Changes diff --git a/UPGRADE.md b/UPGRADE.md index c59ffe6..fe27391 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -8,11 +8,12 @@ Update catalyst_builder to ^5.0.0 Update your code: ```diff - @GenerateServiceProvider() void main() { // Create an instance of the service provider - var provider = DefaultServiceProvider(); - provider +- var provider = DefaultServiceProvider(); +- provider ++ var container = ServiceContainer(); ++ container // Extension method from the explorator package ..useExplorator( - routeBuilder: MaterialRouteBuilder(), @@ -22,6 +23,7 @@ Update your code: + ) ..boot(); // Run the app - runApp(MyApp(provider)); +- runApp(MyApp(provider)); ++ runApp(MyApp(container)); } ``` diff --git a/doc/quick-start.md b/doc/quick-start.md index 91cb91f..af138ae 100644 --- a/doc/quick-start.md +++ b/doc/quick-start.md @@ -6,11 +6,10 @@ ### Register the RouteResolver ```dart -@GenerateServiceProvider() void main() { - // Create an instance of the service provider - var provider = DefaultServiceProvider(); - provider + // Create an instance of the service container + var container = ServiceContainer(); + container // Extension method from the explorator package ..useExplorator() ..setupExplorator( @@ -18,15 +17,15 @@ void main() { ) ..boot(); // Run the app - runApp(MyApp(provider)); + runApp(MyApp(container)); } class MyApp extends StatelessWidget { - /// Inject the provider - final ServiceProvider _provider; + /// Inject the container + final AbstractServiceContainer _container; - const MyApp(this._provider, {super.key}); + const MyApp(this._container, {super.key}); @override Widget build(BuildContext context) { @@ -36,11 +35,11 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.blue, ), // Use the navigator key - navigatorKey: _provider.resolve>(), + navigatorKey: _container.resolve>(), // Set the initial route. initialRoute: '/home/HelloFlutter', // Use the RouteResolver for generating routes - onGenerateRoute: _provider + onGenerateRoute: _container .resolve() .resolveRoute, ); @@ -63,10 +62,10 @@ class HomeRouteProvider implements RouteProvider { // Return your routes RegisteredRoute( path: r'/home/{name}', - // The builder should return a function that accepts a provider (ServiceProvider from above) - // and returns a WidgetBuilder. Since we have the provider, we can use DI to get the instance + // The builder should return a function that accepts a container (ServiceContainer from above) + // and returns a WidgetBuilder. Since we have the container, we can use DI to get the instance // of our widget 🙌. - builder: (provider) => (ctx) => provider.resolve(), + builder: (container) => (ctx) => container.resolve(), ) ]; } @@ -152,16 +151,16 @@ You can access path variables and query parameters when injecting the `RouteArgu ## Dev / Prod While you develop your app, you can use the following command to watch for changes and update the -routing / ServiceProvider automatically +routing / ServiceContainer automatically ```bash -flutter pub run build_runner watch --delete-conflicting-outputs +dart run build_runner watch --delete-conflicting-outputs ``` When building for production you can use this command before running `flutter build`: ```bash -flutter pub run build_runner build --delete-conflicting-outputs +dart run build_runner build --delete-conflicting-outputs ``` ## How does it work? diff --git a/doc/under-the-hood.md b/doc/under-the-hood.md index 14fa086..b779227 100644 --- a/doc/under-the-hood.md +++ b/doc/under-the-hood.md @@ -34,32 +34,32 @@ The `builder` is just a method that accepts an instance of a catalyst `ServicePr That means, we can use the given provider to resolve our `Screen/Widget n` without constructing it manually. Since the `App Routes` class is not imported anywhere (ignore generated code 😉), the coupling is not worth mentioning. -As you noted, there is a connection between `DefaultServiceProvider` (DSP) and `App Routes`. That means, that the +As you noted, there is a connection between `ServiceContainer` and `App Routes`. That means, that the `App Routes` class must be decorated with `@Service(tags: [RouteProvider.tag])`. ----- -Next step: take a look on the connection between `RouteResolver` and `RouteProvider` / `ServiceProvider`. +Next step: take a look on the connection between `RouteResolver` and `RouteProvider` / `ServiceContainer`. The [`RouteResolver`](../lib/src/route_resolver.dart) expects in the constructor a `List`. If you take a look in the code, you can see, that the constructor parameter is decorated with `@Inject(tag: RouteProvider.tag)`. -Now you can put two and two together. The `ServiceProvider` takes all services that are tagged with `RouteProvider.tag`, +Now you can put two and two together. The `ServiceContainer` takes all services that are tagged with `RouteProvider.tag`, including our `App Routes` class, and inject it as a list to the `RouteResolver`. ----- That's already most of the magic. Let's take a look how routes are resolved. -Since the `RouteResolver` is decorated with `@Service`, your `ServiceProvider` can construct this class. +Since the `RouteResolver` is decorated with `@Service`, the `ServiceContainer` can construct this class. And that's exactly what happens in this piece of code. ```dart Widget build(BuildContext context) { return MaterialApp( - // 1. We resolve the `RouteResolver` from the DSP + // 1. We resolve the `RouteResolver` from the Container // 2. Tell the Flutter router "use `resolveRoute` to generate routes" - onGenerateRoute: _provider.resolve().resolveRoute, + onGenerateRoute: _container.resolve().resolveRoute, ); } ``` @@ -69,11 +69,11 @@ The `RouteResolver.resolveRoute` looks more complicated as it's. 2. The `name` is the `path` of our `RegisteredRoute`. - The `RegisteredRoute` creates a Regex from this path. 3. Then it iterates over all `RegisteredRoute`s (passed in the constructor) and check if the `name` match against the regex. -4. If it's a match, the method extracts the path variables and creates a sub-`ServiceProvider`. - - The sub-`ServiceProvider` contains additional services: +4. If it's a match, the method extracts the path variables and creates a sub-`ServiceContainer`. + - The sub-`ServiceContainer` contains additional services: - [`RouteArguments`](../lib/src/route_arguments.dart) - `RouteSettings` -5. Using the builder from the `RegisteredRoute` to construct the widget. We pass the sub-`ServiceProvider` as the `ServiceProvider`. +5. Using the builder from the `RegisteredRoute` to construct the widget. We pass the sub-`ServiceContainer` as the `ServiceContainer`. 6. Using the `RouteBuilder` to construct and return a Flutter route. Not that complicated, right? 😅 \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index e2d84e1..680bc49 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,19 +1,21 @@ +import 'package:catalyst_builder/catalyst_builder.dart'; import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; import 'package:explorator/explorator.dart'; import 'package:flutter/material.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; -import 'main.catalyst_builder.g.dart'; +import 'main.catalyst_builder.plugin.g.dart'; -@GenerateServiceProvider( - providerClassName: 'DefaultServiceProvider', +@GenerateServiceContainerPlugin( + pluginClassName: 'AppPlugin', ) void main() { usePathUrlStrategy(); - // Create an instance of the service provider - var provider = DefaultServiceProvider(); - provider + // Create an instance of the service container + var container = ServiceContainer(); + container + ..useAppPlugin() // Extension method from the explorator package ..useExplorator() ..setupExplorator( @@ -22,14 +24,14 @@ void main() { ..boot(); // Run the app - runApp(MyApp(provider)); + runApp(MyApp(container)); } class MyApp extends StatelessWidget { /// Inject the provider - final ServiceProvider _provider; + final AbstractServiceContainer _container; - const MyApp(this._provider, {super.key}); + const MyApp(this._container, {super.key}); @override Widget build(BuildContext context) { @@ -39,11 +41,11 @@ class MyApp extends StatelessWidget { primarySwatch: Colors.blue, ), // Use the navigator key - navigatorKey: _provider.resolve>(), + navigatorKey: _container.resolve>(), // Set the initial route. initialRoute: '/', // Use the RouteResolver for generating routes - onGenerateRoute: _provider.resolve().resolveRoute, + onGenerateRoute: _container.resolve().resolveRoute, ); } } diff --git a/example/pubspec.lock b/example/pubspec.lock index c88a2c6..babbf40 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -106,21 +106,21 @@ packages: source: hosted version: "8.9.5" catalyst_builder: - dependency: "direct dev" + dependency: "direct main" description: name: catalyst_builder - sha256: ec82d1e6164fd6b4e9488ec72d8fd4d47b06900fdc4fefa7de463c1e03b32b7b + sha256: "43a2aadefb312ea174c6d7fabf206b14a1b8ef041ec207e4aadff8ac35293250" url: "https://pub.dev" source: hosted - version: "5.0.0-dev.1" + version: "5.0.0-rc.1" catalyst_builder_contracts: dependency: "direct main" description: name: catalyst_builder_contracts - sha256: "70c5279d1b9bf4976290ccdf327a2126c062f84ca572f30279e819aa8442afd6" + sha256: afa8c7c5e25c439d076675eb8ff86d2dbc5950df57ff4443b5d8f826c0261cc8 url: "https://pub.dev" source: hosted - version: "2.0.0-dev.1" + version: "2.0.0-rc.1" characters: dependency: transitive description: @@ -199,7 +199,7 @@ packages: path: ".." relative: true source: path - version: "2.0.0-dev.1" + version: "2.0.0-rc.1" fake_async: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index a3bdbd4..0b83e33 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -37,7 +37,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 - catalyst_builder_contracts: ^2.0.0-dev.1 + catalyst_builder: ^5.0.0-rc.1 + catalyst_builder_contracts: ^2.0.0-rc.1 explorator: path: .. build_runner: ^2.3.3 @@ -52,7 +53,6 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^5.0.0 - catalyst_builder: ^5.0.0-dev.1 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/lib/explorator.catalyst_builder.plugin.g.dart b/lib/explorator.catalyst_builder.plugin.g.dart index 8ed8a54..51a2d88 100644 --- a/lib/explorator.catalyst_builder.plugin.g.dart +++ b/lib/explorator.catalyst_builder.plugin.g.dart @@ -6,27 +6,29 @@ import 'package:explorator/src/route_matcher.dart' as _i4; import 'package:explorator/src/route_resolver.dart' as _i3; import 'package:explorator/src/routing.dart' as _i2; -class Explorator implements _i1.ServiceProviderPlugin { +class Explorator implements _i1.ServiceContainerPlugin { @override - Map provideKnownServices(_i1.ServiceProvider p) { + Map provideKnownServices( + _i1.AbstractServiceContainer c, + ) { return { _i2.Routing: _i1.ServiceDescriptor( const _i1.Service(exposeAs: _i2.Routing), () => _i2.Routing( - navigatorKey: p.resolveOrGetParameter(_i2.Routing, 'navigatorKey'), + navigatorKey: c.resolveOrGetParameter(_i2.Routing, 'navigatorKey'), ), ), _i3.RouteResolver: _i1.ServiceDescriptor( const _i1.Service(), () => _i3.RouteResolver( - p.resolveOrGetParameter(_i3.RouteResolver, '_routeMatcher'), - p.resolveOrGetParameter(_i3.RouteResolver, '_routeBuilder'), - p.resolveOrGetParameter(_i3.RouteResolver, '_serviceProvider'), + c.resolveOrGetParameter(_i3.RouteResolver, '_routeMatcher'), + c.resolveOrGetParameter(_i3.RouteResolver, '_routeBuilder'), + c.resolveOrGetParameter(_i3.RouteResolver, '_serviceContainer'), ), ), _i4.RouteMatcher: _i1.ServiceDescriptor( const _i1.Service(), - () => _i4.RouteMatcher(p.resolveByTag(#routeProvider).cast()), + () => _i4.RouteMatcher(c.resolveByTag(#routeProvider).cast()), ), }; } @@ -47,7 +49,7 @@ class Explorator implements _i1.ServiceProviderPlugin { } } -extension ExploratorExtension on _i1.ServiceProvider { +extension ExploratorExtension on _i1.AbstractServiceContainer { void useExplorator() { applyPlugin(Explorator()); } diff --git a/lib/explorator.dart b/lib/explorator.dart index 88867df..ee2ec31 100644 --- a/lib/explorator.dart +++ b/lib/explorator.dart @@ -16,5 +16,5 @@ export 'src/route_provider.dart'; export 'src/route_resolver.dart'; export 'src/routing.dart'; -@GenerateServiceProviderPlugin(pluginClassName: 'Explorator') +@GenerateServiceContainerPlugin(pluginClassName: 'Explorator') void _() {} // ignore: unused_element diff --git a/lib/src/extensions.dart b/lib/src/extensions.dart index 5cd2c3b..999707a 100644 --- a/lib/src/extensions.dart +++ b/lib/src/extensions.dart @@ -3,7 +3,7 @@ import 'package:explorator/explorator.dart'; import 'package:flutter/widgets.dart'; /// This extension simplifies the configuration for the explorator package. -extension ServiceProviderExtension on ServiceProvider { +extension ServiceProviderExtension on AbstractServiceContainer { /// Register necessary services for using the explorator package. /// The [routeBuilder] is used to construct the [Route] instance. /// The [navigatorKey] is necessary to navigate using the [Routing] class. @@ -20,12 +20,12 @@ extension ServiceProviderExtension on ServiceProvider { } void _addServiceProvider() { - if (has(ServiceProvider)) return; + if (has(AbstractServiceContainer)) return; - (this as ServiceRegistry).register( + (this as ServiceRegistry).register( (p) => this, const Service( - exposeAs: ServiceProvider, + exposeAs: AbstractServiceContainer, lifetime: ServiceLifetime.singleton, ), ); diff --git a/lib/src/route_resolver.dart b/lib/src/route_resolver.dart index c3d9bc7..c3c4026 100644 --- a/lib/src/route_resolver.dart +++ b/lib/src/route_resolver.dart @@ -8,14 +8,14 @@ import 'package:flutter/widgets.dart'; @Service() class RouteResolver { final RouteBuilder _routeBuilder; - final ServiceProvider _serviceProvider; + final AbstractServiceContainer _serviceContainer; final RouteMatcher _routeMatcher; /// RouteResolver constructor. RouteResolver( this._routeMatcher, this._routeBuilder, - this._serviceProvider, + this._serviceContainer, ); /// Resolve a route for the given [settings]. @@ -47,19 +47,15 @@ class RouteResolver { /// [RouteArguments] The arguments for the route which was resolved. /// This contains query parameters and path variables /// [RouteSettings] The [RouteSettings] for the resolved route. - ServiceProvider _createSubProvider( + AbstractServiceContainer _createSubProvider( RegisteredRoute route, String routeName, Map queryParameters, RouteSettings settings, ) { - var subProvider = _serviceProvider; - if (subProvider is! EnhanceableProvider) { - return subProvider; - } - + var subContainer = _serviceContainer; var pathVariables = _getPathVariables(route.expression, routeName); - return (subProvider as EnhanceableProvider).enhance( + return subContainer.enhance( services: [ LazyServiceDescriptor( (p) => RouteArguments(routeName, pathVariables, queryParameters), diff --git a/pubspec.yaml b/pubspec.yaml index 9542dd0..49b47f8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: explorator description: A routing system which fits perfectly between catalyst_builder and the flutter router. -version: 2.0.0-dev.1 +version: 2.0.0-rc.1 repository: https://github.com/mintware-de/explorator environment: @@ -8,7 +8,7 @@ environment: flutter: '>=3.0.0' dependencies: - catalyst_builder_contracts: ^2.0.0-dev.1 + catalyst_builder_contracts: ^2.0.0-rc.1 flutter: sdk: flutter mockito: ^5.0.0 @@ -17,5 +17,5 @@ dev_dependencies: flutter_lints: ^5.0.0 build_runner: ^2.2.0 test: ^1.22.1 - catalyst_builder: ^5.0.0-dev.1 + catalyst_builder: ^5.0.0-rc.1 diff --git a/test/mocks.dart b/test/mocks.dart index 700c788..02ab259 100644 --- a/test/mocks.dart +++ b/test/mocks.dart @@ -14,7 +14,7 @@ dynamic resolveMock() => false; NavigatorState, ], customMocks: [ - MockSpec(fallbackGenerators: { + MockSpec(fallbackGenerators: { #resolve: resolveMock, }), MockSpec>( @@ -24,13 +24,13 @@ dynamic resolveMock() => false; ) void main() {} -class ServiceProviderForTest - implements ServiceProvider, EnhanceableProvider, ServiceRegistry { +class ServiceContainerForTest + implements AbstractServiceContainer, ServiceRegistry { @override void boot() {} @override - ServiceProvider enhance( + AbstractServiceContainer enhance( {List services = const [], Map parameters = const {}}) => throw UnimplementedError(); @@ -59,7 +59,7 @@ class ServiceProviderForTest } @override - void applyPlugin(ServiceProviderPlugin plugin) { + void applyPlugin(ServiceContainerPlugin plugin) { throw UnimplementedError(); } diff --git a/test/provider_extension_test.dart b/test/provider_extension_test.dart index 42f55e5..b60cbc3 100644 --- a/test/provider_extension_test.dart +++ b/test/provider_extension_test.dart @@ -8,10 +8,10 @@ import 'mocks.dart'; void main() { group('Service Provider Extension', () { - late MockServiceProviderForTest mockServiceProvider; + late MockServiceContainerForTest mockServiceProvider; setUp(() { - mockServiceProvider = MockServiceProviderForTest(); + mockServiceProvider = MockServiceContainerForTest(); }); void activateKnownServices({ @@ -20,7 +20,7 @@ void main() { bool navigatorKey = true, bool routing = true, }) { - when(mockServiceProvider.has(ServiceProvider)) + when(mockServiceProvider.has(AbstractServiceContainer)) .thenReturn(serviceProvider); when(mockServiceProvider.has(RouteBuilder)) .thenReturn(routeBuilder); @@ -33,9 +33,9 @@ void main() { activateKnownServices(serviceProvider: false); mockServiceProvider.setupExplorator(); - verify(mockServiceProvider.has(ServiceProvider)); + verify(mockServiceProvider.has(AbstractServiceContainer)); - var captured = verify(mockServiceProvider.register( + var captured = verify(mockServiceProvider.register( captureAny, captureAny)); expect( captured.captured[0](mockServiceProvider), diff --git a/test/route_resolver_test.dart b/test/route_resolver_test.dart index b844da2..28a0dd6 100644 --- a/test/route_resolver_test.dart +++ b/test/route_resolver_test.dart @@ -8,7 +8,7 @@ import 'mocks.dart'; void main() { late RouteResolver resolver; - late MockServiceProviderForTest mockServiceProvider; + late MockServiceContainerForTest mockServiceProvider; late List enhancedServices; late Map enhancedParameters; late MockRouteMatcher mockRouteMatcher; @@ -18,7 +18,7 @@ void main() { enhancedParameters = {}; mockRouteMatcher = MockRouteMatcher(); - mockServiceProvider = MockServiceProviderForTest(); + mockServiceProvider = MockServiceContainerForTest(); when(mockServiceProvider.enhance( services: anyNamed('services'), parameters: anyNamed('parameters'), From 7d8ec4043f8e6ce8bee89bb4e11b2632cea015d3 Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Sun, 20 Apr 2025 13:48:30 +0200 Subject: [PATCH 4/8] change: move mockito to dev_dependencies --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index 49b47f8..d796498 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,6 @@ dependencies: catalyst_builder_contracts: ^2.0.0-rc.1 flutter: sdk: flutter - mockito: ^5.0.0 dev_dependencies: flutter_lints: ^5.0.0 @@ -19,3 +18,4 @@ dev_dependencies: test: ^1.22.1 catalyst_builder: ^5.0.0-rc.1 + mockito: ^5.0.0 From 0e636e5f8ee55e8e0c271ff2ae0cc05e5b795af2 Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Sun, 20 Apr 2025 13:50:23 +0200 Subject: [PATCH 5/8] change: Update catalyst_builder version --- example/pubspec.lock | 61 +++++++++++++++++++++----------------------- example/pubspec.yaml | 4 +-- pubspec.yaml | 5 ++-- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index babbf40..30fec5d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,18 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "76.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.3" analyzer: dependency: transitive description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "6.11.0" args: dependency: transitive description: @@ -109,18 +114,18 @@ packages: dependency: "direct main" description: name: catalyst_builder - sha256: "43a2aadefb312ea174c6d7fabf206b14a1b8ef041ec207e4aadff8ac35293250" + sha256: "2308289dcb836c775b366e0bc6611fa8a3255758e72e388c9b83285161fc27fa" url: "https://pub.dev" source: hosted - version: "5.0.0-rc.1" + version: "5.0.0" catalyst_builder_contracts: dependency: "direct main" description: name: catalyst_builder_contracts - sha256: afa8c7c5e25c439d076675eb8ff86d2dbc5950df57ff4443b5d8f826c0261cc8 + sha256: "944a4ab7ecf1c8f1d6766bde78236e334c6f1ba7b472c30c811b58daac2dd9ec" url: "https://pub.dev" source: hosted - version: "2.0.0-rc.1" + version: "2.0.0" characters: dependency: transitive description: @@ -186,20 +191,20 @@ packages: source: hosted version: "1.0.8" dart_style: - dependency: transitive + dependency: "direct overridden" description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "2.3.8" explorator: dependency: "direct main" description: path: ".." relative: true source: path - version: "2.0.0-rc.1" + version: "2.0.0" fake_async: dependency: transitive description: @@ -359,6 +364,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + macros: + dependency: transitive + description: + name: macros + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + url: "https://pub.dev" + source: hosted + version: "0.1.3-main.0" matcher: dependency: transitive description: @@ -391,14 +404,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" - mockito: - dependency: transitive - description: - name: mockito - sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6 - url: "https://pub.dev" - source: hosted - version: "5.4.5" package_config: dependency: transitive description: @@ -460,14 +465,6 @@ packages: description: flutter source: sdk version: "0.0.0" - source_gen: - dependency: transitive - description: - name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" - url: "https://pub.dev" - source: hosted - version: "2.0.0" source_span: dependency: transitive description: @@ -576,18 +573,18 @@ packages: dependency: transitive description: name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + sha256: bfe6f435f6ec49cb6c01da1e275ae4228719e59a6b067048c51e72d9d63bcc4b url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "1.0.0" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" yaml: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 0b83e33..39d80bd 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -37,8 +37,8 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 - catalyst_builder: ^5.0.0-rc.1 - catalyst_builder_contracts: ^2.0.0-rc.1 + catalyst_builder: ^5.0.0 + catalyst_builder_contracts: ^2.0.0 explorator: path: .. build_runner: ^2.3.3 diff --git a/pubspec.yaml b/pubspec.yaml index d796498..a4509bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -8,7 +8,7 @@ environment: flutter: '>=3.0.0' dependencies: - catalyst_builder_contracts: ^2.0.0-rc.1 + catalyst_builder_contracts: ^2.0.0 flutter: sdk: flutter @@ -16,6 +16,5 @@ dev_dependencies: flutter_lints: ^5.0.0 build_runner: ^2.2.0 test: ^1.22.1 - catalyst_builder: ^5.0.0-rc.1 - + catalyst_builder: ^5.0.0 mockito: ^5.0.0 From f40a25845e029025dadaddd36e0766eca99ae7c5 Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Sun, 20 Apr 2025 13:50:38 +0200 Subject: [PATCH 6/8] fix: generate dependency override files --- .github/workflows/flutter.yml | 4 ++-- .gitignore | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/flutter.yml b/.github/workflows/flutter.yml index 4ad3644..7aca022 100644 --- a/.github/workflows/flutter.yml +++ b/.github/workflows/flutter.yml @@ -16,12 +16,12 @@ jobs: with: flutter-version: '3.27.3' channel: 'stable' - - name: Setup LCOV uses: hrishikesh-kadam/setup-lcov@v1 + - name: Override dependencies + run: "echo 'dependency_overrides: { dart_style: ^2.0.1 }' > pubspec_overrides.yaml && cp pubspec_overrides.yaml example/" - name: Install dependencies run: dart pub get - - name: Verify formatting run: dart format --output=none --set-exit-if-changed lib diff --git a/.gitignore b/.gitignore index c0167fc..e486243 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ migrate_working_dir/ build/ /coverage/ /test/*.mocks.dart +pubspec_overrides.yaml \ No newline at end of file From eda1ae8fe3c471e77b6743b08113f09e5ae5d00b Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Sun, 20 Apr 2025 13:52:32 +0200 Subject: [PATCH 7/8] fix: remove libary name --- lib/explorator.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/explorator.dart b/lib/explorator.dart index ee2ec31..be22808 100644 --- a/lib/explorator.dart +++ b/lib/explorator.dart @@ -1,4 +1,4 @@ -library explorator; +library; import 'package:catalyst_builder_contracts/catalyst_builder_contracts.dart'; From 91c21431ea0fdc782e94ee0ddaac454a3c90ee8b Mon Sep 17 00:00:00 2001 From: Julian Finkler Date: Sun, 20 Apr 2025 13:50:49 +0200 Subject: [PATCH 8/8] release: Prepare release v2.0.0 --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e027ba8..a0f0bd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2.0.0 + +### Breaking Changes + +- `catalyst_builder: ^5.0.0` is required +- Check [UPGRADE.md](UPGRADE.md) + ## 2.0.0-rc.1 ### Breaking Changes diff --git a/pubspec.yaml b/pubspec.yaml index a4509bb..67c1060 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: explorator description: A routing system which fits perfectly between catalyst_builder and the flutter router. -version: 2.0.0-rc.1 +version: 2.0.0 repository: https://github.com/mintware-de/explorator environment: