From 082472b46757fd5464a86de3c0d90d0a1d745637 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 1 Aug 2024 15:38:28 +0200 Subject: [PATCH 01/34] Offline demo. --- demos/offline_first_todolist/.gitignore | 50 ++ demos/offline_first_todolist/.metadata | 30 + demos/offline_first_todolist/LICENSE | 121 +++ demos/offline_first_todolist/README.md | 55 ++ .../analysis_options.yaml | 29 + .../offline_first_todolist/android/.gitignore | 13 + .../android/app/build.gradle | 70 ++ .../android/app/src/debug/AndroidManifest.xml | 4 + .../android/app/src/main/AndroidManifest.xml | 34 + .../co/powersync/demotodolist/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 4 + .../android/build.gradle | 31 + .../android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../android/settings.gradle | 11 + demos/offline_first_todolist/database.sql | 71 ++ demos/offline_first_todolist/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../ios/Flutter/Debug.xcconfig | 2 + .../ios/Flutter/Release.xcconfig | 2 + demos/offline_first_todolist/ios/Podfile | 48 + demos/offline_first_todolist/ios/Podfile.lock | 85 ++ .../ios/Runner.xcodeproj/project.pbxproj | 552 ++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/Info.plist | 55 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../lib/app_config_template.dart | 7 + demos/offline_first_todolist/lib/main.dart | 135 +++ .../lib/models/schema.dart | 87 ++ .../lib/models/sync_mode.dart | 48 + .../lib/models/todo_item.dart | 43 + .../lib/models/todo_list.dart | 108 +++ .../offline_first_todolist/lib/powersync.dart | 211 +++++ .../offline_first_todolist/lib/supabase.dart | 10 + .../lib/widgets/list_item.dart | 59 ++ .../lib/widgets/list_item_dialog.dart | 60 ++ .../lib/widgets/lists_page.dart | 88 ++ .../lib/widgets/login_page.dart | 131 +++ .../lib/widgets/query_widget.dart | 99 +++ .../lib/widgets/resultset_table.dart | 39 + .../lib/widgets/signup_page.dart | 125 +++ .../lib/widgets/status_app_bar.dart | 102 +++ .../lib/widgets/todo_item_dialog.dart | 65 ++ .../lib/widgets/todo_item_widget.dart | 54 ++ .../lib/widgets/todo_list_page.dart | 89 ++ demos/offline_first_todolist/linux/.gitignore | 1 + .../linux/CMakeLists.txt | 138 +++ .../linux/flutter/CMakeLists.txt | 88 ++ .../flutter/generated_plugin_registrant.cc | 27 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 27 + demos/offline_first_todolist/linux/main.cc | 6 + .../linux/my_application.cc | 104 +++ .../linux/my_application.h | 18 + demos/offline_first_todolist/macos/.gitignore | 7 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 22 + demos/offline_first_todolist/macos/Podfile | 43 + .../offline_first_todolist/macos/Podfile.lock | 79 ++ .../macos/Runner.xcodeproj/project.pbxproj | 801 +++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 98 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../macos/Runner/AppDelegate.swift | 9 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 ++++++++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../macos/Runner/Release.entitlements | 8 + .../macos/RunnerTests/RunnerTests.swift | 12 + demos/offline_first_todolist/pubspec.lock | 831 ++++++++++++++++++ demos/offline_first_todolist/pubspec.yaml | 30 + .../test/widget_test.dart | 30 + demos/offline_first_todolist/web/favicon.png | Bin 0 -> 917 bytes .../web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes demos/offline_first_todolist/web/index.html | 59 ++ .../offline_first_todolist/web/manifest.json | 35 + .../offline_first_todolist/windows/.gitignore | 17 + .../windows/CMakeLists.txt | 101 +++ .../windows/flutter/CMakeLists.txt | 104 +++ .../flutter/generated_plugin_registrant.cc | 23 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 27 + .../windows/runner/CMakeLists.txt | 40 + .../windows/runner/Runner.rc | 121 +++ .../windows/runner/flutter_window.cpp | 66 ++ .../windows/runner/flutter_window.h | 33 + .../windows/runner/main.cpp | 43 + .../windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 20 + .../windows/runner/utils.cpp | 64 ++ .../windows/runner/utils.h | 19 + .../windows/runner/win32_window.cpp | 288 ++++++ .../windows/runner/win32_window.h | 102 +++ 151 files changed, 7442 insertions(+) create mode 100644 demos/offline_first_todolist/.gitignore create mode 100644 demos/offline_first_todolist/.metadata create mode 100644 demos/offline_first_todolist/LICENSE create mode 100644 demos/offline_first_todolist/README.md create mode 100644 demos/offline_first_todolist/analysis_options.yaml create mode 100644 demos/offline_first_todolist/android/.gitignore create mode 100644 demos/offline_first_todolist/android/app/build.gradle create mode 100644 demos/offline_first_todolist/android/app/src/debug/AndroidManifest.xml create mode 100644 demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml create mode 100644 demos/offline_first_todolist/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt create mode 100644 demos/offline_first_todolist/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 demos/offline_first_todolist/android/app/src/main/res/drawable/launch_background.xml create mode 100644 demos/offline_first_todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demos/offline_first_todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demos/offline_first_todolist/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demos/offline_first_todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demos/offline_first_todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demos/offline_first_todolist/android/app/src/main/res/values-night/styles.xml create mode 100644 demos/offline_first_todolist/android/app/src/main/res/values/styles.xml create mode 100644 demos/offline_first_todolist/android/app/src/profile/AndroidManifest.xml create mode 100644 demos/offline_first_todolist/android/build.gradle create mode 100644 demos/offline_first_todolist/android/gradle.properties create mode 100644 demos/offline_first_todolist/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 demos/offline_first_todolist/android/settings.gradle create mode 100644 demos/offline_first_todolist/database.sql create mode 100644 demos/offline_first_todolist/ios/.gitignore create mode 100644 demos/offline_first_todolist/ios/Flutter/AppFrameworkInfo.plist create mode 100644 demos/offline_first_todolist/ios/Flutter/Debug.xcconfig create mode 100644 demos/offline_first_todolist/ios/Flutter/Release.xcconfig create mode 100644 demos/offline_first_todolist/ios/Podfile create mode 100644 demos/offline_first_todolist/ios/Podfile.lock create mode 100644 demos/offline_first_todolist/ios/Runner.xcodeproj/project.pbxproj create mode 100644 demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 demos/offline_first_todolist/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 demos/offline_first_todolist/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 demos/offline_first_todolist/ios/Runner/AppDelegate.swift create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 demos/offline_first_todolist/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 demos/offline_first_todolist/ios/Runner/Base.lproj/Main.storyboard create mode 100644 demos/offline_first_todolist/ios/Runner/Info.plist create mode 100644 demos/offline_first_todolist/ios/Runner/Runner-Bridging-Header.h create mode 100644 demos/offline_first_todolist/lib/app_config_template.dart create mode 100644 demos/offline_first_todolist/lib/main.dart create mode 100644 demos/offline_first_todolist/lib/models/schema.dart create mode 100644 demos/offline_first_todolist/lib/models/sync_mode.dart create mode 100644 demos/offline_first_todolist/lib/models/todo_item.dart create mode 100644 demos/offline_first_todolist/lib/models/todo_list.dart create mode 100644 demos/offline_first_todolist/lib/powersync.dart create mode 100644 demos/offline_first_todolist/lib/supabase.dart create mode 100644 demos/offline_first_todolist/lib/widgets/list_item.dart create mode 100644 demos/offline_first_todolist/lib/widgets/list_item_dialog.dart create mode 100644 demos/offline_first_todolist/lib/widgets/lists_page.dart create mode 100644 demos/offline_first_todolist/lib/widgets/login_page.dart create mode 100644 demos/offline_first_todolist/lib/widgets/query_widget.dart create mode 100644 demos/offline_first_todolist/lib/widgets/resultset_table.dart create mode 100644 demos/offline_first_todolist/lib/widgets/signup_page.dart create mode 100644 demos/offline_first_todolist/lib/widgets/status_app_bar.dart create mode 100644 demos/offline_first_todolist/lib/widgets/todo_item_dialog.dart create mode 100644 demos/offline_first_todolist/lib/widgets/todo_item_widget.dart create mode 100644 demos/offline_first_todolist/lib/widgets/todo_list_page.dart create mode 100644 demos/offline_first_todolist/linux/.gitignore create mode 100644 demos/offline_first_todolist/linux/CMakeLists.txt create mode 100644 demos/offline_first_todolist/linux/flutter/CMakeLists.txt create mode 100644 demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.cc create mode 100644 demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.h create mode 100644 demos/offline_first_todolist/linux/flutter/generated_plugins.cmake create mode 100644 demos/offline_first_todolist/linux/main.cc create mode 100644 demos/offline_first_todolist/linux/my_application.cc create mode 100644 demos/offline_first_todolist/linux/my_application.h create mode 100644 demos/offline_first_todolist/macos/.gitignore create mode 100644 demos/offline_first_todolist/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 demos/offline_first_todolist/macos/Flutter/Flutter-Release.xcconfig create mode 100644 demos/offline_first_todolist/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 demos/offline_first_todolist/macos/Podfile create mode 100644 demos/offline_first_todolist/macos/Podfile.lock create mode 100644 demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj create mode 100644 demos/offline_first_todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 demos/offline_first_todolist/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 demos/offline_first_todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demos/offline_first_todolist/macos/Runner/AppDelegate.swift create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 demos/offline_first_todolist/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 demos/offline_first_todolist/macos/Runner/Configs/Debug.xcconfig create mode 100644 demos/offline_first_todolist/macos/Runner/Configs/Release.xcconfig create mode 100644 demos/offline_first_todolist/macos/Runner/Configs/Warnings.xcconfig create mode 100644 demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements create mode 100644 demos/offline_first_todolist/macos/Runner/Info.plist create mode 100644 demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift create mode 100644 demos/offline_first_todolist/macos/Runner/Release.entitlements create mode 100644 demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift create mode 100644 demos/offline_first_todolist/pubspec.lock create mode 100644 demos/offline_first_todolist/pubspec.yaml create mode 100644 demos/offline_first_todolist/test/widget_test.dart create mode 100644 demos/offline_first_todolist/web/favicon.png create mode 100644 demos/offline_first_todolist/web/icons/Icon-192.png create mode 100644 demos/offline_first_todolist/web/icons/Icon-512.png create mode 100644 demos/offline_first_todolist/web/icons/Icon-maskable-192.png create mode 100644 demos/offline_first_todolist/web/icons/Icon-maskable-512.png create mode 100644 demos/offline_first_todolist/web/index.html create mode 100644 demos/offline_first_todolist/web/manifest.json create mode 100644 demos/offline_first_todolist/windows/.gitignore create mode 100644 demos/offline_first_todolist/windows/CMakeLists.txt create mode 100644 demos/offline_first_todolist/windows/flutter/CMakeLists.txt create mode 100644 demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.cc create mode 100644 demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.h create mode 100644 demos/offline_first_todolist/windows/flutter/generated_plugins.cmake create mode 100644 demos/offline_first_todolist/windows/runner/CMakeLists.txt create mode 100644 demos/offline_first_todolist/windows/runner/Runner.rc create mode 100644 demos/offline_first_todolist/windows/runner/flutter_window.cpp create mode 100644 demos/offline_first_todolist/windows/runner/flutter_window.h create mode 100644 demos/offline_first_todolist/windows/runner/main.cpp create mode 100644 demos/offline_first_todolist/windows/runner/resource.h create mode 100644 demos/offline_first_todolist/windows/runner/resources/app_icon.ico create mode 100644 demos/offline_first_todolist/windows/runner/runner.exe.manifest create mode 100644 demos/offline_first_todolist/windows/runner/utils.cpp create mode 100644 demos/offline_first_todolist/windows/runner/utils.h create mode 100644 demos/offline_first_todolist/windows/runner/win32_window.cpp create mode 100644 demos/offline_first_todolist/windows/runner/win32_window.h diff --git a/demos/offline_first_todolist/.gitignore b/demos/offline_first_todolist/.gitignore new file mode 100644 index 00000000..1a825b5b --- /dev/null +++ b/demos/offline_first_todolist/.gitignore @@ -0,0 +1,50 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release + +# asdf +.tool-versions + +# secrets +app_config.dart \ No newline at end of file diff --git a/demos/offline_first_todolist/.metadata b/demos/offline_first_todolist/.metadata new file mode 100644 index 00000000..135a1daa --- /dev/null +++ b/demos/offline_first_todolist/.metadata @@ -0,0 +1,30 @@ +# 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: "5dcb86f68f239346676ceb1ed1ea385bd215fba1" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + - platform: macos + create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/demos/offline_first_todolist/LICENSE b/demos/offline_first_todolist/LICENSE new file mode 100644 index 00000000..0e259d42 --- /dev/null +++ b/demos/offline_first_todolist/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/demos/offline_first_todolist/README.md b/demos/offline_first_todolist/README.md new file mode 100644 index 00000000..835e4b9a --- /dev/null +++ b/demos/offline_first_todolist/README.md @@ -0,0 +1,55 @@ +# PowerSync + Supabase Flutter Offline to Online Mode Demo: Todo List App + +This demo app is an extension of the Flutter Todo List App that demonstrates how to use the PowerSync SDK for Flutter in an offline first way. It allows the user to use the app offline without having to sign in. After signing in data that was kept offline is synced up, and if the user had any data already uploaded that would be synced down. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). + +# Running the app + +Ensure you have [melos](https://melos.invertase.dev/~melos-latest/getting-started) installed. + +1. `cd demos/offline-first-todolist` +2. `melos prepare` +3. `cp lib/app_config_template.dart lib/app_config.dart` +4. Insert your Supabase and PowerSync project credentials into `lib/app_config.dart` (See instructions below) +5. `flutter run` + +# Set up Supabase Project + +Create a new Supabase project, and paste an run the contents of [database.sql](./database.sql) in the Supabase SQL editor. + +It does the following: + +1. Create `lists` and `todos` tables. +2. Create a publication called `powersync` for `lists` and `todos`. +3. Enable row level security, allowing users to only view and edit their own data. +4. Create a trigger to populate some sample data when an user registers. + +# Set up PowerSync Instance + +Create a new PowerSync instance, connecting to the database of the Supabase project. + +Then deploy the following sync rules: + +```yaml +bucket_definitions: + user_lists: + # Separate bucket per todo list + parameters: select id as list_id from lists where owner_id = token_parameters.user_id + data: + - select * from lists where id = bucket.list_id + - select * from todos where list_id = bucket.list_id +``` + +# Configure the app + +Insert the credentials of your new Supabase and PowerSync projects into `lib/app_config.dart` + +# Explanation + +The demo implements offline and online modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). The app initially starts in offline mode with the offline schema. When the user signs in, the database schema is updated to the online schema, and the data is migrated to enable synchronization.xww + +After this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). + +## Limitations + +`updateSchema` cannot be called inside a transaction, and it's recommended to perform the schema update when the database isn't connected. +Additionally, the current implementation of the PowerSync SDK's `watch` method may not correctly track tables that are altered by `updateSchema`. As a result, you will likely need to refresh your `watch` calls after the schema update is complete. In this demo, the `watch` calls are refreshed by navigating to the login and signup pages after the user successfully logs in and the schema update is finished. diff --git a/demos/offline_first_todolist/analysis_options.yaml b/demos/offline_first_todolist/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/demos/offline_first_todolist/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/demos/offline_first_todolist/android/.gitignore b/demos/offline_first_todolist/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/demos/offline_first_todolist/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +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/demos/offline_first_todolist/android/app/build.gradle b/demos/offline_first_todolist/android/app/build.gradle new file mode 100644 index 00000000..9daa778b --- /dev/null +++ b/demos/offline_first_todolist/android/app/build.gradle @@ -0,0 +1,70 @@ +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 plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + applicationId "co.powersync.demotodolist" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion 24 + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + 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 { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/demos/offline_first_todolist/android/app/src/debug/AndroidManifest.xml b/demos/offline_first_todolist/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..f19dd7d6 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + diff --git a/demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml b/demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..55e175c4 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt b/demos/offline_first_todolist/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt new file mode 100644 index 00000000..88fda765 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt @@ -0,0 +1,6 @@ +package co.powersync.demotodolist + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/demos/offline_first_todolist/android/app/src/main/res/drawable-v21/launch_background.xml b/demos/offline_first_todolist/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/demos/offline_first_todolist/android/app/src/main/res/drawable/launch_background.xml b/demos/offline_first_todolist/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/demos/offline_first_todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/demos/offline_first_todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch 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{ literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/demos/offline_first_todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch 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)$ literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demos/offline_first_todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/demos/offline_first_todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch 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` literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/android/app/src/main/res/values-night/styles.xml b/demos/offline_first_todolist/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/demos/offline_first_todolist/android/app/src/main/res/values/styles.xml b/demos/offline_first_todolist/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/demos/offline_first_todolist/android/app/src/profile/AndroidManifest.xml b/demos/offline_first_todolist/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..f19dd7d6 --- /dev/null +++ b/demos/offline_first_todolist/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + diff --git a/demos/offline_first_todolist/android/build.gradle b/demos/offline_first_todolist/android/build.gradle new file mode 100644 index 00000000..713d7f6e --- /dev/null +++ b/demos/offline_first_todolist/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.2.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/demos/offline_first_todolist/android/gradle.properties b/demos/offline_first_todolist/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/demos/offline_first_todolist/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/demos/offline_first_todolist/android/gradle/wrapper/gradle-wrapper.properties b/demos/offline_first_todolist/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..3c472b99 --- /dev/null +++ b/demos/offline_first_todolist/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/demos/offline_first_todolist/android/settings.gradle b/demos/offline_first_todolist/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/demos/offline_first_todolist/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +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/demos/offline_first_todolist/database.sql b/demos/offline_first_todolist/database.sql new file mode 100644 index 00000000..eecc9768 --- /dev/null +++ b/demos/offline_first_todolist/database.sql @@ -0,0 +1,71 @@ +-- Create tables +create table + public.lists ( + id uuid not null default gen_random_uuid (), + created_at timestamp with time zone not null default now(), + name text not null, + owner_id uuid not null, + constraint lists_pkey primary key (id), + constraint lists_owner_id_fkey foreign key (owner_id) references auth.users (id) on delete cascade + ) tablespace pg_default; + +create table + public.todos ( + id uuid not null default gen_random_uuid (), + created_at timestamp with time zone not null default now(), + completed_at timestamp with time zone null, + description text not null, + completed boolean not null default false, + created_by uuid null, + completed_by uuid null, + list_id uuid not null, + photo_id uuid null, + constraint todos_pkey primary key (id), + constraint todos_created_by_fkey foreign key (created_by) references auth.users (id) on delete set null, + constraint todos_completed_by_fkey foreign key (completed_by) references auth.users (id) on delete set null, + constraint todos_list_id_fkey foreign key (list_id) references lists (id) on delete cascade + ) tablespace pg_default; + +-- Create publication for powersync +create publication powersync for table lists, todos; + +-- Set up Row Level Security (RLS) +-- See https://supabase.com/docs/guides/auth/row-level-security for more details. +alter table public.lists + enable row level security; + +alter table public.todos + enable row level security; + +create policy "owned lists" on public.lists for ALL using ( + auth.uid() = owner_id +); + +create policy "todos in owned lists" on public.todos for ALL using ( + auth.uid() IN ( + SELECT lists.owner_id FROM lists WHERE (lists.id = todos.list_id) + ) +); + +-- This trigger automatically creates some sample data when a user registers. +-- See https://supabase.com/docs/guides/auth/managing-user-data#using-triggers for more details. +create function public.handle_new_user_sample_data() +returns trigger as $$ +declare + new_list_id uuid; +begin + insert into public.lists (name, owner_id) + values ('Shopping list', new.id) + returning id into new_list_id; + + insert into public.todos(description, list_id, created_by) + values ('Bread', new_list_id, new.id); + + insert into public.todos(description, list_id, created_by) + values ('Apples', new_list_id, new.id); + + return new; +end; +$$ language plpgsql security definer; + +create trigger new_user_sample_data after insert on auth.users for each row execute procedure public.handle_new_user_sample_data(); diff --git a/demos/offline_first_todolist/ios/.gitignore b/demos/offline_first_todolist/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/demos/offline_first_todolist/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*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 diff --git a/demos/offline_first_todolist/ios/Flutter/AppFrameworkInfo.plist b/demos/offline_first_todolist/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..7c569640 --- /dev/null +++ b/demos/offline_first_todolist/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/demos/offline_first_todolist/ios/Flutter/Debug.xcconfig b/demos/offline_first_todolist/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/demos/offline_first_todolist/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/demos/offline_first_todolist/ios/Flutter/Release.xcconfig b/demos/offline_first_todolist/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/demos/offline_first_todolist/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/demos/offline_first_todolist/ios/Podfile b/demos/offline_first_todolist/ios/Podfile new file mode 100644 index 00000000..e9f73048 --- /dev/null +++ b/demos/offline_first_todolist/ios/Podfile @@ -0,0 +1,48 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '12.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 |project| + flutter_additional_ios_build_settings(project) + end + installer.generated_projects.each do |project| + project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + end + end + end +end diff --git a/demos/offline_first_todolist/ios/Podfile.lock b/demos/offline_first_todolist/ios/Podfile.lock new file mode 100644 index 00000000..3440e3db --- /dev/null +++ b/demos/offline_first_todolist/ios/Podfile.lock @@ -0,0 +1,85 @@ +PODS: + - app_links (0.0.1): + - Flutter + - camera_avfoundation (0.0.1): + - Flutter + - Flutter (1.0.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - powersync-sqlite-core (0.1.6) + - powersync_flutter_libs (0.0.1): + - Flutter + - powersync-sqlite-core (~> 0.1.6) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - "sqlite3 (3.46.0+1)": + - "sqlite3/common (= 3.46.0+1)" + - "sqlite3/common (3.46.0+1)" + - "sqlite3/dbstatvtab (3.46.0+1)": + - sqlite3/common + - "sqlite3/fts5 (3.46.0+1)": + - sqlite3/common + - "sqlite3/perf-threadsafe (3.46.0+1)": + - sqlite3/common + - "sqlite3/rtree (3.46.0+1)": + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - Flutter + - "sqlite3 (~> 3.46.0+1)" + - sqlite3/dbstatvtab + - sqlite3/fts5 + - sqlite3/perf-threadsafe + - sqlite3/rtree + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - app_links (from `.symlinks/plugins/app_links/ios`) + - camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`) + - Flutter (from `Flutter`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - powersync_flutter_libs (from `.symlinks/plugins/powersync_flutter_libs/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - powersync-sqlite-core + - sqlite3 + +EXTERNAL SOURCES: + app_links: + :path: ".symlinks/plugins/app_links/ios" + camera_avfoundation: + :path: ".symlinks/plugins/camera_avfoundation/ios" + Flutter: + :path: Flutter + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + powersync_flutter_libs: + :path: ".symlinks/plugins/powersync_flutter_libs/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + sqlite3_flutter_libs: + :path: ".symlinks/plugins/sqlite3_flutter_libs/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + app_links: e70ca16b4b0f88253b3b3660200d4a10b4ea9795 + camera_avfoundation: 759172d1a77ae7be0de08fc104cfb79738b8a59e + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + powersync-sqlite-core: 4c38c8f470f6dca61346789fd5436a6826d1e3dd + powersync_flutter_libs: 5d6b132a398de442c0853a8b14bfbb62cd4ff5a1 + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 + sqlite3_flutter_libs: c00457ebd31e59fa6bb830380ddba24d44fbcd3b + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + +PODFILE CHECKSUM: f7b3cb7384a2d5da4b22b090e1f632de7f377987 + +COCOAPODS: 1.15.2 diff --git a/demos/offline_first_todolist/ios/Runner.xcodeproj/project.pbxproj b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..16636b7a --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,552 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + 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 */; }; + 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 */; }; + B2C70762C97CE3E3CEB912CB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B9CC0EA1BA15CD3CCAD0356 /* Pods_Runner.framework */; }; +/* 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 = ""; }; + 15764CEB058B2B69D5E35280 /* 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 = ""; }; + 3153F415177CAE497AE7D235 /* 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 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 = ""; }; + 7B9CC0EA1BA15CD3CCAD0356 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 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; }; + 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 = ""; }; + CDF8C9971FE1B0CF3262ED53 /* 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 = ( + B2C70762C97CE3E3CEB912CB /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + A151B04DC3D1415EEF784588 /* Pods */, + C1E97B63847FB6B811E12FEA /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + A151B04DC3D1415EEF784588 /* Pods */ = { + isa = PBXGroup; + children = ( + 3153F415177CAE497AE7D235 /* Pods-Runner.debug.xcconfig */, + CDF8C9971FE1B0CF3262ED53 /* Pods-Runner.release.xcconfig */, + 15764CEB058B2B69D5E35280 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + C1E97B63847FB6B811E12FEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7B9CC0EA1BA15CD3CCAD0356 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + E916CBFE94483EF7C2F17F6C /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 0A5FBCADCBC1AF2E0353A84D /* [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 = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + 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 */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0A5FBCADCBC1AF2E0353A84D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + 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"; + }; + E916CBFE94483EF7C2F17F6C /* [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; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift 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 = 12.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 = co.powersync.demotodolist; + 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_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 = 12.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 = 12.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; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 6WA62GTJNA; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.powersync.demotodolist; + 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; + }; + 97C147071CF9000F007C117D /* Release */ = { + 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 = co.powersync.demotodolist; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + 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/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/demos/offline_first_todolist/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demos/offline_first_todolist/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..5e31d3d3 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/ios/Runner.xcworkspace/contents.xcworkspacedata b/demos/offline_first_todolist/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/demos/offline_first_todolist/ios/Runner/AppDelegate.swift b/demos/offline_first_todolist/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/demos/offline_first_todolist/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/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "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/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# 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/demos/offline_first_todolist/ios/Runner/Base.lproj/LaunchScreen.storyboard b/demos/offline_first_todolist/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/ios/Runner/Base.lproj/Main.storyboard b/demos/offline_first_todolist/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/ios/Runner/Info.plist b/demos/offline_first_todolist/ios/Runner/Info.plist new file mode 100644 index 00000000..fc3bb480 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Info.plist @@ -0,0 +1,55 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Powersync Flutter Demo + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + powersync_flutter_demo + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSCameraUsageDescription + Use for todos + NSMicrophoneUsageDescription + Use for todos + + diff --git a/demos/offline_first_todolist/ios/Runner/Runner-Bridging-Header.h b/demos/offline_first_todolist/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/demos/offline_first_todolist/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/demos/offline_first_todolist/lib/app_config_template.dart b/demos/offline_first_todolist/lib/app_config_template.dart new file mode 100644 index 00000000..d7ead31d --- /dev/null +++ b/demos/offline_first_todolist/lib/app_config_template.dart @@ -0,0 +1,7 @@ +// Copy this template: `cp lib/app_config_template.dart lib/app_config.dart` +// Edit lib/app_config.dart and enter your Supabase and PowerSync project details. +class AppConfig { + static const String supabaseUrl = 'https://foo.supabase.co'; + static const String supabaseAnonKey = 'foo'; + static const String powersyncUrl = 'https://foo.powersync.journeyapps.com'; +} diff --git a/demos/offline_first_todolist/lib/main.dart b/demos/offline_first_todolist/lib/main.dart new file mode 100644 index 00000000..607498fb --- /dev/null +++ b/demos/offline_first_todolist/lib/main.dart @@ -0,0 +1,135 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import 'package:powersync_flutter_offline_first_demo/models/schema.dart'; +import 'package:powersync_flutter_offline_first_demo/models/sync_mode.dart'; + +import './powersync.dart'; +import './widgets/lists_page.dart'; +import './widgets/login_page.dart'; +import './widgets/query_widget.dart'; +import './widgets/signup_page.dart'; +import './widgets/status_app_bar.dart'; + +void main() async { + Logger.root.level = Level.INFO; + Logger.root.onRecord.listen((record) { + if (kDebugMode) { + print( + '[${record.loggerName}] ${record.level.name}: ${record.time}: ${record.message}'); + + if (record.error != null) { + print(record.error); + } + if (record.stackTrace != null) { + print(record.stackTrace); + } + } + }); + + WidgetsFlutterBinding + .ensureInitialized(); //required to get sqlite filepath from path_provider before UI has initialized + await openSyncModeDatabase(); // Special sqlite used to determine config for the PowerSync database + await openDatabase(); + + final loggedIn = isLoggedIn(); + runApp(MyApp(loggedIn: loggedIn)); +} + +const defaultQuery = 'SELECT * from $todosTable'; + +const listsPage = ListsPage(); +const homePage = listsPage; + +const sqlConsolePage = Scaffold( + appBar: StatusAppBar(title: 'SQL Console'), + body: QueryWidget(defaultQuery: defaultQuery)); + +const loginPage = LoginPage(); + +const signupPage = SignupPage(); + +class MyApp extends StatelessWidget { + final bool loggedIn; + + const MyApp({super.key, required this.loggedIn}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'PowerSync Flutter Offline First Demo', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: homePage); + } +} + +class MyHomePage extends StatelessWidget { + const MyHomePage( + {super.key, + required this.title, + required this.content, + this.floatingActionButton}); + + final String title; + final Widget content; + final Widget? floatingActionButton; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: StatusAppBar(title: title), + body: Center(child: content), + floatingActionButton: floatingActionButton, + drawer: Drawer( + // Add a ListView to the drawer. This ensures the user can scroll + // through the options in the drawer if there isn't enough vertical + // space to fit everything. + child: ListView( + // Important: Remove any padding from the ListView. + padding: EdgeInsets.zero, + children: [ + const DrawerHeader( + decoration: BoxDecoration( + color: Colors.blue, + ), + child: Text(''), + ), + ListTile( + title: const Text('SQL Console'), + onTap: () { + var navigator = Navigator.of(context); + navigator.pop(); + + navigator.push(MaterialPageRoute( + builder: (context) => sqlConsolePage, + )); + }, + ), + ListTile( + title: + isLoggedIn() ? const Text('Sign Out') : const Text('Sign In'), + onTap: () async { + var navigator = Navigator.of(context); + navigator.pop(); + + if (isLoggedIn()) { + await logout(); + + navigator.pushReplacement(MaterialPageRoute( + builder: (context) => listsPage, + )); + } else { + navigator.pushReplacement(MaterialPageRoute( + builder: (context) => loginPage, + )); + } + }, + ), + ], + ), + ), + ); + } +} diff --git a/demos/offline_first_todolist/lib/models/schema.dart b/demos/offline_first_todolist/lib/models/schema.dart new file mode 100644 index 00000000..34eaa840 --- /dev/null +++ b/demos/offline_first_todolist/lib/models/schema.dart @@ -0,0 +1,87 @@ +import 'package:powersync/powersync.dart'; +import 'package:powersync_flutter_offline_first_demo/models/sync_mode.dart'; + +/// The schema contains two copies of each table - a local-only one, and +/// a online/synced one. Depending on the 'online' flag, one of those gets +/// the main 'lists' / 'todos' view name. +/// +/// For offline, the views become: +/// online_todos +/// todos +/// online_lists +/// lists +/// For online, we have these views: +/// todos +/// local_todos +/// lists +/// local_lists +/// + +const todosTable = 'todos'; +const listsTable = 'lists'; + +Schema makeSchema({online = bool}) { + String onlineName(String table) { + if (online) { + return table; + } else { + return "online_$table"; + } + } + + String localName(String table) { + if (online) { + return "local_$table"; + } else { + return table; + } + } + + final tables = [ + const Table(todosTable, [ + Column.text('list_id'), + Column.text('created_at'), + Column.text('completed_at'), + Column.text('description'), + Column.integer('completed'), + Column.text('created_by'), + Column.text('completed_by'), + ], indexes: [ + // Index to allow efficient lookup within a list + Index('list', [IndexedColumn('list_id')]) + ]), + const Table(listsTable, [ + Column.text('created_at'), + Column.text('name'), + Column.text('owner_id') + ]) + ]; + + return Schema([ + for (var table in tables) + Table(table.name, table.columns, + indexes: table.indexes, viewName: onlineName(table.name)), + for (var table in tables) + Table.localOnly('local_${table.name}', table.columns, + indexes: table.indexes, viewName: localName(table.name)) + ]); +} + +switchToOnlineSchema(PowerSyncDatabase db, String userId) async { + await db.updateSchema(makeSchema(online: true)); + await setSyncMode(true); + + await db.writeTransaction((tx) async { + // Copy local data to the "online" views. + // This records each operation to the crud queue. + await tx.execute( + 'INSERT INTO lists(id, name, created_at, owner_id) SELECT id, name, created_at, ? FROM local_lists', + [userId]); + + await tx.execute('INSERT INTO $todosTable SELECT * FROM local_$todosTable'); + + // Delete the "offline-only" data. + await tx.execute('DELETE FROM local_$todosTable'); + await tx.execute('DELETE FROM local_$listsTable'); + }); +} diff --git a/demos/offline_first_todolist/lib/models/sync_mode.dart b/demos/offline_first_todolist/lib/models/sync_mode.dart new file mode 100644 index 00000000..e066a45e --- /dev/null +++ b/demos/offline_first_todolist/lib/models/sync_mode.dart @@ -0,0 +1,48 @@ +import 'package:flutter/foundation.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:powersync/sqlite_async.dart'; + +final migrations = SqliteMigrations() + ..add(SqliteMigration(1, (tx) async { + await tx.execute( + 'CREATE TABLE local_system(id INTEGER PRIMARY KEY, sync_enabled INTEGER)'); + })); + +late final SqliteDatabase sqliteDb; + +/// Using a local database to determine which schema to use in the PowerSync database +/// Any other form of local storage could work here. +openSyncModeDatabase() async { + const dbFilename = 'system.db'; + var path = ''; + // getApplicationSupportDirectory is not supported on Web + if (kIsWeb) { + path = dbFilename; + } else { + final dir = await getApplicationSupportDirectory(); + path = join(dir.path, dbFilename); + } + + sqliteDb = SqliteDatabase(path: path); + await migrations.migrate(sqliteDb); +} + +Future getSyncMode() async { + var rows = await sqliteDb + .getAll('SELECT sync_enabled from local_system where id = 1'); + + if (rows.isEmpty) { + await setSyncMode(false); + return false; + } + + return rows[0]['sync_enabled'] == 'TRUE'; +} + +setSyncMode(bool enabled) async { + var enabledString = enabled ? "TRUE" : "FALSE"; + await sqliteDb.execute( + 'INSERT OR REPLACE INTO local_system(id, sync_enabled) VALUES (1, ?);', + [enabledString]); +} diff --git a/demos/offline_first_todolist/lib/models/todo_item.dart b/demos/offline_first_todolist/lib/models/todo_item.dart new file mode 100644 index 00000000..49738ef6 --- /dev/null +++ b/demos/offline_first_todolist/lib/models/todo_item.dart @@ -0,0 +1,43 @@ +import 'package:powersync_flutter_offline_first_demo/models/schema.dart'; + +import '../powersync.dart'; +import 'package:powersync/sqlite3_common.dart' as sqlite; + +/// TodoItem represents a result row of a query on "todos". +/// +/// This class is immutable - methods on this class do not modify the instance +/// directly. Instead, watch or re-query the data to get the updated item. +class TodoItem { + final String id; + final String description; + final bool completed; + + TodoItem({ + required this.id, + required this.description, + required this.completed, + }); + + factory TodoItem.fromRow(sqlite.Row row) { + return TodoItem( + id: row['id'], + description: row['description'], + completed: row['completed'] == 1); + } + + Future toggle() async { + if (completed) { + await db.execute( + 'UPDATE $todosTable SET completed = FALSE, completed_by = NULL, completed_at = NULL WHERE id = ?', + [id]); + } else { + await db.execute( + 'UPDATE $todosTable SET completed = TRUE, completed_by = ?, completed_at = datetime() WHERE id = ?', + [getUserId(), id]); + } + } + + Future delete() async { + await db.execute('DELETE FROM $todosTable WHERE id = ?', [id]); + } +} diff --git a/demos/offline_first_todolist/lib/models/todo_list.dart b/demos/offline_first_todolist/lib/models/todo_list.dart new file mode 100644 index 00000000..86170e02 --- /dev/null +++ b/demos/offline_first_todolist/lib/models/todo_list.dart @@ -0,0 +1,108 @@ +import 'package:powersync/powersync.dart'; +import 'package:powersync/sqlite3_common.dart' as sqlite; + +import './todo_item.dart'; +import '../powersync.dart'; + +/// TodoList represents a result row of a query on "lists". +/// +/// This class is immutable - methods on this class do not modify the instance +/// directly. Instead, watch or re-query the data to get the updated list. +class TodoList { + /// List id (UUID). + final String id; + + /// Descriptive name. + final String name; + + /// Number of completed todos in this list. + final int? completedCount; + + /// Number of pending todos in this list. + final int? pendingCount; + + TodoList( + {required this.id, + required this.name, + this.completedCount, + this.pendingCount}); + + factory TodoList.fromRow(sqlite.Row row) { + return TodoList( + id: row['id'], + name: row['name'], + completedCount: row['completed_count'], + pendingCount: row['pending_count']); + } + + /// Watch all lists. + static Stream> watchLists() { + // This query is automatically re-run when data in "lists" or "todos" is modified. + return db + .watch('SELECT * FROM lists ORDER BY created_at, id') + .map((results) { + return results.map(TodoList.fromRow).toList(growable: false); + }); + } + + /// Watch all lists, with [completedCount] and [pendingCount] populated. + static Stream> watchListsWithStats() { + // This query is automatically re-run when data in "lists" or "todos" is modified. + return db.watch(''' + SELECT + *, + (SELECT count() FROM todos WHERE list_id = lists.id AND completed = TRUE) as completed_count, + (SELECT count() FROM todos WHERE list_id = lists.id AND completed = FALSE) as pending_count + FROM lists + ORDER BY created_at + ''').map((results) { + return results.map(TodoList.fromRow).toList(growable: false); + }); + } + + static Stream watchSyncStatus() { + return db.statusStream; + } + + /// Create a new list + static Future create(String name) async { + final results = await db.execute(''' + INSERT INTO + lists(id, created_at, name, owner_id) + VALUES(uuid(), datetime(), ?, ?) + RETURNING * + ''', [name, getUserId()]); + return TodoList.fromRow(results.first); + } + + /// Watch items within this list. + Stream> watchItems() { + return db.watch( + 'SELECT * FROM todos WHERE list_id = ? ORDER BY created_at DESC, id', + parameters: [id]).map((event) { + return event.map(TodoItem.fromRow).toList(growable: false); + }); + } + + /// Delete this list. + Future delete() async { + await db.execute('DELETE FROM lists WHERE id = ?', [id]); + } + + /// Find list item. + static Future find(id) async { + final results = await db.get('SELECT * FROM lists WHERE id = ?', [id]); + return TodoList.fromRow(results); + } + + /// Add a new todo item to this list. + Future add(String description) async { + final results = await db.execute(''' + INSERT INTO + todos(id, created_at, completed, list_id, description, created_by) + VALUES(uuid(), datetime(), FALSE, ?, ?, ?) + RETURNING * + ''', [id, description, getUserId()]); + return TodoItem.fromRow(results.first); + } +} diff --git a/demos/offline_first_todolist/lib/powersync.dart b/demos/offline_first_todolist/lib/powersync.dart new file mode 100644 index 00000000..9a9a8e7c --- /dev/null +++ b/demos/offline_first_todolist/lib/powersync.dart @@ -0,0 +1,211 @@ +// This file performs setup of the PowerSync database +import 'package:flutter/foundation.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:powersync/powersync.dart'; +import 'package:powersync_flutter_offline_first_demo/models/sync_mode.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + +import './app_config.dart'; +import './models/schema.dart'; +import './supabase.dart'; + +final log = Logger('powersync-supabase'); + +/// Postgres Response codes that we cannot recover from by retrying. +final List fatalResponseCodes = [ + // Class 22 — Data Exception + // Examples include data type mismatch. + RegExp(r'^22...$'), + // Class 23 — Integrity Constraint Violation. + // Examples include NOT NULL, FOREIGN KEY and UNIQUE violations. + RegExp(r'^23...$'), + // INSUFFICIENT PRIVILEGE - typically a row-level security violation + RegExp(r'^42501$'), +]; + +/// Use Supabase for authentication and data upload. +class SupabaseConnector extends PowerSyncBackendConnector { + PowerSyncDatabase db; + + Future? _refreshFuture; + + SupabaseConnector(this.db); + + /// Get a Supabase token to authenticate against the PowerSync instance. + @override + Future fetchCredentials() async { + // Wait for pending session refresh if any + await _refreshFuture; + + // Use Supabase token for PowerSync + final session = Supabase.instance.client.auth.currentSession; + if (session == null) { + // Not logged in + return null; + } + + // Use the access token to authenticate against PowerSync + final token = session.accessToken; + + // userId and expiresAt are for debugging purposes only + final userId = session.user.id; + final expiresAt = session.expiresAt == null + ? null + : DateTime.fromMillisecondsSinceEpoch(session.expiresAt! * 1000); + return PowerSyncCredentials( + endpoint: AppConfig.powersyncUrl, + token: token, + userId: userId, + expiresAt: expiresAt); + } + + @override + void invalidateCredentials() { + // Trigger a session refresh if auth fails on PowerSync. + // Generally, sessions should be refreshed automatically by Supabase. + // However, in some cases it can be a while before the session refresh is + // retried. We attempt to trigger the refresh as soon as we get an auth + // failure on PowerSync. + // + // This could happen if the device was offline for a while and the session + // expired, and nothing else attempt to use the session it in the meantime. + // + // Timeout the refresh call to avoid waiting for long retries, + // and ignore any errors. Errors will surface as expired tokens. + _refreshFuture = Supabase.instance.client.auth + .refreshSession() + .timeout(const Duration(seconds: 5)) + .then((response) => null, onError: (error) => null); + } + + // Upload pending changes to Supabase. + @override + Future uploadData(PowerSyncDatabase database) async { + // This function is called whenever there is data to upload, whether the + // device is online or offline. + // If this call throws an error, it is retried periodically. + final transaction = await database.getNextCrudTransaction(); + if (transaction == null) { + return; + } + + final rest = Supabase.instance.client.rest; + CrudEntry? lastOp; + try { + // Note: If transactional consistency is important, use database functions + // or edge functions to process the entire transaction in a single call. + for (var op in transaction.crud) { + lastOp = op; + + final table = rest.from(op.table); + if (op.op == UpdateType.put) { + var data = Map.of(op.opData!); + data['id'] = op.id; + await table.upsert(data); + } else if (op.op == UpdateType.patch) { + await table.update(op.opData!).eq('id', op.id); + } else if (op.op == UpdateType.delete) { + await table.delete().eq('id', op.id); + } + } + + // All operations successful. + await transaction.complete(); + } on PostgrestException catch (e) { + if (e.code != null && + fatalResponseCodes.any((re) => re.hasMatch(e.code!))) { + /// Instead of blocking the queue with these errors, + /// discard the (rest of the) transaction. + /// + /// Note that these errors typically indicate a bug in the application. + /// If protecting against data loss is important, save the failing records + /// elsewhere instead of discarding, and/or notify the user. + log.severe('Data upload error - discarding $lastOp', e); + await transaction.complete(); + } else { + // Error may be retryable - e.g. network error or temporary server error. + // Throwing an error here causes this call to be retried after a delay. + rethrow; + } + } + } +} + +/// Global reference to the database +late PowerSyncDatabase db; + +bool isLoggedIn() { + return Supabase.instance.client.auth.currentSession?.accessToken != null; +} + +/// id of the user currently logged in +String getUserId() { + return Supabase.instance.client.auth.currentSession?.user.id ?? + '00000000-0000-0000-0000-000000000000'; // default ID supplied for offline mode +} + +Future getDatabasePath() async { + const dbFilename = 'powersync-demo.db'; + // getApplicationSupportDirectory is not supported on Web + if (kIsWeb) { + return dbFilename; + } + final dir = await getApplicationSupportDirectory(); + return join(dir.path, dbFilename); +} + +Future openDatabase() async { + var isSyncMode = await getSyncMode(); + db = PowerSyncDatabase( + schema: makeSchema(online: isSyncMode), + path: await getDatabasePath(), + logger: attachedLogger); + await db.initialize(); + + await loadSupabase(); + if (isLoggedIn()) { + // If the user is already logged in, connect immediately. + // Otherwise, connect once logged via login/signup view. + connectDatabase(); + } +} + +Future connectDatabase() async { + if (isLoggedIn()) { + log.severe("Can't connect database without being signed in"); + } + SupabaseConnector? currentConnector; + var isSyncMode = await getSyncMode(); + + if (!isSyncMode) { + await switchToOnlineSchema(db, getUserId()); + } + + currentConnector = SupabaseConnector(db); + db.connect(connector: currentConnector); + + Supabase.instance.client.auth.onAuthStateChange.listen((data) async { + final AuthChangeEvent event = data.event; + if (event == AuthChangeEvent.signedOut) { + // Implicit sign out - disconnect, but don't delete data + currentConnector = null; + await db.disconnect(); + } else if (event == AuthChangeEvent.tokenRefreshed) { + // Supabase token refreshed - trigger token refresh for PowerSync. + currentConnector?.prefetchCredentials(); + } + }); +} + +/// Explicit sign out - clear database and log out. +Future logout() async { + await Supabase.instance.client.auth.signOut(); + await Supabase.instance.dispose(); + await db.disconnectAndClear(); + + // Resetting app so that no-sync mode works again + await await setSyncMode(false); + await openDatabase(); +} diff --git a/demos/offline_first_todolist/lib/supabase.dart b/demos/offline_first_todolist/lib/supabase.dart new file mode 100644 index 00000000..a69586e2 --- /dev/null +++ b/demos/offline_first_todolist/lib/supabase.dart @@ -0,0 +1,10 @@ +import 'package:supabase_flutter/supabase_flutter.dart'; + +import './app_config.dart'; + +loadSupabase() async { + await Supabase.initialize( + url: AppConfig.supabaseUrl, + anonKey: AppConfig.supabaseAnonKey, + ); +} diff --git a/demos/offline_first_todolist/lib/widgets/list_item.dart b/demos/offline_first_todolist/lib/widgets/list_item.dart new file mode 100644 index 00000000..981b382a --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/list_item.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +import './todo_list_page.dart'; +import '../models/todo_list.dart'; + +class ListItemWidget extends StatelessWidget { + ListItemWidget({ + required this.list, + }) : super(key: ObjectKey(list)); + + final TodoList list; + + Future delete() async { + // Server will take care of deleting related todos + await list.delete(); + } + + @override + Widget build(BuildContext context) { + viewList() { + var navigator = Navigator.of(context); + + navigator.push( + MaterialPageRoute(builder: (context) => TodoListPage(list: list))); + } + + final subtext = + '${list.pendingCount} pending, ${list.completedCount} completed'; + + return Card( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + onTap: viewList, + leading: const Icon(Icons.list), + title: Text(list.name), + subtitle: Text(subtext)), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + IconButton( + iconSize: 30, + icon: const Icon( + Icons.delete, + color: Colors.red, + ), + tooltip: 'Delete List', + alignment: Alignment.centerRight, + onPressed: delete, + ), + const SizedBox(width: 8), + ], + ), + ], + ), + ); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/list_item_dialog.dart b/demos/offline_first_todolist/lib/widgets/list_item_dialog.dart new file mode 100644 index 00000000..3fb8c133 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/list_item_dialog.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +import '../models/todo_list.dart'; + +class ListItemDialog extends StatefulWidget { + const ListItemDialog({super.key}); + + @override + State createState() { + return _ListItemDialogState(); + } +} + +class _ListItemDialogState extends State { + final TextEditingController _textFieldController = TextEditingController(); + + _ListItemDialogState(); + + @override + void dispose() { + super.dispose(); + _textFieldController.dispose(); + } + + Future add() async { + await TodoList.create(_textFieldController.text); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text('Add a new list'), + content: TextField( + controller: _textFieldController, + decoration: const InputDecoration(hintText: 'List name'), + onSubmitted: (value) async { + Navigator.of(context).pop(); + await add(); + }, + autofocus: true, + ), + actions: [ + OutlinedButton( + child: const Text('Cancel'), + onPressed: () { + _textFieldController.clear(); + Navigator.of(context).pop(); + }, + ), + ElevatedButton( + child: const Text('Create'), + onPressed: () async { + Navigator.of(context).pop(); + await add(); + }, + ), + ], + ); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/lists_page.dart b/demos/offline_first_todolist/lib/widgets/lists_page.dart new file mode 100644 index 00000000..e31c2fc8 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/lists_page.dart @@ -0,0 +1,88 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import './list_item.dart'; +import './list_item_dialog.dart'; +import '../main.dart'; +import '../models/todo_list.dart'; + +void _showAddDialog(BuildContext context) async { + return showDialog( + context: context, + barrierDismissible: false, // user must tap button! + builder: (BuildContext context) { + return const ListItemDialog(); + }, + ); +} + +class ListsPage extends StatelessWidget { + const ListsPage({super.key}); + + @override + Widget build(BuildContext context) { + const content = ListsWidget(); + + final button = FloatingActionButton( + onPressed: () { + _showAddDialog(context); + }, + tooltip: 'Create List', + child: const Icon(Icons.add), + ); + + final page = MyHomePage( + title: 'Todo Lists', + content: content, + floatingActionButton: button, + ); + return page; + } +} + +class ListsWidget extends StatefulWidget { + const ListsWidget({super.key}); + + @override + State createState() { + return _ListsWidgetState(); + } +} + +class _ListsWidgetState extends State { + List _data = []; + StreamSubscription? _subscription; + + _ListsWidgetState(); + + @override + void initState() { + super.initState(); + final stream = TodoList.watchListsWithStats(); + _subscription = stream.listen((data) { + if (!context.mounted) { + return; + } + setState(() { + _data = data; + }); + }); + } + + @override + void dispose() { + super.dispose(); + _subscription?.cancel(); + } + + @override + Widget build(BuildContext context) { + return ListView( + padding: const EdgeInsets.symmetric(vertical: 8.0), + children: _data.map((list) { + return ListItemWidget(list: list); + }).toList(), + ); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/login_page.dart b/demos/offline_first_todolist/lib/widgets/login_page.dart new file mode 100644 index 00000000..21eee1b2 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/login_page.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:powersync_flutter_offline_first_demo/powersync.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + +import '../main.dart'; + +class LoginPage extends StatefulWidget { + const LoginPage({super.key}); + + @override + State createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + late TextEditingController _passwordController; + late TextEditingController _usernameController; + String? _error; + late bool _busy; + + @override + void initState() { + super.initState(); + + _busy = false; + _passwordController = TextEditingController(text: ''); + _usernameController = TextEditingController(text: ''); + } + + void _login(BuildContext context) async { + setState(() { + _busy = true; + _error = null; + }); + try { + await Supabase.instance.client.auth.signInWithPassword( + email: _usernameController.text, password: _passwordController.text); + + if (context.mounted) { + // We connect and upgrade the database schema here so that by the time the watch() calls are made in the + // ListsPage, watch will track the new tables instead.. + await connectDatabase(); + + Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (context) => listsPage, + )); + } + } on AuthException catch (e) { + setState(() { + _error = e.message; + }); + } catch (e) { + setState(() { + _error = e.toString(); + }); + } finally { + setState(() { + _busy = false; + }); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("PowerSync Flutter Demo"), + ), + body: Center( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(30), + child: Center( + child: SizedBox( + width: 300, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Text('Supabase Login'), + const SizedBox(height: 35), + TextFormField( + controller: _usernameController, + decoration: const InputDecoration(labelText: "Email"), + enabled: !_busy, + onFieldSubmitted: _busy + ? null + : (String value) { + _login(context); + }, + ), + const SizedBox(height: 20), + TextFormField( + obscureText: true, + controller: _passwordController, + decoration: InputDecoration( + labelText: "Password", errorText: _error), + enabled: !_busy, + onFieldSubmitted: _busy + ? null + : (String value) { + _login(context); + }, + ), + const SizedBox(height: 25), + TextButton( + onPressed: _busy + ? null + : () { + _login(context); + }, + child: const Text('Login'), + ), + TextButton( + onPressed: _busy + ? null + : () { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => signupPage, + )); + }, + child: const Text('Sign Up'), + ), + ], + ), + ), + ), + ), + ), + )); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/query_widget.dart b/demos/offline_first_todolist/lib/widgets/query_widget.dart new file mode 100644 index 00000000..426c7060 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/query_widget.dart @@ -0,0 +1,99 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:powersync/sqlite3_common.dart' as sqlite; + +import './resultset_table.dart'; +import '../powersync.dart'; + +class QueryWidget extends StatefulWidget { + final String defaultQuery; + + const QueryWidget({super.key, required this.defaultQuery}); + + @override + State createState() { + return QueryWidgetState(); + } +} + +class QueryWidgetState extends State { + sqlite.ResultSet? _data; + late TextEditingController _controller; + late String _query; + String? _error; + StreamSubscription? _subscription; + + QueryWidgetState(); + + @override + void initState() { + super.initState(); + _error = null; + _controller = TextEditingController(text: widget.defaultQuery); + _query = _controller.text; + _refresh(); + } + + @override + void dispose() { + super.dispose(); + _controller.dispose(); + _subscription?.cancel(); + } + + _refresh() async { + _subscription?.cancel(); + final stream = db.watch(_query); + _subscription = stream.listen((data) { + if (!context.mounted) { + return; + } + setState(() { + _data = data; + _error = null; + }); + }, onError: (e) { + setState(() { + if (e is sqlite.SqliteException) { + _error = "${e.message}!"; + } else { + _error = e.toString(); + } + }); + }); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(12), + child: TextField( + controller: _controller, + onEditingComplete: () { + setState(() { + _query = _controller.text; + _refresh(); + }); + }, + decoration: InputDecoration( + isDense: false, + border: const OutlineInputBorder(), + labelText: 'Query', + errorText: _error), + ), + ), + Expanded( + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: ResultSetTable(data: _data), + ), + )) + ], + ); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/resultset_table.dart b/demos/offline_first_todolist/lib/widgets/resultset_table.dart new file mode 100644 index 00000000..f348e4ff --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/resultset_table.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:powersync/sqlite3_common.dart' as sqlite; + +/// Stateless DataTable rendering results from a SQLite query +class ResultSetTable extends StatelessWidget { + const ResultSetTable({super.key, this.data}); + + final sqlite.ResultSet? data; + + @override + Widget build(BuildContext context) { + if (data == null) { + return const Text('Loading...'); + } else if (data!.isEmpty) { + return const Text('Empty'); + } + return DataTable( + columns: [ + for (var column in data!.columnNames) + DataColumn( + label: Expanded( + child: Text( + column, + style: const TextStyle(fontStyle: FontStyle.italic), + ), + ), + ), + ], + rows: [ + for (var row in data!.rows) + DataRow( + cells: [ + for (var cell in row) DataCell(Text((cell ?? '').toString())), + ], + ), + ], + ); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/signup_page.dart b/demos/offline_first_todolist/lib/widgets/signup_page.dart new file mode 100644 index 00000000..e69396c2 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/signup_page.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:powersync_flutter_offline_first_demo/powersync.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; + +import '../main.dart'; + +class SignupPage extends StatefulWidget { + const SignupPage({super.key}); + + @override + State createState() => _SignupPageState(); +} + +class _SignupPageState extends State { + late TextEditingController _passwordController; + late TextEditingController _usernameController; + String? _error; + late bool _busy; + + @override + void initState() { + super.initState(); + + _busy = false; + _passwordController = TextEditingController(text: ''); + _usernameController = TextEditingController(text: ''); + } + + void _signup(BuildContext context) async { + setState(() { + _busy = true; + _error = null; + }); + try { + final response = await Supabase.instance.client.auth.signUp( + email: _usernameController.text, password: _passwordController.text); + + if (context.mounted) { + if (response.session != null) { + // We connect and upgrade the database schema here so that by the time the watch() calls are made in the + // ListsPage, watch will track the new tables instead.. + await connectDatabase(); + + Navigator.of(context).pushReplacement(MaterialPageRoute( + builder: (context) => homePage, + )); + } else { + Navigator.of(context).pop(); + } + } + } on AuthException catch (e) { + setState(() { + _error = e.message; + }); + } catch (e) { + setState(() { + _error = e.toString(); + }); + } finally { + setState(() { + _busy = false; + }); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("PowerSync Flutter Demo"), + ), + body: Center( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(30), + child: Center( + child: SizedBox( + width: 300, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Text('Sign Up'), + const SizedBox(height: 35), + TextFormField( + controller: _usernameController, + decoration: const InputDecoration(labelText: "Email"), + enabled: !_busy, + onFieldSubmitted: _busy + ? null + : (String value) { + _signup(context); + }, + ), + const SizedBox(height: 20), + TextFormField( + obscureText: true, + controller: _passwordController, + decoration: InputDecoration( + labelText: "Password", errorText: _error), + enabled: !_busy, + onFieldSubmitted: _busy + ? null + : (String value) { + _signup(context); + }, + ), + const SizedBox(height: 25), + TextButton( + onPressed: _busy + ? null + : () { + _signup(context); + }, + child: const Text('Sign Up'), + ), + ], + ), + ), + ), + ), + ), + )); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/status_app_bar.dart b/demos/offline_first_todolist/lib/widgets/status_app_bar.dart new file mode 100644 index 00000000..9377bf57 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/status_app_bar.dart @@ -0,0 +1,102 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:powersync/powersync.dart'; +import 'package:supabase_flutter/supabase_flutter.dart'; +import '../powersync.dart'; + +class StatusAppBar extends StatefulWidget implements PreferredSizeWidget { + const StatusAppBar({super.key, required this.title}); + + final String title; + + @override + State createState() => _StatusAppBarState(); + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); +} + +class _StatusAppBarState extends State { + late SyncStatus _connectionState; + StreamSubscription? _syncStatusSubscription; + late bool _loggedIn; + + @override + void initState() { + super.initState(); + _connectionState = db.currentStatus; + _syncStatusSubscription = db.statusStream.listen((event) { + setState(() { + _connectionState = db.currentStatus; + }); + }); + + _loggedIn = isLoggedIn(); + Supabase.instance.client.auth.onAuthStateChange.listen((data) async { + final AuthChangeEvent event = data.event; + if (event == AuthChangeEvent.signedIn) { + _loggedIn = true; + } else if (event == AuthChangeEvent.signedOut) { + _loggedIn = false; + } + }); + } + + @override + void dispose() { + super.dispose(); + _syncStatusSubscription?.cancel(); + } + + @override + Widget build(BuildContext context) { + final statusIcon = _getStatusIcon(_connectionState, _loggedIn); + + return AppBar( + title: Text(widget.title), + actions: [ + statusIcon, + // Make some space for the "Debug" banner, so that the status + // icon isn't hidden + if (kDebugMode) _makeIcon('Debug mode', Icons.developer_mode), + ], + ); + } +} + +Widget _makeIcon(String text, IconData icon) { + return Tooltip( + message: text, + child: SizedBox(width: 40, height: null, child: Icon(icon, size: 24))); +} + +Widget _getStatusIcon(SyncStatus status, bool loggedIn) { + if (!loggedIn) { + return _makeIcon('Not logged in', Icons.no_accounts_outlined); + } + if (status.anyError != null) { + // The error message is verbose, could be replaced with something + // more user-friendly + if (!status.connected) { + return _makeIcon(status.anyError!.toString(), Icons.cloud_off); + } else { + return _makeIcon(status.anyError!.toString(), Icons.sync_problem); + } + } else if (status.connecting) { + return _makeIcon('Connecting', Icons.cloud_sync_outlined); + } else if (!status.connected) { + return _makeIcon('Not connected', Icons.cloud_off); + } else if (status.uploading && status.downloading) { + // The status changes often between downloading, uploading and both, + // so we use the same icon for all three + return _makeIcon('Uploading and downloading', Icons.cloud_sync_outlined); + } else if (status.uploading) { + return _makeIcon('Uploading', Icons.cloud_sync_outlined); + } else if (status.downloading) { + return _makeIcon('Downloading', Icons.cloud_sync_outlined); + } else { + return _makeIcon('Connected', Icons.cloud_queue); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/todo_item_dialog.dart b/demos/offline_first_todolist/lib/widgets/todo_item_dialog.dart new file mode 100644 index 00000000..641abd7f --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/todo_item_dialog.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +import '../models/todo_list.dart'; + +class TodoItemDialog extends StatefulWidget { + final TodoList list; + + const TodoItemDialog({super.key, required this.list}); + + @override + State createState() { + return _TodoItemDialogState(); + } +} + +class _TodoItemDialogState extends State { + final TextEditingController _textFieldController = TextEditingController(); + + _TodoItemDialogState(); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + _textFieldController.dispose(); + } + + Future add() async { + Navigator.of(context).pop(); + + await widget.list.add(_textFieldController.text); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text('Add a new todo item'), + content: TextField( + controller: _textFieldController, + decoration: const InputDecoration(hintText: 'Type your new todo'), + onSubmitted: (value) { + add(); + }, + autofocus: true, + ), + actions: [ + OutlinedButton( + child: const Text('Cancel'), + onPressed: () { + _textFieldController.clear(); + Navigator.of(context).pop(); + }, + ), + ElevatedButton( + onPressed: add, + child: const Text('Add'), + ), + ], + ); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/todo_item_widget.dart b/demos/offline_first_todolist/lib/widgets/todo_item_widget.dart new file mode 100644 index 00000000..b731fe37 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/todo_item_widget.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +import '../models/todo_item.dart'; + +class TodoItemWidget extends StatelessWidget { + TodoItemWidget({ + required this.todo, + }) : super(key: ObjectKey(todo.id)); + + final TodoItem todo; + + TextStyle? _getTextStyle(bool checked) { + if (!checked) return null; + + return const TextStyle( + color: Colors.black54, + decoration: TextDecoration.lineThrough, + ); + } + + Future deleteTodo(TodoItem todo) async { + await todo.delete(); + } + + @override + Widget build(BuildContext context) { + return ListTile( + onTap: todo.toggle, + leading: Checkbox( + value: todo.completed, + onChanged: (_) { + todo.toggle(); + }, + ), + title: Row( + children: [ + Expanded( + child: Text(todo.description, + style: _getTextStyle(todo.completed))), + IconButton( + iconSize: 30, + icon: const Icon( + Icons.delete, + color: Colors.red, + ), + alignment: Alignment.centerRight, + onPressed: () async => await deleteTodo(todo), + tooltip: 'Delete Item', + ), + Container() + ], + )); + } +} diff --git a/demos/offline_first_todolist/lib/widgets/todo_list_page.dart b/demos/offline_first_todolist/lib/widgets/todo_list_page.dart new file mode 100644 index 00000000..805e8e48 --- /dev/null +++ b/demos/offline_first_todolist/lib/widgets/todo_list_page.dart @@ -0,0 +1,89 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:powersync_flutter_offline_first_demo/models/todo_item.dart'; + +import './status_app_bar.dart'; +import './todo_item_dialog.dart'; +import './todo_item_widget.dart'; +import '../models/todo_list.dart'; + +void _showAddDialog(BuildContext context, TodoList list) async { + return showDialog( + context: context, + barrierDismissible: false, // user must tap button! + builder: (BuildContext context) { + return TodoItemDialog(list: list); + }, + ); +} + +class TodoListPage extends StatelessWidget { + final TodoList list; + + const TodoListPage({super.key, required this.list}); + + @override + Widget build(BuildContext context) { + final button = FloatingActionButton( + onPressed: () { + _showAddDialog(context, list); + }, + tooltip: 'Add Item', + child: const Icon(Icons.add), + ); + + return Scaffold( + appBar: StatusAppBar(title: list.name), + floatingActionButton: button, + body: TodoListWidget(list: list)); + } +} + +class TodoListWidget extends StatefulWidget { + final TodoList list; + + const TodoListWidget({super.key, required this.list}); + + @override + State createState() { + return TodoListWidgetState(); + } +} + +class TodoListWidgetState extends State { + List _data = []; + StreamSubscription? _subscription; + + TodoListWidgetState(); + + @override + void initState() { + super.initState(); + final stream = widget.list.watchItems(); + _subscription = stream.listen((data) { + if (!context.mounted) { + return; + } + setState(() { + _data = data; + }); + }); + } + + @override + void dispose() { + super.dispose(); + _subscription?.cancel(); + } + + @override + Widget build(BuildContext context) { + return ListView( + padding: const EdgeInsets.symmetric(vertical: 8.0), + children: _data.map((todo) { + return TodoItemWidget(todo: todo); + }).toList(), + ); + } +} diff --git a/demos/offline_first_todolist/linux/.gitignore b/demos/offline_first_todolist/linux/.gitignore new file mode 100644 index 00000000..d3896c98 --- /dev/null +++ b/demos/offline_first_todolist/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/demos/offline_first_todolist/linux/CMakeLists.txt b/demos/offline_first_todolist/linux/CMakeLists.txt new file mode 100644 index 00000000..df0a3887 --- /dev/null +++ b/demos/offline_first_todolist/linux/CMakeLists.txt @@ -0,0 +1,138 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "powersync_supabase_demo") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "co.powersync.demotodolist") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/demos/offline_first_todolist/linux/flutter/CMakeLists.txt b/demos/offline_first_todolist/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/demos/offline_first_todolist/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.cc b/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..1bef6a30 --- /dev/null +++ b/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,27 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) gtk_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); + gtk_plugin_register_with_registrar(gtk_registrar); + g_autoptr(FlPluginRegistrar) powersync_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PowersyncFlutterLibsPlugin"); + powersync_flutter_libs_plugin_register_with_registrar(powersync_flutter_libs_registrar); + g_autoptr(FlPluginRegistrar) sqlite3_flutter_libs_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "Sqlite3FlutterLibsPlugin"); + sqlite3_flutter_libs_plugin_register_with_registrar(sqlite3_flutter_libs_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.h b/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/demos/offline_first_todolist/linux/flutter/generated_plugins.cmake b/demos/offline_first_todolist/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..ed77a1a0 --- /dev/null +++ b/demos/offline_first_todolist/linux/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + gtk + powersync_flutter_libs + sqlite3_flutter_libs + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/demos/offline_first_todolist/linux/main.cc b/demos/offline_first_todolist/linux/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/demos/offline_first_todolist/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/demos/offline_first_todolist/linux/my_application.cc b/demos/offline_first_todolist/linux/my_application.cc new file mode 100644 index 00000000..7dcb7e37 --- /dev/null +++ b/demos/offline_first_todolist/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "PowerSync Flutter Demo"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "PowerSync Flutter Demo"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/demos/offline_first_todolist/linux/my_application.h b/demos/offline_first_todolist/linux/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/demos/offline_first_todolist/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/demos/offline_first_todolist/macos/.gitignore b/demos/offline_first_todolist/macos/.gitignore new file mode 100644 index 00000000..746adbb6 --- /dev/null +++ b/demos/offline_first_todolist/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/demos/offline_first_todolist/macos/Flutter/Flutter-Debug.xcconfig b/demos/offline_first_todolist/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/demos/offline_first_todolist/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/demos/offline_first_todolist/macos/Flutter/Flutter-Release.xcconfig b/demos/offline_first_todolist/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/demos/offline_first_todolist/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/demos/offline_first_todolist/macos/Flutter/GeneratedPluginRegistrant.swift b/demos/offline_first_todolist/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..0c6fd7ff --- /dev/null +++ b/demos/offline_first_todolist/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,22 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import app_links +import path_provider_foundation +import powersync_flutter_libs +import shared_preferences_foundation +import sqlite3_flutter_libs +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + PowersyncFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "PowersyncFlutterLibsPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + Sqlite3FlutterLibsPlugin.register(with: registry.registrar(forPlugin: "Sqlite3FlutterLibsPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/demos/offline_first_todolist/macos/Podfile b/demos/offline_first_todolist/macos/Podfile new file mode 100644 index 00000000..c795730d --- /dev/null +++ b/demos/offline_first_todolist/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.14' + +# 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', 'ephemeral', '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 Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/demos/offline_first_todolist/macos/Podfile.lock b/demos/offline_first_todolist/macos/Podfile.lock new file mode 100644 index 00000000..98e82b5a --- /dev/null +++ b/demos/offline_first_todolist/macos/Podfile.lock @@ -0,0 +1,79 @@ +PODS: + - app_links (1.0.0): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - powersync-sqlite-core (0.1.6) + - powersync_flutter_libs (0.0.1): + - FlutterMacOS + - powersync-sqlite-core (~> 0.1.6) + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - "sqlite3 (3.46.0+1)": + - "sqlite3/common (= 3.46.0+1)" + - "sqlite3/common (3.46.0+1)" + - "sqlite3/dbstatvtab (3.46.0+1)": + - sqlite3/common + - "sqlite3/fts5 (3.46.0+1)": + - sqlite3/common + - "sqlite3/perf-threadsafe (3.46.0+1)": + - sqlite3/common + - "sqlite3/rtree (3.46.0+1)": + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - FlutterMacOS + - "sqlite3 (~> 3.46.0+1)" + - sqlite3/dbstatvtab + - sqlite3/fts5 + - sqlite3/perf-threadsafe + - sqlite3/rtree + - url_launcher_macos (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - app_links (from `Flutter/ephemeral/.symlinks/plugins/app_links/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - powersync_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/powersync_flutter_libs/macos`) + - shared_preferences_foundation (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin`) + - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + +SPEC REPOS: + trunk: + - powersync-sqlite-core + - sqlite3 + +EXTERNAL SOURCES: + app_links: + :path: Flutter/ephemeral/.symlinks/plugins/app_links/macos + FlutterMacOS: + :path: Flutter/ephemeral + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + powersync_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/powersync_flutter_libs/macos + shared_preferences_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_foundation/darwin + sqlite3_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + +SPEC CHECKSUMS: + app_links: 10e0a0ab602ffaf34d142cd4862f29d34b303b2a + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + powersync-sqlite-core: 4c38c8f470f6dca61346789fd5436a6826d1e3dd + powersync_flutter_libs: 1eb1c6790a72afe08e68d4cc489d71ab61da32ee + shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78 + sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 + sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b + url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399 + +PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 + +COCOAPODS: 1.15.2 diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj b/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..96adce05 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,801 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 0A2799061E4601541D8710F9 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4755889DA71EACD04E2DB107 /* Pods_RunnerTests.framework */; }; + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + E245BB2D7BD6A8244254E462 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6FE37EE4A3D4E9AC68C4CF9 /* Pods_Runner.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0D9C44CF1376362105FC99EE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 0F56B7F8C87E2B96A5D889EB /* 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 = ""; }; + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* offline_first_todolist.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = offline_first_todolist.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 4755889DA71EACD04E2DB107 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 609166066C78B8C580BB2DDA /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + B6FE37EE4A3D4E9AC68C4CF9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7509638D7246671D2E46B25 /* 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 = ""; }; + DAFA2E7F98D7CDFACEBD1574 /* 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 = ""; }; + E5D0F54570A002388B15DD0A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0A2799061E4601541D8710F9 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E245BB2D7BD6A8244254E462 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + C56EECB2F449C450EC9A4A40 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* offline_first_todolist.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + C56EECB2F449C450EC9A4A40 /* Pods */ = { + isa = PBXGroup; + children = ( + DAFA2E7F98D7CDFACEBD1574 /* Pods-Runner.debug.xcconfig */, + 0F56B7F8C87E2B96A5D889EB /* Pods-Runner.release.xcconfig */, + C7509638D7246671D2E46B25 /* Pods-Runner.profile.xcconfig */, + 609166066C78B8C580BB2DDA /* Pods-RunnerTests.debug.xcconfig */, + E5D0F54570A002388B15DD0A /* Pods-RunnerTests.release.xcconfig */, + 0D9C44CF1376362105FC99EE /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + B6FE37EE4A3D4E9AC68C4CF9 /* Pods_Runner.framework */, + 4755889DA71EACD04E2DB107 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 213A8C3AE082683E9D422908 /* [CP] Check Pods Manifest.lock */, + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + F9776D6EC8E63CE597C84EB8 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 1136CF14067C8C4990B5B2DD /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* offline_first_todolist.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 1136CF14067C8C4990B5B2DD /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 213A8C3AE082683E9D422908 /* [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-RunnerTests-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; + }; + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + F9776D6EC8E63CE597C84EB8 /* [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; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 609166066C78B8C580BB2DDA /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/offline_first_todolist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/offline_first_todolist"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E5D0F54570A002388B15DD0A /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/offline_first_todolist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/offline_first_todolist"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0D9C44CF1376362105FC99EE /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/offline_first_todolist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/offline_first_todolist"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + 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_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + 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_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/offline_first_todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..c66521fa --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/macos/Runner.xcworkspace/contents.xcworkspacedata b/demos/offline_first_todolist/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/demos/offline_first_todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/offline_first_todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demos/offline_first_todolist/macos/Runner/AppDelegate.swift b/demos/offline_first_todolist/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..d53ef643 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig b/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..a4936628 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = offline_first_todolist + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 co.powersync. All rights reserved. diff --git a/demos/offline_first_todolist/macos/Runner/Configs/Debug.xcconfig b/demos/offline_first_todolist/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/demos/offline_first_todolist/macos/Runner/Configs/Release.xcconfig b/demos/offline_first_todolist/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/demos/offline_first_todolist/macos/Runner/Configs/Warnings.xcconfig b/demos/offline_first_todolist/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements b/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/demos/offline_first_todolist/macos/Runner/Info.plist b/demos/offline_first_todolist/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift b/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..3cc05eb2 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/demos/offline_first_todolist/macos/Runner/Release.entitlements b/demos/offline_first_todolist/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/demos/offline_first_todolist/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift b/demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..61f3bd1f --- /dev/null +++ b/demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/demos/offline_first_todolist/pubspec.lock b/demos/offline_first_todolist/pubspec.lock new file mode 100644 index 00000000..489c7232 --- /dev/null +++ b/demos/offline_first_todolist/pubspec.lock @@ -0,0 +1,831 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + app_links: + dependency: transitive + description: + name: app_links + sha256: a9905d6a60e814503fabc7523a9ed161b812d7ca69c99ad8ceea14279dc4f06b + url: "https://pub.dev" + source: hosted + version: "6.1.3" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: "567139eca3ca9fb113f2082f3aaa75a26f30f0ebdbe5fa7f09a3913c5bebd630" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "58cff6f11df59b0e514dd5e4a61e988348ad5662f0e75d45d4e214ebea55c94c" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: "74586ed5f3c4786341e82a0fa43c39ec3f13108a550f74e80d8bf68aa11349d1" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + camera: + dependency: "direct main" + description: + name: camera + sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8 + url: "https://pub.dev" + source: hosted + version: "0.10.6" + camera_android: + dependency: transitive + description: + name: camera_android + sha256: "4ef97ae90dab306a4ed8d5eee14c85fd8daf403ae22488b5617c848774396d72" + url: "https://pub.dev" + source: hosted + version: "0.10.9+6" + camera_avfoundation: + dependency: transitive + description: + name: camera_avfoundation + sha256: "7d021e8cd30d9b71b8b92b4ad669e80af432d722d18d6aac338572754a786c15" + url: "https://pub.dev" + source: hosted + version: "0.9.16" + camera_platform_interface: + dependency: transitive + description: + name: camera_platform_interface + sha256: a250314a48ea337b35909a4c9d5416a208d736dcb01d0b02c6af122be66660b0 + url: "https://pub.dev" + source: hosted + version: "2.7.4" + camera_web: + dependency: transitive + description: + name: camera_web + sha256: "9e9aba2fbab77ce2472924196ff8ac4dd8f9126c4f9a3096171cd1d870d6b26c" + url: "https://pub.dev" + source: hosted + version: "0.3.3" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + url: "https://pub.dev" + source: hosted + version: "0.3.4+1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + fetch_api: + dependency: transitive + description: + name: fetch_api + sha256: "97f46c25b480aad74f7cc2ad7ccba2c5c6f08d008e68f95c1077286ce243d0e6" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + fetch_client: + dependency: transitive + description: + name: fetch_client + sha256: "9666ee14536778474072245ed5cba07db81ae8eb5de3b7bf4a2d1e2c49696092" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + ffi: + dependency: transitive + description: + name: ffi + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: c6b0b4c05c458e1c01ad9bcc14041dd7b1f6783d487be4386f793f47a8a4d03e + url: "https://pub.dev" + source: hosted + version: "2.0.20" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + functions_client: + dependency: transitive + description: + name: functions_client + sha256: "48659e5c6a4bbe02659102bf6406a0cf39142202deae65aacfa78688f2e68946" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + gotrue: + dependency: transitive + description: + name: gotrue + sha256: "65c8c47afb8230218bc295e6edcb948b117e39801f91c4a4bcb94dfd26b57134" + url: "https://pub.dev" + source: hosted + version: "2.8.1" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c + url: "https://pub.dev" + source: hosted + version: "2.1.0" + http: + dependency: transitive + description: + name: http + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image: + dependency: "direct main" + description: + name: image + sha256: "2237616a36c0d69aef7549ab439b833fb7f9fb9fc861af2cc9ac3eedddd69ca8" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" + jwt_decode: + dependency: transitive + description: + name: jwt_decode + sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb + url: "https://pub.dev" + source: hosted + version: "0.3.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logging: + dependency: "direct main" + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + mutex: + dependency: transitive + description: + name: mutex + sha256: "8827da25de792088eb33e572115a5eb0d61d61a3c01acbc8bcbe76ed78f1a1f2" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + path: + dependency: "direct main" + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: bca87b0165ffd7cdb9cad8edd22d18d2201e886d9a9f19b4fb3452ea7df3a72a + url: "https://pub.dev" + source: hosted + version: "2.2.6" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + url: "https://pub.dev" + source: hosted + version: "2.4.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + postgrest: + dependency: transitive + description: + name: postgrest + sha256: f1f78470a74c611811132ff12acdef9c08b3ec65b61e88161a057d6cc5fbbd83 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + powersync: + dependency: "direct main" + description: + path: "../../packages/powersync" + relative: true + source: path + version: "1.6.0" + powersync_attachments_helper: + dependency: "direct overridden" + description: + path: "../../packages/powersync_attachments_helper" + relative: true + source: path + version: "0.6.0" + powersync_flutter_libs: + dependency: "direct overridden" + description: + path: "../../packages/powersync_flutter_libs" + relative: true + source: path + version: "0.1.0" + realtime_client: + dependency: transitive + description: + name: realtime_client + sha256: cd44fa21407a2e217d674f1c1a33b36c49ad0d8aea0349bf5b66594db06c80fb + url: "https://pub.dev" + source: hosted + version: "2.1.0" + retry: + dependency: transitive + description: + name: retry + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" + url: "https://pub.dev" + source: hosted + version: "3.1.2" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "93d0ec9dd902d85f326068e6a899487d1f65ffcd5798721a95330b26c8131577" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqlite3: + dependency: transitive + description: + name: sqlite3 + sha256: "6d17989c0b06a5870b2190d391925186f944cb943e5262d0d3f778fcfca3bc6e" + url: "https://pub.dev" + source: hosted + version: "2.4.4" + sqlite3_flutter_libs: + dependency: transitive + description: + name: sqlite3_flutter_libs + sha256: "62bbb4073edbcdf53f40c80775f33eea01d301b7b81417e5b3fb7395416258c1" + url: "https://pub.dev" + source: hosted + version: "0.5.24" + sqlite3_web: + dependency: transitive + description: + name: sqlite3_web + sha256: "51fec34757577841cc72d79086067e3651c434669d5af557a5c106787198a76f" + url: "https://pub.dev" + source: hosted + version: "0.1.2-wip" + sqlite_async: + dependency: "direct main" + description: + name: sqlite_async + sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + url: "https://pub.dev" + source: hosted + version: "0.8.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + storage_client: + dependency: transitive + description: + name: storage_client + sha256: e37f1b9d40f43078d12bd2d1b6b08c2c16fbdbafc58b57bc44922da6ea3f5625 + url: "https://pub.dev" + source: hosted + version: "2.0.2" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + supabase: + dependency: transitive + description: + name: supabase + sha256: "073aabf6a9f6ada2ebb77082222e1104949afb9f7f181017d0643d99bda0efe3" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + supabase_flutter: + dependency: "direct main" + description: + name: supabase_flutter + sha256: ae56c20924fadd62f0a83f0570c22cec85f4b093768fbd0e049c4e1741a109a7 + url: "https://pub.dev" + source: hosted + version: "2.5.6" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + universal_io: + dependency: "direct main" + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: ceb2625f0c24ade6ef6778d1de0b2e44f2db71fded235eb52295247feba8c5cf + url: "https://pub.dev" + source: hosted + version: "6.3.3" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89" + url: "https://pub.dev" + source: hosted + version: "6.3.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + url: "https://pub.dev" + source: hosted + version: "4.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + url: "https://pub.dev" + source: hosted + version: "14.2.1" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + url: "https://pub.dev" + source: hosted + version: "2.4.5" + win32: + dependency: transitive + description: + name: win32 + sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4 + url: "https://pub.dev" + source: hosted + version: "5.5.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yet_another_json_isolate: + dependency: transitive + description: + name: yet_another_json_isolate + sha256: e727502a2640d65b4b8a8a6cb48af9dd0cbe644ba4b3ee667c7f4afa0c1d6069 + url: "https://pub.dev" + source: hosted + version: "2.0.0" +sdks: + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.22.0" diff --git a/demos/offline_first_todolist/pubspec.yaml b/demos/offline_first_todolist/pubspec.yaml new file mode 100644 index 00000000..ac4e3336 --- /dev/null +++ b/demos/offline_first_todolist/pubspec.yaml @@ -0,0 +1,30 @@ +name: powersync_flutter_offline_first_demo +description: PowerSync Flutter Offline First Demo +publish_to: "none" + +version: 1.0.1 + +environment: + sdk: ^3.4.0 + +dependencies: + flutter: + sdk: flutter + powersync: ^1.6.0 + path_provider: ^2.1.1 + supabase_flutter: ^2.0.1 + path: ^1.8.3 + logging: ^1.2.0 + camera: ^0.10.5+7 + image: ^4.1.3 + universal_io: ^2.2.2 + sqlite_async: ^0.8.1 + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_lints: ^3.0.1 + +flutter: + uses-material-design: true diff --git a/demos/offline_first_todolist/test/widget_test.dart b/demos/offline_first_todolist/test/widget_test.dart new file mode 100644 index 00000000..675d2885 --- /dev/null +++ b/demos/offline_first_todolist/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. 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/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:offline_first_todolist/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const 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); + }); +} diff --git a/demos/offline_first_todolist/web/favicon.png b/demos/offline_first_todolist/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/demos/offline_first_todolist/web/icons/Icon-192.png b/demos/offline_first_todolist/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/demos/offline_first_todolist/web/icons/Icon-512.png b/demos/offline_first_todolist/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/demos/offline_first_todolist/web/icons/Icon-maskable-192.png b/demos/offline_first_todolist/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 zcmdT|`#%%j|KDb2V@0DPm$^(Lx5}lO%Yv(=e*7hl@QqKS50#~#^IQPxBmuh|i9sXnt4ch@VT0F7% zMtrs@KWIOo+QV@lSs66A>2pz6-`9Jk=0vv&u?)^F@HZ)-6HT=B7LF;rdj zskUyBfbojcX#CS>WrIWo9D=DIwcXM8=I5D{SGf$~=gh-$LwY?*)cD%38%sCc?5OsX z-XfkyL-1`VavZ?>(pI-xp-kYq=1hsnyP^TLb%0vKRSo^~r{x?ISLY1i7KjSp z*0h&jG(Rkkq2+G_6eS>n&6>&Xk+ngOMcYrk<8KrukQHzfx675^^s$~<@d$9X{VBbg z2Fd4Z%g`!-P}d#`?B4#S-9x*eNlOVRnDrn#jY@~$jfQ-~3Od;A;x-BI1BEDdvr`pI z#D)d)!2_`GiZOUu1crb!hqH=ezs0qk<_xDm_Kkw?r*?0C3|Io6>$!kyDl;eH=aqg$B zsH_|ZD?jP2dc=)|L>DZmGyYKa06~5?C2Lc0#D%62p(YS;%_DRCB1k(+eLGXVMe+=4 zkKiJ%!N6^mxqM=wq`0+yoE#VHF%R<{mMamR9o_1JH8jfnJ?NPLs$9U!9!dq8 z0B{dI2!M|sYGH&9TAY34OlpIsQ4i5bnbG>?cWwat1I13|r|_inLE?FS@Hxdxn_YZN z3jfUO*X9Q@?HZ>Q{W0z60!bbGh557XIKu1?)u|cf%go`pwo}CD=0tau-}t@R2OrSH zQzZr%JfYa`>2!g??76=GJ$%ECbQh7Q2wLRp9QoyiRHP7VE^>JHm>9EqR3<$Y=Z1K^SHuwxCy-5@z3 zVM{XNNm}yM*pRdLKp??+_2&!bp#`=(Lh1vR{~j%n;cJv~9lXeMv)@}Odta)RnK|6* zC+IVSWumLo%{6bLDpn)Gz>6r&;Qs0^+Sz_yx_KNz9Dlt^ax`4>;EWrIT#(lJ_40<= z750fHZ7hI{}%%5`;lwkI4<_FJw@!U^vW;igL0k+mK)-j zYuCK#mCDK3F|SC}tC2>m$ZCqNB7ac-0UFBJ|8RxmG@4a4qdjvMzzS&h9pQmu^x&*= zGvapd1#K%Da&)8f?<9WN`2H^qpd@{7In6DNM&916TRqtF4;3`R|Nhwbw=(4|^Io@T zIjoR?tB8d*sO>PX4vaIHF|W;WVl6L1JvSmStgnRQq zTX4(>1f^5QOAH{=18Q2Vc1JI{V=yOr7yZJf4Vpfo zeHXdhBe{PyY;)yF;=ycMW@Kb>t;yE>;f79~AlJ8k`xWucCxJfsXf2P72bAavWL1G#W z;o%kdH(mYCM{$~yw4({KatNGim49O2HY6O07$B`*K7}MvgI=4x=SKdKVb8C$eJseA$tmSFOztFd*3W`J`yIB_~}k%Sd_bPBK8LxH)?8#jM{^%J_0|L z!gFI|68)G}ex5`Xh{5pB%GtlJ{Z5em*e0sH+sU1UVl7<5%Bq+YrHWL7?X?3LBi1R@_)F-_OqI1Zv`L zb6^Lq#H^2@d_(Z4E6xA9Z4o3kvf78ZDz!5W1#Mp|E;rvJz&4qj2pXVxKB8Vg0}ek%4erou@QM&2t7Cn5GwYqy%{>jI z)4;3SAgqVi#b{kqX#$Mt6L8NhZYgonb7>+r#BHje)bvaZ2c0nAvrN3gez+dNXaV;A zmyR0z@9h4@6~rJik-=2M-T+d`t&@YWhsoP_XP-NsVO}wmo!nR~QVWU?nVlQjNfgcTzE-PkfIX5G z1?&MwaeuzhF=u)X%Vpg_e@>d2yZwxl6-r3OMqDn8_6m^4z3zG##cK0Fsgq8fcvmhu z{73jseR%X%$85H^jRAcrhd&k!i^xL9FrS7qw2$&gwAS8AfAk#g_E_tP;x66fS`Mn@SNVrcn_N;EQm z`Mt3Z%rw%hDqTH-s~6SrIL$hIPKL5^7ejkLTBr46;pHTQDdoErS(B>``t;+1+M zvU&Se9@T_BeK;A^p|n^krIR+6rH~BjvRIugf`&EuX9u69`9C?9ANVL8l(rY6#mu^i z=*5Q)-%o*tWl`#b8p*ZH0I}hn#gV%|jt6V_JanDGuekR*-wF`u;amTCpGG|1;4A5$ zYbHF{?G1vv5;8Ph5%kEW)t|am2_4ik!`7q{ymfHoe^Z99c|$;FAL+NbxE-_zheYbV z3hb0`uZGTsgA5TG(X|GVDSJyJxsyR7V5PS_WSnYgwc_D60m7u*x4b2D79r5UgtL18 zcCHWk+K6N1Pg2c;0#r-)XpwGX?|Iv)^CLWqwF=a}fXUSM?n6E;cCeW5ER^om#{)Jr zJR81pkK?VoFm@N-s%hd7@hBS0xuCD0-UDVLDDkl7Ck=BAj*^ps`393}AJ+Ruq@fl9 z%R(&?5Nc3lnEKGaYMLmRzKXow1+Gh|O-LG7XiNxkG^uyv zpAtLINwMK}IWK65hOw&O>~EJ}x@lDBtB`yKeV1%GtY4PzT%@~wa1VgZn7QRwc7C)_ zpEF~upeDRg_<#w=dLQ)E?AzXUQpbKXYxkp>;c@aOr6A|dHA?KaZkL0svwB^U#zmx0 zzW4^&G!w7YeRxt<9;d@8H=u(j{6+Uj5AuTluvZZD4b+#+6Rp?(yJ`BC9EW9!b&KdPvzJYe5l7 zMJ9aC@S;sA0{F0XyVY{}FzW0Vh)0mPf_BX82E+CD&)wf2!x@{RO~XBYu80TONl3e+ zA7W$ra6LcDW_j4s-`3tI^VhG*sa5lLc+V6ONf=hO@q4|p`CinYqk1Ko*MbZ6_M05k zSwSwkvu;`|I*_Vl=zPd|dVD0lh&Ha)CSJJvV{AEdF{^Kn_Yfsd!{Pc1GNgw}(^~%)jk5~0L~ms|Rez1fiK~s5t(p1ci5Gq$JC#^JrXf?8 z-Y-Zi_Hvi>oBzV8DSRG!7dm|%IlZg3^0{5~;>)8-+Nk&EhAd(}s^7%MuU}lphNW9Q zT)DPo(ob{tB7_?u;4-qGDo!sh&7gHaJfkh43QwL|bbFVi@+oy;i;M zM&CP^v~lx1U`pi9PmSr&Mc<%HAq0DGH?Ft95)WY`P?~7O z`O^Nr{Py9M#Ls4Y7OM?e%Y*Mvrme%=DwQaye^Qut_1pOMrg^!5u(f9p(D%MR%1K>% zRGw%=dYvw@)o}Fw@tOtPjz`45mfpn;OT&V(;z75J*<$52{sB65$gDjwX3Xa!x_wE- z!#RpwHM#WrO*|~f7z}(}o7US(+0FYLM}6de>gQdtPazXz?OcNv4R^oYLJ_BQOd_l172oSK$6!1r@g+B@0ofJ4*{>_AIxfe-#xp>(1 z@Y3Nfd>fmqvjL;?+DmZk*KsfXJf<%~(gcLwEez%>1c6XSboURUh&k=B)MS>6kw9bY z{7vdev7;A}5fy*ZE23DS{J?8at~xwVk`pEwP5^k?XMQ7u64;KmFJ#POzdG#np~F&H ze-BUh@g54)dsS%nkBb}+GuUEKU~pHcYIg4vSo$J(J|U36bs0Use+3A&IMcR%6@jv$ z=+QI+@wW@?iu}Hpyzlvj-EYeop{f65GX0O%>w#0t|V z1-svWk`hU~m`|O$kw5?Yn5UhI%9P-<45A(v0ld1n+%Ziq&TVpBcV9n}L9Tus-TI)f zd_(g+nYCDR@+wYNQm1GwxhUN4tGMLCzDzPqY$~`l<47{+l<{FZ$L6(>J)|}!bi<)| zE35dl{a2)&leQ@LlDxLQOfUDS`;+ZQ4ozrleQwaR-K|@9T{#hB5Z^t#8 zC-d_G;B4;F#8A2EBL58s$zF-=SCr`P#z zNCTnHF&|X@q>SkAoYu>&s9v@zCpv9lLSH-UZzfhJh`EZA{X#%nqw@@aW^vPcfQrlPs(qQxmC|4tp^&sHy!H!2FH5eC{M@g;ElWNzlb-+ zxpfc0m4<}L){4|RZ>KReag2j%Ot_UKkgpJN!7Y_y3;Ssz{9 z!K3isRtaFtQII5^6}cm9RZd5nTp9psk&u1C(BY`(_tolBwzV_@0F*m%3G%Y?2utyS zY`xM0iDRT)yTyYukFeGQ&W@ReM+ADG1xu@ruq&^GK35`+2r}b^V!m1(VgH|QhIPDE X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/web/icons/Icon-maskable-512.png b/demos/offline_first_todolist/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/demos/offline_first_todolist/web/index.html b/demos/offline_first_todolist/web/index.html new file mode 100644 index 00000000..b3b0c490 --- /dev/null +++ b/demos/offline_first_todolist/web/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + supabase_todolist + + + + + + + + + + diff --git a/demos/offline_first_todolist/web/manifest.json b/demos/offline_first_todolist/web/manifest.json new file mode 100644 index 00000000..9dcf6fe4 --- /dev/null +++ b/demos/offline_first_todolist/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "supabase_todolist", + "short_name": "supabase_todolist", + "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" + } + ] +} diff --git a/demos/offline_first_todolist/windows/.gitignore b/demos/offline_first_todolist/windows/.gitignore new file mode 100644 index 00000000..d492d0d9 --- /dev/null +++ b/demos/offline_first_todolist/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/demos/offline_first_todolist/windows/CMakeLists.txt b/demos/offline_first_todolist/windows/CMakeLists.txt new file mode 100644 index 00000000..ccfc4498 --- /dev/null +++ b/demos/offline_first_todolist/windows/CMakeLists.txt @@ -0,0 +1,101 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(powersync_flutter_demo LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "powersync_flutter_demo") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/demos/offline_first_todolist/windows/flutter/CMakeLists.txt b/demos/offline_first_todolist/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..930d2071 --- /dev/null +++ b/demos/offline_first_todolist/windows/flutter/CMakeLists.txt @@ -0,0 +1,104 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.cc b/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..691e6fc2 --- /dev/null +++ b/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + AppLinksPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AppLinksPluginCApi")); + PowersyncFlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PowersyncFlutterLibsPlugin")); + Sqlite3FlutterLibsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("Sqlite3FlutterLibsPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.h b/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/demos/offline_first_todolist/windows/flutter/generated_plugins.cmake b/demos/offline_first_todolist/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..0d5e9159 --- /dev/null +++ b/demos/offline_first_todolist/windows/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + app_links + powersync_flutter_libs + sqlite3_flutter_libs + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/demos/offline_first_todolist/windows/runner/CMakeLists.txt b/demos/offline_first_todolist/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/demos/offline_first_todolist/windows/runner/Runner.rc b/demos/offline_first_todolist/windows/runner/Runner.rc new file mode 100644 index 00000000..75674c07 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Journey Mobile Inc" "\0" + VALUE "FileDescription", "powersync_todolist_demo" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "powersync_flutter_demo" "\0" + VALUE "LegalCopyright", "Copyright (C) 2023 Journey Mobile, Inc. All rights reserved." "\0" + VALUE "OriginalFilename", "powersync_todolist_demo.exe" "\0" + VALUE "ProductName", "powersync_todolist_demo" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/demos/offline_first_todolist/windows/runner/flutter_window.cpp b/demos/offline_first_todolist/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..b25e363e --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/flutter_window.cpp @@ -0,0 +1,66 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/demos/offline_first_todolist/windows/runner/flutter_window.h b/demos/offline_first_todolist/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/demos/offline_first_todolist/windows/runner/main.cpp b/demos/offline_first_todolist/windows/runner/main.cpp new file mode 100644 index 00000000..3eee96b7 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"powersync_flutter_demo", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/demos/offline_first_todolist/windows/runner/resource.h b/demos/offline_first_todolist/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/demos/offline_first_todolist/windows/runner/resources/app_icon.ico b/demos/offline_first_todolist/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/demos/offline_first_todolist/windows/runner/runner.exe.manifest b/demos/offline_first_todolist/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..a42ea768 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/demos/offline_first_todolist/windows/runner/utils.cpp b/demos/offline_first_todolist/windows/runner/utils.cpp new file mode 100644 index 00000000..f5bf9fa0 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/demos/offline_first_todolist/windows/runner/utils.h b/demos/offline_first_todolist/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/demos/offline_first_todolist/windows/runner/win32_window.cpp b/demos/offline_first_todolist/windows/runner/win32_window.cpp new file mode 100644 index 00000000..041a3855 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/demos/offline_first_todolist/windows/runner/win32_window.h b/demos/offline_first_todolist/windows/runner/win32_window.h new file mode 100644 index 00000000..c86632d8 --- /dev/null +++ b/demos/offline_first_todolist/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ From 7e3b7eb26fbd192c9694ecb4a63217350a1399b4 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 1 Aug 2024 18:15:58 +0200 Subject: [PATCH 02/34] Now with macos support. --- .../ios/Runner/Info.plist | 2 +- .../offline_first_todolist/lib/powersync.dart | 2 +- .../lib/widgets/login_page.dart | 13 +- .../lib/widgets/signup_page.dart | 2 +- .../macos/Runner.xcodeproj/project.pbxproj | 391 ++++++++++-------- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- .../macos/Runner/Configs/AppInfo.xcconfig | 6 +- .../macos/Runner/DebugProfile.entitlements | 2 + .../macos/Runner/MainFlutterWindow.swift | 2 +- .../macos/Runner/Release.entitlements | 2 + .../macos/RunnerTests/RunnerTests.swift | 12 - demos/offline_first_todolist/pubspec.lock | 7 - 12 files changed, 237 insertions(+), 214 deletions(-) delete mode 100644 demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift diff --git a/demos/offline_first_todolist/ios/Runner/Info.plist b/demos/offline_first_todolist/ios/Runner/Info.plist index fc3bb480..32bf22ce 100644 --- a/demos/offline_first_todolist/ios/Runner/Info.plist +++ b/demos/offline_first_todolist/ios/Runner/Info.plist @@ -7,7 +7,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Powersync Flutter Demo + Powersync Flutter Offline First Demo CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/demos/offline_first_todolist/lib/powersync.dart b/demos/offline_first_todolist/lib/powersync.dart index 9a9a8e7c..33b0f5c4 100644 --- a/demos/offline_first_todolist/lib/powersync.dart +++ b/demos/offline_first_todolist/lib/powersync.dart @@ -147,7 +147,7 @@ String getUserId() { } Future getDatabasePath() async { - const dbFilename = 'powersync-demo.db'; + const dbFilename = 'powersync-demo-offline.db'; // getApplicationSupportDirectory is not supported on Web if (kIsWeb) { return dbFilename; diff --git a/demos/offline_first_todolist/lib/widgets/login_page.dart b/demos/offline_first_todolist/lib/widgets/login_page.dart index 21eee1b2..abdf2dc3 100644 --- a/demos/offline_first_todolist/lib/widgets/login_page.dart +++ b/demos/offline_first_todolist/lib/widgets/login_page.dart @@ -32,9 +32,14 @@ class _LoginPageState extends State { _error = null; }); try { - await Supabase.instance.client.auth.signInWithPassword( - email: _usernameController.text, password: _passwordController.text); - + try { + await Supabase.instance.client.auth.signInWithPassword( + email: _usernameController.text, + password: _passwordController.text); + } catch (e) { + print(e); + rethrow; + } if (context.mounted) { // We connect and upgrade the database schema here so that by the time the watch() calls are made in the // ListsPage, watch will track the new tables instead.. @@ -63,7 +68,7 @@ class _LoginPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Demo"), + title: const Text("PowerSync Flutter Offline First Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/offline_first_todolist/lib/widgets/signup_page.dart b/demos/offline_first_todolist/lib/widgets/signup_page.dart index e69396c2..d67e6407 100644 --- a/demos/offline_first_todolist/lib/widgets/signup_page.dart +++ b/demos/offline_first_todolist/lib/widgets/signup_page.dart @@ -67,7 +67,7 @@ class _SignupPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Demo"), + title: const Text("PowerSync Flutter Offline First Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj b/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj index 96adce05..fe47ba76 100644 --- a/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj +++ b/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj @@ -21,30 +21,30 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 0A2799061E4601541D8710F9 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4755889DA71EACD04E2DB107 /* Pods_RunnerTests.framework */; }; - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 04EE2EEA1AF4432FCFE4D947 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 386AF35B349F70B5D676F5EC /* Pods_Runner.framework */; }; + 2F56F886B3B1884D3E437FD0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C2FC729F34600C40853A030B /* Pods_RunnerTests.framework */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - E245BB2D7BD6A8244254E462 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6FE37EE4A3D4E9AC68C4CF9 /* Pods_Runner.framework */; }; + 8B5261612A7C463D00E9899E /* powersync_flutter_demoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B5261602A7C463D00E9899E /* powersync_flutter_demoTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 33CC10E52044A3C60003C045 /* Project object */; proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; }; - 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + 8B5261622A7C463D00E9899E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 33CC10E52044A3C60003C045 /* Project object */; proxyType = 1; - remoteGlobalIDString = 33CC111A2044C6BA0003C045; - remoteInfo = FLX; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; }; /* End PBXContainerItemProxy section */ @@ -62,13 +62,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0D9C44CF1376362105FC99EE /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 0F56B7F8C87E2B96A5D889EB /* 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 = ""; }; - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 1FB90A99EA939D06EE287C09 /* 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 = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* offline_first_todolist.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = offline_first_todolist.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* powersync_flutter_demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = powersync_flutter_demo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -80,44 +77,39 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 4755889DA71EACD04E2DB107 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 609166066C78B8C580BB2DDA /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 386AF35B349F70B5D676F5EC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 859D7659433CF3D1320F86CC /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 8B52615E2A7C463D00E9899E /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 8B5261602A7C463D00E9899E /* powersync_flutter_demoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = powersync_flutter_demoTests.swift; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - B6FE37EE4A3D4E9AC68C4CF9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C7509638D7246671D2E46B25 /* 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 = ""; }; - DAFA2E7F98D7CDFACEBD1574 /* 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 = ""; }; - E5D0F54570A002388B15DD0A /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 9DCB9EDE28DF57E29440CF22 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + AF676D80A0CF80705DF388CF /* 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 = ""; }; + C1A05183B57D5869377A17B4 /* 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 = ""; }; + C2FC729F34600C40853A030B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D0A6A6185A7A65698B8F4B1D /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { + 33CC10EA2044A3C60003C045 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0A2799061E4601541D8710F9 /* Pods_RunnerTests.framework in Frameworks */, + 04EE2EEA1AF4432FCFE4D947 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { + 8B52615B2A7C463D00E9899E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E245BB2D7BD6A8244254E462 /* Pods_Runner.framework in Frameworks */, + 2F56F886B3B1884D3E437FD0 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; 33BA886A226E78AF003329D5 /* Configs */ = { isa = PBXGroup; children = ( @@ -134,18 +126,18 @@ children = ( 33FAB671232836740065AC1E /* Runner */, 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, + 8B52615F2A7C463D00E9899E /* powersync_flutter_demoTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, - C56EECB2F449C450EC9A4A40 /* Pods */, + B6C445B3E9905835336FDF92 /* Pods */, ); sourceTree = ""; }; 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* offline_first_todolist.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + 33CC10ED2044A3C60003C045 /* powersync_flutter_demo.app */, + 8B52615E2A7C463D00E9899E /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; @@ -185,15 +177,23 @@ path = Runner; sourceTree = ""; }; - C56EECB2F449C450EC9A4A40 /* Pods */ = { + 8B52615F2A7C463D00E9899E /* powersync_flutter_demoTests */ = { + isa = PBXGroup; + children = ( + 8B5261602A7C463D00E9899E /* powersync_flutter_demoTests.swift */, + ); + path = powersync_flutter_demoTests; + sourceTree = ""; + }; + B6C445B3E9905835336FDF92 /* Pods */ = { isa = PBXGroup; children = ( - DAFA2E7F98D7CDFACEBD1574 /* Pods-Runner.debug.xcconfig */, - 0F56B7F8C87E2B96A5D889EB /* Pods-Runner.release.xcconfig */, - C7509638D7246671D2E46B25 /* Pods-Runner.profile.xcconfig */, - 609166066C78B8C580BB2DDA /* Pods-RunnerTests.debug.xcconfig */, - E5D0F54570A002388B15DD0A /* Pods-RunnerTests.release.xcconfig */, - 0D9C44CF1376362105FC99EE /* Pods-RunnerTests.profile.xcconfig */, + 1FB90A99EA939D06EE287C09 /* Pods-Runner.debug.xcconfig */, + AF676D80A0CF80705DF388CF /* Pods-Runner.release.xcconfig */, + C1A05183B57D5869377A17B4 /* Pods-Runner.profile.xcconfig */, + 9DCB9EDE28DF57E29440CF22 /* Pods-RunnerTests.debug.xcconfig */, + D0A6A6185A7A65698B8F4B1D /* Pods-RunnerTests.release.xcconfig */, + 859D7659433CF3D1320F86CC /* Pods-RunnerTests.profile.xcconfig */, ); name = Pods; path = Pods; @@ -202,8 +202,8 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( - B6FE37EE4A3D4E9AC68C4CF9 /* Pods_Runner.framework */, - 4755889DA71EACD04E2DB107 /* Pods_RunnerTests.framework */, + 386AF35B349F70B5D676F5EC /* Pods_Runner.framework */, + C2FC729F34600C40853A030B /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -211,36 +211,17 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 213A8C3AE082683E9D422908 /* [CP] Check Pods Manifest.lock */, - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; 33CC10EC2044A3C60003C045 /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - F9776D6EC8E63CE597C84EB8 /* [CP] Check Pods Manifest.lock */, + 9E5C59BA43BACEF39908FBDE /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - 1136CF14067C8C4990B5B2DD /* [CP] Embed Pods Frameworks */, + 44F34942EBFBB7F6E89ED4BA /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -249,24 +230,38 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* offline_first_todolist.app */; + productReference = 33CC10ED2044A3C60003C045 /* powersync_flutter_demo.app */; productType = "com.apple.product-type.application"; }; + 8B52615D2A7C463D00E9899E /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8B5261672A7C463D00E9899E /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 9BD4CD7B4DFE9A6CC5BE206C /* [CP] Check Pods Manifest.lock */, + 8B52615A2A7C463D00E9899E /* Sources */, + 8B52615B2A7C463D00E9899E /* Frameworks */, + 8B52615C2A7C463D00E9899E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 8B5261632A7C463D00E9899E /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = powersync_flutter_demoTests; + productReference = 8B52615E2A7C463D00E9899E /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 33CC10E52044A3C60003C045 /* Project object */ = { isa = PBXProject; attributes = { - BuildIndependentTargetsInParallel = YES; - LastSwiftUpdateCheck = 0920; + LastSwiftUpdateCheck = 1430; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; 33CC10EC2044A3C60003C045 = { CreatedOnToolsVersion = 9.2; LastSwiftMigration = 1100; @@ -281,6 +276,10 @@ CreatedOnToolsVersion = 9.2; ProvisioningStyle = Manual; }; + 8B52615D2A7C463D00E9899E = { + CreatedOnToolsVersion = 14.3.1; + TestTargetID = 33CC10EC2044A3C60003C045; + }; }; }; buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; @@ -297,110 +296,110 @@ projectRoot = ""; targets = ( 33CC10EC2044A3C60003C045 /* Runner */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + 8B52615D2A7C463D00E9899E /* RunnerTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { + 33CC10EB2044A3C60003C045 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 33CC10EB2044A3C60003C045 /* Resources */ = { + 8B52615C2A7C463D00E9899E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1136CF14067C8C4990B5B2DD /* [CP] Embed Pods Frameworks */ = { + 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + ); outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; - 213A8C3AE082683E9D422908 /* [CP] Check Pods Manifest.lock */ = { + 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", + Flutter/ephemeral/tripwire, ); - name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RunnerTests-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; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3399D490228B24CF009A79C7 /* ShellScript */ = { + 44F34942EBFBB7F6E89ED4BA /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { + 9BD4CD7B4DFE9A6CC5BE206C /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( - Flutter/ephemeral/tripwire, + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + 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; }; - F9776D6EC8E63CE597C84EB8 /* [CP] Check Pods Manifest.lock */ = { + 9E5C59BA43BACEF39908FBDE /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -425,37 +424,37 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 331C80D1294CF70F00263BE5 /* Sources */ = { + 33CC10E92044A3C60003C045 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 33CC10E92044A3C60003C045 /* Sources */ = { + 8B52615A2A7C463D00E9899E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + 8B5261612A7C463D00E9899E /* powersync_flutter_demoTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; }; + 8B5261632A7C463D00E9899E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 8B5261622A7C463D00E9899E /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -471,57 +470,11 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 609166066C78B8C580BB2DDA /* Pods-RunnerTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/offline_first_todolist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/offline_first_todolist"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E5D0F54570A002388B15DD0A /* Pods-RunnerTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/offline_first_todolist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/offline_first_todolist"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0D9C44CF1376362105FC99EE /* Pods-RunnerTests.profile.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/offline_first_todolist.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/offline_first_todolist"; - }; - name = Profile; - }; 338D0CE9231458BD00FA5F75 /* Profile */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -545,11 +498,9 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -597,7 +548,6 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -621,11 +571,9 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -653,7 +601,6 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -677,11 +624,9 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; - DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -752,19 +697,97 @@ }; name = Release; }; + 8B5261642A7C463D00E9899E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9DCB9EDE28DF57E29440CF22 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "co.powersync.flutter-todolist-demo.powersync-flutter-demoTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/powersync_flutter_demo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/powersync_flutter_demo"; + }; + name = Debug; + }; + 8B5261652A7C463D00E9899E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D0A6A6185A7A65698B8F4B1D /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "co.powersync.flutter-todolist-demo.powersync-flutter-demoTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/powersync_flutter_demo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/powersync_flutter_demo"; + }; + name = Release; + }; + 8B5261662A7C463D00E9899E /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 859D7659433CF3D1320F86CC /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "co.powersync.flutter-todolist-demo.powersync-flutter-demoTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/powersync_flutter_demo.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/powersync_flutter_demo"; + }; + name = Profile; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -795,6 +818,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 8B5261672A7C463D00E9899E /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8B5261642A7C463D00E9899E /* Debug */, + 8B5261652A7C463D00E9899E /* Release */, + 8B5261662A7C463D00E9899E /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 33CC10E52044A3C60003C045 /* Project object */; diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c66521fa..2c526589 100644 --- a/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -15,7 +15,7 @@ @@ -31,7 +31,7 @@ @@ -42,7 +42,7 @@ parallelizable = "YES"> @@ -65,7 +65,7 @@ @@ -82,7 +82,7 @@ diff --git a/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig b/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig index a4936628..370c9893 100644 --- a/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig +++ b/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig @@ -5,10 +5,10 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = offline_first_todolist +PRODUCT_NAME = PowerSync Supabase Demo // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = co.powersync.offlineFirstTodolist +PRODUCT_BUNDLE_IDENTIFIER = co.powersync.demotodolist // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 co.powersync. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2023 Journey Mobile, Inc. All rights reserved. diff --git a/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements b/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements index dddb8a30..08c3ab17 100644 --- a/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements +++ b/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements @@ -8,5 +8,7 @@ com.apple.security.network.server + com.apple.security.network.client + diff --git a/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift b/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift index 3cc05eb2..2722837e 100644 --- a/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift +++ b/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift @@ -3,7 +3,7 @@ import FlutterMacOS class MainFlutterWindow: NSWindow { override func awakeFromNib() { - let flutterViewController = FlutterViewController() + let flutterViewController = FlutterViewController.init() let windowFrame = self.frame self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) diff --git a/demos/offline_first_todolist/macos/Runner/Release.entitlements b/demos/offline_first_todolist/macos/Runner/Release.entitlements index 852fa1a4..ee95ab7e 100644 --- a/demos/offline_first_todolist/macos/Runner/Release.entitlements +++ b/demos/offline_first_todolist/macos/Runner/Release.entitlements @@ -4,5 +4,7 @@ com.apple.security.app-sandbox + com.apple.security.network.client + diff --git a/demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift b/demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift deleted file mode 100644 index 61f3bd1f..00000000 --- a/demos/offline_first_todolist/macos/RunnerTests/RunnerTests.swift +++ /dev/null @@ -1,12 +0,0 @@ -import Cocoa -import FlutterMacOS -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} diff --git a/demos/offline_first_todolist/pubspec.lock b/demos/offline_first_todolist/pubspec.lock index 489c7232..06d7fc37 100644 --- a/demos/offline_first_todolist/pubspec.lock +++ b/demos/offline_first_todolist/pubspec.lock @@ -455,13 +455,6 @@ packages: relative: true source: path version: "1.6.0" - powersync_attachments_helper: - dependency: "direct overridden" - description: - path: "../../packages/powersync_attachments_helper" - relative: true - source: path - version: "0.6.0" powersync_flutter_libs: dependency: "direct overridden" description: From 300e3c0b91674004d3a602c36736015d39b7f5d5 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 5 Aug 2024 11:35:13 +0200 Subject: [PATCH 03/34] Renamed demo to local-only. Added mermaid chart to readme. --- .../.gitignore | 0 .../.metadata | 0 .../LICENSE | 0 .../README.md | 23 +++++++++++--- .../analysis_options.yaml | 0 .../android/.gitignore | 0 .../android/app/build.gradle | 0 .../android/app/src/debug/AndroidManifest.xml | 0 .../android/app/src/main/AndroidManifest.xml | 2 +- .../co/powersync/demotodolist/MainActivity.kt | 0 .../res/drawable-v21/launch_background.xml | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values-night/styles.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../app/src/profile/AndroidManifest.xml | 0 .../android/build.gradle | 0 .../android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../android/settings.gradle | 0 .../database.sql | 0 .../ios/.gitignore | 0 .../ios/Flutter/AppFrameworkInfo.plist | 0 .../ios/Flutter/Debug.xcconfig | 0 .../ios/Flutter/Release.xcconfig | 0 .../ios/Podfile | 0 .../ios/Podfile.lock | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../ios/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../ios/Runner/Info.plist | 2 +- .../ios/Runner/Runner-Bridging-Header.h | 0 .../lib/app_config_template.dart | 0 .../lib/main.dart | 6 ++-- .../lib/models/schema.dart | 6 ++-- .../lib/models/sync_mode.dart | 0 .../lib/models/todo_item.dart | 2 +- .../lib/models/todo_list.dart | 0 .../lib/powersync.dart | 6 ++-- .../lib/supabase.dart | 0 .../lib/widgets/list_item.dart | 0 .../lib/widgets/list_item_dialog.dart | 0 .../lib/widgets/lists_page.dart | 0 .../lib/widgets/login_page.dart | 4 +-- .../lib/widgets/query_widget.dart | 0 .../lib/widgets/resultset_table.dart | 0 .../lib/widgets/signup_page.dart | 4 +-- .../lib/widgets/status_app_bar.dart | 0 .../lib/widgets/todo_item_dialog.dart | 0 .../lib/widgets/todo_item_widget.dart | 0 .../lib/widgets/todo_list_page.dart | 2 +- .../linux/.gitignore | 0 .../linux/CMakeLists.txt | 0 .../linux/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 0 .../flutter/generated_plugin_registrant.h | 0 .../linux/flutter/generated_plugins.cmake | 0 .../linux/main.cc | 0 .../linux/my_application.cc | 0 .../linux/my_application.h | 0 .../macos/.gitignore | 0 .../macos/Flutter/Flutter-Debug.xcconfig | 0 .../macos/Flutter/Flutter-Release.xcconfig | 0 .../Flutter/GeneratedPluginRegistrant.swift | 0 .../macos/Podfile | 0 .../macos/Podfile.lock | 0 .../macos/Runner.xcodeproj/project.pbxproj | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../macos/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/app_icon_1024.png | Bin .../AppIcon.appiconset/app_icon_128.png | Bin .../AppIcon.appiconset/app_icon_16.png | Bin .../AppIcon.appiconset/app_icon_256.png | Bin .../AppIcon.appiconset/app_icon_32.png | Bin .../AppIcon.appiconset/app_icon_512.png | Bin .../AppIcon.appiconset/app_icon_64.png | Bin .../macos/Runner/Base.lproj/MainMenu.xib | 0 .../macos/Runner/Configs/AppInfo.xcconfig | 2 +- .../macos/Runner/Configs/Debug.xcconfig | 0 .../macos/Runner/Configs/Release.xcconfig | 0 .../macos/Runner/Configs/Warnings.xcconfig | 0 .../macos/Runner/DebugProfile.entitlements | 0 .../macos/Runner/Info.plist | 0 .../macos/Runner/MainFlutterWindow.swift | 0 .../macos/Runner/Release.entitlements | 0 .../pubspec.lock | 0 .../pubspec.yaml | 4 +-- .../web/favicon.png | Bin .../web/icons/Icon-192.png | Bin .../web/icons/Icon-512.png | Bin .../web/icons/Icon-maskable-192.png | Bin .../web/icons/Icon-maskable-512.png | Bin .../web/index.html | 0 .../web/manifest.json | 0 .../windows/.gitignore | 0 .../windows/CMakeLists.txt | 0 .../windows/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 0 .../flutter/generated_plugin_registrant.h | 0 .../windows/flutter/generated_plugins.cmake | 0 .../windows/runner/CMakeLists.txt | 0 .../windows/runner/Runner.rc | 0 .../windows/runner/flutter_window.cpp | 0 .../windows/runner/flutter_window.h | 0 .../windows/runner/main.cpp | 0 .../windows/runner/resource.h | 0 .../windows/runner/resources/app_icon.ico | Bin .../windows/runner/runner.exe.manifest | 0 .../windows/runner/utils.cpp | 0 .../windows/runner/utils.h | 0 .../windows/runner/win32_window.cpp | 0 .../windows/runner/win32_window.h | 0 .../test/widget_test.dart | 30 ------------------ 150 files changed, 39 insertions(+), 54 deletions(-) rename demos/{offline_first_todolist => local-only-todolist}/.gitignore (100%) rename demos/{offline_first_todolist => local-only-todolist}/.metadata (100%) rename demos/{offline_first_todolist => local-only-todolist}/LICENSE (100%) rename demos/{offline_first_todolist => local-only-todolist}/README.md (69%) rename demos/{offline_first_todolist => local-only-todolist}/analysis_options.yaml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/.gitignore (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/build.gradle (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/debug/AndroidManifest.xml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/AndroidManifest.xml (96%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/drawable-v21/launch_background.xml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/drawable/launch_background.xml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/values-night/styles.xml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/main/res/values/styles.xml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/app/src/profile/AndroidManifest.xml (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/build.gradle (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/gradle.properties (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename demos/{offline_first_todolist => local-only-todolist}/android/settings.gradle (100%) rename demos/{offline_first_todolist => local-only-todolist}/database.sql (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/.gitignore (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Flutter/AppFrameworkInfo.plist (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Flutter/Debug.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Flutter/Release.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Podfile (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Podfile.lock (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcodeproj/project.pbxproj (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/AppDelegate.swift (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Base.lproj/Main.storyboard (100%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Info.plist (97%) rename demos/{offline_first_todolist => local-only-todolist}/ios/Runner/Runner-Bridging-Header.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/app_config_template.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/main.dart (94%) rename demos/{offline_first_todolist => local-only-todolist}/lib/models/schema.dart (93%) rename demos/{offline_first_todolist => local-only-todolist}/lib/models/sync_mode.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/models/todo_item.dart (94%) rename demos/{offline_first_todolist => local-only-todolist}/lib/models/todo_list.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/powersync.dart (97%) rename demos/{offline_first_todolist => local-only-todolist}/lib/supabase.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/list_item.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/list_item_dialog.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/lists_page.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/login_page.dart (96%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/query_widget.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/resultset_table.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/signup_page.dart (96%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/status_app_bar.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/todo_item_dialog.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/todo_item_widget.dart (100%) rename demos/{offline_first_todolist => local-only-todolist}/lib/widgets/todo_list_page.dart (96%) rename demos/{offline_first_todolist => local-only-todolist}/linux/.gitignore (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/CMakeLists.txt (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/flutter/CMakeLists.txt (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/flutter/generated_plugin_registrant.cc (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/flutter/generated_plugin_registrant.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/flutter/generated_plugins.cmake (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/main.cc (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/my_application.cc (100%) rename demos/{offline_first_todolist => local-only-todolist}/linux/my_application.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/.gitignore (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Flutter/Flutter-Debug.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Flutter/Flutter-Release.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Flutter/GeneratedPluginRegistrant.swift (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Podfile (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Podfile.lock (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner.xcodeproj/project.pbxproj (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner.xcworkspace/contents.xcworkspacedata (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/AppDelegate.swift (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Base.lproj/MainMenu.xib (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Configs/AppInfo.xcconfig (92%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Configs/Debug.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Configs/Release.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Configs/Warnings.xcconfig (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/DebugProfile.entitlements (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Info.plist (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/MainFlutterWindow.swift (100%) rename demos/{offline_first_todolist => local-only-todolist}/macos/Runner/Release.entitlements (100%) rename demos/{offline_first_todolist => local-only-todolist}/pubspec.lock (100%) rename demos/{offline_first_todolist => local-only-todolist}/pubspec.yaml (81%) rename demos/{offline_first_todolist => local-only-todolist}/web/favicon.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/web/icons/Icon-192.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/web/icons/Icon-512.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/web/icons/Icon-maskable-192.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/web/icons/Icon-maskable-512.png (100%) rename demos/{offline_first_todolist => local-only-todolist}/web/index.html (100%) rename demos/{offline_first_todolist => local-only-todolist}/web/manifest.json (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/.gitignore (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/CMakeLists.txt (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/flutter/CMakeLists.txt (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/flutter/generated_plugin_registrant.cc (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/flutter/generated_plugin_registrant.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/flutter/generated_plugins.cmake (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/CMakeLists.txt (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/Runner.rc (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/flutter_window.cpp (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/flutter_window.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/main.cpp (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/resource.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/resources/app_icon.ico (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/runner.exe.manifest (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/utils.cpp (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/utils.h (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/win32_window.cpp (100%) rename demos/{offline_first_todolist => local-only-todolist}/windows/runner/win32_window.h (100%) delete mode 100644 demos/offline_first_todolist/test/widget_test.dart diff --git a/demos/offline_first_todolist/.gitignore b/demos/local-only-todolist/.gitignore similarity index 100% rename from demos/offline_first_todolist/.gitignore rename to demos/local-only-todolist/.gitignore diff --git a/demos/offline_first_todolist/.metadata b/demos/local-only-todolist/.metadata similarity index 100% rename from demos/offline_first_todolist/.metadata rename to demos/local-only-todolist/.metadata diff --git a/demos/offline_first_todolist/LICENSE b/demos/local-only-todolist/LICENSE similarity index 100% rename from demos/offline_first_todolist/LICENSE rename to demos/local-only-todolist/LICENSE diff --git a/demos/offline_first_todolist/README.md b/demos/local-only-todolist/README.md similarity index 69% rename from demos/offline_first_todolist/README.md rename to demos/local-only-todolist/README.md index 835e4b9a..a4714672 100644 --- a/demos/offline_first_todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -1,12 +1,12 @@ -# PowerSync + Supabase Flutter Offline to Online Mode Demo: Todo List App +# PowerSync + Supabase Flutter Local Only to Online Mode Demo: Todo List App -This demo app is an extension of the Flutter Todo List App that demonstrates how to use the PowerSync SDK for Flutter in an offline first way. It allows the user to use the app offline without having to sign in. After signing in data that was kept offline is synced up, and if the user had any data already uploaded that would be synced down. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). +This demo app is an extension of the Flutter Todo List App that demonstrates how to use the PowerSync SDK for Flutter in an local only way. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). # Running the app Ensure you have [melos](https://melos.invertase.dev/~melos-latest/getting-started) installed. -1. `cd demos/offline-first-todolist` +1. `cd demos/local-only-todolist` 2. `melos prepare` 3. `cp lib/app_config_template.dart lib/app_config.dart` 4. Insert your Supabase and PowerSync project credentials into `lib/app_config.dart` (See instructions below) @@ -45,10 +45,25 @@ Insert the credentials of your new Supabase and PowerSync projects into `lib/app # Explanation -The demo implements offline and online modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). The app initially starts in offline mode with the offline schema. When the user signs in, the database schema is updated to the online schema, and the data is migrated to enable synchronization.xww +The demo implements local-only and synced modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). The app initially starts in local only mode with the offline schema. When the user signs in, the database schema is updated to the online schema, and the data is migrated to enable synchronization. After this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). +## Flow chart + +```mermaid +graph TD + K[Start] --> A[App is empty and local-only] + A --> B[User can create 0 or more todos that are stored local-only] + A --> C[User can login/register] + B --> + C --> D[Local-only data gets synced to PowerSync service] + D --> E[User can create 0 or more todos that will get synced] + D --> F + E --> F[User can logout explicitly] + F --> A +``` + ## Limitations `updateSchema` cannot be called inside a transaction, and it's recommended to perform the schema update when the database isn't connected. diff --git a/demos/offline_first_todolist/analysis_options.yaml b/demos/local-only-todolist/analysis_options.yaml similarity index 100% rename from demos/offline_first_todolist/analysis_options.yaml rename to demos/local-only-todolist/analysis_options.yaml diff --git a/demos/offline_first_todolist/android/.gitignore b/demos/local-only-todolist/android/.gitignore similarity index 100% rename from demos/offline_first_todolist/android/.gitignore rename to demos/local-only-todolist/android/.gitignore diff --git a/demos/offline_first_todolist/android/app/build.gradle b/demos/local-only-todolist/android/app/build.gradle similarity index 100% rename from demos/offline_first_todolist/android/app/build.gradle rename to demos/local-only-todolist/android/app/build.gradle diff --git a/demos/offline_first_todolist/android/app/src/debug/AndroidManifest.xml b/demos/local-only-todolist/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from demos/offline_first_todolist/android/app/src/debug/AndroidManifest.xml rename to demos/local-only-todolist/android/app/src/debug/AndroidManifest.xml diff --git a/demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml b/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml similarity index 96% rename from demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml rename to demos/local-only-todolist/android/app/src/main/AndroidManifest.xml index 55e175c4..fb993125 100644 --- a/demos/offline_first_todolist/android/app/src/main/AndroidManifest.xml +++ b/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Powersync Flutter Offline First Demo + Powersync Flutter Local Only Demo CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/demos/offline_first_todolist/ios/Runner/Runner-Bridging-Header.h b/demos/local-only-todolist/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from demos/offline_first_todolist/ios/Runner/Runner-Bridging-Header.h rename to demos/local-only-todolist/ios/Runner/Runner-Bridging-Header.h diff --git a/demos/offline_first_todolist/lib/app_config_template.dart b/demos/local-only-todolist/lib/app_config_template.dart similarity index 100% rename from demos/offline_first_todolist/lib/app_config_template.dart rename to demos/local-only-todolist/lib/app_config_template.dart diff --git a/demos/offline_first_todolist/lib/main.dart b/demos/local-only-todolist/lib/main.dart similarity index 94% rename from demos/offline_first_todolist/lib/main.dart rename to demos/local-only-todolist/lib/main.dart index 607498fb..9e2c2544 100644 --- a/demos/offline_first_todolist/lib/main.dart +++ b/demos/local-only-todolist/lib/main.dart @@ -1,8 +1,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; -import 'package:powersync_flutter_offline_first_demo/models/schema.dart'; -import 'package:powersync_flutter_offline_first_demo/models/sync_mode.dart'; +import 'package:powersync_flutter_local_only_demo/models/schema.dart'; +import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; import './powersync.dart'; import './widgets/lists_page.dart'; @@ -57,7 +57,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'PowerSync Flutter Offline First Demo', + title: 'PowerSync Flutter Local Only Demo', theme: ThemeData( primarySwatch: Colors.blue, ), diff --git a/demos/offline_first_todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart similarity index 93% rename from demos/offline_first_todolist/lib/models/schema.dart rename to demos/local-only-todolist/lib/models/schema.dart index 34eaa840..d197946a 100644 --- a/demos/offline_first_todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -1,11 +1,11 @@ import 'package:powersync/powersync.dart'; -import 'package:powersync_flutter_offline_first_demo/models/sync_mode.dart'; +import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; /// The schema contains two copies of each table - a local-only one, and /// a online/synced one. Depending on the 'online' flag, one of those gets /// the main 'lists' / 'todos' view name. /// -/// For offline, the views become: +/// For local only, the views become: /// online_todos /// todos /// online_lists @@ -80,7 +80,7 @@ switchToOnlineSchema(PowerSyncDatabase db, String userId) async { await tx.execute('INSERT INTO $todosTable SELECT * FROM local_$todosTable'); - // Delete the "offline-only" data. + // Delete the "local-only" data. await tx.execute('DELETE FROM local_$todosTable'); await tx.execute('DELETE FROM local_$listsTable'); }); diff --git a/demos/offline_first_todolist/lib/models/sync_mode.dart b/demos/local-only-todolist/lib/models/sync_mode.dart similarity index 100% rename from demos/offline_first_todolist/lib/models/sync_mode.dart rename to demos/local-only-todolist/lib/models/sync_mode.dart diff --git a/demos/offline_first_todolist/lib/models/todo_item.dart b/demos/local-only-todolist/lib/models/todo_item.dart similarity index 94% rename from demos/offline_first_todolist/lib/models/todo_item.dart rename to demos/local-only-todolist/lib/models/todo_item.dart index 49738ef6..650dfd20 100644 --- a/demos/offline_first_todolist/lib/models/todo_item.dart +++ b/demos/local-only-todolist/lib/models/todo_item.dart @@ -1,4 +1,4 @@ -import 'package:powersync_flutter_offline_first_demo/models/schema.dart'; +import 'package:powersync_flutter_local_only_demo/models/schema.dart'; import '../powersync.dart'; import 'package:powersync/sqlite3_common.dart' as sqlite; diff --git a/demos/offline_first_todolist/lib/models/todo_list.dart b/demos/local-only-todolist/lib/models/todo_list.dart similarity index 100% rename from demos/offline_first_todolist/lib/models/todo_list.dart rename to demos/local-only-todolist/lib/models/todo_list.dart diff --git a/demos/offline_first_todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart similarity index 97% rename from demos/offline_first_todolist/lib/powersync.dart rename to demos/local-only-todolist/lib/powersync.dart index 33b0f5c4..d72a5749 100644 --- a/demos/offline_first_todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -4,7 +4,7 @@ import 'package:logging/logging.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:powersync/powersync.dart'; -import 'package:powersync_flutter_offline_first_demo/models/sync_mode.dart'; +import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import './app_config.dart'; @@ -143,11 +143,11 @@ bool isLoggedIn() { /// id of the user currently logged in String getUserId() { return Supabase.instance.client.auth.currentSession?.user.id ?? - '00000000-0000-0000-0000-000000000000'; // default ID supplied for offline mode + '00000000-0000-0000-0000-000000000000'; // default ID supplied for local only mode } Future getDatabasePath() async { - const dbFilename = 'powersync-demo-offline.db'; + const dbFilename = 'powersync-demo-local-only.db'; // getApplicationSupportDirectory is not supported on Web if (kIsWeb) { return dbFilename; diff --git a/demos/offline_first_todolist/lib/supabase.dart b/demos/local-only-todolist/lib/supabase.dart similarity index 100% rename from demos/offline_first_todolist/lib/supabase.dart rename to demos/local-only-todolist/lib/supabase.dart diff --git a/demos/offline_first_todolist/lib/widgets/list_item.dart b/demos/local-only-todolist/lib/widgets/list_item.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/list_item.dart rename to demos/local-only-todolist/lib/widgets/list_item.dart diff --git a/demos/offline_first_todolist/lib/widgets/list_item_dialog.dart b/demos/local-only-todolist/lib/widgets/list_item_dialog.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/list_item_dialog.dart rename to demos/local-only-todolist/lib/widgets/list_item_dialog.dart diff --git a/demos/offline_first_todolist/lib/widgets/lists_page.dart b/demos/local-only-todolist/lib/widgets/lists_page.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/lists_page.dart rename to demos/local-only-todolist/lib/widgets/lists_page.dart diff --git a/demos/offline_first_todolist/lib/widgets/login_page.dart b/demos/local-only-todolist/lib/widgets/login_page.dart similarity index 96% rename from demos/offline_first_todolist/lib/widgets/login_page.dart rename to demos/local-only-todolist/lib/widgets/login_page.dart index abdf2dc3..dc238a1f 100644 --- a/demos/offline_first_todolist/lib/widgets/login_page.dart +++ b/demos/local-only-todolist/lib/widgets/login_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:powersync_flutter_offline_first_demo/powersync.dart'; +import 'package:powersync_flutter_local_only_demo/powersync.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../main.dart'; @@ -68,7 +68,7 @@ class _LoginPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Offline First Demo"), + title: const Text("PowerSync Flutter Local Only Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/offline_first_todolist/lib/widgets/query_widget.dart b/demos/local-only-todolist/lib/widgets/query_widget.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/query_widget.dart rename to demos/local-only-todolist/lib/widgets/query_widget.dart diff --git a/demos/offline_first_todolist/lib/widgets/resultset_table.dart b/demos/local-only-todolist/lib/widgets/resultset_table.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/resultset_table.dart rename to demos/local-only-todolist/lib/widgets/resultset_table.dart diff --git a/demos/offline_first_todolist/lib/widgets/signup_page.dart b/demos/local-only-todolist/lib/widgets/signup_page.dart similarity index 96% rename from demos/offline_first_todolist/lib/widgets/signup_page.dart rename to demos/local-only-todolist/lib/widgets/signup_page.dart index d67e6407..ff329d59 100644 --- a/demos/offline_first_todolist/lib/widgets/signup_page.dart +++ b/demos/local-only-todolist/lib/widgets/signup_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:powersync_flutter_offline_first_demo/powersync.dart'; +import 'package:powersync_flutter_local_only_demo/powersync.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../main.dart'; @@ -67,7 +67,7 @@ class _SignupPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Offline First Demo"), + title: const Text("PowerSync Flutter Local Only Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/offline_first_todolist/lib/widgets/status_app_bar.dart b/demos/local-only-todolist/lib/widgets/status_app_bar.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/status_app_bar.dart rename to demos/local-only-todolist/lib/widgets/status_app_bar.dart diff --git a/demos/offline_first_todolist/lib/widgets/todo_item_dialog.dart b/demos/local-only-todolist/lib/widgets/todo_item_dialog.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/todo_item_dialog.dart rename to demos/local-only-todolist/lib/widgets/todo_item_dialog.dart diff --git a/demos/offline_first_todolist/lib/widgets/todo_item_widget.dart b/demos/local-only-todolist/lib/widgets/todo_item_widget.dart similarity index 100% rename from demos/offline_first_todolist/lib/widgets/todo_item_widget.dart rename to demos/local-only-todolist/lib/widgets/todo_item_widget.dart diff --git a/demos/offline_first_todolist/lib/widgets/todo_list_page.dart b/demos/local-only-todolist/lib/widgets/todo_list_page.dart similarity index 96% rename from demos/offline_first_todolist/lib/widgets/todo_list_page.dart rename to demos/local-only-todolist/lib/widgets/todo_list_page.dart index 805e8e48..764e5211 100644 --- a/demos/offline_first_todolist/lib/widgets/todo_list_page.dart +++ b/demos/local-only-todolist/lib/widgets/todo_list_page.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:powersync_flutter_offline_first_demo/models/todo_item.dart'; +import 'package:powersync_flutter_local_only_demo/models/todo_item.dart'; import './status_app_bar.dart'; import './todo_item_dialog.dart'; diff --git a/demos/offline_first_todolist/linux/.gitignore b/demos/local-only-todolist/linux/.gitignore similarity index 100% rename from demos/offline_first_todolist/linux/.gitignore rename to demos/local-only-todolist/linux/.gitignore diff --git a/demos/offline_first_todolist/linux/CMakeLists.txt b/demos/local-only-todolist/linux/CMakeLists.txt similarity index 100% rename from demos/offline_first_todolist/linux/CMakeLists.txt rename to demos/local-only-todolist/linux/CMakeLists.txt diff --git a/demos/offline_first_todolist/linux/flutter/CMakeLists.txt b/demos/local-only-todolist/linux/flutter/CMakeLists.txt similarity index 100% rename from demos/offline_first_todolist/linux/flutter/CMakeLists.txt rename to demos/local-only-todolist/linux/flutter/CMakeLists.txt diff --git a/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.cc b/demos/local-only-todolist/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.cc rename to demos/local-only-todolist/linux/flutter/generated_plugin_registrant.cc diff --git a/demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.h b/demos/local-only-todolist/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from demos/offline_first_todolist/linux/flutter/generated_plugin_registrant.h rename to demos/local-only-todolist/linux/flutter/generated_plugin_registrant.h diff --git a/demos/offline_first_todolist/linux/flutter/generated_plugins.cmake b/demos/local-only-todolist/linux/flutter/generated_plugins.cmake similarity index 100% rename from demos/offline_first_todolist/linux/flutter/generated_plugins.cmake rename to demos/local-only-todolist/linux/flutter/generated_plugins.cmake diff --git a/demos/offline_first_todolist/linux/main.cc b/demos/local-only-todolist/linux/main.cc similarity index 100% rename from demos/offline_first_todolist/linux/main.cc rename to demos/local-only-todolist/linux/main.cc diff --git a/demos/offline_first_todolist/linux/my_application.cc b/demos/local-only-todolist/linux/my_application.cc similarity index 100% rename from demos/offline_first_todolist/linux/my_application.cc rename to demos/local-only-todolist/linux/my_application.cc diff --git a/demos/offline_first_todolist/linux/my_application.h b/demos/local-only-todolist/linux/my_application.h similarity index 100% rename from demos/offline_first_todolist/linux/my_application.h rename to demos/local-only-todolist/linux/my_application.h diff --git a/demos/offline_first_todolist/macos/.gitignore b/demos/local-only-todolist/macos/.gitignore similarity index 100% rename from demos/offline_first_todolist/macos/.gitignore rename to demos/local-only-todolist/macos/.gitignore diff --git a/demos/offline_first_todolist/macos/Flutter/Flutter-Debug.xcconfig b/demos/local-only-todolist/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from demos/offline_first_todolist/macos/Flutter/Flutter-Debug.xcconfig rename to demos/local-only-todolist/macos/Flutter/Flutter-Debug.xcconfig diff --git a/demos/offline_first_todolist/macos/Flutter/Flutter-Release.xcconfig b/demos/local-only-todolist/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from demos/offline_first_todolist/macos/Flutter/Flutter-Release.xcconfig rename to demos/local-only-todolist/macos/Flutter/Flutter-Release.xcconfig diff --git a/demos/offline_first_todolist/macos/Flutter/GeneratedPluginRegistrant.swift b/demos/local-only-todolist/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from demos/offline_first_todolist/macos/Flutter/GeneratedPluginRegistrant.swift rename to demos/local-only-todolist/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/demos/offline_first_todolist/macos/Podfile b/demos/local-only-todolist/macos/Podfile similarity index 100% rename from demos/offline_first_todolist/macos/Podfile rename to demos/local-only-todolist/macos/Podfile diff --git a/demos/offline_first_todolist/macos/Podfile.lock b/demos/local-only-todolist/macos/Podfile.lock similarity index 100% rename from demos/offline_first_todolist/macos/Podfile.lock rename to demos/local-only-todolist/macos/Podfile.lock diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj b/demos/local-only-todolist/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from demos/offline_first_todolist/macos/Runner.xcodeproj/project.pbxproj rename to demos/local-only-todolist/macos/Runner.xcodeproj/project.pbxproj diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/local-only-todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/offline_first_todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/local-only-todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demos/local-only-todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from demos/offline_first_todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to demos/local-only-todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/demos/offline_first_todolist/macos/Runner.xcworkspace/contents.xcworkspacedata b/demos/local-only-todolist/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from demos/offline_first_todolist/macos/Runner.xcworkspace/contents.xcworkspacedata rename to demos/local-only-todolist/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/demos/offline_first_todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/local-only-todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/offline_first_todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/local-only-todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/offline_first_todolist/macos/Runner/AppDelegate.swift b/demos/local-only-todolist/macos/Runner/AppDelegate.swift similarity index 100% rename from demos/offline_first_todolist/macos/Runner/AppDelegate.swift rename to demos/local-only-todolist/macos/Runner/AppDelegate.swift diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/demos/offline_first_todolist/macos/Runner/Base.lproj/MainMenu.xib b/demos/local-only-todolist/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Base.lproj/MainMenu.xib rename to demos/local-only-todolist/macos/Runner/Base.lproj/MainMenu.xib diff --git a/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig b/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig similarity index 92% rename from demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig rename to demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig index 370c9893..58c5a90b 100644 --- a/demos/offline_first_todolist/macos/Runner/Configs/AppInfo.xcconfig +++ b/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig @@ -5,7 +5,7 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = PowerSync Supabase Demo +PRODUCT_NAME = PowerSync Supabase Local Only Demo // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = co.powersync.demotodolist diff --git a/demos/offline_first_todolist/macos/Runner/Configs/Debug.xcconfig b/demos/local-only-todolist/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Configs/Debug.xcconfig rename to demos/local-only-todolist/macos/Runner/Configs/Debug.xcconfig diff --git a/demos/offline_first_todolist/macos/Runner/Configs/Release.xcconfig b/demos/local-only-todolist/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Configs/Release.xcconfig rename to demos/local-only-todolist/macos/Runner/Configs/Release.xcconfig diff --git a/demos/offline_first_todolist/macos/Runner/Configs/Warnings.xcconfig b/demos/local-only-todolist/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Configs/Warnings.xcconfig rename to demos/local-only-todolist/macos/Runner/Configs/Warnings.xcconfig diff --git a/demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements b/demos/local-only-todolist/macos/Runner/DebugProfile.entitlements similarity index 100% rename from demos/offline_first_todolist/macos/Runner/DebugProfile.entitlements rename to demos/local-only-todolist/macos/Runner/DebugProfile.entitlements diff --git a/demos/offline_first_todolist/macos/Runner/Info.plist b/demos/local-only-todolist/macos/Runner/Info.plist similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Info.plist rename to demos/local-only-todolist/macos/Runner/Info.plist diff --git a/demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift b/demos/local-only-todolist/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from demos/offline_first_todolist/macos/Runner/MainFlutterWindow.swift rename to demos/local-only-todolist/macos/Runner/MainFlutterWindow.swift diff --git a/demos/offline_first_todolist/macos/Runner/Release.entitlements b/demos/local-only-todolist/macos/Runner/Release.entitlements similarity index 100% rename from demos/offline_first_todolist/macos/Runner/Release.entitlements rename to demos/local-only-todolist/macos/Runner/Release.entitlements diff --git a/demos/offline_first_todolist/pubspec.lock b/demos/local-only-todolist/pubspec.lock similarity index 100% rename from demos/offline_first_todolist/pubspec.lock rename to demos/local-only-todolist/pubspec.lock diff --git a/demos/offline_first_todolist/pubspec.yaml b/demos/local-only-todolist/pubspec.yaml similarity index 81% rename from demos/offline_first_todolist/pubspec.yaml rename to demos/local-only-todolist/pubspec.yaml index ac4e3336..4ac6fb81 100644 --- a/demos/offline_first_todolist/pubspec.yaml +++ b/demos/local-only-todolist/pubspec.yaml @@ -1,5 +1,5 @@ -name: powersync_flutter_offline_first_demo -description: PowerSync Flutter Offline First Demo +name: powersync_flutter_local_only_demo +description: PowerSync Flutter Local Only Demo publish_to: "none" version: 1.0.1 diff --git a/demos/offline_first_todolist/web/favicon.png b/demos/local-only-todolist/web/favicon.png similarity index 100% rename from demos/offline_first_todolist/web/favicon.png rename to demos/local-only-todolist/web/favicon.png diff --git a/demos/offline_first_todolist/web/icons/Icon-192.png b/demos/local-only-todolist/web/icons/Icon-192.png similarity index 100% rename from demos/offline_first_todolist/web/icons/Icon-192.png rename to demos/local-only-todolist/web/icons/Icon-192.png diff --git a/demos/offline_first_todolist/web/icons/Icon-512.png b/demos/local-only-todolist/web/icons/Icon-512.png similarity index 100% rename from demos/offline_first_todolist/web/icons/Icon-512.png rename to demos/local-only-todolist/web/icons/Icon-512.png diff --git a/demos/offline_first_todolist/web/icons/Icon-maskable-192.png b/demos/local-only-todolist/web/icons/Icon-maskable-192.png similarity index 100% rename from demos/offline_first_todolist/web/icons/Icon-maskable-192.png rename to demos/local-only-todolist/web/icons/Icon-maskable-192.png diff --git a/demos/offline_first_todolist/web/icons/Icon-maskable-512.png b/demos/local-only-todolist/web/icons/Icon-maskable-512.png similarity index 100% rename from demos/offline_first_todolist/web/icons/Icon-maskable-512.png rename to demos/local-only-todolist/web/icons/Icon-maskable-512.png diff --git a/demos/offline_first_todolist/web/index.html b/demos/local-only-todolist/web/index.html similarity index 100% rename from demos/offline_first_todolist/web/index.html rename to demos/local-only-todolist/web/index.html diff --git a/demos/offline_first_todolist/web/manifest.json b/demos/local-only-todolist/web/manifest.json similarity index 100% rename from demos/offline_first_todolist/web/manifest.json rename to demos/local-only-todolist/web/manifest.json diff --git a/demos/offline_first_todolist/windows/.gitignore b/demos/local-only-todolist/windows/.gitignore similarity index 100% rename from demos/offline_first_todolist/windows/.gitignore rename to demos/local-only-todolist/windows/.gitignore diff --git a/demos/offline_first_todolist/windows/CMakeLists.txt b/demos/local-only-todolist/windows/CMakeLists.txt similarity index 100% rename from demos/offline_first_todolist/windows/CMakeLists.txt rename to demos/local-only-todolist/windows/CMakeLists.txt diff --git a/demos/offline_first_todolist/windows/flutter/CMakeLists.txt b/demos/local-only-todolist/windows/flutter/CMakeLists.txt similarity index 100% rename from demos/offline_first_todolist/windows/flutter/CMakeLists.txt rename to demos/local-only-todolist/windows/flutter/CMakeLists.txt diff --git a/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.cc b/demos/local-only-todolist/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.cc rename to demos/local-only-todolist/windows/flutter/generated_plugin_registrant.cc diff --git a/demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.h b/demos/local-only-todolist/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from demos/offline_first_todolist/windows/flutter/generated_plugin_registrant.h rename to demos/local-only-todolist/windows/flutter/generated_plugin_registrant.h diff --git a/demos/offline_first_todolist/windows/flutter/generated_plugins.cmake b/demos/local-only-todolist/windows/flutter/generated_plugins.cmake similarity index 100% rename from demos/offline_first_todolist/windows/flutter/generated_plugins.cmake rename to demos/local-only-todolist/windows/flutter/generated_plugins.cmake diff --git a/demos/offline_first_todolist/windows/runner/CMakeLists.txt b/demos/local-only-todolist/windows/runner/CMakeLists.txt similarity index 100% rename from demos/offline_first_todolist/windows/runner/CMakeLists.txt rename to demos/local-only-todolist/windows/runner/CMakeLists.txt diff --git a/demos/offline_first_todolist/windows/runner/Runner.rc b/demos/local-only-todolist/windows/runner/Runner.rc similarity index 100% rename from demos/offline_first_todolist/windows/runner/Runner.rc rename to demos/local-only-todolist/windows/runner/Runner.rc diff --git a/demos/offline_first_todolist/windows/runner/flutter_window.cpp b/demos/local-only-todolist/windows/runner/flutter_window.cpp similarity index 100% rename from demos/offline_first_todolist/windows/runner/flutter_window.cpp rename to demos/local-only-todolist/windows/runner/flutter_window.cpp diff --git a/demos/offline_first_todolist/windows/runner/flutter_window.h b/demos/local-only-todolist/windows/runner/flutter_window.h similarity index 100% rename from demos/offline_first_todolist/windows/runner/flutter_window.h rename to demos/local-only-todolist/windows/runner/flutter_window.h diff --git a/demos/offline_first_todolist/windows/runner/main.cpp b/demos/local-only-todolist/windows/runner/main.cpp similarity index 100% rename from demos/offline_first_todolist/windows/runner/main.cpp rename to demos/local-only-todolist/windows/runner/main.cpp diff --git a/demos/offline_first_todolist/windows/runner/resource.h b/demos/local-only-todolist/windows/runner/resource.h similarity index 100% rename from demos/offline_first_todolist/windows/runner/resource.h rename to demos/local-only-todolist/windows/runner/resource.h diff --git a/demos/offline_first_todolist/windows/runner/resources/app_icon.ico b/demos/local-only-todolist/windows/runner/resources/app_icon.ico similarity index 100% rename from demos/offline_first_todolist/windows/runner/resources/app_icon.ico rename to demos/local-only-todolist/windows/runner/resources/app_icon.ico diff --git a/demos/offline_first_todolist/windows/runner/runner.exe.manifest b/demos/local-only-todolist/windows/runner/runner.exe.manifest similarity index 100% rename from demos/offline_first_todolist/windows/runner/runner.exe.manifest rename to demos/local-only-todolist/windows/runner/runner.exe.manifest diff --git a/demos/offline_first_todolist/windows/runner/utils.cpp b/demos/local-only-todolist/windows/runner/utils.cpp similarity index 100% rename from demos/offline_first_todolist/windows/runner/utils.cpp rename to demos/local-only-todolist/windows/runner/utils.cpp diff --git a/demos/offline_first_todolist/windows/runner/utils.h b/demos/local-only-todolist/windows/runner/utils.h similarity index 100% rename from demos/offline_first_todolist/windows/runner/utils.h rename to demos/local-only-todolist/windows/runner/utils.h diff --git a/demos/offline_first_todolist/windows/runner/win32_window.cpp b/demos/local-only-todolist/windows/runner/win32_window.cpp similarity index 100% rename from demos/offline_first_todolist/windows/runner/win32_window.cpp rename to demos/local-only-todolist/windows/runner/win32_window.cpp diff --git a/demos/offline_first_todolist/windows/runner/win32_window.h b/demos/local-only-todolist/windows/runner/win32_window.h similarity index 100% rename from demos/offline_first_todolist/windows/runner/win32_window.h rename to demos/local-only-todolist/windows/runner/win32_window.h diff --git a/demos/offline_first_todolist/test/widget_test.dart b/demos/offline_first_todolist/test/widget_test.dart deleted file mode 100644 index 675d2885..00000000 --- a/demos/offline_first_todolist/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. 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/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:offline_first_todolist/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const 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 0c79c902845a30324d107a69feaa13f543b30ac0 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 5 Aug 2024 13:30:59 +0200 Subject: [PATCH 04/34] Fix flutter lint warnings. --- .../lib/widgets/login_page.dart | 19 +++++++------------ .../lib/widgets/signup_page.dart | 8 ++++---- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/demos/local-only-todolist/lib/widgets/login_page.dart b/demos/local-only-todolist/lib/widgets/login_page.dart index dc238a1f..29e48675 100644 --- a/demos/local-only-todolist/lib/widgets/login_page.dart +++ b/demos/local-only-todolist/lib/widgets/login_page.dart @@ -32,19 +32,14 @@ class _LoginPageState extends State { _error = null; }); try { - try { - await Supabase.instance.client.auth.signInWithPassword( - email: _usernameController.text, - password: _passwordController.text); - } catch (e) { - print(e); - rethrow; - } - if (context.mounted) { - // We connect and upgrade the database schema here so that by the time the watch() calls are made in the - // ListsPage, watch will track the new tables instead.. - await connectDatabase(); + await Supabase.instance.client.auth.signInWithPassword( + email: _usernameController.text, password: _passwordController.text); + // We connect and upgrade the database schema here so that by the time the watch() calls are made in the + // ListsPage, watch will track the new tables instead.. + await connectDatabase(); + + if (context.mounted) { Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => listsPage, )); diff --git a/demos/local-only-todolist/lib/widgets/signup_page.dart b/demos/local-only-todolist/lib/widgets/signup_page.dart index ff329d59..86ce7cdf 100644 --- a/demos/local-only-todolist/lib/widgets/signup_page.dart +++ b/demos/local-only-todolist/lib/widgets/signup_page.dart @@ -35,12 +35,12 @@ class _SignupPageState extends State { final response = await Supabase.instance.client.auth.signUp( email: _usernameController.text, password: _passwordController.text); + // We connect and upgrade the database schema here so that by the time the watch() calls are made in the + // ListsPage, watch will track the new tables instead.. + await connectDatabase(); + if (context.mounted) { if (response.session != null) { - // We connect and upgrade the database schema here so that by the time the watch() calls are made in the - // ListsPage, watch will track the new tables instead.. - await connectDatabase(); - Navigator.of(context).pushReplacement(MaterialPageRoute( builder: (context) => homePage, )); From 4c241823162ccba3a2aa960efeeaa82564a10a40 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 7 Aug 2024 10:15:33 +0200 Subject: [PATCH 05/34] Updated readme to allow an local-only setup. Improved schema switching comment. --- demos/local-only-todolist/.gitignore | 5 +---- demos/local-only-todolist/README.md | 12 ++++++++---- ...p_config_template.dart => app_config.dart} | 3 +-- demos/local-only-todolist/lib/main.dart | 5 +++++ .../lib/models/schema.dart | 19 +++++++++++++++---- .../lib/models/sync_mode.dart | 6 +++--- demos/local-only-todolist/lib/powersync.dart | 6 +++--- 7 files changed, 36 insertions(+), 20 deletions(-) rename demos/local-only-todolist/lib/{app_config_template.dart => app_config.dart} (56%) diff --git a/demos/local-only-todolist/.gitignore b/demos/local-only-todolist/.gitignore index 1a825b5b..823033ae 100644 --- a/demos/local-only-todolist/.gitignore +++ b/demos/local-only-todolist/.gitignore @@ -44,7 +44,4 @@ app.*.map.json /android/app/release # asdf -.tool-versions - -# secrets -app_config.dart \ No newline at end of file +.tool-versions \ No newline at end of file diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index a4714672..7a1f30d6 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -2,15 +2,19 @@ This demo app is an extension of the Flutter Todo List App that demonstrates how to use the PowerSync SDK for Flutter in an local only way. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). -# Running the app +# Running the app with local-only +Note that if Supabase and PowerSync credentials have not been been configured, a user will not be able to login or sign up. There is a hardcoded check in `main.dart` for this. Ensure you have [melos](https://melos.invertase.dev/~melos-latest/getting-started) installed. 1. `cd demos/local-only-todolist` 2. `melos prepare` -3. `cp lib/app_config_template.dart lib/app_config.dart` -4. Insert your Supabase and PowerSync project credentials into `lib/app_config.dart` (See instructions below) -5. `flutter run` +3. `flutter run` + +# Setting up sync functionality + +Insert your Supabase and PowerSync project credentials into `lib/app_config.dart` (See instructions below). +A user should now be able to login or sign up, which enables the sync functionality. # Set up Supabase Project diff --git a/demos/local-only-todolist/lib/app_config_template.dart b/demos/local-only-todolist/lib/app_config.dart similarity index 56% rename from demos/local-only-todolist/lib/app_config_template.dart rename to demos/local-only-todolist/lib/app_config.dart index d7ead31d..c6e12d26 100644 --- a/demos/local-only-todolist/lib/app_config_template.dart +++ b/demos/local-only-todolist/lib/app_config.dart @@ -1,5 +1,4 @@ -// Copy this template: `cp lib/app_config_template.dart lib/app_config.dart` -// Edit lib/app_config.dart and enter your Supabase and PowerSync project details. +// Enter your Supabase and PowerSync project details. class AppConfig { static const String supabaseUrl = 'https://foo.supabase.co'; static const String supabaseAnonKey = 'foo'; diff --git a/demos/local-only-todolist/lib/main.dart b/demos/local-only-todolist/lib/main.dart index 9e2c2544..42f4b98c 100644 --- a/demos/local-only-todolist/lib/main.dart +++ b/demos/local-only-todolist/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; +import 'package:powersync_flutter_local_only_demo/app_config.dart'; import 'package:powersync_flutter_local_only_demo/models/schema.dart'; import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; @@ -126,6 +127,10 @@ class MyHomePage extends StatelessWidget { )); } }, + enabled: // disable login/signup if credentials aren't configured. + !(AppConfig.supabaseUrl == "https://foo.supabase.co" || + AppConfig.powersyncUrl == + "https://foo.powersync.journeyapps.com"), ), ], ), diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index d197946a..51e49bcf 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -1,21 +1,32 @@ import 'package:powersync/powersync.dart'; import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; -/// The schema contains two copies of each table - a local-only one, and -/// a online/synced one. Depending on the 'online' flag, one of those gets -/// the main 'lists' / 'todos' view name. +/// This schema design supports an online/local-only workflow by managing data +/// across two versions of each table: one for local/offline use and one for +/// online/synced use. This approach simplifies the handling of data in different +/// connectivity states. /// /// For local only, the views become: /// online_todos /// todos /// online_lists /// lists +/// +/// - 'todos' and 'lists' refer to the local-only data. +/// - 'online_todos' and 'online_lists' refer to the data that will be synced +/// once online, making it clear that these are not currently synchronized. +/// /// For online, we have these views: /// todos /// local_todos /// lists /// local_lists /// +/// - 'todos' and 'lists' refer to the synced/online data. +/// - local_todos' and 'local_lists' refer to the local-only data, allowing +/// for temporary storage or operations before syncing. +/// +/// For an offline-to-online transition [switchToOnlineSchema] copies data so that it ends up in the upload queue. const todosTable = 'todos'; const listsTable = 'lists'; @@ -69,7 +80,7 @@ Schema makeSchema({online = bool}) { switchToOnlineSchema(PowerSyncDatabase db, String userId) async { await db.updateSchema(makeSchema(online: true)); - await setSyncMode(true); + await setSyncEnabled(true); await db.writeTransaction((tx) async { // Copy local data to the "online" views. diff --git a/demos/local-only-todolist/lib/models/sync_mode.dart b/demos/local-only-todolist/lib/models/sync_mode.dart index e066a45e..b28453d0 100644 --- a/demos/local-only-todolist/lib/models/sync_mode.dart +++ b/demos/local-only-todolist/lib/models/sync_mode.dart @@ -28,19 +28,19 @@ openSyncModeDatabase() async { await migrations.migrate(sqliteDb); } -Future getSyncMode() async { +Future getSyncEnabled() async { var rows = await sqliteDb .getAll('SELECT sync_enabled from local_system where id = 1'); if (rows.isEmpty) { - await setSyncMode(false); + await setSyncEnabled(false); return false; } return rows[0]['sync_enabled'] == 'TRUE'; } -setSyncMode(bool enabled) async { +setSyncEnabled(bool enabled) async { var enabledString = enabled ? "TRUE" : "FALSE"; await sqliteDb.execute( 'INSERT OR REPLACE INTO local_system(id, sync_enabled) VALUES (1, ?);', diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index d72a5749..dad41f1c 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -157,7 +157,7 @@ Future getDatabasePath() async { } Future openDatabase() async { - var isSyncMode = await getSyncMode(); + var isSyncMode = await getSyncEnabled(); db = PowerSyncDatabase( schema: makeSchema(online: isSyncMode), path: await getDatabasePath(), @@ -177,7 +177,7 @@ Future connectDatabase() async { log.severe("Can't connect database without being signed in"); } SupabaseConnector? currentConnector; - var isSyncMode = await getSyncMode(); + var isSyncMode = await getSyncEnabled(); if (!isSyncMode) { await switchToOnlineSchema(db, getUserId()); @@ -206,6 +206,6 @@ Future logout() async { await db.disconnectAndClear(); // Resetting app so that no-sync mode works again - await await setSyncMode(false); + await await setSyncEnabled(false); await openDatabase(); } From 9ad96f44587cb34bb7988c2bacc047e02323c713 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 8 Aug 2024 10:51:56 +0200 Subject: [PATCH 06/34] Updated readme. Tried making the schema documentation clearer by changing the local and online prefixes. --- demos/local-only-todolist/README.md | 6 +-- .../android/app/src/main/AndroidManifest.xml | 2 +- .../local-only-todolist/ios/Runner/Info.plist | 2 +- demos/local-only-todolist/lib/main.dart | 2 +- .../lib/models/schema.dart | 41 ++++++++++--------- demos/local-only-todolist/lib/powersync.dart | 4 +- .../lib/widgets/login_page.dart | 2 +- .../lib/widgets/signup_page.dart | 2 +- .../macos/Runner/Configs/AppInfo.xcconfig | 2 +- demos/local-only-todolist/pubspec.yaml | 2 +- 10 files changed, 33 insertions(+), 32 deletions(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index 7a1f30d6..e6c3e016 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -1,6 +1,6 @@ -# PowerSync + Supabase Flutter Local Only to Online Mode Demo: Todo List App +# PowerSync + Supabase Flutter Local-Only to Online Mode Demo: Todo List App -This demo app is an extension of the Flutter Todo List App that demonstrates how to use the PowerSync SDK for Flutter in an local only way. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). +This demo app is an extension of the Supabase Todo List App that demonstrates how to use the PowerSync SDK for Flutter in a local-only way without sync capabilities. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). # Running the app with local-only @@ -49,7 +49,7 @@ Insert the credentials of your new Supabase and PowerSync projects into `lib/app # Explanation -The demo implements local-only and synced modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). The app initially starts in local only mode with the offline schema. When the user signs in, the database schema is updated to the online schema, and the data is migrated to enable synchronization. +The demo implements local-only and synced modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). The app initially starts in local-only mode with the offline schema. When the user signs in, the database schema is updated to the online schema, and the data is migrated to enable synchronization. After this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). diff --git a/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml b/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml index fb993125..02d80ce3 100644 --- a/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml +++ b/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Powersync Flutter Local Only Demo + Powersync Flutter Local-Only Demo CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/demos/local-only-todolist/lib/main.dart b/demos/local-only-todolist/lib/main.dart index 42f4b98c..6d939987 100644 --- a/demos/local-only-todolist/lib/main.dart +++ b/demos/local-only-todolist/lib/main.dart @@ -58,7 +58,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'PowerSync Flutter Local Only Demo', + title: 'PowerSync Flutter Local-Only Demo', theme: ThemeData( primarySwatch: Colors.blue, ), diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 51e49bcf..1d0849e3 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -1,29 +1,29 @@ import 'package:powersync/powersync.dart'; import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; -/// This schema design supports an online/local-only workflow by managing data +/// This schema design supports a local-only to online workflow by managing data /// across two versions of each table: one for local/offline use and one for /// online/synced use. This approach simplifies the handling of data in different /// connectivity states. /// -/// For local only, the views become: -/// online_todos +/// For local-only, the views become: +/// inactive_synced_todos /// todos -/// online_lists +/// inactive_synced_lists /// lists /// /// - 'todos' and 'lists' refer to the local-only data. -/// - 'online_todos' and 'online_lists' refer to the data that will be synced -/// once online, making it clear that these are not currently synchronized. +/// - 'inactive_synced_todos' and 'inactive_synced_lists' refer to the data that will be synced +/// once online. /// /// For online, we have these views: /// todos -/// local_todos +/// inactive_local_todos /// lists -/// local_lists +/// inactive_local_lists /// /// - 'todos' and 'lists' refer to the synced/online data. -/// - local_todos' and 'local_lists' refer to the local-only data, allowing +/// - `inactive_local_todos' and 'inactive_local_lists' refer to the local-only data, allowing /// for temporary storage or operations before syncing. /// /// For an offline-to-online transition [switchToOnlineSchema] copies data so that it ends up in the upload queue. @@ -31,18 +31,18 @@ import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; const todosTable = 'todos'; const listsTable = 'lists'; -Schema makeSchema({online = bool}) { +Schema makeSchema({synced = bool}) { String onlineName(String table) { - if (online) { + if (synced) { return table; } else { - return "online_$table"; + return "inactive_synced_$table"; } } String localName(String table) { - if (online) { - return "local_$table"; + if (synced) { + return "inactive_local_$table"; } else { return table; } @@ -79,20 +79,21 @@ Schema makeSchema({online = bool}) { } switchToOnlineSchema(PowerSyncDatabase db, String userId) async { - await db.updateSchema(makeSchema(online: true)); + await db.updateSchema(makeSchema(synced: true)); await setSyncEnabled(true); await db.writeTransaction((tx) async { - // Copy local data to the "online" views. + // Copy local-only data to the "online" views. // This records each operation to the crud queue. await tx.execute( - 'INSERT INTO lists(id, name, created_at, owner_id) SELECT id, name, created_at, ? FROM local_lists', + 'INSERT INTO lists(id, name, created_at, owner_id) SELECT id, name, created_at, ? FROM inactive_local_lists', [userId]); - await tx.execute('INSERT INTO $todosTable SELECT * FROM local_$todosTable'); + await tx.execute( + 'INSERT INTO $todosTable SELECT * FROM inactive_local_$todosTable'); // Delete the "local-only" data. - await tx.execute('DELETE FROM local_$todosTable'); - await tx.execute('DELETE FROM local_$listsTable'); + await tx.execute('DELETE FROM inactive_local_$todosTable'); + await tx.execute('DELETE FROM inactive_local_$listsTable'); }); } diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index dad41f1c..82760268 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -143,7 +143,7 @@ bool isLoggedIn() { /// id of the user currently logged in String getUserId() { return Supabase.instance.client.auth.currentSession?.user.id ?? - '00000000-0000-0000-0000-000000000000'; // default ID supplied for local only mode + '00000000-0000-0000-0000-000000000000'; // default ID supplied for local-only mode } Future getDatabasePath() async { @@ -159,7 +159,7 @@ Future getDatabasePath() async { Future openDatabase() async { var isSyncMode = await getSyncEnabled(); db = PowerSyncDatabase( - schema: makeSchema(online: isSyncMode), + schema: makeSchema(synced: isSyncMode), path: await getDatabasePath(), logger: attachedLogger); await db.initialize(); diff --git a/demos/local-only-todolist/lib/widgets/login_page.dart b/demos/local-only-todolist/lib/widgets/login_page.dart index 29e48675..75237483 100644 --- a/demos/local-only-todolist/lib/widgets/login_page.dart +++ b/demos/local-only-todolist/lib/widgets/login_page.dart @@ -63,7 +63,7 @@ class _LoginPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Local Only Demo"), + title: const Text("PowerSync Flutter Local-Only Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/local-only-todolist/lib/widgets/signup_page.dart b/demos/local-only-todolist/lib/widgets/signup_page.dart index 86ce7cdf..a24b7432 100644 --- a/demos/local-only-todolist/lib/widgets/signup_page.dart +++ b/demos/local-only-todolist/lib/widgets/signup_page.dart @@ -67,7 +67,7 @@ class _SignupPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Local Only Demo"), + title: const Text("PowerSync Flutter Local-Only Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig b/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig index 58c5a90b..83f09d4c 100644 --- a/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig +++ b/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig @@ -5,7 +5,7 @@ // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = PowerSync Supabase Local Only Demo +PRODUCT_NAME = PowerSync Supabase Local-Only Demo // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = co.powersync.demotodolist diff --git a/demos/local-only-todolist/pubspec.yaml b/demos/local-only-todolist/pubspec.yaml index 4ac6fb81..8a173830 100644 --- a/demos/local-only-todolist/pubspec.yaml +++ b/demos/local-only-todolist/pubspec.yaml @@ -1,5 +1,5 @@ name: powersync_flutter_local_only_demo -description: PowerSync Flutter Local Only Demo +description: PowerSync Flutter Local-Only Demo publish_to: "none" version: 1.0.1 From 54c111bae8a4230f7b1433276f6c436393de0600 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 8 Aug 2024 15:18:07 +0200 Subject: [PATCH 07/34] Fixing empty local-only state to online transition breaking watch calls. --- .../lib/models/schema.dart | 4 +-- demos/local-only-todolist/lib/powersync.dart | 28 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 1d0849e3..077550b4 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -73,12 +73,12 @@ Schema makeSchema({synced = bool}) { Table(table.name, table.columns, indexes: table.indexes, viewName: onlineName(table.name)), for (var table in tables) - Table.localOnly('local_${table.name}', table.columns, + Table.localOnly('inactive_local_${table.name}', table.columns, indexes: table.indexes, viewName: localName(table.name)) ]); } -switchToOnlineSchema(PowerSyncDatabase db, String userId) async { +switchToSyncedSchema(PowerSyncDatabase db, String userId) async { await db.updateSchema(makeSchema(synced: true)); await setSyncEnabled(true); diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index 82760268..24e9b34c 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -157,34 +157,42 @@ Future getDatabasePath() async { } Future openDatabase() async { - var isSyncMode = await getSyncEnabled(); - db = PowerSyncDatabase( - schema: makeSchema(synced: isSyncMode), - path: await getDatabasePath(), - logger: attachedLogger); - await db.initialize(); + await _openDatabase(); await loadSupabase(); if (isLoggedIn()) { // If the user is already logged in, connect immediately. // Otherwise, connect once logged via login/signup view. - connectDatabase(); + await connectDatabase(); } } +Future _openDatabase() async { + var isSyncMode = await getSyncEnabled(); + db = PowerSyncDatabase( + schema: makeSchema(synced: isSyncMode), + path: await getDatabasePath(), + logger: attachedLogger); + await db.initialize(); +} + Future connectDatabase() async { - if (isLoggedIn()) { + if (!isLoggedIn()) { log.severe("Can't connect database without being signed in"); } SupabaseConnector? currentConnector; var isSyncMode = await getSyncEnabled(); if (!isSyncMode) { - await switchToOnlineSchema(db, getUserId()); + await switchToSyncedSchema(db, getUserId()); + // Without closing and reopening the database the list pages breaks if there is no data in the tables when logging in/signing up. + await db.close(); + await _openDatabase(); } currentConnector = SupabaseConnector(db); - db.connect(connector: currentConnector); + await db.connect(connector: currentConnector); + // await Future.delayed(const Duration(seconds: 5)); Supabase.instance.client.auth.onAuthStateChange.listen((data) async { final AuthChangeEvent event = data.event; From 426df2981115b1d0e07ca9392aa2b0707499abec Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 8 Aug 2024 15:20:07 +0200 Subject: [PATCH 08/34] Updated readme. --- demos/local-only-todolist/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index e6c3e016..62f38431 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -1,6 +1,6 @@ # PowerSync + Supabase Flutter Local-Only to Online Mode Demo: Todo List App -This demo app is an extension of the Supabase Todo List App that demonstrates how to use the PowerSync SDK for Flutter in a local-only way without sync capabilities. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). +This demo app is an extension of the [Supabase Todo List App](../supabase-todolist/README.md) that demonstrates how to use the PowerSync SDK for Flutter in a local-only way without sync capabilities. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). # Running the app with local-only From 630af65eaa62173e901749bf731bfa4394254efb Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 8 Aug 2024 15:26:46 +0200 Subject: [PATCH 09/34] Remove commented out code. --- demos/local-only-todolist/lib/powersync.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index 24e9b34c..9f1b4765 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -192,7 +192,6 @@ Future connectDatabase() async { currentConnector = SupabaseConnector(db); await db.connect(connector: currentConnector); - // await Future.delayed(const Duration(seconds: 5)); Supabase.instance.client.auth.onAuthStateChange.listen((data) async { final AuthChangeEvent event = data.event; From 418853d065d2d31f7b8215dfd7041f95ab22119d Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 13 Aug 2024 15:41:09 +0200 Subject: [PATCH 10/34] Using new refreshSchema function to ensure watches are aware of changes made by updateSchema. --- demos/local-only-todolist/README.md | 2 +- .../lib/models/schema.dart | 5 ++++- demos/local-only-todolist/lib/powersync.dart | 3 --- .../native/native_powersync_database.dart | 5 +++++ .../powersync_database_impl_stub.dart | 5 +++++ .../database/web/web_powersync_database.dart | 5 +++++ .../powersync/test/offline_online_test.dart | 21 +++++++++++++++++++ 7 files changed, 41 insertions(+), 5 deletions(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index 62f38431..1df336c8 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -71,4 +71,4 @@ graph TD ## Limitations `updateSchema` cannot be called inside a transaction, and it's recommended to perform the schema update when the database isn't connected. -Additionally, the current implementation of the PowerSync SDK's `watch` method may not correctly track tables that are altered by `updateSchema`. As a result, you will likely need to refresh your `watch` calls after the schema update is complete. In this demo, the `watch` calls are refreshed by navigating to the login and signup pages after the user successfully logs in and the schema update is finished. +Additionally, the current implementation of the PowerSync SDK's `watch` method may not correctly track tables that are altered by `updateSchema`. Note that `refreshSchema` can be executed after updating the schema to resolve this (the demo uses it in `switchToSyncedSchema` which can be viewed [here](./lib/models/schema.dart)). diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 077550b4..7c71e44e 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -73,13 +73,16 @@ Schema makeSchema({synced = bool}) { Table(table.name, table.columns, indexes: table.indexes, viewName: onlineName(table.name)), for (var table in tables) - Table.localOnly('inactive_local_${table.name}', table.columns, + Table.localOnly('local_${table.name}', table.columns, indexes: table.indexes, viewName: localName(table.name)) ]); } switchToSyncedSchema(PowerSyncDatabase db, String userId) async { await db.updateSchema(makeSchema(synced: true)); + + // needed to ensure that watches/queries are aware of the updated schema + await db.refreshSchema(); await setSyncEnabled(true); await db.writeTransaction((tx) async { diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index 9f1b4765..4c098bee 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -185,9 +185,6 @@ Future connectDatabase() async { if (!isSyncMode) { await switchToSyncedSchema(db, getUserId()); - // Without closing and reopening the database the list pages breaks if there is no data in the tables when logging in/signing up. - await db.close(); - await _openDatabase(); } currentConnector = SupabaseConnector(db); diff --git a/packages/powersync/lib/src/database/native/native_powersync_database.dart b/packages/powersync/lib/src/database/native/native_powersync_database.dart index 0bf859ed..bead1eda 100644 --- a/packages/powersync/lib/src/database/native/native_powersync_database.dart +++ b/packages/powersync/lib/src/database/native/native_powersync_database.dart @@ -264,6 +264,11 @@ class PowerSyncDatabaseImpl this.schema = schema; return updateSchemaInIsolate(database, schema); } + + @override + Future refreshSchema() async { + await database.refreshSchema(); + } } class _PowerSyncDatabaseIsolateArgs { diff --git a/packages/powersync/lib/src/database/powersync_database_impl_stub.dart b/packages/powersync/lib/src/database/powersync_database_impl_stub.dart index 9dc96d4a..68faf631 100644 --- a/packages/powersync/lib/src/database/powersync_database_impl_stub.dart +++ b/packages/powersync/lib/src/database/powersync_database_impl_stub.dart @@ -118,4 +118,9 @@ class PowerSyncDatabaseImpl Map? params}) { throw UnimplementedError(); } + + @override + Future refreshSchema() { + throw UnimplementedError(); + } } diff --git a/packages/powersync/lib/src/database/web/web_powersync_database.dart b/packages/powersync/lib/src/database/web/web_powersync_database.dart index 5142fa80..52730567 100644 --- a/packages/powersync/lib/src/database/web/web_powersync_database.dart +++ b/packages/powersync/lib/src/database/web/web_powersync_database.dart @@ -210,4 +210,9 @@ class PowerSyncDatabaseImpl this.schema = schema; return database.writeLock((tx) => schema_logic.updateSchema(tx, schema)); } + + @override + Future refreshSchema() { + return database.refreshSchema(); + } } diff --git a/packages/powersync/test/offline_online_test.dart b/packages/powersync/test/offline_online_test.dart index d270f48a..8c831806 100644 --- a/packages/powersync/test/offline_online_test.dart +++ b/packages/powersync/test/offline_online_test.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:powersync/powersync.dart'; +import 'package:sqlite_async/src/utils/shared_utils.dart'; import 'package:test/test.dart'; import 'utils/test_utils_impl.dart'; @@ -140,5 +141,25 @@ void main() { } ])); }); + + test('Watch correct table after switching schema', () async { + // Start with "offline-only" schema. + // This does not record any operations to the crud queue. + var db = + await testUtils.setupPowerSync(path: path, schema: makeSchema(false)); + + final customerWatchTables = + await getSourceTables(db, 'SELECT * FROM customers'); + + expect( + customerWatchTables.contains('ps_data_local__local_customers'), true); + await db.updateSchema(makeSchema(true)); + await db.refreshSchema(); + + final onlineCustomerWatchTables = + await getSourceTables(db, 'SELECT * FROM customers'); + + expect(onlineCustomerWatchTables.contains('ps_data__customers'), true); + }); }); } From 4116f5d12f18ee44ad09b490be025d785b16360b Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 21 Aug 2024 09:51:57 +0200 Subject: [PATCH 11/34] Using latest published version of sqlite_async. --- demos/django-todolist/pubspec.lock | 4 ++-- demos/django-todolist/pubspec.yaml | 2 +- demos/local-only-todolist/lib/powersync.dart | 2 ++ demos/local-only-todolist/pubspec.lock | 4 ++-- demos/local-only-todolist/pubspec.yaml | 2 +- demos/supabase-anonymous-auth/pubspec.lock | 4 ++-- demos/supabase-anonymous-auth/pubspec.yaml | 2 +- demos/supabase-edge-function-auth/pubspec.lock | 4 ++-- demos/supabase-edge-function-auth/pubspec.yaml | 2 +- demos/supabase-todolist/pubspec.lock | 4 ++-- demos/supabase-todolist/pubspec.yaml | 2 +- .../lib/src/database/native/native_powersync_database.dart | 5 ----- packages/powersync/lib/src/database/powersync_db_mixin.dart | 5 +++++ .../lib/src/database/web/web_powersync_database.dart | 5 ----- packages/powersync_attachments_helper/pubspec.yaml | 2 +- 15 files changed, 23 insertions(+), 26 deletions(-) diff --git a/demos/django-todolist/pubspec.lock b/demos/django-todolist/pubspec.lock index c9a78f73..64a7336c 100644 --- a/demos/django-todolist/pubspec.lock +++ b/demos/django-todolist/pubspec.lock @@ -439,10 +439,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" stack_trace: dependency: transitive description: diff --git a/demos/django-todolist/pubspec.yaml b/demos/django-todolist/pubspec.yaml index ab79a012..35f1682d 100644 --- a/demos/django-todolist/pubspec.yaml +++ b/demos/django-todolist/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 http: ^1.2.1 shared_preferences: ^2.2.3 diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index 4c098bee..05e18020 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -142,6 +142,8 @@ bool isLoggedIn() { /// id of the user currently logged in String getUserId() { + // Consider options like https://dev.fingerprint.com/docs/identification-vs-fingerprintjs + // for generating a local-only identity. return Supabase.instance.client.auth.currentSession?.user.id ?? '00000000-0000-0000-0000-000000000000'; // default ID supplied for local-only mode } diff --git a/demos/local-only-todolist/pubspec.lock b/demos/local-only-todolist/pubspec.lock index 64a782d4..c0450266 100644 --- a/demos/local-only-todolist/pubspec.lock +++ b/demos/local-only-todolist/pubspec.lock @@ -623,10 +623,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" stack_trace: dependency: transitive description: diff --git a/demos/local-only-todolist/pubspec.yaml b/demos/local-only-todolist/pubspec.yaml index 8a173830..a6361101 100644 --- a/demos/local-only-todolist/pubspec.yaml +++ b/demos/local-only-todolist/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: camera: ^0.10.5+7 image: ^4.1.3 universal_io: ^2.2.2 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 dev_dependencies: flutter_test: diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index ea727faa..23d76c2d 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -519,10 +519,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" stack_trace: dependency: transitive description: diff --git a/demos/supabase-anonymous-auth/pubspec.yaml b/demos/supabase-anonymous-auth/pubspec.yaml index c83bf794..19efa9a4 100644 --- a/demos/supabase-anonymous-auth/pubspec.yaml +++ b/demos/supabase-anonymous-auth/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: supabase_flutter: ^2.0.2 path: ^1.8.3 logging: ^1.2.0 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 universal_io: ^2.2.2 dev_dependencies: diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index ea727faa..23d76c2d 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -519,10 +519,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" stack_trace: dependency: transitive description: diff --git a/demos/supabase-edge-function-auth/pubspec.yaml b/demos/supabase-edge-function-auth/pubspec.yaml index c60365e7..c9a85840 100644 --- a/demos/supabase-edge-function-auth/pubspec.yaml +++ b/demos/supabase-edge-function-auth/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: supabase_flutter: ^2.0.2 path: ^1.8.3 logging: ^1.2.0 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 universal_io: ^2.2.2 dev_dependencies: diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 89041051..aabd8213 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -630,10 +630,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" stack_trace: dependency: transitive description: diff --git a/demos/supabase-todolist/pubspec.yaml b/demos/supabase-todolist/pubspec.yaml index c7610916..ffc6afb1 100644 --- a/demos/supabase-todolist/pubspec.yaml +++ b/demos/supabase-todolist/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: camera: ^0.10.5+7 image: ^4.1.3 universal_io: ^2.2.2 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 dev_dependencies: flutter_test: diff --git a/packages/powersync/lib/src/database/native/native_powersync_database.dart b/packages/powersync/lib/src/database/native/native_powersync_database.dart index bead1eda..0bf859ed 100644 --- a/packages/powersync/lib/src/database/native/native_powersync_database.dart +++ b/packages/powersync/lib/src/database/native/native_powersync_database.dart @@ -264,11 +264,6 @@ class PowerSyncDatabaseImpl this.schema = schema; return updateSchemaInIsolate(database, schema); } - - @override - Future refreshSchema() async { - await database.refreshSchema(); - } } class _PowerSyncDatabaseIsolateArgs { diff --git a/packages/powersync/lib/src/database/powersync_db_mixin.dart b/packages/powersync/lib/src/database/powersync_db_mixin.dart index 68256d4e..f6b76654 100644 --- a/packages/powersync/lib/src/database/powersync_db_mixin.dart +++ b/packages/powersync/lib/src/database/powersync_db_mixin.dart @@ -424,4 +424,9 @@ mixin PowerSyncDatabaseMixin implements SqliteConnection { Future getAutoCommit() { return database.getAutoCommit(); } + + @override + Future refreshSchema() async { + await database.refreshSchema(); + } } diff --git a/packages/powersync/lib/src/database/web/web_powersync_database.dart b/packages/powersync/lib/src/database/web/web_powersync_database.dart index 52730567..5142fa80 100644 --- a/packages/powersync/lib/src/database/web/web_powersync_database.dart +++ b/packages/powersync/lib/src/database/web/web_powersync_database.dart @@ -210,9 +210,4 @@ class PowerSyncDatabaseImpl this.schema = schema; return database.writeLock((tx) => schema_logic.updateSchema(tx, schema)); } - - @override - Future refreshSchema() { - return database.refreshSchema(); - } } diff --git a/packages/powersync_attachments_helper/pubspec.yaml b/packages/powersync_attachments_helper/pubspec.yaml index a7237bfd..5ff5fa30 100644 --- a/packages/powersync_attachments_helper/pubspec.yaml +++ b/packages/powersync_attachments_helper/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: powersync: ^1.6.3 logging: ^1.2.0 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 path_provider: ^2.0.13 dev_dependencies: From 12ddde23e97fdee3c2fcce95319e586cda4a0082 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 21 Aug 2024 10:27:12 +0200 Subject: [PATCH 12/34] Fixed versions after merge. --- demos/local-only-todolist/pubspec.lock | 4 ++-- demos/supabase-simple-chat/pubspec.lock | 4 ++-- demos/supabase-todolist-drift/pubspec.lock | 4 ++-- demos/supabase-todolist-drift/pubspec.yaml | 2 +- packages/powersync/pubspec.yaml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/demos/local-only-todolist/pubspec.lock b/demos/local-only-todolist/pubspec.lock index c0450266..4ca8f0b7 100644 --- a/demos/local-only-todolist/pubspec.lock +++ b/demos/local-only-todolist/pubspec.lock @@ -470,14 +470,14 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.6.3" + version: "1.6.5" powersync_flutter_libs: dependency: "direct overridden" description: path: "../../packages/powersync_flutter_libs" relative: true source: path - version: "0.1.0" + version: "0.2.0" pub_semver: dependency: transitive description: diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index 2f199f9c..590e98ee 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -535,10 +535,10 @@ packages: dependency: transitive description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" stack_trace: dependency: transitive description: diff --git a/demos/supabase-todolist-drift/pubspec.lock b/demos/supabase-todolist-drift/pubspec.lock index a021556b..85e6bb7e 100644 --- a/demos/supabase-todolist-drift/pubspec.lock +++ b/demos/supabase-todolist-drift/pubspec.lock @@ -878,10 +878,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: "79e636c857ed43f6cd5e5be72b36967a29f785daa63ff5b078bd34f74f44cb54" + sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd url: "https://pub.dev" source: hosted - version: "0.8.1" + version: "0.8.2" sqlparser: dependency: transitive description: diff --git a/demos/supabase-todolist-drift/pubspec.yaml b/demos/supabase-todolist-drift/pubspec.yaml index 582818ea..bebaeed3 100644 --- a/demos/supabase-todolist-drift/pubspec.yaml +++ b/demos/supabase-todolist-drift/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: camera: ^0.10.5+7 image: ^4.1.3 universal_io: ^2.2.2 - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 drift: 2.18.0 drift_sqlite_async: ^0.1.0-alpha.4 diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 3b3f99c5..2bec2363 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - sqlite_async: ^0.8.1 + sqlite_async: ^0.8.2 universal_io: ^2.0.0 sqlite3_flutter_libs: ^0.5.23 powersync_flutter_libs: ^0.2.0 From 57f3be7c756bc78f360f118ff90bf293bb5c6615 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 21 Aug 2024 13:00:15 +0200 Subject: [PATCH 13/34] Updated to sqlite_async:0.8.3 --- demos/django-todolist/pubspec.lock | 4 ++-- demos/django-todolist/pubspec.yaml | 2 +- demos/local-only-todolist/pubspec.lock | 4 ++-- demos/local-only-todolist/pubspec.yaml | 2 +- demos/supabase-anonymous-auth/pubspec.lock | 4 ++-- demos/supabase-anonymous-auth/pubspec.yaml | 2 +- demos/supabase-edge-function-auth/pubspec.lock | 4 ++-- demos/supabase-edge-function-auth/pubspec.yaml | 2 +- demos/supabase-simple-chat/pubspec.lock | 4 ++-- demos/supabase-todolist-drift/pubspec.lock | 4 ++-- demos/supabase-todolist-drift/pubspec.yaml | 2 +- demos/supabase-todolist/pubspec.lock | 4 ++-- demos/supabase-todolist/pubspec.yaml | 2 +- packages/powersync/pubspec.yaml | 2 +- packages/powersync_attachments_helper/pubspec.yaml | 2 +- 15 files changed, 22 insertions(+), 22 deletions(-) diff --git a/demos/django-todolist/pubspec.lock b/demos/django-todolist/pubspec.lock index 9397573d..1cb4ea7c 100644 --- a/demos/django-todolist/pubspec.lock +++ b/demos/django-todolist/pubspec.lock @@ -439,10 +439,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" stack_trace: dependency: transitive description: diff --git a/demos/django-todolist/pubspec.yaml b/demos/django-todolist/pubspec.yaml index 6cbdd597..d1c2c631 100644 --- a/demos/django-todolist/pubspec.yaml +++ b/demos/django-todolist/pubspec.yaml @@ -14,7 +14,7 @@ dependencies: path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 http: ^1.2.1 shared_preferences: ^2.2.3 diff --git a/demos/local-only-todolist/pubspec.lock b/demos/local-only-todolist/pubspec.lock index 4ca8f0b7..af6d9063 100644 --- a/demos/local-only-todolist/pubspec.lock +++ b/demos/local-only-todolist/pubspec.lock @@ -623,10 +623,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" stack_trace: dependency: transitive description: diff --git a/demos/local-only-todolist/pubspec.yaml b/demos/local-only-todolist/pubspec.yaml index a6361101..9183cab4 100644 --- a/demos/local-only-todolist/pubspec.yaml +++ b/demos/local-only-todolist/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: camera: ^0.10.5+7 image: ^4.1.3 universal_io: ^2.2.2 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 dev_dependencies: flutter_test: diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index 319b2df4..ed2ced37 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -519,10 +519,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" stack_trace: dependency: transitive description: diff --git a/demos/supabase-anonymous-auth/pubspec.yaml b/demos/supabase-anonymous-auth/pubspec.yaml index f59e3551..b44a1299 100644 --- a/demos/supabase-anonymous-auth/pubspec.yaml +++ b/demos/supabase-anonymous-auth/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: supabase_flutter: ^2.0.2 path: ^1.8.3 logging: ^1.2.0 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 universal_io: ^2.2.2 dev_dependencies: diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index 319b2df4..ed2ced37 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -519,10 +519,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" stack_trace: dependency: transitive description: diff --git a/demos/supabase-edge-function-auth/pubspec.yaml b/demos/supabase-edge-function-auth/pubspec.yaml index f927a91e..be60b7f0 100644 --- a/demos/supabase-edge-function-auth/pubspec.yaml +++ b/demos/supabase-edge-function-auth/pubspec.yaml @@ -16,7 +16,7 @@ dependencies: supabase_flutter: ^2.0.2 path: ^1.8.3 logging: ^1.2.0 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 universal_io: ^2.2.2 dev_dependencies: diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index 590e98ee..a322a47d 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -535,10 +535,10 @@ packages: dependency: transitive description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" stack_trace: dependency: transitive description: diff --git a/demos/supabase-todolist-drift/pubspec.lock b/demos/supabase-todolist-drift/pubspec.lock index 85e6bb7e..7615e910 100644 --- a/demos/supabase-todolist-drift/pubspec.lock +++ b/demos/supabase-todolist-drift/pubspec.lock @@ -878,10 +878,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" sqlparser: dependency: transitive description: diff --git a/demos/supabase-todolist-drift/pubspec.yaml b/demos/supabase-todolist-drift/pubspec.yaml index bebaeed3..c6e6ba69 100644 --- a/demos/supabase-todolist-drift/pubspec.yaml +++ b/demos/supabase-todolist-drift/pubspec.yaml @@ -18,7 +18,7 @@ dependencies: camera: ^0.10.5+7 image: ^4.1.3 universal_io: ^2.2.2 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 drift: 2.18.0 drift_sqlite_async: ^0.1.0-alpha.4 diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 87cc4eef..1c222dbb 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -630,10 +630,10 @@ packages: dependency: "direct main" description: name: sqlite_async - sha256: a01b49a32f01d65ff1604ac8515fa9e8113d4fa0058e08fac64138be7c788ffd + sha256: "7708a2129582d43614f436e28623fcbeb142a02022ba372e45cfe403c84dd2b5" url: "https://pub.dev" source: hosted - version: "0.8.2" + version: "0.8.3" stack_trace: dependency: transitive description: diff --git a/demos/supabase-todolist/pubspec.yaml b/demos/supabase-todolist/pubspec.yaml index c9e3613f..d3f53da6 100644 --- a/demos/supabase-todolist/pubspec.yaml +++ b/demos/supabase-todolist/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: camera: ^0.10.5+7 image: ^4.1.3 universal_io: ^2.2.2 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 dev_dependencies: flutter_test: diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 2bec2363..e039bc50 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 universal_io: ^2.0.0 sqlite3_flutter_libs: ^0.5.23 powersync_flutter_libs: ^0.2.0 diff --git a/packages/powersync_attachments_helper/pubspec.yaml b/packages/powersync_attachments_helper/pubspec.yaml index 99768768..0b6897fc 100644 --- a/packages/powersync_attachments_helper/pubspec.yaml +++ b/packages/powersync_attachments_helper/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: powersync: ^1.6.5 logging: ^1.2.0 - sqlite_async: ^0.8.2 + sqlite_async: ^0.8.3 path_provider: ^2.0.13 dev_dependencies: From ee5d059b9bb0d5d192a17c05211fa15efc4df99e Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Wed, 21 Aug 2024 13:09:33 +0200 Subject: [PATCH 14/34] Minor readme updates. --- demos/local-only-todolist/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index 1df336c8..81f2648e 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -37,7 +37,7 @@ Then deploy the following sync rules: bucket_definitions: user_lists: # Separate bucket per todo list - parameters: select id as list_id from lists where owner_id = token_parameters.user_id + parameters: select id as list_id from lists where owner_id = request.user_id() data: - select * from lists where id = bucket.list_id - select * from todos where list_id = bucket.list_id @@ -58,11 +58,11 @@ After this point, being signed in no longer determines which schema should be us ```mermaid graph TD K[Start] --> A[App is empty and local-only] - A --> B[User can create 0 or more todos that are stored local-only] + A --> B[User creates todos that are stored local-only] A --> C[User can login/register] B --> C --> D[Local-only data gets synced to PowerSync service] - D --> E[User can create 0 or more todos that will get synced] + D --> E[User creates todos that will get synced] D --> F E --> F[User can logout explicitly] F --> A From 9acce1ff526918a2e3a80c562ad1286bb4528dc0 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Tue, 27 Aug 2024 19:17:58 +0200 Subject: [PATCH 15/34] minor readme update --- demos/local-only-todolist/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index 81f2648e..2aee4ffa 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -49,9 +49,12 @@ Insert the credentials of your new Supabase and PowerSync projects into `lib/app # Explanation -The demo implements local-only and synced modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). The app initially starts in local-only mode with the offline schema. When the user signs in, the database schema is updated to the online schema, and the data is migrated to enable synchronization. +The demo implements local-only and synced modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). -After this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). +The first set doesn't record changes in an upload queue, this is achieved by using the localOnly table definition. +When the user registers and sync must start, copy the data in the first schema over to a second set of regular / synced schema + +At this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). ## Flow chart From b2b86550081dab3b2d5c57ea73eed74799fb3efa Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 29 Aug 2024 08:41:14 +0200 Subject: [PATCH 16/34] Fixed web target not working due to worker issue. --- demos/local-only-todolist/.metadata | 2 +- .../lib/models/sync_mode.dart | 7 +- demos/local-only-todolist/pubspec.yaml | 2 +- demos/local-only-todolist/web/index.html | 86 +++++++++---------- demos/local-only-todolist/web/manifest.json | 66 +++++++------- 5 files changed, 84 insertions(+), 79 deletions(-) diff --git a/demos/local-only-todolist/.metadata b/demos/local-only-todolist/.metadata index 135a1daa..72aedebf 100644 --- a/demos/local-only-todolist/.metadata +++ b/demos/local-only-todolist/.metadata @@ -15,7 +15,7 @@ migration: - platform: root create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 - - platform: macos + - platform: web create_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 base_revision: 5dcb86f68f239346676ceb1ed1ea385bd215fba1 diff --git a/demos/local-only-todolist/lib/models/sync_mode.dart b/demos/local-only-todolist/lib/models/sync_mode.dart index b28453d0..3251e341 100644 --- a/demos/local-only-todolist/lib/models/sync_mode.dart +++ b/demos/local-only-todolist/lib/models/sync_mode.dart @@ -24,7 +24,12 @@ openSyncModeDatabase() async { path = join(dir.path, dbFilename); } - sqliteDb = SqliteDatabase(path: path); + sqliteDb = SqliteDatabase( + path: path, + options: const SqliteOptions( + webSqliteOptions: WebSqliteOptions(workerUri: 'powersync_db.worker.js'), + ), + ); await migrations.migrate(sqliteDb); } diff --git a/demos/local-only-todolist/pubspec.yaml b/demos/local-only-todolist/pubspec.yaml index 9183cab4..36bc4517 100644 --- a/demos/local-only-todolist/pubspec.yaml +++ b/demos/local-only-todolist/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - powersync: ^1.6.0 + powersync: ^1.6.7 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 diff --git a/demos/local-only-todolist/web/index.html b/demos/local-only-todolist/web/index.html index b3b0c490..aeb145bc 100644 --- a/demos/local-only-todolist/web/index.html +++ b/demos/local-only-todolist/web/index.html @@ -1,7 +1,7 @@ - - - - - - - - - - - - - - - - - - supabase_todolist - - - - - - - - + + + + + - + + diff --git a/demos/local-only-todolist/web/manifest.json b/demos/local-only-todolist/web/manifest.json index 9dcf6fe4..104f08d4 100644 --- a/demos/local-only-todolist/web/manifest.json +++ b/demos/local-only-todolist/web/manifest.json @@ -1,35 +1,35 @@ { - "name": "supabase_todolist", - "short_name": "supabase_todolist", - "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" - } - ] + "name": "local_only_todolist", + "short_name": "local_only_todolist", + "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 8446b39f25c2f946561c1fb2ffb0932c08681665 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Thu, 29 Aug 2024 08:45:03 +0200 Subject: [PATCH 17/34] Documentation cleanup. --- demos/local-only-todolist/lib/models/schema.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 7c71e44e..79d068b9 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -26,7 +26,7 @@ import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; /// - `inactive_local_todos' and 'inactive_local_lists' refer to the local-only data, allowing /// for temporary storage or operations before syncing. /// -/// For an offline-to-online transition [switchToOnlineSchema] copies data so that it ends up in the upload queue. +/// For an offline-to-online transition [switchToSyncedSchema] copies data so that it ends up in the upload queue. const todosTable = 'todos'; const listsTable = 'lists'; From 105580ccc40ae98ac801a1c3f42d8de9aefc551c Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 2 Sep 2024 08:31:51 +0200 Subject: [PATCH 18/34] Removed redundant await. --- demos/local-only-todolist/lib/powersync.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/local-only-todolist/lib/powersync.dart index 05e18020..fa649188 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/local-only-todolist/lib/powersync.dart @@ -212,6 +212,6 @@ Future logout() async { await db.disconnectAndClear(); // Resetting app so that no-sync mode works again - await await setSyncEnabled(false); + await setSyncEnabled(false); await openDatabase(); } From 19480534796b5c8734441bb8bc71960050bf2fec Mon Sep 17 00:00:00 2001 From: benitav Date: Thu, 5 Sep 2024 14:38:50 +0200 Subject: [PATCH 19/34] Update Readme with explanation --- demos/local-only-todolist/README.md | 95 ++++++++++++------ .../assets/local-only-readme-0.png | Bin 0 -> 36319 bytes .../assets/local-only-readme-1.png | Bin 0 -> 47445 bytes .../assets/local-only-readme-2.png | Bin 0 -> 60942 bytes .../assets/local-only-readme-3.png | Bin 0 -> 119250 bytes .../lib/models/schema.dart | 22 +--- 6 files changed, 65 insertions(+), 52 deletions(-) create mode 100644 demos/local-only-todolist/assets/local-only-readme-0.png create mode 100644 demos/local-only-todolist/assets/local-only-readme-1.png create mode 100644 demos/local-only-todolist/assets/local-only-readme-2.png create mode 100644 demos/local-only-todolist/assets/local-only-readme-3.png diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index 2aee4ffa..b4519ae4 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -1,22 +1,33 @@ -# PowerSync + Supabase Flutter Local-Only to Online Mode Demo: Todo List App +# PowerSync + Supabase Flutter Todo List App: Local-Only to Sync Mode Demo -This demo app is an extension of the [Supabase Todo List App](../supabase-todolist/README.md) that demonstrates how to use the PowerSync SDK for Flutter in a local-only way without sync capabilities. It allows the user to use the app offline without having to sign in. After signing in data that was kept locally is synced up. For a step-by-step guide, see [here](https://docs.powersync.com/integration-guides/supabase). +This demo app is an extension of the [Supabase Todo List App](../supabase-todolist/README.md) and demonstrates using the PowerSync Flutter client SDK to persist data locally without syncing, for users to use the app without having to register or sign in. It then demonstrates syncing this data to Supabase once the user registers at a later stage. -# Running the app with local-only +The recommended flow through this demo is: +1. Run the app in local-only mode and create data. Notice how data persists even when closing and reopening the app. +2. Enable user registration and sign in to the app. +3. Notice how previously created data now seamlessly syncs with Supabase. + +For an overview of the mechanics behind this, see [the explanation further below](#how-this-works). + +# Run the app in local-only mode -Note that if Supabase and PowerSync credentials have not been been configured, a user will not be able to login or sign up. There is a hardcoded check in `main.dart` for this. Ensure you have [melos](https://melos.invertase.dev/~melos-latest/getting-started) installed. 1. `cd demos/local-only-todolist` 2. `melos prepare` 3. `flutter run` -# Setting up sync functionality +Create some data and notice how the data persists after a refresh or reopening the app. + +It is expected that users cannot register or sign in at this stage. This is because Supabase and PowerSync credentials have not been been configured yet -- there is a hardcoded check in `main.dart` for this. We'll get to this next. + +# Enable user registration and sign in -Insert your Supabase and PowerSync project credentials into `lib/app_config.dart` (See instructions below). -A user should now be able to login or sign up, which enables the sync functionality. +Create Supabase and PowerSync projects, and add their credentials to `lib/app_config.dart` to enable user registration and sign in. -# Set up Supabase Project +## Set up your Supabase project + +Detailed instructions for integrating PowerSync with Supabase can be found in [the integration guide](https://docs.powersync.com/integration-guides/supabase). Below are the main steps required to get this demo running. Create a new Supabase project, and paste an run the contents of [database.sql](./database.sql) in the Supabase SQL editor. @@ -27,7 +38,7 @@ It does the following: 3. Enable row level security, allowing users to only view and edit their own data. 4. Create a trigger to populate some sample data when an user registers. -# Set up PowerSync Instance +## Configure your PowerSync Instance Create a new PowerSync instance, connecting to the database of the Supabase project. @@ -43,35 +54,55 @@ bucket_definitions: - select * from todos where list_id = bucket.list_id ``` -# Configure the app +## Configure the app + +Insert the credentials of your Supabase and PowerSync projects into `lib/app_config.dart`. + +## Sign in to the app + +Reload the app and sign up or sign in. Once successfully signed in, existing and new data should seamlessly sync with Supabase. + + +# How this works + +This app uses [local-only](https://pub.dev/documentation/powersync/latest/powersync/Table/Table.localOnly.html) tables to persist data until the user has registered or signed in. Local-only tables do not log updates in an upload queue, avoiding any overhead or growth in database size. + +Once the user registers, the data is moved over to synced tables, at which point the data would be placed in the upload queue and will start syncing. + +## Naive implementation -Insert the credentials of your new Supabase and PowerSync projects into `lib/app_config.dart` +A barebones way to achieve the above is to store and query data from local-only tables before registration, copy this data to each corresponding synced table after registration and then store and query from the synced tables. This would look as follows: -# Explanation +![diagram-0](./assets/local-only-readme-0.png) + +The downside to this approach is that app queries would need to continuously differentiate between the two tables based on whether the user signed in or not. + +## Recommended implementation + +To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property, which allows overriding the default name of the view that is used in queries. + +This looks as follows in the local-only state: + +![diagram-1](./assets/local-only-readme-1.png) + +The local-only tables (`local_lists` and `local_todos`) have their view names overriden to `listsAlias` and `todosAlias`, and these names are used in queries (e.g. `PowerSync.getAll("SELECT * FROM listsAlias");`). The `lists` and `todos` tables are not used in this state, but will become relevant in the next step. + +When the user registers / signs in: + +![diagram-2](./assets/local-only-readme-2.png) + +The _synced_ tables (`lists` and `todos`) now have their view names overriden to `listsAlias` and `todosAlias`. Note that `updateSchema` must be run to update the view name. See the [schema](./lib/models/schema.dart) for details about this. The app query `PowerSync.getAll("SELECT * FROM listsAlias")` now reads data from the `lists` table. + +Finally, copy data from the local-only tables to the synced tables, and delete data from the local-only tables to reduce database size: + +![diagram-3](./assets/local-only-readme-3.png) -The demo implements local-only and synced modes by using two sets of schema definitions, which can be viewed [here](./lib/models/schema.dart). -The first set doesn't record changes in an upload queue, this is achieved by using the localOnly table definition. -When the user registers and sync must start, copy the data in the first schema over to a second set of regular / synced schema At this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). -## Flow chart - -```mermaid -graph TD - K[Start] --> A[App is empty and local-only] - A --> B[User creates todos that are stored local-only] - A --> C[User can login/register] - B --> - C --> D[Local-only data gets synced to PowerSync service] - D --> E[User creates todos that will get synced] - D --> F - E --> F[User can logout explicitly] - F --> A -``` -## Limitations +# Limitations -`updateSchema` cannot be called inside a transaction, and it's recommended to perform the schema update when the database isn't connected. -Additionally, the current implementation of the PowerSync SDK's `watch` method may not correctly track tables that are altered by `updateSchema`. Note that `refreshSchema` can be executed after updating the schema to resolve this (the demo uses it in `switchToSyncedSchema` which can be viewed [here](./lib/models/schema.dart)). +- `updateSchema` cannot be called inside a transaction, and it's recommended to perform the schema update when the database isn't connected. +- Additionally, the current implementation of the PowerSync SDK's `watch` method may not correctly track tables that are altered by `updateSchema`. Note that `refreshSchema` can be executed after updating the schema to resolve this (the demo uses it in `switchToSyncedSchema` which can be viewed [here](./lib/models/schema.dart)). diff --git a/demos/local-only-todolist/assets/local-only-readme-0.png b/demos/local-only-todolist/assets/local-only-readme-0.png new file mode 100644 index 0000000000000000000000000000000000000000..66366025489e554c410fcab7e029f1c9da5ced4f GIT binary patch literal 36319 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

U}0W(h~(VY$)|rB)W0X49(L>(bW(nnzso$ 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%0AWtiZQ!1 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 Q%D~UYb(FPPcC=sq19cW**8l(j literal 0 HcmV?d00001 diff --git a/demos/local-only-todolist/assets/local-only-readme-3.png b/demos/local-only-todolist/assets/local-only-readme-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f6293d2d3cea36a3892cef8642d87b32f8328a15 GIT binary patch literal 119250 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

U}0W(h~(VY$)|rB)W0X49(L>(bW(nnzso$ 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%0AWtiZQ!1 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 literal 60942 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 Q%D~UYb(FPPcC=sq19cW**8l(j diff --git a/demos/local-only-todolist/assets/local-only-readme-3.png b/demos/local-only-todolist/assets/local-only-readme-3.png index f6293d2d3cea36a3892cef8642d87b32f8328a15..5849dbef1d8682bb883063425b0b5836c4200fd4 100644 GIT binary patch literal 119407 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 N78D!PtH$oJ{{d3W>6`!n literal 119250 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 DYCg>7 diff --git a/demos/local-only-todolist/lib/app_config.dart b/demos/local-only-todolist/lib/app_config.dart index c6e12d26..93c2bd96 100644 --- a/demos/local-only-todolist/lib/app_config.dart +++ b/demos/local-only-todolist/lib/app_config.dart @@ -1,6 +1,6 @@ // Enter your Supabase and PowerSync project details. class AppConfig { - static const String supabaseUrl = 'https://foo.supabase.co'; - static const String supabaseAnonKey = 'foo'; - static const String powersyncUrl = 'https://foo.powersync.journeyapps.com'; -} + static const String supabaseUrl = 'https://beaywnuieweznatavpeg.supabase.co'; + static const String supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImJlYXl3bnVpZXdlem5hdGF2cGVnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjU0NTk3OTAsImV4cCI6MjA0MTAzNTc5MH0.sb5_RBESMWbfnq_xaZy00T8Mia9lzY0-BBc7ZovS5t0'; + static const String powersyncUrl = 'https://660fe3a331d70135abf2c626.powersync.journeyapps.com'; +} \ No newline at end of file diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index afbb761d..c571ae2b 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -4,6 +4,9 @@ import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; /// This schema design supports a local-only to sync-enabled workflow by managing data /// across two versions of each table: one for local-only use without syncing before a user registers, /// the other for sync-enabled use after the user registers/signs in. +/// +/// This is done by utilizing the viewName property to override the default view name +/// of a table. /// /// See the README for details. /// @@ -16,16 +19,22 @@ const listsTable = 'lists'; Schema makeSchema({synced = bool}) { String syncedName(String table) { if (synced) { + // results in lists, todos return table; } else { + // in the local-only mode of the demo + // these tables are not used return "inactive_synced_$table"; } } String localName(String table) { if (synced) { + // in the sync-enabled mode of the demo + // these tables are not used return "inactive_local_$table"; } else { + // results in lists, todos return table; } } @@ -68,10 +77,10 @@ switchToSyncedSchema(PowerSyncDatabase db, String userId) async { await setSyncEnabled(true); await db.writeTransaction((tx) async { - // Copy local-only data to the sync-enabled tables/views. + // Copy local-only data to the sync-enabled views. // This records each operation in the upload queue. await tx.execute( - 'INSERT INTO lists(id, name, created_at, owner_id) SELECT id, name, created_at, ? FROM inactive_local_lists', + 'INSERT INTO $listsTable(id, name, created_at, owner_id) SELECT id, name, created_at, ? FROM inactive_local_$listsTable', [userId]); await tx.execute( diff --git a/demos/local-only-todolist/lib/models/todo_list.dart b/demos/local-only-todolist/lib/models/todo_list.dart index 86170e02..fd5ce625 100644 --- a/demos/local-only-todolist/lib/models/todo_list.dart +++ b/demos/local-only-todolist/lib/models/todo_list.dart @@ -1,3 +1,5 @@ +import 'package:powersync_flutter_local_only_demo/models/schema.dart'; + import 'package:powersync/powersync.dart'; import 'package:powersync/sqlite3_common.dart' as sqlite; @@ -39,7 +41,7 @@ class TodoList { static Stream> watchLists() { // This query is automatically re-run when data in "lists" or "todos" is modified. return db - .watch('SELECT * FROM lists ORDER BY created_at, id') + .watch('SELECT * FROM $listsTable ORDER BY created_at, id') .map((results) { return results.map(TodoList.fromRow).toList(growable: false); }); @@ -51,8 +53,8 @@ class TodoList { return db.watch(''' SELECT *, - (SELECT count() FROM todos WHERE list_id = lists.id AND completed = TRUE) as completed_count, - (SELECT count() FROM todos WHERE list_id = lists.id AND completed = FALSE) as pending_count + (SELECT count() FROM $todosTable WHERE list_id = lists.id AND completed = TRUE) as completed_count, + (SELECT count() FROM $todosTable WHERE list_id = lists.id AND completed = FALSE) as pending_count FROM lists ORDER BY created_at ''').map((results) { @@ -68,7 +70,7 @@ class TodoList { static Future create(String name) async { final results = await db.execute(''' INSERT INTO - lists(id, created_at, name, owner_id) + $listsTable(id, created_at, name, owner_id) VALUES(uuid(), datetime(), ?, ?) RETURNING * ''', [name, getUserId()]); @@ -78,7 +80,7 @@ class TodoList { /// Watch items within this list. Stream> watchItems() { return db.watch( - 'SELECT * FROM todos WHERE list_id = ? ORDER BY created_at DESC, id', + 'SELECT * FROM $todosTable WHERE list_id = ? ORDER BY created_at DESC, id', parameters: [id]).map((event) { return event.map(TodoItem.fromRow).toList(growable: false); }); @@ -86,12 +88,12 @@ class TodoList { /// Delete this list. Future delete() async { - await db.execute('DELETE FROM lists WHERE id = ?', [id]); + await db.execute('DELETE FROM $listsTable WHERE id = ?', [id]); } /// Find list item. static Future find(id) async { - final results = await db.get('SELECT * FROM lists WHERE id = ?', [id]); + final results = await db.get('SELECT * FROM $listsTable WHERE id = ?', [id]); return TodoList.fromRow(results); } @@ -99,7 +101,7 @@ class TodoList { Future add(String description) async { final results = await db.execute(''' INSERT INTO - todos(id, created_at, completed, list_id, description, created_by) + $todosTable(id, created_at, completed, list_id, description, created_by) VALUES(uuid(), datetime(), FALSE, ?, ?, ?) RETURNING * ''', [id, description, getUserId()]); From ae31120dedda6f2e6da94ab9bf694b9f12b1cf38 Mon Sep 17 00:00:00 2001 From: benitav Date: Fri, 6 Sep 2024 11:10:55 +0200 Subject: [PATCH 23/34] More polish --- demos/local-only-todolist/README.md | 13 +++++++------ .../assets/local-only-readme-0.png | Bin 36319 -> 79189 bytes 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index 1c3b607f..ca9b818b 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -1,6 +1,6 @@ # PowerSync + Supabase Flutter Todo List App: Local-Only to Sync Mode Demo -This demo app is an extension of the [Supabase Todo List App](../supabase-todolist/README.md) and demonstrates using the PowerSync Flutter client SDK to persist data locally without syncing, for users to use the app without having to register or sign in. It then demonstrates syncing this data to Supabase once the user registers at a later stage. +This demo app is an extension of the [Supabase Todo List App](../supabase-todolist/README.md) and demonstrates using the PowerSync Flutter client SDK to persist data locally without syncing. This lets users use the app without having to register or sign in. It then demonstrates syncing this data to Supabase once the user registers at a later stage. The recommended flow through this demo is: 1. Run the app in local-only mode and create data. Notice how data persists even when closing and reopening the app. @@ -65,13 +65,13 @@ Restart the app and sign up or sign in. Once successfully signed in, existing an # How this works -This app uses [local-only](https://pub.dev/documentation/powersync/latest/powersync/Table/Table.localOnly.html) tables to persist data until the user has registered or signed in. Local-only tables do not log updates in an upload queue, avoiding any overhead or growth in database size. +This app uses [local-only](https://pub.dev/documentation/powersync/latest/powersync/Table/Table.localOnly.html) tables to persist data until the user has registered or signed in. Local-only tables do not log updates in the upload queue, avoiding any overhead or growth in database size. -Once the user registers, the data is moved over to synced tables, at which point the data would be placed in the upload queue and will start syncing. +Once the user registers, the data is moved over to synced tables. The move operation also places the data in the upload queue. ## Naive implementation -A barebones way to achieve the above is to store and query data from local-only tables before registration, copy this data to each corresponding synced table after registration and then store and query from the synced tables. This would look as follows: +A barebones way to achieve the above is to store and query data from local-only tables before user registration, copy this data to each corresponding synced table after registration and then store and query from the synced tables. This would look as follows: ![diagram-0](./assets/local-only-readme-0.png) @@ -79,7 +79,7 @@ The downside to this approach is that app queries would need to continuously dif ## Recommended implementation -To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property, which allows overriding the default name of schema views (each table automatically has a corresponding view, defaulting to the table name, which is used in queries). +To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property (table definitions in the PowerSync client schema actually create views and this property lets us override the view name - see the [client architecture docs](https://docs.powersync.com/architecture/client-architecture)). This looks as follows in the local-only state: @@ -97,7 +97,8 @@ Finally, copy data from the local-only tables to the synced tables, and delete d ![diagram-3](./assets/local-only-readme-3.png) -At this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). +Note: +If the user now signs out, all data is cleared, effectively resetting the app to the initial local-only state. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart). # Limitations diff --git a/demos/local-only-todolist/assets/local-only-readme-0.png b/demos/local-only-todolist/assets/local-only-readme-0.png index 66366025489e554c410fcab7e029f1c9da5ced4f..5282e8da4841bc0ac2b63c25b0c258c528b89abb 100644 GIT binary patch literal 79189 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

KI|GI7}L2UGCA}6f-Qp*ah?b46l+rLU8 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 SfsR}|u3Xf+P<-C*-v0r{jm5

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 O|CAKe Date: Fri, 6 Sep 2024 11:17:27 +0200 Subject: [PATCH 24/34] Restore placeholder creds --- demos/local-only-todolist/lib/app_config.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/demos/local-only-todolist/lib/app_config.dart b/demos/local-only-todolist/lib/app_config.dart index 93c2bd96..c6e12d26 100644 --- a/demos/local-only-todolist/lib/app_config.dart +++ b/demos/local-only-todolist/lib/app_config.dart @@ -1,6 +1,6 @@ // Enter your Supabase and PowerSync project details. class AppConfig { - static const String supabaseUrl = 'https://beaywnuieweznatavpeg.supabase.co'; - static const String supabaseAnonKey = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImJlYXl3bnVpZXdlem5hdGF2cGVnIiwicm9sZSI6ImFub24iLCJpYXQiOjE3MjU0NTk3OTAsImV4cCI6MjA0MTAzNTc5MH0.sb5_RBESMWbfnq_xaZy00T8Mia9lzY0-BBc7ZovS5t0'; - static const String powersyncUrl = 'https://660fe3a331d70135abf2c626.powersync.journeyapps.com'; -} \ No newline at end of file + static const String supabaseUrl = 'https://foo.supabase.co'; + static const String supabaseAnonKey = 'foo'; + static const String powersyncUrl = 'https://foo.powersync.journeyapps.com'; +} From c35669f16085d9316690eee716a94dbb00deabc6 Mon Sep 17 00:00:00 2001 From: benitav Date: Fri, 6 Sep 2024 11:50:09 +0200 Subject: [PATCH 25/34] Update packages --- demos/django-todolist/pubspec.lock | 24 +++++++++---------- demos/local-only-todolist/pubspec.lock | 24 +++++++++---------- demos/supabase-anonymous-auth/pubspec.lock | 24 +++++++++---------- .../supabase-edge-function-auth/pubspec.lock | 24 +++++++++---------- demos/supabase-simple-chat/pubspec.lock | 24 +++++++++---------- demos/supabase-todolist-drift/pubspec.lock | 24 +++++++++---------- demos/supabase-todolist/pubspec.lock | 24 +++++++++---------- 7 files changed, 84 insertions(+), 84 deletions(-) diff --git a/demos/django-todolist/pubspec.lock b/demos/django-todolist/pubspec.lock index 4109cea0..0fb36017 100644 --- a/demos/django-todolist/pubspec.lock +++ b/demos/django-todolist/pubspec.lock @@ -164,18 +164,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -212,18 +212,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mutex: dependency: transitive description: @@ -479,10 +479,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -519,10 +519,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: diff --git a/demos/local-only-todolist/pubspec.lock b/demos/local-only-todolist/pubspec.lock index aecc1a70..4fef1329 100644 --- a/demos/local-only-todolist/pubspec.lock +++ b/demos/local-only-todolist/pubspec.lock @@ -300,18 +300,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -348,18 +348,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -695,10 +695,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -799,10 +799,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index 29fe18b0..cab6e8e5 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -204,18 +204,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -583,10 +583,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -687,10 +687,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index 29fe18b0..cab6e8e5 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -204,18 +204,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -583,10 +583,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -687,10 +687,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index 47aa9874..822388e5 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -220,18 +220,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -268,18 +268,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -599,10 +599,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" timeago: dependency: "direct main" description: @@ -711,10 +711,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: diff --git a/demos/supabase-todolist-drift/pubspec.lock b/demos/supabase-todolist-drift/pubspec.lock index 2ad5f69a..3b94b272 100644 --- a/demos/supabase-todolist-drift/pubspec.lock +++ b/demos/supabase-todolist-drift/pubspec.lock @@ -500,18 +500,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -548,18 +548,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -958,10 +958,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" timing: dependency: transitive description: @@ -1070,10 +1070,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" watcher: dependency: transitive description: diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 0a8005e7..b1eda4e4 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -300,18 +300,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -348,18 +348,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" mime: dependency: transitive description: @@ -702,10 +702,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -806,10 +806,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: From 96fba4879644a5e66afc46ea79a7f2ecfd7aca2b Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Fri, 6 Sep 2024 13:16:06 +0200 Subject: [PATCH 26/34] Renamed project to supabase-todolist-optional-sync --- demos/django-todolist/pubspec.lock | 24 +++++++++--------- demos/supabase-anonymous-auth/pubspec.lock | 24 +++++++++--------- .../supabase-edge-function-auth/pubspec.lock | 24 +++++++++--------- demos/supabase-simple-chat/pubspec.lock | 24 +++++++++--------- demos/supabase-todolist-drift/pubspec.lock | 24 +++++++++--------- .../.gitignore | 0 .../.metadata | 0 .../LICENSE | 0 .../README.md | 11 ++++---- .../analysis_options.yaml | 0 .../android/.gitignore | 0 .../android/app/build.gradle | 0 .../android/app/src/debug/AndroidManifest.xml | 0 .../android/app/src/main/AndroidManifest.xml | 0 .../co/powersync/demotodolist/MainActivity.kt | 0 .../res/drawable-v21/launch_background.xml | 0 .../main/res/drawable/launch_background.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../app/src/main/res/values-night/styles.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../app/src/profile/AndroidManifest.xml | 0 .../android/build.gradle | 0 .../android/gradle.properties | 0 .../gradle/wrapper/gradle-wrapper.properties | 0 .../android/settings.gradle | 0 .../assets/local-only-readme-0.png | Bin .../assets/local-only-readme-1.png | Bin .../assets/local-only-readme-2.png | Bin .../assets/local-only-readme-3.png | Bin .../database.sql | 0 .../ios/.gitignore | 0 .../ios/Flutter/AppFrameworkInfo.plist | 0 .../ios/Flutter/Debug.xcconfig | 0 .../ios/Flutter/Release.xcconfig | 0 .../ios/Podfile | 0 .../ios/Podfile.lock | 0 .../ios/Runner.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/WorkspaceSettings.xcsettings | 0 .../ios/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../Icon-App-1024x1024@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin .../Icon-App-83.5x83.5@2x.png | Bin .../LaunchImage.imageset/Contents.json | 0 .../LaunchImage.imageset/LaunchImage.png | Bin .../LaunchImage.imageset/LaunchImage@2x.png | Bin .../LaunchImage.imageset/LaunchImage@3x.png | Bin .../LaunchImage.imageset/README.md | 0 .../Runner/Base.lproj/LaunchScreen.storyboard | 0 .../ios/Runner/Base.lproj/Main.storyboard | 0 .../ios/Runner/Info.plist | 0 .../ios/Runner/Runner-Bridging-Header.h | 0 .../lib/app_config.dart | 0 .../lib/main.dart | 8 +++--- .../lib/models/schema.dart | 6 ++--- .../lib/models/sync_mode.dart | 0 .../lib/models/todo_item.dart | 2 +- .../lib/models/todo_list.dart | 5 ++-- .../lib/powersync.dart | 2 +- .../lib/supabase.dart | 0 .../lib/widgets/list_item.dart | 0 .../lib/widgets/list_item_dialog.dart | 0 .../lib/widgets/lists_page.dart | 0 .../lib/widgets/login_page.dart | 5 ++-- .../lib/widgets/query_widget.dart | 0 .../lib/widgets/resultset_table.dart | 0 .../lib/widgets/signup_page.dart | 5 ++-- .../lib/widgets/status_app_bar.dart | 0 .../lib/widgets/todo_item_dialog.dart | 0 .../lib/widgets/todo_item_widget.dart | 0 .../lib/widgets/todo_list_page.dart | 2 +- .../linux/.gitignore | 0 .../linux/CMakeLists.txt | 0 .../linux/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 0 .../flutter/generated_plugin_registrant.h | 0 .../linux/flutter/generated_plugins.cmake | 0 .../linux/main.cc | 0 .../linux/my_application.cc | 0 .../linux/my_application.h | 0 .../macos/.gitignore | 0 .../macos/Flutter/Flutter-Debug.xcconfig | 0 .../macos/Flutter/Flutter-Release.xcconfig | 0 .../Flutter/GeneratedPluginRegistrant.swift | 0 .../macos/Podfile | 0 .../macos/Podfile.lock | 0 .../macos/Runner.xcodeproj/project.pbxproj | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../xcshareddata/xcschemes/Runner.xcscheme | 0 .../contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../macos/Runner/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/app_icon_1024.png | Bin .../AppIcon.appiconset/app_icon_128.png | Bin .../AppIcon.appiconset/app_icon_16.png | Bin .../AppIcon.appiconset/app_icon_256.png | Bin .../AppIcon.appiconset/app_icon_32.png | Bin .../AppIcon.appiconset/app_icon_512.png | Bin .../AppIcon.appiconset/app_icon_64.png | Bin .../macos/Runner/Base.lproj/MainMenu.xib | 0 .../macos/Runner/Configs/AppInfo.xcconfig | 0 .../macos/Runner/Configs/Debug.xcconfig | 0 .../macos/Runner/Configs/Release.xcconfig | 0 .../macos/Runner/Configs/Warnings.xcconfig | 0 .../macos/Runner/DebugProfile.entitlements | 0 .../macos/Runner/Info.plist | 0 .../macos/Runner/MainFlutterWindow.swift | 0 .../macos/Runner/Release.entitlements | 0 .../pubspec.lock | 24 +++++++++--------- .../pubspec.yaml | 4 +-- .../web/favicon.png | Bin .../web/icons/Icon-192.png | Bin .../web/icons/Icon-512.png | Bin .../web/icons/Icon-maskable-192.png | Bin .../web/icons/Icon-maskable-512.png | Bin .../web/index.html | 2 +- .../web/manifest.json | 4 +-- .../windows/.gitignore | 0 .../windows/CMakeLists.txt | 0 .../windows/flutter/CMakeLists.txt | 0 .../flutter/generated_plugin_registrant.cc | 0 .../flutter/generated_plugin_registrant.h | 0 .../windows/flutter/generated_plugins.cmake | 0 .../windows/runner/CMakeLists.txt | 0 .../windows/runner/Runner.rc | 0 .../windows/runner/flutter_window.cpp | 0 .../windows/runner/flutter_window.h | 0 .../windows/runner/main.cpp | 0 .../windows/runner/resource.h | 0 .../windows/runner/resources/app_icon.ico | Bin .../windows/runner/runner.exe.manifest | 0 .../windows/runner/utils.cpp | 0 .../windows/runner/utils.h | 0 .../windows/runner/win32_window.cpp | 0 .../windows/runner/win32_window.h | 0 demos/supabase-todolist/pubspec.lock | 24 +++++++++--------- 159 files changed, 113 insertions(+), 111 deletions(-) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/.gitignore (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/.metadata (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/LICENSE (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/README.md (97%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/analysis_options.yaml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/.gitignore (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/build.gradle (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/debug/AndroidManifest.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/AndroidManifest.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/drawable-v21/launch_background.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/drawable/launch_background.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/values-night/styles.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/main/res/values/styles.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/app/src/profile/AndroidManifest.xml (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/build.gradle (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/gradle.properties (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/android/settings.gradle (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/assets/local-only-readme-0.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/assets/local-only-readme-1.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/assets/local-only-readme-2.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/assets/local-only-readme-3.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/database.sql (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/.gitignore (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Flutter/AppFrameworkInfo.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Flutter/Debug.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Flutter/Release.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Podfile (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Podfile.lock (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcodeproj/project.pbxproj (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcworkspace/contents.xcworkspacedata (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/AppDelegate.swift (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Base.lproj/LaunchScreen.storyboard (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Base.lproj/Main.storyboard (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Info.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/ios/Runner/Runner-Bridging-Header.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/app_config.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/main.dart (91%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/models/schema.dart (95%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/models/sync_mode.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/models/todo_item.dart (92%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/models/todo_list.dart (94%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/powersync.dart (98%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/supabase.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/list_item.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/list_item_dialog.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/lists_page.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/login_page.dart (95%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/query_widget.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/resultset_table.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/signup_page.dart (95%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/status_app_bar.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/todo_item_dialog.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/todo_item_widget.dart (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/lib/widgets/todo_list_page.dart (95%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/.gitignore (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/CMakeLists.txt (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/flutter/CMakeLists.txt (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/flutter/generated_plugin_registrant.cc (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/flutter/generated_plugin_registrant.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/flutter/generated_plugins.cmake (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/main.cc (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/my_application.cc (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/linux/my_application.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/.gitignore (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Flutter/Flutter-Debug.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Flutter/Flutter-Release.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Flutter/GeneratedPluginRegistrant.swift (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Podfile (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Podfile.lock (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner.xcodeproj/project.pbxproj (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner.xcworkspace/contents.xcworkspacedata (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/AppDelegate.swift (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Base.lproj/MainMenu.xib (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Configs/AppInfo.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Configs/Debug.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Configs/Release.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Configs/Warnings.xcconfig (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/DebugProfile.entitlements (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Info.plist (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/MainFlutterWindow.swift (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/macos/Runner/Release.entitlements (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/pubspec.lock (97%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/pubspec.yaml (75%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/favicon.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/icons/Icon-192.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/icons/Icon-512.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/icons/Icon-maskable-192.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/icons/Icon-maskable-512.png (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/index.html (97%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/web/manifest.json (88%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/.gitignore (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/CMakeLists.txt (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/flutter/CMakeLists.txt (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/flutter/generated_plugin_registrant.cc (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/flutter/generated_plugin_registrant.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/flutter/generated_plugins.cmake (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/CMakeLists.txt (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/Runner.rc (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/flutter_window.cpp (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/flutter_window.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/main.cpp (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/resource.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/resources/app_icon.ico (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/runner.exe.manifest (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/utils.cpp (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/utils.h (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/win32_window.cpp (100%) rename demos/{local-only-todolist => supabase-todolist-optional-sync}/windows/runner/win32_window.h (100%) diff --git a/demos/django-todolist/pubspec.lock b/demos/django-todolist/pubspec.lock index 0fb36017..4109cea0 100644 --- a/demos/django-todolist/pubspec.lock +++ b/demos/django-todolist/pubspec.lock @@ -164,18 +164,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -212,18 +212,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mutex: dependency: transitive description: @@ -479,10 +479,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" typed_data: dependency: transitive description: @@ -519,10 +519,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" web: dependency: transitive description: diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index cab6e8e5..29fe18b0 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -204,18 +204,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -583,10 +583,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" typed_data: dependency: transitive description: @@ -687,10 +687,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" web: dependency: transitive description: diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index cab6e8e5..29fe18b0 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -204,18 +204,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -252,18 +252,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -583,10 +583,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" typed_data: dependency: transitive description: @@ -687,10 +687,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" web: dependency: transitive description: diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index 822388e5..47aa9874 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -220,18 +220,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -268,18 +268,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -599,10 +599,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" timeago: dependency: "direct main" description: @@ -711,10 +711,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" web: dependency: transitive description: diff --git a/demos/supabase-todolist-drift/pubspec.lock b/demos/supabase-todolist-drift/pubspec.lock index 3b94b272..2ad5f69a 100644 --- a/demos/supabase-todolist-drift/pubspec.lock +++ b/demos/supabase-todolist-drift/pubspec.lock @@ -500,18 +500,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -548,18 +548,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -958,10 +958,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" timing: dependency: transitive description: @@ -1070,10 +1070,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" watcher: dependency: transitive description: diff --git a/demos/local-only-todolist/.gitignore b/demos/supabase-todolist-optional-sync/.gitignore similarity index 100% rename from demos/local-only-todolist/.gitignore rename to demos/supabase-todolist-optional-sync/.gitignore diff --git a/demos/local-only-todolist/.metadata b/demos/supabase-todolist-optional-sync/.metadata similarity index 100% rename from demos/local-only-todolist/.metadata rename to demos/supabase-todolist-optional-sync/.metadata diff --git a/demos/local-only-todolist/LICENSE b/demos/supabase-todolist-optional-sync/LICENSE similarity index 100% rename from demos/local-only-todolist/LICENSE rename to demos/supabase-todolist-optional-sync/LICENSE diff --git a/demos/local-only-todolist/README.md b/demos/supabase-todolist-optional-sync/README.md similarity index 97% rename from demos/local-only-todolist/README.md rename to demos/supabase-todolist-optional-sync/README.md index ca9b818b..ea435838 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/supabase-todolist-optional-sync/README.md @@ -1,8 +1,9 @@ -# PowerSync + Supabase Flutter Todo List App: Local-Only to Sync Mode Demo +# PowerSync + Supabase Flutter Todo List App: Optional Sync Demo This demo app is an extension of the [Supabase Todo List App](../supabase-todolist/README.md) and demonstrates using the PowerSync Flutter client SDK to persist data locally without syncing. This lets users use the app without having to register or sign in. It then demonstrates syncing this data to Supabase once the user registers at a later stage. The recommended flow through this demo is: + 1. Run the app in local-only mode and create data. Notice how data persists even when closing and reopening the app. 2. Enable user registration and sign in to the app. 3. Notice how previously created data now seamlessly syncs with Supabase. @@ -13,7 +14,7 @@ For an overview of the mechanics behind this, see [the explanation further below Ensure you have [melos](https://melos.invertase.dev/~melos-latest/getting-started) installed. -1. `cd demos/local-only-todolist` +1. `cd demos/supabase-todolist-optional-sync` 2. `melos prepare` 3. `flutter run` @@ -62,7 +63,6 @@ Insert the credentials of your Supabase and PowerSync projects into `lib/app_con Restart the app and sign up or sign in. Once successfully signed in, existing and new data should seamlessly sync with Supabase. - # How this works This app uses [local-only](https://pub.dev/documentation/powersync/latest/powersync/Table/Table.localOnly.html) tables to persist data until the user has registered or signed in. Local-only tables do not log updates in the upload queue, avoiding any overhead or growth in database size. @@ -79,7 +79,7 @@ The downside to this approach is that app queries would need to continuously dif ## Recommended implementation -To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property (table definitions in the PowerSync client schema actually create views and this property lets us override the view name - see the [client architecture docs](https://docs.powersync.com/architecture/client-architecture)). +To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property (table definitions in the PowerSync client schema actually create views and this property lets us override the view name - see the [client architecture docs](https://docs.powersync.com/architecture/client-architecture)). This looks as follows in the local-only state: @@ -91,7 +91,7 @@ When the user registers / signs in: ![diagram-2](./assets/local-only-readme-2.png) -The _synced_ tables (`lists` and `todos`) now have their view names set to `lists` and `todos`. Note that `updateSchema` must be run to update the view name. See the [schema](./lib/models/schema.dart) for details about this. The app query `PowerSync.getAll("SELECT * FROM lists")` now reads data from the `lists` table. +The _synced_ tables (`lists` and `todos`) now have their view names set to `lists` and `todos`. Note that `updateSchema` must be run to update the view name. See the [schema](./lib/models/schema.dart) for details about this. The app query `PowerSync.getAll("SELECT * FROM lists")` now reads data from the `lists` table. Finally, copy data from the local-only tables to the synced tables, and delete data from the local-only tables to reduce database size: @@ -100,7 +100,6 @@ Finally, copy data from the local-only tables to the synced tables, and delete d Note: If the user now signs out, all data is cleared, effectively resetting the app to the initial local-only state. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart). - # Limitations - `updateSchema` cannot be called inside a transaction, and it's recommended to perform the schema update when the database isn't connected. diff --git a/demos/local-only-todolist/analysis_options.yaml b/demos/supabase-todolist-optional-sync/analysis_options.yaml similarity index 100% rename from demos/local-only-todolist/analysis_options.yaml rename to demos/supabase-todolist-optional-sync/analysis_options.yaml diff --git a/demos/local-only-todolist/android/.gitignore b/demos/supabase-todolist-optional-sync/android/.gitignore similarity index 100% rename from demos/local-only-todolist/android/.gitignore rename to demos/supabase-todolist-optional-sync/android/.gitignore diff --git a/demos/local-only-todolist/android/app/build.gradle b/demos/supabase-todolist-optional-sync/android/app/build.gradle similarity index 100% rename from demos/local-only-todolist/android/app/build.gradle rename to demos/supabase-todolist-optional-sync/android/app/build.gradle diff --git a/demos/local-only-todolist/android/app/src/debug/AndroidManifest.xml b/demos/supabase-todolist-optional-sync/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/debug/AndroidManifest.xml rename to demos/supabase-todolist-optional-sync/android/app/src/debug/AndroidManifest.xml diff --git a/demos/local-only-todolist/android/app/src/main/AndroidManifest.xml b/demos/supabase-todolist-optional-sync/android/app/src/main/AndroidManifest.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/main/AndroidManifest.xml rename to demos/supabase-todolist-optional-sync/android/app/src/main/AndroidManifest.xml diff --git a/demos/local-only-todolist/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt b/demos/supabase-todolist-optional-sync/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt similarity index 100% rename from demos/local-only-todolist/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt rename to demos/supabase-todolist-optional-sync/android/app/src/main/kotlin/co/powersync/demotodolist/MainActivity.kt diff --git a/demos/local-only-todolist/android/app/src/main/res/drawable-v21/launch_background.xml b/demos/supabase-todolist-optional-sync/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/drawable-v21/launch_background.xml rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/demos/local-only-todolist/android/app/src/main/res/drawable/launch_background.xml b/demos/supabase-todolist-optional-sync/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/drawable/launch_background.xml rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/drawable/launch_background.xml diff --git a/demos/local-only-todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/demos/local-only-todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/demos/local-only-todolist/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/demos/local-only-todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/demos/local-only-todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/demos/local-only-todolist/android/app/src/main/res/values-night/styles.xml b/demos/supabase-todolist-optional-sync/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/values-night/styles.xml rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/values-night/styles.xml diff --git a/demos/local-only-todolist/android/app/src/main/res/values/styles.xml b/demos/supabase-todolist-optional-sync/android/app/src/main/res/values/styles.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/main/res/values/styles.xml rename to demos/supabase-todolist-optional-sync/android/app/src/main/res/values/styles.xml diff --git a/demos/local-only-todolist/android/app/src/profile/AndroidManifest.xml b/demos/supabase-todolist-optional-sync/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from demos/local-only-todolist/android/app/src/profile/AndroidManifest.xml rename to demos/supabase-todolist-optional-sync/android/app/src/profile/AndroidManifest.xml diff --git a/demos/local-only-todolist/android/build.gradle b/demos/supabase-todolist-optional-sync/android/build.gradle similarity index 100% rename from demos/local-only-todolist/android/build.gradle rename to demos/supabase-todolist-optional-sync/android/build.gradle diff --git a/demos/local-only-todolist/android/gradle.properties b/demos/supabase-todolist-optional-sync/android/gradle.properties similarity index 100% rename from demos/local-only-todolist/android/gradle.properties rename to demos/supabase-todolist-optional-sync/android/gradle.properties diff --git a/demos/local-only-todolist/android/gradle/wrapper/gradle-wrapper.properties b/demos/supabase-todolist-optional-sync/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from demos/local-only-todolist/android/gradle/wrapper/gradle-wrapper.properties rename to demos/supabase-todolist-optional-sync/android/gradle/wrapper/gradle-wrapper.properties diff --git a/demos/local-only-todolist/android/settings.gradle b/demos/supabase-todolist-optional-sync/android/settings.gradle similarity index 100% rename from demos/local-only-todolist/android/settings.gradle rename to demos/supabase-todolist-optional-sync/android/settings.gradle diff --git a/demos/local-only-todolist/assets/local-only-readme-0.png b/demos/supabase-todolist-optional-sync/assets/local-only-readme-0.png similarity index 100% rename from demos/local-only-todolist/assets/local-only-readme-0.png rename to demos/supabase-todolist-optional-sync/assets/local-only-readme-0.png diff --git a/demos/local-only-todolist/assets/local-only-readme-1.png b/demos/supabase-todolist-optional-sync/assets/local-only-readme-1.png similarity index 100% rename from demos/local-only-todolist/assets/local-only-readme-1.png rename to demos/supabase-todolist-optional-sync/assets/local-only-readme-1.png diff --git a/demos/local-only-todolist/assets/local-only-readme-2.png b/demos/supabase-todolist-optional-sync/assets/local-only-readme-2.png similarity index 100% rename from demos/local-only-todolist/assets/local-only-readme-2.png rename to demos/supabase-todolist-optional-sync/assets/local-only-readme-2.png diff --git a/demos/local-only-todolist/assets/local-only-readme-3.png b/demos/supabase-todolist-optional-sync/assets/local-only-readme-3.png similarity index 100% rename from demos/local-only-todolist/assets/local-only-readme-3.png rename to demos/supabase-todolist-optional-sync/assets/local-only-readme-3.png diff --git a/demos/local-only-todolist/database.sql b/demos/supabase-todolist-optional-sync/database.sql similarity index 100% rename from demos/local-only-todolist/database.sql rename to demos/supabase-todolist-optional-sync/database.sql diff --git a/demos/local-only-todolist/ios/.gitignore b/demos/supabase-todolist-optional-sync/ios/.gitignore similarity index 100% rename from demos/local-only-todolist/ios/.gitignore rename to demos/supabase-todolist-optional-sync/ios/.gitignore diff --git a/demos/local-only-todolist/ios/Flutter/AppFrameworkInfo.plist b/demos/supabase-todolist-optional-sync/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from demos/local-only-todolist/ios/Flutter/AppFrameworkInfo.plist rename to demos/supabase-todolist-optional-sync/ios/Flutter/AppFrameworkInfo.plist diff --git a/demos/local-only-todolist/ios/Flutter/Debug.xcconfig b/demos/supabase-todolist-optional-sync/ios/Flutter/Debug.xcconfig similarity index 100% rename from demos/local-only-todolist/ios/Flutter/Debug.xcconfig rename to demos/supabase-todolist-optional-sync/ios/Flutter/Debug.xcconfig diff --git a/demos/local-only-todolist/ios/Flutter/Release.xcconfig b/demos/supabase-todolist-optional-sync/ios/Flutter/Release.xcconfig similarity index 100% rename from demos/local-only-todolist/ios/Flutter/Release.xcconfig rename to demos/supabase-todolist-optional-sync/ios/Flutter/Release.xcconfig diff --git a/demos/local-only-todolist/ios/Podfile b/demos/supabase-todolist-optional-sync/ios/Podfile similarity index 100% rename from demos/local-only-todolist/ios/Podfile rename to demos/supabase-todolist-optional-sync/ios/Podfile diff --git a/demos/local-only-todolist/ios/Podfile.lock b/demos/supabase-todolist-optional-sync/ios/Podfile.lock similarity index 100% rename from demos/local-only-todolist/ios/Podfile.lock rename to demos/supabase-todolist-optional-sync/ios/Podfile.lock diff --git a/demos/local-only-todolist/ios/Runner.xcodeproj/project.pbxproj b/demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcodeproj/project.pbxproj rename to demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.pbxproj diff --git a/demos/local-only-todolist/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/demos/local-only-todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/local-only-todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/demos/local-only-todolist/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to demos/supabase-todolist-optional-sync/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/demos/local-only-todolist/ios/Runner.xcworkspace/contents.xcworkspacedata b/demos/supabase-todolist-optional-sync/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcworkspace/contents.xcworkspacedata rename to demos/supabase-todolist-optional-sync/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/demos/local-only-todolist/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/supabase-todolist-optional-sync/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/supabase-todolist-optional-sync/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/local-only-todolist/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/demos/supabase-todolist-optional-sync/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from demos/local-only-todolist/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to demos/supabase-todolist-optional-sync/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/demos/local-only-todolist/ios/Runner/AppDelegate.swift b/demos/supabase-todolist-optional-sync/ios/Runner/AppDelegate.swift similarity index 100% rename from demos/local-only-todolist/ios/Runner/AppDelegate.swift rename to demos/supabase-todolist-optional-sync/ios/Runner/AppDelegate.swift diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from demos/local-only-todolist/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to demos/supabase-todolist-optional-sync/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/demos/local-only-todolist/ios/Runner/Base.lproj/LaunchScreen.storyboard b/demos/supabase-todolist-optional-sync/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from demos/local-only-todolist/ios/Runner/Base.lproj/LaunchScreen.storyboard rename to demos/supabase-todolist-optional-sync/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/demos/local-only-todolist/ios/Runner/Base.lproj/Main.storyboard b/demos/supabase-todolist-optional-sync/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from demos/local-only-todolist/ios/Runner/Base.lproj/Main.storyboard rename to demos/supabase-todolist-optional-sync/ios/Runner/Base.lproj/Main.storyboard diff --git a/demos/local-only-todolist/ios/Runner/Info.plist b/demos/supabase-todolist-optional-sync/ios/Runner/Info.plist similarity index 100% rename from demos/local-only-todolist/ios/Runner/Info.plist rename to demos/supabase-todolist-optional-sync/ios/Runner/Info.plist diff --git a/demos/local-only-todolist/ios/Runner/Runner-Bridging-Header.h b/demos/supabase-todolist-optional-sync/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from demos/local-only-todolist/ios/Runner/Runner-Bridging-Header.h rename to demos/supabase-todolist-optional-sync/ios/Runner/Runner-Bridging-Header.h diff --git a/demos/local-only-todolist/lib/app_config.dart b/demos/supabase-todolist-optional-sync/lib/app_config.dart similarity index 100% rename from demos/local-only-todolist/lib/app_config.dart rename to demos/supabase-todolist-optional-sync/lib/app_config.dart diff --git a/demos/local-only-todolist/lib/main.dart b/demos/supabase-todolist-optional-sync/lib/main.dart similarity index 91% rename from demos/local-only-todolist/lib/main.dart rename to demos/supabase-todolist-optional-sync/lib/main.dart index 6d939987..e4a8051f 100644 --- a/demos/local-only-todolist/lib/main.dart +++ b/demos/supabase-todolist-optional-sync/lib/main.dart @@ -1,9 +1,9 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; -import 'package:powersync_flutter_local_only_demo/app_config.dart'; -import 'package:powersync_flutter_local_only_demo/models/schema.dart'; -import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/app_config.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/schema.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/sync_mode.dart'; import './powersync.dart'; import './widgets/lists_page.dart'; @@ -58,7 +58,7 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'PowerSync Flutter Local-Only Demo', + title: 'PowerSync Flutter Supabase Todolist Optional Sync Demo', theme: ThemeData( primarySwatch: Colors.blue, ), diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/supabase-todolist-optional-sync/lib/models/schema.dart similarity index 95% rename from demos/local-only-todolist/lib/models/schema.dart rename to demos/supabase-todolist-optional-sync/lib/models/schema.dart index c571ae2b..aedec86b 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/supabase-todolist-optional-sync/lib/models/schema.dart @@ -1,10 +1,10 @@ import 'package:powersync/powersync.dart'; -import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/sync_mode.dart'; /// This schema design supports a local-only to sync-enabled workflow by managing data -/// across two versions of each table: one for local-only use without syncing before a user registers, +/// across two versions of each table: one for local-only use without syncing before a user registers, /// the other for sync-enabled use after the user registers/signs in. -/// +/// /// This is done by utilizing the viewName property to override the default view name /// of a table. /// diff --git a/demos/local-only-todolist/lib/models/sync_mode.dart b/demos/supabase-todolist-optional-sync/lib/models/sync_mode.dart similarity index 100% rename from demos/local-only-todolist/lib/models/sync_mode.dart rename to demos/supabase-todolist-optional-sync/lib/models/sync_mode.dart diff --git a/demos/local-only-todolist/lib/models/todo_item.dart b/demos/supabase-todolist-optional-sync/lib/models/todo_item.dart similarity index 92% rename from demos/local-only-todolist/lib/models/todo_item.dart rename to demos/supabase-todolist-optional-sync/lib/models/todo_item.dart index 650dfd20..0afe4a2d 100644 --- a/demos/local-only-todolist/lib/models/todo_item.dart +++ b/demos/supabase-todolist-optional-sync/lib/models/todo_item.dart @@ -1,4 +1,4 @@ -import 'package:powersync_flutter_local_only_demo/models/schema.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/schema.dart'; import '../powersync.dart'; import 'package:powersync/sqlite3_common.dart' as sqlite; diff --git a/demos/local-only-todolist/lib/models/todo_list.dart b/demos/supabase-todolist-optional-sync/lib/models/todo_list.dart similarity index 94% rename from demos/local-only-todolist/lib/models/todo_list.dart rename to demos/supabase-todolist-optional-sync/lib/models/todo_list.dart index fd5ce625..92eb735f 100644 --- a/demos/local-only-todolist/lib/models/todo_list.dart +++ b/demos/supabase-todolist-optional-sync/lib/models/todo_list.dart @@ -1,4 +1,4 @@ -import 'package:powersync_flutter_local_only_demo/models/schema.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/schema.dart'; import 'package:powersync/powersync.dart'; import 'package:powersync/sqlite3_common.dart' as sqlite; @@ -93,7 +93,8 @@ class TodoList { /// Find list item. static Future find(id) async { - final results = await db.get('SELECT * FROM $listsTable WHERE id = ?', [id]); + final results = + await db.get('SELECT * FROM $listsTable WHERE id = ?', [id]); return TodoList.fromRow(results); } diff --git a/demos/local-only-todolist/lib/powersync.dart b/demos/supabase-todolist-optional-sync/lib/powersync.dart similarity index 98% rename from demos/local-only-todolist/lib/powersync.dart rename to demos/supabase-todolist-optional-sync/lib/powersync.dart index fa649188..9635aaca 100644 --- a/demos/local-only-todolist/lib/powersync.dart +++ b/demos/supabase-todolist-optional-sync/lib/powersync.dart @@ -4,7 +4,7 @@ import 'package:logging/logging.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:powersync/powersync.dart'; -import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/sync_mode.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import './app_config.dart'; diff --git a/demos/local-only-todolist/lib/supabase.dart b/demos/supabase-todolist-optional-sync/lib/supabase.dart similarity index 100% rename from demos/local-only-todolist/lib/supabase.dart rename to demos/supabase-todolist-optional-sync/lib/supabase.dart diff --git a/demos/local-only-todolist/lib/widgets/list_item.dart b/demos/supabase-todolist-optional-sync/lib/widgets/list_item.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/list_item.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/list_item.dart diff --git a/demos/local-only-todolist/lib/widgets/list_item_dialog.dart b/demos/supabase-todolist-optional-sync/lib/widgets/list_item_dialog.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/list_item_dialog.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/list_item_dialog.dart diff --git a/demos/local-only-todolist/lib/widgets/lists_page.dart b/demos/supabase-todolist-optional-sync/lib/widgets/lists_page.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/lists_page.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/lists_page.dart diff --git a/demos/local-only-todolist/lib/widgets/login_page.dart b/demos/supabase-todolist-optional-sync/lib/widgets/login_page.dart similarity index 95% rename from demos/local-only-todolist/lib/widgets/login_page.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/login_page.dart index 75237483..b795802d 100644 --- a/demos/local-only-todolist/lib/widgets/login_page.dart +++ b/demos/supabase-todolist-optional-sync/lib/widgets/login_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:powersync_flutter_local_only_demo/powersync.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/powersync.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../main.dart'; @@ -63,7 +63,8 @@ class _LoginPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Local-Only Demo"), + title: const Text( + "PowerSync Flutter Supabase Todolist Optional Sync Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/local-only-todolist/lib/widgets/query_widget.dart b/demos/supabase-todolist-optional-sync/lib/widgets/query_widget.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/query_widget.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/query_widget.dart diff --git a/demos/local-only-todolist/lib/widgets/resultset_table.dart b/demos/supabase-todolist-optional-sync/lib/widgets/resultset_table.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/resultset_table.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/resultset_table.dart diff --git a/demos/local-only-todolist/lib/widgets/signup_page.dart b/demos/supabase-todolist-optional-sync/lib/widgets/signup_page.dart similarity index 95% rename from demos/local-only-todolist/lib/widgets/signup_page.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/signup_page.dart index a24b7432..058060a1 100644 --- a/demos/local-only-todolist/lib/widgets/signup_page.dart +++ b/demos/supabase-todolist-optional-sync/lib/widgets/signup_page.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:powersync_flutter_local_only_demo/powersync.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/powersync.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../main.dart'; @@ -67,7 +67,8 @@ class _SignupPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: const Text("PowerSync Flutter Local-Only Demo"), + title: const Text( + "PowerSync Flutter Supabase Todolist Optional Sync Demo"), ), body: Center( child: SingleChildScrollView( diff --git a/demos/local-only-todolist/lib/widgets/status_app_bar.dart b/demos/supabase-todolist-optional-sync/lib/widgets/status_app_bar.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/status_app_bar.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/status_app_bar.dart diff --git a/demos/local-only-todolist/lib/widgets/todo_item_dialog.dart b/demos/supabase-todolist-optional-sync/lib/widgets/todo_item_dialog.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/todo_item_dialog.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/todo_item_dialog.dart diff --git a/demos/local-only-todolist/lib/widgets/todo_item_widget.dart b/demos/supabase-todolist-optional-sync/lib/widgets/todo_item_widget.dart similarity index 100% rename from demos/local-only-todolist/lib/widgets/todo_item_widget.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/todo_item_widget.dart diff --git a/demos/local-only-todolist/lib/widgets/todo_list_page.dart b/demos/supabase-todolist-optional-sync/lib/widgets/todo_list_page.dart similarity index 95% rename from demos/local-only-todolist/lib/widgets/todo_list_page.dart rename to demos/supabase-todolist-optional-sync/lib/widgets/todo_list_page.dart index 764e5211..0c1b29fe 100644 --- a/demos/local-only-todolist/lib/widgets/todo_list_page.dart +++ b/demos/supabase-todolist-optional-sync/lib/widgets/todo_list_page.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:powersync_flutter_local_only_demo/models/todo_item.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/models/todo_item.dart'; import './status_app_bar.dart'; import './todo_item_dialog.dart'; diff --git a/demos/local-only-todolist/linux/.gitignore b/demos/supabase-todolist-optional-sync/linux/.gitignore similarity index 100% rename from demos/local-only-todolist/linux/.gitignore rename to demos/supabase-todolist-optional-sync/linux/.gitignore diff --git a/demos/local-only-todolist/linux/CMakeLists.txt b/demos/supabase-todolist-optional-sync/linux/CMakeLists.txt similarity index 100% rename from demos/local-only-todolist/linux/CMakeLists.txt rename to demos/supabase-todolist-optional-sync/linux/CMakeLists.txt diff --git a/demos/local-only-todolist/linux/flutter/CMakeLists.txt b/demos/supabase-todolist-optional-sync/linux/flutter/CMakeLists.txt similarity index 100% rename from demos/local-only-todolist/linux/flutter/CMakeLists.txt rename to demos/supabase-todolist-optional-sync/linux/flutter/CMakeLists.txt diff --git a/demos/local-only-todolist/linux/flutter/generated_plugin_registrant.cc b/demos/supabase-todolist-optional-sync/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from demos/local-only-todolist/linux/flutter/generated_plugin_registrant.cc rename to demos/supabase-todolist-optional-sync/linux/flutter/generated_plugin_registrant.cc diff --git a/demos/local-only-todolist/linux/flutter/generated_plugin_registrant.h b/demos/supabase-todolist-optional-sync/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from demos/local-only-todolist/linux/flutter/generated_plugin_registrant.h rename to demos/supabase-todolist-optional-sync/linux/flutter/generated_plugin_registrant.h diff --git a/demos/local-only-todolist/linux/flutter/generated_plugins.cmake b/demos/supabase-todolist-optional-sync/linux/flutter/generated_plugins.cmake similarity index 100% rename from demos/local-only-todolist/linux/flutter/generated_plugins.cmake rename to demos/supabase-todolist-optional-sync/linux/flutter/generated_plugins.cmake diff --git a/demos/local-only-todolist/linux/main.cc b/demos/supabase-todolist-optional-sync/linux/main.cc similarity index 100% rename from demos/local-only-todolist/linux/main.cc rename to demos/supabase-todolist-optional-sync/linux/main.cc diff --git a/demos/local-only-todolist/linux/my_application.cc b/demos/supabase-todolist-optional-sync/linux/my_application.cc similarity index 100% rename from demos/local-only-todolist/linux/my_application.cc rename to demos/supabase-todolist-optional-sync/linux/my_application.cc diff --git a/demos/local-only-todolist/linux/my_application.h b/demos/supabase-todolist-optional-sync/linux/my_application.h similarity index 100% rename from demos/local-only-todolist/linux/my_application.h rename to demos/supabase-todolist-optional-sync/linux/my_application.h diff --git a/demos/local-only-todolist/macos/.gitignore b/demos/supabase-todolist-optional-sync/macos/.gitignore similarity index 100% rename from demos/local-only-todolist/macos/.gitignore rename to demos/supabase-todolist-optional-sync/macos/.gitignore diff --git a/demos/local-only-todolist/macos/Flutter/Flutter-Debug.xcconfig b/demos/supabase-todolist-optional-sync/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from demos/local-only-todolist/macos/Flutter/Flutter-Debug.xcconfig rename to demos/supabase-todolist-optional-sync/macos/Flutter/Flutter-Debug.xcconfig diff --git a/demos/local-only-todolist/macos/Flutter/Flutter-Release.xcconfig b/demos/supabase-todolist-optional-sync/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from demos/local-only-todolist/macos/Flutter/Flutter-Release.xcconfig rename to demos/supabase-todolist-optional-sync/macos/Flutter/Flutter-Release.xcconfig diff --git a/demos/local-only-todolist/macos/Flutter/GeneratedPluginRegistrant.swift b/demos/supabase-todolist-optional-sync/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from demos/local-only-todolist/macos/Flutter/GeneratedPluginRegistrant.swift rename to demos/supabase-todolist-optional-sync/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/demos/local-only-todolist/macos/Podfile b/demos/supabase-todolist-optional-sync/macos/Podfile similarity index 100% rename from demos/local-only-todolist/macos/Podfile rename to demos/supabase-todolist-optional-sync/macos/Podfile diff --git a/demos/local-only-todolist/macos/Podfile.lock b/demos/supabase-todolist-optional-sync/macos/Podfile.lock similarity index 100% rename from demos/local-only-todolist/macos/Podfile.lock rename to demos/supabase-todolist-optional-sync/macos/Podfile.lock diff --git a/demos/local-only-todolist/macos/Runner.xcodeproj/project.pbxproj b/demos/supabase-todolist-optional-sync/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from demos/local-only-todolist/macos/Runner.xcodeproj/project.pbxproj rename to demos/supabase-todolist-optional-sync/macos/Runner.xcodeproj/project.pbxproj diff --git a/demos/local-only-todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/supabase-todolist-optional-sync/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/local-only-todolist/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/supabase-todolist-optional-sync/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/local-only-todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demos/supabase-todolist-optional-sync/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from demos/local-only-todolist/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to demos/supabase-todolist-optional-sync/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/demos/local-only-todolist/macos/Runner.xcworkspace/contents.xcworkspacedata b/demos/supabase-todolist-optional-sync/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from demos/local-only-todolist/macos/Runner.xcworkspace/contents.xcworkspacedata rename to demos/supabase-todolist-optional-sync/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/demos/local-only-todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/supabase-todolist-optional-sync/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/local-only-todolist/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/supabase-todolist-optional-sync/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/local-only-todolist/macos/Runner/AppDelegate.swift b/demos/supabase-todolist-optional-sync/macos/Runner/AppDelegate.swift similarity index 100% rename from demos/local-only-todolist/macos/Runner/AppDelegate.swift rename to demos/supabase-todolist-optional-sync/macos/Runner/AppDelegate.swift diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from demos/local-only-todolist/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to demos/supabase-todolist-optional-sync/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/demos/local-only-todolist/macos/Runner/Base.lproj/MainMenu.xib b/demos/supabase-todolist-optional-sync/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from demos/local-only-todolist/macos/Runner/Base.lproj/MainMenu.xib rename to demos/supabase-todolist-optional-sync/macos/Runner/Base.lproj/MainMenu.xib diff --git a/demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig b/demos/supabase-todolist-optional-sync/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from demos/local-only-todolist/macos/Runner/Configs/AppInfo.xcconfig rename to demos/supabase-todolist-optional-sync/macos/Runner/Configs/AppInfo.xcconfig diff --git a/demos/local-only-todolist/macos/Runner/Configs/Debug.xcconfig b/demos/supabase-todolist-optional-sync/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from demos/local-only-todolist/macos/Runner/Configs/Debug.xcconfig rename to demos/supabase-todolist-optional-sync/macos/Runner/Configs/Debug.xcconfig diff --git a/demos/local-only-todolist/macos/Runner/Configs/Release.xcconfig b/demos/supabase-todolist-optional-sync/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from demos/local-only-todolist/macos/Runner/Configs/Release.xcconfig rename to demos/supabase-todolist-optional-sync/macos/Runner/Configs/Release.xcconfig diff --git a/demos/local-only-todolist/macos/Runner/Configs/Warnings.xcconfig b/demos/supabase-todolist-optional-sync/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from demos/local-only-todolist/macos/Runner/Configs/Warnings.xcconfig rename to demos/supabase-todolist-optional-sync/macos/Runner/Configs/Warnings.xcconfig diff --git a/demos/local-only-todolist/macos/Runner/DebugProfile.entitlements b/demos/supabase-todolist-optional-sync/macos/Runner/DebugProfile.entitlements similarity index 100% rename from demos/local-only-todolist/macos/Runner/DebugProfile.entitlements rename to demos/supabase-todolist-optional-sync/macos/Runner/DebugProfile.entitlements diff --git a/demos/local-only-todolist/macos/Runner/Info.plist b/demos/supabase-todolist-optional-sync/macos/Runner/Info.plist similarity index 100% rename from demos/local-only-todolist/macos/Runner/Info.plist rename to demos/supabase-todolist-optional-sync/macos/Runner/Info.plist diff --git a/demos/local-only-todolist/macos/Runner/MainFlutterWindow.swift b/demos/supabase-todolist-optional-sync/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from demos/local-only-todolist/macos/Runner/MainFlutterWindow.swift rename to demos/supabase-todolist-optional-sync/macos/Runner/MainFlutterWindow.swift diff --git a/demos/local-only-todolist/macos/Runner/Release.entitlements b/demos/supabase-todolist-optional-sync/macos/Runner/Release.entitlements similarity index 100% rename from demos/local-only-todolist/macos/Runner/Release.entitlements rename to demos/supabase-todolist-optional-sync/macos/Runner/Release.entitlements diff --git a/demos/local-only-todolist/pubspec.lock b/demos/supabase-todolist-optional-sync/pubspec.lock similarity index 97% rename from demos/local-only-todolist/pubspec.lock rename to demos/supabase-todolist-optional-sync/pubspec.lock index 4fef1329..aecc1a70 100644 --- a/demos/local-only-todolist/pubspec.lock +++ b/demos/supabase-todolist-optional-sync/pubspec.lock @@ -300,18 +300,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -348,18 +348,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -695,10 +695,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" typed_data: dependency: transitive description: @@ -799,10 +799,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" web: dependency: transitive description: diff --git a/demos/local-only-todolist/pubspec.yaml b/demos/supabase-todolist-optional-sync/pubspec.yaml similarity index 75% rename from demos/local-only-todolist/pubspec.yaml rename to demos/supabase-todolist-optional-sync/pubspec.yaml index 36bc4517..24879c21 100644 --- a/demos/local-only-todolist/pubspec.yaml +++ b/demos/supabase-todolist-optional-sync/pubspec.yaml @@ -1,5 +1,5 @@ -name: powersync_flutter_local_only_demo -description: PowerSync Flutter Local-Only Demo +name: powersync_flutter_supabase_todolist_optional_sync_demo +description: PowerSync Flutter Supabase Todolist Optional Sync Demo publish_to: "none" version: 1.0.1 diff --git a/demos/local-only-todolist/web/favicon.png b/demos/supabase-todolist-optional-sync/web/favicon.png similarity index 100% rename from demos/local-only-todolist/web/favicon.png rename to demos/supabase-todolist-optional-sync/web/favicon.png diff --git a/demos/local-only-todolist/web/icons/Icon-192.png b/demos/supabase-todolist-optional-sync/web/icons/Icon-192.png similarity index 100% rename from demos/local-only-todolist/web/icons/Icon-192.png rename to demos/supabase-todolist-optional-sync/web/icons/Icon-192.png diff --git a/demos/local-only-todolist/web/icons/Icon-512.png b/demos/supabase-todolist-optional-sync/web/icons/Icon-512.png similarity index 100% rename from demos/local-only-todolist/web/icons/Icon-512.png rename to demos/supabase-todolist-optional-sync/web/icons/Icon-512.png diff --git a/demos/local-only-todolist/web/icons/Icon-maskable-192.png b/demos/supabase-todolist-optional-sync/web/icons/Icon-maskable-192.png similarity index 100% rename from demos/local-only-todolist/web/icons/Icon-maskable-192.png rename to demos/supabase-todolist-optional-sync/web/icons/Icon-maskable-192.png diff --git a/demos/local-only-todolist/web/icons/Icon-maskable-512.png b/demos/supabase-todolist-optional-sync/web/icons/Icon-maskable-512.png similarity index 100% rename from demos/local-only-todolist/web/icons/Icon-maskable-512.png rename to demos/supabase-todolist-optional-sync/web/icons/Icon-maskable-512.png diff --git a/demos/local-only-todolist/web/index.html b/demos/supabase-todolist-optional-sync/web/index.html similarity index 97% rename from demos/local-only-todolist/web/index.html rename to demos/supabase-todolist-optional-sync/web/index.html index aeb145bc..ba9114df 100644 --- a/demos/local-only-todolist/web/index.html +++ b/demos/supabase-todolist-optional-sync/web/index.html @@ -29,7 +29,7 @@ - local_only_todolist + supabase_todolist_optional_sync - - - - - - + + + + + + + + + + + + + + + + supabase_todolist_optional_sync + + + + + diff --git a/demos/supabase-todolist-optional-sync/web/manifest.json b/demos/supabase-todolist-optional-sync/web/manifest.json index 45422223..4c2de86d 100644 --- a/demos/supabase-todolist-optional-sync/web/manifest.json +++ b/demos/supabase-todolist-optional-sync/web/manifest.json @@ -1,35 +1,35 @@ { - "name": "supabase_todolist_optional_sync", - "short_name": "supabase_todolist_optional_sync", - "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" - } - ] + "name": "supabase_todolist_optional_sync", + "short_name": "supabase_todolist_optional_sync", + "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" + } + ] } diff --git a/demos/supabase-todolist-optional-sync/web_old/favicon.png b/demos/supabase-todolist-optional-sync/web_old/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/demos/supabase-todolist-optional-sync/web_old/icons/Icon-192.png b/demos/supabase-todolist-optional-sync/web_old/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/demos/supabase-todolist-optional-sync/web_old/icons/Icon-512.png b/demos/supabase-todolist-optional-sync/web_old/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/demos/supabase-todolist-optional-sync/web_old/icons/Icon-maskable-192.png b/demos/supabase-todolist-optional-sync/web_old/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/demos/supabase-todolist-optional-sync/web_old/icons/Icon-maskable-512.png b/demos/supabase-todolist-optional-sync/web_old/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/demos/supabase-todolist-optional-sync/web_old/index.html b/demos/supabase-todolist-optional-sync/web_old/index.html new file mode 100644 index 00000000..ba9114df --- /dev/null +++ b/demos/supabase-todolist-optional-sync/web_old/index.html @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + supabase_todolist_optional_sync + + + + + + + + + + diff --git a/demos/supabase-todolist-optional-sync/web_old/manifest.json b/demos/supabase-todolist-optional-sync/web_old/manifest.json new file mode 100644 index 00000000..45422223 --- /dev/null +++ b/demos/supabase-todolist-optional-sync/web_old/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "supabase_todolist_optional_sync", + "short_name": "supabase_todolist_optional_sync", + "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" + } + ] +} diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 7572a2cb..986baf33 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -300,18 +300,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.4" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.3" leak_tracker_testing: dependency: transitive description: @@ -348,18 +348,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.12.0" mime: dependency: transitive description: @@ -470,7 +470,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.7.0" + version: "1.8.1" powersync_attachments_helper: dependency: "direct main" description: @@ -702,10 +702,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.0" typed_data: dependency: transitive description: @@ -806,10 +806,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.2.1" web: dependency: transitive description: diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index ba463a69..1d189e54 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -1,5 +1,5 @@ name: powersync -version: 1.8.0 +version: 1.8.1 homepage: https://powersync.com repository: https://github.com/powersync-ja/powersync.dart description: PowerSync Flutter SDK - keep PostgreSQL databases in sync with on-device SQLite databases. From bfe115e7574d2ee2a2f4e4e2a590bf4c57229986 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 08:18:00 +0200 Subject: [PATCH 28/34] Reverted manual bump. --- packages/powersync/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 1d189e54..ba463a69 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -1,5 +1,5 @@ name: powersync -version: 1.8.1 +version: 1.8.0 homepage: https://powersync.com repository: https://github.com/powersync-ja/powersync.dart description: PowerSync Flutter SDK - keep PostgreSQL databases in sync with on-device SQLite databases. From 99bd89f98a7c0acfa83090703b1fb6d20bcd60d3 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 08:26:34 +0200 Subject: [PATCH 29/34] chore(release): publish packages - powersync@1.8.1 - powersync_attachments_helper@0.6.5+2 --- CHANGELOG.md | 28 +++++++++++++++++++ demos/django-todolist/pubspec.yaml | 2 +- demos/supabase-anonymous-auth/pubspec.yaml | 2 +- .../supabase-edge-function-auth/pubspec.yaml | 2 +- demos/supabase-simple-chat/pubspec.yaml | 2 +- demos/supabase-todolist-drift/pubspec.yaml | 4 +-- demos/supabase-todolist/pubspec.yaml | 4 +-- packages/powersync/CHANGELOG.md | 4 +++ packages/powersync/lib/src/version.dart | 2 +- packages/powersync/pubspec.yaml | 2 +- .../powersync_attachments_helper/CHANGELOG.md | 4 +++ .../powersync_attachments_helper/pubspec.yaml | 4 +-- 12 files changed, 48 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd08c20f..97e5ed31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,34 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-09-09 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`powersync` - `v1.8.1`](#powersync---v181) + - [`powersync_attachments_helper` - `v0.6.5+2`](#powersync_attachments_helper---v0652) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `powersync_attachments_helper` - `v0.6.5+2` + +--- + +#### `powersync` - `v1.8.1` + + - Added `refreshSchema()`, allowing queries and watch calls to work against updated schemas. + + ## 2024-09-06 ### Changes diff --git a/demos/django-todolist/pubspec.yaml b/demos/django-todolist/pubspec.yaml index fa2c184a..b74f51ed 100644 --- a/demos/django-todolist/pubspec.yaml +++ b/demos/django-todolist/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - powersync: ^1.8.0 + powersync: ^1.8.1 path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 diff --git a/demos/supabase-anonymous-auth/pubspec.yaml b/demos/supabase-anonymous-auth/pubspec.yaml index 38251d3e..beca1ca7 100644 --- a/demos/supabase-anonymous-auth/pubspec.yaml +++ b/demos/supabase-anonymous-auth/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.8.0 + powersync: ^1.8.1 path_provider: ^2.1.1 supabase_flutter: ^2.0.2 path: ^1.8.3 diff --git a/demos/supabase-edge-function-auth/pubspec.yaml b/demos/supabase-edge-function-auth/pubspec.yaml index 61f9be98..ae175593 100644 --- a/demos/supabase-edge-function-auth/pubspec.yaml +++ b/demos/supabase-edge-function-auth/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.8.0 + powersync: ^1.8.1 path_provider: ^2.1.1 supabase_flutter: ^2.0.2 path: ^1.8.3 diff --git a/demos/supabase-simple-chat/pubspec.yaml b/demos/supabase-simple-chat/pubspec.yaml index 0ae38e4d..a9362043 100644 --- a/demos/supabase-simple-chat/pubspec.yaml +++ b/demos/supabase-simple-chat/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: supabase_flutter: ^2.0.2 timeago: ^3.6.0 - powersync: ^1.8.0 + powersync: ^1.8.1 path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 diff --git a/demos/supabase-todolist-drift/pubspec.yaml b/demos/supabase-todolist-drift/pubspec.yaml index 62c5d260..d9e0ad22 100644 --- a/demos/supabase-todolist-drift/pubspec.yaml +++ b/demos/supabase-todolist-drift/pubspec.yaml @@ -9,8 +9,8 @@ environment: dependencies: flutter: sdk: flutter - powersync_attachments_helper: ^0.6.5+1 - powersync: ^1.8.0 + powersync_attachments_helper: ^0.6.5+2 + powersync: ^1.8.1 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 diff --git a/demos/supabase-todolist/pubspec.yaml b/demos/supabase-todolist/pubspec.yaml index cb5d4560..86b5d9ad 100644 --- a/demos/supabase-todolist/pubspec.yaml +++ b/demos/supabase-todolist/pubspec.yaml @@ -10,8 +10,8 @@ environment: dependencies: flutter: sdk: flutter - powersync_attachments_helper: ^0.6.5+1 - powersync: ^1.8.0 + powersync_attachments_helper: ^0.6.5+2 + powersync: ^1.8.1 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 diff --git a/packages/powersync/CHANGELOG.md b/packages/powersync/CHANGELOG.md index 98d129b7..4b937e73 100644 --- a/packages/powersync/CHANGELOG.md +++ b/packages/powersync/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.1 + + - Added `refreshSchema()`, allowing queries and watch calls to work against updated schemas. + ## 1.8.0 - Requires `journeyapps/powersync-service` v0.5.0 or later when self-hosting diff --git a/packages/powersync/lib/src/version.dart b/packages/powersync/lib/src/version.dart index 48de2711..8ad2d7b2 100644 --- a/packages/powersync/lib/src/version.dart +++ b/packages/powersync/lib/src/version.dart @@ -1 +1 @@ -const String libraryVersion = '1.8.0'; +const String libraryVersion = '1.8.1'; diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index ba463a69..1d189e54 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -1,5 +1,5 @@ name: powersync -version: 1.8.0 +version: 1.8.1 homepage: https://powersync.com repository: https://github.com/powersync-ja/powersync.dart description: PowerSync Flutter SDK - keep PostgreSQL databases in sync with on-device SQLite databases. diff --git a/packages/powersync_attachments_helper/CHANGELOG.md b/packages/powersync_attachments_helper/CHANGELOG.md index 84be3436..e94ad5e5 100644 --- a/packages/powersync_attachments_helper/CHANGELOG.md +++ b/packages/powersync_attachments_helper/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.5+2 + + - Update a dependency to the latest release. + ## 0.6.5+1 - Update a dependency to the latest release. diff --git a/packages/powersync_attachments_helper/pubspec.yaml b/packages/powersync_attachments_helper/pubspec.yaml index 240e069a..c81c0e13 100644 --- a/packages/powersync_attachments_helper/pubspec.yaml +++ b/packages/powersync_attachments_helper/pubspec.yaml @@ -1,6 +1,6 @@ name: powersync_attachments_helper description: A helper library for handling attachments when using PowerSync. -version: 0.6.5+1 +version: 0.6.5+2 repository: https://github.com/powersync-ja/powersync.dart homepage: https://www.powersync.com/ environment: @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.7.0 + powersync: ^1.8.1 logging: ^1.2.0 sqlite_async: ^0.8.3 path_provider: ^2.0.13 From 66c0cea28f807e6e5cc2e66a29255c7c186ab449 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 08:27:35 +0200 Subject: [PATCH 30/34] Bumped demos powersync to 1.8.1 --- demos/django-todolist/pubspec.lock | 2 +- demos/supabase-anonymous-auth/pubspec.lock | 2 +- demos/supabase-edge-function-auth/pubspec.lock | 2 +- demos/supabase-simple-chat/pubspec.lock | 2 +- demos/supabase-todolist-drift/pubspec.lock | 2 +- demos/supabase-todolist-optional-sync/pubspec.lock | 2 +- demos/supabase-todolist/pubspec.lock | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/demos/django-todolist/pubspec.lock b/demos/django-todolist/pubspec.lock index cb451aec..a45d930e 100644 --- a/demos/django-todolist/pubspec.lock +++ b/demos/django-todolist/pubspec.lock @@ -310,7 +310,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_flutter_libs: dependency: "direct overridden" description: diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index 4e4b625f..9b44dcfc 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -366,7 +366,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_flutter_libs: dependency: "direct overridden" description: diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index 5fbae98c..be197336 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -390,7 +390,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_flutter_libs: dependency: "direct overridden" description: diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index ae1e8171..aa1ee465 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -406,7 +406,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_flutter_libs: dependency: "direct overridden" description: diff --git a/demos/supabase-todolist-drift/pubspec.lock b/demos/supabase-todolist-drift/pubspec.lock index e9bc63e9..2aeba6ed 100644 --- a/demos/supabase-todolist-drift/pubspec.lock +++ b/demos/supabase-todolist-drift/pubspec.lock @@ -686,7 +686,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_attachments_helper: dependency: "direct main" description: diff --git a/demos/supabase-todolist-optional-sync/pubspec.lock b/demos/supabase-todolist-optional-sync/pubspec.lock index 43cc7cd3..32240840 100644 --- a/demos/supabase-todolist-optional-sync/pubspec.lock +++ b/demos/supabase-todolist-optional-sync/pubspec.lock @@ -470,7 +470,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_flutter_libs: dependency: "direct overridden" description: diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 986baf33..fe729501 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -470,7 +470,7 @@ packages: path: "../../packages/powersync" relative: true source: path - version: "1.8.1" + version: "1.8.0" powersync_attachments_helper: dependency: "direct main" description: From 1236be7bb36cac543d3e0f10ff2e39e6a71193db Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 08:47:19 +0200 Subject: [PATCH 31/34] Fixed widget test. --- demos/supabase-todolist-optional-sync/test/widget_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/supabase-todolist-optional-sync/test/widget_test.dart b/demos/supabase-todolist-optional-sync/test/widget_test.dart index 340c18b8..22f3b43c 100644 --- a/demos/supabase-todolist-optional-sync/test/widget_test.dart +++ b/demos/supabase-todolist-optional-sync/test/widget_test.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:supabase_todolist_optional_sync/main.dart'; +import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { From bda2fb19c9611358fba9abcad305924a377cf233 Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 08:53:09 +0200 Subject: [PATCH 32/34] Removed test. --- .../test/widget_test.dart | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 demos/supabase-todolist-optional-sync/test/widget_test.dart diff --git a/demos/supabase-todolist-optional-sync/test/widget_test.dart b/demos/supabase-todolist-optional-sync/test/widget_test.dart deleted file mode 100644 index 22f3b43c..00000000 --- a/demos/supabase-todolist-optional-sync/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. 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/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:powersync_flutter_supabase_todolist_optional_sync_demo/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const 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 5ab85205ec59c4ec960e55487b8ea48680dff1fd Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 09:37:35 +0200 Subject: [PATCH 33/34] Undo version. --- CHANGELOG.md | 120 +++++++----------- packages/powersync/CHANGELOG.md | 33 ++--- .../powersync_attachments_helper/CHANGELOG.md | 20 ++- 3 files changed, 65 insertions(+), 108 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97e5ed31..0ac104e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,34 +3,6 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. -## 2024-09-09 - -### Changes - ---- - -Packages with breaking changes: - - - There are no breaking changes in this release. - -Packages with other changes: - - - [`powersync` - `v1.8.1`](#powersync---v181) - - [`powersync_attachments_helper` - `v0.6.5+2`](#powersync_attachments_helper---v0652) - -Packages with dependency updates only: - -> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. - - - `powersync_attachments_helper` - `v0.6.5+2` - ---- - -#### `powersync` - `v1.8.1` - - - Added `refreshSchema()`, allowing queries and watch calls to work against updated schemas. - - ## 2024-09-06 ### Changes @@ -39,26 +11,25 @@ Packages with dependency updates only: Packages with breaking changes: - - There are no breaking changes in this release. +- There are no breaking changes in this release. Packages with other changes: - - [`powersync` - `v1.8.0`](#powersync---v180) +- [`powersync` - `v1.8.0`](#powersync---v180) --- #### `powersync` - `v1.8.0` - - Requires `journeyapps/powersync-service` v0.5.0 or later when self-hosting - - Use powersync-sqlite-core v0.2.1 - - Customize `User-Agent` header - - Add `client_id` parameter to sync requests - - Persist `lastSyncedAt` - - Emit update notifications for watch queries on `disconnectAndClear()` - - Validate that the `powersync-sqlite-core` version number is in a compatible range of `^0.2.0` - - Always cast `target_op` (write checkpoints) to ensure it's an integer - - Sync optimizations for MOVE and REMOVE operations - +- Requires `journeyapps/powersync-service` v0.5.0 or later when self-hosting +- Use powersync-sqlite-core v0.2.1 +- Customize `User-Agent` header +- Add `client_id` parameter to sync requests +- Persist `lastSyncedAt` +- Emit update notifications for watch queries on `disconnectAndClear()` +- Validate that the `powersync-sqlite-core` version number is in a compatible range of `^0.2.0` +- Always cast `target_op` (write checkpoints) to ensure it's an integer +- Sync optimizations for MOVE and REMOVE operations ## 2024-08-23 @@ -68,26 +39,25 @@ Packages with other changes: Packages with breaking changes: - - There are no breaking changes in this release. +- There are no breaking changes in this release. Packages with other changes: - - [`powersync` - `v1.7.0`](#powersync---v170) - - [`powersync_attachments_helper` - `v0.6.5+1`](#powersync_attachments_helper---v0651) +- [`powersync` - `v1.7.0`](#powersync---v170) +- [`powersync_attachments_helper` - `v0.6.5+1`](#powersync_attachments_helper---v0651) Packages with dependency updates only: > Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. - - `powersync_attachments_helper` - `v0.6.5+1` +- `powersync_attachments_helper` - `v0.6.5+1` --- #### `powersync` - `v1.7.0` - - **FEAT**: Include schema validation check - - **FEAT**: Include new table check for maximum number of columns allowed - +- **FEAT**: Include schema validation check +- **FEAT**: Include new table check for maximum number of columns allowed ## 2024-08-21 @@ -97,28 +67,27 @@ Packages with dependency updates only: Packages with breaking changes: - - There are no breaking changes in this release. +- There are no breaking changes in this release. Packages with other changes: - - [`powersync` - `v1.6.7`](#powersync---v167) - - [`powersync_attachments_helper` - `v0.6.5`](#powersync_attachments_helper---v065) - - [`powersync_flutter_libs` - `v0.2.2`](#powersync_flutter_libs---v022) +- [`powersync` - `v1.6.7`](#powersync---v167) +- [`powersync_attachments_helper` - `v0.6.5`](#powersync_attachments_helper---v065) +- [`powersync_flutter_libs` - `v0.2.2`](#powersync_flutter_libs---v022) --- #### `powersync` - `v1.6.7` - - **CHORE**: Update dependency powersync_flutter_libs +- **CHORE**: Update dependency powersync_flutter_libs #### `powersync_attachments_helper` - `v0.6.5` - - Update a dependency to the latest release. +- Update a dependency to the latest release. #### `powersync_flutter_libs` - `v0.2.2` - - **FIX**: Prebundling downloaded core binaries. - +- **FIX**: Prebundling downloaded core binaries. ## 2024-08-21 @@ -128,28 +97,27 @@ Packages with other changes: Packages with breaking changes: - - There are no breaking changes in this release. +- There are no breaking changes in this release. Packages with other changes: - - [`powersync` - `v1.6.6`](#powersync---v166) - - [`powersync_attachments_helper` - `v0.6.4`](#powersync_attachments_helper---v064) - - [`powersync_flutter_libs` - `v0.2.1`](#powersync_flutter_libs---v021) +- [`powersync` - `v1.6.6`](#powersync---v166) +- [`powersync_attachments_helper` - `v0.6.4`](#powersync_attachments_helper---v064) +- [`powersync_flutter_libs` - `v0.2.1`](#powersync_flutter_libs---v021) --- #### `powersync` - `v1.6.6` - - **CHORE**: Update dependency powersync_flutter_libs +- **CHORE**: Update dependency powersync_flutter_libs #### `powersync_attachments_helper` - `v0.6.4` - - Update a dependency to the latest release. +- Update a dependency to the latest release. #### `powersync_flutter_libs` - `v0.2.1` - - **FIX**: Prebundling downloaded core binaries - +- **FIX**: Prebundling downloaded core binaries ## 2024-08-19 @@ -159,30 +127,29 @@ Packages with other changes: Packages with breaking changes: - - There are no breaking changes in this release. +- There are no breaking changes in this release. Packages with other changes: - - [`powersync` - `v1.6.5`](#powersync---v165) - - [`powersync_attachments_helper` - `v0.6.3+2`](#powersync_attachments_helper---v0632) - - [`powersync_flutter_libs` - `v0.2.0`](#powersync_flutter_libs---v020) +- [`powersync` - `v1.6.5`](#powersync---v165) +- [`powersync_attachments_helper` - `v0.6.3+2`](#powersync_attachments_helper---v0632) +- [`powersync_flutter_libs` - `v0.2.0`](#powersync_flutter_libs---v020) Packages with dependency updates only: > Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. - - `powersync_attachments_helper` - `v0.6.3+2` +- `powersync_attachments_helper` - `v0.6.3+2` --- #### `powersync` - `v1.6.5` - - **CHORE**: Update dependency `powersync_flutter_libs` +- **CHORE**: Update dependency `powersync_flutter_libs` #### `powersync_flutter_libs` - `v0.2.0` - - **FEAT**: Prebundle downloaded core binaries - +- **FEAT**: Prebundle downloaded core binaries ## 2024-08-06 @@ -192,25 +159,24 @@ Packages with dependency updates only: Packages with breaking changes: - - There are no breaking changes in this release. +- There are no breaking changes in this release. Packages with other changes: - - [`powersync` - `v1.6.4`](#powersync---v164) - - [`powersync_attachments_helper` - `v0.6.3+1`](#powersync_attachments_helper---v0631) +- [`powersync` - `v1.6.4`](#powersync---v164) +- [`powersync_attachments_helper` - `v0.6.3+1`](#powersync_attachments_helper---v0631) Packages with dependency updates only: > Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. - - `powersync_attachments_helper` - `v0.6.3+1` +- `powersync_attachments_helper` - `v0.6.3+1` --- #### `powersync` - `v1.6.4` - - **FIX**: `hasSynced` status should be reset after `disconnectAndClear` has been called. ([5e12a079](https://github.com/powersync-ja/powersync.dart/commit/5e12a07918ca16d3dcf90f26a42c5a61c09fb978)) - +- **FIX**: `hasSynced` status should be reset after `disconnectAndClear` has been called. ([5e12a079](https://github.com/powersync-ja/powersync.dart/commit/5e12a07918ca16d3dcf90f26a42c5a61c09fb978)) ## 2024-07-31 diff --git a/packages/powersync/CHANGELOG.md b/packages/powersync/CHANGELOG.md index 4b937e73..ea51fe68 100644 --- a/packages/powersync/CHANGELOG.md +++ b/packages/powersync/CHANGELOG.md @@ -1,36 +1,31 @@ -## 1.8.1 - - - Added `refreshSchema()`, allowing queries and watch calls to work against updated schemas. - ## 1.8.0 - - Requires `journeyapps/powersync-service` v0.5.0 or later when self-hosting - - Use powersync-sqlite-core v0.2.1 - - Customize `User-Agent` header - - Add `client_id` parameter to sync requests - - Persist `lastSyncedAt` - - Emit update notifications for watch queries on `disconnectAndClear()` - - Validate that the `powersync-sqlite-core` version number is in a compatible range of `^0.2.0` - - Always cast `target_op` (write checkpoints) to ensure it's an integer - - Sync optimizations for MOVE and REMOVE operations - +- Requires `journeyapps/powersync-service` v0.5.0 or later when self-hosting +- Use powersync-sqlite-core v0.2.1 +- Customize `User-Agent` header +- Add `client_id` parameter to sync requests +- Persist `lastSyncedAt` +- Emit update notifications for watch queries on `disconnectAndClear()` +- Validate that the `powersync-sqlite-core` version number is in a compatible range of `^0.2.0` +- Always cast `target_op` (write checkpoints) to ensure it's an integer +- Sync optimizations for MOVE and REMOVE operations ## 1.7.0 - - **FEAT**: Include schema validation check - - **FEAT**: Include new table check for maximum number of columns allowed +- **FEAT**: Include schema validation check +- **FEAT**: Include new table check for maximum number of columns allowed ## 1.6.7 - - **CHORE**: Update dependency powersync_flutter_libs +- **CHORE**: Update dependency powersync_flutter_libs ## 1.6.6 - - **CHORE**: Update dependency powersync_flutter_libs +- **CHORE**: Update dependency powersync_flutter_libs ## 1.6.5 - - **CHORE**: Update dependency `powersync_flutter_libs` +- **CHORE**: Update dependency `powersync_flutter_libs` ## 1.6.4 diff --git a/packages/powersync_attachments_helper/CHANGELOG.md b/packages/powersync_attachments_helper/CHANGELOG.md index e94ad5e5..72e491c5 100644 --- a/packages/powersync_attachments_helper/CHANGELOG.md +++ b/packages/powersync_attachments_helper/CHANGELOG.md @@ -1,38 +1,34 @@ -## 0.6.5+2 - - - Update a dependency to the latest release. - ## 0.6.5+1 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.5 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.4 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.3+2 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.3+1 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.3 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.2 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.1 - - Update a dependency to the latest release. +- Update a dependency to the latest release. ## 0.6.0 From 50d6d07d07a6277561ca9c5e3bc9bfe7ebcad1ca Mon Sep 17 00:00:00 2001 From: Christiaan Landman Date: Mon, 9 Sep 2024 09:44:14 +0200 Subject: [PATCH 34/34] chore(release): publish packages - powersync@1.8.2 - powersync_attachments_helper@0.6.5+3 --- CHANGELOG.md | 28 +++++++++++++++++++ demos/django-todolist/pubspec.yaml | 2 +- demos/supabase-anonymous-auth/pubspec.yaml | 2 +- .../supabase-edge-function-auth/pubspec.yaml | 2 +- demos/supabase-simple-chat/pubspec.yaml | 2 +- demos/supabase-todolist-drift/pubspec.yaml | 4 +-- .../pubspec.yaml | 2 +- demos/supabase-todolist/pubspec.yaml | 4 +-- packages/powersync/CHANGELOG.md | 4 +++ packages/powersync/lib/src/version.dart | 2 +- packages/powersync/pubspec.yaml | 2 +- .../powersync_attachments_helper/CHANGELOG.md | 4 +++ .../powersync_attachments_helper/pubspec.yaml | 4 +-- 13 files changed, 49 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd4fad1f..678af823 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,34 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-09-09 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`powersync` - `v1.8.2`](#powersync---v182) + - [`powersync_attachments_helper` - `v0.6.5+3`](#powersync_attachments_helper---v0653) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `powersync_attachments_helper` - `v0.6.5+3` + +--- + +#### `powersync` - `v1.8.2` + + - Added `refreshSchema()`, allowing queries and watch calls to work against updated schemas. + + ## 2024-09-09 ### Changes diff --git a/demos/django-todolist/pubspec.yaml b/demos/django-todolist/pubspec.yaml index b74f51ed..c61749aa 100644 --- a/demos/django-todolist/pubspec.yaml +++ b/demos/django-todolist/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - powersync: ^1.8.1 + powersync: ^1.8.2 path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 diff --git a/demos/supabase-anonymous-auth/pubspec.yaml b/demos/supabase-anonymous-auth/pubspec.yaml index beca1ca7..f2833207 100644 --- a/demos/supabase-anonymous-auth/pubspec.yaml +++ b/demos/supabase-anonymous-auth/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.8.1 + powersync: ^1.8.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.2 path: ^1.8.3 diff --git a/demos/supabase-edge-function-auth/pubspec.yaml b/demos/supabase-edge-function-auth/pubspec.yaml index ae175593..fcb508af 100644 --- a/demos/supabase-edge-function-auth/pubspec.yaml +++ b/demos/supabase-edge-function-auth/pubspec.yaml @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.8.1 + powersync: ^1.8.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.2 path: ^1.8.3 diff --git a/demos/supabase-simple-chat/pubspec.yaml b/demos/supabase-simple-chat/pubspec.yaml index a9362043..353f6a34 100644 --- a/demos/supabase-simple-chat/pubspec.yaml +++ b/demos/supabase-simple-chat/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: supabase_flutter: ^2.0.2 timeago: ^3.6.0 - powersync: ^1.8.1 + powersync: ^1.8.2 path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 diff --git a/demos/supabase-todolist-drift/pubspec.yaml b/demos/supabase-todolist-drift/pubspec.yaml index a0b134fb..afdace1c 100644 --- a/demos/supabase-todolist-drift/pubspec.yaml +++ b/demos/supabase-todolist-drift/pubspec.yaml @@ -9,8 +9,8 @@ environment: dependencies: flutter: sdk: flutter - powersync_attachments_helper: ^0.6.5+1 - powersync: ^1.8.1 + powersync_attachments_helper: ^0.6.5+3 + powersync: ^1.8.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 diff --git a/demos/supabase-todolist-optional-sync/pubspec.yaml b/demos/supabase-todolist-optional-sync/pubspec.yaml index acf7439b..43ed4c74 100644 --- a/demos/supabase-todolist-optional-sync/pubspec.yaml +++ b/demos/supabase-todolist-optional-sync/pubspec.yaml @@ -10,7 +10,7 @@ environment: dependencies: flutter: sdk: flutter - powersync: ^1.8.1 + powersync: ^1.8.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 diff --git a/demos/supabase-todolist/pubspec.yaml b/demos/supabase-todolist/pubspec.yaml index dd5bc242..9d2fc6ba 100644 --- a/demos/supabase-todolist/pubspec.yaml +++ b/demos/supabase-todolist/pubspec.yaml @@ -10,8 +10,8 @@ environment: dependencies: flutter: sdk: flutter - powersync_attachments_helper: ^0.6.5+1 - powersync: ^1.8.1 + powersync_attachments_helper: ^0.6.5+3 + powersync: ^1.8.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 diff --git a/packages/powersync/CHANGELOG.md b/packages/powersync/CHANGELOG.md index 1323d8ad..bd754f9a 100644 --- a/packages/powersync/CHANGELOG.md +++ b/packages/powersync/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.8.2 + + - Added `refreshSchema()`, allowing queries and watch calls to work against updated schemas. + ## 1.8.1 - Fix powersync_flutter_libs dependency diff --git a/packages/powersync/lib/src/version.dart b/packages/powersync/lib/src/version.dart index 8ad2d7b2..192b6cd9 100644 --- a/packages/powersync/lib/src/version.dart +++ b/packages/powersync/lib/src/version.dart @@ -1 +1 @@ -const String libraryVersion = '1.8.1'; +const String libraryVersion = '1.8.2'; diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index e8b2283f..e6c7ffc1 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -1,5 +1,5 @@ name: powersync -version: 1.8.1 +version: 1.8.2 homepage: https://powersync.com repository: https://github.com/powersync-ja/powersync.dart description: PowerSync Flutter SDK - keep PostgreSQL databases in sync with on-device SQLite databases. diff --git a/packages/powersync_attachments_helper/CHANGELOG.md b/packages/powersync_attachments_helper/CHANGELOG.md index 72e491c5..717d532a 100644 --- a/packages/powersync_attachments_helper/CHANGELOG.md +++ b/packages/powersync_attachments_helper/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.6.5+3 + + - Update a dependency to the latest release. + ## 0.6.5+1 - Update a dependency to the latest release. diff --git a/packages/powersync_attachments_helper/pubspec.yaml b/packages/powersync_attachments_helper/pubspec.yaml index c81c0e13..5e4fbdb4 100644 --- a/packages/powersync_attachments_helper/pubspec.yaml +++ b/packages/powersync_attachments_helper/pubspec.yaml @@ -1,6 +1,6 @@ name: powersync_attachments_helper description: A helper library for handling attachments when using PowerSync. -version: 0.6.5+2 +version: 0.6.5+3 repository: https://github.com/powersync-ja/powersync.dart homepage: https://www.powersync.com/ environment: @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.8.1 + powersync: ^1.8.2 logging: ^1.2.0 sqlite_async: ^0.8.3 path_provider: ^2.0.13

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 DYCg>7 literal 0 HcmV?d00001 diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 79d068b9..61d7438a 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -1,30 +1,12 @@ import 'package:powersync/powersync.dart'; import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; -/// This schema design supports a local-only to online workflow by managing data +/// This schema design supports a local-only to sync workflow by managing data /// across two versions of each table: one for local/offline use and one for /// online/synced use. This approach simplifies the handling of data in different /// connectivity states. /// -/// For local-only, the views become: -/// inactive_synced_todos -/// todos -/// inactive_synced_lists -/// lists -/// -/// - 'todos' and 'lists' refer to the local-only data. -/// - 'inactive_synced_todos' and 'inactive_synced_lists' refer to the data that will be synced -/// once online. -/// -/// For online, we have these views: -/// todos -/// inactive_local_todos -/// lists -/// inactive_local_lists -/// -/// - 'todos' and 'lists' refer to the synced/online data. -/// - `inactive_local_todos' and 'inactive_local_lists' refer to the local-only data, allowing -/// for temporary storage or operations before syncing. +/// See the README for details. /// /// For an offline-to-online transition [switchToSyncedSchema] copies data so that it ends up in the upload queue. From b078fb7a1da88e14ddccacf988c1ec0f037b688e Mon Sep 17 00:00:00 2001 From: benitav Date: Thu, 5 Sep 2024 14:49:05 +0200 Subject: [PATCH 20/34] Polish schema.dart comments --- demos/local-only-todolist/lib/models/schema.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 61d7438a..38741e56 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -2,19 +2,19 @@ import 'package:powersync/powersync.dart'; import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; /// This schema design supports a local-only to sync workflow by managing data -/// across two versions of each table: one for local/offline use and one for -/// online/synced use. This approach simplifies the handling of data in different -/// connectivity states. +/// across two versions of each table: one for local-only use without syncing before a user registers, +/// the other for sync-enabled use after the user registers/signs in. /// /// See the README for details. /// -/// For an offline-to-online transition [switchToSyncedSchema] copies data so that it ends up in the upload queue. +/// [switchToSyncedSchema] copies data from the local-only tables to the sync-enabled tables +/// so that it ends up in the upload queue. const todosTable = 'todos'; const listsTable = 'lists'; Schema makeSchema({synced = bool}) { - String onlineName(String table) { + String syncedName(String table) { if (synced) { return table; } else { @@ -53,7 +53,7 @@ Schema makeSchema({synced = bool}) { return Schema([ for (var table in tables) Table(table.name, table.columns, - indexes: table.indexes, viewName: onlineName(table.name)), + indexes: table.indexes, viewName: syncedName(table.name)), for (var table in tables) Table.localOnly('local_${table.name}', table.columns, indexes: table.indexes, viewName: localName(table.name)) @@ -68,8 +68,8 @@ switchToSyncedSchema(PowerSyncDatabase db, String userId) async { await setSyncEnabled(true); await db.writeTransaction((tx) async { - // Copy local-only data to the "online" views. - // This records each operation to the crud queue. + // Copy local-only data to the sync-enabled tables/views. + // This records each operation in the upload queue. await tx.execute( 'INSERT INTO lists(id, name, created_at, owner_id) SELECT id, name, created_at, ? FROM inactive_local_lists', [userId]); From ec3fd2b87e1b5370cb8c6a7b9066a015b9445fb6 Mon Sep 17 00:00:00 2001 From: benitav Date: Thu, 5 Sep 2024 14:55:17 +0200 Subject: [PATCH 21/34] Schema comments --- demos/local-only-todolist/lib/models/schema.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/local-only-todolist/lib/models/schema.dart b/demos/local-only-todolist/lib/models/schema.dart index 38741e56..afbb761d 100644 --- a/demos/local-only-todolist/lib/models/schema.dart +++ b/demos/local-only-todolist/lib/models/schema.dart @@ -1,7 +1,7 @@ import 'package:powersync/powersync.dart'; import 'package:powersync_flutter_local_only_demo/models/sync_mode.dart'; -/// This schema design supports a local-only to sync workflow by managing data +/// This schema design supports a local-only to sync-enabled workflow by managing data /// across two versions of each table: one for local-only use without syncing before a user registers, /// the other for sync-enabled use after the user registers/signs in. /// @@ -77,7 +77,7 @@ switchToSyncedSchema(PowerSyncDatabase db, String userId) async { await tx.execute( 'INSERT INTO $todosTable SELECT * FROM inactive_local_$todosTable'); - // Delete the "local-only" data. + // Delete the local-only data. await tx.execute('DELETE FROM inactive_local_$todosTable'); await tx.execute('DELETE FROM inactive_local_$listsTable'); }); From ff1c4bbe49ba5f3e39952052d719d42403afb6e9 Mon Sep 17 00:00:00 2001 From: benitav Date: Thu, 5 Sep 2024 19:09:53 +0200 Subject: [PATCH 22/34] More polish --- demos/local-only-todolist/README.md | 12 +++++------- .../assets/local-only-readme-1.png | Bin 47445 -> 62724 bytes .../assets/local-only-readme-2.png | Bin 60942 -> 65199 bytes .../assets/local-only-readme-3.png | Bin 119250 -> 119407 bytes demos/local-only-todolist/lib/app_config.dart | 8 ++++---- .../lib/models/schema.dart | 13 +++++++++++-- .../lib/models/todo_list.dart | 18 ++++++++++-------- 7 files changed, 30 insertions(+), 21 deletions(-) diff --git a/demos/local-only-todolist/README.md b/demos/local-only-todolist/README.md index b4519ae4..1c3b607f 100644 --- a/demos/local-only-todolist/README.md +++ b/demos/local-only-todolist/README.md @@ -40,7 +40,7 @@ It does the following: ## Configure your PowerSync Instance -Create a new PowerSync instance, connecting to the database of the Supabase project. +Create a new PowerSync instance, connecting to the database of the Supabase project. See instructions [here](https://docs.powersync.com/integration-guides/supabase-+-powersync#connect-powersync-to-your-supabase). Then deploy the following sync rules: @@ -60,7 +60,7 @@ Insert the credentials of your Supabase and PowerSync projects into `lib/app_con ## Sign in to the app -Reload the app and sign up or sign in. Once successfully signed in, existing and new data should seamlessly sync with Supabase. +Restart the app and sign up or sign in. Once successfully signed in, existing and new data should seamlessly sync with Supabase. # How this works @@ -79,26 +79,24 @@ The downside to this approach is that app queries would need to continuously dif ## Recommended implementation -To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property, which allows overriding the default name of the view that is used in queries. +To keep app queries consistent between the two states, we utilize the [viewName](https://pub.dev/documentation/powersync/latest/powersync/Table/viewName.html) property, which allows overriding the default name of schema views (each table automatically has a corresponding view, defaulting to the table name, which is used in queries). This looks as follows in the local-only state: ![diagram-1](./assets/local-only-readme-1.png) -The local-only tables (`local_lists` and `local_todos`) have their view names overriden to `listsAlias` and `todosAlias`, and these names are used in queries (e.g. `PowerSync.getAll("SELECT * FROM listsAlias");`). The `lists` and `todos` tables are not used in this state, but will become relevant in the next step. +The local-only tables (`local_lists` and `local_todos`) have their view names overriden to `lists` and `todos`, and these names are used in queries (e.g. `PowerSync.getAll("SELECT * FROM lists");`). The `lists` and `todos` tables, which are the sync-enabled tables without the `localOnly` flag, are not used at this stage, as indicated by their `inactive_synced_` view names. When the user registers / signs in: ![diagram-2](./assets/local-only-readme-2.png) -The _synced_ tables (`lists` and `todos`) now have their view names overriden to `listsAlias` and `todosAlias`. Note that `updateSchema` must be run to update the view name. See the [schema](./lib/models/schema.dart) for details about this. The app query `PowerSync.getAll("SELECT * FROM listsAlias")` now reads data from the `lists` table. +The _synced_ tables (`lists` and `todos`) now have their view names set to `lists` and `todos`. Note that `updateSchema` must be run to update the view name. See the [schema](./lib/models/schema.dart) for details about this. The app query `PowerSync.getAll("SELECT * FROM lists")` now reads data from the `lists` table. Finally, copy data from the local-only tables to the synced tables, and delete data from the local-only tables to reduce database size: ![diagram-3](./assets/local-only-readme-3.png) - - At this point, being signed in no longer determines which schema should be used, as the user's session expiring and explicitly signing out trigger different behaviors. If the session expires, the user can continue interacting with their data. However, if the user explicitly logs out, all data is cleared, effectively resetting the app. To manage this, an additional local storage mechanism is used to track which schema is currently in use, as seen [here](./lib/models/sync_mode.dart). Note that any other local storage solution would work as long as it's not using the PowerSync database (chicken and egg problem). diff --git a/demos/local-only-todolist/assets/local-only-readme-1.png b/demos/local-only-todolist/assets/local-only-readme-1.png index 5b32c95fb61a371ba40f0d49bd374b56c32a54ac..8f4c70388f4485ef0c7b8ff2674a4558ec7ad718 100644 GIT binary patch literal 62724 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