diff --git a/.gitignore b/.gitignore
index 526da15..49df337 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,4 @@
# Files and directories created by pub
.dart_tool/
.packages
-build/
-pubspec.lock
\ No newline at end of file
+build/
\ No newline at end of file
diff --git a/README.md b/README.md
index bcfea09..07a8bd7 100644
--- a/README.md
+++ b/README.md
@@ -1,181 +1,47 @@
-# data_repository
+
+

+
Data Repository
+
A generic repository that serves as a crucial abstraction layer within the Flutter News App Full Source Code Toolkit.
+
-
-[](https://pub.dev/packages/very_good_analysis)
-[](https://polyformproject.org/licenses/free-trial/1.0.0)
+
+
+
+
+
-A generic repository that acts as an abstraction layer over an `DataClient`. It provides standard data access methods (CRUD, querying) for a specific data type `T`, delegating operations to the injected client.
+This `data_repository` package serves as a crucial abstraction layer within the [**Flutter News App Full Source Code Toolkit**](https://github.com/flutter-news-app-full-source-code). It provides a generic, type-safe interface for interacting with data sources, decoupling business logic from the underlying data client implementations. By mirroring the data access methods of a `DataClient`, it ensures consistency and simplifies data operations across the Flutter mobile app, web dashboard, and Dart Frog backend API.
-## Getting Started
+## ⭐ Feature Showcase: Robust Data Access & Management
-Add the dependency to your `pubspec.yaml`:
+This package offers a comprehensive set of features for managing data entities.
-```yaml
-dependencies:
- data_repository:
- git:
- url: https://github.com/flutter-news-app-full-source-code/data-repository.git
- # Optionally specify a ref (branch, tag, commit hash)
- # ref: main
-```
+
+🧱 Core Functionality
-You will also need to include the `data_client` package, which this repository depends on, and potentially `http_client` if you need to handle its specific exceptions.
+### 🚀 Generic Data Operations
+- **`DataRepository`:** A generic class that provides a consistent interface for CRUD (Create, Read, Update, Delete) operations, querying, counting, and aggregation for any data type `T`.
+- **Abstraction over `DataClient`:** Hides the complexities of `DataClient` implementations and `SuccessApiResponse` structures, offering a clean, business-logic-focused API.
-```yaml
-dependencies:
- data_client:
- git:
- url: https://github.com/flutter-news-app-full-source-code/data-client.git
- http_client: # Needed for handling specific exceptions
- git:
- url: https://github.com/flutter-news-app-full-source-code/http-client.git
-```
+### 🔐 User Scoping & Permissions
+- **Optional `userId` Parameter:** All data access methods support an optional `userId` parameter, enabling seamless management of both user-specific and global resources.
-## Features
+### 🔍 Advanced Querying
+- **`readAll` Method:** A powerful method that returns a `Future>`, supporting rich filtering, multi-field sorting, and cursor-based pagination, compatible with modern NoSQL database capabilities.
+- **`count` and `aggregate`:** Efficient methods for counting documents and executing complex data aggregation pipelines directly on the data source.
-* **Abstraction:** Provides a clean interface for data operations, hiding the underlying `DataClient` implementation details and the `SuccessApiResponse` envelope structure.
-* **User Scoping:** Supports optional user-scoped data operations via a `userId` parameter in all data access methods, allowing for both user-specific and global resource management.
-* **CRUD Operations:** Supports standard Create, Read (`Future`), Update (`Future`), and Delete (`Future`) operations for a generic type `T`. These methods now accept an optional `String? userId`.
-* **Advanced Querying:** A single `readAll` method returns a `Future>` and supports rich filtering, multi-field sorting, and cursor-based pagination, aligning with modern NoSQL database capabilities.
-* **Error Propagation:** Catches and re-throws exceptions (like `HttpException` subtypes or `FormatException`) from the data client layer, allowing higher layers to handle them appropriately.
-* **Counting and Aggregation:** Exposes `count` for efficient document
- counting and `aggregate` for executing complex data pipelines.
-* **Reactive Updates:** Provides a stream, `entityUpdated`, that emits the
- `Type` of the modified entity whenever a CUD (Create, Update, Delete)
- operation is successfully completed. This allows different parts of an
- application to react to data changes for specific types in real-time.
-* **Dependency Injection:** Designed to receive an `DataClient` instance via its constructor.
+### 🔄 Reactive Updates
+- **`entityUpdated` Stream:** A broadcast stream that emits the `Type` of a data entity whenever a Create, Update, or Delete operation is successfully completed. This allows other parts of the application to react to data changes in real-time, facilitating dynamic UI updates and side effects.
-## Usage
+### 🛡️ Robust Error Handling
+- **Exception Propagation:** Catches and re-throws standardized exceptions (like `HttpException` subtypes or `FormatException`) from the underlying data client layer. This ensures predictable error handling and allows higher layers (e.g., BLoCs, API route handlers) to implement specific error recovery logic.
-Instantiate the repository by providing an implementation of `DataClient`.
+### 💉 Dependency Injection Ready
+- **Constructor Injection:** Designed to receive an `DataClient` instance via its constructor, promoting loose coupling and testability.
-```dart
-import 'package:data_client/data_client.dart';
-import 'package:data_repository/data_repository.dart';
-import 'package:core/core.dart'; // For exception handling
-
-// Define your data model
-class MyData {
- final String id;
- final String name;
-
- MyData({required this.id, required this.name});
-
- // Add fromJson/toJson if needed by your client implementation
-}
-
-// Assume you have an implementation of DataClient
-// (e.g., HttpDataClient, MockDataClient, etc.)
-late DataClient myDataClient; // Initialize this appropriately
-
-// Create the repository instance
-final myDataRepository = DataRepository(dataClient: myDataClient);
-
-// Use the repository methods
-Future exampleUsage() async {
- const userId = 'example-user-id'; // Example user ID
-
- try {
- // Create an item for a specific user
- final newItem = MyData(id: 'temp', name: 'New Item');
- final createdItem = await myDataRepository.create(item: newItem, userId: userId);
- print('Created: ${createdItem.id}, ${createdItem.name} for user $userId');
-
- // Read an item for a specific user
- final readItem = await myDataRepository.read(id: createdItem.id, userId: userId);
- print('Read: ${readItem.id}, ${readItem.name} for user $userId');
-
- // Read all items for a user with pagination
- final allItemsResponse = await myDataRepository.readAll(
- userId: userId,
- pagination: PaginationOptions(limit: 10),
- );
- print('Read ${allItemsResponse.items.length} items for user $userId.');
- if (allItemsResponse.nextCursor != null) {
- print('More items available (nextCursor: ${allItemsResponse.nextCursor})');
- }
-
- // Query items for a user with filtering and sorting
- final filter = {'status': 'published'};
- final sort = [SortOption('publishDate', SortOrder.desc)];
- final queriedItemsResponse = await myDataRepository.readAll(
- userId: userId,
- filter: filter,
- sort: sort,
- );
- print('Found ${queriedItemsResponse.items.length} items matching filter for user $userId.');
-
- // Count items for a user
- final count = await myDataRepository.count(
- userId: userId,
- filter: {'status': 'published'},
- );
- print('User has $count published items.');
-
- // Aggregate data for a user
- final pipeline = [
- {
- r'$group': {'_id': r'$category', 'total': {r'$sum': 1}},
- },
- {
- r'$sort': {'total': -1},
- },
- ];
- final aggregateResult =
- await myDataRepository.aggregate(pipeline: pipeline, userId: userId);
- print('Aggregation result: $aggregateResult');
-
- // Update an item for a specific user
- final updatedItemData = MyData(id: createdItem.id, name: 'Updated Name');
- final updatedItem = await myDataRepository.update(id: createdItem.id, item: updatedItemData, userId: userId);
- print('Updated: ${updatedItem.id}, ${updatedItem.name} for user $userId');
-
- // Example of a global read (without userId)
- final PaginatedResponse globalItemsResponse =
- await myDataRepository.readAll(pagination: PaginationOptions(limit: 5));
- print('Read ${globalItemsResponse.items.length} global items.');
-
- // Listen for data changes for a specific type
- final subscription = myDataRepository.entityUpdated
- .where((type) => type == MyData)
- .listen((_) {
- print('A MyData entity was created, updated, or deleted. Refreshing UI...');
- // Trigger a refresh of the data or UI components
- });
-
- // ... perform more operations ...
-
- // Don't forget to cancel the subscription when done
- await subscription.cancel();
-
- // And dispose the repository when it's no longer needed
- myDataRepository.dispose();
-
-
- } on HttpException catch (e) {
- // Handle specific HTTP errors from the client
- // Note: HttpException subtypes from core do not have statusCode
- print('HTTP Error: ${e.message}');
- if (e is NotFoundException) {
- print('Item not found.');
- } else if (e is ForbiddenException) {
- print('Permission denied for this operation.');
- }
- } on FormatException catch (e) {
- // Handle data format errors during deserialization
- print('Data Format Error: $e');
- } catch (e) {
- // Handle other unexpected errors
- print('An unexpected error occurred: $e');
- }
-}
-
-```
+> **💡 Your Advantage:** You get a meticulously designed, production-quality data access layer that simplifies interactions with your data sources, ensures consistency, and provides robust error handling and reactive capabilities. This package accelerates development by providing a solid foundation for data management.
+
## 🔑 Licensing
-
-This package is source-available and licensed under the [PolyForm Free Trial 1.0.0](LICENSE). Please review the terms before use.
-
-For commercial licensing options that grant the right to build and distribute unlimited applications, please visit the main [**Flutter News App - Full Source Code Toolkit**](https://github.com/flutter-news-app-full-source-code) organization.
+This `data_repository` package is an integral part of the [**Flutter News App Full Source Code Toolkit**](https://github.com/flutter-news-app-full-source-code). For comprehensive details regarding licensing, including trial and commercial options for the entire toolkit, please refer to the main toolkit organization page.
diff --git a/pubspec.lock b/pubspec.lock
new file mode 100644
index 0000000..6109f96
--- /dev/null
+++ b/pubspec.lock
@@ -0,0 +1,463 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ _fe_analyzer_shared:
+ dependency: transitive
+ description:
+ name: _fe_analyzer_shared
+ sha256: dd3d2ad434b9510001d089e8de7556d50c834481b9abc2891a0184a8493a19dc
+ url: "https://pub.dev"
+ source: hosted
+ version: "89.0.0"
+ analyzer:
+ dependency: transitive
+ description:
+ name: analyzer
+ sha256: c22b6e7726d1f9e5db58c7251606076a71ca0dbcf76116675edfadbec0c9e875
+ url: "https://pub.dev"
+ source: hosted
+ version: "8.2.0"
+ args:
+ dependency: transitive
+ description:
+ name: args
+ sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.7.0"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.13.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ cli_config:
+ dependency: transitive
+ description:
+ name: cli_config
+ sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.0"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.19.1"
+ convert:
+ dependency: transitive
+ description:
+ name: convert
+ sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ core:
+ dependency: "direct main"
+ description:
+ path: "."
+ ref: "01cdfac43da99df1bfb7e5ed902c9f52fa55f911"
+ resolved-ref: "01cdfac43da99df1bfb7e5ed902c9f52fa55f911"
+ url: "https://github.com/flutter-news-app-full-source-code/core.git"
+ source: git
+ version: "0.0.0"
+ coverage:
+ dependency: transitive
+ description:
+ name: coverage
+ sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.15.0"
+ crypto:
+ dependency: transitive
+ description:
+ name: crypto
+ sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.6"
+ data_client:
+ dependency: "direct main"
+ description:
+ path: "."
+ ref: de1b23d1ce85bac1b12fd84667d9def043531abc
+ resolved-ref: de1b23d1ce85bac1b12fd84667d9def043531abc
+ url: "https://github.com/flutter-news-app-full-source-code/data-client.git"
+ source: git
+ version: "0.0.0"
+ equatable:
+ dependency: transitive
+ description:
+ name: equatable
+ sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.7"
+ file:
+ dependency: transitive
+ description:
+ name: file
+ sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.0.1"
+ fixnum:
+ dependency: transitive
+ description:
+ name: fixnum
+ sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ frontend_server_client:
+ dependency: transitive
+ description:
+ name: frontend_server_client
+ sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.0"
+ glob:
+ dependency: transitive
+ description:
+ name: glob
+ sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.3"
+ http_multi_server:
+ dependency: transitive
+ description:
+ name: http_multi_server
+ sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.2.2"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.1.2"
+ io:
+ dependency: transitive
+ description:
+ name: io
+ sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.5"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.2"
+ json_annotation:
+ dependency: transitive
+ description:
+ name: json_annotation
+ sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.9.0"
+ logging:
+ dependency: transitive
+ description:
+ name: logging
+ sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.17"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.17.0"
+ mime:
+ dependency: transitive
+ description:
+ name: mime
+ sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.0"
+ mocktail:
+ dependency: "direct dev"
+ description:
+ name: mocktail
+ sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.4"
+ node_preamble:
+ dependency: transitive
+ description:
+ name: node_preamble
+ sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.2"
+ package_config:
+ dependency: transitive
+ description:
+ name: package_config
+ sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.1"
+ pool:
+ dependency: transitive
+ description:
+ name: pool
+ sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.5.2"
+ pub_semver:
+ dependency: transitive
+ description:
+ name: pub_semver
+ sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ shelf:
+ dependency: transitive
+ description:
+ name: shelf
+ sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.4.2"
+ shelf_packages_handler:
+ dependency: transitive
+ description:
+ name: shelf_packages_handler
+ sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.2"
+ shelf_static:
+ dependency: transitive
+ description:
+ name: shelf_static
+ sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.3"
+ shelf_web_socket:
+ dependency: transitive
+ description:
+ name: shelf_web_socket
+ sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.0"
+ source_map_stack_trace:
+ dependency: transitive
+ description:
+ name: source_map_stack_trace
+ sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ source_maps:
+ dependency: transitive
+ description:
+ name: source_maps
+ sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.10.13"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.10.1"
+ sprintf:
+ dependency: transitive
+ description:
+ name: sprintf
+ sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.0.0"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.12.1"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.4.1"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.2"
+ test:
+ dependency: "direct dev"
+ description:
+ name: test
+ sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.26.3"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.7"
+ test_core:
+ dependency: transitive
+ description:
+ name: test_core
+ sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.12"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.4.0"
+ uuid:
+ dependency: transitive
+ description:
+ name: uuid
+ sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.5.1"
+ very_good_analysis:
+ dependency: "direct dev"
+ description:
+ name: very_good_analysis
+ sha256: e479fbc0941009262343db308133e121bf8660c2c81d48dd8e952df7b7e1e382
+ url: "https://pub.dev"
+ source: hosted
+ version: "9.0.0"
+ vm_service:
+ dependency: transitive
+ description:
+ name: vm_service
+ sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
+ url: "https://pub.dev"
+ source: hosted
+ version: "15.0.2"
+ watcher:
+ dependency: transitive
+ description:
+ name: watcher
+ sha256: "5bf046f41320ac97a469d506261797f35254fa61c641741ef32dacda98b7d39c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.3"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ web_socket:
+ dependency: transitive
+ description:
+ name: web_socket
+ sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.1"
+ web_socket_channel:
+ dependency: transitive
+ description:
+ name: web_socket_channel
+ sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.3"
+ webkit_inspection_protocol:
+ dependency: transitive
+ description:
+ name: webkit_inspection_protocol
+ sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ yaml:
+ dependency: transitive
+ description:
+ name: yaml
+ sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.3"
+sdks:
+ dart: ">=3.9.0 <4.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index c274bb0..9780bae 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -10,10 +10,12 @@ dependencies:
core:
git:
url: https://github.com/flutter-news-app-full-source-code/core.git
+ ref: 01cdfac43da99df1bfb7e5ed902c9f52fa55f911
data_client:
git:
url: https://github.com/flutter-news-app-full-source-code/data-client.git
-
+ ref: de1b23d1ce85bac1b12fd84667d9def043531abc
+
dev_dependencies:
mocktail: ^1.0.4
test: ^1.24.0