-
Notifications
You must be signed in to change notification settings - Fork 58
feat: @powersync/adapter-sql-js added to support SQL.js #647
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 26 commits
Commits
Show all changes
30 commits
Select commit
Hold shift + click to select a range
ed6befc
wip
stevensJourney 1f4dcb3
wip
stevensJourney 35d50bc
override nodejs imports
stevensJourney b6c8c2a
add patches
stevensJourney bf24e5e
cleanup
stevensJourney c52828e
enable table update hooks. using force!
stevensJourney cedd8a3
Updated patch to have make script also enable FTS5.
Chriztiaan 3679fda
Scheduling writes to a ControlledExecutor.
Chriztiaan babeefc
Dropped sql.js temp package. Using dev release from standalone project.
Chriztiaan 3edca89
Added tests.
Chriztiaan 6b1f2fa
Revert changes to demo.
Chriztiaan 7491003
Merge branch 'main' into poc-sqljs
Chriztiaan f664362
Moved to dev package.
Chriztiaan 96fdf4e
Re-exporting dev from react-native.
Chriztiaan 3100988
Updated lock file.
Chriztiaan f11287d
Added react-native changeset.
Chriztiaan 983d04e
Bumped @ps/sql-js depdenency.
Chriztiaan 237ab9d
Merge branch 'main' into poc-sqljs
Chriztiaan c5b3b69
Fix build:prod script.
Chriztiaan 097d893
Changeset entry, and making dev package public.
Chriztiaan 782f7b4
Updated readme.
Chriztiaan 46bd668
Updated Dev readme.
Chriztiaan 0e0ef52
Merge branch 'main' into poc-sqljs
Chriztiaan c8a9af0
Removed dev package re-export from React-Native.
Chriztiaan 4f1e221
Removed unused changeset.
Chriztiaan aa04921
Minor polish.
Chriztiaan fc99b93
Minor readme change, updated a comment.
Chriztiaan dabf474
Renamed dev package to adapter-sql-js.
Chriztiaan e731bd5
Merge branch 'main' into poc-sqljs
Chriztiaan 19c70c7
Updated changeset.
Chriztiaan File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@powersync/dev': patch | ||
--- | ||
|
||
Introduced dev package. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@powersync/common': minor | ||
--- | ||
|
||
Added ControlledExecutor utility to exports. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
# PowerSync Dev | ||
|
||
A development package for PowerSync which uses [SQL.js](https://sql.js.org/#/) to provide a pure JavaScript SQLite implementation. | ||
This eliminates the need for native dependencies and enabling seamless development with Expo Go and other JavaScript-only environments. | ||
|
||
This package is specifically designed to streamline the development workflow and will be much slower than DB adapters that use native dependencies. | ||
Chriztiaan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
For example when building React Native apps we recommend switching to our OP-sqlite or RNQS adapters when making production builds as they give substantially better performance. | ||
|
||
## Note: Alpha Release | ||
|
||
This package is currently in an alpha release. | ||
|
||
## Usage | ||
|
||
By default the SQLJS adapter will be in-memory. Read further for persister examples. | ||
|
||
```tsx | ||
import { SQLJSOpenFactory } from '@powersync/dev'; | ||
|
||
const powersync = new PowerSyncDatabase({ | ||
schema: AppSchema, | ||
database: new SQLJSOpenFactory({ | ||
dbFilename: 'powersync.db' | ||
}) | ||
}); | ||
``` | ||
|
||
## Persister examples | ||
|
||
### Expo | ||
|
||
We can use the [Expo File System](https://docs.expo.dev/versions/latest/sdk/filesystem/) to persist the database in an Expo app. | ||
|
||
```tsx | ||
import { PowerSyncDatabase, SQLJSOpenFactory, SQLJSPersister } from '@powersync/react-native'; | ||
import * as FileSystem from 'expo-file-system'; | ||
|
||
const powersync = new PowerSyncDatabase({ | ||
schema: AppSchema, | ||
database: new SQLJSOpenFactory({ | ||
dbFilename: 'powersync.db', | ||
persister: createSQLJSPersister('powersync.db') | ||
}) | ||
}); | ||
|
||
const createSQLJSPersister = (dbFilename: string): SQLJSPersister => { | ||
const dbPath = `${FileSystem.documentDirectory}${dbFilename}`; | ||
|
||
return { | ||
readFile: async (): Promise<ArrayLike<number> | Buffer | null> => { | ||
try { | ||
const fileInfo = await FileSystem.getInfoAsync(dbPath); | ||
if (!fileInfo.exists) { | ||
return null; | ||
} | ||
|
||
const result = await FileSystem.readAsStringAsync(dbPath, { | ||
encoding: FileSystem.EncodingType.Base64 | ||
}); | ||
|
||
const binary = atob(result); | ||
const bytes = new Uint8Array(binary.length); | ||
for (let i = 0; i < binary.length; i++) { | ||
bytes[i] = binary.charCodeAt(i); | ||
} | ||
return bytes; | ||
} catch (error) { | ||
console.error('Error reading database file:', error); | ||
return null; | ||
} | ||
}, | ||
|
||
writeFile: async (data: ArrayLike<number> | Buffer): Promise<void> => { | ||
try { | ||
const uint8Array = new Uint8Array(data); | ||
const binary = Array.from(uint8Array, (byte) => String.fromCharCode(byte)).join(''); | ||
const base64 = btoa(binary); | ||
|
||
await FileSystem.writeAsStringAsync(dbPath, base64, { | ||
encoding: FileSystem.EncodingType.Base64 | ||
}); | ||
} catch (error) { | ||
console.error('Error writing database file:', error); | ||
throw error; | ||
} | ||
} | ||
}; | ||
}; | ||
``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
{ | ||
"name": "@powersync/dev", | ||
"version": "0.0.0", | ||
"publishConfig": { | ||
"registry": "https://registry.npmjs.org/", | ||
"access": "public" | ||
}, | ||
"description": "Development helpers for JourneyApps PowerSync", | ||
Chriztiaan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
"type": "module", | ||
"main": "dist/bundle.mjs", | ||
"module": "dist/bundle.mjs", | ||
"types": "lib/index.d.ts", | ||
"author": "JOURNEYAPPS", | ||
"license": "Apache-2.0", | ||
"files": [ | ||
"lib", | ||
"dist" | ||
], | ||
"repository": { | ||
"type": "git", | ||
"url": "git+https://github.com/powersync-ja/powersync-js.git" | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/powersync-ja/powersync-js/issues" | ||
}, | ||
"homepage": "https://docs.powersync.com", | ||
"scripts": { | ||
"build": "tsc -b && rollup -c rollup.config.mjs", | ||
"build:prod": "tsc -b --sourceMap false && rollup -c rollup.config.mjs --sourceMap false", | ||
"clean": "rm -rf lib dist tsconfig.tsbuildinfo", | ||
"test": "vitest" | ||
}, | ||
"dependencies": { | ||
"@powersync/common": "workspace:^", | ||
"async-mutex": "^0.4.0" | ||
}, | ||
"devDependencies": { | ||
"@powersync/sql-js": "0.0.1", | ||
"@powersync/web": "workspace:*", | ||
"@rollup/plugin-alias": "^5.1.0", | ||
"@types/sql.js": "^1.4.9", | ||
"chance": "^1.1.9", | ||
"rollup": "4.14.3", | ||
"uuid": "^11.1.0" | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import alias from '@rollup/plugin-alias'; | ||
import commonjs from '@rollup/plugin-commonjs'; | ||
import nodeResolve from '@rollup/plugin-node-resolve'; | ||
import path from 'path'; | ||
import { fileURLToPath } from 'url'; | ||
|
||
const __filename = fileURLToPath(import.meta.url); | ||
const __dirname = path.dirname(__filename); | ||
|
||
/** | ||
* @returns {import('rollup').RollupOptions} | ||
*/ | ||
export default (commandLineArgs) => { | ||
const sourceMap = (commandLineArgs.sourceMap || 'true') == 'true'; | ||
|
||
// Clears rollup CLI warning https://github.com/rollup/rollup/issues/2694 | ||
delete commandLineArgs.sourceMap; | ||
|
||
return { | ||
input: 'lib/index.js', | ||
output: { | ||
file: 'dist/bundle.mjs', | ||
format: 'esm', | ||
sourcemap: sourceMap | ||
}, | ||
plugins: [ | ||
nodeResolve({ preferBuiltins: false, browser: true }), | ||
commonjs({}), | ||
alias({ | ||
entries: [ | ||
// The default Emscripten output contains code like `require("fs")`. This seems | ||
// to be unreachable, but Metro complains when it detects it. | ||
{ find: 'fs', replacement: path.resolve(__dirname, 'vendored/empty.js') }, | ||
{ find: 'path', replacement: path.resolve(__dirname, 'vendored/empty.js') }, | ||
{ find: 'crypto', replacement: path.resolve(__dirname, 'vendored/empty.js') } | ||
Chriztiaan marked this conversation as resolved.
Show resolved
Hide resolved
|
||
] | ||
}) | ||
], | ||
external: ['@powersync/common'] | ||
}; | ||
}; |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.