From 5966ef0193be851d5878d3b19f927dcc061ed416 Mon Sep 17 00:00:00 2001
From: Christiaan Landman
Date: Thu, 3 Oct 2024 10:30:39 +0200
Subject: [PATCH 1/9] Squashed: Merged main and added Added tanstack react
query package.
---
.changeset/beige-plums-cover.md | 5 +
.changeset/brown-radios-report.md | 5 +
.gitignore | 2 +-
README.md | 3 +-
.../react-native-supabase-todolist/README.md | 72 +-
.../ios/Podfile.lock | 31 +-
.../.env.local.template | 6 +
.../.gitignore | 40 +
.../CHANGELOG.md | 1 +
.../LICENSE | 121 +
.../README.md | 91 +
.../android/.gitignore | 16 +
.../android/app/build.gradle | 173 +
.../android/app/debug.keystore | Bin 0 -> 2257 bytes
.../android/app/proguard-rules.pro | 14 +
.../android/app/src/debug/AndroidManifest.xml | 7 +
.../android/app/src/main/AndroidManifest.xml | 37 +
.../com/powersync/example/MainActivity.kt | 61 +
.../com/powersync/example/MainApplication.kt | 55 +
.../res/drawable-hdpi/splashscreen_image.png | Bin 0 -> 83239 bytes
.../res/drawable-mdpi/splashscreen_image.png | Bin 0 -> 83239 bytes
.../res/drawable-xhdpi/splashscreen_image.png | Bin 0 -> 83239 bytes
.../drawable-xxhdpi/splashscreen_image.png | Bin 0 -> 83239 bytes
.../drawable-xxxhdpi/splashscreen_image.png | Bin 0 -> 83239 bytes
.../res/drawable/rn_edit_text_material.xml | 37 +
.../src/main/res/drawable/splashscreen.xml | 3 +
.../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +
.../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +
.../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 7607 bytes
.../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 7607 bytes
.../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 9259 bytes
.../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 4540 bytes
.../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 4540 bytes
.../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 5623 bytes
.../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 11227 bytes
.../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 11227 bytes
.../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 13439 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 19735 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 19735 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 23306 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 28026 bytes
.../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 28026 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 32562 bytes
.../app/src/main/res/values-night/colors.xml | 1 +
.../app/src/main/res/values/colors.xml | 6 +
.../app/src/main/res/values/strings.xml | 5 +
.../app/src/main/res/values/styles.xml | 17 +
.../android/build.gradle | 45 +
.../android/gradle.properties | 65 +
.../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43462 bytes
.../gradle/wrapper/gradle-wrapper.properties | 7 +
.../android/gradlew | 249 +
.../android/gradlew.bat | 92 +
.../android/settings.gradle | 18 +
.../app.config.ts | 79 +
.../app/_layout.tsx | 38 +
.../app/index.tsx | 41 +
.../app/register.tsx | 69 +
.../app/signin.tsx | 77 +
.../app/views/_layout.tsx | 41 +
.../app/views/console.tsx | 46 +
.../app/views/signout.tsx | 23 +
.../app/views/todos/_layout.tsx | 10 +
.../app/views/todos/edit/[id].tsx | 175 +
.../app/views/todos/lists.tsx | 106 +
.../assets/adaptive-icon.png | Bin 0 -> 40457 bytes
.../assets/favicon.png | Bin 0 -> 54518 bytes
.../assets/icon.png | Bin 0 -> 40457 bytes
.../assets/splash.png | Bin 0 -> 66511 bytes
.../babel.config.js | 7 +
.../database.sql | 79 +
.../eas.json | 20 +
.../index.js | 1 +
.../ios/.gitignore | 30 +
.../ios/.xcode.env | 11 +
.../ios/Podfile | 58 +
.../ios/Podfile.lock | 1680 +
.../ios/Podfile.properties.json | 9 +
.../project.pbxproj | 579 +
.../xcschemes/powersyncexample.xcscheme | 88 +
.../contents.xcworkspacedata | 10 +
.../ios/powersyncexample/AppDelegate.h | 7 +
.../ios/powersyncexample/AppDelegate.mm | 62 +
.../App-Icon-1024x1024@1x.png | Bin 0 -> 69113 bytes
.../AppIcon.appiconset/Contents.json | 14 +
.../Images.xcassets/Contents.json | 6 +
.../SplashScreen.imageset/Contents.json | 21 +
.../SplashScreen.imageset/image.png | Bin 0 -> 83239 bytes
.../Contents.json | 21 +
.../SplashScreenBackground.imageset/image.png | Bin 0 -> 68 bytes
.../ios/powersyncexample/Info.plist | 89 +
.../powersyncexample/PrivacyInfo.xcprivacy | 48 +
.../powersyncexample/SplashScreen.storyboard | 51 +
.../powersyncexample/Supporting/Expo.plist | 14 +
.../ios/powersyncexample/main.m | 10 +
.../ios/powersyncexample/noop-file.swift | 4 +
.../powersyncexample-Bridging-Header.h | 3 +
.../powersyncexample.entitlements | 5 +
.../library/powersync/AppSchema.ts | 58 +
.../library/powersync/PhotoAttachmentQueue.ts | 50 +
.../library/powersync/system.ts | 105 +
.../library/storage/FileSystem.ts | 37 +
.../library/storage/KVStorage.ts | 46 +
.../library/storage/SupabaseStorageAdapter.ts | 125 +
.../library/supabase/AppConfig.ts | 6 +
.../library/supabase/SupabaseConnector.ts | 122 +
.../library/utils/alert.ts | 29 +
.../library/utils/prompt.ts | 29 +
.../library/widgets/CameraWidget.tsx | 133 +
.../library/widgets/Drawer.tsx | 16 +
.../library/widgets/HeaderWidget.tsx | 57 +
.../library/widgets/ListItemWidget.tsx | 48 +
.../library/widgets/TextInputWidget.tsx | 25 +
.../library/widgets/TodoItemWidget.tsx | 95 +
.../metro.config.js | 49 +
.../package.json | 68 +
.../process-env.d.ts | 14 +
.../tsconfig.json | 9 +
.../.env | 5 +
.../.gitignore | 47 +
.../CHANGELOG.md | 1 +
.../LICENSE | 121 +
.../README.md | 153 +
.../docs/local-only-readme-0.png | Bin 0 -> 79189 bytes
.../docs/local-only-readme-1.png | Bin 0 -> 62724 bytes
.../docs/local-only-readme-2.png | Bin 0 -> 65199 bytes
.../docs/local-only-readme-3.png | Bin 0 -> 119407 bytes
.../package.json | 43 +
.../public/favicon.ico | Bin 0 -> 1576 bytes
.../public/icons/icon-192x192.png | Bin 0 -> 27110 bytes
.../public/icons/icon-256x256.png | Bin 0 -> 42070 bytes
.../public/icons/icon-384x384.png | Bin 0 -> 74557 bytes
.../public/icons/icon-512x512.png | Bin 0 -> 109318 bytes
.../public/icons/icon.png | Bin 0 -> 76918 bytes
.../public/powersync-logo.svg | 1 +
.../public/supabase-logo.png | Bin 0 -> 46427 bytes
.../src/app/auth/login/page.tsx | 32 +
.../src/app/auth/register/page.tsx | 39 +
.../src/app/globals.css | 12 +
.../src/app/index.tsx | 18 +
.../src/app/page.tsx | 65 +
.../src/app/router.tsx | 55 +
.../src/app/views/layout.tsx | 153 +
.../src/app/views/sql-console/page.tsx | 106 +
.../src/app/views/todo-lists/edit/page.tsx | 164 +
.../src/app/views/todo-lists/page.tsx | 92 +
.../components/navigation/NavigationPage.tsx | 24 +
.../navigation/NavigationPanelContext.tsx | 21 +
.../components/providers/SystemProvider.tsx | 65 +
.../providers/ThemeProviderContainer.tsx | 20 +
.../src/components/widgets/ListItemWidget.tsx | 76 +
.../components/widgets/LoginDetailsWidget.tsx | 166 +
.../src/components/widgets/TodoItemWidget.tsx | 54 +
.../components/widgets/TodoListsWidget.tsx | 60 +
.../src/index.html | 11 +
.../src/library/powersync/AppSchema.ts | 124 +
.../library/powersync/SupabaseConnector.ts | 179 +
.../src/library/powersync/SyncMode.ts | 19 +
.../src/library/powersync/vite-env.d.ts | 11 +
.../tsconfig.json | 26 +
.../vite.config.mts | 75 +
.../functions/merge-document-updates/index.ts | 3 +-
package.json | 2 +-
packages/attachments/CHANGELOG.md | 19 +
packages/attachments/package.json | 5 +-
packages/common/CHANGELOG.md | 18 +
packages/common/package.json | 18 +-
packages/common/rollup.config.mjs | 2 +-
.../src/client/AbstractPowerSyncDatabase.ts | 57 +-
.../client/AbstractPowerSyncOpenFactory.ts | 8 +-
packages/common/src/client/SQLOpenFactory.ts | 2 +-
.../connection/PowerSyncBackendConnector.ts | 4 +-
.../sync/bucket/BucketStorageAdapter.ts | 8 +-
.../src/client/sync/bucket/CrudBatch.ts | 2 +-
.../src/client/sync/bucket/CrudTransaction.ts | 4 +-
.../src/client/sync/bucket/OplogEntry.ts | 4 +-
.../client/sync/bucket/SqliteBucketStorage.ts | 15 +-
.../src/client/sync/bucket/SyncDataBatch.ts | 2 +-
.../src/client/sync/bucket/SyncDataBucket.ts | 4 +-
.../src/client/sync/stream/AbstractRemote.ts | 16 +-
.../AbstractStreamingSyncImplementation.ts | 37 +-
.../sync/stream/streaming-sync-types.ts | 6 +-
packages/common/src/db/DBAdapter.ts | 2 +-
packages/common/src/db/schema/Index.ts | 4 +-
.../common/src/db/schema/IndexedColumn.ts | 4 +-
packages/common/src/db/schema/Schema.ts | 2 +-
packages/common/src/db/schema/Table.ts | 40 +-
packages/common/src/db/schema/TableV2.ts | 4 +-
packages/common/src/index.ts | 68 +-
packages/common/src/utils/DataStream.ts | 2 +-
packages/common/src/utils/parseQuery.ts | 2 +-
packages/common/src/utils/throttle.ts | 50 +
packages/common/tsconfig.json | 4 +
packages/kysely-driver/CHANGELOG.md | 19 +
packages/kysely-driver/package.json | 5 +-
packages/react-native/CHANGELOG.md | 22 +
packages/react-native/README.md | 2 +-
packages/react-native/package.json | 7 +-
packages/react/CHANGELOG.md | 19 +
packages/react/package.json | 5 +-
packages/tanstack-react-query/CHANGELOG.md | 1 +
packages/tanstack-react-query/LICENSE | 201 +
packages/tanstack-react-query/README.md | 160 +
packages/tanstack-react-query/package.json | 44 +
.../src/hooks/useQuery.ts | 138 +
packages/tanstack-react-query/src/index.ts | 2 +
packages/tanstack-react-query/tsconfig.json | 16 +
packages/vue/CHANGELOG.md | 9 +
packages/vue/package.json | 5 +-
packages/web/CHANGELOG.md | 24 +
packages/web/README.md | 2 +-
packages/web/deletePlugin.plugin.js | 25 +
packages/web/package.json | 49 +-
packages/web/src/db/PowerSyncDatabase.ts | 37 +-
.../db/adapters/AbstractWebSQLOpenFactory.ts | 4 +-
.../adapters/wa-sqlite/WASQLiteDBAdapter.ts | 23 +-
packages/web/src/db/adapters/web-sql-flags.ts | 18 +-
.../SharedWebStreamingSyncImplementation.ts | 51 +-
.../db/sync/WebStreamingSyncImplementation.ts | 12 +-
.../src/worker/db/SharedWASQLiteDB.worker.ts | 69 -
.../web/src/worker/db/WASQLiteDB.worker.ts | 80 +-
.../web/src/worker/db/open-worker-database.ts | 61 +-
packages/web/tests/offline.test.ts | 174 +
packages/web/tests/on_change.test.ts | 60 +
packages/web/tests/stream.test.ts | 80 +-
packages/web/tests/uploads.test.ts | 112 +
.../web/tests/utils/MockStreamOpenFactory.ts | 3 +-
packages/web/webpack.config.js | 62 +
packages/web/webpack.workers.config.js | 52 +
pnpm-lock.yaml | 41746 +++++++---------
tools/diagnostics-app/CHANGELOG.md | 23 +
tools/diagnostics-app/package.json | 4 +-
232 files changed, 28271 insertions(+), 23659 deletions(-)
create mode 100644 .changeset/beige-plums-cover.md
create mode 100644 .changeset/brown-radios-report.md
create mode 100644 demos/react-native-web-supabase-todolist/.env.local.template
create mode 100644 demos/react-native-web-supabase-todolist/.gitignore
create mode 100644 demos/react-native-web-supabase-todolist/CHANGELOG.md
create mode 100644 demos/react-native-web-supabase-todolist/LICENSE
create mode 100644 demos/react-native-web-supabase-todolist/README.md
create mode 100644 demos/react-native-web-supabase-todolist/android/.gitignore
create mode 100644 demos/react-native-web-supabase-todolist/android/app/build.gradle
create mode 100644 demos/react-native-web-supabase-todolist/android/app/debug.keystore
create mode 100644 demos/react-native-web-supabase-todolist/android/app/proguard-rules.pro
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/debug/AndroidManifest.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/AndroidManifest.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainActivity.kt
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainApplication.kt
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-hdpi/splashscreen_image.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-mdpi/splashscreen_image.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable/rn_edit_text_material.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable/splashscreen.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/values-night/colors.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/values/colors.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/values/strings.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/app/src/main/res/values/styles.xml
create mode 100644 demos/react-native-web-supabase-todolist/android/build.gradle
create mode 100644 demos/react-native-web-supabase-todolist/android/gradle.properties
create mode 100644 demos/react-native-web-supabase-todolist/android/gradle/wrapper/gradle-wrapper.jar
create mode 100644 demos/react-native-web-supabase-todolist/android/gradle/wrapper/gradle-wrapper.properties
create mode 100755 demos/react-native-web-supabase-todolist/android/gradlew
create mode 100644 demos/react-native-web-supabase-todolist/android/gradlew.bat
create mode 100644 demos/react-native-web-supabase-todolist/android/settings.gradle
create mode 100644 demos/react-native-web-supabase-todolist/app.config.ts
create mode 100644 demos/react-native-web-supabase-todolist/app/_layout.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/index.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/register.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/signin.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/views/_layout.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/views/console.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/views/signout.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/views/todos/_layout.tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/views/todos/edit/[id].tsx
create mode 100644 demos/react-native-web-supabase-todolist/app/views/todos/lists.tsx
create mode 100644 demos/react-native-web-supabase-todolist/assets/adaptive-icon.png
create mode 100644 demos/react-native-web-supabase-todolist/assets/favicon.png
create mode 100644 demos/react-native-web-supabase-todolist/assets/icon.png
create mode 100644 demos/react-native-web-supabase-todolist/assets/splash.png
create mode 100644 demos/react-native-web-supabase-todolist/babel.config.js
create mode 100644 demos/react-native-web-supabase-todolist/database.sql
create mode 100644 demos/react-native-web-supabase-todolist/eas.json
create mode 100644 demos/react-native-web-supabase-todolist/index.js
create mode 100644 demos/react-native-web-supabase-todolist/ios/.gitignore
create mode 100644 demos/react-native-web-supabase-todolist/ios/.xcode.env
create mode 100644 demos/react-native-web-supabase-todolist/ios/Podfile
create mode 100644 demos/react-native-web-supabase-todolist/ios/Podfile.lock
create mode 100644 demos/react-native-web-supabase-todolist/ios/Podfile.properties.json
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample.xcodeproj/project.pbxproj
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample.xcodeproj/xcshareddata/xcschemes/powersyncexample.xcscheme
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample.xcworkspace/contents.xcworkspacedata
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/AppDelegate.h
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/AppDelegate.mm
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/AppIcon.appiconset/Contents.json
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/Contents.json
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/SplashScreen.imageset/Contents.json
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/SplashScreen.imageset/image.png
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/SplashScreenBackground.imageset/Contents.json
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Images.xcassets/SplashScreenBackground.imageset/image.png
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Info.plist
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/PrivacyInfo.xcprivacy
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/SplashScreen.storyboard
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/Supporting/Expo.plist
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/main.m
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/noop-file.swift
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/powersyncexample-Bridging-Header.h
create mode 100644 demos/react-native-web-supabase-todolist/ios/powersyncexample/powersyncexample.entitlements
create mode 100644 demos/react-native-web-supabase-todolist/library/powersync/AppSchema.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/powersync/PhotoAttachmentQueue.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/powersync/system.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/storage/FileSystem.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/storage/KVStorage.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/storage/SupabaseStorageAdapter.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/supabase/AppConfig.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/supabase/SupabaseConnector.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/utils/alert.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/utils/prompt.ts
create mode 100644 demos/react-native-web-supabase-todolist/library/widgets/CameraWidget.tsx
create mode 100644 demos/react-native-web-supabase-todolist/library/widgets/Drawer.tsx
create mode 100644 demos/react-native-web-supabase-todolist/library/widgets/HeaderWidget.tsx
create mode 100644 demos/react-native-web-supabase-todolist/library/widgets/ListItemWidget.tsx
create mode 100644 demos/react-native-web-supabase-todolist/library/widgets/TextInputWidget.tsx
create mode 100644 demos/react-native-web-supabase-todolist/library/widgets/TodoItemWidget.tsx
create mode 100644 demos/react-native-web-supabase-todolist/metro.config.js
create mode 100644 demos/react-native-web-supabase-todolist/package.json
create mode 100644 demos/react-native-web-supabase-todolist/process-env.d.ts
create mode 100644 demos/react-native-web-supabase-todolist/tsconfig.json
create mode 100644 demos/react-supabase-todolist-optional-sync/.env
create mode 100644 demos/react-supabase-todolist-optional-sync/.gitignore
create mode 100644 demos/react-supabase-todolist-optional-sync/CHANGELOG.md
create mode 100644 demos/react-supabase-todolist-optional-sync/LICENSE
create mode 100644 demos/react-supabase-todolist-optional-sync/README.md
create mode 100644 demos/react-supabase-todolist-optional-sync/docs/local-only-readme-0.png
create mode 100644 demos/react-supabase-todolist-optional-sync/docs/local-only-readme-1.png
create mode 100644 demos/react-supabase-todolist-optional-sync/docs/local-only-readme-2.png
create mode 100644 demos/react-supabase-todolist-optional-sync/docs/local-only-readme-3.png
create mode 100644 demos/react-supabase-todolist-optional-sync/package.json
create mode 100644 demos/react-supabase-todolist-optional-sync/public/favicon.ico
create mode 100644 demos/react-supabase-todolist-optional-sync/public/icons/icon-192x192.png
create mode 100644 demos/react-supabase-todolist-optional-sync/public/icons/icon-256x256.png
create mode 100644 demos/react-supabase-todolist-optional-sync/public/icons/icon-384x384.png
create mode 100644 demos/react-supabase-todolist-optional-sync/public/icons/icon-512x512.png
create mode 100644 demos/react-supabase-todolist-optional-sync/public/icons/icon.png
create mode 100644 demos/react-supabase-todolist-optional-sync/public/powersync-logo.svg
create mode 100644 demos/react-supabase-todolist-optional-sync/public/supabase-logo.png
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/auth/login/page.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/auth/register/page.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/globals.css
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/index.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/page.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/router.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/views/layout.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/views/sql-console/page.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/views/todo-lists/edit/page.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/app/views/todo-lists/page.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/navigation/NavigationPage.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/navigation/NavigationPanelContext.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/providers/SystemProvider.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/providers/ThemeProviderContainer.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/widgets/ListItemWidget.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/widgets/LoginDetailsWidget.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/widgets/TodoItemWidget.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/components/widgets/TodoListsWidget.tsx
create mode 100644 demos/react-supabase-todolist-optional-sync/src/index.html
create mode 100644 demos/react-supabase-todolist-optional-sync/src/library/powersync/AppSchema.ts
create mode 100644 demos/react-supabase-todolist-optional-sync/src/library/powersync/SupabaseConnector.ts
create mode 100644 demos/react-supabase-todolist-optional-sync/src/library/powersync/SyncMode.ts
create mode 100644 demos/react-supabase-todolist-optional-sync/src/library/powersync/vite-env.d.ts
create mode 100644 demos/react-supabase-todolist-optional-sync/tsconfig.json
create mode 100644 demos/react-supabase-todolist-optional-sync/vite.config.mts
create mode 100644 packages/common/src/utils/throttle.ts
create mode 100644 packages/tanstack-react-query/CHANGELOG.md
create mode 100644 packages/tanstack-react-query/LICENSE
create mode 100644 packages/tanstack-react-query/README.md
create mode 100644 packages/tanstack-react-query/package.json
create mode 100644 packages/tanstack-react-query/src/hooks/useQuery.ts
create mode 100644 packages/tanstack-react-query/src/index.ts
create mode 100644 packages/tanstack-react-query/tsconfig.json
create mode 100644 packages/web/deletePlugin.plugin.js
delete mode 100644 packages/web/src/worker/db/SharedWASQLiteDB.worker.ts
create mode 100644 packages/web/tests/offline.test.ts
create mode 100644 packages/web/tests/on_change.test.ts
create mode 100644 packages/web/tests/uploads.test.ts
create mode 100644 packages/web/webpack.config.js
create mode 100644 packages/web/webpack.workers.config.js
diff --git a/.changeset/beige-plums-cover.md b/.changeset/beige-plums-cover.md
new file mode 100644
index 000000000..edb3fceeb
--- /dev/null
+++ b/.changeset/beige-plums-cover.md
@@ -0,0 +1,5 @@
+---
+'@powersync/tanstack-react-query': patch
+---
+
+Initial Alpha version.
diff --git a/.changeset/brown-radios-report.md b/.changeset/brown-radios-report.md
new file mode 100644
index 000000000..a6d0a4d46
--- /dev/null
+++ b/.changeset/brown-radios-report.md
@@ -0,0 +1,5 @@
+---
+'@powersync/common': minor
+---
+
+Deprecated `rawTableNames` field in `SQLWatchOptions`. All tables specified in `tables` will now be watched, including PowerSync tables with prefixes.
diff --git a/.gitignore b/.gitignore
index 001e54b54..f972b2a5d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
node_modules
lib
dist
-tsconfig.tsbuildinfo
+*.tsbuildinfo
.vscode
.DS_STORE
.idea
diff --git a/README.md b/README.md
index 1664664a8..83a1276a2 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
-*[PowerSync](https://www.powersync.com) is a Postgres-SQLite sync engine, which helps developers to create local-first real-time reactive apps that work seamlessly both online and offline.*
+*[PowerSync](https://www.powersync.com) is a sync engine for building local-first apps with instantly-responsive UI/UX and simplified state transfer. Syncs between SQLite on the client-side and Postgres or MongoDB on the server-side (MySQL coming soon).*
# PowerSync JavaScript SDKs
@@ -45,6 +45,7 @@ Demo applications are located in the [`demos/`](./demos/) directory. Also see ou
- [demos/react-native-supabase-todolist](./demos/react-native-supabase-todolist/README.md): A React Native to-do list example app using a Supabase backend.
- [demos/react-native-supabase-group-chat](./demos/react-native-supabase-group-chat/README.md): A React Native group chat example app using a Supabase backend.
+- [demos/react-native-web-supabase-todolist](./demos/react-native-web-supabase-todolist/README.md) A React Native to-do list example app using a Supabase backend that's compatible with React Native for Web.
- [demos/django-react-native-todolist](./demos/django-react-native-todolist/README.md) A React Native to-do list example app using a Django backend.
### Web
diff --git a/demos/react-native-supabase-todolist/README.md b/demos/react-native-supabase-todolist/README.md
index 0fcf75212..209b3112e 100644
--- a/demos/react-native-supabase-todolist/README.md
+++ b/demos/react-native-supabase-todolist/README.md
@@ -5,72 +5,50 @@
Demo app demonstrating use of the [PowerSync SDK for React Native](https://www.npmjs.com/package/@powersync/react-native) together with Supabase.
A step-by-step guide on Supabase<>PowerSync integration is available [here](https://docs.powersync.com/integration-guides/supabase).
+Follow all the steps until, but not including, [Test Everything (Using Our Demo App)](https://docs.powersync.com/integration-guides/supabase-+-powersync#test-everything-using-our-demo-app).
-## Set up Supabase Project
+## Getting Started
-Create a new Supabase project, and paste and run the contents of [database.sql](./database.sql) in the Supabase SQL editor.
+In the repo directory, use [pnpm](https://pnpm.io/installation) to install dependencies:
-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 and storage policies, allowing users to only view and edit their own data.
-4. Create a trigger to populate some sample data when a user registers.
-
-## Set up PowerSync Instance
-
-Create a new PowerSync instance, connecting to the database of the Supabase project (find detailed instructions in the [Supabase<>PowerSync integration guide](https://docs.powersync.com/integration-guides/supabase)).
-
-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 = request.user_id()
- data:
- - select * from lists where id = bucket.list_id
- - select * from todos where list_id = bucket.list_id
+```bash
+pnpm install
+pnpm build:packages
```
-## Configure The App
-
-Replace the necessary credentials in the [.env](./.env) file.
-Generally, the `.env` file is used for storing common environment variables shared across all instances of the application, while `.env.local` is for overriding or providing environment-specific configurations, particularly for local development.
-As `.env.local` is normally not checked into source control (this project has a git-ignore rule), you can copy `.env`, name it `.env.local`, and then configure as needed.
+Then switch into the demo's directory:
-### EAS Build configuration
-
-Take note that you will need an [Expo](https://expo.dev/) account if you want to use EAS for your builds. The Expo project ID should then also be configured in the environment file.
-
-For secret/sensitive environment variables which shouldn't be checked into source control, you can configure them as EAS secrets. They can be added via either the Expo website or the EAS CLI, both are explained [here](https://docs.expo.dev/build-reference/variables/#using-secrets-in-environment-variables).
-
-General information on defining environment variables with Expo can be found here [here](https://docs.expo.dev/build-reference/variables/#can-eas-build-use-env-files).
-
-## Run the App
+```bash
+cd demos/react-native-supabase-todolist
+```
-Install the dependencies, including the React Native SDK:
+Set up the Environment variables: Copy the `.env` file:
-```sh
-pnpm i
+```bash
+cp .env .env.local
```
+And then edit `.env.local` to insert your credentials for Supabase.
+
Run on iOS
```sh
pnpm ios
```
-Run on Android
+Run on Android (see [Set Up Your Environment](https://reactnative.dev/docs/set-up-your-environment?platform=android) to allow you to develop with Android emulators and iOS simulators).
```sh
pnpm android
```
-## Here are some helpful links
+### EAS Build configuration
+
+General information on defining environment variables with Expo can be found here [here](https://docs.expo.dev/build-reference/variables/#can-eas-build-use-env-files).
+
+## Learn More
+
+Check out [the PowerSync SDK for React Native on GitHub](https://github.com/powersync-ja/powersync-js/tree/main/packages/react-native) - your feedback and contributions are welcome!
+
+To learn more about PowerSync, see the [PowerSync docs](https://docs.powersync.com).
-- [PowerSync Website](https://www.powersync.com/)
-- [PowerSync Docs](https://docs.powersync.com/)
-- [PowerSync React Native Client SDK Reference](https://docs.powersync.com/client-sdk-references/react-native-and-expo)
-- [Supabase Docs](https://supabase.com/docs)
-- [Expo Docs](https://docs.expo.dev/)
diff --git a/demos/react-native-supabase-todolist/ios/Podfile.lock b/demos/react-native-supabase-todolist/ios/Podfile.lock
index 819f87090..81b29eeb6 100644
--- a/demos/react-native-supabase-todolist/ios/Podfile.lock
+++ b/demos/react-native-supabase-todolist/ios/Podfile.lock
@@ -74,7 +74,7 @@ PODS:
- hermes-engine (0.74.5):
- hermes-engine/Pre-built (= 0.74.5)
- hermes-engine/Pre-built (0.74.5)
- - powersync-sqlite-core (0.1.6)
+ - powersync-sqlite-core (0.2.1)
- RCT-Folly (2024.01.01.00):
- boost
- DoubleConversion
@@ -1005,11 +1005,30 @@ PODS:
- React-debug
- react-native-encrypted-storage (4.0.3):
- React-Core
- - react-native-quick-sqlite (1.1.8):
- - powersync-sqlite-core (~> 0.1.6)
+ - react-native-quick-sqlite (1.3.1):
+ - DoubleConversion
+ - glog
+ - hermes-engine
+ - powersync-sqlite-core (~> 0.2.1)
+ - RCT-Folly (= 2024.01.01.00)
+ - RCTRequired
+ - RCTTypeSafety
- React
- React-callinvoker
+ - React-Codegen
- React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-rendererdebug
+ - React-utils
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - Yoga
- react-native-safe-area-context (4.10.5):
- React-Core
- React-nativeconfig (0.74.5)
@@ -1590,7 +1609,7 @@ SPEC CHECKSUMS:
fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120
glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f
hermes-engine: 8c1577f3fdb849cbe7729c2e7b5abc4b845e88f8
- powersync-sqlite-core: 4c38c8f470f6dca61346789fd5436a6826d1e3dd
+ powersync-sqlite-core: 38ead13d8b21920cfbc79e9b3415b833574a506d
RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47
RCTDeprecation: 3afceddffa65aee666dafd6f0116f1d975db1584
RCTRequired: ec1239bc9d8bf63e10fb92bd8b26171a9258e0c1
@@ -1616,7 +1635,7 @@ SPEC CHECKSUMS:
React-logger: 257858bd55f3a4e1bc0cf07ddc8fb9faba6f8c7c
React-Mapbuffer: 6c1cacdbf40b531f549eba249e531a7d0bfd8e7f
react-native-encrypted-storage: db300a3f2f0aba1e818417c1c0a6be549038deb7
- react-native-quick-sqlite: 7ad498d81c8506803da2e1c2b64c8cb7758e04cb
+ react-native-quick-sqlite: a6c078a8260d0df2b2c53ca9e33f96b93ca5c414
react-native-safe-area-context: a240ad4b683349e48b1d51fed1611138d1bdad97
React-nativeconfig: ba9a2e54e2f0882cf7882698825052793ed4c851
React-NativeModulesApple: 8d11ff8955181540585c944cf48e9e7236952697
@@ -1647,7 +1666,7 @@ SPEC CHECKSUMS:
RNScreens: b32a9ff15bea7fcdbe5dff6477bc503f792b1208
RNVectorIcons: 2a2f79274248390b80684ea3c4400bd374a15c90
SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
- Yoga: 950bbfd7e6f04790fdb51149ed51df41f329fcc8
+ Yoga: 2246eea72aaf1b816a68a35e6e4b74563653ae09
ZXingObjC: 8898711ab495761b2dbbdec76d90164a6d7e14c5
PODFILE CHECKSUM: bc0290fe498e12305d84bb656e108a3ff9f829ea
diff --git a/demos/react-native-web-supabase-todolist/.env.local.template b/demos/react-native-web-supabase-todolist/.env.local.template
new file mode 100644
index 000000000..f3b143c62
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/.env.local.template
@@ -0,0 +1,6 @@
+# Replace the credentials below with your Supabase, PowerSync and Expo project details.
+EXPO_PUBLIC_SUPABASE_URL=https://foo.supabase.co
+EXPO_PUBLIC_SUPABASE_ANON_KEY=foo
+EXPO_PUBLIC_SUPABASE_BUCKET= # Optional. Only required when syncing attachments and using Supabase Storage. See packages/powersync-attachments.
+EXPO_PUBLIC_POWERSYNC_URL=https://foo.powersync.journeyapps.com
+EXPO_PUBLIC_EAS_PROJECT_ID=foo # Optional. Only required when using EAS.
diff --git a/demos/react-native-web-supabase-todolist/.gitignore b/demos/react-native-web-supabase-todolist/.gitignore
new file mode 100644
index 000000000..a7466d325
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/.gitignore
@@ -0,0 +1,40 @@
+# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
+
+# dependencies
+node_modules/
+
+# Expo
+.expo/
+dist/
+web-build/
+
+# Native
+*.orig.*
+*.jks
+*.p8
+*.p12
+*.key
+*.mobileprovision
+
+# Metrom
+.metro-health-check*
+
+# debug
+npm-debug.*
+
+# macOS
+.DS_Store
+*.pem
+
+# local env files
+.env*.local*
+
+# typescript
+*.tsbuildinfo
+
+# IDE
+.vscode
+.fleet
+.idea
+
+public/@powersync
diff --git a/demos/react-native-web-supabase-todolist/CHANGELOG.md b/demos/react-native-web-supabase-todolist/CHANGELOG.md
new file mode 100644
index 000000000..0e4e6188e
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/CHANGELOG.md
@@ -0,0 +1 @@
+# react-native-web-supabase-todolist
diff --git a/demos/react-native-web-supabase-todolist/LICENSE b/demos/react-native-web-supabase-todolist/LICENSE
new file mode 100644
index 000000000..0e259d42c
--- /dev/null
+++ b/demos/react-native-web-supabase-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/react-native-web-supabase-todolist/README.md b/demos/react-native-web-supabase-todolist/README.md
new file mode 100644
index 000000000..50f7aac32
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/README.md
@@ -0,0 +1,91 @@
+# PowerSync + Supabase Todo List App: React Native for Web Demo
+
+## Overview
+
+This demo app is an extension of the [Supabase Todo List App](../react-native-supabase-todolist/) and demonstrates the use of the PowerSync SDKs for [React Native](https://www.npmjs.com/package/@powersync/react-native) and [Web](https://www.npmjs.com/package/@powersync/web) in a [React Native Web](https://necolas.github.io/react-native-web/) project. This configuration allows developers to use one React Native codebase to target mobile and well as web platforms.
+
+To use PowerSync in your own React Native for Web project, additional config is required. This is detailed in our docs [here](https://docs.powersync.com/client-sdk-references/react-native-and-expo/react-native-web-support).
+
+To run this demo, follow these instructions:
+
+## Running this demo
+
+### Install dependencies
+
+In the repo root, use [pnpm](https://pnpm.io/installation) to install dependencies:
+
+```bash
+pnpm install
+pnpm build:packages
+```
+
+### Set up 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 and 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 and storage policies, allowing users to only view and edit their own data.
+4. Create a trigger to populate some sample data when a user registers.
+
+### Set up PowerSync Instance
+
+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:
+
+```yaml
+bucket_definitions:
+ user_lists:
+ # Separate bucket per todo list
+ 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
+```
+
+### Configure the app
+
+#### 1. Set up environment variables:
+
+Copy the `.env.local.template` file:
+
+```bash
+cp .env.local.template .env.local
+```
+
+Then edit `.env.local` to insert your Supabase and PowerSync project credentials.
+
+#### 2. Configure web workers
+
+This is required for the React Native Web implementation. Learn more in [our docs](https://docs.powersync.com/client-sdk-references/react-native-and-expo/react-native-web-support).
+
+```bash
+mkdir -p public/@powersync && cp -r node_modules/@powersync/web/dist/* public/@powersync/
+```
+
+### Run the app
+
+Run on Web:
+
+```sh
+pnpm web
+```
+
+Web bundling can take a few seconds.
+
+Run on iOS:
+
+```sh
+pnpm ios
+```
+
+Run on Android:
+
+```sh
+pnpm android
+```
\ No newline at end of file
diff --git a/demos/react-native-web-supabase-todolist/android/.gitignore b/demos/react-native-web-supabase-todolist/android/.gitignore
new file mode 100644
index 000000000..8a6be0771
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/android/.gitignore
@@ -0,0 +1,16 @@
+# OSX
+#
+.DS_Store
+
+# Android/IntelliJ
+#
+build/
+.idea
+.gradle
+local.properties
+*.iml
+*.hprof
+.cxx/
+
+# Bundle artifacts
+*.jsbundle
diff --git a/demos/react-native-web-supabase-todolist/android/app/build.gradle b/demos/react-native-web-supabase-todolist/android/app/build.gradle
new file mode 100644
index 000000000..8e7751820
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/android/app/build.gradle
@@ -0,0 +1,173 @@
+apply plugin: "com.android.application"
+apply plugin: "org.jetbrains.kotlin.android"
+apply plugin: "com.facebook.react"
+
+def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
+
+/**
+ * This is the configuration block to customize your React Native Android app.
+ * By default you don't need to apply any configuration, just uncomment the lines you need.
+ */
+react {
+ entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
+ reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
+ hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
+ codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
+
+ // Use Expo CLI to bundle the app, this ensures the Metro config
+ // works correctly with Expo projects.
+ cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim())
+ bundleCommand = "export:embed"
+
+ /* Folders */
+ // The root of your project, i.e. where "package.json" lives. Default is '..'
+ // root = file("../")
+ // The folder where the react-native NPM package is. Default is ../node_modules/react-native
+ // reactNativeDir = file("../node_modules/react-native")
+ // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen
+ // codegenDir = file("../node_modules/@react-native/codegen")
+
+ /* Variants */
+ // The list of variants to that are debuggable. For those we're going to
+ // skip the bundling of the JS bundle and the assets. By default is just 'debug'.
+ // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
+ // debuggableVariants = ["liteDebug", "prodDebug"]
+
+ /* Bundling */
+ // A list containing the node command and its flags. Default is just 'node'.
+ // nodeExecutableAndArgs = ["node"]
+
+ //
+ // The path to the CLI configuration file. Default is empty.
+ // bundleConfig = file(../rn-cli.config.js)
+ //
+ // The name of the generated asset file containing your JS bundle
+ // bundleAssetName = "MyApplication.android.bundle"
+ //
+ // The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
+ // entryFile = file("../js/MyApplication.android.js")
+ //
+ // A list of extra flags to pass to the 'bundle' commands.
+ // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
+ // extraPackagerArgs = []
+
+ /* Hermes Commands */
+ // The hermes compiler command to run. By default it is 'hermesc'
+ // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
+ //
+ // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
+ // hermesFlags = ["-O", "-output-source-map"]
+}
+
+/**
+ * Set this to true to Run Proguard on Release builds to minify the Java bytecode.
+ */
+def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean()
+
+/**
+ * The preferred build flavor of JavaScriptCore (JSC)
+ *
+ * For example, to use the international variant, you can use:
+ * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
+ *
+ * The international variant includes ICU i18n library and necessary data
+ * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
+ * give correct results when using with locales other than en-US. Note that
+ * this variant is about 6MiB larger per architecture than default.
+ */
+def jscFlavor = 'org.webkit:android-jsc:+'
+
+android {
+ ndkVersion rootProject.ext.ndkVersion
+
+ buildToolsVersion rootProject.ext.buildToolsVersion
+ compileSdk rootProject.ext.compileSdkVersion
+
+ namespace 'com.powersync.example'
+ defaultConfig {
+ applicationId 'com.powersync.example'
+ minSdkVersion rootProject.ext.minSdkVersion
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode 1
+ versionName "1.0.0"
+ }
+ signingConfigs {
+ debug {
+ storeFile file('debug.keystore')
+ storePassword 'android'
+ keyAlias 'androiddebugkey'
+ keyPassword 'android'
+ }
+ }
+ buildTypes {
+ debug {
+ signingConfig signingConfigs.debug
+ }
+ release {
+ // Caution! In production, you need to generate your own keystore file.
+ // see https://reactnative.dev/docs/signed-apk-android.
+ signingConfig signingConfigs.debug
+ shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false)
+ minifyEnabled enableProguardInReleaseBuilds
+ proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
+ crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true)
+ }
+ }
+ packagingOptions {
+ jniLibs {
+ useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false)
+ }
+ }
+}
+
+// Apply static values from `gradle.properties` to the `android.packagingOptions`
+// Accepts values in comma delimited lists, example:
+// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini
+["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop ->
+ // Split option: 'foo,bar' -> ['foo', 'bar']
+ def options = (findProperty("android.packagingOptions.$prop") ?: "").split(",");
+ // Trim all elements in place.
+ for (i in 0.. 0) {
+ println "android.packagingOptions.$prop += $options ($options.length)"
+ // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**'
+ options.each {
+ android.packagingOptions[prop] += it
+ }
+ }
+}
+
+dependencies {
+ // The version of react-native is set by the React Native Gradle Plugin
+ implementation("com.facebook.react:react-android")
+
+ def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true";
+ def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true";
+ def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true";
+
+ if (isGifEnabled) {
+ // For animated gif support
+ implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}")
+ }
+
+ if (isWebpEnabled) {
+ // For webp support
+ implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}")
+ if (isWebpAnimatedEnabled) {
+ // Animated webp support
+ implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}")
+ }
+ }
+
+ if (hermesEnabled.toBoolean()) {
+ implementation("com.facebook.react:hermes-android")
+ } else {
+ implementation jscFlavor
+ }
+}
+
+apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle");
+applyNativeModulesAppBuildGradle(project)
diff --git a/demos/react-native-web-supabase-todolist/android/app/debug.keystore b/demos/react-native-web-supabase-todolist/android/app/debug.keystore
new file mode 100644
index 0000000000000000000000000000000000000000..364e105ed39fbfd62001429a68140672b06ec0de
GIT binary patch
literal 2257
zcmchYXEfYt8;7T1^dLH$VOTZ%2NOdOH5j5LYLtZ0q7x-V8_6gU5)#7dkq{HTmsfNq
zB3ZqcAxeY^G10@?efK?Q&)M(qInVv!xjx+IKEL}p*K@LYvIzo#AZG>st5|P)KF1_Z;y){W{<7K{nl!CPuE
z_^(!C(Ol0n8
zK13*rzAtW>(wULKPRYLd7G18F8#1P`V*9`(Poj26eOXYyBVZPno~Cvvhx7vPjAuZo
zF?VD!zB~QG(!zbw#qsxT8%BSpqMZ4f70ZPn-3y$L8{EVbbN9$H`B&Z1quk9tgp5FM
zuxp3pJ0b8u|3+#5bkJ4SRnCF2l7#DyLYXYY8*?OuAwK4E6J{0N=O3QNVzQ$L#FKkR
zi-c@&!nDvezOV$i$Lr}iF$XEcwnybQ6WZrMKuw8gCL^U#D;q3t&HpTbqyD%vG=TeDlzCT~MXUPC|Leb-Uk+
z=vnMd(|>ld?Fh>V8poP;q;;nc@en$|rnP0ytzD&fFkCeUE^kG9Kx4wUh!!rpjwKDP
zyw_e|a^x_w3E
zP}}@$g>*LLJ4i0`Gx)qltL}@;mDv}D*xR^oeWcWdPkW@Uu)B^X&4W1$p6}ze!zudJ
zyiLg@uggoMIArBr*27EZV7djDg@W1MaL+rcZ-lrANJQ%%>u8)ZMWU@R2qtnmG(acP
z0d_^!t>}5W
zpT`*2NR+0+SpTHb+6Js4b;%LJB;B_-ChhnU5py}iJtku*hm5F0!iql8Hrpcy1aYbT
z1*dKC5ua6pMX@@iONI?Hpr%h;&YaXp9n!ND7-=a%BD7v&g
zOO41M6EbE24mJ#S$Ui0-brR5ML%@|ndz^)YLMMV1atna{Fw<;TF@>d&F|!Z>8eg>>hkFrV)W+uv=`^F9^e
zzzM2*oOjT9%gLoub%(R57p-`TXFe#oh1_{&N-YN
z<}artH|m=d8TQuKSWE)Z%puU|g|^^NFwC#N=@dPhasyYjoy(fdEVfKR@cXKHZV-`06HsP`|Ftx;8(YD$fFXumLWbGnu$GMqRncXYY9mwz9$ap
zQtfZB^_BeNYITh^hA7+(XNFox5WMeG_LtJ%*Q}$8VKDI_p8^pqX)}NMb`0e|wgF7D
zuQACY_Ua<1ri{;Jwt@_1sW9zzdgnyh_O#8y+C;LcZq6=4e^cs6KvmK@$vVpKFGbQ=
z$)Eux5C|Fx;Gtmv9^#Y-g@7Rt7*eLp5n!gJmn7&B_L$G?NCN`AP>cXQEz}%F%K;vUs{+l4Q{}eWW;ATe2
zqvXzxoIDy(u;F2q1JH7Sf;{jy_j})F+cKlIOmNfjBGHoG^CN
zM|Ho&&X|L-36f}Q-obEACz`sI%2f&k>z5c$2TyTSj~vmO)BW~+N^kt`Jt@R|s!){H
ze1_eCrlNaPkJQhL$WG&iRvF*YG=gXd1IyYQ9ew|iYn7r~g!wOnw;@n42>enAxBv*A
zEmV*N#sxdicyNM=A4|yaOC5MByts}s_Hpfj|y<6G=o=!3S@eIFKDdpR7|FY>L&Wat&oW&cm&X~
z5Bt>Fcq(fgnvlvLSYg&o6>&fY`ODg4`V^lWWD=%oJ#Kbad2u~!
zLECFS*??>|vDsNR&pH=Ze0Eo`sC_G`OjoEKVHY|wmwlX&(XBE<@sx3Hd^gtd-fNwUHsylg06p`U2y_={u}Bc
+
+
+
+
+
diff --git a/demos/react-native-web-supabase-todolist/android/app/src/main/AndroidManifest.xml b/demos/react-native-web-supabase-todolist/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..a4a30cc63
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainActivity.kt b/demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainActivity.kt
new file mode 100644
index 000000000..45ad9a62e
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainActivity.kt
@@ -0,0 +1,61 @@
+package com.powersync.example
+
+import android.os.Build
+import android.os.Bundle
+
+import com.facebook.react.ReactActivity
+import com.facebook.react.ReactActivityDelegate
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
+import com.facebook.react.defaults.DefaultReactActivityDelegate
+
+import expo.modules.ReactActivityDelegateWrapper
+
+class MainActivity : ReactActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ // Set the theme to AppTheme BEFORE onCreate to support
+ // coloring the background, status bar, and navigation bar.
+ // This is required for expo-splash-screen.
+ setTheme(R.style.AppTheme);
+ super.onCreate(null)
+ }
+
+ /**
+ * Returns the name of the main component registered from JavaScript. This is used to schedule
+ * rendering of the component.
+ */
+ override fun getMainComponentName(): String = "main"
+
+ /**
+ * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
+ * which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
+ */
+ override fun createReactActivityDelegate(): ReactActivityDelegate {
+ return ReactActivityDelegateWrapper(
+ this,
+ BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
+ object : DefaultReactActivityDelegate(
+ this,
+ mainComponentName,
+ fabricEnabled
+ ){})
+ }
+
+ /**
+ * Align the back button behavior with Android S
+ * where moving root activities to background instead of finishing activities.
+ * @see onBackPressed
+ */
+ override fun invokeDefaultOnBackPressed() {
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
+ if (!moveTaskToBack(false)) {
+ // For non-root activities, use the default implementation to finish them.
+ super.invokeDefaultOnBackPressed()
+ }
+ return
+ }
+
+ // Use the default back button implementation on Android S
+ // because it's doing more than [Activity.moveTaskToBack] in fact.
+ super.invokeDefaultOnBackPressed()
+ }
+}
diff --git a/demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainApplication.kt b/demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainApplication.kt
new file mode 100644
index 000000000..c00368d92
--- /dev/null
+++ b/demos/react-native-web-supabase-todolist/android/app/src/main/java/com/powersync/example/MainApplication.kt
@@ -0,0 +1,55 @@
+package com.powersync.example
+
+import android.app.Application
+import android.content.res.Configuration
+
+import com.facebook.react.PackageList
+import com.facebook.react.ReactApplication
+import com.facebook.react.ReactNativeHost
+import com.facebook.react.ReactPackage
+import com.facebook.react.ReactHost
+import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
+import com.facebook.react.defaults.DefaultReactNativeHost
+import com.facebook.soloader.SoLoader
+
+import expo.modules.ApplicationLifecycleDispatcher
+import expo.modules.ReactNativeHostWrapper
+
+class MainApplication : Application(), ReactApplication {
+
+ override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
+ this,
+ object : DefaultReactNativeHost(this) {
+ override fun getPackages(): List {
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // packages.add(new MyReactNativePackage());
+ return PackageList(this).packages
+ }
+
+ override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry"
+
+ override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
+
+ override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
+ override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
+ }
+ )
+
+ override val reactHost: ReactHost
+ get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost)
+
+ override fun onCreate() {
+ super.onCreate()
+ SoLoader.init(this, false)
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
+ // If you opted-in for the New Architecture, we load the native entry point for this app.
+ load()
+ }
+ ApplicationLifecycleDispatcher.onApplicationCreate(this)
+ }
+
+ override fun onConfigurationChanged(newConfig: Configuration) {
+ super.onConfigurationChanged(newConfig)
+ ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig)
+ }
+}
diff --git a/demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-hdpi/splashscreen_image.png b/demos/react-native-web-supabase-todolist/android/app/src/main/res/drawable-hdpi/splashscreen_image.png
new file mode 100644
index 0000000000000000000000000000000000000000..177b8f1f703d7857a822bf030136925277d5c56a
GIT binary patch
literal 83239
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