diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index d1d01717..e7323a2b 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -33,7 +33,7 @@ jobs: - name: Check publish score run: | flutter pub global activate pana - ./.github/workflows/scripts/run-pana.sh + melos analyze:packages:pana --no-select test: runs-on: ubuntu-latest diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..5b61047d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,41 @@ +# This triggers whenever a tagged release is pushed +name: Compile Assets and Create Draft Release + +on: + push: + tags: + # Trigger on tags beginning with 'v' + # Note that `melos version ...` adds the package name as a suffix + # This action is not compatible with tags such as `powersync-v1.1.1` + # marvinpinto/action-automatic-releases struggles to generate changelogs + # Be sure to manually tag the commit to trigger this action + - 'v*' + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Install Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.x' + channel: 'stable' + + - name: Install Melos + run: flutter pub global activate melos + + - name: Install Dependencies and Compile Assets + run: melos prepare + + - name: Create Draft Release + uses: 'marvinpinto/action-automatic-releases@latest' + with: + repo_token: '${{ secrets.GITHUB_TOKEN }}' + prerelease: true # TODO update when out of alpha + draft: true + files: | + assets/powersync_db.worker.js diff --git a/.github/workflows/scripts/run-pana.sh b/.github/workflows/scripts/run-pana.sh deleted file mode 100755 index 85905771..00000000 --- a/.github/workflows/scripts/run-pana.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -e - -# Get the root directory of your project -ROOT_DIR=$(pwd) - -# Specify the path to the packages folder -PACKAGES_DIR="$ROOT_DIR/packages" - -# Iterate over each package folder -for PACKAGE in "$PACKAGES_DIR"/*; do - # Check if it's a directory - if [ -d "$PACKAGE" ]; then - echo "Analyzing package in: $PACKAGE" - - # Change into the package directory - cd "$PACKAGE" || exit - - # Run the pana command - flutter pub global run pana --no-warning --exit-code-threshold 10 - - # Return to the root directory - cd "$ROOT_DIR" || exit - fi -done diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e646bb26 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,33 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## 2024-02-15 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`powersync` - `v1.3.0-alpha.2`](#powersync---v130-alpha2) + - [`powersync_attachments_helper` - `v0.3.0-alpha.2`](#powersync_attachments_helper---v030-alpha2) + +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.3.0-alpha.2` + +--- + +#### `powersync` - `v1.3.0-alpha.2` + + - **FIX**(powersync-attachements-helper): pubspec file (#29). + - **DOCS**: update readme and getting started (#51). + diff --git a/demos/supabase-anonymous-auth/lib/powersync.dart b/demos/supabase-anonymous-auth/lib/powersync.dart index 8bf284cc..0a3730ee 100644 --- a/demos/supabase-anonymous-auth/lib/powersync.dart +++ b/demos/supabase-anonymous-auth/lib/powersync.dart @@ -1,6 +1,5 @@ // This file performs setup of the PowerSync database -import 'dart:io'; - +import 'package:universal_io/io.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:path/path.dart'; @@ -137,8 +136,13 @@ String? getUserId() { } Future getDatabasePath() async { - final dir = kIsWeb ? Directory('/') : await getApplicationSupportDirectory(); - return join(dir.path, 'powersync-demo.db'); + 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 { diff --git a/demos/supabase-anonymous-auth/pubspec.lock b/demos/supabase-anonymous-auth/pubspec.lock index beff5f40..10331e82 100644 --- a/demos/supabase-anonymous-auth/pubspec.lock +++ b/demos/supabase-anonymous-auth/pubspec.lock @@ -540,6 +540,14 @@ packages: 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: diff --git a/demos/supabase-anonymous-auth/pubspec.yaml b/demos/supabase-anonymous-auth/pubspec.yaml index ae250d3b..f1b08e5e 100644 --- a/demos/supabase-anonymous-auth/pubspec.yaml +++ b/demos/supabase-anonymous-auth/pubspec.yaml @@ -11,12 +11,13 @@ dependencies: flutter: sdk: flutter - powersync: ^1.3.0-alpha.1 + powersync: ^1.3.0-alpha.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.2 path: ^1.8.3 logging: ^1.2.0 sqlite_async: ^0.7.0-alpha.1 + universal_io: ^2.2.2 dev_dependencies: flutter_test: diff --git a/demos/supabase-edge-function-auth/lib/powersync.dart b/demos/supabase-edge-function-auth/lib/powersync.dart index 39f5ca83..bc291497 100644 --- a/demos/supabase-edge-function-auth/lib/powersync.dart +++ b/demos/supabase-edge-function-auth/lib/powersync.dart @@ -1,6 +1,5 @@ // This file performs setup of the PowerSync database -import 'dart:io'; - +import 'package:universal_io/io.dart'; import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:path/path.dart'; @@ -140,8 +139,13 @@ String? getUserId() { } Future getDatabasePath() async { - final dir = kIsWeb ? Directory('/') : await getApplicationSupportDirectory(); - return join(dir.path, 'powersync-demo.db'); + 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 { diff --git a/demos/supabase-edge-function-auth/pubspec.lock b/demos/supabase-edge-function-auth/pubspec.lock index beff5f40..10331e82 100644 --- a/demos/supabase-edge-function-auth/pubspec.lock +++ b/demos/supabase-edge-function-auth/pubspec.lock @@ -540,6 +540,14 @@ packages: 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: diff --git a/demos/supabase-edge-function-auth/pubspec.yaml b/demos/supabase-edge-function-auth/pubspec.yaml index 27025645..054d490c 100644 --- a/demos/supabase-edge-function-auth/pubspec.yaml +++ b/demos/supabase-edge-function-auth/pubspec.yaml @@ -11,12 +11,13 @@ dependencies: flutter: sdk: flutter - powersync: ^1.3.0-alpha.1 + powersync: ^1.3.0-alpha.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.2 path: ^1.8.3 logging: ^1.2.0 sqlite_async: ^0.7.0-alpha.1 + universal_io: ^2.2.2 dev_dependencies: flutter_test: diff --git a/demos/supabase-simple-chat/lib/powersync.dart b/demos/supabase-simple-chat/lib/powersync.dart index 6c4770ae..e28a3270 100644 --- a/demos/supabase-simple-chat/lib/powersync.dart +++ b/demos/supabase-simple-chat/lib/powersync.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/foundation.dart'; import 'package:powersync/powersync.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; @@ -27,8 +25,13 @@ final List fatalResponseCodes = [ late final PowerSyncDatabase db; Future getDatabasePath() async { - final dir = kIsWeb ? Directory('/') : await getApplicationSupportDirectory(); - return join(dir.path, 'powersync-demo.db'); + const dbFilename = 'powersync-demo.db'; + // getApplicationSupportDirectory is not supported on Web + if (kIsWeb) { + return dbFilename; + } + final dir = await getApplicationSupportDirectory(); + return join(dir.path, dbFilename); } bool isLoggedIn() { diff --git a/demos/supabase-simple-chat/pubspec.lock b/demos/supabase-simple-chat/pubspec.lock index e35048f5..62fe7ea5 100644 --- a/demos/supabase-simple-chat/pubspec.lock +++ b/demos/supabase-simple-chat/pubspec.lock @@ -604,6 +604,14 @@ packages: 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: diff --git a/demos/supabase-simple-chat/pubspec.yaml b/demos/supabase-simple-chat/pubspec.yaml index 1ec83e1d..e7a3630d 100644 --- a/demos/supabase-simple-chat/pubspec.yaml +++ b/demos/supabase-simple-chat/pubspec.yaml @@ -37,10 +37,11 @@ dependencies: supabase_flutter: ^1.10.25 timeago: ^3.6.0 - powersync: ^1.3.0-alpha.1 + powersync: ^1.3.0-alpha.2 path_provider: ^2.1.1 path: ^1.8.3 logging: ^1.2.0 + universal_io: ^2.2.2 dev_dependencies: flutter_test: diff --git a/demos/supabase-todolist/lib/powersync.dart b/demos/supabase-todolist/lib/powersync.dart index 0c5f79dd..10c5966a 100644 --- a/demos/supabase-todolist/lib/powersync.dart +++ b/demos/supabase-todolist/lib/powersync.dart @@ -1,6 +1,4 @@ // This file performs setup of the PowerSync database -import 'dart:io'; - import 'package:flutter/foundation.dart'; import 'package:logging/logging.dart'; import 'package:path/path.dart'; @@ -148,8 +146,13 @@ String? getUserId() { } Future getDatabasePath() async { - final dir = kIsWeb ? Directory('/') : await getApplicationSupportDirectory(); - return join(dir.path, 'powersync-demo.db'); + 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 { diff --git a/demos/supabase-todolist/pubspec.lock b/demos/supabase-todolist/pubspec.lock index 9f83e15f..d9ea70c7 100644 --- a/demos/supabase-todolist/pubspec.lock +++ b/demos/supabase-todolist/pubspec.lock @@ -643,6 +643,14 @@ packages: 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: diff --git a/demos/supabase-todolist/pubspec.yaml b/demos/supabase-todolist/pubspec.yaml index cfda6024..1f538378 100644 --- a/demos/supabase-todolist/pubspec.yaml +++ b/demos/supabase-todolist/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: sdk: flutter powersync_attachments_helper: ^0.3.0-alpha.1 - powersync: ^1.3.0-alpha.1 + powersync: ^1.3.0-alpha.2 path_provider: ^2.1.1 supabase_flutter: ^2.0.1 path: ^1.8.3 @@ -20,6 +20,7 @@ dependencies: sqlite_async: ^0.7.0-alpha.1 camera: ^0.10.5+7 image: ^4.1.3 + universal_io: ^2.2.2 dev_dependencies: flutter_test: diff --git a/melos.yaml b/melos.yaml index 0ecc1bfa..2ca07d1b 100644 --- a/melos.yaml +++ b/melos.yaml @@ -11,25 +11,19 @@ ide: scripts: prepare: melos bootstrap && melos compile:webworker && melos update:wasm - format: - description: Format Dart code. - run: dart format . - - format:check:packages: - description: Check formatting of Dart code in packages. - run: dart format --output none --set-exit-if-changed packages - - format:check:demos: - description: Check formatting of Dart code in demos. - run: dart format --output none --set-exit-if-changed demos + analyze:demos: + description: Analyze Dart code in demos. + run: dart analyze demos --fatal-infos analyze:packages: description: Analyze Dart code in packages. run: dart analyze packages --fatal-infos - analyze:demos: - description: Analyze Dart code in demos. - run: dart analyze demos --fatal-infos + analyze:packages:pana: + description: Analyze Dart packages with Pana + exec: flutter pub global run pana --no-warning --exit-code-threshold 10 + packageFilters: + noPrivate: true compile:webworker: description: Compile Javascript web worker distributable @@ -38,7 +32,17 @@ scripts: scope: - powersync_web_worker - update:wasm: sh scripts/init_sqlite_wasm.sh + format: + description: Format Dart code. + run: dart format . + + format:check:demos: + description: Check formatting of Dart code in demos. + run: dart format --output none --set-exit-if-changed demos + + format:check:packages: + description: Check formatting of Dart code in packages. + run: dart format --output none --set-exit-if-changed packages test: description: Run tests in a specific package. @@ -52,3 +56,5 @@ scripts: # as they could change the behaviour of how tests filter packages. env: MELOS_TEST: true + + update:wasm: dart run scripts/init_sqlite_wasm.dart diff --git a/packages/powersync/CHANGELOG.md b/packages/powersync/CHANGELOG.md index 32ea38a2..4f75fe5a 100644 --- a/packages/powersync/CHANGELOG.md +++ b/packages/powersync/CHANGELOG.md @@ -1,6 +1,14 @@ +## 1.3.0-alpha.2 + + - **FIX**(powersync-attachements-helper): pubspec file (#29). + - **DOCS**: update readme and getting started (#51). + ## 1.3.0-alpha.1 - Added initial support for Web platform. +## 1.2.2 + +- Deprecate DevConnector and related ## 1.2.1 diff --git a/packages/powersync/README.md b/packages/powersync/README.md index 3683b823..15955272 100644 --- a/packages/powersync/README.md +++ b/packages/powersync/README.md @@ -1,6 +1,77 @@ # PowerSync SDK for Dart/Flutter -[PowerSync](https://powersync.co) is a service and set of SDKs that keeps PostgreSQL databases in sync with on-device SQLite databases. +[PowerSync](https://powersync.com) is a service and set of SDKs that keeps PostgreSQL databases in sync with on-device SQLite databases. + +## *** Web support - Open alpha *** + +Web support is currently in an alpha release. This Readme has been updated to reflect updates that are currently only relevant to this alpha release. + +### Demo app + +The easiest way to test out the alpha is to run the [Supabase Todo-List](./demos/supabase-todolist) demo app: + +1. Checkout [this repo's](https://github.com/powersync-ja/powersync.dart/tree/alpha-release) `alpha_release` branch. + * Note: If you are an existing user updating to the latest code after a git pull, run `melos exec 'flutter pub upgrade'` in the repo's root and make sure it succeeds. +2. Run `melos prepare` in the repo's root +3. cd into the `demos/supabase-todolist` folder +4. If you haven’t yet: `cp lib/app_config_template.dart lib/app_config.dart` (optionally update this config with your own Supabase and PowerSync project details). +5. Run `flutter run -d chrome` + +### Installing PowerSync in your own project + +Install the latest alpha version of the package, for example: + +``` +flutter pub add powersync:'^1.3.0-alpha.1' +``` + +The latest prerelease version can be found [here](https://pub.dev/packages/powersync/versions). + +### Additional config +Web support requires `sqlite3.wasm` and `powersync_db.worker.js` assets to be served from the web application. This is typically achieved by placing the files in the project `web` directory. + +- `sqlite3.wasm` can be found [here](https://github.com/simolus3/sqlite3.dart/releases) +- `powersync_db.worker.js` can be found in the repo's [releases](https://github.com/powersync-ja/powersync.dart/releases) page. + +Currently the Drift SQLite library is used under the hood for DB connections. See [here](https://drift.simonbinder.eu/web/#getting-started) for detailed compatibility +and setup notes. + +The same code is used for initializing native and web `PowerSyncDatabase` clients. + +### Getting started +Follow the [Getting Started](#getting-started) steps further down in this Readme to implement a backend connector and initialize the PowerSync database in your app, and hook PowerSync up with your app's UI. + +### Limitations + +The API for web is essentially the same as for native platforms. Some features within `PowerSyncDatabase` clients are not available. + +Multiple tab support is not yet available. Using multiple tabs will break. + +#### Imports + +Flutter Web does not support importing directly from `sqlite3.dart` as it uses `dart:ffi`. + +Change imports from + +```Dart +import 'package/powersync/sqlite3.dart` +``` + +to + +```Dart +import 'package/powersync/sqlite3_common.dart' +``` + +In code which needs to run on the Web platform. Isolated native specific code can still import from `sqlite3.dart`. + +#### Database connections + +Web DB connections do not support concurrency. A single DB connection is used. `readLock` and `writeLock` contexts do not +implement checks for preventing writable queries in read connections and vice-versa. + +Direct access to the synchronous `CommonDatabase` (`sqlite.Database` equivalent for web) connection is not available. `computeWithDatabase` is not available on web. + ## SDK Features @@ -11,18 +82,29 @@ - No need for client-side database migrations - these are handled automatically. - Subscribe to queries for live updates. -## Examples -For complete app examples, see our [example app gallery](https://docs.powersync.com/resources/demo-apps-example-projects#flutter) +## Examples + +For complete app examples, see our [example app gallery](https://docs.powersync.com/resources/demo-apps-example-projects#flutter). + + +For examples of some common patterns, see our [example snippets](./example/README.md). -For examples of some common patterns, see our [example snippets](./example/README.md) ## Getting started You'll need to create a PowerSync account and set up a PowerSync instance. You can do this at [https://www.powersync.com/](https://www.powersync.com/). ### Install the package +To test web support, install the latest alpha version of the SDK, for example: + +``` +flutter pub add powersync:'^1.3.0-alpha.1' +``` +The latest prerelease version can be found [here](https://pub.dev/packages/powersync/versions). + +If you want to install the latest stable version of the SDK, run: `flutter pub add powersync` ### Implement a backend connector and initialize the PowerSync database @@ -31,6 +113,7 @@ You'll need to create a PowerSync account and set up a PowerSync instance. You c import 'package:powersync/powersync.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart'; +import 'package:flutter/foundation.dart'; // Define the schema for the local SQLite database. // You can automatically generate this schema based on your sync rules: @@ -60,8 +143,13 @@ class MyBackendConnector extends PowerSyncBackendConnector { } openDatabase() async { - final dir = await getApplicationSupportDirectory(); - final path = join(dir.path, 'powersync-dart.db'); + var path = 'powersync-demo.db'; + // getApplicationSupportDirectory is not supported on Web + if (!kIsWeb) { + final dir = await getApplicationSupportDirectory(); + path = join(dir.path, 'powersync-dart.db'); + } + // Setup the database. db = PowerSyncDatabase(schema: schema, path: path); @@ -149,52 +237,4 @@ Logger.root.onRecord.listen((record) { }); ``` -## Web support - -Web support is currently in an alpha release. - -### Setup - -Web support requires `sqlite3.wasm` and `powersync_db.worker.js` assets to be served from the web application. This is typically achieved by placing the files in the project `web` directory. - -These assets are automatically configured in this monorepo when running `melos prepare`. - -- `sqlite3.wasm` can be found [here](https://github.com/simolus3/sqlite3.dart/releases) -- `powersync_db.worker.js` will eventually be released in the repo's releases. - - In the interim the asset can be retrieved from the `./assets` folder after executing `melos prepare` - -Currently the Drift SQLite library is used under the hood for DB connections. See [here](https://drift.simonbinder.eu/web/#getting-started) for detailed compatibility -and setup notes. - -The same code is used for initializing native and web `PowerSyncDatabase` clients. - -### Limitations - -The API for web is essentially the same as for native platforms. Some features within `PowerSyncDatabase` clients are not available. - -#### Imports - -Flutter Web does not support importing directly from `sqlite3.dart` as it uses `dart:ffi`. - -Change imports from - -```Dart -import 'package/powersync/sqlite3.dart` -``` - -to - -```Dart -import 'package/powersync/sqlite3_common.dart' -``` - -In code which needs to run on the Web platform. Isolated native specific code can still import from `sqlite3.dart`. - -#### Database connections -Web DB connections do not support concurrency. A single DB connection is used. `readLock` and `writeLock` contexts do not -implement checks for preventing writable queries in read connections and vice-versa. - -Direct access to the synchronous `CommonDatabase` (`sqlite.Database` equivalent for web) connection is not available. `computeWithDatabase` is not available on web. - -Multiple tab support is not yet available. Using multiple tabs will break. diff --git a/packages/powersync/example/getting_started.dart b/packages/powersync/example/getting_started.dart index 94b6ca34..348b3021 100644 --- a/packages/powersync/example/getting_started.dart +++ b/packages/powersync/example/getting_started.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/foundation.dart'; import 'package:powersync/powersync.dart'; import 'package:path_provider/path_provider.dart'; @@ -28,8 +26,13 @@ class BackendConnector extends PowerSyncBackendConnector { } openDatabase() async { - final dir = kIsWeb ? Directory('/') : await getApplicationSupportDirectory(); - final path = join(dir.path, 'powersync-dart.db'); + var path = 'powersync-demo.db'; + // getApplicationSupportDirectory is not supported on Web + if (!kIsWeb) { + final dir = await getApplicationSupportDirectory(); + path = join(dir.path, 'powersync-dart.db'); + } + // Setup the database. db = PowerSyncDatabase(schema: schema, path: path); await db.initialize(); diff --git a/packages/powersync/lib/src/connector.dart b/packages/powersync/lib/src/connector.dart index 07617861..f8d58460 100644 --- a/packages/powersync/lib/src/connector.dart +++ b/packages/powersync/lib/src/connector.dart @@ -8,9 +8,6 @@ import 'database/powersync_database.dart'; /// 1. Creating credentials for connecting to the PowerSync service. /// 2. Applying local changes against the backend application server. /// -/// [DevConnector] is provided as a quick starting point, without user management -/// or significant security. -/// /// For production, use a custom implementation. abstract class PowerSyncBackendConnector { PowerSyncCredentials? _cachedCredentials; @@ -64,7 +61,7 @@ abstract class PowerSyncBackendConnector { /// Upload local changes to the app backend. /// - /// Use [PowerSyncDatabase.getCrudBatch] to get a batch of changes to upload. See [DevConnector] for an example implementation. + /// Use [PowerSyncDatabase.getCrudBatch] to get a batch of changes to upload. /// /// Any thrown errors will result in a retry after the configured wait period (default: 5 seconds). Future uploadData(PowerSyncDatabase database); @@ -150,6 +147,7 @@ class PowerSyncCredentials { /// /// These cannot be used for the main PowerSync APIs. [DevConnector] uses these /// credentials to automatically fetch [PowerSyncCredentials]. +@Deprecated('We will be removing this in version 2.') class DevCredentials { /// Dev endpoint. String endpoint; @@ -198,6 +196,7 @@ class DevCredentials { /// /// Development mode is intended to get up and running quickly, but is not for /// production use. For production, write a custom connector. +@Deprecated('We will be removing this in version 2.') class DevConnector extends PowerSyncBackendConnector { DevCredentials? _inMemoryDevCredentials; 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 531e2dcc..5462a767 100644 --- a/packages/powersync/lib/src/database/native/native_powersync_database.dart +++ b/packages/powersync/lib/src/database/native/native_powersync_database.dart @@ -73,7 +73,7 @@ class PowerSyncDatabaseImpl required String path, int maxReaders = SqliteDatabase.defaultMaxReaders, Logger? logger, - @Deprecated("Use [PowerSyncDatabase.withFactory] instead") + @Deprecated("Use [PowerSyncDatabase.withFactory] instead.") // ignore: deprecated_member_use_from_same_package SqliteConnectionSetup? sqliteSetup}) { // ignore: deprecated_member_use_from_same_package diff --git a/packages/powersync/lib/src/database/powersync_database.dart b/packages/powersync/lib/src/database/powersync_database.dart index 52b4976c..abc68e34 100644 --- a/packages/powersync/lib/src/database/powersync_database.dart +++ b/packages/powersync/lib/src/database/powersync_database.dart @@ -1,6 +1,7 @@ import 'package:logging/logging.dart'; import 'package:powersync/src/database/powersync_database_impl.dart'; import 'package:powersync/src/database/powersync_db_mixin.dart'; +import 'package:powersync/src/open_factory/abstract_powersync_open_factory.dart'; import 'package:sqlite_async/sqlite_async.dart'; import '../schema.dart'; @@ -32,8 +33,18 @@ abstract class PowerSyncDatabase /// /// [logger] defaults to [autoLogger], which logs to the console in debug builds. factory PowerSyncDatabase( - {required Schema schema, required String path, Logger? logger}) { - return PowerSyncDatabaseImpl(schema: schema, path: path, logger: logger); + {required Schema schema, + required String path, + Logger? logger, + @Deprecated("Use [PowerSyncDatabase.withFactory] instead.") + // ignore: deprecated_member_use_from_same_package + SqliteConnectionSetup? sqliteSetup}) { + return PowerSyncDatabaseImpl( + schema: schema, + path: path, + logger: logger, + // ignore: deprecated_member_use_from_same_package + sqliteSetup: sqliteSetup); } /// Open a [PowerSyncDatabase] with a [PowerSyncOpenFactory]. 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 13906171..5c190eac 100644 --- a/packages/powersync/lib/src/database/powersync_database_impl_stub.dart +++ b/packages/powersync/lib/src/database/powersync_database_impl_stub.dart @@ -48,7 +48,7 @@ class PowerSyncDatabaseImpl required String path, int maxReaders = SqliteDatabase.defaultMaxReaders, Logger? logger, - @Deprecated("Use [PowerSyncDatabase.withFactory] instead") + @Deprecated("Use [PowerSyncDatabase.withFactory] instead.") // ignore: deprecated_member_use_from_same_package SqliteConnectionSetup? sqliteSetup}) { 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 4e3844a2..f6227b9a 100644 --- a/packages/powersync/lib/src/database/web/web_powersync_database.dart +++ b/packages/powersync/lib/src/database/web/web_powersync_database.dart @@ -70,7 +70,7 @@ class PowerSyncDatabaseImpl required String path, int maxReaders = SqliteDatabase.defaultMaxReaders, Logger? logger, - @Deprecated("Use [PowerSyncDatabase.withFactory] instead") + @Deprecated("Use [PowerSyncDatabase.withFactory] instead.") // ignore: deprecated_member_use_from_same_package SqliteConnectionSetup? sqliteSetup}) { // ignore: deprecated_member_use_from_same_package diff --git a/packages/powersync/lib/src/open_factory/abstract_powersync_open_factory.dart b/packages/powersync/lib/src/open_factory/abstract_powersync_open_factory.dart index 3c93c749..664d73e1 100644 --- a/packages/powersync/lib/src/open_factory/abstract_powersync_open_factory.dart +++ b/packages/powersync/lib/src/open_factory/abstract_powersync_open_factory.dart @@ -68,7 +68,7 @@ abstract class AbstractPowerSyncOpenFactory extends DefaultSqliteOpenFactory { } /// Advanced: Define custom setup for each SQLite connection. -@Deprecated('Use SqliteOpenFactory instead') +@Deprecated('Use SqliteOpenFactory instead.') class SqliteConnectionSetup { final FutureOr Function() _setup; diff --git a/packages/powersync/lib/src/open_factory/native/native_open_factory.dart b/packages/powersync/lib/src/open_factory/native/native_open_factory.dart index 29d156c5..949d578d 100644 --- a/packages/powersync/lib/src/open_factory/native/native_open_factory.dart +++ b/packages/powersync/lib/src/open_factory/native/native_open_factory.dart @@ -9,13 +9,13 @@ import '../../uuid.dart'; /// Native implementation for [AbstractPowerSyncOpenFactory] class PowerSyncOpenFactory extends AbstractPowerSyncOpenFactory { - @Deprecated('Override PowerSyncOpenFactory instead') + @Deprecated('Override PowerSyncOpenFactory instead.') final SqliteConnectionSetup? _sqliteSetup; PowerSyncOpenFactory( {required super.path, super.sqliteOptions, - @Deprecated('Override PowerSyncOpenFactory instead') + @Deprecated('Override PowerSyncOpenFactory instead.') SqliteConnectionSetup? sqliteSetup}) // ignore: deprecated_member_use_from_same_package : _sqliteSetup = sqliteSetup; diff --git a/packages/powersync/lib/src/open_factory/open_factory_stub.dart b/packages/powersync/lib/src/open_factory/open_factory_stub.dart index 3c588925..aa571b0f 100644 --- a/packages/powersync/lib/src/open_factory/open_factory_stub.dart +++ b/packages/powersync/lib/src/open_factory/open_factory_stub.dart @@ -5,7 +5,7 @@ class PowerSyncOpenFactory extends open_factory.AbstractPowerSyncOpenFactory { PowerSyncOpenFactory( {required super.path, super.sqliteOptions, - @Deprecated('Override PowerSyncOpenFactory instead') + @Deprecated('Override PowerSyncOpenFactory instead.') // ignore: deprecated_member_use_from_same_package open_factory.SqliteConnectionSetup? sqliteSetup}); diff --git a/packages/powersync/pubspec.yaml b/packages/powersync/pubspec.yaml index 6ac5498f..bc707dbb 100644 --- a/packages/powersync/pubspec.yaml +++ b/packages/powersync/pubspec.yaml @@ -1,5 +1,5 @@ name: powersync -version: 1.3.0-alpha.1 +version: 1.3.0-alpha.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/lib/src/syncing_service.dart b/packages/powersync_attachments_helper/lib/src/syncing_service.dart index 5d24e3de..595b4643 100644 --- a/packages/powersync_attachments_helper/lib/src/syncing_service.dart +++ b/packages/powersync_attachments_helper/lib/src/syncing_service.dart @@ -63,7 +63,7 @@ class SyncingService { await attachmentsService.deleteAttachment(attachment.id); return; } catch (e) { - log.severe('Download attachment error for attachment $attachment}', e); + log.severe('Download attachment error for attachment $attachment', e); return; } } diff --git a/packages/powersync_attachments_helper/pubspec.yaml b/packages/powersync_attachments_helper/pubspec.yaml index 27ec8d8d..0df84e18 100644 --- a/packages/powersync_attachments_helper/pubspec.yaml +++ b/packages/powersync_attachments_helper/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: flutter: sdk: flutter - powersync: ^1.3.0-alpha.1 + powersync: ^1.3.0-alpha.2 logging: ^1.2.0 sqlite3: ^2.3.0 sqlite_async: ^0.7.0-alpha.1 diff --git a/packages/powersync_web_worker/bin/compile_webworker.dart b/packages/powersync_web_worker/bin/compile_webworker.dart index 217b1898..5f6f11b1 100644 --- a/packages/powersync_web_worker/bin/compile_webworker.dart +++ b/packages/powersync_web_worker/bin/compile_webworker.dart @@ -21,7 +21,7 @@ Future main() async { 'js', '-o', outputPath, - '-O0', + '-O4', workerSourcePath, ], workingDirectory: cwd); diff --git a/scripts/init_sqlite_wasm.dart b/scripts/init_sqlite_wasm.dart new file mode 100644 index 00000000..8ccbc4d8 --- /dev/null +++ b/scripts/init_sqlite_wasm.dart @@ -0,0 +1,44 @@ +/// Downloads sqlite3.wasm and copies it to all demo folders +import 'dart:io'; + +final sqliteUrl = + 'https://github.com/simolus3/sqlite3.dart/releases/download/sqlite3-2.3.0/sqlite3.wasm'; + +void main() async { + // Create assets directory if it doesn't exist + final assetsDir = Directory('assets'); + if (!await assetsDir.exists()) { + await assetsDir.create(); + } + + final sqliteFilename = 'sqlite3.wasm'; + final sqlitePath = 'assets/$sqliteFilename'; + + // Download sqlite3.wasm + await downloadFile(sqliteUrl, sqlitePath); + + await for (var entity in Directory('demos').list()) { + if (entity is Directory) { + var demoDir = entity; + var webDir = Directory('${demoDir.path}/web'); + if (await webDir.exists()) { + await File(sqlitePath).copy('${webDir.path}/$sqliteFilename'); + print('Copied $sqlitePath to ${webDir.path}'); + } + } + } +} + +Future downloadFile(String url, String savePath) async { + print('Downloading: $url'); + var httpClient = HttpClient(); + var request = await httpClient.getUrl(Uri.parse(url)); + var response = await request.close(); + if (response.statusCode == HttpStatus.ok) { + var file = File(savePath); + await response.pipe(file.openWrite()); + } else { + print( + 'Failed to download file: ${response.statusCode} ${response.reasonPhrase}'); + } +} diff --git a/scripts/init_sqlite_wasm.sh b/scripts/init_sqlite_wasm.sh deleted file mode 100644 index e1c972bd..00000000 --- a/scripts/init_sqlite_wasm.sh +++ /dev/null @@ -1,24 +0,0 @@ -# sqlite3.wasm needs to be in the root assets folder -# and inside each Flutter app's web folder - -mkdir -p assets - -sqlite_filename="sqlite3.wasm" -sqlite_path="assets/$sqlite_filename" - -curl -LJ https://github.com/simolus3/sqlite3.dart/releases/download/sqlite3-2.3.0/sqlite3.wasm \ --o $sqlite_path - -# Copy to each demo's web dir - -# Destination directory pattern -destination_pattern="demos/*/web/" - -# Iterate over directories matching the pattern -for dir in $destination_pattern; do - if [ -d "$dir" ]; then - # If the directory exists, copy the file - cp "$sqlite_path" "$dir/$sqlite_filename" - echo "Copied $sqlite_path to $dir" - fi -done \ No newline at end of file