@@ -54,55 +54,83 @@ Future<void> downloadWebAssets(List<String> arguments,
5454
5555 try {
5656 final httpClient = HttpClient ();
57+ const sqlitePackageName = 'sqlite3' ;
5758
58- final powersyncPackageName = 'powersync' ;
59+ final (tag: powersyncTag, version: powerSyncVersion) =
60+ await powerSyncVersionOrLatest (
61+ httpClient, packageConfig, packageConfigFile);
62+ final firstPowerSyncVersionWithOwnWasm = Version (1 , 12 , 0 );
5963
6064 if (downloadWorker) {
61- final powersyncPkg =
62- getPackageFromConfig (packageConfig, powersyncPackageName);
63-
64- final powersyncVersion = getPubspecVersion (
65- packageConfigFile, powersyncPkg, powersyncPackageName);
66-
6765 final workerUrl =
68- 'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-v$powersyncVersion /powersync_db.worker.js' ;
69-
66+ 'https://github.com/powersync-ja/powersync.dart/releases/download/$powersyncTag /powersync_db.worker.js' ;
7067 final syncWorkerUrl =
71- 'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-v$ powersyncVersion /powersync_sync.worker.js' ;
68+ 'https://github.com/powersync-ja/powersync.dart/releases/download/$ powersyncTag /powersync_sync.worker.js' ;
7269
7370 await downloadFile (httpClient, workerUrl, workerPath);
7471 await downloadFile (httpClient, syncWorkerUrl, syncWorkerPath);
7572 }
7673
77- final sqlitePackageName = 'sqlite3' ;
74+ if (powerSyncVersion >= firstPowerSyncVersionWithOwnWasm) {
75+ final wasmUrl =
76+ 'https://github.com/powersync-ja/powersync.dart/releases/download/powersync-$powersyncTag /$wasmFileName ' ;
7877
79- final sqlite3Pkg = getPackageFromConfig (packageConfig, sqlitePackageName);
80-
81- String sqlite3Version =
82- "v${getPubspecVersion (packageConfigFile , sqlite3Pkg , sqlitePackageName )}" ;
83-
84- List <String > tags = await getLatestTagsFromRelease (httpClient);
85- String ? matchTag = tags.firstWhereOrNull ((element) =>
86- element.contains (sqlite3Version) && coreVersionIsInRange (element));
87- if (matchTag != null ) {
88- sqlite3Version = matchTag;
78+ await downloadFile (httpClient, wasmUrl, wasmPath);
8979 } else {
90- throw Exception (
91- """No compatible powersync core version found for sqlite3 version $sqlite3Version
80+ final sqlite3Pkg = getPackageFromConfig (packageConfig, sqlitePackageName);
81+
82+ String sqlite3Version =
83+ "v${getPubspecVersion (packageConfigFile , sqlite3Pkg , sqlitePackageName )}" ;
84+
85+ List <String > tags = await getLatestTagsFromRelease (httpClient);
86+ String ? matchTag = tags.firstWhereOrNull ((element) =>
87+ element.contains (sqlite3Version) && coreVersionIsInRange (element));
88+ if (matchTag != null ) {
89+ sqlite3Version = matchTag;
90+ } else {
91+ throw Exception (
92+ """No compatible powersync core version found for sqlite3 version $sqlite3Version
9293 Latest supported sqlite3 versions: ${tags .take (3 ).map ((tag ) => tag .split ('-' )[0 ]).join (', ' )}.
9394 You can view the full list of releases at https://github.com/powersync-ja/sqlite3.dart/releases""" );
94- }
95+ }
9596
96- final sqliteUrl =
97- 'https://github.com/powersync-ja/sqlite3.dart/releases/download/$sqlite3Version /$wasmFileName ' ;
97+ final sqliteUrl =
98+ 'https://github.com/powersync-ja/sqlite3.dart/releases/download/$sqlite3Version /$wasmFileName ' ;
9899
99- await downloadFile (httpClient, sqliteUrl, wasmPath);
100+ await downloadFile (httpClient, sqliteUrl, wasmPath);
101+ }
100102 } catch (e) {
101103 print (e);
102104 exit (1 );
103105 }
104106}
105107
108+ Future <({String tag, Version version})> powerSyncVersionOrLatest (
109+ HttpClient client, dynamic packageConfig, File packageConfigFile) async {
110+ const powersyncPackageName = 'powersync' ;
111+ // Don't require powersync dependency. The user has one if running this script
112+ // and we also want to support powersync_sqlcipher (for which we download
113+ // the latest versions).
114+ final powersyncPkg = getPackageFromConfig (packageConfig, powersyncPackageName,
115+ required : false );
116+ if (powersyncPkg == null ) {
117+ final [tag, ...] =
118+ await getLatestTagsFromRelease (client, repo: 'powersync.dart' );
119+
120+ return (
121+ tag: tag,
122+ version: Version .parse (tag.substring ('powersync-v' .length))
123+ );
124+ }
125+
126+ final powersyncVersion =
127+ getPubspecVersion (packageConfigFile, powersyncPkg, powersyncPackageName);
128+ return (
129+ tag: 'powersync-v$powersyncVersion ' ,
130+ version: Version .parse (powersyncVersion),
131+ );
132+ }
133+
106134bool coreVersionIsInRange (String tag) {
107135 // Sets the range of powersync core version that is compatible with the sqlite3 version
108136 // We're a little more selective in the versions chosen here than the range
@@ -121,12 +149,13 @@ bool coreVersionIsInRange(String tag) {
121149 return false ;
122150}
123151
124- dynamic getPackageFromConfig (dynamic packageConfig, String packageName) {
152+ dynamic getPackageFromConfig (dynamic packageConfig, String packageName,
153+ {bool required = false }) {
125154 final pkg = (packageConfig['packages' ] as List ? ?? < dynamic > []).firstWhere (
126155 (dynamic e) => e['name' ] == packageName,
127156 orElse: () => null ,
128157 );
129- if (pkg == null ) {
158+ if (pkg == null && required ) {
130159 throw Exception ('Dependency on package:$packageName is required' );
131160 }
132161 return pkg;
@@ -151,17 +180,18 @@ String getPubspecVersion(
151180
152181String capitalize (String s) => s[0 ].toUpperCase () + s.substring (1 );
153182
154- Future <List <String >> getLatestTagsFromRelease (HttpClient httpClient) async {
155- var request = await httpClient.getUrl (Uri .parse (
156- "https://api.github.com/repos/powersync-ja/sqlite3.dart/releases" ));
183+ Future <List <String >> getLatestTagsFromRelease (HttpClient httpClient,
184+ {String repo = 'sqlite3.dart' }) async {
185+ var request = await httpClient.getUrl (
186+ Uri .parse ("https://api.github.com/repos/powersync-ja/$repo /releases" ));
157187 var response = await request.close ();
158188 if (response.statusCode == HttpStatus .ok) {
159189 var res = await response.transform (utf8.decoder).join ();
160190 var jsonObj = json.decode (res) as List <dynamic >;
161191 List <String > tags = [];
162192 for (dynamic obj in jsonObj) {
163193 final tagName = obj['tag_name' ] as String ;
164- if (! tagName.contains ("- powersync" )) continue ;
194+ if (! tagName.contains ("powersync" )) continue ;
165195 tags.add (tagName);
166196 }
167197 return tags;
0 commit comments