From c14b3df32e531b02419c98b62a2f5692d64707de Mon Sep 17 00:00:00 2001 From: jjangga0214 Date: Tue, 10 Aug 2021 12:43:29 +0900 Subject: [PATCH 01/94] docs(graphql_flutter): fix typo --- packages/graphql_flutter/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql_flutter/README.md b/packages/graphql_flutter/README.md index bb7f77317..f15787350 100644 --- a/packages/graphql_flutter/README.md +++ b/packages/graphql_flutter/README.md @@ -97,7 +97,7 @@ void main() async { GraphQLClient( link: link, // The default store is the InMemoryStore, which does NOT persist to disk - store: GraphQLCache(store: HiveStore()), + cache: GraphQLCache(store: HiveStore()), ), ); From c995f4ba7daf188db90b342e2927966d732a35bc Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 21 Nov 2021 07:12:52 +0100 Subject: [PATCH 02/94] graphql: Upgrade all the dependences to the last version! Signed-off-by: Vincenzo Palazzo --- packages/graphql/pubspec.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 7c36acaaa..c7ac8b14a 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -18,13 +18,13 @@ dependencies: collection: ^1.15.0 web_socket_channel: ^2.0.0 stream_channel: ^2.1.0 - rxdart: ^0.26.0 + rxdart: ^0.27.1 uuid: ^3.0.1 dev_dependencies: async: ^2.5.0 - pedantic: ^1.8.0+1 mockito: ^5.0.0 test: ^1.5.3 http_parser: ^4.0.0 + lints: ^1.0.1 environment: sdk: '>=2.12.0 <3.0.0' From f9c18c8e73ff1156dc3ffbbd20f77a73a1b46c90 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 21 Nov 2021 07:36:26 +0100 Subject: [PATCH 03/94] graphql: skip WebSocket test because the echo server is unavailable Signed-off-by: Vincenzo Palazzo --- packages/graphql/test/websocket_test.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index bd6f9fdc3..067651849 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -1,3 +1,5 @@ +@Skip('currently failing for web socket services unavailable') + import 'dart:async'; import 'package:async/async.dart'; From 34dc6ce016863d22b3c7a2b9f7c90eaac41cd860 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 21 Nov 2021 07:45:02 +0100 Subject: [PATCH 04/94] graphql_flutter: migrate to last version and upgrade the example Signed-off-by: Vincenzo Palazzo --- .../android/app/src/main/AndroidManifest.xml | 15 +++++++++++++-- .../main/java/com/example/app/MainActivity.java | 11 ++--------- packages/graphql_flutter/pubspec.yaml | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml index 2476f78b9..afe2d6fd3 100644 --- a/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml @@ -27,13 +27,24 @@ until Flutter renders its first frame. It can be removed if there is no splash screen (such as the default splash screen defined in @style/LaunchTheme). --> + + + android:name="io.flutter.embedding.android.SplashScreenDrawable" + android:resource="@drawable/launch_background" /> + + + + diff --git a/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java b/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java index a66788e1a..479ed0631 100644 --- a/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java +++ b/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java @@ -2,13 +2,6 @@ import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} +public class MainActivity extends FlutterActivity {} diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 69d9998f5..aa14344cb 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: meta: ^1.3.0 path_provider: ^2.0.1 path: ^1.8.0 - connectivity_plus: ^1.0.1 + connectivity_plus: ^2.0.3 hive: ^2.0.0 plugin_platform_interface: ^2.0.0 dev_dependencies: From 918806debd2b02745f8f1463755ca582651c1f4f Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 21 Nov 2021 07:57:30 +0100 Subject: [PATCH 05/94] graphql: remove line in the coverage Signed-off-by: Vincenzo Palazzo --- packages/graphql/test/coverage.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql/test/coverage.dart b/packages/graphql/test/coverage.dart index 9c0d47b1b..783716cec 100644 --- a/packages/graphql/test/coverage.dart +++ b/packages/graphql/test/coverage.dart @@ -15,6 +15,6 @@ void main() { cache_graphql_cache_test.main(); fetch_policy_test.main(); anonymous_operations_test.main(); - websocket_test.main(); + //websocket_test.main(); graphql_client_test.main(); } From a7a7b35ca88b532e934265ebefc6271dc30f7cdd Mon Sep 17 00:00:00 2001 From: Anirban-Chand Date: Fri, 27 Aug 2021 00:34:25 +0530 Subject: [PATCH 06/94] Fixed typo in the README.md --- packages/graphql/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index a4bb7edf2..ddb0c4dac 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -665,7 +665,7 @@ final Link _link = Link.from([_authLink, _httpLink]); link = Link.split((request) => request.isSubscription, websocketLink, link); ``` -When combining links, **it isimportant to note that**: +When combining links, **it is important to note that**: - Terminating links like `HttpLink` and `WebsocketLink` must come at the end of a route, and will not call links following them. - Link order is very important. In `HttpLink(myEndpoint).concat(AuthLink(getToken: authenticate))`, the `AuthLink` will never be called. From 125875a9609024cbf4f4eaf6d748eb3023d869ee Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 Nov 2021 23:03:12 +0100 Subject: [PATCH 07/94] ci: try to upgrade the node version to make the package release Signed-off-by: Vincenzo Palazzo --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6adbb0c29..7562b1d3c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ aliases: - &flutter_environment - image: cirrusci/flutter:stable - &node_environment - - image: circleci/node:10 + - image: circleci/node:16 - &restore_cache keys: # when lock file changes, use increasingly general patterns to restore cache From fa5f21e965e69eb0154fe599436515bc993c2b29 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 Nov 2021 23:09:18 +0100 Subject: [PATCH 08/94] codcov: Ingore the example dir Signed-off-by: Vincenzo Palazzo --- .codecov.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.codecov.yml b/.codecov.yml index 26552ab59..3f4186e24 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -18,4 +18,6 @@ coverage: # don't factor tests into coverage scores ignore: - packages/graphql_flutter/test + - packages/graphql_flutter/example - packages/graphql/test + - packages/graphql/example From a6c94b9b93cddca69ded5a76851529e5c9df44ba Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Tue, 23 Nov 2021 22:23:24 +0000 Subject: [PATCH 09/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index c7ac8b14a..f7fbc53bf 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.0 +version: 5.0.1-beta.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index aa14344cb..8b12750e6 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.0 +version: 5.0.1-beta.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter publish_to: none dependencies: From 33ea16e700375eb5e874ae56591c03e1f11c4a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Asc=C3=AAnio=20Sanderson?= Date: Thu, 8 Jul 2021 15:19:08 -0300 Subject: [PATCH 10/94] perf: open Hive boxes concurrently --- packages/graphql_flutter/lib/src/hive_init.dart | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/graphql_flutter/lib/src/hive_init.dart b/packages/graphql_flutter/lib/src/hive_init.dart index f47064179..89df505c6 100644 --- a/packages/graphql_flutter/lib/src/hive_init.dart +++ b/packages/graphql_flutter/lib/src/hive_init.dart @@ -26,8 +26,6 @@ Future initHiveForFlutter({String? subDir, Iterable boxes = const Hive.init(path); } - for (var box in boxes){ - await Hive.openBox(box); - } - + final futures = boxes.map(Hive.openBox); + await Future.wait(futures); } From 8a14432e1051d4f5631d75192b2e58262d5b61ed Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 26 Nov 2021 12:07:37 +0000 Subject: [PATCH 11/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-26) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 5370c83ec..9fc444708 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-26) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + # [5.0.0](https://github.com/zino-app/graphql-flutter/compare/v4.0.1...v5.0.0) (2021-06-07) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index f10db8000..da480a5bf 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-26) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + # [5.0.0](https://github.com/zino-app/graphql-flutter/compare/v4.0.1...v5.0.0) (2021-06-07) From 6410080fe1faaf4b0f78306d018ec69bf836c103 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 27 Nov 2021 12:08:34 +0000 Subject: [PATCH 12/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-27) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 9fc444708..045920da5 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-27) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-26) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index da480a5bf..281c70a8d 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-27) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-26) From 8f917997a5517327a865a1f778170f0f39017658 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 28 Nov 2021 12:08:24 +0000 Subject: [PATCH 13/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-28) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 045920da5..f41eb8fc3 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-28) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-27) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index 281c70a8d..d0b627fcc 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-28) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-27) From a35fcba56d64a73eb3a372a8a39977fbdefd3334 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 29 Nov 2021 12:08:23 +0000 Subject: [PATCH 14/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-29) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index f41eb8fc3..df56c6bd5 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-29) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-28) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index d0b627fcc..725c1399d 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-29) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-28) From 5c488cbf41cba7774ea9cb82fdd52ac052097c4e Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 30 Nov 2021 12:08:04 +0000 Subject: [PATCH 15/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-30) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index df56c6bd5..c1c8daa4d 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-30) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-29) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index 725c1399d..c86f0ca85 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-30) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-29) From 3b2f461821f40d83dcec59a709bc0d31548d3a19 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 1 Dec 2021 12:08:08 +0000 Subject: [PATCH 16/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-01) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index c1c8daa4d..76d15d0ea 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-01) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-30) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index c86f0ca85..6c3cb0961 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-01) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-11-30) From 290a0304f8b3536418b3450b5ba5f1b399c400ba Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 2 Dec 2021 12:07:46 +0000 Subject: [PATCH 17/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-02) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 76d15d0ea..1bbddf086 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-02) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-01) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index 6c3cb0961..dc7a069bc 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-02) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-01) From 62b61a0c8896ddceb20de49cac991205413dc6ac Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 3 Dec 2021 12:08:12 +0000 Subject: [PATCH 18/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-03) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 1bbddf086..de2e7ae6d 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-03) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-02) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index dc7a069bc..a4dedd517 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-03) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-02) From 13b2a569def48d61c9ad7b2f819a2a4d6d98268b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sat, 4 Dec 2021 12:09:02 +0000 Subject: [PATCH 19/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-04) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index de2e7ae6d..9f08ddb26 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-04) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-03) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index a4dedd517..ea6aea997 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-04) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-03) From 71d8dd9b01906855f006bf6f411b8a1fa988d8af Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 5 Dec 2021 12:08:24 +0000 Subject: [PATCH 20/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-05) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 9f08ddb26..a6d19a0c1 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-05) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-04) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index ea6aea997..23074cbcb 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-05) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-04) From d6f191e93f4cce695aca7985423c51141559ce56 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 6 Dec 2021 12:07:49 +0000 Subject: [PATCH 21/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-06) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index a6d19a0c1..9a33a32cd 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-06) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-05) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index 23074cbcb..a10df17af 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-06) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-05) From bf4b93aff20d5ae12cc55d8233da502fa3384da3 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 7 Dec 2021 12:08:11 +0000 Subject: [PATCH 22/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-07) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 9a33a32cd..d4cd61dd1 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-07) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-06) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index a10df17af..53db69e15 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-07) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-06) From 4742e4d0607f9cc1462e19e3e47d287fe3658223 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 8 Dec 2021 12:07:58 +0000 Subject: [PATCH 23/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-08) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index d4cd61dd1..0ee524046 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-08) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-07) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index 53db69e15..a5b61dad7 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-08) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-07) From 733e833013d17db197d7b68abb2b3e9aad38b5a8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 9 Dec 2021 12:07:49 +0000 Subject: [PATCH 24/94] chore(release): 5.0.1-beta.1 [skip ci] ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-09) ### Performance Improvements * open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) --- packages/graphql/CHANGELOG.md | 7 +++++++ packages/graphql_flutter/CHANGELOG.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/packages/graphql/CHANGELOG.md b/packages/graphql/CHANGELOG.md index 0ee524046..4ce0fce39 100644 --- a/packages/graphql/CHANGELOG.md +++ b/packages/graphql/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-09) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-08) diff --git a/packages/graphql_flutter/CHANGELOG.md b/packages/graphql_flutter/CHANGELOG.md index a5b61dad7..e1db65de5 100644 --- a/packages/graphql_flutter/CHANGELOG.md +++ b/packages/graphql_flutter/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-09) + + +### Performance Improvements + +* open Hive boxes concurrently ([33ea16e](https://github.com/zino-app/graphql-flutter/commit/33ea16e700375eb5e874ae56591c03e1f11c4a4c)) + ## [5.0.1-beta.1](https://github.com/zino-app/graphql-flutter/compare/v5.0.0...v5.0.1-beta.1) (2021-12-08) From 355a3c42ab26109ef4fe10474915b41f3374e21d Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 Nov 2021 21:35:46 +0100 Subject: [PATCH 25/94] ci: Migration to github actions Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_build.yml | 26 +++++++++++++++++++ .github/workflows/graphql_flutter_build.yml | 24 +++++++++++++++++ .../lib/src/exceptions/exceptions.dart | 3 +-- packages/graphql/test/coverage.dart | 2 +- 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/graphql_build.yml create mode 100644 .github/workflows/graphql_flutter_build.yml diff --git a/.github/workflows/graphql_build.yml b/.github/workflows/graphql_build.yml new file mode 100644 index 000000000..de4910f2c --- /dev/null +++ b/.github/workflows/graphql_build.yml @@ -0,0 +1,26 @@ +name: graphql Dart Code sanity check + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable + + - name: Install dependencies + run: | + cd packages/graphql + dart pub get + + - name: Code formatting check + run: dart format --set-exit-if-changed packages/graphql + + - name: Code analyze check + run: | + dart analyze packages/graphql/lib + dart analyze packages/graphql/test \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_build.yml b/.github/workflows/graphql_flutter_build.yml new file mode 100644 index 000000000..7ee4c52e9 --- /dev/null +++ b/.github/workflows/graphql_flutter_build.yml @@ -0,0 +1,24 @@ +name: graphql-flutter Dart Code sanity check + +on: [push, pull_request] + +jobs: + build: + # This job will run on ubuntu virtual machine + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: subosito/flutter-action@v1 + with: + channel: 'stable' + + - run: | + cd packages/graphql_flutter + flutter pub get + + - run: flutter format --set-exit-if-changed packages/graphql_flutter + + - run: | + flutter analyze packages/graphql_flutter/lib + flutter analyze packages/graphql_flutter/test \ No newline at end of file diff --git a/packages/graphql/lib/src/exceptions/exceptions.dart b/packages/graphql/lib/src/exceptions/exceptions.dart index 772e8a572..daa26e91c 100644 --- a/packages/graphql/lib/src/exceptions/exceptions.dart +++ b/packages/graphql/lib/src/exceptions/exceptions.dart @@ -15,6 +15,5 @@ LinkException translateFailure(dynamic failure, StackTrace trace) { if (failure is LinkException) { return failure; } - return network.translateFailure(failure) ?? - UnknownException(failure, trace); + return network.translateFailure(failure) ?? UnknownException(failure, trace); } diff --git a/packages/graphql/test/coverage.dart b/packages/graphql/test/coverage.dart index 783716cec..f7b64365a 100644 --- a/packages/graphql/test/coverage.dart +++ b/packages/graphql/test/coverage.dart @@ -7,7 +7,7 @@ import 'cache/store_test.dart' as cache_store_test; import 'fetch_policy_test.dart' as fetch_policy_test; import 'graphql_client_test.dart' as graphql_client_test; import 'query_options_test.dart' as query_options_test; -import 'websocket_test.dart' as websocket_test; +//import 'websocket_test.dart' as websocket_test; void main() { query_options_test.main(); From e7852804291f05a2f7e453a6521d6b7a2f13ab11 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 Nov 2021 21:53:16 +0100 Subject: [PATCH 26/94] graphql_flutter: formatting code Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_build.yml | 8 +++++--- .github/workflows/graphql_flutter_build.yml | 8 +++++--- .../graphql_flutter/example/lib/graphql_bloc/bloc.dart | 4 ++-- packages/graphql_flutter/lib/src/hive_init.dart | 4 +++- .../graphql_flutter/lib/src/widgets/graphql_provider.dart | 2 +- 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.github/workflows/graphql_build.yml b/.github/workflows/graphql_build.yml index de4910f2c..ecbaceb71 100644 --- a/.github/workflows/graphql_build.yml +++ b/.github/workflows/graphql_build.yml @@ -18,9 +18,11 @@ jobs: dart pub get - name: Code formatting check - run: dart format --set-exit-if-changed packages/graphql + run: | + cd packages/graphql + dart format --set-exit-if-changed . - name: Code analyze check run: | - dart analyze packages/graphql/lib - dart analyze packages/graphql/test \ No newline at end of file + cd packages/graphql + dart analyze . \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_build.yml b/.github/workflows/graphql_flutter_build.yml index 7ee4c52e9..37e23901a 100644 --- a/.github/workflows/graphql_flutter_build.yml +++ b/.github/workflows/graphql_flutter_build.yml @@ -17,8 +17,10 @@ jobs: cd packages/graphql_flutter flutter pub get - - run: flutter format --set-exit-if-changed packages/graphql_flutter + - run: | + cd packages/graphql_flutter + flutter format --set-exit-if-changed . - run: | - flutter analyze packages/graphql_flutter/lib - flutter analyze packages/graphql_flutter/test \ No newline at end of file + cd packages/graphql_flutter + flutter analyze . \ No newline at end of file diff --git a/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart b/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart index 6b0d89630..07331ea5e 100644 --- a/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart +++ b/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart @@ -70,8 +70,8 @@ class Bloc { Future _mutateToggleStar(Repo repo) async { final _options = MutationOptions( - document: - gql(repo.viewerHasStarred! ? mutations.removeStar : mutations.addStar), + document: gql( + repo.viewerHasStarred! ? mutations.removeStar : mutations.addStar), variables: { 'starrableId': repo.id, }, diff --git a/packages/graphql_flutter/lib/src/hive_init.dart b/packages/graphql_flutter/lib/src/hive_init.dart index 89df505c6..d158a69f6 100644 --- a/packages/graphql_flutter/lib/src/hive_init.dart +++ b/packages/graphql_flutter/lib/src/hive_init.dart @@ -15,7 +15,9 @@ import 'package:graphql/client.dart' show HiveStore; /// Extracted from [`hive_flutter` source][github] /// /// [github]: https://github.com/hivedb/hive/blob/5bf355496650017409fef4e9905e8826c5dc5bf3/hive_flutter/lib/src/hive_extensions.dart -Future initHiveForFlutter({String? subDir, Iterable boxes = const [ HiveStore.defaultBoxName ] }) async { +Future initHiveForFlutter( + {String? subDir, + Iterable boxes = const [HiveStore.defaultBoxName]}) async { WidgetsFlutterBinding.ensureInitialized(); if (!kIsWeb) { var appDir = await getApplicationDocumentsDirectory(); diff --git a/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart b/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart index d87b5d1ee..52959edaf 100644 --- a/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart +++ b/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart @@ -49,7 +49,7 @@ class _InheritedGraphQLProvider extends InheritedWidget { _InheritedGraphQLProvider({ required this.client, required Widget child, - }) : clientValue = client.value, + }) : clientValue = client.value, super(child: child); factory _InheritedGraphQLProvider.of(BuildContext context) { From 74b901264021f6bed6658a142b545f897bd8655d Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 Nov 2021 22:23:06 +0100 Subject: [PATCH 27/94] ci: exclude example dir in the code analysis check Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/graphql_build.yml b/.github/workflows/graphql_build.yml index ecbaceb71..d137debaf 100644 --- a/.github/workflows/graphql_build.yml +++ b/.github/workflows/graphql_build.yml @@ -25,4 +25,5 @@ jobs: - name: Code analyze check run: | cd packages/graphql - dart analyze . \ No newline at end of file + dart analyze lib + dart analyze test \ No newline at end of file From ee3e79d1118d9abb71d7a176211e6d401ab50930 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 23 Nov 2021 22:26:32 +0100 Subject: [PATCH 28/94] ci: Remove lint from circle ci Signed-off-by: Vincenzo Palazzo --- .circleci/config.yml | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7562b1d3c..9187e7572 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -66,26 +66,6 @@ jobs: key: pub-packages-v1-{{ checksum "packages/graphql/pubspec.yaml" }}-{{ checksum "packages/graphql_flutter/pubspec.yaml" }} paths: - ~/.pub-cache - lint: - docker: *flutter_environment - steps: - - checkout - - restore_cache: *restore_cache - - run: *install_yaml_processor - - run: - name: Code formating and analyzing (graphql) - command: | - cd packages/graphql - dartfmt **/*.dart -n --set-exit-if-changed - pub get - dart analyze lib - cd example && pub get && dart analyze - - run: - name: Code formating and analyzing (graphql_flutter) - command: | - cd packages/graphql_flutter - dartfmt **/*.dart -n --set-exit-if-changed - flutter analyze coverage: docker: *flutter_environment steps: @@ -117,7 +97,7 @@ jobs: - checkout - run: name: Generate release tags - command: npx -p semantic-release -p @semantic-release/changelog -p @semantic-release/git semantic-release + command: nvm install 'lts/*' && npx -p semantic-release -p @semantic-release/changelog -p @semantic-release/git semantic-release sync_with_beta: docker: *node_environment steps: @@ -187,16 +167,12 @@ workflows: - beta jobs: - dependencies - - lint: - requires: - - dependencies - coverage: requires: - dependencies - release: requires: - dependencies - - lint - coverage weekly: triggers: @@ -208,16 +184,12 @@ workflows: - master jobs: - dependencies - - lint: - requires: - - dependencies - coverage: requires: - dependencies - release: requires: - dependencies - - lint - coverage - sync_with_beta: requires: @@ -228,12 +200,6 @@ workflows: filters: tags: only: /^.*$/ - - lint: - requires: - - dependencies - filters: - tags: - ignore: /^.*$/ - coverage: requires: - dependencies From 3e067b5ac7fb57447f08a9d6b0ecd4e70e1272cf Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 17 Dec 2021 05:36:05 +0100 Subject: [PATCH 29/94] Update code analysis for dart 2.15 Signed-off-by: Vincenzo Palazzo --- packages/graphql/lib/src/core/_base_options.dart | 2 -- packages/graphql/lib/src/core/_query_write_handling.dart | 7 ------- packages/graphql/lib/src/core/fetch_more.dart | 5 ----- packages/graphql/lib/src/core/observable_query.dart | 4 ---- packages/graphql/lib/src/core/query_options.dart | 2 -- packages/graphql/lib/src/core/query_result.dart | 1 - packages/graphql/lib/src/exceptions/exceptions_next.dart | 3 --- packages/graphql/lib/src/links/auth_link.dart | 3 --- packages/graphql/pubspec.yaml | 2 +- packages/graphql/test/anonymous_operations_test.dart | 1 - packages/graphql/test/cache/store_test.dart | 2 -- packages/graphql/test/fetch_policy_test.dart | 1 - packages/graphql/test/graphql_client_test.dart | 2 -- packages/graphql/test/websocket_test.dart | 3 --- packages/graphql_flutter/lib/src/widgets/subscription.dart | 2 -- packages/graphql_flutter/test/widgets/query_test.dart | 1 - 16 files changed, 1 insertion(+), 40 deletions(-) diff --git a/packages/graphql/lib/src/core/_base_options.dart b/packages/graphql/lib/src/core/_base_options.dart index 78322af0a..1538b6122 100644 --- a/packages/graphql/lib/src/core/_base_options.dart +++ b/packages/graphql/lib/src/core/_base_options.dart @@ -1,10 +1,8 @@ import 'package:graphql/src/core/_data_class.dart'; import 'package:gql/ast.dart'; -import 'package:gql_exec/gql_exec.dart'; import 'package:graphql/client.dart'; -import 'package:graphql/src/core/policies.dart'; /// TODO refactor into [Request] container /// Base options. diff --git a/packages/graphql/lib/src/core/_query_write_handling.dart b/packages/graphql/lib/src/core/_query_write_handling.dart index 4c10fd111..1b551dcd6 100644 --- a/packages/graphql/lib/src/core/_query_write_handling.dart +++ b/packages/graphql/lib/src/core/_query_write_handling.dart @@ -1,12 +1,5 @@ import 'package:graphql/client.dart'; -import 'package:gql_exec/gql_exec.dart'; - -import 'package:graphql/src/core/query_result.dart'; -import 'package:graphql/src/core/policies.dart'; -import 'package:graphql/src/exceptions.dart'; -import 'package:normalize/normalize.dart'; - /// Internal writeQuery wrapper typedef _IntWriteQuery = void Function( Request request, Map? data); diff --git a/packages/graphql/lib/src/core/fetch_more.dart b/packages/graphql/lib/src/core/fetch_more.dart index d9a5f3192..81eb08c8d 100644 --- a/packages/graphql/lib/src/core/fetch_more.dart +++ b/packages/graphql/lib/src/core/fetch_more.dart @@ -2,11 +2,6 @@ import 'dart:async'; import 'package:graphql/client.dart'; -import 'package:graphql/src/core/query_manager.dart'; -import 'package:graphql/src/core/query_options.dart'; -import 'package:graphql/src/core/query_result.dart'; -import 'package:graphql/src/core/policies.dart'; - import 'package:graphql/src/core/_query_write_handling.dart'; /// Fetch more results and then merge them with [previousResult] diff --git a/packages/graphql/lib/src/core/observable_query.dart b/packages/graphql/lib/src/core/observable_query.dart index 01784fafb..afc9315ea 100644 --- a/packages/graphql/lib/src/core/observable_query.dart +++ b/packages/graphql/lib/src/core/observable_query.dart @@ -2,11 +2,7 @@ import 'dart:async'; import 'package:graphql/client.dart'; import 'package:meta/meta.dart'; -import 'package:graphql/src/core/query_manager.dart'; -import 'package:graphql/src/core/query_options.dart'; import 'package:graphql/src/core/fetch_more.dart'; -import 'package:graphql/src/core/query_result.dart'; -import 'package:graphql/src/core/policies.dart'; import 'package:graphql/src/scheduler/scheduler.dart'; /// Side effect to register for execution when data is received diff --git a/packages/graphql/lib/src/core/query_options.dart b/packages/graphql/lib/src/core/query_options.dart index 7f22f1852..993dbac6f 100644 --- a/packages/graphql/lib/src/core/query_options.dart +++ b/packages/graphql/lib/src/core/query_options.dart @@ -3,10 +3,8 @@ import 'package:graphql/src/core/_base_options.dart'; import 'package:graphql/src/utilities/helpers.dart'; import 'package:gql/ast.dart'; -import 'package:gql_exec/gql_exec.dart'; import 'package:graphql/client.dart'; -import 'package:graphql/src/core/policies.dart'; /// Query options. class QueryOptions extends BaseOptions { diff --git a/packages/graphql/lib/src/core/query_result.dart b/packages/graphql/lib/src/core/query_result.dart index 2c8aa5a8f..0ae4a7baf 100644 --- a/packages/graphql/lib/src/core/query_result.dart +++ b/packages/graphql/lib/src/core/query_result.dart @@ -1,6 +1,5 @@ import 'dart:async' show FutureOr; import 'package:graphql/client.dart'; -import 'package:graphql/src/exceptions.dart'; /// The source of the result data contained /// diff --git a/packages/graphql/lib/src/exceptions/exceptions_next.dart b/packages/graphql/lib/src/exceptions/exceptions_next.dart index fca256b04..f8959921f 100644 --- a/packages/graphql/lib/src/exceptions/exceptions_next.dart +++ b/packages/graphql/lib/src/exceptions/exceptions_next.dart @@ -4,9 +4,6 @@ import 'package:graphql/client.dart'; /// these should be the only exceptions we need import 'package:meta/meta.dart'; -import 'package:gql_link/gql_link.dart' show LinkException, ServerException; -import 'package:gql_exec/gql_exec.dart' show GraphQLError, Request, Response; - export 'package:gql_exec/gql_exec.dart' show GraphQLError; export 'package:normalize/normalize.dart' show PartialDataException; diff --git a/packages/graphql/lib/src/links/auth_link.dart b/packages/graphql/lib/src/links/auth_link.dart index ba5a5b37a..7c50e6d9d 100644 --- a/packages/graphql/lib/src/links/auth_link.dart +++ b/packages/graphql/lib/src/links/auth_link.dart @@ -1,9 +1,6 @@ import 'dart:async'; import 'package:graphql/client.dart'; -import "package:gql_exec/gql_exec.dart"; -import "package:gql_http_link/gql_http_link.dart"; -import "package:gql_link/gql_link.dart"; import "package:gql_transform_link/gql_transform_link.dart"; typedef _RequestTransformer = FutureOr Function(Request request); diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index f7fbc53bf..7583fd246 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -6,7 +6,7 @@ dependencies: meta: ^1.3.0 path: ^1.8.0 gql: ^0.13.0 - gql_exec: ^0.3.0 + gql_exec: 0.3.0 gql_link: ^0.4.0 gql_http_link: ^0.4.0 gql_transform_link: ^0.2.0 diff --git a/packages/graphql/test/anonymous_operations_test.dart b/packages/graphql/test/anonymous_operations_test.dart index cc5c95879..1c45e555b 100644 --- a/packages/graphql/test/anonymous_operations_test.dart +++ b/packages/graphql/test/anonymous_operations_test.dart @@ -1,5 +1,4 @@ import 'package:gql/language.dart'; -import 'package:gql_exec/gql_exec.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; diff --git a/packages/graphql/test/cache/store_test.dart b/packages/graphql/test/cache/store_test.dart index ba0e119e9..de4e6c481 100644 --- a/packages/graphql/test/cache/store_test.dart +++ b/packages/graphql/test/cache/store_test.dart @@ -4,8 +4,6 @@ import 'package:graphql/client.dart'; import 'package:graphql/src/utilities/helpers.dart'; import 'package:test/test.dart'; -import 'package:graphql/src/cache/store.dart'; - void main() { group('InMemoryStore', () { final data = { diff --git a/packages/graphql/test/fetch_policy_test.dart b/packages/graphql/test/fetch_policy_test.dart index cddafffaa..e4623976f 100644 --- a/packages/graphql/test/fetch_policy_test.dart +++ b/packages/graphql/test/fetch_policy_test.dart @@ -1,4 +1,3 @@ -import 'package:gql_exec/gql_exec.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; diff --git a/packages/graphql/test/graphql_client_test.dart b/packages/graphql/test/graphql_client_test.dart index 1cd623503..bf3428106 100644 --- a/packages/graphql/test/graphql_client_test.dart +++ b/packages/graphql/test/graphql_client_test.dart @@ -1,5 +1,3 @@ -import 'package:gql_exec/gql_exec.dart'; -import 'package:gql_link/gql_link.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index 067651849..e65665df9 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -4,7 +4,6 @@ import 'dart:async'; import 'package:async/async.dart'; import 'package:rxdart/subjects.dart'; -import 'package:stream_channel/src/stream_channel_transformer.dart'; import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; import 'dart:convert'; @@ -12,8 +11,6 @@ import 'dart:typed_data'; import 'package:gql/language.dart'; import 'package:graphql/client.dart'; -import 'package:graphql/src/links/websocket_link/websocket_client.dart'; -import 'package:graphql/src/links/websocket_link/websocket_messages.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import './helpers.dart'; diff --git a/packages/graphql_flutter/lib/src/widgets/subscription.dart b/packages/graphql_flutter/lib/src/widgets/subscription.dart index d89dd6cbe..f6534ec0a 100644 --- a/packages/graphql_flutter/lib/src/widgets/subscription.dart +++ b/packages/graphql_flutter/lib/src/widgets/subscription.dart @@ -3,9 +3,7 @@ import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/widgets.dart'; -import 'package:graphql/client.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:graphql_flutter/src/widgets/graphql_provider.dart'; typedef OnSubscriptionResult = void Function( QueryResult subscriptionResult, diff --git a/packages/graphql_flutter/test/widgets/query_test.dart b/packages/graphql_flutter/test/widgets/query_test.dart index 6f1be87e0..cad5974f9 100644 --- a/packages/graphql_flutter/test/widgets/query_test.dart +++ b/packages/graphql_flutter/test/widgets/query_test.dart @@ -5,7 +5,6 @@ import 'package:flutter/services.dart' show MethodChannel, MethodCall; import 'package:flutter_test/flutter_test.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:graphql_flutter/src/widgets/query.dart'; import 'package:http/http.dart' as http; import 'package:mockito/mockito.dart'; From 941633e14fe51ef63ba8b9ff3ef6102e23c870e6 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 17 Dec 2021 06:09:17 +0100 Subject: [PATCH 30/94] ci: Migrate code coverage of code from circleci to github Signed-off-by: Vincenzo Palazzo --- .circleci/config.yml | 39 ------------------- .github/workflows/graphql_codcoverage.yml | 24 ++++++++++++ .../workflows/graphql_flutter_codcoverage.yml | 19 +++++++++ .github/workflows/release.yml | 18 +++++++++ 4 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 .github/workflows/graphql_codcoverage.yml create mode 100644 .github/workflows/graphql_flutter_codcoverage.yml create mode 100644 .github/workflows/release.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index 9187e7572..3464fb8bf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -66,31 +66,6 @@ jobs: key: pub-packages-v1-{{ checksum "packages/graphql/pubspec.yaml" }}-{{ checksum "packages/graphql_flutter/pubspec.yaml" }} paths: - ~/.pub-cache - coverage: - docker: *flutter_environment - steps: - - checkout - - restore_cache: *restore_cache - - run: *install_yaml_processor - - run: - name: Code coverage (graphql, vm only) - command: | - cd packages/graphql - pub get - pub global activate coverage - dart --enable_asserts --enable-vm-service test/coverage.dart - - run: - name: Code coverage (graphql_flutter) - command: | - cd packages/graphql_flutter - flutter test --coverage - - run: - name: Upload coverage - command: | - bash <(curl -s https://codecov.io/bash) -F graphql_flutter - bash <(curl -s https://codecov.io/bash) -F graphql_flutter -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_flutter - bash <(curl -s https://codecov.io/bash) -F graphql_client - bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client release: docker: *node_environment steps: @@ -167,13 +142,9 @@ workflows: - beta jobs: - dependencies - - coverage: - requires: - - dependencies - release: requires: - dependencies - - coverage weekly: triggers: - schedule: @@ -184,13 +155,9 @@ workflows: - master jobs: - dependencies - - coverage: - requires: - - dependencies - release: requires: - dependencies - - coverage - sync_with_beta: requires: - release @@ -200,12 +167,6 @@ workflows: filters: tags: only: /^.*$/ - - coverage: - requires: - - dependencies - filters: - tags: - ignore: /^.*$/ - publish: requires: - dependencies diff --git a/.github/workflows/graphql_codcoverage.yml b/.github/workflows/graphql_codcoverage.yml new file mode 100644 index 000000000..e903f6d02 --- /dev/null +++ b/.github/workflows/graphql_codcoverage.yml @@ -0,0 +1,24 @@ +name: graphql Code coverage + +on: [ push, pull_request ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable + + - run: | + cd packages/graphql + pub get + pub global activate coverage + dart --enable_asserts --enable-vm-service test/coverage.dart + - run: | + cd packages/graphql + bash <(curl -s https://codecov.io/bash) -F graphql_client + bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client + dart analyze test \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_codcoverage.yml b/.github/workflows/graphql_flutter_codcoverage.yml new file mode 100644 index 000000000..90105d7cf --- /dev/null +++ b/.github/workflows/graphql_flutter_codcoverage.yml @@ -0,0 +1,19 @@ +name: graphql-flutter Dart Code sanity check + +on: [ push, pull_request ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: subosito/flutter-action@v1 + with: + channel: 'stable' + - run: | + cd packages/graphql_flutter + flutter test --coverage + - run: | + cd packages/graphql_flutter + bash <(curl -s https://codecov.io/bash) -F graphql_client + bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..a2bfa0885 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,18 @@ +name: Publish to Pub.dev + +on: + release: + types: [created] + +jobs: + publishing: + runs-on: ubuntu-latest + steps: + - name: 'Checkout' + uses: actions/checkout@v2 # required! + + - name: '>> Dart package <<' + uses: k-paxian/dart-package-publisher@master + with: + accessToken: ${{ secrets.OAUTH_ACCESS_TOKEN }} + refreshToken: ${{ secrets.OAUTH_REFRESH_TOKEN }} \ No newline at end of file From 8397b5503e6027b37b25e28f2b045a23a58f64ed Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 19 Dec 2021 08:00:47 +0100 Subject: [PATCH 31/94] ci: Formatting workflow file, and fixed regression Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_build.yml | 4 ---- .github/workflows/graphql_codcoverage.yml | 1 - .github/workflows/graphql_flutter_build.yml | 6 +----- .github/workflows/graphql_flutter_codcoverage.yml | 14 +++++++------- 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/.github/workflows/graphql_build.yml b/.github/workflows/graphql_build.yml index d137debaf..58b12b68a 100644 --- a/.github/workflows/graphql_build.yml +++ b/.github/workflows/graphql_build.yml @@ -5,23 +5,19 @@ on: [push, pull_request] jobs: build: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v2 - uses: dart-lang/setup-dart@v1 with: sdk: stable - - name: Install dependencies run: | cd packages/graphql dart pub get - - name: Code formatting check run: | cd packages/graphql dart format --set-exit-if-changed . - - name: Code analyze check run: | cd packages/graphql diff --git a/.github/workflows/graphql_codcoverage.yml b/.github/workflows/graphql_codcoverage.yml index e903f6d02..0d8464a44 100644 --- a/.github/workflows/graphql_codcoverage.yml +++ b/.github/workflows/graphql_codcoverage.yml @@ -11,7 +11,6 @@ jobs: - uses: dart-lang/setup-dart@v1 with: sdk: stable - - run: | cd packages/graphql pub get diff --git a/.github/workflows/graphql_flutter_build.yml b/.github/workflows/graphql_flutter_build.yml index 37e23901a..68ca1ab6f 100644 --- a/.github/workflows/graphql_flutter_build.yml +++ b/.github/workflows/graphql_flutter_build.yml @@ -1,6 +1,6 @@ name: graphql-flutter Dart Code sanity check -on: [push, pull_request] +on: [ push, pull_request ] jobs: build: @@ -8,19 +8,15 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: subosito/flutter-action@v1 with: channel: 'stable' - - run: | cd packages/graphql_flutter flutter pub get - - run: | cd packages/graphql_flutter flutter format --set-exit-if-changed . - - run: | cd packages/graphql_flutter flutter analyze . \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_codcoverage.yml b/.github/workflows/graphql_flutter_codcoverage.yml index 90105d7cf..3fc11c18f 100644 --- a/.github/workflows/graphql_flutter_codcoverage.yml +++ b/.github/workflows/graphql_flutter_codcoverage.yml @@ -10,10 +10,10 @@ jobs: - uses: subosito/flutter-action@v1 with: channel: 'stable' - - run: | - cd packages/graphql_flutter - flutter test --coverage - - run: | - cd packages/graphql_flutter - bash <(curl -s https://codecov.io/bash) -F graphql_client - bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client \ No newline at end of file + - run: | + cd packages/graphql_flutter + flutter test --coverage + - run: | + cd packages/graphql_flutter + bash <(curl -s https://codecov.io/bash) -F graphql_client + bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client \ No newline at end of file From ab89e2855d16723a06641519d4c1a10d134f9f7f Mon Sep 17 00:00:00 2001 From: Marc Leonetti Date: Sat, 18 Sep 2021 21:14:59 +0200 Subject: [PATCH 32/94] fix websocket disconnect after connection loss --- .../links/websocket_link/websocket_client.dart | 15 ++++++++++----- packages/graphql/lib/src/utilities/platform.dart | 4 +--- .../graphql/lib/src/utilities/platform_html.dart | 13 +++++++++++-- .../graphql/lib/src/utilities/platform_io.dart | 16 ++++++++++++++-- .../graphql/lib/src/utilities/platform_stub.dart | 2 -- 5 files changed, 36 insertions(+), 14 deletions(-) delete mode 100644 packages/graphql/lib/src/utilities/platform_stub.dart diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 0f9ad463d..ac5401d84 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'dart:typed_data'; import 'package:graphql/src/links/gql_links.dart'; +import 'package:graphql/src/utilities/platform.dart'; import 'package:meta/meta.dart'; import 'package:graphql/src/core/query_options.dart' show WithType; @@ -22,7 +23,7 @@ import './websocket_messages.dart'; typedef GetInitPayload = FutureOr Function(); /// A definition for functions that returns a connected [WebSocketChannel] -typedef WebSocketConnect = WebSocketChannel Function( +typedef WebSocketConnect = FutureOr Function( Uri uri, Iterable? protocols, ); @@ -102,11 +103,15 @@ class SocketClientConfig { /// ``` final WebSocketConnect connect; - static WebSocketChannel defaultConnect( + static Future defaultConnect( Uri uri, Iterable? protocols, - ) => - WebSocketChannel.connect(uri, protocols: protocols).forGraphQL(); + ) async { + return defaultConnectPlatform( + uri, + protocols, + ); + } /// Payload to be sent with the connection_init request. /// @@ -222,7 +227,7 @@ class SocketClient { // Even though config.connect is sync, we call async in order to make the // SocketConnectionState.connected attribution not overload SocketConnectionState.connecting socketChannel = - await config.connect(Uri.parse(url), protocols).forGraphQL(); + (await config.connect(Uri.parse(url), protocols)).forGraphQL(); _connectionStateController.add(SocketConnectionState.connected); print('Connected to websocket.'); _write(initOperation); diff --git a/packages/graphql/lib/src/utilities/platform.dart b/packages/graphql/lib/src/utilities/platform.dart index 2231dfd0e..8abbc3511 100644 --- a/packages/graphql/lib/src/utilities/platform.dart +++ b/packages/graphql/lib/src/utilities/platform.dart @@ -1,3 +1 @@ -export './platform_stub.dart' - if (dart.library.html) './platform_html.dart' - if (dart.library.io) './platform_io.dart'; +export './platform_html.dart' if (dart.library.io) './platform_io.dart'; diff --git a/packages/graphql/lib/src/utilities/platform_html.dart b/packages/graphql/lib/src/utilities/platform_html.dart index 1d05fa373..dc85f1520 100644 --- a/packages/graphql/lib/src/utilities/platform_html.dart +++ b/packages/graphql/lib/src/utilities/platform_html.dart @@ -1,2 +1,11 @@ -final isHtml = true; -final isIo = false; +import 'package:graphql/src/links/websocket_link/websocket_client.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; + +Future defaultConnectPlatform( + Uri uri, + Iterable? protocols, +) async { + final webSocketChannel = + await WebSocketChannel.connect(uri, protocols: protocols); + return webSocketChannel.forGraphQL(); +} diff --git a/packages/graphql/lib/src/utilities/platform_io.dart b/packages/graphql/lib/src/utilities/platform_io.dart index fa817d2a5..5aee635fe 100644 --- a/packages/graphql/lib/src/utilities/platform_io.dart +++ b/packages/graphql/lib/src/utilities/platform_io.dart @@ -1,2 +1,14 @@ -final isHtml = false; -final isIo = true; +import 'dart:io'; + +import 'package:graphql/src/links/websocket_link/websocket_client.dart'; +import 'package:web_socket_channel/io.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; + +Future defaultConnectPlatform( + Uri uri, + Iterable? protocols, +) async { + final webSocket = + await WebSocket.connect(uri.toString(), protocols: protocols); + return IOWebSocketChannel(webSocket).forGraphQL(); +} diff --git a/packages/graphql/lib/src/utilities/platform_stub.dart b/packages/graphql/lib/src/utilities/platform_stub.dart deleted file mode 100644 index 51b98b401..000000000 --- a/packages/graphql/lib/src/utilities/platform_stub.dart +++ /dev/null @@ -1,2 +0,0 @@ -final isHtml = false; -final isIo = false; From 587de47181e033ed181fa00740953d9efb993bfd Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 24 Dec 2021 18:29:27 +0100 Subject: [PATCH 33/94] example: update starwars demo, and refactoring code base with a new structure. Signed-off-by: Vincenzo Palazzo --- examples/starwars/Makefile | 21 ++++++++ examples/starwars/README.md | 19 +++++-- examples/starwars/android/app/build.gradle | 4 +- .../android/app/src/main/AndroidManifest.xml | 8 +-- .../com/example/starwars/MainActivity.java | 12 +---- .../app/src/main/res/values/styles.xml | 1 + .../lib/generated_plugin_registrant.dart | 16 ++++++ examples/starwars/lib/main.dart | 8 +-- .../lib/{ => model}/episode/episode.dart | 0 .../starwars/lib/model/review/review.dart | 49 ++++++++++++++++++ .../graphql_provider.dart} | 24 --------- .../lib/view/client/graphql_view.dart | 27 ++++++++++ .../lib/{ => view}/episode/episode_page.dart | 4 +- .../lib/{ => view}/episode/hero_query.dart | 2 +- .../{reviews => view/review}/review_page.dart | 2 +- .../review}/review_page_list.dart | 2 +- .../review}/review_subscription.dart | 3 +- .../review/review_view.dart} | 50 +------------------ 18 files changed, 148 insertions(+), 104 deletions(-) create mode 100644 examples/starwars/Makefile create mode 100644 examples/starwars/lib/generated_plugin_registrant.dart rename examples/starwars/lib/{ => model}/episode/episode.dart (100%) create mode 100644 examples/starwars/lib/model/review/review.dart rename examples/starwars/lib/{client_provider.dart => utils/graphql_provider.dart} (60%) create mode 100644 examples/starwars/lib/view/client/graphql_view.dart rename examples/starwars/lib/{ => view}/episode/episode_page.dart (95%) rename examples/starwars/lib/{ => view}/episode/hero_query.dart (97%) rename examples/starwars/lib/{reviews => view/review}/review_page.dart (93%) rename examples/starwars/lib/{reviews => view/review}/review_page_list.dart (97%) rename examples/starwars/lib/{reviews => view/review}/review_subscription.dart (94%) rename examples/starwars/lib/{reviews/review.dart => view/review/review_view.dart} (56%) diff --git a/examples/starwars/Makefile b/examples/starwars/Makefile new file mode 100644 index 000000000..67c06b7f8 --- /dev/null +++ b/examples/starwars/Makefile @@ -0,0 +1,21 @@ +CC=dart +CC_UI=flutter + + +default: fmt dep + @echo "Please run \"make server !&\" to run the server" + + +dep: + cd server; $(CC) pub get + $(CC_UI) pub get + +server: + $(CC) pub run graphql_starwars_test_server + +fmt: + $(CC_UI) format . + $(CC_UI) analyze . + +clean: + $(CC_UI) clean diff --git a/examples/starwars/README.md b/examples/starwars/README.md index 36f68c76b..7a2970445 100644 --- a/examples/starwars/README.md +++ b/examples/starwars/README.md @@ -1,8 +1,19 @@ -Start the server: -```dart -cd server && pub get && pub run graphql_starwars_test_server +# Star Wars Demo + +### Server side + +To start the server you need to run the following command: +```bash +make && make server !& ``` -And then `flutter run`, or `flutter run -d chrome` for web support: +### Client side + +To consume the API of the server you can run the server with the following command + +- `flutter run` to run it on the ios device +- `flutter run -d chrome` for web support: + +### Screenshots ![flutter for web image](./for_web.png) diff --git a/examples/starwars/android/app/build.gradle b/examples/starwars/android/app/build.gradle index b72075f84..ad9de98a2 100644 --- a/examples/starwars/android/app/build.gradle +++ b/examples/starwars/android/app/build.gradle @@ -34,8 +34,8 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.starwars" - minSdkVersion 16 - targetSdkVersion 28 + minSdkVersion 19 + targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/examples/starwars/android/app/src/main/AndroidManifest.xml b/examples/starwars/android/app/src/main/AndroidManifest.xml index fffba1b86..2685c8883 100644 --- a/examples/starwars/android/app/src/main/AndroidManifest.xml +++ b/examples/starwars/android/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> - + diff --git a/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java b/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java index 70cbcc862..9ff1f9f52 100644 --- a/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java +++ b/examples/starwars/android/app/src/main/java/com/example/starwars/MainActivity.java @@ -1,13 +1,5 @@ package com.example.starwars; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.embedding.android.FlutterActivity; -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} +public class MainActivity extends FlutterActivity { } diff --git a/examples/starwars/android/app/src/main/res/values/styles.xml b/examples/starwars/android/app/src/main/res/values/styles.xml index 00fa4417c..7f287b04b 100644 --- a/examples/starwars/android/app/src/main/res/values/styles.xml +++ b/examples/starwars/android/app/src/main/res/values/styles.xml @@ -5,4 +5,5 @@ Flutter draws its first frame --> @drawable/launch_background + diff --git a/examples/starwars/lib/generated_plugin_registrant.dart b/examples/starwars/lib/generated_plugin_registrant.dart new file mode 100644 index 000000000..3c36ef502 --- /dev/null +++ b/examples/starwars/lib/generated_plugin_registrant.dart @@ -0,0 +1,16 @@ +// +// Generated file. Do not edit. +// + +// ignore_for_file: directives_ordering +// ignore_for_file: lines_longer_than_80_chars + +import 'package:connectivity_plus_web/connectivity_plus_web.dart'; + +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +// ignore: public_member_api_docs +void registerPlugins(Registrar registrar) { + ConnectivityPlusPlugin.registerWith(registrar); + registrar.registerMessageHandler(); +} diff --git a/examples/starwars/lib/main.dart b/examples/starwars/lib/main.dart index cf87a5bc7..b8a5bb114 100644 --- a/examples/starwars/lib/main.dart +++ b/examples/starwars/lib/main.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:starwars_app/view/client/graphql_view.dart'; import 'package:universal_platform/universal_platform.dart'; -import './client_provider.dart'; -import './episode/episode_page.dart'; -import './reviews/review_page.dart'; -import './reviews/review_page_list.dart'; +import 'view/episode/episode_page.dart'; +import 'view/review/review_page.dart'; +import 'view/review/review_page_list.dart'; String get host { // https://github.com/flutter/flutter/issues/36126#issuecomment-596215587 diff --git a/examples/starwars/lib/episode/episode.dart b/examples/starwars/lib/model/episode/episode.dart similarity index 100% rename from examples/starwars/lib/episode/episode.dart rename to examples/starwars/lib/model/episode/episode.dart diff --git a/examples/starwars/lib/model/review/review.dart b/examples/starwars/lib/model/review/review.dart new file mode 100644 index 000000000..2771d07ab --- /dev/null +++ b/examples/starwars/lib/model/review/review.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; + +import 'package:starwars_app/model/episode/episode.dart'; + +class Review { + Review({ + @required this.episode, + @required this.stars, + @required this.id, + this.commentary, + }); + + String id; + Episode episode; + int stars; + String commentary; + + Review copyWith({ + Episode episode, + int stars, + String commentary, + }) { + return Review( + id: id, + episode: episode ?? this.episode, + stars: stars ?? this.stars, + commentary: commentary ?? this.commentary, + ); + } + + Map toJson() { + assert(episode != null && stars != null); + + return { + 'episode': episodeToJson(episode), + 'stars': stars, + 'commentary': commentary, + }; + } + + static Review fromJson(Map map) => Review( + id: map['id'], + episode: episodeFromJson(map['episode'] as String), + stars: map['stars'] as int, + commentary: map['commentary'] as String, + ); +} + +const String Function(Object jsonObject) displayReview = getPrettyJSONString; diff --git a/examples/starwars/lib/client_provider.dart b/examples/starwars/lib/utils/graphql_provider.dart similarity index 60% rename from examples/starwars/lib/client_provider.dart rename to examples/starwars/lib/utils/graphql_provider.dart index 92e0caf54..f22593d87 100644 --- a/examples/starwars/lib/client_provider.dart +++ b/examples/starwars/lib/utils/graphql_provider.dart @@ -32,27 +32,3 @@ ValueNotifier clientFor({ ), ); } - -/// Wraps the root application with the `graphql_flutter` client. -/// We use the cache for all state management. -class ClientProvider extends StatelessWidget { - ClientProvider({ - @required this.child, - @required String uri, - String subscriptionUri, - }) : client = clientFor( - uri: uri, - subscriptionUri: subscriptionUri, - ); - - final Widget child; - final ValueNotifier client; - - @override - Widget build(BuildContext context) { - return GraphQLProvider( - client: client, - child: child, - ); - } -} diff --git a/examples/starwars/lib/view/client/graphql_view.dart b/examples/starwars/lib/view/client/graphql_view.dart new file mode 100644 index 000000000..e65343678 --- /dev/null +++ b/examples/starwars/lib/view/client/graphql_view.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:starwars_app/utils/graphql_provider.dart'; + +/// Wraps the root application with the `graphql_flutter` client. +/// We use the cache for all state management. +class ClientProvider extends StatelessWidget { + ClientProvider({ + @required this.child, + @required String uri, + String subscriptionUri, + }) : client = clientFor( + uri: uri, + subscriptionUri: subscriptionUri, + ); + + final Widget child; + final ValueNotifier client; + + @override + Widget build(BuildContext context) { + return GraphQLProvider( + client: client, + child: child, + ); + } +} diff --git a/examples/starwars/lib/episode/episode_page.dart b/examples/starwars/lib/view/episode/episode_page.dart similarity index 95% rename from examples/starwars/lib/episode/episode_page.dart rename to examples/starwars/lib/view/episode/episode_page.dart index cbe4f480b..c7de2b280 100644 --- a/examples/starwars/lib/episode/episode_page.dart +++ b/examples/starwars/lib/view/episode/episode_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import './episode.dart'; -import './hero_query.dart'; +import '../../model/episode/episode.dart'; +import 'hero_query.dart'; class EpisodePage extends StatefulWidget { static const BottomNavigationBarItem navItem = BottomNavigationBarItem( diff --git a/examples/starwars/lib/episode/hero_query.dart b/examples/starwars/lib/view/episode/hero_query.dart similarity index 97% rename from examples/starwars/lib/episode/hero_query.dart rename to examples/starwars/lib/view/episode/hero_query.dart index de5b0b4fd..7ee9ec3a6 100644 --- a/examples/starwars/lib/episode/hero_query.dart +++ b/examples/starwars/lib/view/episode/hero_query.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -import './episode.dart'; +import '../../model/episode/episode.dart'; class HeroForEpisode extends StatelessWidget { const HeroForEpisode({@required this.episode}); diff --git a/examples/starwars/lib/reviews/review_page.dart b/examples/starwars/lib/view/review/review_page.dart similarity index 93% rename from examples/starwars/lib/reviews/review_page.dart rename to examples/starwars/lib/view/review/review_page.dart index 89296a94b..4038bd842 100644 --- a/examples/starwars/lib/reviews/review_page.dart +++ b/examples/starwars/lib/view/review/review_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import './review_subscription.dart'; +import 'review_subscription.dart'; class ReviewsPage extends StatelessWidget { static const BottomNavigationBarItem navItem = BottomNavigationBarItem( diff --git a/examples/starwars/lib/reviews/review_page_list.dart b/examples/starwars/lib/view/review/review_page_list.dart similarity index 97% rename from examples/starwars/lib/reviews/review_page_list.dart rename to examples/starwars/lib/view/review/review_page_list.dart index eadbf56f2..23aab63ec 100644 --- a/examples/starwars/lib/reviews/review_page_list.dart +++ b/examples/starwars/lib/view/review/review_page_list.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:starwars_app/reviews/review.dart'; +import 'package:starwars_app/view/review/review_view.dart'; class PagingReviews extends StatelessWidget { static const BottomNavigationBarItem navItem = BottomNavigationBarItem( diff --git a/examples/starwars/lib/reviews/review_subscription.dart b/examples/starwars/lib/view/review/review_subscription.dart similarity index 94% rename from examples/starwars/lib/reviews/review_subscription.dart rename to examples/starwars/lib/view/review/review_subscription.dart index 22d10e22a..3b510c4eb 100644 --- a/examples/starwars/lib/reviews/review_subscription.dart +++ b/examples/starwars/lib/view/review/review_subscription.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; - -import './review.dart'; +import 'package:starwars_app/view/review/review_view.dart'; class ReviewFeed extends StatelessWidget { @override diff --git a/examples/starwars/lib/reviews/review.dart b/examples/starwars/lib/view/review/review_view.dart similarity index 56% rename from examples/starwars/lib/reviews/review.dart rename to examples/starwars/lib/view/review/review_view.dart index 4bd18e3d0..ab3f924b2 100644 --- a/examples/starwars/lib/reviews/review.dart +++ b/examples/starwars/lib/view/review/review_view.dart @@ -1,53 +1,5 @@ -import 'package:meta/meta.dart'; import 'package:flutter/material.dart'; - -import '../episode/episode.dart'; - -class Review { - Review({ - @required this.episode, - @required this.stars, - @required this.id, - this.commentary, - }); - - String id; - Episode episode; - int stars; - String commentary; - - Review copyWith({ - Episode episode, - int stars, - String commentary, - }) { - return Review( - id: id, - episode: episode ?? this.episode, - stars: stars ?? this.stars, - commentary: commentary ?? this.commentary, - ); - } - - Map toJson() { - assert(episode != null && stars != null); - - return { - 'episode': episodeToJson(episode), - 'stars': stars, - 'commentary': commentary, - }; - } - - static Review fromJson(Map map) => Review( - id: map['id'], - episode: episodeFromJson(map['episode'] as String), - stars: map['stars'] as int, - commentary: map['commentary'] as String, - ); -} - -const String Function(Object jsonObject) displayReview = getPrettyJSONString; +import 'package:starwars_app/model/review/review.dart'; class DisplayReviews extends StatefulWidget { const DisplayReviews({ From 7f620e5036c9bc201e79f4b291ab87c7b603081e Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 24 Dec 2021 18:39:37 +0100 Subject: [PATCH 34/94] Start work on the flutter bloc issue. Signed-off-by: Vincenzo Palazzo --- examples/flutter_bloc/Makefile | 13 +++++++++++++ examples/flutter_bloc/lib/bloc.dart | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 examples/flutter_bloc/Makefile diff --git a/examples/flutter_bloc/Makefile b/examples/flutter_bloc/Makefile new file mode 100644 index 000000000..8adc84e96 --- /dev/null +++ b/examples/flutter_bloc/Makefile @@ -0,0 +1,13 @@ +CC=flutter + +default: fmt dep + +dep: + $(CC) pub get + +fmt: + $(CC) format . + $(CC) analyze . + +clean: + $(CC) clean \ No newline at end of file diff --git a/examples/flutter_bloc/lib/bloc.dart b/examples/flutter_bloc/lib/bloc.dart index f608497b3..12562af11 100644 --- a/examples/flutter_bloc/lib/bloc.dart +++ b/examples/flutter_bloc/lib/bloc.dart @@ -15,7 +15,8 @@ class _BlocPageState extends State { @override void initState() { super.initState(); - BlocProvider.of(context).add(LoadMyRepos(numOfReposToLoad: 50)); + BlocProvider.of(context) + .add(LoadMyRepos(numOfReposToLoad: 50)); } @override @@ -42,7 +43,8 @@ class _BlocPageState extends State { keyboardType: TextInputType.number, textAlign: TextAlign.center, onChanged: (String n) { - BlocProvider.of(context).add(LoadMyRepos(numOfReposToLoad: int.parse(n) ?? 50)); + BlocProvider.of(context) + .add(LoadMyRepos(numOfReposToLoad: int.parse(n) ?? 50)); }, ), SizedBox( From 0179c68f9814657260fa5883376017a758af0a80 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 24 Dec 2021 19:02:17 +0100 Subject: [PATCH 35/94] Add necessary import to GraphQL Upload example MediaType is not visible from http package, you need to import http_parser.dart in order to be able to use it. --- packages/graphql/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index ddb0c4dac..29ce12215 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -261,6 +261,7 @@ mutation($files: [Upload!]!) { ```dart import "package:http/http.dart" show Multipartfile; +import "package:http_parser/http_parser.dart" show MediaType; // ... From 084c1673b9ca58ef654231d48834c2d6319a2b2a Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 24 Dec 2021 19:13:47 +0100 Subject: [PATCH 36/94] github: update the issue template. Signed-off-by: Vincenzo Palazzo --- .github/ISSUE_TEMPLATE/bug_report.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9cc2f8751..28b1c58af 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -10,12 +10,16 @@ assignees: '' **Describe the issue** A clear and concise description of what the problem is. -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error +**To Reproduce (MUST BE PROVIDED)** + +To help us to understand what is going on and what is the easy way to resolve this bug +we ask to describe the issue with a small code example, or if the problem is easy you can +describe the issue as follows: + +1. When I use '...' to try '...' +2. I receive the following '....' +4. See error also the error if any +3. But I would like to receive '....' **Expected behavior** From c6f11802555faf61ffdf327a3726504f1a6da455 Mon Sep 17 00:00:00 2001 From: Marc Leonetti Date: Mon, 27 Dec 2021 13:43:16 +0100 Subject: [PATCH 37/94] change code style --- .../lib/src/links/websocket_link/websocket_client.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index ac5401d84..b6d236bde 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -226,8 +226,8 @@ class SocketClient { try { // Even though config.connect is sync, we call async in order to make the // SocketConnectionState.connected attribution not overload SocketConnectionState.connecting - socketChannel = - (await config.connect(Uri.parse(url), protocols)).forGraphQL(); + var connection = await config.connect(Uri.parse(url), protocols); + socketChannel = connection.forGraphQL(); _connectionStateController.add(SocketConnectionState.connected); print('Connected to websocket.'); _write(initOperation); From fec81bb19581e99accfd4dd4ba4b17e8637a66c5 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 28 Dec 2021 18:12:42 +0100 Subject: [PATCH 38/94] fixed the gql dependecens due the breaking changes Signed-off-by: Vincenzo Palazzo --- packages/graphql/pubspec.yaml | 4 ++-- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 7583fd246..bfaa12f1e 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -7,8 +7,8 @@ dependencies: path: ^1.8.0 gql: ^0.13.0 gql_exec: 0.3.0 - gql_link: ^0.4.0 - gql_http_link: ^0.4.0 + gql_link: 0.4.0 + gql_http_link: 0.4.0 gql_transform_link: ^0.2.0 gql_error_link: ^0.2.0 gql_dedupe_link: ^2.0.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 8b12750e6..be7217289 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: none dependencies: graphql: # 5.0.0 path: ../graphql - gql_exec: ^0.3.0 + gql_exec: 0.3.0 flutter: sdk: flutter meta: ^1.3.0 From e48c3d05de66c5c9826ce98bd3fb91492595bbcd Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 28 Dec 2021 18:16:11 +0100 Subject: [PATCH 39/94] ci: removed periodic workflow Signed-off-by: Vincenzo Palazzo --- .circleci/config.yml | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3464fb8bf..cffce6922 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -132,35 +132,6 @@ jobs: ~/yq -P -i eval '.dependencies.graphql=env(GRAPHQL_DEP) | del(.publish_to)' pubspec.yaml pub publish -f workflows: - nightly: - triggers: - - schedule: - cron: "0 12 * * *" - filters: - branches: - only: - - beta - jobs: - - dependencies - - release: - requires: - - dependencies - weekly: - triggers: - - schedule: - cron: "0 21 * * 1" - filters: - branches: - only: - - master - jobs: - - dependencies - - release: - requires: - - dependencies - - sync_with_beta: - requires: - - release default: jobs: - dependencies: From 09cc452954d8423f37ee9a98ff50dffe82638b29 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 28 Dec 2021 18:22:27 +0100 Subject: [PATCH 40/94] ci: adding unit testing inside the github actions. Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_flutter_tests.yml | 19 +++++++++++++++++++ .github/workflows/graphql_tests.yml | 20 ++++++++++++++++++++ README.md | 6 ++---- 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/graphql_flutter_tests.yml create mode 100644 .github/workflows/graphql_tests.yml diff --git a/.github/workflows/graphql_flutter_tests.yml b/.github/workflows/graphql_flutter_tests.yml new file mode 100644 index 000000000..5664413c6 --- /dev/null +++ b/.github/workflows/graphql_flutter_tests.yml @@ -0,0 +1,19 @@ +name: graphql-flutter Tests case + +on: [ push, pull_request ] + +jobs: + build: + # This job will run on ubuntu virtual machine + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: subosito/flutter-action@v1 + with: + channel: 'stable' + - run: | + cd packages/graphql_flutter + flutter pub get + - run: | + cd packages/graphql_flutter + flutter test . \ No newline at end of file diff --git a/.github/workflows/graphql_tests.yml b/.github/workflows/graphql_tests.yml new file mode 100644 index 000000000..cf4bbc895 --- /dev/null +++ b/.github/workflows/graphql_tests.yml @@ -0,0 +1,20 @@ +name: graphql Test case + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: dart-lang/setup-dart@v1 + with: + sdk: stable + - name: Install dependencies + run: | + cd packages/graphql + dart pub get + - name: Code formatting check + run: | + cd packages/graphql + dart test . \ No newline at end of file diff --git a/README.md b/README.md index 803f0087f..e89afad70 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ ### 📌   Bulletin * See the [`v3 -> v4` Migration Guide](./changelog-v3-v4.md) if you're still on `v3`. -* [Maintenance status: Low](https://github.com/zino-app/graphql-flutter/issues/763). - * Follow [#762](https://github.com/zino-app/graphql-flutter/issues/762) for updates on the planned architecture walk through videos. * [Join the discord.][discord-link] ## About this project @@ -121,8 +119,8 @@ Thanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind are welcome! -[build-status-badge]: https://img.shields.io/circleci/build/github/zino-app/graphql-flutter.svg?style=flat-square -[build-status-link]: https://circleci.com/gh/zino-app/graphql-flutter +[build-status-badge]: https://img.shields.io/github/workflow/status/zino-hofmann/graphql-flutter/graphql-flutter%20Tests%20case?style=flat-square +[build-status-link]: https://github.com/zino-hofmann/graphql-flutter/actions [coverage-badge]: https://img.shields.io/codecov/c/github/zino-app/graphql-flutter.svg?style=flat-square [coverage-link]: https://codecov.io/gh/zino-app/graphql-flutter [version-badge]: https://img.shields.io/pub/v/graphql_flutter.svg?style=flat-square From f0793fd35279bb7948c53ce7204a343dca883705 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Tue, 28 Dec 2021 17:34:28 +0000 Subject: [PATCH 41/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index bfaa12f1e..ff68079f3 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.1 +version: 5.0.1-beta.2 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index be7217289..a73358bc0 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.1 +version: 5.0.1-beta.2 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter publish_to: none dependencies: From 41b92774b63666eac70b8fd805b69671c70246a4 Mon Sep 17 00:00:00 2001 From: adnan Date: Thu, 6 Jan 2022 12:14:15 +0300 Subject: [PATCH 42/94] update README.md --- packages/graphql_flutter/README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/graphql_flutter/README.md b/packages/graphql_flutter/README.md index f15787350..0e3318af7 100644 --- a/packages/graphql_flutter/README.md +++ b/packages/graphql_flutter/README.md @@ -51,7 +51,7 @@ First, depend on this package: ```yaml dependencies: - graphql_flutter: ^4.0.0-beta + graphql_flutter: ^5.0.0 ``` And then import it inside your dart code: @@ -61,14 +61,14 @@ import 'package:graphql_flutter/graphql_flutter.dart'; ``` ## Migration Guide - + Find the migration from version 3 to version 4 [here](./../../changelog-v3-v4.md). ## Usage To connect to a GraphQL Server, we first need to create a `GraphQLClient`. A `GraphQLClient` requires both a `cache` and a `link` to be initialized. -In our example below, we will be using the Github Public API. we are going to use `HttpLink` which we will concatenate with `AuthLink` so as to attach our github access token. For the cache, we are going to use `GraphQLCache`. +In our example below, we will be using the Github Public API. we are going to use `HttpLink` which we will concatenate with `AuthLink` so as to attach our [github access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token). For the cache, we are going to use `GraphQLCache`. ```dart ... @@ -157,28 +157,31 @@ Query( variables: { 'nRepositories': 50, }, - pollInterval: Duration(seconds: 10), + pollInterval: const Duration(seconds: 10), ), // Just like in apollo refetch() could be used to manually trigger a refetch // while fetchMore() can be used for pagination purpose - builder: (QueryResult result, { VoidCallback refetch, FetchMore fetchMore }) { + builder: (QueryResult result, { VoidCallback? refetch, FetchMore? fetchMore }) { if (result.hasException) { return Text(result.exception.toString()); } if (result.isLoading) { - return Text('Loading'); + return const Text('Loading'); } - // it can be either Map or List - List repositories = result.data['viewer']['repositories']['nodes']; + List? repositories = result.data?['viewer']?['repositories']?['nodes']; + + if (repositories == null) { + return const Text('No repositories'); + } return ListView.builder( itemCount: repositories.length, itemBuilder: (context, index) { final repository = repositories[index]; - return Text(repository['name']); + return Text(repository['name'] ?? ''); }); }, ); From 67ef1a86ed1a2b0844ea30789c4a951d30fce133 Mon Sep 17 00:00:00 2001 From: Adnan <54329101+adnanjpg@users.noreply.github.com> Date: Thu, 6 Jan 2022 20:01:31 +0300 Subject: [PATCH 43/94] Apply suggestions from code review Co-authored-by: Vincenzo Palazzo --- packages/graphql_flutter/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/graphql_flutter/README.md b/packages/graphql_flutter/README.md index 0e3318af7..0f15335b8 100644 --- a/packages/graphql_flutter/README.md +++ b/packages/graphql_flutter/README.md @@ -51,7 +51,7 @@ First, depend on this package: ```yaml dependencies: - graphql_flutter: ^5.0.0 + graphql_flutter: ^ ``` And then import it inside your dart code: @@ -61,7 +61,6 @@ import 'package:graphql_flutter/graphql_flutter.dart'; ``` ## Migration Guide - Find the migration from version 3 to version 4 [here](./../../changelog-v3-v4.md). ## Usage From ea7a3174c68b0ade8b7708fb9c92295ab17cc34e Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Sat, 8 Jan 2022 15:56:55 +0000 Subject: [PATCH 44/94] feat: Update normalize Update normalize to `0.6.0` and update documentation. --- packages/graphql/README.md | 73 +++++++++++++++++++++++++++++++++++ packages/graphql/pubspec.yaml | 2 +- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index 29ce12215..2b3ddb685 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -422,6 +422,79 @@ String customDataIdFromObject(Map data) { } ``` +Normalize requires you to specify the possible types map for fragments to work correctly. This +is a mapping from abstract union and interface types to their concrete object types. E.g. take the +schema + +```graphql + +interface PersonI { + name: String + age: Int +} + +type Employee implements PersonI { + name: String + age: Int + daysOfEmployement: Int +} + +type InStoreCustomer implements PersonI { + name: String + age: Int + numberOfPurchases: Int +} + +type OnlineCustomer implements PersonI { + name: String + age: Int + numberOfPurchases: Int +} + +union CustomerU = OnlineCustomer | InStoreCustomer + +``` + +the possible types map would be: + +```dart +const POSSIBLE_TYPES = const { + 'CustomerU': {'InStoreCustomer', 'OnlineCustomer'}, + 'PersonI': {'Employee', 'InStoreCustomer', 'OnlineCustomer'}, +} + +// Here's how it's parsed to the cache +final client = GraphQLClient( + cache: GraphQLCache( + possibleTypes: POSSIBLE_TYPES, + ), +) +``` + +You can generate the `POSSIBLE_TYPES` map, e.g., using [graphql_codegen](https://pub.dev/packages/graphql_codegen). + +Furthermore, for normalize to correctly resolve the type you should always make sure you're querying the `__typename`. Given the example above a query could look something like + +```graphql + +query { + people { + __typename # Needed to decide where which entry to update in the cache + ... on Employee { + name + age + } + ... on Customer { + name + age + } + } +} + +``` + +if you're not providing the possible type map and introspecting the typename, the cache can't be updated. + ## Direct Cache Access API The [`GraphQLCache`](https://pub.dev/documentation/graphql/latest/graphql/GraphQLCache-class.html) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index ff68079f3..ab9f2355b 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: gql_error_link: ^0.2.0 gql_dedupe_link: ^2.0.0 hive: ^2.0.0 - normalize: ^0.5.3 + normalize: ^0.6.0 http: ^0.13.0 collection: ^1.15.0 web_socket_channel: ^2.0.0 From 2e39e66b3f33d035a0a8e86448c930b008a0d0b5 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Sat, 8 Jan 2022 16:22:33 +0000 Subject: [PATCH 45/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index ab9f2355b..be5a59948 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.2 +version: 5.0.1-beta.3 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index a73358bc0..eead31c1f 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.2 +version: 5.0.1-beta.3 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter publish_to: none dependencies: From cc6d95edbc4733c8f405fabc92c6b816cac86859 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 11 Jan 2022 17:40:30 +0100 Subject: [PATCH 46/94] graphql: removing print url into the console Signed-off-by: Vincenzo Palazzo --- .../graphql/lib/src/links/websocket_link/websocket_client.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index b6d236bde..1289a27a4 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -221,7 +221,6 @@ class SocketClient { } _connectionStateController.add(SocketConnectionState.connecting); - print('Connecting to websocket: $url...'); try { // Even though config.connect is sync, we call async in order to make the From a736d0228473035d9b74ba3621aef05eb0094623 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Wed, 12 Jan 2022 17:57:52 +0100 Subject: [PATCH 47/94] graphql: removing more print statment in the socket client Fixes https://github.com/zino-hofmann/graphql-flutter/issues/1008 Signed-off-by: Vincenzo Palazzo --- .../lib/src/links/websocket_link/websocket_client.dart | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 1289a27a4..97ffc766d 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -200,9 +200,6 @@ class SocketClient { _keepAliveSubscription = messages.whereType().timeout( config.inactivityTimeout!, onTimeout: (EventSink event) { - print( - "Haven't received keep alive message for ${config.inactivityTimeout!.inSeconds} seconds. Disconnecting..", - ); event.close(); socketChannel!.sink.close(ws_status.goingAway); _connectionStateController.add(SocketConnectionState.notConnected); @@ -228,7 +225,6 @@ class SocketClient { var connection = await config.connect(Uri.parse(url), protocols); socketChannel = connection.forGraphQL(); _connectionStateController.add(SocketConnectionState.connected); - print('Connected to websocket.'); _write(initOperation); if (config.inactivityTimeout != null) { @@ -278,10 +274,6 @@ class SocketClient { if (config.autoReconnect && !_connectionStateController.isClosed) { if (config.delayBetweenReconnectionAttempts != null) { - print( - 'Scheduling to connect in ${config.delayBetweenReconnectionAttempts!.inSeconds} seconds...', - ); - _reconnectTimer = Timer( config.delayBetweenReconnectionAttempts!, () { @@ -392,7 +384,6 @@ class SocketClient { .timeout( config.queryAndMutationTimeout!, onTimeout: (EventSink event) { - print('Request timed out.'); response.addError(TimeoutException('Request timed out.')); event.close(); response.close(); From 5dccfe1bf0cef2b8d3198edaad484c71b478261c Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 16 Jan 2022 12:54:01 +0100 Subject: [PATCH 48/94] graphql: restore ws test by introducing a ws echo server written in dart Signed-off-by: Vincenzo Palazzo --- packages/graphql/test/coverage.dart | 4 ++-- .../test/mock_server/ws_echo_server.dart | 20 +++++++++++++++++++ packages/graphql/test/websocket_test.dart | 18 ++++++++++------- 3 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 packages/graphql/test/mock_server/ws_echo_server.dart diff --git a/packages/graphql/test/coverage.dart b/packages/graphql/test/coverage.dart index f7b64365a..9c0d47b1b 100644 --- a/packages/graphql/test/coverage.dart +++ b/packages/graphql/test/coverage.dart @@ -7,7 +7,7 @@ import 'cache/store_test.dart' as cache_store_test; import 'fetch_policy_test.dart' as fetch_policy_test; import 'graphql_client_test.dart' as graphql_client_test; import 'query_options_test.dart' as query_options_test; -//import 'websocket_test.dart' as websocket_test; +import 'websocket_test.dart' as websocket_test; void main() { query_options_test.main(); @@ -15,6 +15,6 @@ void main() { cache_graphql_cache_test.main(); fetch_policy_test.main(); anonymous_operations_test.main(); - //websocket_test.main(); + websocket_test.main(); graphql_client_test.main(); } diff --git a/packages/graphql/test/mock_server/ws_echo_server.dart b/packages/graphql/test/mock_server/ws_echo_server.dart new file mode 100644 index 000000000..379812206 --- /dev/null +++ b/packages/graphql/test/mock_server/ws_echo_server.dart @@ -0,0 +1,20 @@ +/// Web Socket echo server +/// to run the test and cover the web socket test +/// +/// author: https://github.com/vincenzopalazzo +import 'dart:io'; + +/// Main function to create and run the echo server over the web socket. +Future runWebSocketServer( + {String host = "127.0.0.1", int port = 5600}) async { + HttpServer server = await HttpServer.bind(host, port); + server.transform(WebSocketTransformer()).listen(onWebSocketData); + return "ws://$host:$port"; +} + +/// Handle event received on server. +void onWebSocketData(WebSocket client) { + client.listen((data) { + client.add(data); + }); +} diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index e65665df9..4d4048d0e 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -1,4 +1,4 @@ -@Skip('currently failing for web socket services unavailable') +//@Skip('currently failing for web socket services unavailable') import 'dart:async'; @@ -14,6 +14,7 @@ import 'package:graphql/client.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import './helpers.dart'; +import './mock_server/ws_echo_server.dart'; class EchoSink extends DelegatingStreamSink implements WebSocketSink { final StreamSink sink; @@ -85,8 +86,10 @@ class EchoSocket implements WebSocketChannel { throw UnimplementedError(); } -SocketClient getTestClient([StreamController? controller]) => SocketClient( - 'ws://echo.websocket.org', +SocketClient getTestClient( + {required String wsUrl, StreamController? controller}) => + SocketClient( + wsUrl, connect: (_, __) => EchoSocket.connect(controller ?? BehaviorSubject()), config: SocketClientConfig( delayBetweenReconnectionAttempts: Duration(milliseconds: 1), @@ -96,7 +99,8 @@ SocketClient getTestClient([StreamController? controller]) => SocketClient( ), ); -void main() { +Future main() async { + String wsUrl = await runWebSocketServer(); group('InitOperation', () { test('null payload', () { // ignore: deprecated_member_use_from_same_package @@ -139,7 +143,7 @@ void main() { r'}'; setUp(overridePrint((log) { controller = StreamController(sync: true); - socketClient = getTestClient(controller); + socketClient = getTestClient(controller: controller, wsUrl: wsUrl); })); tearDown(overridePrint( (log) => socketClient.dispose(), @@ -263,7 +267,7 @@ void main() { setUp(overridePrint((log) { socketClient = SocketClient( - 'ws://echo.websocket.org', + wsUrl, connect: (_, __) => EchoSocket.connect(BehaviorSubject()), config: SocketClientConfig(initialPayload: () => initPayload), ); @@ -295,7 +299,7 @@ void main() { setUp(overridePrint((log) { socketClient = SocketClient( - 'ws://echo.websocket.org', + wsUrl, connect: (_, __) => EchoSocket.connect(BehaviorSubject()), config: SocketClientConfig( initialPayload: () async { From eb0b83def1ee1f57164b873740accca2f57ead48 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 16 Jan 2022 13:44:57 +0100 Subject: [PATCH 49/94] ci: fixed reporting coverage status Signed-off-by: Vincenzo Palazzo --- .codecov.yml | 13 ++----------- .github/workflows/graphql_codcoverage.yml | 19 ++++++++++--------- .../workflows/graphql_flutter_codcoverage.yml | 12 +++++++----- packages/graphql/pubspec.yaml | 3 ++- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/.codecov.yml b/.codecov.yml index 3f4186e24..7b1bff2a6 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -1,10 +1,3 @@ -flags: - - graphql_flutter: - paths: - - packages/graphql_flutter/ - - graphql_client: - paths: - - packages/graphql/ comment: require_changes: true # Only post a comment if coverage changes. @@ -17,7 +10,5 @@ coverage: # don't factor tests into coverage scores ignore: - - packages/graphql_flutter/test - - packages/graphql_flutter/example - - packages/graphql/test - - packages/graphql/example + - '**/example/' + - '**/*.g.dart' diff --git a/.github/workflows/graphql_codcoverage.yml b/.github/workflows/graphql_codcoverage.yml index 0d8464a44..fc72da451 100644 --- a/.github/workflows/graphql_codcoverage.yml +++ b/.github/workflows/graphql_codcoverage.yml @@ -11,13 +11,14 @@ jobs: - uses: dart-lang/setup-dart@v1 with: sdk: stable - - run: | + - name: Run tests with coverage + run: | cd packages/graphql - pub get - pub global activate coverage - dart --enable_asserts --enable-vm-service test/coverage.dart - - run: | - cd packages/graphql - bash <(curl -s https://codecov.io/bash) -F graphql_client - bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client - dart analyze test \ No newline at end of file + dart pub get + pub run test --coverage="coverage" + pub run coverage:format_coverage --lcov --in=coverage --out=coverage.lcov --packages=.packages --report-on=lib + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1.0.2 + with: + token: ${{secrets.CODECOV_TOKEN}} + file: packages/graphql/coverage.lcov \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_codcoverage.yml b/.github/workflows/graphql_flutter_codcoverage.yml index 3fc11c18f..7a8f666f4 100644 --- a/.github/workflows/graphql_flutter_codcoverage.yml +++ b/.github/workflows/graphql_flutter_codcoverage.yml @@ -1,4 +1,4 @@ -name: graphql-flutter Dart Code sanity check +name: graphql-flutter Code coverage on: [ push, pull_request ] @@ -12,8 +12,10 @@ jobs: channel: 'stable' - run: | cd packages/graphql_flutter + flutter pub get flutter test --coverage - - run: | - cd packages/graphql_flutter - bash <(curl -s https://codecov.io/bash) -F graphql_client - bash <(curl -s https://codecov.io/bash) -F graphql_client -B `git rev-parse --abbrev-ref HEAD`_pseudo_branch_package_graphql_client \ No newline at end of file + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1.0.2 + with: + token: ${{secrets.CODECOV_TOKEN}} + file: packages/graphql_flutter/coverage/lcov.info \ No newline at end of file diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index be5a59948..8a2f65f30 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -23,7 +23,8 @@ dependencies: dev_dependencies: async: ^2.5.0 mockito: ^5.0.0 - test: ^1.5.3 + test: ^1.18.2 + coverage: ^1.0.3 http_parser: ^4.0.0 lints: ^1.0.1 environment: From e9d313ca05518a960d4dce141b5b718d79dc1f7c Mon Sep 17 00:00:00 2001 From: Klondike Dragon Date: Mon, 17 Jan 2022 20:14:46 -0700 Subject: [PATCH 50/94] graphql: fix closing of websockets on web platform The websocket must be closed with the ws_status.normalClosure code or the browser will throw a DOMException. Also avoid a previous race condition where it could attempt to reconnect when dispose was called because closing the socket triggered onConnectionLost. --- .../websocket_link/websocket_client.dart | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 97ffc766d..12c3259c9 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -173,6 +173,7 @@ class SocketClient { HashMap(); bool _connectionWasLost = false; + bool _wasDisposed = false; Timer? _reconnectTimer; @@ -201,19 +202,31 @@ class SocketClient { config.inactivityTimeout!, onTimeout: (EventSink event) { event.close(); - socketChannel!.sink.close(ws_status.goingAway); - _connectionStateController.add(SocketConnectionState.notConnected); + unawaited(_closeSocketChannel()); }, ).listen(null); } + Future _closeSocketChannel() async { + // avoid race condition in onCancel by setting socket connection + // state to notConnected prior to closing socket. This ensures we don't + // attempt to send a message over the channel that we're closing + // if we are forcefully closing the socket + if (!_connectionStateController.isClosed && + _connectionStateController.value != + SocketConnectionState.notConnected) { + _connectionStateController.add(SocketConnectionState.notConnected); + } + await socketChannel?.sink.close(ws_status.normalClosure); + } + /// Connects to the server. /// /// If this instance is disposed, this method does nothing. Future _connect() async { final InitOperation initOperation = await config.initOperation; - if (_connectionStateController.isClosed) { + if (_connectionStateController.isClosed || _wasDisposed) { return; } @@ -250,8 +263,8 @@ class SocketClient { } } - void onConnectionLost([e]) { - socketChannel?.sink.close(ws_status.goingAway); + void onConnectionLost([e]) async { + await _closeSocketChannel(); if (e != null) { print('There was an error causing connection lost: $e'); } @@ -260,19 +273,16 @@ class SocketClient { _keepAliveSubscription?.cancel(); _messageSubscription?.cancel(); - if (_connectionStateController.isClosed) { + if (_connectionStateController.isClosed || _wasDisposed) { return; } _connectionWasLost = true; _subscriptionInitializers.values.forEach((s) => s.hasBeenTriggered = false); - if (_connectionStateController.value != - SocketConnectionState.notConnected) { - _connectionStateController.add(SocketConnectionState.notConnected); - } - - if (config.autoReconnect && !_connectionStateController.isClosed) { + if (config.autoReconnect && + !_connectionStateController.isClosed && + !_wasDisposed) { if (config.delayBetweenReconnectionAttempts != null) { _reconnectTimer = Timer( config.delayBetweenReconnectionAttempts!, @@ -293,11 +303,15 @@ class SocketClient { /// Use this method if you'd like to disconnect from the specified server permanently, /// and you'd like to connect to another server instead of the current one. Future dispose() async { + // Make sure we do not attempt to reconnect when we close the socket + // and onConnectionLost is called (as part of onDone) + _wasDisposed = true; print('Disposing socket client..'); _reconnectTimer?.cancel(); + _keepAliveSubscription?.cancel(); await Future.wait([ - socketChannel?.sink.close(ws_status.goingAway), + _closeSocketChannel(), _messageSubscription?.cancel(), _connectionStateController.close(), ].where((future) => future != null).cast>().toList()); @@ -375,7 +389,7 @@ class SocketClient { return false; }, - ).takeWhile((_) => !response.isClosed); + ).takeWhile((_) => (!response.isClosed && !_wasDisposed)); final Stream subscriptionComplete = addTimeout ? dataErrorComplete From 7372cfbd330453115358f855c1ebc394fd9cbf4e Mon Sep 17 00:00:00 2001 From: Klondike Dragon Date: Mon, 17 Jan 2022 20:46:17 -0700 Subject: [PATCH 51/94] graphql: fix websocket autoReconnect on server disconnect Previously cancelOnError was set to true for the _messages stream, so onConnectionLost would not get called after an error (such as a WebSocketChannelException on a forced disconnect from the server), and thus it would not attempt to reconnect. This was manually tested on the web platform to reconnect after the proper duration after the server forcefully disconnects a websocket. --- .../lib/src/links/websocket_link/websocket_client.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 12c3259c9..6b50612c6 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -247,7 +247,9 @@ class SocketClient { _messageSubscription = _messages.listen( onMessage, onDone: onConnectionLost, - cancelOnError: true, + // onDone will not be triggered if the subscription is + // auto-cancelled on error; make sure to pass false + cancelOnError: false, onError: onStreamError, ); @@ -457,7 +459,7 @@ class SocketClient { } void _defaultOnStreamError(Object error, StackTrace st) { - print('[SocketClient] message stream ecnountered error: $error\n' + print('[SocketClient] message stream encountered error: $error\n' 'stacktrace:\n${st.toString()}'); } From 3220693a48f22b76d7da0039f99725c24aaf8083 Mon Sep 17 00:00:00 2001 From: Klondike Dragon Date: Tue, 18 Jan 2022 17:38:20 -0700 Subject: [PATCH 52/94] graphql: add 3 websocket tests for dispose/reconnect New websocket tests: * disconnecting socket via dispose * resubscribing after server forces disconnect * without autoReconnect it will not reconnect --- .../test/mock_server/ws_echo_server.dart | 10 +- packages/graphql/test/websocket_test.dart | 166 +++++++++++++++++- 2 files changed, 171 insertions(+), 5 deletions(-) diff --git a/packages/graphql/test/mock_server/ws_echo_server.dart b/packages/graphql/test/mock_server/ws_echo_server.dart index 379812206..45c5360da 100644 --- a/packages/graphql/test/mock_server/ws_echo_server.dart +++ b/packages/graphql/test/mock_server/ws_echo_server.dart @@ -4,6 +4,8 @@ /// author: https://github.com/vincenzopalazzo import 'dart:io'; +const String forceDisconnectCommand = '___force_disconnect___'; + /// Main function to create and run the echo server over the web socket. Future runWebSocketServer( {String host = "127.0.0.1", int port = 5600}) async { @@ -14,7 +16,11 @@ Future runWebSocketServer( /// Handle event received on server. void onWebSocketData(WebSocket client) { - client.listen((data) { - client.add(data); + client.listen((data) async { + if (data != null && data.toString().contains(forceDisconnectCommand)) { + client.close(WebSocketStatus.normalClosure, 'shutting down'); + } else { + client.add(data); + } }); } diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index 4d4048d0e..d759595fd 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -1,6 +1,7 @@ //@Skip('currently failing for web socket services unavailable') import 'dart:async'; +import 'dart:io'; import 'package:async/async.dart'; import 'package:rxdart/subjects.dart'; @@ -87,12 +88,17 @@ class EchoSocket implements WebSocketChannel { } SocketClient getTestClient( - {required String wsUrl, StreamController? controller}) => + {required String wsUrl, + StreamController? controller, + bool autoReconnect = true, + Duration delayBetweenReconnectionAttempts = + const Duration(milliseconds: 1)}) => SocketClient( wsUrl, connect: (_, __) => EchoSocket.connect(controller ?? BehaviorSubject()), config: SocketClientConfig( - delayBetweenReconnectionAttempts: Duration(milliseconds: 1), + autoReconnect: autoReconnect, + delayBetweenReconnectionAttempts: delayBetweenReconnectionAttempts, ), randomBytesForUuid: Uint8List.fromList( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], @@ -159,6 +165,47 @@ Future main() async { ), ); }); + test('disconnect via dispose', () async { + // First wait for connection to complete + await expectLater( + socketClient.connectionState.asBroadcastStream(), + emitsInOrder( + [ + SocketConnectionState.connecting, + SocketConnectionState.connected, + ], + ), + ); + + // We need to begin waiting on the connectionState + // before we issue the command to disconnect; otherwise + // it can reconnect so fast that it will be reconnected + // by the time that the expectLater check is initiated. + await overridePrint((_) async { + Timer(const Duration(milliseconds: 20), () async { + await socketClient.dispose(); + }); + })(); + // The connectionState BehaviorController emits the current state + // to any new listener, so we expect it to start in the connected + // state and transition to notConnected because of dispose. + await expectLater( + socketClient.connectionState, + emitsInOrder([ + SocketConnectionState.connected, + SocketConnectionState.notConnected, + ]), + ); + + // Have to wait for socket close to be fully processed after we reach + // the notConnected state, including updating channel with close code. + await Future.delayed(const Duration(milliseconds: 20)); + + // The websocket should be in a fully closed state at this point, + // we should have a confirmed close code in the channel. + expect(socketClient.socketChannel, isNotNull); + expect(socketClient.socketChannel!.closeCode, isNotNull); + }); test('subscription data', () async { final payload = Request( operation: Operation(document: parseString('subscription {}')), @@ -217,11 +264,80 @@ Future main() async { ]), ); - socketClient.onConnectionLost(); + await overridePrint((_) async { + socketClient.onConnectionLost(); + })(); + + await expectLater( + socketClient.connectionState, + emitsInOrder([ + SocketConnectionState.notConnected, + SocketConnectionState.connecting, + SocketConnectionState.connected, + ]), + ); + + // ignore: unawaited_futures + socketClient.socketChannel!.stream + .where((message) => message == expectedMessage) + .first + .then((_) { + socketClient.socketChannel!.sink.add(jsonEncode({ + 'type': 'data', + 'id': '01020304-0506-4708-890a-0b0c0d0e0f10', + 'payload': { + 'data': {'foo': 'bar'}, + 'errors': [ + {'message': 'error and data can coexist'} + ] + } + })); + }); + + await expectLater( + subscriptionDataStream, + emits( + // todo should ids be included in response context? probably '01020304-0506-4708-890a-0b0c0d0e0f10' + Response( + data: {'foo': 'bar'}, + errors: [ + GraphQLError(message: 'error and data can coexist'), + ], + context: Context().withEntry(ResponseExtensions(null)), + ), + ), + ); + }); + test('resubscribe after server disconnect', () async { + final payload = Request( + operation: Operation(document: gql('subscription {}')), + ); + final waitForConnection = true; + final subscriptionDataStream = + socketClient.subscribe(payload, waitForConnection); + + await expectLater( + socketClient.connectionState, + emitsInOrder([ + SocketConnectionState.connecting, + SocketConnectionState.connected, + ]), + ); + // We need to begin waiting on the connectionState + // before we issue the command to disconnect; otherwise + // it can reconnect so fast that it will be reconnected + // by the time that the expectLater check is initiated. + Timer(const Duration(milliseconds: 20), () async { + socketClient.socketChannel!.sink.add(forceDisconnectCommand); + }); + // The connectionState BehaviorController emits the current state + // to any new listener, so we expect it to start in the connected + // state, transition to notConnected, and then reconnect after that. await expectLater( socketClient.connectionState, emitsInOrder([ + SocketConnectionState.connected, SocketConnectionState.notConnected, SocketConnectionState.connecting, SocketConnectionState.connected, @@ -261,6 +377,50 @@ Future main() async { }); }, tags: "integration"); + group('SocketClient without autoReconnect', () { + late SocketClient socketClient; + StreamController controller; + setUp(overridePrint((log) { + controller = StreamController(sync: true); + socketClient = getTestClient( + controller: controller, wsUrl: wsUrl, autoReconnect: false); + })); + tearDown(overridePrint( + (log) => socketClient.dispose(), + )); + test('server disconnect', () async { + final payload = Request( + operation: Operation(document: gql('subscription {}')), + ); + final waitForConnection = true; + socketClient.subscribe(payload, waitForConnection); + + await expectLater( + socketClient.connectionState, + emitsInOrder([ + SocketConnectionState.connecting, + SocketConnectionState.connected, + ]), + ); + + Timer(const Duration(milliseconds: 20), () async { + socketClient.socketChannel!.sink.add(forceDisconnectCommand); + }); + // Same strategy as elsewhere, start expecting the state on the + // stream before the disconnect actually happens... + await expectLater( + socketClient.connectionState, + emitsInOrder([ + SocketConnectionState.connected, + SocketConnectionState.notConnected, + ]), + ); + + expect( + socketClient.socketChannel!.closeCode, WebSocketStatus.normalClosure); + }); + }, tags: "integration"); + group('SocketClient with const payload', () { late SocketClient socketClient; const initPayload = {'token': 'mytoken'}; From 33f75dfabb1a27e855757e09033db0f0a855f958 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Wed, 19 Jan 2022 10:45:01 +0100 Subject: [PATCH 53/94] ci: upgrade code coverage Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_codcoverage.yml | 10 +++++----- .github/workflows/graphql_flutter_codcoverage.yml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/graphql_codcoverage.yml b/.github/workflows/graphql_codcoverage.yml index fc72da451..8c2b0f409 100644 --- a/.github/workflows/graphql_codcoverage.yml +++ b/.github/workflows/graphql_codcoverage.yml @@ -17,8 +17,8 @@ jobs: dart pub get pub run test --coverage="coverage" pub run coverage:format_coverage --lcov --in=coverage --out=coverage.lcov --packages=.packages --report-on=lib - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1.0.2 - with: - token: ${{secrets.CODECOV_TOKEN}} - file: packages/graphql/coverage.lcov \ No newline at end of file + - name: Upload coverage file + run: | + curl -Os https://uploader.codecov.io/latest/linux/codecov + chmod +x codecov + ./codecov --file packages/graphql/coverage.lcov \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_codcoverage.yml b/.github/workflows/graphql_flutter_codcoverage.yml index 7a8f666f4..16b3482a3 100644 --- a/.github/workflows/graphql_flutter_codcoverage.yml +++ b/.github/workflows/graphql_flutter_codcoverage.yml @@ -14,8 +14,8 @@ jobs: cd packages/graphql_flutter flutter pub get flutter test --coverage - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1.0.2 - with: - token: ${{secrets.CODECOV_TOKEN}} - file: packages/graphql_flutter/coverage/lcov.info \ No newline at end of file + - name: Upload coverage file + run: | + curl -Os https://uploader.codecov.io/latest/linux/codecov + chmod +x codecov + ./codecov --file packages/graphql_flutter/coverage/lcov.info \ No newline at end of file From dc7eaf55a02570b36d07572780e27935d4db3bf8 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Wed, 19 Jan 2022 10:52:21 +0100 Subject: [PATCH 54/94] doc: update codecov badge Signed-off-by: Vincenzo Palazzo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e89afad70..ef3f055dd 100644 --- a/README.md +++ b/README.md @@ -121,8 +121,8 @@ This project follows the [all-contributors](https://github.com/kentcdodds/all-co [build-status-badge]: https://img.shields.io/github/workflow/status/zino-hofmann/graphql-flutter/graphql-flutter%20Tests%20case?style=flat-square [build-status-link]: https://github.com/zino-hofmann/graphql-flutter/actions -[coverage-badge]: https://img.shields.io/codecov/c/github/zino-app/graphql-flutter.svg?style=flat-square -[coverage-link]: https://codecov.io/gh/zino-app/graphql-flutter +[coverage-badge]: https://img.shields.io/codecov/c/github/zino-hofmann/graphql-flutter/beta?style=flat-square +[coverage-link]: https://app.codecov.io/gh/zino-hofmann/graphql-flutter [version-badge]: https://img.shields.io/pub/v/graphql_flutter.svg?style=flat-square [package-link]: https://pub.dartlang.org/packages/graphql_flutter [package-link-client]: https://pub.dartlang.org/packages/graphql From 3dc626db6a17523a2398381d22236b110fbcf03b Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Thu, 20 Jan 2022 23:16:56 +0000 Subject: [PATCH 55/94] feat: Add parser support --- .../graphql/lib/src/core/_base_options.dart | 12 +- packages/graphql/lib/src/core/fetch_more.dart | 11 +- .../lib/src/core/mutation_options.dart | 5 +- .../lib/src/core/observable_query.dart | 35 +++--- .../graphql/lib/src/core/query_manager.dart | 105 ++++++++++++------ .../graphql/lib/src/core/query_options.dart | 20 +++- .../graphql/lib/src/core/query_result.dart | 39 +++++-- .../graphql/lib/src/core/result_parser.dart | 1 + packages/graphql/lib/src/graphql_client.dart | 41 ++++--- .../lib/src/widgets/mutation.dart | 33 +++--- .../lib/src/widgets/query.dart | 39 ++++--- .../lib/src/widgets/subscription.dart | 30 ++--- 12 files changed, 240 insertions(+), 131 deletions(-) create mode 100644 packages/graphql/lib/src/core/result_parser.dart diff --git a/packages/graphql/lib/src/core/_base_options.dart b/packages/graphql/lib/src/core/_base_options.dart index 1538b6122..547b49181 100644 --- a/packages/graphql/lib/src/core/_base_options.dart +++ b/packages/graphql/lib/src/core/_base_options.dart @@ -3,14 +3,16 @@ import 'package:graphql/src/core/_data_class.dart'; import 'package:gql/ast.dart'; import 'package:graphql/client.dart'; +import 'package:graphql/src/core/result_parser.dart'; /// TODO refactor into [Request] container /// Base options. -abstract class BaseOptions extends MutableDataClass { +abstract class BaseOptions extends MutableDataClass { BaseOptions({ required this.document, this.variables = const {}, this.operationName, + ResultParserFn? parserFn, Context? context, FetchPolicy? fetchPolicy, ErrorPolicy? errorPolicy, @@ -21,7 +23,11 @@ abstract class BaseOptions extends MutableDataClass { error: errorPolicy, cacheReread: cacheRereadPolicy, ), - context = context ?? Context(); + context = context ?? Context(), + parserFn = parserFn ?? + ((d) => throw UnimplementedError( + "Please provide a parser function to support result parsing.", + )); /// Document containing at least one [OperationDefinitionNode] DocumentNode document; @@ -50,6 +56,8 @@ abstract class BaseOptions extends MutableDataClass { /// Context to be passed to link execution chain. Context context; + ResultParserFn parserFn; + // TODO consider inverting this relationship /// Resolve these options into a request Request get asRequest => Request( diff --git a/packages/graphql/lib/src/core/fetch_more.dart b/packages/graphql/lib/src/core/fetch_more.dart index 81eb08c8d..365084c04 100644 --- a/packages/graphql/lib/src/core/fetch_more.dart +++ b/packages/graphql/lib/src/core/fetch_more.dart @@ -12,11 +12,11 @@ import 'package:graphql/src/core/_query_write_handling.dart'; /// /// This is the **Internal Implementation**, /// used by [ObservableQuery] and [GraphQLCLient.fetchMore] -Future fetchMoreImplementation( +Future> fetchMoreImplementation( FetchMoreOptions fetchMoreOptions, { - required QueryOptions originalOptions, + required QueryOptions originalOptions, required QueryManager queryManager, - required QueryResult previousResult, + required QueryResult previousResult, String? queryId, }) async { // fetch more and udpate @@ -24,7 +24,7 @@ Future fetchMoreImplementation( final document = (fetchMoreOptions.document ?? originalOptions.document); final request = originalOptions.asRequest; - final combinedOptions = QueryOptions( + final combinedOptions = QueryOptions( fetchPolicy: FetchPolicy.noCache, errorPolicy: originalOptions.errorPolicy, document: document, @@ -34,7 +34,8 @@ Future fetchMoreImplementation( }, ); - QueryResult fetchMoreResult = await queryManager.query(combinedOptions); + QueryResult fetchMoreResult = + await queryManager.query(combinedOptions); try { // combine the query with the new query, using the function provided by the user diff --git a/packages/graphql/lib/src/core/mutation_options.dart b/packages/graphql/lib/src/core/mutation_options.dart index e4b0bb7c6..01ba31893 100644 --- a/packages/graphql/lib/src/core/mutation_options.dart +++ b/packages/graphql/lib/src/core/mutation_options.dart @@ -6,6 +6,7 @@ import 'package:graphql/src/core/observable_query.dart'; import 'package:gql/ast.dart'; import 'package:gql_exec/gql_exec.dart'; +import 'package:graphql/src/core/result_parser.dart'; import 'package:graphql/src/exceptions.dart'; import 'package:graphql/src/core/query_result.dart'; @@ -19,7 +20,7 @@ typedef OnMutationUpdate = FutureOr Function( ); typedef OnError = FutureOr Function(OperationException? error); -class MutationOptions extends BaseOptions { +class MutationOptions extends BaseOptions { MutationOptions({ required DocumentNode document, String? operationName, @@ -32,6 +33,7 @@ class MutationOptions extends BaseOptions { this.onCompleted, this.update, this.onError, + ResultParserFn? parserFn, }) : super( fetchPolicy: fetchPolicy, errorPolicy: errorPolicy, @@ -41,6 +43,7 @@ class MutationOptions extends BaseOptions { variables: variables, context: context, optimisticResult: optimisticResult, + parserFn: parserFn, ); final OnMutationCompleted? onCompleted; diff --git a/packages/graphql/lib/src/core/observable_query.dart b/packages/graphql/lib/src/core/observable_query.dart index afc9315ea..2ac7d09bc 100644 --- a/packages/graphql/lib/src/core/observable_query.dart +++ b/packages/graphql/lib/src/core/observable_query.dart @@ -58,7 +58,7 @@ enum QueryLifecycle { /// And a handful of internally leveraged methods. /// /// [apollo_oq]: https://www.apollographql.com/docs/react/v3.0-beta/api/core/ObservableQuery/ -class ObservableQuery { +class ObservableQuery { ObservableQuery({ required this.queryManager, required this.options, @@ -67,7 +67,7 @@ class ObservableQuery { _latestWasEagerlyFetched = true; fetchResults(); } - controller = StreamController.broadcast( + controller = StreamController>.broadcast( onListen: onListen, ); } @@ -94,15 +94,15 @@ class ObservableQuery { queryManager.maybeRebroadcastQueries(exclude: this); /// The most recently seen result from this operation's stream - QueryResult? latestResult; + QueryResult? latestResult; QueryLifecycle lifecycle = QueryLifecycle.unexecuted; - WatchQueryOptions options; + WatchQueryOptions options; - late StreamController controller; + late StreamController> controller; - Stream get stream => controller.stream; + Stream> get stream => controller.stream; bool get isCurrentlyPolling => lifecycle == QueryLifecycle.polling; bool get isRefetchSafe { @@ -128,10 +128,13 @@ class ObservableQuery { /// /// **NOTE:** overrides any present non-network-only [FetchPolicy], /// as refetching from the `cache` does not make sense. - Future refetch() { + Future?> refetch() { if (isRefetchSafe) { - addResult(QueryResult.loading(data: latestResult?.data)); - return queryManager.refetchQuery(queryId); + addResult(QueryResult.loading( + data: latestResult?.data, + parserFn: options.parserFn, + )); + return queryManager.refetchQuery(queryId); } throw Exception('Query is not refetch safe'); } @@ -179,8 +182,8 @@ class ObservableQuery { /// Fetch results based on [options.fetchPolicy] /// /// Will [startPolling] if [options.pollInterval] is set - MultiSourceResult fetchResults() { - final MultiSourceResult allResults = + MultiSourceResult fetchResults() { + final MultiSourceResult allResults = queryManager.fetchQueryAsMultiSourceResult(queryId, options); latestResult ??= allResults.eagerResult; @@ -212,8 +215,12 @@ class ObservableQuery { /// it is easy to make mistakes in writing [updateQuery]. /// /// To mitigate this, [FetchMoreOptions.partial] has been provided. - Future fetchMore(FetchMoreOptions fetchMoreOptions) async { - addResult(QueryResult.loading(data: latestResult?.data)); + Future> fetchMore( + FetchMoreOptions fetchMoreOptions) async { + addResult(QueryResult.loading( + data: latestResult?.data, + parserFn: options.parserFn, + )); return fetchMoreImplementation( fetchMoreOptions, @@ -231,7 +238,7 @@ class ObservableQuery { /// if it is set to `null`. /// /// Called internally by the [QueryManager] - void addResult(QueryResult result, {bool fromRebroadcast = false}) { + void addResult(QueryResult result, {bool fromRebroadcast = false}) { // don't overwrite results due to some async/optimism issue if (latestResult != null && latestResult!.timestamp.isAfter(result.timestamp)) { diff --git a/packages/graphql/lib/src/core/query_manager.dart b/packages/graphql/lib/src/core/query_manager.dart index 25cb29310..047574e53 100644 --- a/packages/graphql/lib/src/core/query_manager.dart +++ b/packages/graphql/lib/src/core/query_manager.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:graphql/src/core/result_parser.dart'; import 'package:meta/meta.dart'; import 'package:collection/collection.dart'; @@ -48,8 +49,9 @@ class QueryManager { /// prevents rebroadcasting for some intensive bulk operation like [refetchSafeQueries] bool rebroadcastLocked = false; - ObservableQuery watchQuery(WatchQueryOptions options) { - final ObservableQuery observableQuery = ObservableQuery( + ObservableQuery watchQuery( + WatchQueryOptions options) { + final ObservableQuery observableQuery = ObservableQuery( queryManager: this, options: options, ); @@ -59,7 +61,8 @@ class QueryManager { return observableQuery; } - Stream subscribe(SubscriptionOptions options) async* { + Stream> subscribe( + SubscriptionOptions options) async* { assert( options.fetchPolicy != FetchPolicy.cacheOnly, "Cannot subscribe with FetchPolicy.cacheOnly: $options", @@ -70,7 +73,9 @@ class QueryManager { if (options.optimisticResult != null) { // TODO optimisticResults for streams just skip the cache for now yield QueryResult.optimistic( - data: options.optimisticResult as Map?); + data: options.optimisticResult as Map?, + parserFn: options.parserFn, + ); } else if (shouldRespondEagerlyFromCache(options.fetchPolicy)) { final cacheResult = cache.readQuery( request, @@ -80,6 +85,7 @@ class QueryManager { yield QueryResult( source: QueryResultSource.cache, data: cacheResult, + parserFn: options.parserFn, ); } } @@ -103,7 +109,10 @@ class QueryManager { ); } catch (failure, trace) { // we set the source to indicate where the source of failure - queryResult ??= QueryResult(source: QueryResultSource.network); + queryResult ??= QueryResult( + source: QueryResultSource.network, + parserFn: options.parserFn, + ); queryResult.exception = coalesceErrors( exception: queryResult.exception, @@ -118,21 +127,33 @@ class QueryManager { return queryResult; }).transform(StreamTransformer.fromHandlers( - handleError: (err, trace, sink) => sink.add(_wrapFailure(err, trace)), + handleError: (err, trace, sink) => sink.add(_wrapFailure( + err, + trace, + options.parserFn, + )), )); } catch (ex, trace) { - yield* Stream.fromIterable([_wrapFailure(ex, trace)]); + yield* Stream.fromIterable([ + _wrapFailure( + ex, + trace, + options.parserFn, + ) + ]); } } - Future query(QueryOptions options) async { + Future> query( + QueryOptions options) async { final result = await fetchQuery(_oneOffOpId, options); maybeRebroadcastQueries(); return result; } - Future mutate(MutationOptions options) async { + Future> mutate( + MutationOptions options) async { final result = await fetchQuery(_oneOffOpId, options); // once the mutation has been process successfully, execute callbacks // before returning the results @@ -154,25 +175,25 @@ class QueryManager { return result; } - Future fetchQuery( + Future> fetchQuery( String queryId, - BaseOptions options, + BaseOptions options, ) async { - final MultiSourceResult allResults = + final MultiSourceResult allResults = fetchQueryAsMultiSourceResult(queryId, options); return allResults.networkResult ?? allResults.eagerResult; } /// Wrap both the `eagerResult` and `networkResult` future in a `MultiSourceResult` /// if the cache policy precludes a network request, `networkResult` will be `null` - MultiSourceResult fetchQueryAsMultiSourceResult( + MultiSourceResult fetchQueryAsMultiSourceResult( String queryId, - BaseOptions options, + BaseOptions options, ) { // create a new request to execute final request = options.asRequest; - final QueryResult eagerResult = _resolveQueryEagerly( + final QueryResult eagerResult = _resolveQueryEagerly( request, queryId, options, @@ -181,6 +202,7 @@ class QueryManager { // _resolveQueryEagerly handles cacheOnly, // so if we're loading + cacheFirst we continue to network return MultiSourceResult( + parserFn: options.parserFn, eagerResult: eagerResult, networkResult: (shouldStopAtCache(options.fetchPolicy) && !eagerResult.isLoading) @@ -191,13 +213,13 @@ class QueryManager { /// Resolve the query on the network, /// negotiating any necessary cache edits / optimistic cleanup - Future _resolveQueryOnNetwork( + Future> _resolveQueryOnNetwork( Request request, String queryId, - BaseOptions options, + BaseOptions options, ) async { Response response; - QueryResult? queryResult; + QueryResult? queryResult; bool rereadFromCache = false; @@ -219,7 +241,10 @@ class QueryManager { ); } catch (failure, trace) { // we set the source to indicate where the source of failure - queryResult ??= QueryResult(source: QueryResultSource.network); + queryResult ??= QueryResult( + source: QueryResultSource.network, + parserFn: options.parserFn, + ); queryResult.exception = coalesceErrors( exception: queryResult.exception, @@ -245,12 +270,14 @@ class QueryManager { /// Add an eager cache response to the stream if possible, /// based on `fetchPolicy` and `optimisticResults` - QueryResult _resolveQueryEagerly( + QueryResult _resolveQueryEagerly( Request request, String queryId, - BaseOptions options, + BaseOptions options, ) { - QueryResult queryResult = QueryResult.loading(); + QueryResult queryResult = QueryResult.loading( + parserFn: options.parserFn, + ); try { if (options.optimisticResult != null) { @@ -258,6 +285,7 @@ class QueryManager { request, queryId: queryId, optimisticResult: options.optimisticResult, + options: options, ); } @@ -271,6 +299,7 @@ class QueryManager { queryResult = QueryResult( data: data, source: QueryResultSource.cache, + parserFn: options.parserFn, ); } @@ -278,6 +307,7 @@ class QueryManager { queryResult.isLoading) { queryResult = QueryResult( source: QueryResultSource.cache, + parserFn: options.parserFn, exception: OperationException( linkException: CacheMissException( 'Could not resolve the given request against the cache. (FetchPolicy.cacheOnly)', @@ -312,8 +342,9 @@ class QueryManager { /// Refetch the [ObservableQuery] referenced by [queryId], /// overriding any present non-network-only [FetchPolicy]. - Future refetchQuery(String queryId) { - final WatchQueryOptions options = queries[queryId]!.options.copy(); + Future?> refetchQuery(String queryId) { + final WatchQueryOptions options = + queries[queryId]!.options.copy() as WatchQueryOptions; if (!willAlwaysExecuteOnNetwork(options.fetchPolicy)) { options.policies = options.policies.copyWith( fetch: FetchPolicy.networkOnly, @@ -350,12 +381,13 @@ class QueryManager { /// Will [maybeRebroadcastQueries] from [ObservableQuery.addResult] if the [cache] has flagged the need to. /// /// Queries are registered via [setQuery] and [watchQuery] - void addQueryResult( + void addQueryResult( Request request, String? queryId, - QueryResult queryResult, + QueryResult queryResult, ) { - final ObservableQuery? observableQuery = getQuery(queryId); + final ObservableQuery? observableQuery = + getQuery(queryId) as ObservableQuery?; if (observableQuery != null && !observableQuery.controller.isClosed) { observableQuery.addResult(queryResult); @@ -363,13 +395,15 @@ class QueryManager { } /// Create an optimstic result for the query specified by `queryId`, if it exists - QueryResult _getOptimisticQueryResult( + QueryResult _getOptimisticQueryResult( Request request, { required String queryId, required Object? optimisticResult, + required BaseOptions options, }) { - QueryResult queryResult = QueryResult( + QueryResult queryResult = QueryResult( source: QueryResultSource.optimisticResult, + parserFn: options.parserFn, ); attemptCacheWriteFromClient( @@ -462,9 +496,9 @@ class QueryManager { return requestId; } - QueryResult mapFetchResultToQueryResult( + QueryResult mapFetchResultToQueryResult( Response response, - BaseOptions options, { + BaseOptions options, { required QueryResultSource source, }) { List? errors; @@ -499,12 +533,19 @@ class QueryManager { context: response.context, source: source, exception: coalesceErrors(graphqlErrors: errors), + parserFn: options.parserFn, ); } } -QueryResult _wrapFailure(dynamic ex, trace) => QueryResult( +QueryResult _wrapFailure( + dynamic ex, + trace, + ResultParserFn parserFn, +) => + QueryResult( // we set the source to indicate where the source of failure source: QueryResultSource.network, exception: coalesceErrors(linkException: translateFailure(ex, trace)), + parserFn: parserFn, ); diff --git a/packages/graphql/lib/src/core/query_options.dart b/packages/graphql/lib/src/core/query_options.dart index 993dbac6f..bf09f537e 100644 --- a/packages/graphql/lib/src/core/query_options.dart +++ b/packages/graphql/lib/src/core/query_options.dart @@ -1,5 +1,7 @@ // ignore_for_file: deprecated_member_use_from_same_package +import 'package:gql/language.dart'; import 'package:graphql/src/core/_base_options.dart'; +import 'package:graphql/src/core/result_parser.dart'; import 'package:graphql/src/utilities/helpers.dart'; import 'package:gql/ast.dart'; @@ -7,7 +9,7 @@ import 'package:gql/ast.dart'; import 'package:graphql/client.dart'; /// Query options. -class QueryOptions extends BaseOptions { +class QueryOptions extends BaseOptions { QueryOptions({ required DocumentNode document, String? operationName, @@ -18,6 +20,7 @@ class QueryOptions extends BaseOptions { Object? optimisticResult, this.pollInterval, Context? context, + ResultParserFn? parserFn, }) : super( fetchPolicy: fetchPolicy, errorPolicy: errorPolicy, @@ -27,6 +30,7 @@ class QueryOptions extends BaseOptions { variables: variables, context: context, optimisticResult: optimisticResult, + parserFn: parserFn, ); /// The time interval on which this query should be re-fetched from the server. @@ -35,7 +39,7 @@ class QueryOptions extends BaseOptions { @override List get properties => [...super.properties, pollInterval]; - WatchQueryOptions asWatchQueryOptions({bool fetchResults = true}) => + WatchQueryOptions asWatchQueryOptions({bool fetchResults = true}) => WatchQueryOptions( document: document, operationName: operationName, @@ -47,10 +51,11 @@ class QueryOptions extends BaseOptions { fetchResults: fetchResults, context: context, optimisticResult: optimisticResult, + parserFn: this.parserFn, ); } -class SubscriptionOptions extends BaseOptions { +class SubscriptionOptions extends BaseOptions { SubscriptionOptions({ required DocumentNode document, String? operationName, @@ -60,6 +65,7 @@ class SubscriptionOptions extends BaseOptions { CacheRereadPolicy? cacheRereadPolicy, Object? optimisticResult, Context? context, + ResultParserFn? parserFn, }) : super( fetchPolicy: fetchPolicy, errorPolicy: errorPolicy, @@ -69,13 +75,14 @@ class SubscriptionOptions extends BaseOptions { variables: variables, context: context, optimisticResult: optimisticResult, + parserFn: parserFn, ); /// An optimistic first result to eagerly add to the subscription stream Object? optimisticResult; } -class WatchQueryOptions extends QueryOptions { +class WatchQueryOptions extends QueryOptions { WatchQueryOptions({ required DocumentNode document, String? operationName, @@ -89,6 +96,7 @@ class WatchQueryOptions extends QueryOptions { this.carryForwardDataOnException = true, bool? eagerlyFetchResults, Context? context, + ResultParserFn? parserFn, }) : eagerlyFetchResults = eagerlyFetchResults ?? fetchResults, super( document: document, @@ -100,6 +108,7 @@ class WatchQueryOptions extends QueryOptions { pollInterval: pollInterval, context: context, optimisticResult: optimisticResult, + parserFn: parserFn, ); /// Whether or not to fetch results @@ -117,7 +126,7 @@ class WatchQueryOptions extends QueryOptions { List get properties => [...super.properties, fetchResults, eagerlyFetchResults]; - WatchQueryOptions copy() => WatchQueryOptions( + WatchQueryOptions copy() => WatchQueryOptions( document: document, operationName: operationName, variables: variables, @@ -130,6 +139,7 @@ class WatchQueryOptions extends QueryOptions { eagerlyFetchResults: eagerlyFetchResults, carryForwardDataOnException: carryForwardDataOnException, context: context, + parserFn: parserFn, ); } diff --git a/packages/graphql/lib/src/core/query_result.dart b/packages/graphql/lib/src/core/query_result.dart index 0ae4a7baf..23c1251ab 100644 --- a/packages/graphql/lib/src/core/query_result.dart +++ b/packages/graphql/lib/src/core/query_result.dart @@ -1,5 +1,6 @@ import 'dart:async' show FutureOr; import 'package:graphql/client.dart'; +import 'package:graphql/src/core/result_parser.dart'; /// The source of the result data contained /// @@ -37,33 +38,41 @@ final _eagerSources = { }; /// A single operation result -class QueryResult { +class QueryResult { QueryResult({ this.data, this.exception, this.context = const Context(), + required this.parserFn, required this.source, }) : timestamp = DateTime.now(); /// Unexecuted singleton, used as a placeholder for mutations, /// etc. - static final unexecuted = QueryResult(source: null) - ..timestamp = DateTime.fromMillisecondsSinceEpoch(0); + static final unexecuted = QueryResult( + source: null, + parserFn: (d) => throw new UnimplementedError( + "Unexecuted query data can not be parsed."), + )..timestamp = DateTime.fromMillisecondsSinceEpoch(0); factory QueryResult.loading({ Map? data, + required ResultParserFn parserFn, }) => QueryResult( data: data, source: QueryResultSource.loading, + parserFn: parserFn, ); factory QueryResult.optimistic({ Map? data, + required ResultParserFn parserFn, }) => QueryResult( data: data, source: QueryResultSource.optimisticResult, + parserFn: parserFn, ); DateTime timestamp; @@ -82,6 +91,8 @@ class QueryResult { OperationException? exception; + ResultParserFn parserFn; + /// [data] has yet to be specified from any source /// for the _most recent_ operation /// (including [QueryResultSource.optimisticResult]) @@ -107,6 +118,17 @@ class QueryResult { /// Whether the response includes an [exception] bool get hasException => (exception != null); + /// If a parserFn is provided, this getter can be used to fetch the parsed data. + TParsed? get parsedData { + final data = this.data; + final parserFn = this.parserFn; + + if (data == null) { + return null; + } + return parserFn(data); + } + @override String toString() => 'QueryResult(' 'source: $source, ' @@ -117,16 +139,17 @@ class QueryResult { ')'; } -class MultiSourceResult { +class MultiSourceResult { MultiSourceResult({ - QueryResult? eagerResult, + QueryResult? eagerResult, this.networkResult, - }) : eagerResult = eagerResult ?? QueryResult.loading(), + required ResultParserFn parserFn, + }) : eagerResult = eagerResult ?? QueryResult.loading(parserFn: parserFn), assert( eagerResult!.source != QueryResultSource.network, 'An eager result cannot be gotten from the network', ); - QueryResult eagerResult; - FutureOr? networkResult; + QueryResult eagerResult; + FutureOr>? networkResult; } diff --git a/packages/graphql/lib/src/core/result_parser.dart b/packages/graphql/lib/src/core/result_parser.dart new file mode 100644 index 000000000..9357b2cd6 --- /dev/null +++ b/packages/graphql/lib/src/core/result_parser.dart @@ -0,0 +1 @@ +typedef ResultParserFn = TResult Function(Map data); diff --git a/packages/graphql/lib/src/graphql_client.dart b/packages/graphql/lib/src/graphql_client.dart index 52ab3c648..f8d37694d 100644 --- a/packages/graphql/lib/src/graphql_client.dart +++ b/packages/graphql/lib/src/graphql_client.dart @@ -87,7 +87,8 @@ class GraphQLClient implements GraphQLDataProxy { /// observableQuery.close(); /// ``` /// {@end-tool} - ObservableQuery watchQuery(WatchQueryOptions options) { + ObservableQuery watchQuery( + WatchQueryOptions options) { options.policies = defaultPolicies.watchQuery.withOverrides(options.policies); return queryManager.watchQuery(options); @@ -98,7 +99,8 @@ class GraphQLClient implements GraphQLDataProxy { /// This is a stop-gap solution to the problems created by the reliance of `graphql_flutter` on [ObservableQuery] for mutations. /// /// For more details, see https://github.com/zino-app/graphql-flutter/issues/774 - ObservableQuery watchMutation(WatchQueryOptions options) { + ObservableQuery watchMutation( + WatchQueryOptions options) { options.policies = defaultPolicies.watchMutation.withOverrides(options.policies); return queryManager.watchQuery(options); @@ -144,16 +146,19 @@ class GraphQLClient implements GraphQLDataProxy { /// ``` /// {@end-tool} - Future query(QueryOptions options) { + Future> query( + QueryOptions options, + ) async { options.policies = defaultPolicies.query.withOverrides(options.policies); - return queryManager.query(options); + return await queryManager.query(options); } /// This resolves a single mutation according to the [MutationOptions] specified and /// returns a [Future] which resolves with the [QueryResult] or throws an [Exception]. - Future mutate(MutationOptions options) { + Future> mutate( + MutationOptions options) async { options.policies = defaultPolicies.mutate.withOverrides(options.policies); - return queryManager.mutate(options); + return await queryManager.mutate(options); } /// This subscribes to a GraphQL subscription according to the options specified and returns a @@ -192,7 +197,8 @@ class GraphQLClient implements GraphQLDataProxy { /// }); /// ``` /// {@end-tool} - Stream subscribe(SubscriptionOptions options) { + Stream> subscribe( + SubscriptionOptions options) { options.policies = defaultPolicies.subscribe.withOverrides( options.policies, ); @@ -207,17 +213,18 @@ class GraphQLClient implements GraphQLDataProxy { /// /// To mitigate this, [FetchMoreOptions.partial] has been provided. @experimental - Future fetchMore( + Future> fetchMore( FetchMoreOptions fetchMoreOptions, { - required QueryOptions originalOptions, - required QueryResult previousResult, - }) => - fetchMoreImplementation( - fetchMoreOptions, - originalOptions: originalOptions, - previousResult: previousResult, - queryManager: queryManager, - ); + required QueryOptions originalOptions, + required QueryResult previousResult, + }) async { + return await fetchMoreImplementation( + fetchMoreOptions, + originalOptions: originalOptions, + previousResult: previousResult, + queryManager: queryManager, + ); + } /// pass through to [cache.readQuery] readQuery(request, {optimistic = true}) => diff --git a/packages/graphql_flutter/lib/src/widgets/mutation.dart b/packages/graphql_flutter/lib/src/widgets/mutation.dart index 427233bfa..140e2bf01 100644 --- a/packages/graphql_flutter/lib/src/widgets/mutation.dart +++ b/packages/graphql_flutter/lib/src/widgets/mutation.dart @@ -4,40 +4,40 @@ import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/graphql_provider.dart'; -typedef RunMutation = MultiSourceResult Function( +typedef RunMutation = MultiSourceResult Function( Map variables, { Object? optimisticResult, }); -typedef MutationBuilder = Widget Function( +typedef MutationBuilder = Widget Function( RunMutation runMutation, - QueryResult? result, + QueryResult? result, ); /// Builds a [Mutation] widget based on the a given set of [MutationOptions] /// that streams [QueryResult]s into the [QueryBuilder]. -class Mutation extends StatefulWidget { +class Mutation extends StatefulWidget { const Mutation({ final Key? key, required this.options, required this.builder, }) : super(key: key); - final MutationOptions options; - final MutationBuilder builder; + final MutationOptions options; + final MutationBuilder builder; @override - MutationState createState() => MutationState(); + MutationState createState() => MutationState(); } -class MutationState extends State { +class MutationState extends State> { GraphQLClient? client; - ObservableQuery? observableQuery; + ObservableQuery? observableQuery; - WatchQueryOptions? __cachedOptions; + WatchQueryOptions? __cachedOptions; - WatchQueryOptions get _providedOptions { - final _options = WatchQueryOptions( + WatchQueryOptions get _providedOptions { + final _options = WatchQueryOptions( document: widget.options.document, operationName: widget.options.operationName, variables: widget.options.variables, @@ -46,6 +46,7 @@ class MutationState extends State { cacheRereadPolicy: widget.options.cacheRereadPolicy, fetchResults: false, context: widget.options.context, + parserFn: widget.options.parserFn, ); __cachedOptions ??= _options; return _options; @@ -79,7 +80,7 @@ class MutationState extends State { } @override - void didUpdateWidget(Mutation oldWidget) { + void didUpdateWidget(Mutation oldWidget) { super.didUpdateWidget(oldWidget); // TODO @micimize - investigate why/if this was causing issues @@ -90,7 +91,7 @@ class MutationState extends State { /// Run the mutation with the given `variables` and `optimisticResult`, /// returning a [MultiSourceResult] for handling both the eager and network results - MultiSourceResult runMutation( + MultiSourceResult runMutation( Map variables, { Object? optimisticResult, }) { @@ -116,12 +117,12 @@ class MutationState extends State { @override Widget build(BuildContext context) { - return StreamBuilder( + return StreamBuilder?>( initialData: observableQuery?.latestResult ?? QueryResult.unexecuted, stream: observableQuery?.stream, builder: ( BuildContext buildContext, - AsyncSnapshot snapshot, + AsyncSnapshot?> snapshot, ) { return widget.builder( runMutation, diff --git a/packages/graphql_flutter/lib/src/widgets/query.dart b/packages/graphql_flutter/lib/src/widgets/query.dart index 25636f469..59ed0d017 100644 --- a/packages/graphql_flutter/lib/src/widgets/query.dart +++ b/packages/graphql_flutter/lib/src/widgets/query.dart @@ -5,37 +5,39 @@ import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/graphql_provider.dart'; // method to call from widget to fetchmore queries -typedef FetchMore = Future Function(FetchMoreOptions options); +typedef FetchMore = Future> Function( + FetchMoreOptions options); -typedef Refetch = Future Function(); +typedef Refetch = Future?> Function(); -typedef QueryBuilder = Widget Function( - QueryResult result, { - Refetch? refetch, - FetchMore? fetchMore, +typedef QueryBuilder = Widget Function( + QueryResult result, { + Refetch? refetch, + FetchMore? fetchMore, }); /// Builds a [Query] widget based on the a given set of [QueryOptions] /// that streams [QueryResult]s into the [QueryBuilder]. -class Query extends StatefulWidget { +class Query extends StatefulWidget { const Query({ final Key? key, required this.options, required this.builder, }) : super(key: key); - final QueryOptions options; - final QueryBuilder builder; + final QueryOptions options; + final QueryBuilder builder; @override - QueryState createState() => QueryState(); + QueryState createState() => QueryState(); } -class QueryState extends State { - ObservableQuery? observableQuery; +class QueryState extends State> { + ObservableQuery? observableQuery; GraphQLClient? _client; - WatchQueryOptions get _options => widget.options.asWatchQueryOptions(); + WatchQueryOptions get _options => + widget.options.asWatchQueryOptions(); void _initQuery() { observableQuery?.close(); @@ -53,7 +55,7 @@ class QueryState extends State { } @override - void didUpdateWidget(Query oldWidget) { + void didUpdateWidget(Query oldWidget) { super.didUpdateWidget(oldWidget); final GraphQLClient client = GraphQLProvider.of(context).value; @@ -75,12 +77,15 @@ class QueryState extends State { @override Widget build(BuildContext context) { - return StreamBuilder( - initialData: observableQuery?.latestResult ?? QueryResult.loading(), + return StreamBuilder>( + initialData: observableQuery?.latestResult ?? + QueryResult.loading( + parserFn: widget.options.parserFn, + ), stream: observableQuery!.stream, builder: ( BuildContext buildContext, - AsyncSnapshot snapshot, + AsyncSnapshot> snapshot, ) { return widget.builder( snapshot.data!, diff --git a/packages/graphql_flutter/lib/src/widgets/subscription.dart b/packages/graphql_flutter/lib/src/widgets/subscription.dart index f6534ec0a..b72a2b319 100644 --- a/packages/graphql_flutter/lib/src/widgets/subscription.dart +++ b/packages/graphql_flutter/lib/src/widgets/subscription.dart @@ -5,12 +5,13 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/widgets.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -typedef OnSubscriptionResult = void Function( - QueryResult subscriptionResult, +typedef OnSubscriptionResult = void Function( + QueryResult subscriptionResult, GraphQLClient? client, ); -typedef SubscriptionBuilder = Widget Function(QueryResult result); +typedef SubscriptionBuilder = Widget Function( + QueryResult result); /// Creats a subscription with [GraphQLClient.subscribe]. /// @@ -62,7 +63,7 @@ typedef SubscriptionBuilder = Widget Function(QueryResult result); /// } /// ``` /// {@end-tool} -class Subscription extends StatefulWidget { +class Subscription extends StatefulWidget { const Subscription({ required this.options, required this.builder, @@ -70,16 +71,16 @@ class Subscription extends StatefulWidget { Key? key, }) : super(key: key); - final SubscriptionOptions options; - final SubscriptionBuilder builder; - final OnSubscriptionResult? onSubscriptionResult; + final SubscriptionOptions options; + final SubscriptionBuilder builder; + final OnSubscriptionResult? onSubscriptionResult; @override - _SubscriptionState createState() => _SubscriptionState(); + _SubscriptionState createState() => _SubscriptionState(); } -class _SubscriptionState extends State { - Stream? stream; +class _SubscriptionState extends State> { + Stream>? stream; GraphQLClient? client; ConnectivityResult? _currentConnectivityResult; @@ -115,7 +116,7 @@ class _SubscriptionState extends State { } @override - void didUpdateWidget(Subscription oldWidget) { + void didUpdateWidget(Subscription oldWidget) { super.didUpdateWidget(oldWidget); if (!widget.options.equal(oldWidget.options)) { @@ -159,16 +160,17 @@ class _SubscriptionState extends State { @override Widget build(BuildContext context) { - return StreamBuilder( + return StreamBuilder>( initialData: widget.options.optimisticResult != null ? QueryResult.optimistic( data: widget.options.optimisticResult as Map?, + parserFn: widget.options.parserFn, ) - : QueryResult.loading(), + : QueryResult.loading(parserFn: widget.options.parserFn), stream: stream, builder: ( BuildContext buildContext, - AsyncSnapshot snapshot, + AsyncSnapshot> snapshot, ) { return widget.builder(snapshot.data!); }, From b4fd4bc4c9be36b3c36a74705f9bddb5c61607b5 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Fri, 21 Jan 2022 07:14:00 +0000 Subject: [PATCH 56/94] feat: Add tests --- .../graphql/lib/src/core/query_manager.dart | 2 +- .../graphql/test/graphql_client_test.dart | 173 +++++++++++++++++- 2 files changed, 173 insertions(+), 2 deletions(-) diff --git a/packages/graphql/lib/src/core/query_manager.dart b/packages/graphql/lib/src/core/query_manager.dart index 047574e53..3feac8cae 100644 --- a/packages/graphql/lib/src/core/query_manager.dart +++ b/packages/graphql/lib/src/core/query_manager.dart @@ -92,7 +92,7 @@ class QueryManager { try { yield* link.request(request).map((response) { - QueryResult? queryResult; + QueryResult? queryResult; bool rereadFromCache = false; try { queryResult = mapFetchResultToQueryResult( diff --git a/packages/graphql/test/graphql_client_test.dart b/packages/graphql/test/graphql_client_test.dart index bf3428106..7ce8f9fa8 100644 --- a/packages/graphql/test/graphql_client_test.dart +++ b/packages/graphql/test/graphql_client_test.dart @@ -1,3 +1,4 @@ +import 'package:graphql/src/core/result_parser.dart'; import 'package:test/test.dart'; import 'package:mockito/mockito.dart'; @@ -41,7 +42,7 @@ void main() { } } '''; - readRepositoryData({ + Map readRepositoryData({ bool withTypenames = true, bool withIds = true, bool viewerHasStarred = false, @@ -152,6 +153,75 @@ void main() { equals('bar'), ); }); + test('successful response with parser', () async { + final ResultParserFn> parserFn = (data) { + return data['viewer']['repositories']['nodes'] + .map((node) => node['name'] as String) + .toList(); + }; + final _options = QueryOptions( + document: parseString(readRepositories), + variables: { + 'nRepositories': 42, + }, + parserFn: parserFn, + ); + final repoData = readRepositoryData(withTypenames: true); + + when( + link.request(any), + ).thenAnswer( + (_) => Stream.fromIterable([ + Response( + data: repoData, + context: Context().withEntry( + HttpLinkResponseContext( + statusCode: 200, + headers: {'foo': 'bar'}, + ), + ), + ), + ]), + ); + + final QueryResult> r = await client.query(_options); + + verify( + link.request( + Request( + operation: Operation( + document: parseString(readRepositories), + //operationName: 'ReadRepositories', + ), + variables: { + 'nRepositories': 42, + }, + context: Context(), + ), + ), + ); + + expect(r.exception, isNull); + expect(r.data, equals(repoData)); + + List? parsedData = r.parsedData; + expect( + parsedData, + equals([ + 'pq', + 'go-evercookie', + 'watchbot', + ])); + + expect( + r.context.entry()!.statusCode, + equals(200), + ); + expect( + r.context.entry()!.headers['foo'], + equals('bar'), + ); + }); test('successful response without normalization', () async { final readUnidentifiedRepositories = parseString(r''' @@ -427,6 +497,54 @@ void main() { response.data!['action']['starrable']['viewerHasStarred'] as bool?; expect(viewerHasStarred, true); }); + test('successful mutation with parser', () async { + final ResultParserFn resultParser = + (data) => data['action']['starrable']['viewerHasStarred'] as bool; + final MutationOptions _options = MutationOptions( + document: parseString(addStar), + parserFn: resultParser, + ); + + when( + link.request(any), + ).thenAnswer( + (_) => Stream.fromIterable( + [ + Response( + data: { + 'action': { + 'starrable': { + 'viewerHasStarred': true, + }, + }, + }, + ), + ], + ), + ); + + final QueryResult response = await client.mutate(_options); + + verify( + link.request( + Request( + operation: Operation( + document: parseString(addStar), + //operationName: 'AddStar', + ), + variables: {}, + context: Context(), + ), + ), + ); + final bool parsedResult = response.parsedData; + expect(parsedResult, isTrue); + expect(response.exception, isNull); + expect(response.data, isNotNull); + final bool? viewerHasStarred = + response.data!['action']['starrable']['viewerHasStarred'] as bool?; + expect(viewerHasStarred, true); + }); test('successful mutation through watchQuery', () async { final _options = MutationOptions( @@ -539,6 +657,59 @@ void main() { ), ); }); + test('parses results', () async { + final responses = [ + { + 'id': '1', + 'name': 'first', + }, + { + 'id': '2', + 'name': 'second', + }, + ].map((item) => Response( + data: { + 'item': { + '__typename': 'Item', + ...item, + }, + }, + )); + when( + link.request(any), + ).thenAnswer( + (_) => Stream.fromIterable(responses), + ); + + final ResultParserFn parserFn = + (data) => data['item']['name'] as String; + ; + + final stream = client.subscribe( + SubscriptionOptions( + parserFn: parserFn, + document: parseString( + r''' + subscription { + item { + id + name + } + } + ''', + ), + ), + ); + + expect( + stream, + emitsInOrder(['first', 'second'] + .map((e) => isA>().having((result) { + final String? parsed = result.parsedData; + return parsed; + }, "Parsed item", e))), + ); + }); test('wraps stream exceptions', () async { final ex = ServerException( From cfdb90e3d5bed5d59924aff7795108a2b236ae80 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 25 Jan 2022 21:45:50 +0100 Subject: [PATCH 57/94] graphql: fixed small dart code style Signed-off-by: Vincenzo Palazzo --- packages/graphql/lib/src/core/fetch_more.dart | 2 +- packages/graphql/lib/src/core/query_options.dart | 1 - packages/graphql/lib/src/core/query_result.dart | 4 ++-- packages/graphql/test/websocket_test.dart | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/graphql/lib/src/core/fetch_more.dart b/packages/graphql/lib/src/core/fetch_more.dart index 365084c04..5f3c723ed 100644 --- a/packages/graphql/lib/src/core/fetch_more.dart +++ b/packages/graphql/lib/src/core/fetch_more.dart @@ -19,7 +19,7 @@ Future> fetchMoreImplementation( required QueryResult previousResult, String? queryId, }) async { - // fetch more and udpate + // fetch more and update final document = (fetchMoreOptions.document ?? originalOptions.document); final request = originalOptions.asRequest; diff --git a/packages/graphql/lib/src/core/query_options.dart b/packages/graphql/lib/src/core/query_options.dart index bf09f537e..e3c1da5cf 100644 --- a/packages/graphql/lib/src/core/query_options.dart +++ b/packages/graphql/lib/src/core/query_options.dart @@ -1,5 +1,4 @@ // ignore_for_file: deprecated_member_use_from_same_package -import 'package:gql/language.dart'; import 'package:graphql/src/core/_base_options.dart'; import 'package:graphql/src/core/result_parser.dart'; import 'package:graphql/src/utilities/helpers.dart'; diff --git a/packages/graphql/lib/src/core/query_result.dart b/packages/graphql/lib/src/core/query_result.dart index 23c1251ab..0bdf3c9bd 100644 --- a/packages/graphql/lib/src/core/query_result.dart +++ b/packages/graphql/lib/src/core/query_result.dart @@ -51,8 +51,8 @@ class QueryResult { /// etc. static final unexecuted = QueryResult( source: null, - parserFn: (d) => throw new UnimplementedError( - "Unexecuted query data can not be parsed."), + parserFn: (d) => + throw UnimplementedError("Unexecuted query data can not be parsed."), )..timestamp = DateTime.fromMillisecondsSinceEpoch(0); factory QueryResult.loading({ diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index d759595fd..3ae64dcf9 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -16,6 +16,7 @@ import 'package:web_socket_channel/web_socket_channel.dart'; import './helpers.dart'; import './mock_server/ws_echo_server.dart'; +import 'mock_server/ws_echo_server.dart'; class EchoSink extends DelegatingStreamSink implements WebSocketSink { final StreamSink sink; From d936cb90d3b05359fbd4eeb0b5ba720ab4d1f298 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Tue, 25 Jan 2022 20:51:59 +0000 Subject: [PATCH 58/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 8a2f65f30..27f1557d5 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.3 +version: 5.0.1-beta.4 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index eead31c1f..cd81588e7 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.3 +version: 5.0.1-beta.4 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter publish_to: none dependencies: From 98d111dd1a07ec6090b064239b4e4dc596a78e7a Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Wed, 26 Jan 2022 08:46:12 +0000 Subject: [PATCH 59/94] fix: Pass parse type to run I forgot to parse the `TParsed` to the runner in the `MutationBuilder`. --- packages/graphql_flutter/lib/src/widgets/mutation.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql_flutter/lib/src/widgets/mutation.dart b/packages/graphql_flutter/lib/src/widgets/mutation.dart index 140e2bf01..fbf135f25 100644 --- a/packages/graphql_flutter/lib/src/widgets/mutation.dart +++ b/packages/graphql_flutter/lib/src/widgets/mutation.dart @@ -10,7 +10,7 @@ typedef RunMutation = MultiSourceResult Function( }); typedef MutationBuilder = Widget Function( - RunMutation runMutation, + RunMutation runMutation, QueryResult? result, ); From ab818dea147aea04f2a0742506d6276b6f9aa6c8 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Wed, 26 Jan 2022 09:05:45 +0000 Subject: [PATCH 60/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 27f1557d5..3c3c52ad6 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.4 +version: 5.0.1-beta.5 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index cd81588e7..a33d7716d 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.4 +version: 5.0.1-beta.5 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter publish_to: none dependencies: From c268d1e092cabe165afe56a9390093c4c4c84019 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Thu, 27 Jan 2022 13:29:46 +0100 Subject: [PATCH 61/94] packages: improve pub.dev scoring Signed-off-by: Vincenzo Palazzo --- packages/graphql/README.md | 10 +++++----- packages/graphql_flutter/README.md | 10 +++++----- packages/graphql_flutter/pubspec.yaml | 5 ++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index 2b3ddb685..a930b8b64 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -831,16 +831,16 @@ final HttpLink _httpLink = HttpLink( final Link _link = _apqLink.concat(_httpLink); ``` -[build-status-badge]: https://img.shields.io/circleci/build/github/zino-app/graphql-flutter.svg?style=flat-square -[build-status-link]: https://circleci.com/gh/zino-app/graphql-flutter -[coverage-badge]: https://img.shields.io/codecov/c/github/zino-app/graphql-flutter.svg?style=flat-square -[coverage-link]: https://codecov.io/gh/zino-app/graphql-flutter +[build-status-badge]: https://img.shields.io/github/workflow/status/zino-hofmann/graphql-flutter/graphql-flutter%20Tests%20case?style=flat-square +[build-status-link]: https://github.com/zino-hofmann/graphql-flutter/actions +[coverage-badge]: https://img.shields.io/codecov/c/github/zino-hofmann/graphql-flutter/beta?style=flat-square +[coverage-link]: https://app.codecov.io/gh/zino-hofmann/graphql-flutter [version-badge]: https://img.shields.io/pub/v/graphql_flutter.svg?style=flat-square [package-link]: https://pub.dartlang.org/packages/graphql/versions [license-badge]: https://img.shields.io/github/license/zino-app/graphql-flutter.svg?style=flat-square [license-link]: https://github.com/zino-app/graphql-flutter/blob/master/LICENSE [prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square -[prs-link]: http://makeapullrequest.com +[prs-link]: https://makeapullrequest.com [github-watch-badge]: https://img.shields.io/github/watchers/zino-app/graphql-flutter.svg?style=flat-square&logo=github&logoColor=ffffff [github-watch-link]: https://github.com/zino-app/graphql-flutter/watchers [github-star-badge]: https://img.shields.io/github/stars/zino-app/graphql-flutter.svg?style=flat-square&logo=github&logoColor=ffffff diff --git a/packages/graphql_flutter/README.md b/packages/graphql_flutter/README.md index 0f15335b8..743500389 100644 --- a/packages/graphql_flutter/README.md +++ b/packages/graphql_flutter/README.md @@ -461,16 +461,16 @@ You can use `GraphQLConsumer` to grab it from any `context` descended from a `Gr ... ``` -[build-status-badge]: https://img.shields.io/circleci/build/github/zino-app/graphql-flutter.svg?style=flat-square -[build-status-link]: https://circleci.com/gh/zino-app/graphql-flutter -[coverage-badge]: https://img.shields.io/codecov/c/github/zino-app/graphql-flutter.svg?style=flat-square -[coverage-link]: https://codecov.io/gh/zino-app/graphql-flutter +[build-status-badge]: https://img.shields.io/github/workflow/status/zino-hofmann/graphql-flutter/graphql-flutter%20Tests%20case?style=flat-square +[build-status-link]: https://github.com/zino-hofmann/graphql-flutter/actions +[coverage-badge]: https://img.shields.io/codecov/c/github/zino-hofmann/graphql-flutter/beta?style=flat-square +[coverage-link]: https://app.codecov.io/gh/zino-hofmann/graphql-flutter [version-badge]: https://img.shields.io/pub/v/graphql_flutter.svg?style=flat-square [package-link]: https://pub.dartlang.org/packages/graphql_flutter [license-badge]: https://img.shields.io/github/license/zino-app/graphql-flutter.svg?style=flat-square [license-link]: https://github.com/zino-app/graphql-flutter/blob/master/LICENSE [prs-badge]: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square -[prs-link]: http://makeapullrequest.com +[prs-link]: https://makeapullrequest.com [github-watch-badge]: https://img.shields.io/github/watchers/zino-app/graphql-flutter.svg?style=flat-square&logo=github&logoColor=ffffff [github-watch-link]: https://github.com/zino-app/graphql-flutter/watchers [github-star-badge]: https://img.shields.io/github/stars/zino-app/graphql-flutter.svg?style=flat-square&logo=github&logoColor=ffffff diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index a33d7716d..72d3bd070 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -2,10 +2,9 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. version: 5.0.1-beta.5 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter -publish_to: none + dependencies: - graphql: # 5.0.0 - path: ../graphql + graphql: ^5.0.1-beta.5 gql_exec: 0.3.0 flutter: sdk: flutter From 9af573759a0d94dfaf8c92f9d821004c795cd640 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 25 Jan 2022 22:48:34 +0100 Subject: [PATCH 62/94] graphql: reworking Socket Client API to support custom header Signed-off-by: Vincenzo Palazzo --- packages/graphql/lib/src/links/gql_links.dart | 2 -- packages/graphql/lib/src/links/links.dart | 2 -- .../websocket_link/websocket_client.dart | 34 +++++++++++++------ .../lib/src/utilities/platform_html.dart | 8 +++-- .../lib/src/utilities/platform_io.dart | 9 +++-- packages/graphql/test/websocket_test.dart | 16 +++++---- 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/packages/graphql/lib/src/links/gql_links.dart b/packages/graphql/lib/src/links/gql_links.dart index 715f91660..4a83fded2 100644 --- a/packages/graphql/lib/src/links/gql_links.dart +++ b/packages/graphql/lib/src/links/gql_links.dart @@ -1,6 +1,4 @@ export 'package:gql_link/gql_link.dart'; - export 'package:gql_http_link/gql_http_link.dart'; -// export 'package:gql_websocket_link/gql_websocket_link.dart'; export 'package:gql_error_link/gql_error_link.dart'; export 'package:gql_dedupe_link/gql_dedupe_link.dart'; diff --git a/packages/graphql/lib/src/links/links.dart b/packages/graphql/lib/src/links/links.dart index 1ead5ab31..87da7132f 100644 --- a/packages/graphql/lib/src/links/links.dart +++ b/packages/graphql/lib/src/links/links.dart @@ -1,6 +1,4 @@ // Reexport all gql_links export 'package:graphql/src/links/gql_links.dart'; - export 'package:graphql/src/links/auth_link.dart'; - export 'package:graphql/src/links/websocket_link/websocket_link.dart'; diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 6b50612c6..79fd942e9 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -49,7 +49,8 @@ class SocketClientConfig { this.inactivityTimeout = const Duration(seconds: 30), this.delayBetweenReconnectionAttempts = const Duration(seconds: 5), this.initialPayload, - @experimental this.connect = defaultConnect, + this.customHeaders, + @experimental this.customConnect, }); /// Serializer used to serialize request @@ -86,7 +87,7 @@ class SocketClientConfig { /// Warning: if you want to listen to the listen to the stream, /// wrap your channel with our [GraphQLWebSocketChannel] using the `.forGraphQL()` helper: /// ```dart - /// connect: (url, protocols) { + /// customConnect: (url, protocols) { /// var channel = WebSocketChannel.connect(url, protocols: protocols) /// // without this line, our client won't be able to listen to stream events, /// // because you are already listening. @@ -101,15 +102,28 @@ class SocketClientConfig { /// connect: (url, protocols) => /// IOWebSocketChannel.connect(url, protocols: protocols, headers: myCustomHeaders) /// ``` - final WebSocketConnect connect; - - static Future defaultConnect( - Uri uri, - Iterable? protocols, - ) async { + final WebSocketConnect? customConnect; + + /// Custom header to add inside the client + final Map? customHeaders; + + /// Function to define another connection without call directly + /// the connection function + FutureOr connect( + {required Uri uri, + Iterable? protocols, + Map? headers, + WebSocketConnect? fnConnect}) { + if (fnConnect != null) { + return fnConnect(uri, protocols); + } + if (customConnect != null) { + return customConnect!(uri, protocols); + } return defaultConnectPlatform( uri, protocols, + headers: headers, ); } @@ -152,7 +166,6 @@ class SocketClient { SocketClient( this.url, { this.protocols = const ['graphql-ws'], - WebSocketConnect? connect, this.config = const SocketClientConfig(), @visibleForTesting this.randomBytesForUuid, @visibleForTesting this.onMessage, @@ -235,7 +248,8 @@ class SocketClient { try { // Even though config.connect is sync, we call async in order to make the // SocketConnectionState.connected attribution not overload SocketConnectionState.connecting - var connection = await config.connect(Uri.parse(url), protocols); + var connection = + await config.connect(uri: Uri.parse(url), protocols: protocols); socketChannel = connection.forGraphQL(); _connectionStateController.add(SocketConnectionState.connected); _write(initOperation); diff --git a/packages/graphql/lib/src/utilities/platform_html.dart b/packages/graphql/lib/src/utilities/platform_html.dart index dc85f1520..5e1882f2b 100644 --- a/packages/graphql/lib/src/utilities/platform_html.dart +++ b/packages/graphql/lib/src/utilities/platform_html.dart @@ -2,9 +2,11 @@ import 'package:graphql/src/links/websocket_link/websocket_client.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; Future defaultConnectPlatform( - Uri uri, - Iterable? protocols, -) async { + Uri uri, Iterable? protocols, + {Map? headers}) async { + if (headers != null) { + print("The headers on the web are not supported"); + } final webSocketChannel = await WebSocketChannel.connect(uri, protocols: protocols); return webSocketChannel.forGraphQL(); diff --git a/packages/graphql/lib/src/utilities/platform_io.dart b/packages/graphql/lib/src/utilities/platform_io.dart index 5aee635fe..756db7bd8 100644 --- a/packages/graphql/lib/src/utilities/platform_io.dart +++ b/packages/graphql/lib/src/utilities/platform_io.dart @@ -5,10 +5,9 @@ import 'package:web_socket_channel/io.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; Future defaultConnectPlatform( - Uri uri, - Iterable? protocols, -) async { - final webSocket = - await WebSocket.connect(uri.toString(), protocols: protocols); + Uri uri, Iterable? protocols, + {Map? headers}) async { + final webSocket = await WebSocket.connect(uri.toString(), + protocols: protocols, headers: headers); return IOWebSocketChannel(webSocket).forGraphQL(); } diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index 3ae64dcf9..4166717ae 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -58,16 +58,16 @@ class EchoSocket implements WebSocketChannel { throw UnimplementedError(); @override - int get closeCode => throw UnimplementedError(); + int get closeCode => 1000; @override - String get closeReason => throw UnimplementedError(); + String get closeReason => ""; @override void pipe(StreamChannel other) {} @override - String get protocol => throw UnimplementedError(); + String get protocol => "ws"; @override StreamChannel transform( @@ -96,10 +96,11 @@ SocketClient getTestClient( const Duration(milliseconds: 1)}) => SocketClient( wsUrl, - connect: (_, __) => EchoSocket.connect(controller ?? BehaviorSubject()), config: SocketClientConfig( autoReconnect: autoReconnect, delayBetweenReconnectionAttempts: delayBetweenReconnectionAttempts, + customConnect: (_, __) => + EchoSocket.connect(controller ?? BehaviorSubject()), ), randomBytesForUuid: Uint8List.fromList( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], @@ -429,8 +430,9 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - connect: (_, __) => EchoSocket.connect(BehaviorSubject()), - config: SocketClientConfig(initialPayload: () => initPayload), + config: SocketClientConfig( + initialPayload: () => initPayload, + customConnect: (_, __) => EchoSocket.connect(BehaviorSubject())), ); })); @@ -461,8 +463,8 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - connect: (_, __) => EchoSocket.connect(BehaviorSubject()), config: SocketClientConfig( + customConnect: (_, __) => EchoSocket.connect(BehaviorSubject()), initialPayload: () async { await Future.delayed(Duration(seconds: 3)); return initPayload; From 668179ccaeade61bf5a4d42d1c9a4dd7517ecb2e Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Thu, 27 Jan 2022 11:19:24 +0100 Subject: [PATCH 63/94] graphql: clean ws test by removing the Echo Websocket We remove the Echo web socket because we a new internal echo server, However, we can try to add costom headers in the tests. Signed-off-by: Vincenzo Palazzo --- .../websocket_link/websocket_client.dart | 2 +- packages/graphql/test/websocket_test.dart | 83 +------------------ 2 files changed, 2 insertions(+), 83 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 79fd942e9..b36e13708 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -94,7 +94,7 @@ class SocketClientConfig { /// channel = channel.forGraphQL(); /// channel.stream.listen(myListener) /// return channel; - /// } + /// }socketChannel /// ``` /// /// To supply custom headers to an IO client: diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index 4166717ae..9c4e465bd 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -1,93 +1,17 @@ -//@Skip('currently failing for web socket services unavailable') - import 'dart:async'; import 'dart:io'; -import 'package:async/async.dart'; -import 'package:rxdart/subjects.dart'; -import 'package:stream_channel/stream_channel.dart'; import 'package:test/test.dart'; import 'dart:convert'; import 'dart:typed_data'; import 'package:gql/language.dart'; import 'package:graphql/client.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; import './helpers.dart'; import './mock_server/ws_echo_server.dart'; import 'mock_server/ws_echo_server.dart'; -class EchoSink extends DelegatingStreamSink implements WebSocketSink { - final StreamSink sink; - - EchoSink(StreamSink sink) - : this.sink = sink, - super(sink); - - @override - Future close([int? closeCode, String? closeReason]) { - return super.close(); - } -} - -class EchoSocket implements WebSocketChannel { - final StreamController controller; - - EchoSocket.connect(this.controller) : sink = EchoSink(controller.sink); - - @override - Stream get stream => controller.stream; - - @override - final WebSocketSink sink; - - @override - StreamChannel cast() => throw UnimplementedError(); - - @override - StreamChannel changeSink( - StreamSink Function(StreamSink p1) change, - ) => - throw UnimplementedError(); - - @override - StreamChannel changeStream( - Stream Function(Stream p1) change, - ) => - throw UnimplementedError(); - - @override - int get closeCode => 1000; - - @override - String get closeReason => ""; - - @override - void pipe(StreamChannel other) {} - - @override - String get protocol => "ws"; - - @override - StreamChannel transform( - StreamChannelTransformer transformer, - ) => - throw UnimplementedError(); - - @override - StreamChannel transformSink( - StreamSinkTransformer transformer, - ) => - throw UnimplementedError(); - - @override - StreamChannel transformStream( - StreamTransformer transformer, - ) => - throw UnimplementedError(); -} - SocketClient getTestClient( {required String wsUrl, StreamController? controller, @@ -99,8 +23,6 @@ SocketClient getTestClient( config: SocketClientConfig( autoReconnect: autoReconnect, delayBetweenReconnectionAttempts: delayBetweenReconnectionAttempts, - customConnect: (_, __) => - EchoSocket.connect(controller ?? BehaviorSubject()), ), randomBytesForUuid: Uint8List.fromList( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], @@ -430,9 +352,7 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - config: SocketClientConfig( - initialPayload: () => initPayload, - customConnect: (_, __) => EchoSocket.connect(BehaviorSubject())), + config: SocketClientConfig(initialPayload: () => initPayload), ); })); @@ -464,7 +384,6 @@ Future main() async { socketClient = SocketClient( wsUrl, config: SocketClientConfig( - customConnect: (_, __) => EchoSocket.connect(BehaviorSubject()), initialPayload: () async { await Future.delayed(Duration(seconds: 3)); return initPayload; From 652323c1ab12d5a6f38e2c66a876c24a1763ec28 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Thu, 27 Jan 2022 11:41:01 +0100 Subject: [PATCH 64/94] ci: fixed codecov warning Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_codcoverage.yml | 6 ++-- .../workflows/graphql_flutter_codcoverage.yml | 2 +- .github/workflows/release.yml | 18 ---------- .../websocket_link/websocket_client.dart | 34 ++++++++----------- .../links/websocket_link/websocket_link.dart | 4 +-- packages/graphql/test/websocket_test.dart | 25 ++++++++++++-- 6 files changed, 42 insertions(+), 47 deletions(-) delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/graphql_codcoverage.yml b/.github/workflows/graphql_codcoverage.yml index 8c2b0f409..6804606e4 100644 --- a/.github/workflows/graphql_codcoverage.yml +++ b/.github/workflows/graphql_codcoverage.yml @@ -15,10 +15,10 @@ jobs: run: | cd packages/graphql dart pub get - pub run test --coverage="coverage" - pub run coverage:format_coverage --lcov --in=coverage --out=coverage.lcov --packages=.packages --report-on=lib + dart run test --coverage="coverage" + dart run coverage:format_coverage --lcov --in=coverage --out=coverage.lcov --packages=.packages --report-on=lib - name: Upload coverage file run: | curl -Os https://uploader.codecov.io/latest/linux/codecov chmod +x codecov - ./codecov --file packages/graphql/coverage.lcov \ No newline at end of file + ./codecov \ No newline at end of file diff --git a/.github/workflows/graphql_flutter_codcoverage.yml b/.github/workflows/graphql_flutter_codcoverage.yml index 16b3482a3..d5a2bc914 100644 --- a/.github/workflows/graphql_flutter_codcoverage.yml +++ b/.github/workflows/graphql_flutter_codcoverage.yml @@ -18,4 +18,4 @@ jobs: run: | curl -Os https://uploader.codecov.io/latest/linux/codecov chmod +x codecov - ./codecov --file packages/graphql_flutter/coverage/lcov.info \ No newline at end of file + ./codecov \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index a2bfa0885..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Publish to Pub.dev - -on: - release: - types: [created] - -jobs: - publishing: - runs-on: ubuntu-latest - steps: - - name: 'Checkout' - uses: actions/checkout@v2 # required! - - - name: '>> Dart package <<' - uses: k-paxian/dart-package-publisher@master - with: - accessToken: ${{ secrets.OAUTH_ACCESS_TOKEN }} - refreshToken: ${{ secrets.OAUTH_REFRESH_TOKEN }} \ No newline at end of file diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index b36e13708..0601b0b84 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -40,8 +40,8 @@ class SubscriptionListener { enum SocketConnectionState { notConnected, connecting, connected } -class SocketClientConfig { - const SocketClientConfig({ +class customConnect { + const customConnect({ this.serializer = const RequestSerializer(), this.parser = const ResponseParser(), this.autoReconnect = true, @@ -87,25 +87,19 @@ class SocketClientConfig { /// Warning: if you want to listen to the listen to the stream, /// wrap your channel with our [GraphQLWebSocketChannel] using the `.forGraphQL()` helper: /// ```dart - /// customConnect: (url, protocols) { + /// connectFn: (url, protocols) { /// var channel = WebSocketChannel.connect(url, protocols: protocols) /// // without this line, our client won't be able to listen to stream events, /// // because you are already listening. /// channel = channel.forGraphQL(); /// channel.stream.listen(myListener) /// return channel; - /// }socketChannel - /// ``` - /// - /// To supply custom headers to an IO client: - /// ```dart - /// connect: (url, protocols) => - /// IOWebSocketChannel.connect(url, protocols: protocols, headers: myCustomHeaders) + /// } /// ``` - final WebSocketConnect? customConnect; + final WebSocketConnect? connectFn; /// Custom header to add inside the client - final Map? customHeaders; + final Map? headers; /// Function to define another connection without call directly /// the connection function @@ -113,12 +107,12 @@ class SocketClientConfig { {required Uri uri, Iterable? protocols, Map? headers, - WebSocketConnect? fnConnect}) { - if (fnConnect != null) { - return fnConnect(uri, protocols); + WebSocketConnect? connectFn}) { + if (connectFn != null) { + return connectFn(uri, protocols); } - if (customConnect != null) { - return customConnect!(uri, protocols); + if (this.connectFn != null) { + return this.connectFn!(uri, protocols); } return defaultConnectPlatform( uri, @@ -166,7 +160,7 @@ class SocketClient { SocketClient( this.url, { this.protocols = const ['graphql-ws'], - this.config = const SocketClientConfig(), + this.config = const customConnect(), @visibleForTesting this.randomBytesForUuid, @visibleForTesting this.onMessage, @visibleForTesting this.onStreamError = _defaultOnStreamError, @@ -177,7 +171,7 @@ class SocketClient { Uint8List? randomBytesForUuid; final String url; final Iterable? protocols; - final SocketClientConfig config; + final customConnect config; final BehaviorSubject _connectionStateController = BehaviorSubject(); @@ -347,7 +341,7 @@ class SocketClient { /// Sends a query, mutation or subscription request to the server, and returns a stream of the response. /// /// If the request is a query or mutation, a timeout will be applied to the request as specified by - /// [SocketClientConfig]'s [queryAndMutationTimeout] field. + /// [customConnect]'s [queryAndMutationTimeout] field. /// /// If the request is a subscription, obviously no timeout is applied. /// diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_link.dart b/packages/graphql/lib/src/links/websocket_link/websocket_link.dart index 8fa02a5b2..1b0a77e06 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_link.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_link.dart @@ -15,11 +15,11 @@ class WebSocketLink extends Link { /// Creates a new [WebSocketLink] instance with the specified config. WebSocketLink( this.url, { - this.config = const SocketClientConfig(), + this.config = const customConnect(), }); final String url; - final SocketClientConfig config; + final customConnect config; // cannot be final because we're changing the instance upon a header change. SocketClient? _socketClient; diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index 9c4e465bd..403e28b9c 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -16,12 +16,14 @@ SocketClient getTestClient( {required String wsUrl, StreamController? controller, bool autoReconnect = true, + Map? customHeaders, Duration delayBetweenReconnectionAttempts = const Duration(milliseconds: 1)}) => SocketClient( wsUrl, - config: SocketClientConfig( + config: customConnect( autoReconnect: autoReconnect, + customHeaders: customHeaders, delayBetweenReconnectionAttempts: delayBetweenReconnectionAttempts, ), randomBytesForUuid: Uint8List.fromList( @@ -352,7 +354,7 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - config: SocketClientConfig(initialPayload: () => initPayload), + config: customConnect(initialPayload: () => initPayload), ); })); @@ -383,7 +385,7 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - config: SocketClientConfig( + config: customConnect( initialPayload: () async { await Future.delayed(Duration(seconds: 3)); return initPayload; @@ -408,5 +410,22 @@ Future main() async { emits(initPayload), ); }); + + /* + FIXME: Testing the correct header in the request + group('SocketClient with custom headers with const payload', () { + const customHeaders = {'myHeader': 'myHeader'}; + + setUp(overridePrint((log) { + socketClient = getTestClient(wsUrl: wsUrl, customHeaders: customHeaders); + })); + + test('check header', () async { + await socketClient.connectionState + .where((state) => state == SocketConnectionState.notConnected) + .first; + }); + }); + */ }); } From ba8bcf040eb214fbd39c9e1aa54fe33fa005cc77 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 1 Feb 2022 14:46:38 +0100 Subject: [PATCH 65/94] graphql: deprecated connect function in the SocketClient Signed-off-by: Vincenzo Palazzo --- .../links/websocket_link/websocket_client.dart | 16 ++++++++-------- .../src/links/websocket_link/websocket_link.dart | 4 ++-- packages/graphql/test/websocket_test.dart | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index 0601b0b84..ef0bc8ae4 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -40,8 +40,8 @@ class SubscriptionListener { enum SocketConnectionState { notConnected, connecting, connected } -class customConnect { - const customConnect({ +class SocketClientConfig { + const SocketClientConfig({ this.serializer = const RequestSerializer(), this.parser = const ResponseParser(), this.autoReconnect = true, @@ -49,8 +49,8 @@ class customConnect { this.inactivityTimeout = const Duration(seconds: 30), this.delayBetweenReconnectionAttempts = const Duration(seconds: 5), this.initialPayload, - this.customHeaders, - @experimental this.customConnect, + this.headers, + @deprecated this.connectFn, }); /// Serializer used to serialize request @@ -117,7 +117,7 @@ class customConnect { return defaultConnectPlatform( uri, protocols, - headers: headers, + headers: headers ?? this.headers, ); } @@ -160,7 +160,7 @@ class SocketClient { SocketClient( this.url, { this.protocols = const ['graphql-ws'], - this.config = const customConnect(), + this.config = const SocketClientConfig(), @visibleForTesting this.randomBytesForUuid, @visibleForTesting this.onMessage, @visibleForTesting this.onStreamError = _defaultOnStreamError, @@ -171,7 +171,7 @@ class SocketClient { Uint8List? randomBytesForUuid; final String url; final Iterable? protocols; - final customConnect config; + final SocketClientConfig config; final BehaviorSubject _connectionStateController = BehaviorSubject(); @@ -341,7 +341,7 @@ class SocketClient { /// Sends a query, mutation or subscription request to the server, and returns a stream of the response. /// /// If the request is a query or mutation, a timeout will be applied to the request as specified by - /// [customConnect]'s [queryAndMutationTimeout] field. + /// [SocketClientConfig]'s [queryAndMutationTimeout] field. /// /// If the request is a subscription, obviously no timeout is applied. /// diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_link.dart b/packages/graphql/lib/src/links/websocket_link/websocket_link.dart index 1b0a77e06..8fa02a5b2 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_link.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_link.dart @@ -15,11 +15,11 @@ class WebSocketLink extends Link { /// Creates a new [WebSocketLink] instance with the specified config. WebSocketLink( this.url, { - this.config = const customConnect(), + this.config = const SocketClientConfig(), }); final String url; - final customConnect config; + final SocketClientConfig config; // cannot be final because we're changing the instance upon a header change. SocketClient? _socketClient; diff --git a/packages/graphql/test/websocket_test.dart b/packages/graphql/test/websocket_test.dart index 403e28b9c..72faa05a3 100644 --- a/packages/graphql/test/websocket_test.dart +++ b/packages/graphql/test/websocket_test.dart @@ -21,9 +21,9 @@ SocketClient getTestClient( const Duration(milliseconds: 1)}) => SocketClient( wsUrl, - config: customConnect( + config: SocketClientConfig( autoReconnect: autoReconnect, - customHeaders: customHeaders, + headers: customHeaders, delayBetweenReconnectionAttempts: delayBetweenReconnectionAttempts, ), randomBytesForUuid: Uint8List.fromList( @@ -354,7 +354,7 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - config: customConnect(initialPayload: () => initPayload), + config: SocketClientConfig(initialPayload: () => initPayload), ); })); @@ -385,7 +385,7 @@ Future main() async { setUp(overridePrint((log) { socketClient = SocketClient( wsUrl, - config: customConnect( + config: SocketClientConfig( initialPayload: () async { await Future.delayed(Duration(seconds: 3)); return initPayload; From 568535852bcfd70c091c4d099df9d3b7783034f9 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Wed, 2 Feb 2022 00:24:26 +0100 Subject: [PATCH 66/94] graphql: prefer the connect function in the constructor Signed-off-by: Vincenzo Palazzo --- .../lib/src/links/websocket_link/websocket_client.dart | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart index ef0bc8ae4..eeec5b8c4 100644 --- a/packages/graphql/lib/src/links/websocket_link/websocket_client.dart +++ b/packages/graphql/lib/src/links/websocket_link/websocket_client.dart @@ -50,7 +50,7 @@ class SocketClientConfig { this.delayBetweenReconnectionAttempts = const Duration(seconds: 5), this.initialPayload, this.headers, - @deprecated this.connectFn, + this.connectFn, }); /// Serializer used to serialize request @@ -106,13 +106,9 @@ class SocketClientConfig { FutureOr connect( {required Uri uri, Iterable? protocols, - Map? headers, - WebSocketConnect? connectFn}) { + Map? headers}) { if (connectFn != null) { - return connectFn(uri, protocols); - } - if (this.connectFn != null) { - return this.connectFn!(uri, protocols); + return connectFn!(uri, protocols); } return defaultConnectPlatform( uri, From ebbf79cb5e4e10e76c13b3bac29d9f730a51cdb1 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Wed, 2 Feb 2022 07:43:50 +0000 Subject: [PATCH 67/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 3c3c52ad6..4fbd7c281 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.5 +version: 5.0.1-beta.6 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 72d3bd070..c75c66882 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,8 +1,7 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.5 +version: 5.0.1-beta.6 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter - dependencies: graphql: ^5.0.1-beta.5 gql_exec: 0.3.0 From 3dd81867667d847eb24af2d97d019af310195e57 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Wed, 2 Feb 2022 20:47:57 +0100 Subject: [PATCH 68/94] doc: update the doc and remove the bloc example We preferer to mantains the example update, so we preferer to link the original tool and not make a copy example Signed-off-by: Vincenzo Palazzo --- README.md | 9 +- examples/flutter_bloc/.gitignore | 75 --- examples/flutter_bloc/.metadata | 10 - examples/flutter_bloc/Makefile | 13 - examples/flutter_bloc/README.md | 12 - .../flutter_bloc/android/app/build.gradle | 61 -- .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 33 - .../MainActivity.java | 13 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 8 - .../app/src/profile/AndroidManifest.xml | 7 - examples/flutter_bloc/android/build.gradle | 29 - .../flutter_bloc/android/gradle.properties | 2 - .../gradle/wrapper/gradle-wrapper.properties | 6 - examples/flutter_bloc/android/settings.gradle | 15 - .../ios/Flutter/AppFrameworkInfo.plist | 26 - .../flutter_bloc/ios/Flutter/Debug.xcconfig | 2 - .../flutter_bloc/ios/Flutter/Release.xcconfig | 2 - examples/flutter_bloc/ios/Podfile | 38 -- .../ios/Runner.xcodeproj/project.pbxproj | 567 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 --- .../contents.xcworkspacedata | 10 - .../flutter_bloc/ios/Runner/AppDelegate.h | 6 - .../flutter_bloc/ios/Runner/AppDelegate.m | 13 - .../AppIcon.appiconset/Contents.json | 122 ---- .../Icon-App-1024x1024@1x.png | Bin 11112 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 -- .../ios/Runner/Base.lproj/Main.storyboard | 26 - examples/flutter_bloc/ios/Runner/Info.plist | 45 -- examples/flutter_bloc/ios/Runner/main.m | 9 - examples/flutter_bloc/lib/bloc.dart | 152 ----- .../flutter_bloc/lib/blocs/repos/events.dart | 42 -- .../flutter_bloc/lib/blocs/repos/models.dart | 13 - .../lib/blocs/repos/my_repos_bloc.dart | 135 ----- .../flutter_bloc/lib/blocs/repos/states.dart | 48 -- examples/flutter_bloc/lib/extended_bloc.dart | 126 ---- .../lib/extended_bloc/repositories_bloc.dart | 85 --- .../graphql_operation/mutations/addStar.dart | 9 - .../mutations/mutations.dart | 2 - .../mutations/removeStar.dart | 9 - .../queries/readRepositories.dart | 23 - examples/flutter_bloc/lib/hive_init.dart | 33 - examples/flutter_bloc/lib/local.dart | 2 - examples/flutter_bloc/lib/main.dart | 93 --- examples/flutter_bloc/lib/repository.dart | 43 -- examples/flutter_bloc/pubspec.yaml | 35 -- examples/flutter_bloc/test/bloc_test.dart | 107 ---- examples/flutter_bloc/test/widget_test.dart | 27 - 74 files changed, 7 insertions(+), 2318 deletions(-) delete mode 100644 examples/flutter_bloc/.gitignore delete mode 100644 examples/flutter_bloc/.metadata delete mode 100644 examples/flutter_bloc/Makefile delete mode 100644 examples/flutter_bloc/README.md delete mode 100644 examples/flutter_bloc/android/app/build.gradle delete mode 100644 examples/flutter_bloc/android/app/src/debug/AndroidManifest.xml delete mode 100644 examples/flutter_bloc/android/app/src/main/AndroidManifest.xml delete mode 100644 examples/flutter_bloc/android/app/src/main/java/com/example/graphql_flutter_bloc_example/MainActivity.java delete mode 100644 examples/flutter_bloc/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 examples/flutter_bloc/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 examples/flutter_bloc/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 examples/flutter_bloc/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 examples/flutter_bloc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 examples/flutter_bloc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 examples/flutter_bloc/android/app/src/main/res/values/styles.xml delete mode 100644 examples/flutter_bloc/android/app/src/profile/AndroidManifest.xml delete mode 100644 examples/flutter_bloc/android/build.gradle delete mode 100644 examples/flutter_bloc/android/gradle.properties delete mode 100644 examples/flutter_bloc/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 examples/flutter_bloc/android/settings.gradle delete mode 100644 examples/flutter_bloc/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 examples/flutter_bloc/ios/Flutter/Debug.xcconfig delete mode 100644 examples/flutter_bloc/ios/Flutter/Release.xcconfig delete mode 100644 examples/flutter_bloc/ios/Podfile delete mode 100644 examples/flutter_bloc/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 examples/flutter_bloc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/flutter_bloc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 examples/flutter_bloc/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/flutter_bloc/ios/Runner/AppDelegate.h delete mode 100644 examples/flutter_bloc/ios/Runner/AppDelegate.m delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 examples/flutter_bloc/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 examples/flutter_bloc/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 examples/flutter_bloc/ios/Runner/Info.plist delete mode 100644 examples/flutter_bloc/ios/Runner/main.m delete mode 100644 examples/flutter_bloc/lib/bloc.dart delete mode 100644 examples/flutter_bloc/lib/blocs/repos/events.dart delete mode 100644 examples/flutter_bloc/lib/blocs/repos/models.dart delete mode 100644 examples/flutter_bloc/lib/blocs/repos/my_repos_bloc.dart delete mode 100644 examples/flutter_bloc/lib/blocs/repos/states.dart delete mode 100644 examples/flutter_bloc/lib/extended_bloc.dart delete mode 100644 examples/flutter_bloc/lib/extended_bloc/repositories_bloc.dart delete mode 100644 examples/flutter_bloc/lib/graphql_operation/mutations/addStar.dart delete mode 100644 examples/flutter_bloc/lib/graphql_operation/mutations/mutations.dart delete mode 100644 examples/flutter_bloc/lib/graphql_operation/mutations/removeStar.dart delete mode 100644 examples/flutter_bloc/lib/graphql_operation/queries/readRepositories.dart delete mode 100644 examples/flutter_bloc/lib/hive_init.dart delete mode 100644 examples/flutter_bloc/lib/local.dart delete mode 100644 examples/flutter_bloc/lib/main.dart delete mode 100644 examples/flutter_bloc/lib/repository.dart delete mode 100644 examples/flutter_bloc/pubspec.yaml delete mode 100644 examples/flutter_bloc/test/bloc_test.dart delete mode 100644 examples/flutter_bloc/test/widget_test.dart diff --git a/README.md b/README.md index ef3f055dd..c00b42a40 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ # GraphQL Flutter ### 📌   Bulletin -* See the [`v3 -> v4` Migration Guide](./changelog-v3-v4.md) if you're still on `v3`. * [Join the discord.][discord-link] ## About this project @@ -37,7 +36,13 @@ This is a Monorepo which contains the following packages: Here are some examples you can follow: 1. [Starwars Example](./examples/starwars) -2. [`flutter_bloc` example](./examples/flutter_bloc) + +## Utils Tools + +Around graphql_flutter are builds awesome tools like: + +1. [graphql_flutter_bloc](https://github.com/artflutter/graphql_flutter_bloc) +2. [graphql_codegen](https://github.com/heftapp/graphql_codegen) ## Articles and Videos diff --git a/examples/flutter_bloc/.gitignore b/examples/flutter_bloc/.gitignore deleted file mode 100644 index 01e95b7cc..000000000 --- a/examples/flutter_bloc/.gitignore +++ /dev/null @@ -1,75 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.packages -.pub-cache/ -.pub/ -/build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages - -/ios/Flutter/Flutter.podspec -/ios/Flutter/flutter_export_environment.sh diff --git a/examples/flutter_bloc/.metadata b/examples/flutter_bloc/.metadata deleted file mode 100644 index 3b87eb506..000000000 --- a/examples/flutter_bloc/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: b712a172f9694745f50505c93340883493b505e5 - channel: stable - -project_type: app diff --git a/examples/flutter_bloc/Makefile b/examples/flutter_bloc/Makefile deleted file mode 100644 index 8adc84e96..000000000 --- a/examples/flutter_bloc/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -CC=flutter - -default: fmt dep - -dep: - $(CC) pub get - -fmt: - $(CC) format . - $(CC) analyze . - -clean: - $(CC) clean \ No newline at end of file diff --git a/examples/flutter_bloc/README.md b/examples/flutter_bloc/README.md deleted file mode 100644 index ef6333997..000000000 --- a/examples/flutter_bloc/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# An example using graphql client with "flutter_bloc" - -This example uses [`flutter_bloc`](https://pub.dev/packages/flutter_bloc) package for state management and [`graphql client`](https://pub.dev/packages/graphql) to connect to GitHubs' GraphQL API to fetch and star/un-star your repositories. - -## Running this example - -Before running this example, make sure to create a `local.dart` file inside the `lib` directory, and add your Github token, as shown below: - -```dart -const String YOUR_PERSONAL_ACCESS_TOKEN = - ''; -``` diff --git a/examples/flutter_bloc/android/app/build.gradle b/examples/flutter_bloc/android/app/build.gradle deleted file mode 100644 index 0bb6f7ee6..000000000 --- a/examples/flutter_bloc/android/app/build.gradle +++ /dev/null @@ -1,61 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.graphql_flutter_bloc_example" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/examples/flutter_bloc/android/app/src/debug/AndroidManifest.xml b/examples/flutter_bloc/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 1321dfaba..000000000 --- a/examples/flutter_bloc/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/examples/flutter_bloc/android/app/src/main/AndroidManifest.xml b/examples/flutter_bloc/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index eeea35399..000000000 --- a/examples/flutter_bloc/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/examples/flutter_bloc/android/app/src/main/java/com/example/graphql_flutter_bloc_example/MainActivity.java b/examples/flutter_bloc/android/app/src/main/java/com/example/graphql_flutter_bloc_example/MainActivity.java deleted file mode 100644 index 4b7607f37..000000000 --- a/examples/flutter_bloc/android/app/src/main/java/com/example/graphql_flutter_bloc_example/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.graphql_flutter_bloc_example; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/examples/flutter_bloc/android/app/src/main/res/drawable/launch_background.xml b/examples/flutter_bloc/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f88..000000000 --- a/examples/flutter_bloc/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/examples/flutter_bloc/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/flutter_bloc/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/examples/flutter_bloc/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/flutter_bloc/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/examples/flutter_bloc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/flutter_bloc/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/examples/flutter_bloc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/flutter_bloc/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/examples/flutter_bloc/android/app/src/main/res/values/styles.xml b/examples/flutter_bloc/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa4417c..000000000 --- a/examples/flutter_bloc/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/examples/flutter_bloc/android/app/src/profile/AndroidManifest.xml b/examples/flutter_bloc/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 1321dfaba..000000000 --- a/examples/flutter_bloc/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/examples/flutter_bloc/android/build.gradle b/examples/flutter_bloc/android/build.gradle deleted file mode 100644 index bb8a30389..000000000 --- a/examples/flutter_bloc/android/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/examples/flutter_bloc/android/gradle.properties b/examples/flutter_bloc/android/gradle.properties deleted file mode 100644 index 2bd6f4fda..000000000 --- a/examples/flutter_bloc/android/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M - diff --git a/examples/flutter_bloc/android/gradle/wrapper/gradle-wrapper.properties b/examples/flutter_bloc/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f022f..000000000 --- a/examples/flutter_bloc/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/examples/flutter_bloc/android/settings.gradle b/examples/flutter_bloc/android/settings.gradle deleted file mode 100644 index 5a2f14fb1..000000000 --- a/examples/flutter_bloc/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/examples/flutter_bloc/ios/Flutter/AppFrameworkInfo.plist b/examples/flutter_bloc/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6b4c0f78a..000000000 --- a/examples/flutter_bloc/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/examples/flutter_bloc/ios/Flutter/Debug.xcconfig b/examples/flutter_bloc/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba114..000000000 --- a/examples/flutter_bloc/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/examples/flutter_bloc/ios/Flutter/Release.xcconfig b/examples/flutter_bloc/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340e..000000000 --- a/examples/flutter_bloc/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/examples/flutter_bloc/ios/Podfile b/examples/flutter_bloc/ios/Podfile deleted file mode 100644 index f7d6a5e68..000000000 --- a/examples/flutter_bloc/ios/Podfile +++ /dev/null @@ -1,38 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/examples/flutter_bloc/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter_bloc/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index e9bd931ce..000000000 --- a/examples/flutter_bloc/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,567 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 1B57E325128DB676C4FB7095 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FCD2C1A34A03613207476C4 /* libPods-Runner.a */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 5CA22CE3629E2B7CB9BEEEFE /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18DF0D89439134222F2FF830 /* libPods-Runner.a */; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 18DF0D89439134222F2FF830 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 40996C314C6E9E0B16D16A81 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 58CBAC75E2382AB59FB2BDD3 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 6933C3904819825D210B7737 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C9E86049F302A5727FC2A707 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5CA22CE3629E2B7CB9BEEEFE /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 34BDF72114FCEEFDE8EE0D84 /* Pods */ = { - isa = PBXGroup; - children = ( - 6933C3904819825D210B7737 /* Pods-Runner.debug.xcconfig */, - 40996C314C6E9E0B16D16A81 /* Pods-Runner.release.xcconfig */, - 58CBAC75E2382AB59FB2BDD3 /* Pods-Runner.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - 72D400AF5A9CD38CB2CFC008 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 18DF0D89439134222F2FF830 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 34BDF72114FCEEFDE8EE0D84 /* Pods */, - 72D400AF5A9CD38CB2CFC008 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 5BD8D1480982C5095378BE4D /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - E0273651DDFDE1C239C56D6C /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 5BD8D1480982C5095378BE4D /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - E0273651DDFDE1C239C56D6C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../Flutter/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = S8QB4VV633; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlFlutterBlocExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlFlutterBlocExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.graphqlFlutterBlocExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/examples/flutter_bloc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/flutter_bloc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16e..000000000 --- a/examples/flutter_bloc/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/flutter_bloc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter_bloc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140cfd..000000000 --- a/examples/flutter_bloc/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/flutter_bloc/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/flutter_bloc/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c..000000000 --- a/examples/flutter_bloc/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/examples/flutter_bloc/ios/Runner/AppDelegate.h b/examples/flutter_bloc/ios/Runner/AppDelegate.h deleted file mode 100644 index 36e21bbf9..000000000 --- a/examples/flutter_bloc/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/examples/flutter_bloc/ios/Runner/AppDelegate.m b/examples/flutter_bloc/ios/Runner/AppDelegate.m deleted file mode 100644 index 59a72e90b..000000000 --- a/examples/flutter_bloc/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,13 +0,0 @@ -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - // Override point for customization after application launch. - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab2..000000000 --- a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11112 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf03016f6c994b70f38d1b7346e5831b531f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b7..000000000 --- a/examples/flutter_bloc/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/examples/flutter_bloc/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/flutter_bloc/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7c..000000000 --- a/examples/flutter_bloc/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/flutter_bloc/ios/Runner/Base.lproj/Main.storyboard b/examples/flutter_bloc/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516f..000000000 --- a/examples/flutter_bloc/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/flutter_bloc/ios/Runner/Info.plist b/examples/flutter_bloc/ios/Runner/Info.plist deleted file mode 100644 index d510f35a3..000000000 --- a/examples/flutter_bloc/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - graphql_flutter_bloc_example - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/flutter_bloc/ios/Runner/main.m b/examples/flutter_bloc/ios/Runner/main.m deleted file mode 100644 index dff6597e4..000000000 --- a/examples/flutter_bloc/ios/Runner/main.m +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/examples/flutter_bloc/lib/bloc.dart b/examples/flutter_bloc/lib/bloc.dart deleted file mode 100644 index 12562af11..000000000 --- a/examples/flutter_bloc/lib/bloc.dart +++ /dev/null @@ -1,152 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; - -import 'blocs/repos/events.dart'; -import 'blocs/repos/models.dart'; -import 'blocs/repos/my_repos_bloc.dart'; -import 'blocs/repos/states.dart'; - -class BlocPage extends StatefulWidget { - @override - _BlocPageState createState() => _BlocPageState(); -} - -class _BlocPageState extends State { - @override - void initState() { - super.initState(); - BlocProvider.of(context) - .add(LoadMyRepos(numOfReposToLoad: 50)); - } - - @override - void dispose() { - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("Flutter Bloc GraphQL Example"), - ), - body: Container( - padding: const EdgeInsets.symmetric(horizontal: 8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - TextField( - decoration: const InputDecoration( - labelText: 'Number of repositories (default 50)', - ), - keyboardType: TextInputType.number, - textAlign: TextAlign.center, - onChanged: (String n) { - BlocProvider.of(context) - .add(LoadMyRepos(numOfReposToLoad: int.parse(n) ?? 50)); - }, - ), - SizedBox( - height: 10, - ), - new LoadRepositories( - bloc: BlocProvider.of(context), - ) - ], - ), - ), - ); - } -} - -class LoadRepositories extends StatelessWidget { - final MyGithubReposBloc bloc; - - const LoadRepositories({Key key, this.bloc}) : super(key: key); - - @override - Widget build(BuildContext context) { - return BlocBuilder( - cubit: bloc, - builder: (BuildContext context, MyGithubReposState state) { - if (state is ReposLoading) { - return Expanded( - child: Container( - child: Center( - child: CircularProgressIndicator( - semanticsLabel: "Loading ...", - ), - ), - ), - ); - } - - if (state is ReposNotLoaded) { - return Text("${state.errors}"); - } - - if (state is ReposLoaded) { - final List repositories = state.results; - - return Expanded( - child: ListView.builder( - itemCount: state.results.length, - itemBuilder: (BuildContext context, int index) => - StarrableRepository( - repository: repositories[index], - reposBloc: bloc, - ), - ), - ); - } - - return Text(null); - }, - ); - } -} - -class StarrableRepository extends StatelessWidget { - const StarrableRepository({ - Key key, - @required this.repository, - @required this.reposBloc, - }) : assert(reposBloc != null), - assert(repository != null), - super(key: key); - - final Repo repository; - final MyGithubReposBloc reposBloc; - - @override - Widget build(BuildContext context) { - return ListTile( - leading: _isRepoStarred(), - trailing: _showLoadingIndicator(), - title: Text(repository.name), - onTap: () { - reposBloc.add(MutateToggleStar(repo: repository)); - }, - ); - } - - Widget _showLoadingIndicator() { - if (repository.isLoading) { - return CircularProgressIndicator(); - } else { - return null; - } - } - - Widget _isRepoStarred() { - if (repository.viewerHasStarred) { - return Icon( - Icons.star, - color: Colors.amber, - ); - } else { - return Icon(Icons.star_border); - } - } -} diff --git a/examples/flutter_bloc/lib/blocs/repos/events.dart b/examples/flutter_bloc/lib/blocs/repos/events.dart deleted file mode 100644 index d3369da0e..000000000 --- a/examples/flutter_bloc/lib/blocs/repos/events.dart +++ /dev/null @@ -1,42 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:meta/meta.dart'; - -import 'models.dart'; - -@immutable -abstract class MyGithubReposEvent extends Equatable { - MyGithubReposEvent([List props = const []]) : super(props); -} - -// load your repositories -class LoadMyRepos extends MyGithubReposEvent { - // the number of repositories to load, default is 50 - final int numOfReposToLoad; - - LoadMyRepos({this.numOfReposToLoad: 50}) : super([numOfReposToLoad]); - - @override - String toString() => 'LoadMyRepos'; -} - -// update a repo with new mutation status -class MutateToggleStar extends MyGithubReposEvent { - // the number of repositories to load, default is 50 - final Repo repo; - - MutateToggleStar({this.repo}) : super([repo]); - - @override - String toString() => 'MutateToggleStar'; -} - -// update a repo with new mutation status -// class UpdateReposAfterMutations extends MyGithubReposEvent { -// // the number of repositories to load, default is 50 -// final Repo repo; - -// UpdateReposAfterMutations({this.repo}) : super([repo]); - -// @override -// String toString() => 'UpdateReposAfterMutations'; -// } diff --git a/examples/flutter_bloc/lib/blocs/repos/models.dart b/examples/flutter_bloc/lib/blocs/repos/models.dart deleted file mode 100644 index 1a40d8005..000000000 --- a/examples/flutter_bloc/lib/blocs/repos/models.dart +++ /dev/null @@ -1,13 +0,0 @@ -class Repo { - const Repo({ - this.id, - this.name, - this.viewerHasStarred, - this.isLoading: false, - }); - - final String id; - final String name; - final bool viewerHasStarred; - final bool isLoading; -} diff --git a/examples/flutter_bloc/lib/blocs/repos/my_repos_bloc.dart b/examples/flutter_bloc/lib/blocs/repos/my_repos_bloc.dart deleted file mode 100644 index 239b3dc80..000000000 --- a/examples/flutter_bloc/lib/blocs/repos/my_repos_bloc.dart +++ /dev/null @@ -1,135 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/widgets.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/events.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/models.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/states.dart'; -import 'package:graphql_flutter_bloc_example/repository.dart'; - -class MyGithubReposBloc extends Bloc { - final GithubRepository githubRepository; - - // this a bit of a hack - List githubRepositories; - - MyGithubReposBloc({@required this.githubRepository}) : super(ReposLoading()); - - @override - Stream mapEventToState( - MyGithubReposEvent event, - ) async* { - try { - if (event is LoadMyRepos) { - yield* _mapReposToState(event.numOfReposToLoad); - // } else if (event is UpdateReposAfterMutations) { - // yield* _mapUpdateAfterMutatationToState(event.repo); - } else if (event is MutateToggleStar) { - yield* _mapMutateStarRepositoryToState(event.repo); - } - } catch (_, stackTrace) { - print('$_ $stackTrace'); - yield state; - } - } - - Stream _mapReposToState(int numOfRepositories) async* { - try { - yield ReposLoading(); - - final queryResults = - await this.githubRepository.getRepositories(numOfRepositories); - - if (queryResults.hasException) { - yield ReposNotLoaded(queryResults.exception.graphqlErrors); - return; - } - - final List repos = - queryResults.data['viewer']['repositories']['nodes'] as List; - - final List listOfRepos = repos - .map((dynamic e) => Repo( - id: e['id'] as String, - name: e['name'] as String, - viewerHasStarred: e['viewerHasStarred'] as bool, - )) - .toList(); - - githubRepositories = listOfRepos; - - // pass the data instead - yield ReposLoaded(results: listOfRepos); - } catch (error) { - yield ReposNotLoaded(error); - } - } - - // Stream _mapUpdateAfterMutatationToState( - // Repo repo) async* { - // try { - // // assert(githubRepositories != null); - - // var repos = githubRepositories - // .map((Repo r) => repo.id == r.id ? repo : r) - // .toList(); - // yield ReposLoaded(repos); - // } catch (error) { - // yield ReposNotLoaded(error); - // } - // } - - Stream _mapMutateStarRepositoryToState(Repo repo) async* { - try { - final loadingRepo = Repo( - id: repo.id, - name: repo.name, - viewerHasStarred: repo.viewerHasStarred, - isLoading: true, - ); - - // mark repo as loading - githubRepositories = githubRepositories - .map((Repo r) => repo.id == r.id ? loadingRepo : r) - .toList(); - - // pass the data instead - yield ReposLoaded(results: githubRepositories); - - final queryResults = await githubRepository.toggleRepoStar(repo); - - if (queryResults.hasException) { - // @TODO Improve error handling here, may be introduce a hasError Method - yield ReposNotLoaded(queryResults.exception.graphqlErrors); - return; - } - - var mutatedRepo = extractRepositoryData(queryResults.data); - - final notloadingRepo = Repo( - id: repo.id, - name: repo.name, - viewerHasStarred: mutatedRepo['viewerHasStarred'], - isLoading: false, - ); - - githubRepositories = githubRepositories - .map((Repo r) => repo.id == r.id ? notloadingRepo : r) - .toList(); - - yield ReposLoaded(results: githubRepositories); - } catch (error) { - yield ReposNotLoaded(error); - } - } - - Map extractRepositoryData(Map data) { - final Map action = data['action'] as Map; - - if (action == null) { - return null; - } - - return action['starrable'] as Map; - } -} diff --git a/examples/flutter_bloc/lib/blocs/repos/states.dart b/examples/flutter_bloc/lib/blocs/repos/states.dart deleted file mode 100644 index 10062d7f2..000000000 --- a/examples/flutter_bloc/lib/blocs/repos/states.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'package:equatable/equatable.dart'; -import 'package:graphql/client.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/models.dart'; -import 'package:meta/meta.dart'; - -@immutable -abstract class MyGithubReposState extends Equatable { - MyGithubReposState([List props = const []]) : super(props); -} - -class ReposLoading extends MyGithubReposState { - @override - String toString() => 'ReposLoading'; -} - -class ReposLoaded extends MyGithubReposState { - final List results; - - ReposLoaded({@required this.results}) - : assert(results != null), - super([results]); - - @override - String toString() => 'ReposLoaded: { Github Repositories: $results }'; -} - -class ReposNotLoaded extends MyGithubReposState { - final List errors; - - ReposNotLoaded([this.errors]) : super([errors]); - - @override - String toString() => 'ReposNotLoaded'; -} - -// class ReposStarToggled extends MyGithubReposState { -// final QueryResult results; - -// ReposStarToggled([this.results]) : super([results]); - -// @override -// String toString() => 'ReposStarToggled'; -// } - -// class ReposStarNotToggled extends MyGithubReposState { -// @override -// String toString() => 'ReposStarNotToggled'; -// } diff --git a/examples/flutter_bloc/lib/extended_bloc.dart b/examples/flutter_bloc/lib/extended_bloc.dart deleted file mode 100644 index 7e850fb07..000000000 --- a/examples/flutter_bloc/lib/extended_bloc.dart +++ /dev/null @@ -1,126 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:graphql/client.dart'; -import 'package:graphql_flutter_bloc/graphql_flutter_bloc.dart'; - -import 'package:graphql_flutter_bloc_example/extended_bloc/repositories_bloc.dart'; - -class ExtendedBloc extends StatefulWidget { - @override - _ExtendedBlocState createState() => _ExtendedBlocState(); -} - -class _ExtendedBlocState extends State { - Completer _refreshCompleter; - RepositoriesBloc bloc; - - @override - void initState() { - super.initState(); - _refreshCompleter = Completer(); - bloc = BlocProvider.of(context)..run(); - } - - Future _handleRefreshStart(RepositoriesBloc bloc) { - bloc.refetch(); - return _refreshCompleter.future; - } - - @override - void dispose() { - bloc.dispose(); - super.dispose(); - } - - void _handleRefreshEnd() { - _refreshCompleter?.complete(); - _refreshCompleter = Completer(); - } - - Widget _displayResults(Map data, QueryResult result) { - final itemCount = data['viewer']['repositories']['nodes'].length; - - if (itemCount == 0) { - return ListView(children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.inbox), - SizedBox(width: 8), - Text('No data'), - ], - ) - ]); - } else { - return ListView.separated( - separatorBuilder: (_, __) => SizedBox( - height: 8.0, - ), - key: PageStorageKey('reports'), - itemCount: itemCount, - itemBuilder: (BuildContext context, int index) { - final pageInfo = data['viewer']['repositories']['pageInfo']; - - if (bloc.shouldFetchMore(index, 1)) { - bloc.fetchMore(after: pageInfo['endCursor']); - } - - final node = data['viewer']['repositories']['nodes'][index]; - - Widget tile = ListTile( - title: Text(node['name']), - ); - - if (bloc.isFetchingMore && index == itemCount - 1) { - tile = Column( - children: [ - tile, - Padding( - padding: const EdgeInsets.all(16.0), - child: CircularProgressIndicator(), - ), - ], - ); - } - - return tile; - }, - ); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text('Extended BLOC example'), - ), - body: RefreshIndicator( - onRefresh: () async => _handleRefreshStart(bloc), - child: BlocBuilder>>( - cubit: bloc, - builder: (_, state) { - if (state is! QueryStateRefetch) { - _handleRefreshEnd(); - } - - return state.when( - initial: () => Container(), - loading: (_) => Center(child: CircularProgressIndicator()), - error: (_, __) => ListView(children: [ - Text( - bloc.getError, - style: TextStyle(color: Theme.of(context).errorColor), - ) - ]), - loaded: _displayResults, - refetch: _displayResults, - fetchMore: _displayResults, - ); - }), - ), - ); - } -} diff --git a/examples/flutter_bloc/lib/extended_bloc/repositories_bloc.dart b/examples/flutter_bloc/lib/extended_bloc/repositories_bloc.dart deleted file mode 100644 index e9030cbee..000000000 --- a/examples/flutter_bloc/lib/extended_bloc/repositories_bloc.dart +++ /dev/null @@ -1,85 +0,0 @@ -import 'package:gql/language.dart'; -import 'package:graphql/client.dart'; -import 'package:graphql_flutter_bloc/graphql_flutter_bloc.dart'; - -class RepositoriesBloc extends QueryBloc> { - static int defaultLimit = 5; - - RepositoriesBloc({GraphQLClient client, WatchQueryOptions options}) - : super( - client: client, - options: options ?? - WatchQueryOptions( - document: parseString(r''' - query ReadRepositories($nRepositories: Int!, $after: String) { - viewer { - id - __typename - repositories(first: $nRepositories, after: $after) { - pageInfo { - endCursor - hasNextPage - } - nodes { - __typename - id - name - viewerHasStarred - } - } - } - } - '''), - variables: { - 'nRepositories': defaultLimit, - 'after': null, - 'affiliations': [ - 'OWNER', - 'ORGANIZATION_MEMBER', - 'COLLABORATOR' - ], - 'ownerAffiliations': [ - 'OWNER', - 'ORGANIZATION_MEMBER', - 'COLLABORATOR' - ] - }, - ), - ); - - @override - Map parseData(Map data) { - return data; - } - - @override - bool shouldFetchMore(int i, int threshold) { - return state.maybeWhen( - loaded: (data, result) { - return data['viewer']['repositories']['nodes'].length % - RepositoriesBloc.defaultLimit == - 0 && - i == data['viewer']['repositories']['nodes'].length - threshold; - }, - orElse: () => false); - } - - void fetchMore({String after}) { - add(QueryEvent.fetchMore( - options: FetchMoreOptions( - variables: {'nRepositories': 5, 'after': after}, - updateQuery: (dynamic previousResultData, dynamic fetchMoreResultData) { - final List repos = [ - ...previousResultData['viewer']['repositories']['nodes'] - as List, - ...fetchMoreResultData['viewer']['repositories']['nodes'] - as List - ]; - - fetchMoreResultData['viewer']['repositories']['nodes'] = repos; - - return fetchMoreResultData; - }, - ))); - } -} diff --git a/examples/flutter_bloc/lib/graphql_operation/mutations/addStar.dart b/examples/flutter_bloc/lib/graphql_operation/mutations/addStar.dart deleted file mode 100644 index aabb79004..000000000 --- a/examples/flutter_bloc/lib/graphql_operation/mutations/addStar.dart +++ /dev/null @@ -1,9 +0,0 @@ -const String addStar = r''' - mutation AddStar($starrableId: ID!) { - action: addStar(input: {starrableId: $starrableId}) { - starrable { - viewerHasStarred - } - } - } -'''; diff --git a/examples/flutter_bloc/lib/graphql_operation/mutations/mutations.dart b/examples/flutter_bloc/lib/graphql_operation/mutations/mutations.dart deleted file mode 100644 index 19ec2b51e..000000000 --- a/examples/flutter_bloc/lib/graphql_operation/mutations/mutations.dart +++ /dev/null @@ -1,2 +0,0 @@ -export './addStar.dart'; -export './removeStar.dart'; diff --git a/examples/flutter_bloc/lib/graphql_operation/mutations/removeStar.dart b/examples/flutter_bloc/lib/graphql_operation/mutations/removeStar.dart deleted file mode 100644 index 69f33295b..000000000 --- a/examples/flutter_bloc/lib/graphql_operation/mutations/removeStar.dart +++ /dev/null @@ -1,9 +0,0 @@ -const String removeStar = r''' - mutation RemoveStar($starrableId: ID!) { - action: removeStar(input: {starrableId: $starrableId}) { - starrable { - viewerHasStarred - } - } - } -'''; diff --git a/examples/flutter_bloc/lib/graphql_operation/queries/readRepositories.dart b/examples/flutter_bloc/lib/graphql_operation/queries/readRepositories.dart deleted file mode 100644 index 8eceea119..000000000 --- a/examples/flutter_bloc/lib/graphql_operation/queries/readRepositories.dart +++ /dev/null @@ -1,23 +0,0 @@ -const String readRepositories = r''' - query ReadRepositories($nRepositories: Int!) { - viewer { - repositories(last: $nRepositories) { - nodes { - __typename - id - name - viewerHasStarred - } - } - } - } -'''; - -const String testSubscription = r''' - subscription test { - deviceChanged(id: 2) { - id - name - } - } -'''; diff --git a/examples/flutter_bloc/lib/hive_init.dart b/examples/flutter_bloc/lib/hive_init.dart deleted file mode 100644 index 0d99fcf48..000000000 --- a/examples/flutter_bloc/lib/hive_init.dart +++ /dev/null @@ -1,33 +0,0 @@ -import 'package:flutter/foundation.dart' show kIsWeb; - -import 'package:hive/hive.dart' show Hive; -import 'package:path_provider/path_provider.dart' - show getApplicationDocumentsDirectory; -import 'package:path/path.dart' show join; - -import 'package:graphql/client.dart' show HiveStore; - -/// Initializes Hive with the path from [getApplicationDocumentsDirectory]. -/// -/// You can provide a [subDir] where the boxes should be stored. -/// -/// Extracted from [`hive_flutter` source][github] -/// -/// [github]: https://github.com/hivedb/hive/blob/5bf355496650017409fef4e9905e8826c5dc5bf3/hive_flutter/lib/src/hive_extensions.dart -Future initHiveForFlutter({ - String subDir, - Iterable boxes = const [HiveStore.defaultBoxName], -}) async { - if (!kIsWeb) { - var appDir = await getApplicationDocumentsDirectory(); - var path = appDir.path; - if (subDir != null) { - path = join(path, subDir); - } - Hive.init(path); - } - - for (var box in boxes) { - await Hive.openBox(box); - } -} diff --git a/examples/flutter_bloc/lib/local.dart b/examples/flutter_bloc/lib/local.dart deleted file mode 100644 index 47843adac..000000000 --- a/examples/flutter_bloc/lib/local.dart +++ /dev/null @@ -1,2 +0,0 @@ -// to run the example, replace with your GitHub token -const String YOUR_PERSONAL_ACCESS_TOKEN = ''; diff --git a/examples/flutter_bloc/lib/main.dart b/examples/flutter_bloc/lib/main.dart deleted file mode 100644 index f28229f7a..000000000 --- a/examples/flutter_bloc/lib/main.dart +++ /dev/null @@ -1,93 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:graphql/client.dart'; - -import 'package:graphql_flutter_bloc_example/bloc.dart'; -import 'package:graphql_flutter_bloc_example/hive_init.dart'; -import 'package:graphql_flutter_bloc_example/repository.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/my_repos_bloc.dart'; -import 'package:graphql_flutter_bloc_example/extended_bloc/repositories_bloc.dart'; -import 'package:graphql_flutter_bloc_example/extended_bloc.dart'; - -// to run the example, replace with your GitHub token in ./local.dart -import './local.dart'; - -Future main() async { - WidgetsFlutterBinding.ensureInitialized(); - await initHiveForFlutter(); - - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - routes: { - 'bloc': (_) => BlocProvider( - create: (context) => MyGithubReposBloc( - githubRepository: GithubRepository( - client: _client(), - ), - ), - child: BlocPage(), - ), - 'extended-bloc': (_) => BlocProvider( - create: (context) => RepositoriesBloc( - client: _client(), - ), - child: ExtendedBloc(), - ) - }, - home: Home(), - ); - } - - GraphQLClient _client() { - final HttpLink _httpLink = HttpLink( - 'https://api.github.com/graphql', - ); - - final AuthLink _authLink = AuthLink( - getToken: () => 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - ); - - final Link _link = _authLink.concat(_httpLink); - - return GraphQLClient( - cache: GraphQLCache( - store: HiveStore(), - ), - link: _link, - ); - } -} - -class Home extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("Select example"), - ), - body: ListView( - children: [ - ListTile( - title: Text('BLOC example'), - onTap: () => Navigator.of(context).pushNamed('bloc'), - ), - Divider(), - ListTile( - title: Text('Extended BLOC example'), - onTap: () => Navigator.of(context).pushNamed('extended-bloc'), - ), - Divider(), - ], - ), - ); - } -} diff --git a/examples/flutter_bloc/lib/repository.dart b/examples/flutter_bloc/lib/repository.dart deleted file mode 100644 index 6ffb25d88..000000000 --- a/examples/flutter_bloc/lib/repository.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/widgets.dart'; -import 'package:gql/language.dart'; -import 'package:graphql/client.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/models.dart'; -import 'package:graphql_flutter_bloc_example/graphql_operation/mutations/mutations.dart' - as mutations; -import 'package:graphql_flutter_bloc_example/graphql_operation/queries/readRepositories.dart' - as queries; - -class GithubRepository { - final GraphQLClient client; - - GithubRepository({@required this.client}) : assert(client != null); - - Future getRepositories(int numOfRepositories) async { - final WatchQueryOptions _options = WatchQueryOptions( - document: parseString(queries.readRepositories), - variables: { - 'nRepositories': numOfRepositories, - }, - pollInterval: Duration(seconds: 4), - fetchResults: true, - ); - - return await client.query(_options); - } - - Future toggleRepoStar(Repo repo) async { - var document = - repo.viewerHasStarred ? mutations.removeStar : mutations.addStar; - - final MutationOptions _options = MutationOptions( - document: parseString(document), - variables: { - 'starrableId': repo.id, - }, - ); - - return await client.mutate(_options); - } -} diff --git a/examples/flutter_bloc/pubspec.yaml b/examples/flutter_bloc/pubspec.yaml deleted file mode 100644 index 71c40e85c..000000000 --- a/examples/flutter_bloc/pubspec.yaml +++ /dev/null @@ -1,35 +0,0 @@ -name: graphql_flutter_bloc_example -description: A new Flutter project. - -publish_to: none -version: 1.0.0+1 - -environment: - sdk: ">=2.10.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - graphql: - path: ../../packages/graphql - graphql_flutter_bloc: ^0.4.4-beta.1 - cupertino_icons: ^0.1.2 - flutter_bloc: ^6.0.5 - freezed_annotation: 0.12.0 - path_provider: ^1.6.18 - hive: ^2.0.0 - equatable: ^0.2.0 - -dev_dependencies: - flutter_test: - sdk: flutter - test: ^1.3.0 - mockito: ^3.0.0 - -flutter: - uses-material-design: true - -dependency_overrides: - graphql: - path: ../../packages/graphql - diff --git a/examples/flutter_bloc/test/bloc_test.dart b/examples/flutter_bloc/test/bloc_test.dart deleted file mode 100644 index 307fc6d31..000000000 --- a/examples/flutter_bloc/test/bloc_test.dart +++ /dev/null @@ -1,107 +0,0 @@ -import 'dart:convert'; - -import 'package:graphql/client.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/events.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/models.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/my_repos_bloc.dart'; -import 'package:graphql_flutter_bloc_example/blocs/repos/states.dart'; -import 'package:graphql_flutter_bloc_example/repository.dart'; -import 'package:mockito/mockito.dart'; -import 'package:flutter_test/flutter_test.dart'; - -class MockGithubRepository extends Mock implements GithubRepository {} - -const data = """ -{ - "data": { - "viewer": { - "repositories": { - "nodes": [ - { - "__typename": "Repository", - "id": "MDEwOlJlcG9zaXRvcnkyNDgzOTQ3NA==", - "name": "pq", - "viewerHasStarred": false - }, - { - "__typename": "Repository", - "id": "MDEwOlJlcG9zaXRvcnkzMjkyNDQ0Mw==", - "name": "go-evercookie", - "viewerHasStarred": false - }, - { - "__typename": "Repository", - "id": "MDEwOlJlcG9zaXRvcnkzNTA0NjgyNA==", - "name": "watchbot", - "viewerHasStarred": false - } - ] - } - } - } -} -"""; - -Map decodeGithubResponse = jsonDecode(data); -final List mockedGithubRepos = decodeGithubResponse['data']['viewer'] - ['repositories']['nodes'] as List; - -final List mockedMappedRepos = mockedGithubRepos - .map((dynamic e) => Repo( - id: e['id'] as String, - name: e['name'] as String, - viewerHasStarred: e['viewerHasStarred'] as bool, - )) - .toList(); - -void main() { - group('GithubReposBloc', () { - MyGithubReposBloc repoBloc; - MockGithubRepository githubRepository; - - final numOfRepos = 50; - - setUp(() { - githubRepository = MockGithubRepository(); - repoBloc = MyGithubReposBloc( - githubRepository: githubRepository, - ); - }); - - tearDown(() { - repoBloc.close(); - }); - - test('initial state is loading', () { - expect(repoBloc.state, ReposLoading()); - }); - - group('Fetch Repositories', () { - test('fetch repositories', () { - final results = QueryResult( - data: decodeGithubResponse['data'], - exception: null, - source: QueryResultSource.network, - ); - - when( - githubRepository.getRepositories(numOfRepos), - ).thenAnswer( - (_) => Future.value(results), - ); - - final expected = [ - ReposLoading(), - ReposLoaded(results: mockedMappedRepos), - ]; - - expectLater( - repoBloc.state, - emitsInOrder(expected), - ); - - repoBloc.add(LoadMyRepos(numOfReposToLoad: numOfRepos)); - }); - }); - }); -} diff --git a/examples/flutter_bloc/test/widget_test.dart b/examples/flutter_bloc/test/widget_test.dart deleted file mode 100644 index f3a5de96a..000000000 --- a/examples/flutter_bloc/test/widget_test.dart +++ /dev/null @@ -1,27 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter_test/flutter_test.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // // Build our app and trigger a frame. - // await tester.pumpWidget(MyApp()); - - // // Verify that our counter starts at 0. - // expect(find.text('0'), findsOneWidget); - // expect(find.text('1'), findsNothing); - - // // Tap the '+' icon and trigger a frame. - // await tester.tap(find.byIcon(Icons.add)); - // await tester.pump(); - - // // Verify that our counter has incremented. - // expect(find.text('0'), findsNothing); - // expect(find.text('1'), findsOneWidget); - }); -} From 74728955cc2bfa54422116dfe71dd909c75df2e0 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 8 Feb 2022 09:41:59 +0100 Subject: [PATCH 69/94] graphql_flutter: migrate the example Signed-off-by: Vincenzo Palazzo --- packages/graphql_flutter/example/README.md | 7 +- .../example/android/.gitignore | 19 +- .../example/android/app/build.gradle | 46 ++-- .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 50 ++--- .../java/com/example/app/MainActivity.java | 7 - .../example/demo_migaration/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 ++ .../app/src/main/res/values-night/styles.xml | 18 ++ .../app/src/main/res/values/styles.xml | 12 +- .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle | 8 +- .../example/android/gradle.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../example/android/settings.gradle | 18 +- .../graphql_flutter/example/ios/.gitignore | 67 +++--- .../ios/Flutter/AppFrameworkInfo.plist | 2 +- .../example/ios/Flutter/Debug.xcconfig | 1 - .../example/ios/Flutter/Release.xcconfig | 1 - packages/graphql_flutter/example/ios/Podfile | 38 ---- .../ios/Runner.xcodeproj/project.pbxproj | 196 ++++++++++-------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 4 +- .../contents.xcworkspacedata | 3 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.h | 6 - .../example/ios/Runner/AppDelegate.m | 12 -- .../example/ios/Runner/AppDelegate.swift | 13 ++ .../Icon-App-1024x1024@1x.png | Bin 11112 -> 10932 bytes .../example/ios/Runner/Info.plist | 12 +- .../ios/Runner/Runner-Bridging-Header.h | 1 + .../graphql_flutter/example/ios/Runner/main.m | 9 - .../example/lib/fetchmore/main.dart | 13 +- .../lib/generated_plugin_registrant.dart | 16 ++ .../example/lib/graphql_bloc/bloc.dart | 17 +- .../example/lib/graphql_bloc/main.dart | 3 +- .../queries/readRepositories.dart | 1 + .../example/lib/graphql_widget/main.dart | 45 +--- .../graphql_flutter/example/lib/local.dart | 3 +- .../graphql_flutter/example/lib/main.dart | 114 +++++----- packages/graphql_flutter/example/pubspec.yaml | 7 +- .../graphql_flutter/example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../graphql_flutter/example/web/index.html | 104 ++++++++++ .../graphql_flutter/example/web/manifest.json | 35 ++++ 49 files changed, 557 insertions(+), 411 deletions(-) create mode 100644 packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml delete mode 100644 packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java create mode 100644 packages/graphql_flutter/example/android/app/src/main/kotlin/com/example/demo_migaration/MainActivity.kt create mode 100644 packages/graphql_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 packages/graphql_flutter/example/android/app/src/main/res/values-night/styles.xml create mode 100644 packages/graphql_flutter/example/android/app/src/profile/AndroidManifest.xml delete mode 100644 packages/graphql_flutter/example/ios/Podfile create mode 100644 packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 packages/graphql_flutter/example/ios/Runner/AppDelegate.h delete mode 100644 packages/graphql_flutter/example/ios/Runner/AppDelegate.m create mode 100644 packages/graphql_flutter/example/ios/Runner/AppDelegate.swift create mode 100644 packages/graphql_flutter/example/ios/Runner/Runner-Bridging-Header.h delete mode 100644 packages/graphql_flutter/example/ios/Runner/main.m create mode 100644 packages/graphql_flutter/example/lib/generated_plugin_registrant.dart create mode 100644 packages/graphql_flutter/example/web/favicon.png create mode 100644 packages/graphql_flutter/example/web/icons/Icon-192.png create mode 100644 packages/graphql_flutter/example/web/icons/Icon-512.png create mode 100644 packages/graphql_flutter/example/web/icons/Icon-maskable-192.png create mode 100644 packages/graphql_flutter/example/web/icons/Icon-maskable-512.png create mode 100644 packages/graphql_flutter/example/web/index.html create mode 100644 packages/graphql_flutter/example/web/manifest.json diff --git a/packages/graphql_flutter/example/README.md b/packages/graphql_flutter/example/README.md index fb200736d..3608e1745 100644 --- a/packages/graphql_flutter/example/README.md +++ b/packages/graphql_flutter/example/README.md @@ -1,8 +1,7 @@ -# Example App +# graphql_flutter example -A new Flutter project. +A Github API wrapper example where you need to specify you token in the `local.dart` file ## Getting Started -For help getting started with Flutter, view our online -[documentation](https://flutter.io/). +Just run `flutter pub get` and run your flutter app diff --git a/packages/graphql_flutter/example/android/.gitignore b/packages/graphql_flutter/example/android/.gitignore index 65b7315af..6f568019d 100644 --- a/packages/graphql_flutter/example/android/.gitignore +++ b/packages/graphql_flutter/example/android/.gitignore @@ -1,10 +1,13 @@ -*.iml -*.class -.gradle +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat /local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/packages/graphql_flutter/example/android/app/build.gradle b/packages/graphql_flutter/example/android/app/build.gradle index 0d8279847..69f8d594f 100644 --- a/packages/graphql_flutter/example/android/app/build.gradle +++ b/packages/graphql_flutter/example/android/app/build.gradle @@ -11,24 +11,43 @@ if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 28 + compileSdkVersion flutter.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } - lintOptions { - disable 'InvalidPackage' + sourceSets { + main.java.srcDirs += 'src/main/kotlin' } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.app" - minSdkVersion 16 - targetSdkVersion 27 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + applicationId "com.example.demo_migaration" + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName } buildTypes { @@ -38,11 +57,6 @@ android { signingConfig signingConfigs.debug } } - - // Temporary fix until alpha10 - packagingOptions { - exclude 'META-INF/proguard/androidx-annotations.pro' - } } flutter { @@ -50,7 +64,5 @@ flutter { } dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.1' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } diff --git a/packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml b/packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..b15a3d5fb --- /dev/null +++ b/packages/graphql_flutter/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml b/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml index afe2d6fd3..f153f1bf5 100644 --- a/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml +++ b/packages/graphql_flutter/example/android/app/src/main/AndroidManifest.xml @@ -1,50 +1,34 @@ - - - - - - + - - - + - - - + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" + /> + + android:name="flutterEmbedding" + android:value="2" /> diff --git a/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java b/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java deleted file mode 100644 index 479ed0631..000000000 --- a/packages/graphql_flutter/example/android/app/src/main/java/com/example/app/MainActivity.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.app; - -import android.os.Bundle; - -import io.flutter.embedding.android.FlutterActivity; - -public class MainActivity extends FlutterActivity {} diff --git a/packages/graphql_flutter/example/android/app/src/main/kotlin/com/example/demo_migaration/MainActivity.kt b/packages/graphql_flutter/example/android/app/src/main/kotlin/com/example/demo_migaration/MainActivity.kt new file mode 100644 index 000000000..762f551b5 --- /dev/null +++ b/packages/graphql_flutter/example/android/app/src/main/kotlin/com/example/demo_migaration/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.demo_migaration + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/packages/graphql_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml b/packages/graphql_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/packages/graphql_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/packages/graphql_flutter/example/android/app/src/main/res/values-night/styles.xml b/packages/graphql_flutter/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 000000000..3db14bb53 --- /dev/null +++ b/packages/graphql_flutter/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/packages/graphql_flutter/example/android/app/src/main/res/values/styles.xml b/packages/graphql_flutter/example/android/app/src/main/res/values/styles.xml index 00fa4417c..d460d1e92 100644 --- a/packages/graphql_flutter/example/android/app/src/main/res/values/styles.xml +++ b/packages/graphql_flutter/example/android/app/src/main/res/values/styles.xml @@ -1,8 +1,18 @@ - + + diff --git a/packages/graphql_flutter/example/android/app/src/profile/AndroidManifest.xml b/packages/graphql_flutter/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..b15a3d5fb --- /dev/null +++ b/packages/graphql_flutter/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/graphql_flutter/example/android/build.gradle b/packages/graphql_flutter/example/android/build.gradle index 23d41d039..24047dce5 100644 --- a/packages/graphql_flutter/example/android/build.gradle +++ b/packages/graphql_flutter/example/android/build.gradle @@ -1,18 +1,20 @@ buildscript { + ext.kotlin_version = '1.3.50' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() - jcenter() + mavenCentral() } } diff --git a/packages/graphql_flutter/example/android/gradle.properties b/packages/graphql_flutter/example/android/gradle.properties index 5c4a2a4c2..94adc3a3f 100644 --- a/packages/graphql_flutter/example/android/gradle.properties +++ b/packages/graphql_flutter/example/android/gradle.properties @@ -1,3 +1,3 @@ org.gradle.jvmargs=-Xmx1536M -android.enableR8=true +android.useAndroidX=true android.enableJetifier=true diff --git a/packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties index 1401a2e7d..bc6a58afd 100644 --- a/packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/graphql_flutter/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-rc-1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/packages/graphql_flutter/example/android/settings.gradle b/packages/graphql_flutter/example/android/settings.gradle index 5a2f14fb1..44e62bcf0 100644 --- a/packages/graphql_flutter/example/android/settings.gradle +++ b/packages/graphql_flutter/example/android/settings.gradle @@ -1,15 +1,11 @@ include ':app' -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/packages/graphql_flutter/example/ios/.gitignore b/packages/graphql_flutter/example/ios/.gitignore index 79cc4da80..7a7f9873a 100644 --- a/packages/graphql_flutter/example/ios/.gitignore +++ b/packages/graphql_flutter/example/ios/.gitignore @@ -1,45 +1,34 @@ -.idea/ -.vagrant/ -.sconsign.dblite -.svn/ - -.DS_Store -*.swp -profile - -DerivedData/ -build/ -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m - -.generated/ - -*.pbxuser +**/dgph *.mode1v3 *.mode2v3 +*.moved-aside +*.pbxuser *.perspectivev3 - -!default.pbxuser +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. !default.mode1v3 !default.mode2v3 +!default.pbxuser !default.perspectivev3 - -xcuserdata - -*.moved-aside - -*.pyc -*sync/ -Icon? -.tags* - -/Flutter/app.flx -/Flutter/app.zip -/Flutter/flutter_assets/ -/Flutter/App.framework -/Flutter/Flutter.framework -/Flutter/Generated.xcconfig -/ServiceDefinitions.json - -Pods/ -.symlinks/ diff --git a/packages/graphql_flutter/example/ios/Flutter/AppFrameworkInfo.plist b/packages/graphql_flutter/example/ios/Flutter/AppFrameworkInfo.plist index 9367d483e..8d4492f97 100644 --- a/packages/graphql_flutter/example/ios/Flutter/AppFrameworkInfo.plist +++ b/packages/graphql_flutter/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 8.0 + 9.0 diff --git a/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig b/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig index e8efba114..592ceee85 100644 --- a/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig +++ b/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig @@ -1,2 +1 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig b/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig index 399e9340e..592ceee85 100644 --- a/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig +++ b/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig @@ -1,2 +1 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Podfile b/packages/graphql_flutter/example/ios/Podfile deleted file mode 100644 index f7d6a5e68..000000000 --- a/packages/graphql_flutter/example/ios/Podfile +++ /dev/null @@ -1,38 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj index bf430a69e..9e093b833 100644 --- a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,16 +3,13 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 85BD965404134B0319457AD8 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A9CD12FDAA2BE6D4AEA7ACE /* libPods-Runner.a */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -35,20 +32,16 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4A9CD12FDAA2BE6D4AEA7ACE /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 9235FC581E2F702C430A0573 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C9CB04F761683177D49AF7FB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -56,21 +49,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 85BD965404134B0319457AD8 /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 50488B4156A6CC29CC303635 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 4A9CD12FDAA2BE6D4AEA7ACE /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -88,8 +72,6 @@ 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, - C4CD52B830EB22224036641E /* Pods */, - 50488B4156A6CC29CC303635 /* Frameworks */, ); sourceTree = ""; }; @@ -104,36 +86,18 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); path = Runner; sourceTree = ""; }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - C4CD52B830EB22224036641E /* Pods */ = { - isa = PBXGroup; - children = ( - 9235FC581E2F702C430A0573 /* Pods-Runner.debug.xcconfig */, - C9CB04F761683177D49AF7FB /* Pods-Runner.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -141,7 +105,6 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - EE5E807A2025436A87389B42 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, @@ -164,20 +127,20 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = "The Chromium Authors"; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, Base, ); @@ -197,7 +160,6 @@ buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, @@ -235,24 +197,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - EE5E807A2025436A87389B42 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -260,8 +204,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -288,11 +231,81 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.demoMigaration; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -336,7 +349,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -348,7 +361,6 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -386,9 +398,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -399,20 +414,19 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( + LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Flutter", + "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.app; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demoMigaration; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -422,20 +436,18 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( + LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Flutter", + "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.app; + PRODUCT_BUNDLE_IDENTIFIER = com.example.demoMigaration; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; @@ -448,6 +460,7 @@ buildConfigurations = ( 97C147031CF9000F007C117D /* Debug */, 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -457,6 +470,7 @@ buildConfigurations = ( 97C147061CF9000F007C117D /* Debug */, 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/graphql_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/graphql_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/graphql_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index eff2bca03..c87d15a33 100644 --- a/packages/graphql_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/graphql_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - diff --git a/packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/packages/graphql_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/packages/graphql_flutter/example/ios/Runner/AppDelegate.h b/packages/graphql_flutter/example/ios/Runner/AppDelegate.h deleted file mode 100644 index cf210d213..000000000 --- a/packages/graphql_flutter/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,6 +0,0 @@ -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/packages/graphql_flutter/example/ios/Runner/AppDelegate.m b/packages/graphql_flutter/example/ios/Runner/AppDelegate.m deleted file mode 100644 index 112becd13..000000000 --- a/packages/graphql_flutter/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,12 +0,0 @@ -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - // Override point for customization after application launch. - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/packages/graphql_flutter/example/ios/Runner/AppDelegate.swift b/packages/graphql_flutter/example/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/packages/graphql_flutter/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/packages/graphql_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 3d43d11e66f4de3da27ed045ca4fe38ad8b48094..dc9ada4725e9b0ddb1deab583e5b5102493aa332 100644 GIT binary patch literal 10932 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 P-1+_A+?hGkL;m(J7kc&K diff --git a/packages/graphql_flutter/example/ios/Runner/Info.plist b/packages/graphql_flutter/example/ios/Runner/Info.plist index 15c9907f8..a2a66afa5 100644 --- a/packages/graphql_flutter/example/ios/Runner/Info.plist +++ b/packages/graphql_flutter/example/ios/Runner/Info.plist @@ -3,7 +3,9 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Demo Migaration CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -11,15 +13,15 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - app + demo_migaration CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + $(FLUTTER_BUILD_NAME) CFBundleSignature ???? CFBundleVersion - 1 + $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS UILaunchStoryboardName @@ -40,6 +42,6 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance - + diff --git a/packages/graphql_flutter/example/ios/Runner/Runner-Bridging-Header.h b/packages/graphql_flutter/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/packages/graphql_flutter/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/packages/graphql_flutter/example/ios/Runner/main.m b/packages/graphql_flutter/example/ios/Runner/main.m deleted file mode 100644 index 0ccc45001..000000000 --- a/packages/graphql_flutter/example/ios/Runner/main.m +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/packages/graphql_flutter/example/lib/fetchmore/main.dart b/packages/graphql_flutter/example/lib/fetchmore/main.dart index dfa5f98a7..c6ed061d0 100644 --- a/packages/graphql_flutter/example/lib/fetchmore/main.dart +++ b/packages/graphql_flutter/example/lib/fetchmore/main.dart @@ -11,19 +11,14 @@ class FetchMoreWidgetScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final httpLink = HttpLink('https://api.github.com/graphql'); - - final authLink = AuthLink( - // ignore: undefined_identifier - getToken: () => 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - ); - - final link = authLink.concat(httpLink); + final httpLink = HttpLink('https://api.github.com/graphql', defaultHeaders: { + 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', + }); final client = ValueNotifier( GraphQLClient( cache: GraphQLCache(), - link: link, + link: httpLink, ), ); diff --git a/packages/graphql_flutter/example/lib/generated_plugin_registrant.dart b/packages/graphql_flutter/example/lib/generated_plugin_registrant.dart new file mode 100644 index 000000000..3c36ef502 --- /dev/null +++ b/packages/graphql_flutter/example/lib/generated_plugin_registrant.dart @@ -0,0 +1,16 @@ +// +// Generated file. Do not edit. +// + +// ignore_for_file: directives_ordering +// ignore_for_file: lines_longer_than_80_chars + +import 'package:connectivity_plus_web/connectivity_plus_web.dart'; + +import 'package:flutter_web_plugins/flutter_web_plugins.dart'; + +// ignore: public_member_api_docs +void registerPlugins(Registrar registrar) { + ConnectivityPlusPlugin.registerWith(registrar); + registrar.registerMessageHandler(); +} diff --git a/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart b/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart index 07331ea5e..395e3bcf6 100644 --- a/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart +++ b/packages/graphql_flutter/example/lib/graphql_bloc/bloc.dart @@ -52,20 +52,11 @@ class Bloc { Sink get updateNumberOfRepoSink => _updateNumberOfRepo; - static final HttpLink _httpLink = HttpLink( - 'https://api.github.com/graphql', - ); - - static final AuthLink _authLink = AuthLink( - // ignore: undefined_identifier - getToken: () async => 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - ); - - static final Link _link = _authLink.concat(_httpLink); - - static final GraphQLClient _client = GraphQLClient( + final GraphQLClient _client = GraphQLClient( cache: GraphQLCache(), - link: _link, + link: HttpLink('https://api.github.com/graphql', defaultHeaders: { + 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', + }), ); Future _mutateToggleStar(Repo repo) async { diff --git a/packages/graphql_flutter/example/lib/graphql_bloc/main.dart b/packages/graphql_flutter/example/lib/graphql_bloc/main.dart index 4613d44d9..c6e3eaada 100644 --- a/packages/graphql_flutter/example/lib/graphql_bloc/main.dart +++ b/packages/graphql_flutter/example/lib/graphql_bloc/main.dart @@ -45,8 +45,7 @@ class _MyHomePageState extends State { builder: (BuildContext context, AsyncSnapshot?> snapshot) { if (snapshot.hasError) { - return Text('\nErrors: \n ' + - (snapshot.error as List).join(',\n ')); + return Text('\nErrors: ${snapshot.error.toString()}'); } if (snapshot.data == null) { return const Center( diff --git a/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart b/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart index 62eb332a0..225384e58 100644 --- a/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart +++ b/packages/graphql_flutter/example/lib/graphql_operation/queries/readRepositories.dart @@ -42,6 +42,7 @@ const String searchRepositories = r''' const String testSubscription = r''' subscription test { deviceChanged(id: 2) { + __typename id name } diff --git a/packages/graphql_flutter/example/lib/graphql_widget/main.dart b/packages/graphql_flutter/example/lib/graphql_widget/main.dart index d02ca0494..16305dcfa 100644 --- a/packages/graphql_flutter/example/lib/graphql_widget/main.dart +++ b/packages/graphql_flutter/example/lib/graphql_widget/main.dart @@ -8,38 +8,19 @@ import '../helpers.dart' show withGenericHandling; // to run the example, replace with your GitHub token in ../local.dart import '../local.dart'; -const bool ENABLE_WEBSOCKETS = false; - class GraphQLWidgetScreen extends StatelessWidget { const GraphQLWidgetScreen() : super(); @override Widget build(BuildContext context) { - final httpLink = HttpLink( - 'https://api.github.com/graphql', - ); - - final authLink = AuthLink( - // ignore: undefined_identifier - getToken: () async => 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', - ); - - var link = authLink.concat(httpLink); - - if (ENABLE_WEBSOCKETS) { - final websocketLink = WebSocketLink('ws://localhost:8080/ws/graphql'); - - link = Link.split( - (request) => request.isSubscription, - websocketLink, - link, - ); - } + var httpLink = HttpLink('https://api.github.com/graphql', defaultHeaders: { + 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', + }); final client = ValueNotifier( GraphQLClient( cache: GraphQLCache(), - link: link, + link: httpLink, ), ); @@ -128,16 +109,6 @@ class _MyHomePageState extends State { }, ), ), - ENABLE_WEBSOCKETS - ? Subscription( - options: SubscriptionOptions( - document: gql(queries.testSubscription), - ), - builder: (result) => result.isLoading - ? const Text('Loading...') - : Text(result.data.toString()), - ) - : const Text(''), ], ), ), @@ -152,16 +123,16 @@ class StarrableRepository extends StatelessWidget { required this.optimistic, }) : super(key: key); - final Map repository; + final Map repository; final bool optimistic; /// Extract the repository data for updating the fragment - Map? extractRepositoryData(Map data) { - final action = data['action'] as Map?; + Map? extractRepositoryData(Map data) { + final action = data['action'] as Map?; if (action == null) { return null; } - return action['starrable'] as Map?; + return action['starrable'] as Map?; } /// Get whether the repository is currently starred, according to the current Query diff --git a/packages/graphql_flutter/example/lib/local.dart b/packages/graphql_flutter/example/lib/local.dart index 6d40e426a..cfcf0df2b 100644 --- a/packages/graphql_flutter/example/lib/local.dart +++ b/packages/graphql_flutter/example/lib/local.dart @@ -1 +1,2 @@ -const String YOUR_PERSONAL_ACCESS_TOKEN = ''; +const String YOUR_PERSONAL_ACCESS_TOKEN = + ''; diff --git a/packages/graphql_flutter/example/lib/main.dart b/packages/graphql_flutter/example/lib/main.dart index 63c7719f4..9a27ead63 100644 --- a/packages/graphql_flutter/example/lib/main.dart +++ b/packages/graphql_flutter/example/lib/main.dart @@ -1,62 +1,72 @@ import 'package:flutter/material.dart'; +import 'package:trash_themes/themes.dart'; import './graphql_bloc/main.dart' show GraphQLBlocPatternScreen; import './graphql_widget/main.dart' show GraphQLWidgetScreen; import 'fetchmore/main.dart'; -void main() => runApp( - MaterialApp( - title: 'GraphQL Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - ), - home: Builder( - builder: (BuildContext context) => Scaffold( - appBar: AppBar( - title: const Text('GraphQL Demo App'), - ), - body: Center( - child: Column( - children: [ - ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - GraphQLBlocPatternScreen(), - ), - ); - }, - child: const Text('GraphQL BloC pattern'), - ), - ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - const GraphQLWidgetScreen(), - ), - ); - }, - child: const Text('GraphQL Widget'), - ), - ElevatedButton( - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (BuildContext context) => - const FetchMoreWidgetScreen(), - ), - ); - }, - child: const Text('Fetchmore (Pagination) Example'), - ), - ], - ), +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'GraphQL Flutter Demo', + theme: DraculaTheme().makeDarkTheme(context: context), + home: Builder( + builder: (BuildContext context) => Scaffold( + appBar: AppBar( + title: const Text('GraphQL Demo App'), + ), + body: Center( + child: Column( + children: [ + Spacer(), + Flexible( + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + GraphQLBlocPatternScreen(), + ), + ); + }, + child: const Text('GraphQL BloC pattern'), + )), + Spacer(), + Flexible( + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + const GraphQLWidgetScreen(), + ), + ); + }, + child: const Text('GraphQL Widget'), + )), + Spacer(), + Flexible( + child: ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => + const FetchMoreWidgetScreen(), + ), + ); + }, + child: const Text('Fetchmore (Pagination) Example'), + )), + ], ), ), ), ), ); + } +} diff --git a/packages/graphql_flutter/example/pubspec.yaml b/packages/graphql_flutter/example/pubspec.yaml index 77c039666..e26db97df 100644 --- a/packages/graphql_flutter/example/pubspec.yaml +++ b/packages/graphql_flutter/example/pubspec.yaml @@ -4,20 +4,21 @@ description: A new Flutter project. publish_to: none module: - androidX: true // Add this line. + androidX: true dependencies: flutter: sdk: flutter - cupertino_icons: ^0.1.2 + cupertino_icons: ^0.1.3 graphql_flutter: path: .. + trash_themes: ^0.0.1 dev_dependencies: pedantic: ^1.8.0+1 flutter_test: sdk: flutter - test: ^1.5.1 + test: ^1.17.12 flutter: uses-material-design: true diff --git a/packages/graphql_flutter/example/web/favicon.png b/packages/graphql_flutter/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/packages/graphql_flutter/example/web/icons/Icon-192.png b/packages/graphql_flutter/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/packages/graphql_flutter/example/web/icons/Icon-512.png b/packages/graphql_flutter/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/packages/graphql_flutter/example/web/icons/Icon-maskable-192.png b/packages/graphql_flutter/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/packages/graphql_flutter/example/web/icons/Icon-maskable-512.png b/packages/graphql_flutter/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/packages/graphql_flutter/example/web/index.html b/packages/graphql_flutter/example/web/index.html new file mode 100644 index 000000000..60109c1bc --- /dev/null +++ b/packages/graphql_flutter/example/web/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + demo_migaration + + + + + + + diff --git a/packages/graphql_flutter/example/web/manifest.json b/packages/graphql_flutter/example/web/manifest.json new file mode 100644 index 000000000..fa0b5a9f2 --- /dev/null +++ b/packages/graphql_flutter/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "demo_migaration", + "short_name": "demo_migaration", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} From d132e7730cc96f0ce20110e3e9c543df3c54fb52 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Tue, 8 Feb 2022 10:15:42 +0100 Subject: [PATCH 70/94] graphql_flutter: formatting example Signed-off-by: Vincenzo Palazzo --- packages/graphql_flutter/example/lib/fetchmore/main.dart | 3 ++- packages/graphql_flutter/example/lib/graphql_widget/main.dart | 2 +- packages/graphql_flutter/example/lib/local.dart | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/graphql_flutter/example/lib/fetchmore/main.dart b/packages/graphql_flutter/example/lib/fetchmore/main.dart index c6ed061d0..ea9863fb9 100644 --- a/packages/graphql_flutter/example/lib/fetchmore/main.dart +++ b/packages/graphql_flutter/example/lib/fetchmore/main.dart @@ -11,7 +11,8 @@ class FetchMoreWidgetScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final httpLink = HttpLink('https://api.github.com/graphql', defaultHeaders: { + final httpLink = + HttpLink('https://api.github.com/graphql', defaultHeaders: { 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', }); diff --git a/packages/graphql_flutter/example/lib/graphql_widget/main.dart b/packages/graphql_flutter/example/lib/graphql_widget/main.dart index 16305dcfa..70a42e154 100644 --- a/packages/graphql_flutter/example/lib/graphql_widget/main.dart +++ b/packages/graphql_flutter/example/lib/graphql_widget/main.dart @@ -13,7 +13,7 @@ class GraphQLWidgetScreen extends StatelessWidget { @override Widget build(BuildContext context) { - var httpLink = HttpLink('https://api.github.com/graphql', defaultHeaders: { + var httpLink = HttpLink('https://api.github.com/graphql', defaultHeaders: { 'Authorization': 'Bearer $YOUR_PERSONAL_ACCESS_TOKEN', }); diff --git a/packages/graphql_flutter/example/lib/local.dart b/packages/graphql_flutter/example/lib/local.dart index cfcf0df2b..8e5891184 100644 --- a/packages/graphql_flutter/example/lib/local.dart +++ b/packages/graphql_flutter/example/lib/local.dart @@ -1,2 +1 @@ -const String YOUR_PERSONAL_ACCESS_TOKEN = - ''; +const String YOUR_PERSONAL_ACCESS_TOKEN = ''; From e00c8e277bb033670e29ba2b54e448e356662586 Mon Sep 17 00:00:00 2001 From: Brett Morgan Date: Thu, 10 Feb 2022 17:26:12 +1000 Subject: [PATCH 71/94] graphql_flutter: In doc use `flutter pub add` --- packages/graphql_flutter/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/graphql_flutter/README.md b/packages/graphql_flutter/README.md index 743500389..04439ac96 100644 --- a/packages/graphql_flutter/README.md +++ b/packages/graphql_flutter/README.md @@ -49,9 +49,8 @@ This guide is mostly focused on setup, widgets, and flutter-specific considerati First, depend on this package: -```yaml -dependencies: - graphql_flutter: ^ +```console +$ flutter pub add graphql_flutter ``` And then import it inside your dart code: From 0a6b3f7821c7cc924b7ed6f74849b5bf330357cd Mon Sep 17 00:00:00 2001 From: Brett Morgan Date: Thu, 10 Feb 2022 17:22:36 +1000 Subject: [PATCH 72/94] graphql: In the doc use `flutter pub add` --- packages/graphql/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index a930b8b64..6faae5ebd 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -53,9 +53,8 @@ As of `v4`, it is built on foundational libraries from the [gql-dart project], i First, depend on this package: -```yaml -dependencies: - graphql: ^4.0.0-beta +```console +$ flutter pub add graphql ``` And then import it inside your dart code: From a4274005b0b4deabfaa2fdc071b7b4c2cb70f767 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sun, 13 Feb 2022 11:55:56 +0100 Subject: [PATCH 73/94] ci: fixed the release process in the beta branch Signed-off-by: Vincenzo Palazzo --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cffce6922..ccdca4bdf 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -109,7 +109,7 @@ jobs: - run: name: Bump version numbers command: | - if [[ $CIRCLE_TAG =~ ^.*beta.*$ ]]; then BRANCH=beta; else BRANCH=master; fi + if [[ $CIRCLE_TAG =~ ^.*beta.*$ ]]; then BRANCH=beta; else BRANCH=beta; fi git checkout $BRANCH git add packages/graphql/pubspec.yaml packages/graphql_flutter/pubspec.yaml From 405e8bd51e68c16a4d7299a9460142248e835f15 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Sun, 13 Feb 2022 11:07:40 +0000 Subject: [PATCH 74/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 4fbd7c281..9fba59f90 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.6 +version: 5.0.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index c75c66882..0293f370c 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1-beta.6 +version: 5.0.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: ^5.0.1-beta.5 From fb09fe8fa451e69ba74bf846da5cebbe89033c36 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Mon, 14 Feb 2022 09:40:21 +0100 Subject: [PATCH 75/94] fix: Read from cache first on cacheAndNetwork When fetch policy is cacheAndNetwork, we now return cache and then fetch from network, if the cached result is available). If not we fetch from network. --- .../graphql/lib/src/core/query_manager.dart | 17 +++++-- packages/graphql/test/fetch_policy_test.dart | 46 ++++++++++++++++++- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/packages/graphql/lib/src/core/query_manager.dart b/packages/graphql/lib/src/core/query_manager.dart index 3feac8cae..0cb8d0894 100644 --- a/packages/graphql/lib/src/core/query_manager.dart +++ b/packages/graphql/lib/src/core/query_manager.dart @@ -146,10 +146,21 @@ class QueryManager { Future> query( QueryOptions options) async { - final result = await fetchQuery(_oneOffOpId, options); + final results = fetchQueryAsMultiSourceResult(_oneOffOpId, options); + final eagerResult = results.eagerResult; + final networkResult = results.networkResult; + if (options.fetchPolicy != FetchPolicy.cacheAndNetwork || + eagerResult.isLoading) { + final result = networkResult ?? eagerResult; + await result; + maybeRebroadcastQueries(); + return result; + } maybeRebroadcastQueries(); - - return result; + if (networkResult is Future>) { + networkResult.then((value) => maybeRebroadcastQueries()); + } + return eagerResult; } Future> mutate( diff --git a/packages/graphql/test/fetch_policy_test.dart b/packages/graphql/test/fetch_policy_test.dart index e4623976f..468f2c960 100644 --- a/packages/graphql/test/fetch_policy_test.dart +++ b/packages/graphql/test/fetch_policy_test.dart @@ -65,10 +65,10 @@ void main() { group('query', () { // TODO cacheFirst code path: Return result from cache. Only fetch from network if cached result is not available. - // TODO cacheAndNetwork code path: Return result from cache first (if it exists), then return network result once it's available. // TODO cacheOnly code path: Return result from cache if available, fail otherwise. // TODO noCache code path: Return result from network, fail if network call doesn't succeed, don't save to cache. // TODO networkOnly code path: Return result from network, fail if network call doesn't succeed, save to cache. + test('switch to cacheOnly returns cached data', () async { final _options = QueryOptions( fetchPolicy: FetchPolicy.cacheAndNetwork, @@ -117,6 +117,50 @@ void main() { expect(cacheResult.exception, isNull); expect(cacheResult.data, equals(repoData)); }); + test('cacheAndNetwork returns from cache (if exists)', () async { + final _options = QueryOptions( + fetchPolicy: FetchPolicy.cacheAndNetwork, + document: parseString(readRepositories), + variables: { + 'nRepositories': 42, + }, + ); + final repoData = readRepositoryData(withTypenames: true); + + when( + link.request(any), + ).thenAnswer( + (_) => Stream.fromIterable([ + Response(data: repoData), + ]), + ); + + final QueryResult r = await client.query(_options); + + verify( + link.request( + Request( + operation: Operation( + document: parseString(readRepositories), + //operationName: 'ReadRepositories', + ), + variables: { + 'nRepositories': 42, + }, + context: Context(), + ), + ), + ); + + expect(r.exception, isNull); + expect(r.data, equals(repoData)); + expect(r.source, QueryResultSource.network); + + final QueryResult cacheResult = await client.query(_options); + expect(cacheResult.exception, isNull); + expect(cacheResult.data, equals(repoData)); + expect(cacheResult.source, equals(QueryResultSource.cache)); + }); }); }); } From 3af3454910568fb8df7d6b723589fcb329f79dae Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Sun, 13 Feb 2022 22:08:26 +0100 Subject: [PATCH 76/94] feat: Update options --- .../graphql/lib/src/core/_base_options.dart | 50 +++++-- .../graphql/lib/src/core/_data_class.dart | 29 ---- .../lib/src/core/mutation_options.dart | 47 ++++-- .../lib/src/core/observable_query.dart | 13 +- .../graphql/lib/src/core/query_manager.dart | 8 +- .../graphql/lib/src/core/query_options.dart | 137 ++++++++++++++++-- packages/graphql/lib/src/graphql_client.dart | 21 ++- packages/graphql/test/query_options_test.dart | 23 +++ 8 files changed, 240 insertions(+), 88 deletions(-) delete mode 100644 packages/graphql/lib/src/core/_data_class.dart diff --git a/packages/graphql/lib/src/core/_base_options.dart b/packages/graphql/lib/src/core/_base_options.dart index 547b49181..1640971c1 100644 --- a/packages/graphql/lib/src/core/_base_options.dart +++ b/packages/graphql/lib/src/core/_base_options.dart @@ -1,13 +1,18 @@ -import 'package:graphql/src/core/_data_class.dart'; - +import 'package:collection/collection.dart'; import 'package:gql/ast.dart'; import 'package:graphql/client.dart'; import 'package:graphql/src/core/result_parser.dart'; +import 'package:meta/meta.dart'; + +TParsed unprovidedParserFn(_d) => throw UnimplementedError( + "Please provide a parser function to support result parsing.", + ); /// TODO refactor into [Request] container /// Base options. -abstract class BaseOptions extends MutableDataClass { +@immutable +abstract class BaseOptions { BaseOptions({ required this.document, this.variables = const {}, @@ -24,28 +29,25 @@ abstract class BaseOptions extends MutableDataClass { cacheReread: cacheRereadPolicy, ), context = context ?? Context(), - parserFn = parserFn ?? - ((d) => throw UnimplementedError( - "Please provide a parser function to support result parsing.", - )); + parserFn = parserFn ?? unprovidedParserFn; /// Document containing at least one [OperationDefinitionNode] - DocumentNode document; + final DocumentNode document; /// Name of the executable definition /// /// Must be specified if [document] contains more than one [OperationDefinitionNode] - String? operationName; + final String? operationName; /// A map going from variable name to variable value, where the variables are used /// within the GraphQL query. - Map variables; + final Map variables; /// An optimistic result to eagerly add to the operation stream - Object? optimisticResult; + final Object? optimisticResult; /// Specifies the [Policies] to be used during execution. - Policies policies; + final Policies policies; FetchPolicy? get fetchPolicy => policies.fetch; @@ -54,9 +56,9 @@ abstract class BaseOptions extends MutableDataClass { CacheRereadPolicy? get cacheRereadPolicy => policies.cacheReread; /// Context to be passed to link execution chain. - Context context; + final Context context; - ResultParserFn parserFn; + final ResultParserFn parserFn; // TODO consider inverting this relationship /// Resolve these options into a request @@ -69,7 +71,7 @@ abstract class BaseOptions extends MutableDataClass { context: context, ); - @override + @protected List get properties => [ document, operationName, @@ -77,6 +79,7 @@ abstract class BaseOptions extends MutableDataClass { optimisticResult, policies, context, + parserFn, ]; OperationType get type { @@ -95,4 +98,21 @@ abstract class BaseOptions extends MutableDataClass { bool get isQuery => type == OperationType.query; bool get isMutation => type == OperationType.mutation; bool get isSubscription => type == OperationType.subscription; + + /// [properties] based deep equality check + operator ==(Object other) => + identical(this, other) || + (other is BaseOptions && + runtimeType == other.runtimeType && + const ListEquality( + DeepCollectionEquality(), + ).equals( + other.properties, + properties, + )); + + @override + int get hashCode => const ListEquality( + DeepCollectionEquality(), + ).hash(properties); } diff --git a/packages/graphql/lib/src/core/_data_class.dart b/packages/graphql/lib/src/core/_data_class.dart deleted file mode 100644 index 511f7ddc4..000000000 --- a/packages/graphql/lib/src/core/_data_class.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'package:meta/meta.dart'; -import "package:collection/collection.dart"; - -/// Helper for making mutable data classes with -/// a [properties] based [equal] helper -/// -/// NOTE: I (@micimize) settled on this helper instead of truly immutable classes -/// because I didn't want to deal with the issue of `copyWith(field: null)`, -/// but also didn't want to commit to adding a true dataclass generator -/// like `freezed` or `built_value` yet. I consider this a stopgap, -/// and think we should eventually have a truly immutable API -abstract class MutableDataClass { - const MutableDataClass(); - - /// identifying properties for the inheriting class - @protected - List get properties; - - /// [properties] based deep equality check - bool equal(MutableDataClass other) => - identical(this, other) || - (runtimeType == other.runtimeType && - const ListEquality( - DeepCollectionEquality(), - ).equals( - other.properties, - properties, - )); -} diff --git a/packages/graphql/lib/src/core/mutation_options.dart b/packages/graphql/lib/src/core/mutation_options.dart index 01ba31893..7b4d836eb 100644 --- a/packages/graphql/lib/src/core/mutation_options.dart +++ b/packages/graphql/lib/src/core/mutation_options.dart @@ -1,17 +1,12 @@ -// ignore_for_file: deprecated_member_use_from_same_package import 'dart:async'; -import 'package:graphql/src/cache/cache.dart'; +import 'package:graphql/client.dart'; import 'package:graphql/src/core/_base_options.dart'; -import 'package:graphql/src/core/observable_query.dart'; import 'package:gql/ast.dart'; -import 'package:gql_exec/gql_exec.dart'; import 'package:graphql/src/core/result_parser.dart'; -import 'package:graphql/src/exceptions.dart'; -import 'package:graphql/src/core/query_result.dart'; import 'package:graphql/src/utilities/helpers.dart'; -import 'package:graphql/src/core/policies.dart'; +import 'package:meta/meta.dart'; typedef OnMutationCompleted = FutureOr Function(dynamic data); typedef OnMutationUpdate = FutureOr Function( @@ -20,6 +15,7 @@ typedef OnMutationUpdate = FutureOr Function( ); typedef OnError = FutureOr Function(OperationException? error); +@immutable class MutationOptions extends BaseOptions { MutationOptions({ required DocumentNode document, @@ -51,8 +47,41 @@ class MutationOptions extends BaseOptions { final OnError? onError; @override - List get properties => - [...super.properties, onCompleted, update, onError]; + List get properties => [ + ...super.properties, + onCompleted, + update, + onError, + ]; + + MutationOptions copyWithPolicies(Policies policies) => + MutationOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: policies.fetch, + errorPolicy: policies.error, + cacheRereadPolicy: policies.cacheReread, + context: context, + optimisticResult: optimisticResult, + onCompleted: onCompleted, + update: update, + onError: onError, + parserFn: parserFn, + ); + + WatchQueryOptions asWatchQueryOptions() => + WatchQueryOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: fetchPolicy, + errorPolicy: errorPolicy, + cacheRereadPolicy: cacheRereadPolicy, + fetchResults: false, + context: context, + parserFn: parserFn, + ); } /// Handles execution of mutation `update`, `onCompleted`, and `onError` callbacks diff --git a/packages/graphql/lib/src/core/observable_query.dart b/packages/graphql/lib/src/core/observable_query.dart index 2ac7d09bc..4c3d9a8dd 100644 --- a/packages/graphql/lib/src/core/observable_query.dart +++ b/packages/graphql/lib/src/core/observable_query.dart @@ -330,7 +330,7 @@ class ObservableQuery { scheduler!.stopPollingQuery(queryId); } - options.pollInterval = pollInterval; + options = options.copyWithPollInterval(pollInterval); lifecycle = QueryLifecycle.polling; scheduler!.startPollingQuery(options, queryId); } @@ -338,13 +338,18 @@ class ObservableQuery { void stopPolling() { if (isCurrentlyPolling) { scheduler!.stopPollingQuery(queryId); - options.pollInterval = null; + options = options.copyWithPollInterval(null); lifecycle = QueryLifecycle.pollingStopped; } } - set variables(Map variables) => - options.variables = variables; + set variables(Map variables) { + options = options.copyWithVariables(variables); + } + + set optimisticResult(Object? optimisticResult) { + options = options.copyWithOptimisticResult(optimisticResult); + } /// [onData] callbacks have het to be run /// diff --git a/packages/graphql/lib/src/core/query_manager.dart b/packages/graphql/lib/src/core/query_manager.dart index 3feac8cae..094578a67 100644 --- a/packages/graphql/lib/src/core/query_manager.dart +++ b/packages/graphql/lib/src/core/query_manager.dart @@ -343,12 +343,10 @@ class QueryManager { /// Refetch the [ObservableQuery] referenced by [queryId], /// overriding any present non-network-only [FetchPolicy]. Future?> refetchQuery(String queryId) { - final WatchQueryOptions options = - queries[queryId]!.options.copy() as WatchQueryOptions; + WatchQueryOptions options = + queries[queryId]!.options as WatchQueryOptions; if (!willAlwaysExecuteOnNetwork(options.fetchPolicy)) { - options.policies = options.policies.copyWith( - fetch: FetchPolicy.networkOnly, - ); + options = options.copyWithFetchPolicy(FetchPolicy.networkOnly); } // create a new request to execute diff --git a/packages/graphql/lib/src/core/query_options.dart b/packages/graphql/lib/src/core/query_options.dart index e3c1da5cf..c38460c52 100644 --- a/packages/graphql/lib/src/core/query_options.dart +++ b/packages/graphql/lib/src/core/query_options.dart @@ -1,4 +1,3 @@ -// ignore_for_file: deprecated_member_use_from_same_package import 'package:graphql/src/core/_base_options.dart'; import 'package:graphql/src/core/result_parser.dart'; import 'package:graphql/src/utilities/helpers.dart'; @@ -6,8 +5,10 @@ import 'package:graphql/src/utilities/helpers.dart'; import 'package:gql/ast.dart'; import 'package:graphql/client.dart'; +import 'package:meta/meta.dart'; /// Query options. +@immutable class QueryOptions extends BaseOptions { QueryOptions({ required DocumentNode document, @@ -33,10 +34,13 @@ class QueryOptions extends BaseOptions { ); /// The time interval on which this query should be re-fetched from the server. - Duration? pollInterval; + final Duration? pollInterval; @override - List get properties => [...super.properties, pollInterval]; + List get properties => [ + ...super.properties, + pollInterval, + ]; WatchQueryOptions asWatchQueryOptions({bool fetchResults = true}) => WatchQueryOptions( @@ -52,8 +56,22 @@ class QueryOptions extends BaseOptions { optimisticResult: optimisticResult, parserFn: this.parserFn, ); + + QueryOptions copyWithPolicies(Policies policies) => QueryOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: policies.fetch, + errorPolicy: policies.error, + cacheRereadPolicy: policies.cacheReread, + optimisticResult: optimisticResult, + pollInterval: pollInterval, + context: context, + parserFn: parserFn, + ); } +@immutable class SubscriptionOptions extends BaseOptions { SubscriptionOptions({ required DocumentNode document, @@ -76,11 +94,21 @@ class SubscriptionOptions extends BaseOptions { optimisticResult: optimisticResult, parserFn: parserFn, ); - - /// An optimistic first result to eagerly add to the subscription stream - Object? optimisticResult; + SubscriptionOptions copyWithPolicies(Policies policies) => + SubscriptionOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: policies.fetch, + errorPolicy: policies.error, + cacheRereadPolicy: policies.cacheReread, + optimisticResult: optimisticResult, + context: context, + parserFn: parserFn, + ); } +@immutable class WatchQueryOptions extends QueryOptions { WatchQueryOptions({ required DocumentNode document, @@ -111,21 +139,99 @@ class WatchQueryOptions extends QueryOptions { ); /// Whether or not to fetch results - bool fetchResults; + final bool fetchResults; /// Whether to [fetchResults] immediately on instantiation. /// Defaults to [fetchResults]. - bool eagerlyFetchResults; + final bool eagerlyFetchResults; /// carry forward previous data in the result of errors and no data. /// defaults to `true`. - bool carryForwardDataOnException; + final bool carryForwardDataOnException; @override - List get properties => - [...super.properties, fetchResults, eagerlyFetchResults]; + List get properties => [ + ...super.properties, + fetchResults, + eagerlyFetchResults, + carryForwardDataOnException, + ]; + + WatchQueryOptions copyWithFetchPolicy( + FetchPolicy? fetchPolicy, + ) => + WatchQueryOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: fetchPolicy, + errorPolicy: errorPolicy, + cacheRereadPolicy: cacheRereadPolicy, + optimisticResult: optimisticResult, + pollInterval: pollInterval, + fetchResults: fetchResults, + eagerlyFetchResults: eagerlyFetchResults, + carryForwardDataOnException: carryForwardDataOnException, + context: context, + parserFn: parserFn, + ); + WatchQueryOptions copyWithPolicies( + Policies policies, + ) => + WatchQueryOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: policies.fetch, + errorPolicy: policies.error, + cacheRereadPolicy: policies.cacheReread, + optimisticResult: optimisticResult, + pollInterval: pollInterval, + fetchResults: fetchResults, + eagerlyFetchResults: eagerlyFetchResults, + carryForwardDataOnException: carryForwardDataOnException, + context: context, + parserFn: parserFn, + ); + + WatchQueryOptions copyWithPollInterval(Duration? pollInterval) => + WatchQueryOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: fetchPolicy, + errorPolicy: errorPolicy, + cacheRereadPolicy: cacheRereadPolicy, + optimisticResult: optimisticResult, + pollInterval: pollInterval, + fetchResults: fetchResults, + eagerlyFetchResults: eagerlyFetchResults, + carryForwardDataOnException: carryForwardDataOnException, + context: context, + parserFn: parserFn, + ); + + WatchQueryOptions copyWithVariables( + Map variables) => + WatchQueryOptions( + document: document, + operationName: operationName, + variables: variables, + fetchPolicy: fetchPolicy, + errorPolicy: errorPolicy, + cacheRereadPolicy: cacheRereadPolicy, + optimisticResult: optimisticResult, + pollInterval: pollInterval, + fetchResults: fetchResults, + eagerlyFetchResults: eagerlyFetchResults, + carryForwardDataOnException: carryForwardDataOnException, + context: context, + parserFn: parserFn, + ); - WatchQueryOptions copy() => WatchQueryOptions( + WatchQueryOptions copyWithOptimisticResult( + Object? optimisticResult) => + WatchQueryOptions( document: document, operationName: operationName, variables: variables, @@ -148,6 +254,7 @@ class WatchQueryOptions extends QueryOptions { /// it is easy to make mistakes in writing [updateQuery]. /// /// To mitigate this, [FetchMoreOptions.partial] has been provided. +@immutable class FetchMoreOptions { FetchMoreOptions({ this.document, @@ -171,13 +278,13 @@ class FetchMoreOptions { updateQuery: partialUpdater(updateQuery), ); - DocumentNode? document; + final DocumentNode? document; - Map variables; + final Map variables; /// Strategy for merging the fetchMore result data /// with the result data already in the cache - UpdateQuery updateQuery; + final UpdateQuery updateQuery; /// Wrap an [UpdateQuery] in a [deeplyMergeLeft] of the `previousResultData`. static UpdateQuery partialUpdater(UpdateQuery update) => diff --git a/packages/graphql/lib/src/graphql_client.dart b/packages/graphql/lib/src/graphql_client.dart index f8d37694d..dcb54fc6f 100644 --- a/packages/graphql/lib/src/graphql_client.dart +++ b/packages/graphql/lib/src/graphql_client.dart @@ -89,9 +89,8 @@ class GraphQLClient implements GraphQLDataProxy { /// {@end-tool} ObservableQuery watchQuery( WatchQueryOptions options) { - options.policies = - defaultPolicies.watchQuery.withOverrides(options.policies); - return queryManager.watchQuery(options); + final policies = defaultPolicies.watchQuery.withOverrides(options.policies); + return queryManager.watchQuery(options.copyWithPolicies(policies)); } /// [watchMutation] is the same as [watchQuery], but with a different [defaultPolicies] that are more appropriate for mutations. @@ -101,9 +100,9 @@ class GraphQLClient implements GraphQLDataProxy { /// For more details, see https://github.com/zino-app/graphql-flutter/issues/774 ObservableQuery watchMutation( WatchQueryOptions options) { - options.policies = + final policies = defaultPolicies.watchMutation.withOverrides(options.policies); - return queryManager.watchQuery(options); + return queryManager.watchQuery(options.copyWithPolicies(policies)); } /// This resolves a single query according to the [QueryOptions] specified and @@ -149,16 +148,16 @@ class GraphQLClient implements GraphQLDataProxy { Future> query( QueryOptions options, ) async { - options.policies = defaultPolicies.query.withOverrides(options.policies); - return await queryManager.query(options); + final policies = defaultPolicies.query.withOverrides(options.policies); + return await queryManager.query(options.copyWithPolicies(policies)); } /// This resolves a single mutation according to the [MutationOptions] specified and /// returns a [Future] which resolves with the [QueryResult] or throws an [Exception]. Future> mutate( MutationOptions options) async { - options.policies = defaultPolicies.mutate.withOverrides(options.policies); - return await queryManager.mutate(options); + final policies = defaultPolicies.mutate.withOverrides(options.policies); + return await queryManager.mutate(options.copyWithPolicies(policies)); } /// This subscribes to a GraphQL subscription according to the options specified and returns a @@ -199,10 +198,10 @@ class GraphQLClient implements GraphQLDataProxy { /// {@end-tool} Stream> subscribe( SubscriptionOptions options) { - options.policies = defaultPolicies.subscribe.withOverrides( + final policies = defaultPolicies.subscribe.withOverrides( options.policies, ); - return queryManager.subscribe(options); + return queryManager.subscribe(options.copyWithPolicies(policies)); } /// Fetch more results and then merge them with the given [previousResult] diff --git a/packages/graphql/test/query_options_test.dart b/packages/graphql/test/query_options_test.dart index 67884b54a..a6cb1641e 100644 --- a/packages/graphql/test/query_options_test.dart +++ b/packages/graphql/test/query_options_test.dart @@ -5,6 +5,29 @@ import 'package:test/test.dart'; void main() { group('query options', () { + group('equality', () { + test('compares content', () { + final fn = (_d) => null; + final t1 = QueryOptions( + variables: {'foo': 'bar'}, + document: parseString('query { bar }'), + parserFn: fn, + ); + final t2 = QueryOptions( + variables: {'foo': 'bar'}, + document: parseString('query { bar }'), + parserFn: fn, + ); + final t3 = QueryOptions( + document: parseString('query { barz }'), + parserFn: fn, + ); + expect(t1, equals(t2)); + expect(t1.hashCode, equals(t2.hashCode)); + expect(t1, isNot(equals(t3))); + expect(t1.hashCode, isNot(equals(t3.hashCode))); + }); + }); group('type getters', () { test('on QueryOptions', () { final options = QueryOptions( From 783dd292a903ff9345718ada8d1c6473b2cd3984 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Mon, 14 Feb 2022 20:27:54 +0000 Subject: [PATCH 77/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 9fba59f90..e681175f6 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1 +version: 5.0.2.beta1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 0293f370c..93dde8dac 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1 +version: 5.0.2.beta1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: ^5.0.1-beta.5 From 1fb4e172d934885178a735aabea0b5708b34f440 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Mon, 14 Feb 2022 21:53:45 +0100 Subject: [PATCH 78/94] ci: fixed version issue Signed-off-by: Vincenzo Palazzo --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index e681175f6..9fba59f90 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.2.beta1 +version: 5.0.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 93dde8dac..066bba4d0 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.2.beta1 +version: c homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: ^5.0.1-beta.5 From 65ce6f0b50de8d9dac75f715eb3666b2ac6e0440 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Mon, 14 Feb 2022 21:56:57 +0100 Subject: [PATCH 79/94] ci: fixed version issue Signed-off-by: Vincenzo Palazzo --- packages/graphql_flutter/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 066bba4d0..0293f370c 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: c +version: 5.0.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: ^5.0.1-beta.5 From 2437565f42d4fd34aa647c78560ce877447f650a Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Mon, 14 Feb 2022 21:05:28 +0000 Subject: [PATCH 80/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index 9fba59f90..ab8a974ac 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1 +version: 5.0.2-beta.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 0293f370c..2161f7c57 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.1 +version: 5.0.2-beta.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: ^5.0.1-beta.5 From db9305ad5b065ee3ec1fcbf8bc104ddc46ab5349 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Sun, 13 Feb 2022 22:08:42 +0100 Subject: [PATCH 81/94] feat: Use hooks Re-implement widgets using flutter_hooks and expose said hooks. --- .../example/ios/Flutter/Debug.xcconfig | 1 + .../example/ios/Flutter/Release.xcconfig | 1 + packages/graphql_flutter/example/ios/Podfile | 41 ++++++ .../graphql_flutter/lib/graphql_flutter.dart | 5 + .../lib/src/widgets/graphql_provider.dart | 1 + .../lib/src/widgets/hooks/graphql_client.dart | 7 + .../lib/src/widgets/hooks/mutation.dart | 53 +++++++ .../lib/src/widgets/hooks/query.dart | 38 ++++++ .../lib/src/widgets/hooks/subscription.dart | 129 ++++++++++++++++++ .../lib/src/widgets/hooks/watch_query.dart | 95 +++++++++++++ .../lib/src/widgets/mutation.dart | 115 +--------------- .../lib/src/widgets/query.dart | 82 ++--------- .../lib/src/widgets/subscription.dart | 116 +--------------- packages/graphql_flutter/pubspec.yaml | 1 + .../test/widgets/query_test.dart | 16 ++- 15 files changed, 402 insertions(+), 299 deletions(-) create mode 100644 packages/graphql_flutter/example/ios/Podfile create mode 100644 packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart create mode 100644 packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart create mode 100644 packages/graphql_flutter/lib/src/widgets/hooks/query.dart create mode 100644 packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart create mode 100644 packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart diff --git a/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig b/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig index 592ceee85..ec97fc6f3 100644 --- a/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig +++ b/packages/graphql_flutter/example/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig b/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig index 592ceee85..c4855bfe2 100644 --- a/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig +++ b/packages/graphql_flutter/example/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/packages/graphql_flutter/example/ios/Podfile b/packages/graphql_flutter/example/ios/Podfile new file mode 100644 index 000000000..1e8c3c90a --- /dev/null +++ b/packages/graphql_flutter/example/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/packages/graphql_flutter/lib/graphql_flutter.dart b/packages/graphql_flutter/lib/graphql_flutter.dart index a8f37a5c9..cbdc2a017 100644 --- a/packages/graphql_flutter/lib/graphql_flutter.dart +++ b/packages/graphql_flutter/lib/graphql_flutter.dart @@ -10,4 +10,9 @@ export 'package:graphql_flutter/src/widgets/query.dart'; export 'package:graphql_flutter/src/widgets/subscription.dart'; export 'package:graphql_flutter/src/widgets/result_accumulator.dart'; +export 'package:graphql_flutter/src/widgets/hooks/mutation.dart'; +export 'package:graphql_flutter/src/widgets/hooks/query.dart'; +export 'package:graphql_flutter/src/widgets/hooks/subscription.dart'; +export 'package:graphql_flutter/src/widgets/hooks/watch_query.dart'; + export 'package:graphql_flutter/src/hive_init.dart'; diff --git a/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart b/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart index 52959edaf..13cdfcea1 100644 --- a/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart +++ b/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart @@ -1,6 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:graphql/client.dart'; +export 'package:graphql_flutter/src/widgets/hooks/query.dart'; class GraphQLProvider extends StatefulWidget { const GraphQLProvider({ diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart b/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart new file mode 100644 index 000000000..0145faf91 --- /dev/null +++ b/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart @@ -0,0 +1,7 @@ +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; + +GraphQLClient useGraphQLClient() { + final context = useContext(); + return useValueListenable(GraphQLProvider.of(context)); +} diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart b/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart new file mode 100644 index 000000000..c45c235de --- /dev/null +++ b/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart @@ -0,0 +1,53 @@ +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; +import 'package:graphql_flutter/src/widgets/query.dart'; + +typedef RunMutation = MultiSourceResult Function( + Map variables, { + Object? optimisticResult, +}); + +class MutationHookResult { + final RunMutation runMutation; + final QueryResult result; + + MutationHookResult({ + required this.runMutation, + required this.result, + }); +} + +MutationHookResult useMutation( + MutationOptions options, +) { + final watchOptions = useMemoized( + () => options.asWatchQueryOptions(), + [options], + ); + final client = useGraphQLClient(); + final query = useWatchMutation(watchOptions); + final snapshot = useStream( + query.stream, + initialData: query.latestResult ?? QueryResult.unexecuted, + ); + final runMutation = useCallback(( + Map variables, { + Object? optimisticResult, + }) { + final mutationCallbacks = MutationCallbackHandler( + cache: client.cache, + queryId: query.queryId, + options: options, + ); + return (query + ..variables = variables + ..optimisticResult = optimisticResult + ..onData(mutationCallbacks.callbacks) // add callbacks to observable + ) + .fetchResults(); + }, [client, query, options]); + return MutationHookResult( + runMutation: runMutation, + result: snapshot.data!, + ); +} diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/query.dart b/packages/graphql_flutter/lib/src/widgets/hooks/query.dart new file mode 100644 index 000000000..1402e8fe6 --- /dev/null +++ b/packages/graphql_flutter/lib/src/widgets/hooks/query.dart @@ -0,0 +1,38 @@ +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql_flutter/src/widgets/hooks/watch_query.dart'; + +// method to call from widget to fetchmore queries +typedef FetchMore = Future> Function( + FetchMoreOptions options); + +typedef Refetch = Future?> Function(); + +class QueryHookResult { + final QueryResult result; + final Refetch refetch; + final FetchMore fetchMore; + + QueryHookResult({ + required this.result, + required this.refetch, + required this.fetchMore, + }); +} + +QueryHookResult useQuery(QueryOptions options) { + final watchQueryOptions = useMemoized( + () => options.asWatchQueryOptions(), + [options], + ); + final query = useWatchQuery(watchQueryOptions); + final snapshot = useStream( + query.stream, + initialData: query.latestResult, + ); + return QueryHookResult( + result: snapshot.data!, + refetch: query.refetch, + fetchMore: query.fetchMore, + ); +} diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart b/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart new file mode 100644 index 000000000..57a955038 --- /dev/null +++ b/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart @@ -0,0 +1,129 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; + +typedef OnSubscriptionResult = void Function( + QueryResult subscriptionResult, + GraphQLClient? client, +); + +typedef SubscriptionBuilder = Widget Function( + QueryResult result); + +QueryResult useSubscription( + SubscriptionOptions options, { + OnSubscriptionResult? onSubscriptionResult, +}) { + final client = useGraphQLClient(); + final stream = use(_SubscriptionHook( + client: client, + onSubscriptionResult: onSubscriptionResult, + options: options, + )); + final snapshot = useStream( + stream, + initialData: options.optimisticResult != null + ? QueryResult.optimistic( + data: options.optimisticResult as Map?, + parserFn: options.parserFn, + ) + : QueryResult.loading(parserFn: options.parserFn), + ); + return snapshot.data!; +} + +class _SubscriptionHook extends Hook>> { + final SubscriptionOptions options; + final GraphQLClient client; + final OnSubscriptionResult? onSubscriptionResult; + _SubscriptionHook({ + required this.options, + required this.client, + required this.onSubscriptionResult, + }); + @override + HookState>, Hook>>> + createState() { + return _SubscriptionHookState(); + } +} + +class _SubscriptionHookState extends HookState< + Stream>, _SubscriptionHook> { + late Stream> stream; + GraphQLClient? client; + + ConnectivityResult? _currentConnectivityResult; + StreamSubscription? _networkSubscription; + + void _initSubscription() { + stream = client!.subscribe(hook.options); + final onSubscriptionResult = hook.onSubscriptionResult; + if (onSubscriptionResult != null) { + stream = stream.map((result) { + onSubscriptionResult(result, client); + return result; + }); + } + } + + @override + void initHook() { + super.initHook(); + _networkSubscription = + Connectivity().onConnectivityChanged.listen(_onNetworkChange); + } + + @override + void didUpdateHook(_SubscriptionHook oldHook) { + super.didUpdateHook(oldHook); + + if (hook.options != oldHook.options || hook.client != oldHook.client) { + _initSubscription(); + } + } + + @override + void dispose() { + _networkSubscription?.cancel(); + super.dispose(); + } + + Future _onNetworkChange(ConnectivityResult result) async { + //if from offline to online + if (_currentConnectivityResult == ConnectivityResult.none && + (result == ConnectivityResult.mobile || + result == ConnectivityResult.wifi)) { + _currentConnectivityResult = result; + + // android connectivitystate cannot be trusted + // validate with nslookup + if (Platform.isAndroid) { + try { + final nsLookupResult = await InternetAddress.lookup('google.com'); + if (nsLookupResult.isNotEmpty && + nsLookupResult[0].rawAddress.isNotEmpty) { + _initSubscription(); + } + // on exception -> no real connection, set current state to none + } on SocketException catch (_) { + _currentConnectivityResult = ConnectivityResult.none; + } + } else { + _initSubscription(); + } + } else { + _currentConnectivityResult = result; + } + } + + @override + Stream> build(BuildContext context) { + return stream; + } +} diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart b/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart new file mode 100644 index 000000000..5fe687ac0 --- /dev/null +++ b/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart @@ -0,0 +1,95 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; + +class _WatchQueryHook extends Hook> { + final GraphQLClient client; + final WatchQueryOptions options; + + _WatchQueryHook({ + required this.options, + required this.client, + }); + + @override + HookState, Hook>> + createState() { + return _WatchQueryHookState(); + } +} + +class _WatchQueryHookState + extends HookState, _WatchQueryHook> { + late ObservableQuery _observableQuery; + + @override + initHook() { + super.initHook(); + _connect(); + } + + @override + dispose() { + _close(); + super.dispose(); + } + + _connect() { + _observableQuery = hook.client.queryManager.watchQuery(hook.options); + } + + _close() { + _observableQuery.close(); + } + + _reconnect() { + _close(); + _connect(); + } + + @override + didUpdateHook(oldHook) { + super.didUpdateHook(oldHook); + if (oldHook.client == hook.client && oldHook.options == hook.options) { + return; + } + _reconnect(); + } + + ObservableQuery build(BuildContext context) { + return _observableQuery; + } +} + +ObservableQuery useWatchQuery( + WatchQueryOptions options, +) { + final client = useGraphQLClient(); + final overwrittenOptions = useMemoized(() { + final policies = + client.defaultPolicies.query.withOverrides(options.policies); + return options.copyWithPolicies(policies); + }, [options]); + + return use(_WatchQueryHook( + options: overwrittenOptions, + client: client, + )); +} + +ObservableQuery useWatchMutation( + WatchQueryOptions options) { + final client = useGraphQLClient(); + final overwrittenOptions = useMemoized(() { + final policies = + client.defaultPolicies.mutate.withOverrides(options.policies); + return options.copyWithPolicies(policies); + }, [options]); + return use( + _WatchQueryHook( + options: overwrittenOptions, + client: client, + ), + ); +} diff --git a/packages/graphql_flutter/lib/src/widgets/mutation.dart b/packages/graphql_flutter/lib/src/widgets/mutation.dart index fbf135f25..560e0b943 100644 --- a/packages/graphql_flutter/lib/src/widgets/mutation.dart +++ b/packages/graphql_flutter/lib/src/widgets/mutation.dart @@ -1,13 +1,10 @@ import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:graphql/client.dart'; +import 'package:graphql_flutter/src/widgets/hooks/mutation.dart'; -import 'package:graphql_flutter/src/widgets/graphql_provider.dart'; - -typedef RunMutation = MultiSourceResult Function( - Map variables, { - Object? optimisticResult, -}); +export 'package:graphql_flutter/src/widgets/hooks/mutation.dart'; typedef MutationBuilder = Widget Function( RunMutation runMutation, @@ -16,7 +13,7 @@ typedef MutationBuilder = Widget Function( /// Builds a [Mutation] widget based on the a given set of [MutationOptions] /// that streams [QueryResult]s into the [QueryBuilder]. -class Mutation extends StatefulWidget { +class Mutation extends HookWidget { const Mutation({ final Key? key, required this.options, @@ -26,109 +23,9 @@ class Mutation extends StatefulWidget { final MutationOptions options; final MutationBuilder builder; - @override - MutationState createState() => MutationState(); -} - -class MutationState extends State> { - GraphQLClient? client; - ObservableQuery? observableQuery; - - WatchQueryOptions? __cachedOptions; - - WatchQueryOptions get _providedOptions { - final _options = WatchQueryOptions( - document: widget.options.document, - operationName: widget.options.operationName, - variables: widget.options.variables, - fetchPolicy: widget.options.fetchPolicy, - errorPolicy: widget.options.errorPolicy, - cacheRereadPolicy: widget.options.cacheRereadPolicy, - fetchResults: false, - context: widget.options.context, - parserFn: widget.options.parserFn, - ); - __cachedOptions ??= _options; - return _options; - } - - /// sets new options, returning true if they didn't equal the old - bool _setNewOptions() { - final _cached = __cachedOptions; - final _new = _providedOptions; - if (_cached == null || !_new.equal(_cached)) { - __cachedOptions = _new; - return true; - } - return false; - } - - // TODO is it possible to extract shared logic into mixin - void _initQuery() { - observableQuery?.close(); - observableQuery = client!.watchMutation(_providedOptions.copy()); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - final GraphQLClient client = GraphQLProvider.of(context).value; - if (client != this.client) { - this.client = client; - _initQuery(); - } - } - - @override - void didUpdateWidget(Mutation oldWidget) { - super.didUpdateWidget(oldWidget); - - // TODO @micimize - investigate why/if this was causing issues - if (_setNewOptions()) { - _initQuery(); - } - } - - /// Run the mutation with the given `variables` and `optimisticResult`, - /// returning a [MultiSourceResult] for handling both the eager and network results - MultiSourceResult runMutation( - Map variables, { - Object? optimisticResult, - }) { - final mutationCallbacks = MutationCallbackHandler( - cache: client!.cache, - queryId: observableQuery!.queryId, - options: widget.options, - ); - - return (observableQuery! - ..variables = variables - ..options.optimisticResult = optimisticResult - ..onData(mutationCallbacks.callbacks) // add callbacks to observable - ) - .fetchResults(); - } - - @override - void dispose() { - observableQuery?.close(force: false); - super.dispose(); - } - @override Widget build(BuildContext context) { - return StreamBuilder?>( - initialData: observableQuery?.latestResult ?? QueryResult.unexecuted, - stream: observableQuery?.stream, - builder: ( - BuildContext buildContext, - AsyncSnapshot?> snapshot, - ) { - return widget.builder( - runMutation, - snapshot.data, - ); - }, - ); + final result = useMutation(options); + return builder(result.runMutation, result.result); } } diff --git a/packages/graphql_flutter/lib/src/widgets/query.dart b/packages/graphql_flutter/lib/src/widgets/query.dart index 59ed0d017..5b0e0af59 100644 --- a/packages/graphql_flutter/lib/src/widgets/query.dart +++ b/packages/graphql_flutter/lib/src/widgets/query.dart @@ -1,14 +1,8 @@ import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:graphql/client.dart'; - -import 'package:graphql_flutter/src/widgets/graphql_provider.dart'; - -// method to call from widget to fetchmore queries -typedef FetchMore = Future> Function( - FetchMoreOptions options); - -typedef Refetch = Future?> Function(); +import 'package:graphql_flutter/graphql_flutter.dart'; +export 'package:graphql_flutter/graphql_flutter.dart'; typedef QueryBuilder = Widget Function( QueryResult result, { @@ -18,7 +12,7 @@ typedef QueryBuilder = Widget Function( /// Builds a [Query] widget based on the a given set of [QueryOptions] /// that streams [QueryResult]s into the [QueryBuilder]. -class Query extends StatefulWidget { +class Query extends HookWidget { const Query({ final Key? key, required this.options, @@ -28,71 +22,13 @@ class Query extends StatefulWidget { final QueryOptions options; final QueryBuilder builder; - @override - QueryState createState() => QueryState(); -} - -class QueryState extends State> { - ObservableQuery? observableQuery; - GraphQLClient? _client; - - WatchQueryOptions get _options => - widget.options.asWatchQueryOptions(); - - void _initQuery() { - observableQuery?.close(); - observableQuery = _client!.watchQuery(_options); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - final GraphQLClient client = GraphQLProvider.of(context).value; - if (client != _client) { - _client = client; - _initQuery(); - } - } - - @override - void didUpdateWidget(Query oldWidget) { - super.didUpdateWidget(oldWidget); - - final GraphQLClient client = GraphQLProvider.of(context).value; - - final optionsWithOverrides = _options; - optionsWithOverrides.policies = client.defaultPolicies.watchQuery - .withOverrides(optionsWithOverrides.policies); - - if (!observableQuery!.options.equal(optionsWithOverrides)) { - _initQuery(); - } - } - - @override - void dispose() { - observableQuery?.close(); - super.dispose(); - } - @override Widget build(BuildContext context) { - return StreamBuilder>( - initialData: observableQuery?.latestResult ?? - QueryResult.loading( - parserFn: widget.options.parserFn, - ), - stream: observableQuery!.stream, - builder: ( - BuildContext buildContext, - AsyncSnapshot> snapshot, - ) { - return widget.builder( - snapshot.data!, - refetch: observableQuery!.refetch, - fetchMore: observableQuery!.fetchMore, - ); - }, + final result = useQuery(options); + return builder( + result.result, + fetchMore: result.fetchMore, + refetch: result.refetch, ); } } diff --git a/packages/graphql_flutter/lib/src/widgets/subscription.dart b/packages/graphql_flutter/lib/src/widgets/subscription.dart index b72a2b319..1e53ed9ba 100644 --- a/packages/graphql_flutter/lib/src/widgets/subscription.dart +++ b/packages/graphql_flutter/lib/src/widgets/subscription.dart @@ -1,18 +1,7 @@ -import 'dart:async'; -import 'dart:io'; - -import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/widgets.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -typedef OnSubscriptionResult = void Function( - QueryResult subscriptionResult, - GraphQLClient? client, -); - -typedef SubscriptionBuilder = Widget Function( - QueryResult result); - /// Creats a subscription with [GraphQLClient.subscribe]. /// /// The [builder] is passed a [QueryResult] with only the **most recent** @@ -63,7 +52,7 @@ typedef SubscriptionBuilder = Widget Function( /// } /// ``` /// {@end-tool} -class Subscription extends StatefulWidget { +class Subscription extends HookWidget { const Subscription({ required this.options, required this.builder, @@ -75,105 +64,12 @@ class Subscription extends StatefulWidget { final SubscriptionBuilder builder; final OnSubscriptionResult? onSubscriptionResult; - @override - _SubscriptionState createState() => _SubscriptionState(); -} - -class _SubscriptionState extends State> { - Stream>? stream; - GraphQLClient? client; - - ConnectivityResult? _currentConnectivityResult; - StreamSubscription? _networkSubscription; - - void _initSubscription() { - stream = client!.subscribe(widget.options); - - if (widget.onSubscriptionResult != null) { - stream = stream!.map((result) { - widget.onSubscriptionResult!(result, client); - return result; - }); - } - } - - @override - void initState() { - _networkSubscription = - Connectivity().onConnectivityChanged.listen(_onNetworkChange); - - super.initState(); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); - final GraphQLClient newClient = GraphQLProvider.of(context).value; - if (client != newClient) { - client = newClient; - _initSubscription(); - } - } - - @override - void didUpdateWidget(Subscription oldWidget) { - super.didUpdateWidget(oldWidget); - - if (!widget.options.equal(oldWidget.options)) { - _initSubscription(); - } - } - - @override - void dispose() { - _networkSubscription?.cancel(); - super.dispose(); - } - - Future _onNetworkChange(ConnectivityResult result) async { - //if from offline to online - if (_currentConnectivityResult == ConnectivityResult.none && - (result == ConnectivityResult.mobile || - result == ConnectivityResult.wifi)) { - _currentConnectivityResult = result; - - // android connectivitystate cannot be trusted - // validate with nslookup - if (Platform.isAndroid) { - try { - final nsLookupResult = await InternetAddress.lookup('google.com'); - if (nsLookupResult.isNotEmpty && - nsLookupResult[0].rawAddress.isNotEmpty) { - _initSubscription(); - } - // on exception -> no real connection, set current state to none - } on SocketException catch (_) { - _currentConnectivityResult = ConnectivityResult.none; - } - } else { - _initSubscription(); - } - } else { - _currentConnectivityResult = result; - } - } - @override Widget build(BuildContext context) { - return StreamBuilder>( - initialData: widget.options.optimisticResult != null - ? QueryResult.optimistic( - data: widget.options.optimisticResult as Map?, - parserFn: widget.options.parserFn, - ) - : QueryResult.loading(parserFn: widget.options.parserFn), - stream: stream, - builder: ( - BuildContext buildContext, - AsyncSnapshot> snapshot, - ) { - return widget.builder(snapshot.data!); - }, + final result = useSubscription( + options, + onSubscriptionResult: onSubscriptionResult, ); + return builder(result); } } diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 2161f7c57..6f8e26479 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: connectivity_plus: ^2.0.3 hive: ^2.0.0 plugin_platform_interface: ^2.0.0 + flutter_hooks: ^0.18.2 dev_dependencies: pedantic: ^1.11.0 mockito: ^5.0.0 diff --git a/packages/graphql_flutter/test/widgets/query_test.dart b/packages/graphql_flutter/test/widgets/query_test.dart index cad5974f9..5607c3691 100644 --- a/packages/graphql_flutter/test/widgets/query_test.dart +++ b/packages/graphql_flutter/test/widgets/query_test.dart @@ -30,19 +30,21 @@ final query = gql(""" /// https://flutter.dev/docs/cookbook/persistence/reading-writing-files#testing Future mockApplicationDocumentsDirectory() async { -// Create a temporary directory. + // Create a temporary directory. final directory = await Directory.systemTemp.createTemp(); - - // Mock out the MethodChannel for the path_provider plugin. - const MethodChannel('plugins.flutter.io/path_provider') - .setMockMethodCallHandler((MethodCall methodCall) async { + final handler = (MethodCall methodCall) async { // If you're getting the apps documents directory, return the path to the // temp directory on the test environment instead. if (methodCall.method == 'getApplicationDocumentsDirectory') { return directory.path; } return null; - }); + }; + // Mock out the MethodChannel for the path_provider plugin. + const MethodChannel('plugins.flutter.io/path_provider') + .setMockMethodCallHandler(handler); + const MethodChannel('plugins.flutter.io/path_provider_macos') + .setMockMethodCallHandler(handler); } class Page extends StatefulWidget { @@ -339,7 +341,7 @@ void main() { 'does not issues new network request when policies are effectively unchanged', (WidgetTester tester) async { final page = Page( - fetchPolicy: FetchPolicy.cacheAndNetwork, + fetchPolicy: client!.value.defaultPolicies.query.fetch, errorPolicy: null, ); From eb0fb336c5a4a2955431c6a5510f9495e7ba3780 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Mon, 14 Feb 2022 19:04:27 +0100 Subject: [PATCH 82/94] graphql_flutter: move the dependece to relative path Signed-off-by: Vincenzo Palazzo --- packages/graphql_flutter/lib/src/widgets/hooks/query.dart | 1 - packages/graphql_flutter/pubspec.yaml | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/query.dart b/packages/graphql_flutter/lib/src/widgets/hooks/query.dart index 1402e8fe6..6e34c3db8 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/query.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/query.dart @@ -1,6 +1,5 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; -import 'package:graphql_flutter/src/widgets/hooks/watch_query.dart'; // method to call from widget to fetchmore queries typedef FetchMore = Future> Function( diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index 6f8e26479..d41d8b663 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -3,7 +3,8 @@ description: A GraphQL client for Flutter, bringing all the features from a mode version: 5.0.2-beta.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: - graphql: ^5.0.1-beta.5 + graphql: + path: ../graphql gql_exec: 0.3.0 flutter: sdk: flutter From 01858b1d565bc3e87545814b4897a3f09279860c Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Mon, 14 Feb 2022 19:30:19 +0100 Subject: [PATCH 83/94] ci: disable flutter analyze due the impossibility to skip warn Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_flutter_build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/graphql_flutter_build.yml b/.github/workflows/graphql_flutter_build.yml index 68ca1ab6f..cf9051a1a 100644 --- a/.github/workflows/graphql_flutter_build.yml +++ b/.github/workflows/graphql_flutter_build.yml @@ -17,6 +17,6 @@ jobs: - run: | cd packages/graphql_flutter flutter format --set-exit-if-changed . - - run: | - cd packages/graphql_flutter - flutter analyze . \ No newline at end of file + #- run: | + # cd packages/graphql_flutter + # flutter analyze . \ No newline at end of file From 4810bb3a8f8eb773f1648e64fd6cd9344480fff2 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Mon, 14 Feb 2022 19:59:57 +0100 Subject: [PATCH 84/94] feat: Clean-up imports --- .../lib/src/widgets/hooks/graphql_client.dart | 3 ++- packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart | 2 +- packages/graphql_flutter/lib/src/widgets/hooks/query.dart | 3 ++- .../graphql_flutter/lib/src/widgets/hooks/subscription.dart | 2 +- .../graphql_flutter/lib/src/widgets/hooks/watch_query.dart | 2 +- packages/graphql_flutter/lib/src/widgets/mutation.dart | 3 --- packages/graphql_flutter/lib/src/widgets/query.dart | 5 ++--- packages/graphql_flutter/lib/src/widgets/subscription.dart | 3 ++- 8 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart b/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart index 0145faf91..17b93814f 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/graphql_client.dart @@ -1,5 +1,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql/client.dart'; +import 'package:graphql_flutter/src/widgets/graphql_provider.dart'; GraphQLClient useGraphQLClient() { final context = useContext(); diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart b/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart index c45c235de..6af551c84 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart @@ -1,6 +1,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; -import 'package:graphql_flutter/src/widgets/query.dart'; typedef RunMutation = MultiSourceResult Function( Map variables, { diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/query.dart b/packages/graphql_flutter/lib/src/widgets/hooks/query.dart index 6e34c3db8..19a768746 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/query.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/query.dart @@ -1,5 +1,6 @@ import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql/client.dart'; +import 'package:graphql_flutter/src/widgets/hooks/watch_query.dart'; // method to call from widget to fetchmore queries typedef FetchMore = Future> Function( diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart b/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart index 57a955038..4ca55b7aa 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/subscription.dart @@ -4,7 +4,7 @@ import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; typedef OnSubscriptionResult = void Function( diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart b/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart index 5fe687ac0..e37f6904f 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/watch_query.dart @@ -1,6 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; class _WatchQueryHook extends Hook> { diff --git a/packages/graphql_flutter/lib/src/widgets/mutation.dart b/packages/graphql_flutter/lib/src/widgets/mutation.dart index 560e0b943..841e8b5f1 100644 --- a/packages/graphql_flutter/lib/src/widgets/mutation.dart +++ b/packages/graphql_flutter/lib/src/widgets/mutation.dart @@ -1,11 +1,8 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/hooks/mutation.dart'; -export 'package:graphql_flutter/src/widgets/hooks/mutation.dart'; - typedef MutationBuilder = Widget Function( RunMutation runMutation, QueryResult? result, diff --git a/packages/graphql_flutter/lib/src/widgets/query.dart b/packages/graphql_flutter/lib/src/widgets/query.dart index 5b0e0af59..f8bf425db 100644 --- a/packages/graphql_flutter/lib/src/widgets/query.dart +++ b/packages/graphql_flutter/lib/src/widgets/query.dart @@ -1,8 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; - -import 'package:graphql_flutter/graphql_flutter.dart'; -export 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql/client.dart'; +import 'package:graphql_flutter/src/widgets/hooks/query.dart'; typedef QueryBuilder = Widget Function( QueryResult result, { diff --git a/packages/graphql_flutter/lib/src/widgets/subscription.dart b/packages/graphql_flutter/lib/src/widgets/subscription.dart index 1e53ed9ba..28b245c2c 100644 --- a/packages/graphql_flutter/lib/src/widgets/subscription.dart +++ b/packages/graphql_flutter/lib/src/widgets/subscription.dart @@ -1,6 +1,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:graphql/client.dart'; +import 'package:graphql_flutter/src/widgets/hooks/subscription.dart'; /// Creats a subscription with [GraphQLClient.subscribe]. /// From 472f55aa5793cb068f13611adddbfa3db042bb31 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Mon, 14 Feb 2022 22:11:44 +0100 Subject: [PATCH 85/94] ci: upgrade graphql and reintroduce the flutter analyze check Signed-off-by: Vincenzo Palazzo --- .github/workflows/graphql_flutter_build.yml | 6 +++--- packages/graphql_flutter/pubspec.yaml | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/graphql_flutter_build.yml b/.github/workflows/graphql_flutter_build.yml index cf9051a1a..68ca1ab6f 100644 --- a/.github/workflows/graphql_flutter_build.yml +++ b/.github/workflows/graphql_flutter_build.yml @@ -17,6 +17,6 @@ jobs: - run: | cd packages/graphql_flutter flutter format --set-exit-if-changed . - #- run: | - # cd packages/graphql_flutter - # flutter analyze . \ No newline at end of file + - run: | + cd packages/graphql_flutter + flutter analyze . \ No newline at end of file diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index d41d8b663..eb3783f28 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -3,8 +3,7 @@ description: A GraphQL client for Flutter, bringing all the features from a mode version: 5.0.2-beta.1 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: - graphql: - path: ../graphql + graphql: 5.0.2-beta.1 gql_exec: 0.3.0 flutter: sdk: flutter From b15a7d640a2c5e9fdaba47eecbacdf845fdea4d0 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Mon, 14 Feb 2022 22:17:29 +0100 Subject: [PATCH 86/94] graphql_flutter: adding missing import Signed-off-by: Vincenzo Palazzo --- packages/graphql_flutter/lib/src/widgets/graphql_provider.dart | 1 - packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart b/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart index 13cdfcea1..52959edaf 100644 --- a/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart +++ b/packages/graphql_flutter/lib/src/widgets/graphql_provider.dart @@ -1,7 +1,6 @@ import 'package:flutter/widgets.dart'; import 'package:graphql/client.dart'; -export 'package:graphql_flutter/src/widgets/hooks/query.dart'; class GraphQLProvider extends StatefulWidget { const GraphQLProvider({ diff --git a/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart b/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart index 6af551c84..20ad01c45 100644 --- a/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart +++ b/packages/graphql_flutter/lib/src/widgets/hooks/mutation.dart @@ -1,6 +1,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:graphql/client.dart'; import 'package:graphql_flutter/src/widgets/hooks/graphql_client.dart'; +import 'package:graphql_flutter/src/widgets/hooks/watch_query.dart'; typedef RunMutation = MultiSourceResult Function( Map variables, { From 2cd072785ea56b64408fdc3e2d1a85492cbe1f8a Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Tue, 15 Feb 2022 09:41:47 +0000 Subject: [PATCH 87/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index ab8a974ac..ee73c4313 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.2-beta.1 +version: 5.0.2-beta.2 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index eb3783f28..fd153b303 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.2-beta.1 +version: 5.0.2-beta.2 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: 5.0.2-beta.1 From 5510511ac5b77e810ddb223476f46332aac241a8 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Wed, 16 Feb 2022 14:35:32 +0100 Subject: [PATCH 88/94] fix: Cache-reboardcast error --- .../lib/src/core/observable_query.dart | 12 +++++ .../graphql/lib/src/core/query_manager.dart | 53 ++----------------- .../graphql/lib/src/utilities/response.dart | 44 +++++++++++++++ 3 files changed, 61 insertions(+), 48 deletions(-) create mode 100644 packages/graphql/lib/src/utilities/response.dart diff --git a/packages/graphql/lib/src/core/observable_query.dart b/packages/graphql/lib/src/core/observable_query.dart index 4c3d9a8dd..a4f421d6a 100644 --- a/packages/graphql/lib/src/core/observable_query.dart +++ b/packages/graphql/lib/src/core/observable_query.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'package:graphql/client.dart'; +import 'package:graphql/src/utilities/response.dart'; import 'package:meta/meta.dart'; import 'package:graphql/src/core/fetch_more.dart'; @@ -231,6 +232,17 @@ class ObservableQuery { ); } + void addFetchResult( + Response response, + QueryResultSource source, { + bool fromRebroadcast = false, + }) { + addResult( + mapFetchResultToQueryResult(response, options, source: source), + fromRebroadcast: fromRebroadcast, + ); + } + /// Add a [result] to the [stream] unless it was created /// before [lasestResult]. /// diff --git a/packages/graphql/lib/src/core/query_manager.dart b/packages/graphql/lib/src/core/query_manager.dart index 3a6d811ea..48f5da8a4 100644 --- a/packages/graphql/lib/src/core/query_manager.dart +++ b/packages/graphql/lib/src/core/query_manager.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:graphql/src/core/result_parser.dart'; +import 'package:graphql/src/utilities/response.dart'; import 'package:meta/meta.dart'; import 'package:collection/collection.dart'; @@ -458,19 +459,16 @@ class QueryManager { return false; } - for (ObservableQuery query in queries.values) { + for (var query in queries.values) { if (query != exclude && query.isRebroadcastSafe) { final cachedData = cache.readQuery( query.options.asRequest, optimistic: query.options.policies.mergeOptimisticData, ); if (_cachedDataHasChangedFor(query, cachedData)) { - query.addResult( - mapFetchResultToQueryResult( - Response(data: cachedData), - query.options, - source: QueryResultSource.cache, - ), + query.addFetchResult( + Response(data: cachedData), + QueryResultSource.cache, fromRebroadcast: true, ); } @@ -504,47 +502,6 @@ class QueryManager { return requestId; } - - QueryResult mapFetchResultToQueryResult( - Response response, - BaseOptions options, { - required QueryResultSource source, - }) { - List? errors; - dynamic data; - - // check if there are errors and apply the error policy if so - // in a nutshell: `ignore` swallows errors, `none` swallows data - if (response.errors != null && response.errors!.isNotEmpty) { - switch (options.errorPolicy) { - case ErrorPolicy.all: - // handle both errors and data - errors = response.errors; - data = response.data; - break; - case ErrorPolicy.ignore: - // ignore errors - data = response.data; - break; - case ErrorPolicy.none: - default: - // TODO not actually sure if apollo even casts graphql errors in `none` mode, - // it's also kind of legacy - errors = response.errors; - break; - } - } else { - data = response.data; - } - - return QueryResult( - data: data, - context: response.context, - source: source, - exception: coalesceErrors(graphqlErrors: errors), - parserFn: options.parserFn, - ); - } } QueryResult _wrapFailure( diff --git a/packages/graphql/lib/src/utilities/response.dart b/packages/graphql/lib/src/utilities/response.dart new file mode 100644 index 000000000..02bff9dee --- /dev/null +++ b/packages/graphql/lib/src/utilities/response.dart @@ -0,0 +1,44 @@ +import 'package:graphql/src/core/_base_options.dart'; +import 'package:graphql/src/core/core.dart'; +import 'package:graphql/src/exceptions.dart'; + +QueryResult mapFetchResultToQueryResult( + Response response, + BaseOptions options, { + required QueryResultSource source, +}) { + List? errors; + dynamic data; + + // check if there are errors and apply the error policy if so + // in a nutshell: `ignore` swallows errors, `none` swallows data + if (response.errors != null && response.errors!.isNotEmpty) { + switch (options.errorPolicy) { + case ErrorPolicy.all: + // handle both errors and data + errors = response.errors; + data = response.data; + break; + case ErrorPolicy.ignore: + // ignore errors + data = response.data; + break; + case ErrorPolicy.none: + default: + // TODO not actually sure if apollo even casts graphql errors in `none` mode, + // it's also kind of legacy + errors = response.errors; + break; + } + } else { + data = response.data; + } + + return QueryResult( + data: data, + context: response.context, + source: source, + exception: coalesceErrors(graphqlErrors: errors), + parserFn: options.parserFn, + ); +} From 922f315f58da8991b0eada6ba37e017576bbbeb9 Mon Sep 17 00:00:00 2001 From: futabooo Date: Wed, 16 Feb 2022 23:02:54 +0900 Subject: [PATCH 89/94] fix typo --- packages/graphql/example/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/graphql/example/README.md b/packages/graphql/example/README.md index 41ed36f64..a4e286290 100644 --- a/packages/graphql/example/README.md +++ b/packages/graphql/example/README.md @@ -8,7 +8,7 @@ To run this application: 1. First clone this repository and navigate to this directory 2. Install all dart dependencies -3. replace `` in `bin/local.dart` with your GitHub token +3. replace `` in `lib/local.dart` with your GitHub token ## Usage: ```sh From ed64e6945a1800c3b9b12d717348968c5f96bdef Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Thu, 17 Feb 2022 08:35:26 +0100 Subject: [PATCH 90/94] fix: Fetch more is broken with `parserFn` --- packages/graphql/lib/src/core/fetch_more.dart | 12 +--- .../graphql/lib/src/core/query_options.dart | 19 ++++- .../graphql/test/graphql_client_test.dart | 70 +++++++++++++++++++ 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/packages/graphql/lib/src/core/fetch_more.dart b/packages/graphql/lib/src/core/fetch_more.dart index 5f3c723ed..10c1a8fec 100644 --- a/packages/graphql/lib/src/core/fetch_more.dart +++ b/packages/graphql/lib/src/core/fetch_more.dart @@ -21,18 +21,10 @@ Future> fetchMoreImplementation( }) async { // fetch more and update - final document = (fetchMoreOptions.document ?? originalOptions.document); final request = originalOptions.asRequest; - final combinedOptions = QueryOptions( - fetchPolicy: FetchPolicy.noCache, - errorPolicy: originalOptions.errorPolicy, - document: document, - variables: { - ...originalOptions.variables, - ...fetchMoreOptions.variables, - }, - ); + final combinedOptions = + originalOptions.withFetchMoreOptions(fetchMoreOptions); QueryResult fetchMoreResult = await queryManager.query(combinedOptions); diff --git a/packages/graphql/lib/src/core/query_options.dart b/packages/graphql/lib/src/core/query_options.dart index c38460c52..89f7ac552 100644 --- a/packages/graphql/lib/src/core/query_options.dart +++ b/packages/graphql/lib/src/core/query_options.dart @@ -1,3 +1,4 @@ +import 'package:gql/language.dart'; import 'package:graphql/src/core/_base_options.dart'; import 'package:graphql/src/core/result_parser.dart'; import 'package:graphql/src/utilities/helpers.dart'; @@ -42,6 +43,22 @@ class QueryOptions extends BaseOptions { pollInterval, ]; + QueryOptions withFetchMoreOptions( + FetchMoreOptions fetchMoreOptions, + ) => + QueryOptions( + document: fetchMoreOptions.document ?? document, + operationName: operationName, + fetchPolicy: FetchPolicy.noCache, + errorPolicy: errorPolicy, + parserFn: parserFn, + context: context, + variables: { + ...variables, + ...fetchMoreOptions.variables, + }, + ); + WatchQueryOptions asWatchQueryOptions({bool fetchResults = true}) => WatchQueryOptions( document: document, @@ -54,7 +71,7 @@ class QueryOptions extends BaseOptions { fetchResults: fetchResults, context: context, optimisticResult: optimisticResult, - parserFn: this.parserFn, + parserFn: parserFn, ); QueryOptions copyWithPolicies(Policies policies) => QueryOptions( diff --git a/packages/graphql/test/graphql_client_test.dart b/packages/graphql/test/graphql_client_test.dart index 7ce8f9fa8..003f58fac 100644 --- a/packages/graphql/test/graphql_client_test.dart +++ b/packages/graphql/test/graphql_client_test.dart @@ -222,6 +222,76 @@ void main() { equals('bar'), ); }); + test('successful fetch-more with parser', () async { + final ResultParserFn> parserFn = (data) { + return data['viewer']['repositories']['nodes'] + .map((node) => node['name'] as String) + .toList(); + }; + final _options = QueryOptions( + document: parseString(readRepositories), + variables: { + 'nRepositories': 42, + }, + parserFn: parserFn, + ); + final repoData = readRepositoryData(withTypenames: true); + + when( + link.request(any), + ).thenAnswer( + (_) => Stream.fromIterable([ + Response( + data: repoData, + context: Context().withEntry( + HttpLinkResponseContext( + statusCode: 200, + headers: {'foo': 'bar'}, + ), + ), + ), + ]), + ); + + final QueryResult> r1 = await client.query(_options); + expect(r1.exception, isNull); + expect(r1.data, equals(repoData)); + expect( + r1.parsedData, + equals([ + 'pq', + 'go-evercookie', + 'watchbot', + ])); + final QueryResult> r2 = await client.fetchMore( + FetchMoreOptions( + updateQuery: (d1, d2) => ({ + 'viewer': { + 'repositories': { + 'nodes': [ + ...d1!['viewer']['repositories']['nodes'], + ...d2!['viewer']['repositories']['nodes'], + ] + } + } + }), + ), + previousResult: r1, + originalOptions: _options, + ); + + expect(r2.exception, isNull); + expect( + r2.parsedData, + equals([ + 'pq', + 'go-evercookie', + 'watchbot', + 'pq', + 'go-evercookie', + 'watchbot', + ])); + }); test('successful response without normalization', () async { final readUnidentifiedRepositories = parseString(r''' From 754fe7e69605119ea79fde720c5248a4a778a539 Mon Sep 17 00:00:00 2001 From: "Zino App (Github bot)" Date: Thu, 17 Feb 2022 12:34:15 +0000 Subject: [PATCH 91/94] build(Pub): Bump version numbers [skip ci] --- packages/graphql/pubspec.yaml | 2 +- packages/graphql_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/graphql/pubspec.yaml b/packages/graphql/pubspec.yaml index ee73c4313..e7b65a5af 100644 --- a/packages/graphql/pubspec.yaml +++ b/packages/graphql/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql description: A stand-alone GraphQL client for Dart, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.2-beta.2 +version: 5.0.2-beta.3 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql dependencies: meta: ^1.3.0 diff --git a/packages/graphql_flutter/pubspec.yaml b/packages/graphql_flutter/pubspec.yaml index fd153b303..c89ef797a 100644 --- a/packages/graphql_flutter/pubspec.yaml +++ b/packages/graphql_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: graphql_flutter description: A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. -version: 5.0.2-beta.2 +version: 5.0.2-beta.3 homepage: https://github.com/zino-app/graphql-flutter/tree/master/packages/graphql_flutter dependencies: graphql: 5.0.2-beta.1 From 2f1b98fd472ec495a33a4cd0c9309b44d2ff85d5 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Thu, 17 Feb 2022 10:02:32 +0100 Subject: [PATCH 92/94] fix: Stream broadcast --- .../graphql/lib/src/core/query_manager.dart | 91 +++++++------- .../graphql/test/graphql_client_test.dart | 114 +++++++++++++++--- 2 files changed, 146 insertions(+), 59 deletions(-) diff --git a/packages/graphql/lib/src/core/query_manager.dart b/packages/graphql/lib/src/core/query_manager.dart index 48f5da8a4..4b7a41cc6 100644 --- a/packages/graphql/lib/src/core/query_manager.dart +++ b/packages/graphql/lib/src/core/query_manager.dart @@ -92,48 +92,55 @@ class QueryManager { } try { - yield* link.request(request).map((response) { - QueryResult? queryResult; - bool rereadFromCache = false; - try { - queryResult = mapFetchResultToQueryResult( - response, - options, - source: QueryResultSource.network, - ); - - rereadFromCache = attemptCacheWriteFromResponse( - options.policies, - request, - response, - queryResult, - ); - } catch (failure, trace) { - // we set the source to indicate where the source of failure - queryResult ??= QueryResult( - source: QueryResultSource.network, - parserFn: options.parserFn, - ); - - queryResult.exception = coalesceErrors( - exception: queryResult.exception, - linkException: translateFailure(failure, trace), - ); - } - - if (rereadFromCache) { - // normalize results if previously written - attempCacheRereadIntoResult(request, queryResult); - } - - return queryResult; - }).transform(StreamTransformer.fromHandlers( - handleError: (err, trace, sink) => sink.add(_wrapFailure( - err, - trace, - options.parserFn, - )), - )); + yield* link + .request(request) + .map((response) { + QueryResult? queryResult; + bool rereadFromCache = false; + try { + queryResult = mapFetchResultToQueryResult( + response, + options, + source: QueryResultSource.network, + ); + + rereadFromCache = attemptCacheWriteFromResponse( + options.policies, + request, + response, + queryResult, + ); + } catch (failure, trace) { + // we set the source to indicate where the source of failure + queryResult ??= QueryResult( + source: QueryResultSource.network, + parserFn: options.parserFn, + ); + + queryResult.exception = coalesceErrors( + exception: queryResult.exception, + linkException: translateFailure(failure, trace), + ); + } + + if (rereadFromCache) { + // normalize results if previously written + attempCacheRereadIntoResult(request, queryResult); + } + + return queryResult; + }) + .transform>(StreamTransformer.fromHandlers( + handleError: (err, trace, sink) => sink.add(_wrapFailure( + err, + trace, + options.parserFn, + )), + )) + .map((QueryResult queryResult) { + maybeRebroadcastQueries(); + return queryResult; + }); } catch (ex, trace) { yield* Stream.fromIterable([ _wrapFailure( diff --git a/packages/graphql/test/graphql_client_test.dart b/packages/graphql/test/graphql_client_test.dart index 7ce8f9fa8..2eee1edb2 100644 --- a/packages/graphql/test/graphql_client_test.dart +++ b/packages/graphql/test/graphql_client_test.dart @@ -657,29 +657,109 @@ void main() { ), ); }); - test('parses results', () async { - final responses = [ - { - 'id': '1', - 'name': 'first', - }, - { - 'id': '2', - 'name': 'second', + test('broadcasts', () async { + const initialName = 'initial'; + const firstUpdateName = 'first'; + const secondUpdateName = 'second'; + final initialQueryResponse = Response( + data: { + 'single': { + 'id': '1', + '__typename': 'Item', + 'name': initialName, + }, }, - ].map((item) => Response( - data: { - 'item': { - '__typename': 'Item', - ...item, - }, - }, - )); + ); + when( + link.request(any), + ).thenAnswer( + (_) => Stream.fromIterable( + [initialQueryResponse], + ), + ); + + final ObservableQuery observable = client.watchQuery( + WatchQueryOptions( + document: parseString(readSingle), + eagerlyFetchResults: true, + variables: {'id': '1'}, + ), + ); + final responses = [ + {'id': '1', 'name': firstUpdateName, '__typename': 'Item'}, + {'id': '1', 'name': secondUpdateName, '__typename': 'Item'}, + ].map((item) => Response(data: {'item': item})); when( link.request(any), ).thenAnswer( (_) => Stream.fromIterable(responses), ); + final stream = client.subscribe( + SubscriptionOptions( + document: parseString( + r''' + subscription { + item { + id + name + } + } + ''', + ), + ), + ); + expect( + stream, + emitsInOrder( + [ + isA().having( + (result) => result.data!['item']['name'], + 'name', + firstUpdateName, + ), + isA().having( + (result) => result.data!['item']['name'], + 'name', + secondUpdateName, + ) + ], + ), + ); + expect( + observable.stream, + emitsInOrder( + [ + isA().having( + (result) => result.data, + 'name', + null, + ), + isA().having( + (result) => result.data!['single']['name'], + 'name', + initialName, + ), + isA().having( + (result) => result.data!['single']['name'], + 'name', + firstUpdateName, + ), + isA().having( + (result) => result.data!['single']['name'], + 'name', + secondUpdateName, + ) + ], + ), + ); + }); + test('parses results', () async { + final responses = [ + {'id': '1', 'name': 'first', '__typename': 'Item'}, + {'id': '2', 'name': 'second', '__typename': 'Item'}, + ].map((item) => Response(data: {'item': item})); + when(link.request(any)) + .thenAnswer((_) => Stream.fromIterable(responses)); final ResultParserFn parserFn = (data) => data['item']['name'] as String; From 1ce17fc7b46b0e41d3629bbef2923dce845d3b29 Mon Sep 17 00:00:00 2001 From: Christian Budde Christensen Date: Fri, 18 Feb 2022 08:49:15 +0000 Subject: [PATCH 93/94] docs: Improve documentation Added documentation on code-generation and hooks. --- packages/graphql/README.md | 37 +++--- packages/graphql_flutter/README.md | 177 +++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+), 20 deletions(-) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index 6faae5ebd..9d5e66fe9 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -41,7 +41,7 @@ As of `v4`, it is built on foundational libraries from the [gql-dart project], i - [Links](#links) - [Composing Links](#composing-links) - [AWS AppSync Support](#aws-appsync-support) - - [Parsing ASTs at build-time](#parsing-asts-at-build-time) + - [Code generation](#code-generation) - [`PersistedQueriesLink` (experimental) :warning: OUT OF SERVICE :warning:](#persistedquerieslink-experimental-warning-out-of-service-warning) **Useful API Docs:** @@ -768,21 +768,17 @@ API key, IAM, and Federated provider authorization could be accomplished through - Making a custom link: [Comment on Issue 173](https://github.com/zino-app/graphql-flutter/issues/173#issuecomment-464435942) - AWS JS SDK `auth-link.ts`: [aws-mobile-appsync-sdk-js:auth-link.ts](https://github.com/awslabs/aws-mobile-appsync-sdk-js/blob/master/packages/aws-appsync-auth-link/src/auth-link.ts) -## Parsing ASTs at build-time +## Code generation -All `document` arguments are `DocumentNode`s from `gql/ast`. -We supply a `gql` helper for parsing, them, but you can also -parse documents at build-time use `ast_builder` from -[`package:gql_code_gen`](https://pub.dev/packages/gql_code_gen): +This package does not support code-generation out of the box, but [graphql_codegen](https://pub.dev/packages/graphql_codegen) does! -```yaml -dev_dependencies: - gql_code_gen: ^0.1.5 -``` +This package extensions on the client which takes away the struggle of serialization and gives you confidence through type-safety. +It is also more performant than parsing GraphQL queries at runtime. -**`add_star.graphql`**: +For example, by creating the `.graphql` file ```graphql +# add_star.graphql mutation AddStar($starrableId: ID!) { action: addStar(input: { starrableId: $starrableId }) { starrable { @@ -792,19 +788,20 @@ mutation AddStar($starrableId: ID!) { } ``` +after building, you'll be able to execute your mutation on the client as: + ```dart -import 'package:gql/add_star.ast.g.dart' as add_star; +// add_star.dart +import 'add_star.graphql.dart'; -// ... +// .. -final MutationOptions options = MutationOptions( - document: add_star.document, - variables: { - 'starrableId': repositoryID, - }, -); -// ... + await client.mutateAddStar( + OptionsMutationAddStar( + variables: VariablesMutationAddStar(starableId: repositoryID) + ) + ); ``` ## `PersistedQueriesLink` (experimental) :warning: OUT OF SERVICE :warning: diff --git a/packages/graphql_flutter/README.md b/packages/graphql_flutter/README.md index 04439ac96..8b1a28959 100644 --- a/packages/graphql_flutter/README.md +++ b/packages/graphql_flutter/README.md @@ -27,6 +27,8 @@ This guide is mostly focused on setup, widgets, and flutter-specific considerati - [Optimism](#optimism) - [Subscriptions](#subscriptions) - [GraphQL Consumer](#graphql-consumer) + - [Other hooks](#other-hooks) + - [Code generation](#code-generation) **Useful sections in the [`graphql` README](../graphql/README.md):** @@ -186,6 +188,48 @@ Query( // ... ``` +or if you prefer to use [flutter-hooks](https://pub.dev/packages/flutter_hooks), you can write the above as: + + +```dart +// ... +final readRespositoriesResult = useQuery( + QueryOptions( + document: gql(readRepositories), // this is the query string you just created + variables: { + 'nRepositories': 50, + }, + pollInterval: const Duration(seconds: 10), + ), +); +final result = readRespositoriesResult.result; + +if (result.hasException) { + return Text(result.exception.toString()); +} + +if (result.isLoading) { + return const Text('Loading'); +} + +List? repositories = result.data?['viewer']?['repositories']?['nodes']; + +if (repositories == null) { + return const Text('No repositories'); +} + +return ListView.builder( + itemCount: repositories.length, + itemBuilder: (context, index) { + final repository = repositories[index]; + + return Text(repository['name'] ?? ''); +}); +// ... + + +``` + #### Fetch More (Pagination) You can use `fetchMore()` function inside `Query` Builder to perform pagination. The `fetchMore()` function allows you to run an entirely new GraphQL operation and merge the new results with the original results. On top of that, you can re-use aspects of the Original query i.e. the Query or some of the Variables. @@ -289,6 +333,36 @@ Mutation( ... ``` +The corresponding hook is + +```dart + +// ... + +final addStarMutation = useMutation( + MutationOptions( + document: gql(addStar), // this is the mutation string you just created + // you can update the cache based on results + update: (GraphQLDataProxy cache, QueryResult result) { + return cache; + }, + // or do something with the result.data on completion + onCompleted: (dynamic resultData) { + print(resultData); + }, + ), +); +return FloatingActionButton( + onPressed: () => addStarMutation.runMutation({ + 'starrableId': , + }), + tooltip: 'Star', + child: Icon(Icons.star), +); + +// ... +``` + `graphql` also provides [file upload](../graphql/README.md#graphql-upload) support as well. @@ -438,6 +512,63 @@ class _MyHomePageState extends State { } ``` +the corresponding implementation with hooks is: + + +```dart +final subscriptionDocument = gql( + r''' + subscription reviewAdded { + reviewAdded { + stars, commentary, episode + } + } + ''', +); + +class MyHomePage extends HooksWidget { + @override + Widget build(BuildContext context) { + final result = useSubscription( + SubscriptionOptions( + document: subscriptionDocument, + ), + ); + + Widget child; + if (result.hasException) { + child = Text(result.exception.toString()); + } else if (result.isLoading) { + child = Center( + child: const CircularProgressIndicator(), + ); + } else { + child = ResultAccumulator.appendUniqueEntries( + latest: result.data, + builder: (context, {results}) => DisplayReviews( + reviews: results.reversed.toList(), + ), + ); + } + return Scaffold( + body: Center(child: child) + ); + } +} +``` + +### Other hooks + +Besides `useMutation`, `useQuery`, and `useSubscription`, this package contains the following hooks: + +```dart +final client = useGraphQLClient(); // Fetch the current client +final observableQuery = useWatchQuery(WatchQueryOptions(...)); // Watch a query +final mutationObservableQuery = useWatchMutation(WatchQueryOptions(...)); // Watch a query +``` + + + ### GraphQL Consumer If you want to use the `client` directly, say for some its @@ -460,6 +591,52 @@ You can use `GraphQLConsumer` to grab it from any `context` descended from a `Gr ... ``` +## Code generation + +This package does not support code-generation out of the box, but [graphql_codegen](https://pub.dev/packages/graphql_codegen) does! + +This package generate hooks and options which takes away the struggle of serialization and gives you confidence through type-safety. + +For example, by creating the `.graphql` file + +```graphql + query ReadRepositories($nRepositories: Int!) { + viewer { + repositories(last: $nRepositories) { + nodes { + id + name + } + } + } + } +``` + +after building, you'll be able to query this in your code through the hook: + +```dart +final queryResult = useQueryReadRepositories( + OptionsQueryReadRepositories( + variables: VariablesQueryReadRepositories( + nRepositories: 10 + ) + ) +); +if (queryResult.result.hasException) { + return Text(result.exception.toString()); +} +if (queryResult.result.isLoading) { + return Text(text: "LOADING"); +} +final data = queryResult.result.parsedData; + +return Column( + children: data?.viewer.repositores.nodes.map((node) => Text(text: node.name)); +); +``` + + + [build-status-badge]: https://img.shields.io/github/workflow/status/zino-hofmann/graphql-flutter/graphql-flutter%20Tests%20case?style=flat-square [build-status-link]: https://github.com/zino-hofmann/graphql-flutter/actions [coverage-badge]: https://img.shields.io/codecov/c/github/zino-hofmann/graphql-flutter/beta?style=flat-square From 0e6608242e0a80481b35f60301092080abfb32bb Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Fri, 18 Feb 2022 14:11:59 +0100 Subject: [PATCH 94/94] doc: update the graphql doc regarding the custom headers Signed-off-by: Vincenzo Palazzo --- packages/graphql/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/graphql/README.md b/packages/graphql/README.md index 9d5e66fe9..2db482366 100644 --- a/packages/graphql/README.md +++ b/packages/graphql/README.md @@ -329,10 +329,16 @@ connect: (url, protocols) { } ``` -To supply custom headers to an IO client: +To supply custom headers (not supported on Flutter Web): ```dart -connect: (url, protocols) => - IOWebSocketChannel.connect(url, protocols: protocols, headers: myCustomHeaders) + SocketClient( + wsUrl, + config: SocketClientConfig( + autoReconnect: autoReconnect, + headers: customHeaders, + delayBetweenReconnectionAttempts: delayBetweenReconnectionAttempts, + ), + ); ``` ### `client.watchQuery` and `ObservableQuery`