@livestore/adapter-expo 0.3.0-dev.18 → 0.3.0-dev.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,138 @@
1
+ import { shouldNeverHappen } from '@livestore/utils';
2
+ import { Effect } from '@livestore/utils/effect';
3
+ import * as SQLite from 'expo-sqlite';
4
+ export const makeSqliteDb = (input) => Effect.gen(function* () {
5
+ // console.log('makeSqliteDb', input)
6
+ if (input._tag === 'in-memory') {
7
+ // const db = SQLite.openDatabaseSync(':memory:')
8
+ return makeSqliteDb_({
9
+ // db,
10
+ makeDb: () => SQLite.openDatabaseSync(':memory:'),
11
+ metadata: {
12
+ _tag: 'expo',
13
+ dbPointer: 0,
14
+ persistenceInfo: { fileName: ':memory:' },
15
+ input,
16
+ },
17
+ });
18
+ }
19
+ if (input._tag === 'expo') {
20
+ // const db = SQLite.openDatabaseSync(input.databaseName, {}, input.directory)
21
+ return makeSqliteDb_({
22
+ // db,
23
+ makeDb: () => SQLite.openDatabaseSync(input.databaseName, {}, input.directory),
24
+ metadata: {
25
+ _tag: 'expo',
26
+ dbPointer: 0,
27
+ persistenceInfo: { fileName: `${input.directory}/${input.databaseName}` },
28
+ input,
29
+ },
30
+ });
31
+ }
32
+ });
33
+ const makeSqliteDb_ = ({
34
+ // db,
35
+ makeDb, metadata, }) => {
36
+ const stmts = [];
37
+ const dbRef = { current: makeDb() };
38
+ const sqliteDb = {
39
+ metadata,
40
+ _tag: 'SqliteDb',
41
+ prepare: (queryStr) => {
42
+ try {
43
+ const db = dbRef.current;
44
+ const dbStmt = db.prepareSync(queryStr);
45
+ const stmt = {
46
+ execute: (bindValues) => {
47
+ // console.log('execute', queryStr, bindValues)
48
+ const res = dbStmt.executeSync(bindValues ?? []);
49
+ res.resetSync();
50
+ return () => res.changes;
51
+ },
52
+ select: (bindValues) => {
53
+ const res = dbStmt.executeSync(bindValues ?? []);
54
+ try {
55
+ return res.getAllSync();
56
+ }
57
+ finally {
58
+ res.resetSync();
59
+ }
60
+ },
61
+ finalize: () => dbStmt.finalizeSync(),
62
+ sql: queryStr,
63
+ };
64
+ stmts.push(stmt);
65
+ return stmt;
66
+ }
67
+ catch (e) {
68
+ console.error(`Error preparing statement: ${queryStr}`, e);
69
+ return shouldNeverHappen(`Error preparing statement: ${queryStr}`);
70
+ }
71
+ },
72
+ execute: (queryStr, bindValues) => {
73
+ const db = dbRef.current;
74
+ const stmt = db.prepareSync(queryStr);
75
+ try {
76
+ const res = stmt.executeSync(bindValues ?? []);
77
+ return () => res.changes;
78
+ }
79
+ finally {
80
+ stmt.finalizeSync();
81
+ }
82
+ },
83
+ export: () => {
84
+ const db = dbRef.current;
85
+ return db.serializeSync();
86
+ },
87
+ select: (queryStr, bindValues) => {
88
+ const stmt = sqliteDb.prepare(queryStr);
89
+ const res = stmt.select(bindValues);
90
+ stmt.finalize();
91
+ return res;
92
+ },
93
+ // TODO
94
+ destroy: () => {
95
+ if (metadata.input._tag === 'expo') {
96
+ SQLite.deleteDatabaseSync(metadata.input.databaseName, metadata.input.directory);
97
+ }
98
+ },
99
+ close: () => {
100
+ const db = dbRef.current;
101
+ for (const stmt of stmts) {
102
+ stmt.finalize();
103
+ }
104
+ return db.closeSync();
105
+ },
106
+ import: (data) => {
107
+ if (!(data instanceof Uint8Array)) {
108
+ throw new TypeError('importing from an existing database is not yet supported in expo');
109
+ }
110
+ if (metadata.input._tag === 'expo') {
111
+ throw new Error('not implemented');
112
+ // SQLite.importDatabaseSync(metadata.input.databaseName, metadata.input.directory, _data)
113
+ }
114
+ else {
115
+ dbRef.current.closeSync();
116
+ dbRef.current = SQLite.deserializeDatabaseSync(data);
117
+ }
118
+ },
119
+ session: () => {
120
+ return {
121
+ changeset: () => new Uint8Array(),
122
+ finish: () => { },
123
+ };
124
+ },
125
+ makeChangeset: (data) => {
126
+ return {
127
+ invert: () => {
128
+ return sqliteDb.makeChangeset(data);
129
+ },
130
+ apply: () => {
131
+ // TODO
132
+ },
133
+ };
134
+ },
135
+ };
136
+ return sqliteDb;
137
+ };
138
+ //# sourceMappingURL=make-sqlite-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-sqlite-db.js","sourceRoot":"","sources":["../src/make-sqlite-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { WebChannel } from '@livestore/utils/effect';
2
+ export declare const makeShutdownChannel: (storeId: string) => import("effect/Effect").Effect<WebChannel.WebChannel<import("@livestore/common/dist/adapter-types.js").UnexpectedError | import("@livestore/common/dist/adapter-types.js").IntentionalShutdownCause, import("@livestore/common/dist/adapter-types.js").UnexpectedError | import("@livestore/common/dist/adapter-types.js").IntentionalShutdownCause, never>, never, import("effect/Scope").Scope>;
3
+ //# sourceMappingURL=shutdown-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-channel.d.ts","sourceRoot":"","sources":["../src/shutdown-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpD,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,sYACyC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { WebChannel } from '@livestore/utils/effect';
2
+ // TODO find an actual implementation for Expo
3
+ export const makeShutdownChannel = (storeId) => WebChannel.noopChannel();
4
+ // WebChannel.broadcastChannel({
5
+ // channelName: `livestore.shutdown.${storeId}`,
6
+ // schema: ShutdownChannel.All,
7
+ // })
8
+ //# sourceMappingURL=shutdown-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown-channel.js","sourceRoot":"","sources":["../src/shutdown-channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,8CAA8C;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,EAAE,CACrD,UAAU,CAAC,WAAW,EAAoE,CAAA;AAC5F,gCAAgC;AAChC,kDAAkD;AAClD,iCAAiC;AACjC,KAAK"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livestore/adapter-expo",
3
- "version": "0.3.0-dev.18",
3
+ "version": "0.3.0-dev.19",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
@@ -12,22 +12,27 @@
12
12
  "types": "./dist/index.d.ts",
13
13
  "dependencies": {
14
14
  "@opentelemetry/api": "1.9.0",
15
- "@livestore/common": "0.3.0-dev.18",
16
- "@livestore/devtools-expo-common": "0.3.0-dev.18",
17
- "@livestore/utils": "0.3.0-dev.18"
15
+ "@livestore/common": "0.3.0-dev.19",
16
+ "@livestore/devtools-expo-common": "0.3.0-dev.19",
17
+ "@livestore/utils": "0.3.0-dev.19",
18
+ "@livestore/webmesh": "0.3.0-dev.19"
18
19
  },
19
20
  "devDependencies": {
20
21
  "expo-file-system": "*",
21
- "expo-sqlite": "^15.0.3"
22
+ "expo-sqlite": "^15.1.2"
22
23
  },
23
24
  "peerDependencies": {
24
25
  "expo-file-system": "*",
25
- "expo-sqlite": "~15.0.3"
26
+ "expo-sqlite": "^15.1.2"
26
27
  },
27
28
  "publishConfig": {
28
29
  "access": "public"
29
30
  },
31
+ "scripts_": {
32
+ "postinstall": "This is needed to avoid a Expo/PNPM related issue"
33
+ },
30
34
  "scripts": {
35
+ "postinstall": "rm -f node_modules/expo-sqlite",
31
36
  "test": "echo No tests yet"
32
37
  }
33
38
  }
package/src/common.ts CHANGED
@@ -1,95 +1,9 @@
1
- import type { PreparedStatement, SqliteDb } from '@livestore/common'
2
- import { base64, shouldNeverHappen } from '@livestore/utils'
1
+ import type { SqliteDb } from '@livestore/common'
2
+ import { base64 } from '@livestore/utils'
3
3
  import { Effect } from '@livestore/utils/effect'
4
4
  import * as ExpoFS from 'expo-file-system'
5
5
  import type * as SQLite from 'expo-sqlite'
6
6
 
7
- export const makeSqliteDb = (db: SQLite.SQLiteDatabase): SqliteDb => {
8
- const stmts: PreparedStatement[] = []
9
-
10
- const sqliteDb: SqliteDb<any> = {
11
- metadata: { fileName: db.databasePath },
12
- _tag: 'SqliteDb',
13
- prepare: (queryStr) => {
14
- try {
15
- const dbStmt = db.prepareSync(queryStr)
16
- const stmt = {
17
- execute: (bindValues) => {
18
- // console.log('execute', queryStr, bindValues)
19
- const res = dbStmt.executeSync(bindValues ?? ([] as any))
20
- res.resetSync()
21
- return () => res.changes
22
- },
23
- select: (bindValues) => {
24
- const res = dbStmt.executeSync(bindValues ?? ([] as any))
25
- try {
26
- return res.getAllSync() as any
27
- } finally {
28
- res.resetSync()
29
- }
30
- },
31
- finalize: () => dbStmt.finalizeSync(),
32
- sql: queryStr,
33
- } satisfies PreparedStatement
34
- stmts.push(stmt)
35
- return stmt
36
- } catch (e) {
37
- console.error(`Error preparing statement: ${queryStr}`, e)
38
- return shouldNeverHappen(`Error preparing statement: ${queryStr}`)
39
- }
40
- },
41
- execute: (queryStr, bindValues) => {
42
- const stmt = db.prepareSync(queryStr)
43
- try {
44
- const res = stmt.executeSync(bindValues ?? ([] as any))
45
- return () => res.changes
46
- } finally {
47
- stmt.finalizeSync()
48
- }
49
- },
50
- export: () => {
51
- return db.serializeSync()
52
- },
53
- select: (queryStr, bindValues) => {
54
- const stmt = sqliteDb.prepare(queryStr)
55
- const res = stmt.select(bindValues)
56
- stmt.finalize()
57
- return res as any
58
- },
59
- // TODO
60
- destroy: () => {},
61
- close: () => {
62
- for (const stmt of stmts) {
63
- stmt.finalize()
64
- }
65
- return db.closeSync()
66
- },
67
- import: () => {
68
- throw new Error('Not implemented')
69
- // TODO properly implement this as it seems to require importing to a temporary in-memory db,
70
- // save it to a file, and then reopen the DB from that file? (see `overwriteDbFile` below)
71
- },
72
- session: () => {
73
- return {
74
- changeset: () => new Uint8Array(),
75
- finish: () => {},
76
- }
77
- },
78
- makeChangeset: (data) => {
79
- return {
80
- invert: () => {
81
- return sqliteDb.makeChangeset(data)
82
- },
83
- apply: () => {
84
- // TODO
85
- },
86
- }
87
- },
88
- } satisfies SqliteDb
89
-
90
- return sqliteDb
91
- }
92
-
93
7
  export type DbPairRef = {
94
8
  current:
95
9
  | {