diff --git a/.gitignore b/.gitignore index 526da15..3d1c170 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,3 @@ .dart_tool/ .packages build/ -pubspec.lock \ No newline at end of file diff --git a/README.md b/README.md index 9af796d..f88fcd8 100644 --- a/README.md +++ b/README.md @@ -1,272 +1,47 @@ -# data_client +
+ Flutter News App Toolkit Logo +

Data Client

+

The essential shared Dart package defining generic data access interfaces for the Flutter News App Toolkit.

+
-![coverage: percentage](https://img.shields.io/badge/coverage-xx-green) -[![style: very good analysis](https://img.shields.io/badge/style-very_good_analysis-B22C89.svg)](https://pub.dev/packages/very_good_analysis) -[![License: PolyForm Free Trial](https://img.shields.io/badge/License-PolyForm%20Free%20Trial-blue)](https://polyformproject.org/licenses/free-trial/1.0.0) +

+ coverage: xx% +Live Docs: View +Main Project: Browse +

-## Description +This `data_client` package serves as a foundational shared library for the [**Flutter News App Full Source Code Toolkit**](https://github.com/flutter-news-app-full-source-code). It defines a generic, abstract interface (`DataClient`) for interacting with data resources of type `T`. This interface is designed to handle operations for *both* user-scoped resources (where data is specific to a user) and global resources (where data is not tied to a specific user, e.g., admin-managed content). The optional `userId` parameter in methods is used to differentiate between these two use cases. -This package defines a generic, abstract interface (`DataClient`) for -interacting with data resources of type `T`. It is designed to handle -operations for *both* user-scoped resources (where data is specific to a user) -and global resources (where data is not tied to a specific user, e.g., -admin-managed content). The optional `userId` parameter in methods is used to -differentiate between these two use cases. +While its core focus is on providing a standardized contract for common data access patterns, including standard CRUD (Create, Read, Update, Delete) operations, the interface is designed to be extensible to support additional resource-specific methods. It establishes a contract for data clients, expecting implementations to handle underlying communication (like HTTP) and manage serialization/deserialization. This package is designed to be implemented by concrete client classes that interact with specific data sources or APIs. -While its core focus is on providing a standardized contract for common data -access patterns, including standard CRUD (Create, Read, Update, Delete) -operations, the interface is designed to be extensible to support additional -resource-specific methods. It establishes a contract for data clients, -expecting implementations to handle underlying communication (like HTTP) and -manage serialization/deserialization. +## ⭐ Feature Showcase: The Foundation for Robust Data Interaction -This package is designed to be implemented by concrete client classes that -interact with specific data sources or APIs. +This package provides the critical interface for consistent and flexible data access across the entire news application ecosystem. -## Getting Started +
+🧱 Generic & Extensible Data Access -Add the package to your `pubspec.yaml`: +### 🌐 Core Data Client Interface (`DataClient`) +- **`create({String? userId, required T item})`**: Create a new resource. If `userId` is null, may represent a global creation. +- **`read({String? userId, required String id})`**: Read a single resource by ID. If `userId` is null, reads a global resource. +- **`readAll({String? userId, Map? filter, PaginationOptions? pagination, List? sort})`**: Reads multiple resources with powerful filtering, sorting, and pagination. +- **`update({String? userId, required String id, required T item})`**: Update an existing resource by ID. If `userId` is null, updates a global resource. +- **`delete({String? userId, required String id})`**: Delete a resource by ID. If `userId` is null, deletes a global resource. +- **`count({String? userId, Map? filter})`**: Efficiently counts resources matching a filter without fetching them. +- **`aggregate({String? userId, required List> pipeline})`**: Executes a complex, server-side aggregation pipeline for analytics and reporting. -```yaml -dependencies: - data_client: - git: - url: https://github.com/flutter-news-app-full-source-code/data-client.git -``` +### ⚙️ Advanced Capabilities +- **Support for User-Scoped and Global Data:** The optional `userId` parameter allows a single client implementation to handle data specific to a user or data that is globally accessible. +- **Advanced Pagination and Sorting:** Supports robust, cursor-based pagination (via `PaginationOptions`) and multi-field sorting (`List`), ideal for document databases. +- **Rich Querying Capability:** The `readAll` method accepts a `filter` map that can be used to construct complex, MongoDB-style queries. +- **Type Safety:** Uses generics (``) to work with any data model. +- **Serialization Agnostic:** Defines `FromJson` and `ToJson` typedefs, allowing implementations to use their preferred serialization logic. +- **Standardized Error Handling:** Specifies expected `HttpException` subtypes (from `package:core`) that implementations should throw on failure. -Then, import the package: +> **💡 Your Advantage:** You get a meticulously designed, production-quality data access interface that forms the backbone of a scalable news platform. This package ensures consistent data interaction patterns, saving months of development time and ensuring architectural consistency across your mobile app, web dashboard, and backend API. -```dart -import 'package:data_client/data_client.dart'; -``` - -## Features - -* **Generic Data Client Interface:** Defines standard methods for common data - access patterns. Methods include an optional `userId` parameter to - distinguish between user-scoped and global resource operations: - * `create({String? userId, required T item})`: Create a new resource. - If `userId` is null, may represent a global creation. - * `read({String? userId, required String id})`: Read a single resource - by ID. If `userId` is null, reads a global resource. - * `readAll({String? userId, Map? filter, PaginationOptions? pagination, List? sort})`: - Reads multiple resources with powerful filtering, sorting, and pagination. - * `update({String? userId, required String id, required T item})`: - Update an existing resource by ID. If `userId` is null, updates a - global resource. - * `delete({String? userId, required String id})`: Delete a resource by - ID. If `userId` is null, deletes a global resource. -* `count({String? userId, Map? filter})`: Efficiently - counts resources matching a filter without fetching them. -* `aggregate({String? userId, required List> pipeline})`: - Executes a complex, server-side aggregation pipeline for analytics and - reporting. -* **Support for User-Scoped and Global Data:** The optional `userId` - parameter allows a single client implementation to handle data specific - to a user or data that is globally accessible. -* **Advanced Pagination and Sorting:** Supports robust, cursor-based pagination - (via `PaginationOptions`) and multi-field sorting (`List`), - ideal for document databases. -* **Rich Querying Capability:** The `readAll` method accepts a `filter` map - that can be used to construct complex, MongoDB-style queries. -* **Type Safety:** Uses generics (``) to work with any data model. -* **Serialization Agnostic:** Defines `FromJson` and `ToJson` typedefs, - allowing implementations to use their preferred serialization logic. -* **Standardized Error Handling:** Specifies expected `HttpException` - subtypes (from `package:core`) that implementations should throw on - failure. - -## Usage - -Since `DataClient` is an abstract class, you need to create a concrete -implementation for your specific resource type and data source (e.g., an HTTP -API). This implementation will provide the logic for the CRUD, querying, and -pagination methods defined by the interface, handling the optional `userId`. - -**Conceptual Implementation Example:** - -```dart -import 'dart:convert'; // For jsonEncode -import 'package:data_client/data_client.dart'; -import 'package:core/core.dart'; // For HttpException and models - -// Define your data model (assuming it's in core or similar) -// class MyDataModel { ... } - -// Concrete implementation using HtHttpClient (assuming it exists) -// import 'package:ht_http_client/ht_http_client.dart'; - -// class MyDataApiClient implements DataClient { -// MyDataApiClient({required HtHttpClient httpClient}) -// : _httpClient = httpClient; - -// final HtHttpClient _httpClient; -// final String _endpoint = '/mydata'; // Base API endpoint for the resource - -// // Provide the FromJson function for MyDataModel -// static MyDataModel _fromJson(Object? json) => -// MyDataModel.fromJson(json as Map); - -// // Provide the ToJson function for MyDataModel -// static Map _toJson(MyDataModel item) => item.toJson(); - -// // Helper to build path, potentially including userId -// String _buildPath(String? userId, {String? id}) { -// if (userId != null) { -// return '/users/$userId$_endpoint${id != null ? '/$id' : ''}'; -// } -// // Handle global endpoint if userId is null -// return '$_endpoint${id != null ? '/$id' : ''}'; -// } - -// @override -// Future> create({ -// String? userId, -// required MyDataModel item, -// }) async { -// final path = _buildPath(userId); -// final response = await _httpClient.post>( -// path, -// data: _toJson(item), -// ); -// return SuccessApiResponse.fromJson(response, _fromJson); -// } - -// @override -// Future> read({ -// String? userId, -// required String id, -// }) async { -// final path = _buildPath(userId, id: id); -// final response = await _httpClient.get>(path); -// return SuccessApiResponse.fromJson(response, _fromJson); -// } - -// @override -// Future>> readAll({ -// String? userId, -// Map? filter, -// PaginationOptions? pagination, -// List? sort, -// }) async { -// final path = _buildPath(userId); -// final queryParameters = { -// // The backend API would need to know how to interpret these. -// // 'filter' might be JSON-encoded, and 'sort' could be a string. -// if (filter != null) 'filter': jsonEncode(filter), -// if (pagination?.cursor != null) 'cursor': pagination!.cursor, -// if (pagination?.limit != null) 'limit': pagination!.limit, -// if (sort != null) -// 'sort': sort.map((s) => '${s.field}:${s.order.name}').join(','), -// }; -// final response = await _httpClient.get>( -// path, -// queryParameters: queryParameters, -// ); -// return SuccessApiResponse.fromJson( -// response, (json) => PaginatedResponse.fromJson( -// json as Map, -// _fromJson, -// ), -// ); -// } - -// @override -// Future> update({ -// String? userId, -// required String id, -// required MyDataModel item, -// }) async { -// final path = _buildPath(userId, id: id); -// final response = await _httpClient.put>( -// path, -// data: _toJson(item), -// ); -// return SuccessApiResponse.fromJson(response, _fromJson); -// } - -// @override -// Future delete({String? userId, required String id}) async { -// final path = _buildPath(userId, id: id); -// await _httpClient.delete(path); -// } - -// @override -// Future> count({ -// String? userId, -// Map? filter, -// }) async { -// // This conceptual path assumes a dedicated endpoint for counting. -// final path = _buildPath(userId, pathSuffix: '/count'); -// final queryParameters = { -// if (filter != null) 'filter': jsonEncode(filter), -// } -// final response = await _httpClient.get>( -// path, -// queryParameters: queryParameters, -// ); -// // Assuming the API returns a SuccessApiResponse with an int data field. -// return SuccessApiResponse.fromJson(response, (json) => json as int); -// } - -// @override -// Future>>> aggregate({ -// String? userId, -// required List> pipeline, -// }) async { -// // This conceptual path assumes a dedicated endpoint for aggregation. -// final path = _buildPath(userId, pathSuffix: '/aggregate'); -// final response = await _httpClient.post>( -// path, -// data: {'pipeline': pipeline}, -// ); -// // Assuming the API returns a SuccessApiResponse with a list of maps. -// return SuccessApiResponse.fromJson( -// response, -// (json) => List>.from(json as List), -// ); -// } -// } - -// --- Usage in your application/repository --- -// Assuming you have an instance of MyDataApiClient: -// final myApiClient = MyDataApiClient(httpClient: yourHtHttpClientInstance); - -// // Example: Accessing user-scoped data -// final userId = 'user123'; // Replace with actual user ID -// final userItem = await myApiClient.read(userId: userId, id: 'some-user-item-id'); -// final allUserItems = await myApiClient.readAll(userId: userId); - -// // Example: Accessing global data with filtering and sorting -// final queriedItems = await myApiClient.readAll( -// userId: null, // Global query -// filter: {'category': 'technology', 'status': 'published'}, -// sort: [ -// SortOption('publishDate', SortOrder.desc), -// ], -// pagination: PaginationOptions(limit: 10), -// ); - -// // Example: Counting items -// final countResponse = await myApiClient.count( -// userId: null, -// filter: {'status': 'published'}, -// ); -// print('Published items: ${countResponse.data}'); - -// // Example: Running an aggregation pipeline -// final topTopicsResponse = await myApiClient.aggregate( -// pipeline: [ -// { '\$group': { '_id': '\$topic.id', 'count': { '\$sum': 1 } } }, -// { '\$sort': { 'count': -1 } }, -// { '\$limit': 3 } -// ], -// ); -// print('Top topics: ${topTopicsResponse.data}'); -``` +
## 🔑 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_client` 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..4bbe282 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,454 @@ +# 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: d7d9afa3e0cf8fb211fdea3342db8831813abf7d + resolved-ref: d7d9afa3e0cf8fb211fdea3342db8831813abf7d + 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" + 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 44eba9b..b196ddc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: core: git: url: https://github.com/flutter-news-app-full-source-code/core.git + ref: d7d9afa3e0cf8fb211fdea3342db8831813abf7d dev_dependencies: mocktail: ^1.0.4