@effect/sql-sqlite-react-native 4.0.0-beta.7 → 4.0.0-beta.71
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.
- package/dist/SqliteClient.d.ts +36 -16
- package/dist/SqliteClient.d.ts.map +1 -1
- package/dist/SqliteClient.js +71 -21
- package/dist/SqliteClient.js.map +1 -1
- package/dist/SqliteMigrator.d.ts +28 -6
- package/dist/SqliteMigrator.d.ts.map +1 -1
- package/dist/SqliteMigrator.js +9 -5
- package/dist/SqliteMigrator.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/package.json +4 -4
- package/src/SqliteClient.ts +86 -36
- package/src/SqliteMigrator.ts +28 -6
- package/src/index.ts +3 -3
package/dist/SqliteClient.d.ts
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import * as Config from "effect/Config";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
2
3
|
import * as Effect from "effect/Effect";
|
|
3
4
|
import * as Layer from "effect/Layer";
|
|
4
5
|
import * as Scope from "effect/Scope";
|
|
5
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
6
6
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
7
7
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
9
|
+
* Runtime identifier attached to SQLite React Native client values.
|
|
10
|
+
*
|
|
11
|
+
* @category type IDs
|
|
12
|
+
* @since 4.0.0
|
|
11
13
|
*/
|
|
12
14
|
export declare const TypeId: TypeId;
|
|
13
15
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* Type-level identifier for SQLite React Native client values.
|
|
17
|
+
*
|
|
18
|
+
* @category type IDs
|
|
19
|
+
* @since 4.0.0
|
|
16
20
|
*/
|
|
17
21
|
export type TypeId = "~@effect/sql-sqlite-react-native/SqliteClient";
|
|
18
22
|
/**
|
|
23
|
+
* React Native SQLite client service interface, extending `SqlClient` with its configuration and marking `updateValues` as unsupported for SQLite.
|
|
24
|
+
*
|
|
19
25
|
* @category models
|
|
20
|
-
* @since
|
|
26
|
+
* @since 4.0.0
|
|
21
27
|
*/
|
|
22
28
|
export interface SqliteClient extends Client.SqlClient {
|
|
23
29
|
readonly [TypeId]: TypeId;
|
|
@@ -26,13 +32,17 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
26
32
|
readonly updateValues: never;
|
|
27
33
|
}
|
|
28
34
|
/**
|
|
35
|
+
* Context service tag for the React Native SQLite client.
|
|
36
|
+
*
|
|
29
37
|
* @category tags
|
|
30
|
-
* @since
|
|
38
|
+
* @since 4.0.0
|
|
31
39
|
*/
|
|
32
|
-
export declare const SqliteClient:
|
|
40
|
+
export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
|
|
33
41
|
/**
|
|
42
|
+
* Configuration for a React Native SQLite client, including the database filename, optional location and encryption key, span attributes, and query/result name transforms.
|
|
43
|
+
*
|
|
34
44
|
* @category models
|
|
35
|
-
* @since
|
|
45
|
+
* @since 4.0.0
|
|
36
46
|
*/
|
|
37
47
|
export interface SqliteClientConfig {
|
|
38
48
|
readonly filename: string;
|
|
@@ -43,28 +53,38 @@ export interface SqliteClientConfig {
|
|
|
43
53
|
readonly transformQueryNames?: ((str: string) => string) | undefined;
|
|
44
54
|
}
|
|
45
55
|
/**
|
|
56
|
+
* Fiber-local flag that makes the React Native SQLite client run queries through the asynchronous `execute` API instead of `executeSync`.
|
|
57
|
+
*
|
|
46
58
|
* @category fiber refs
|
|
47
|
-
* @since
|
|
59
|
+
* @since 4.0.0
|
|
48
60
|
*/
|
|
49
|
-
export declare const AsyncQuery:
|
|
61
|
+
export declare const AsyncQuery: Context.Reference<boolean>;
|
|
50
62
|
/**
|
|
63
|
+
* Runs an effect with `AsyncQuery` enabled, causing React Native SQLite queries in that effect to use the asynchronous driver API.
|
|
64
|
+
*
|
|
51
65
|
* @category fiber refs
|
|
52
|
-
* @since
|
|
66
|
+
* @since 4.0.0
|
|
53
67
|
*/
|
|
54
68
|
export declare const withAsyncQuery: <R, E, A>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, Exclude<R, never>>;
|
|
55
69
|
/**
|
|
56
|
-
*
|
|
57
|
-
*
|
|
70
|
+
* Creates a scoped React Native SQLite client from the supplied configuration, using a single serialized connection and honoring `AsyncQuery` for query execution.
|
|
71
|
+
*
|
|
72
|
+
* @category constructors
|
|
73
|
+
* @since 4.0.0
|
|
58
74
|
*/
|
|
59
75
|
export declare const make: (options: SqliteClientConfig) => Effect.Effect<SqliteClient, never, Scope.Scope | Reactivity.Reactivity>;
|
|
60
76
|
/**
|
|
77
|
+
* Builds a layer from an Effect `Config` value, providing both the React Native `SqliteClient` service and the generic `SqlClient` service.
|
|
78
|
+
*
|
|
61
79
|
* @category layers
|
|
62
|
-
* @since
|
|
80
|
+
* @since 4.0.0
|
|
63
81
|
*/
|
|
64
82
|
export declare const layerConfig: (config: Config.Wrap<SqliteClientConfig>) => Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError>;
|
|
65
83
|
/**
|
|
84
|
+
* Builds a layer from a React Native SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
85
|
+
*
|
|
66
86
|
* @category layers
|
|
67
|
-
* @since
|
|
87
|
+
* @since 4.0.0
|
|
68
88
|
*/
|
|
69
89
|
export declare const layer: (config: SqliteClientConfig) => Layer.Layer<SqliteClient | Client.SqlClient>;
|
|
70
90
|
//# sourceMappingURL=SqliteClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAGrC,OAAO,KAAK,UAAU,MAAM,uCAAuC,CAAA;AACnE,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAUvD;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAAwD,CAAA;AAE7E;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,+CAA+C,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,WAAW,YAAa,SAAQ,MAAM,CAAC,SAAS;IACpD,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAA;IAEnC,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,6CAAgF,CAAA;AAEzG;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAC7D,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;IACrE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAA;CACrE;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,4BAGtB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,2CACrB,CAAA;AAIjD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAmGrE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KACtC,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,CAUzB,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAChB,QAAQ,kBAAkB,KACzB,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAML,CAAA"}
|
package/dist/SqliteClient.js
CHANGED
|
@@ -1,46 +1,94 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* React Native SQLite client implementation for Effect SQL, backed by
|
|
3
|
+
* `@op-engineering/op-sqlite`.
|
|
4
|
+
*
|
|
5
|
+
* This module opens an on-device SQLite database and exposes it as both the
|
|
6
|
+
* React Native-specific `SqliteClient` service and the generic Effect
|
|
7
|
+
* `SqlClient` service. Use it for mobile application storage, offline caches,
|
|
8
|
+
* local migrations, sync queues, and tests that need the same SQLite driver as
|
|
9
|
+
* the app runtime.
|
|
10
|
+
*
|
|
11
|
+
* **Mental model**
|
|
12
|
+
*
|
|
13
|
+
* A client owns one scoped op-sqlite database handle configured with the
|
|
14
|
+
* provided `filename`, optional `location`, and optional `encryptionKey`.
|
|
15
|
+
* Queries are compiled through the Effect SQL SQLite compiler and serialized
|
|
16
|
+
* through that single handle. A transaction keeps the serialized connection
|
|
17
|
+
* permit for the whole transaction scope, so other fibers using the same client
|
|
18
|
+
* wait until the transaction finishes.
|
|
19
|
+
*
|
|
20
|
+
* **Common tasks**
|
|
21
|
+
*
|
|
22
|
+
* Use `layer` when a React Native app should provide both `SqliteClient` and
|
|
23
|
+
* the generic `SqlClient` from a concrete configuration, `layerConfig` when the
|
|
24
|
+
* configuration should come from Effect `Config`, and `make` inside a custom
|
|
25
|
+
* scoped layer when you need direct lifecycle control. Use `withAsyncQuery`
|
|
26
|
+
* around UI-sensitive effects or longer migration steps to run statements with
|
|
27
|
+
* the driver's asynchronous API instead of the default synchronous API.
|
|
28
|
+
*
|
|
29
|
+
* **Gotchas**
|
|
30
|
+
*
|
|
31
|
+
* The default synchronous op-sqlite API can block the JavaScript thread, so keep
|
|
32
|
+
* transactions short and wrap multi-statement writes in a transaction to avoid
|
|
33
|
+
* partial updates. `executeStream` is not implemented for this driver, and
|
|
34
|
+
* SQLite does not support `updateValues`.
|
|
35
|
+
*
|
|
36
|
+
* @since 4.0.0
|
|
3
37
|
*/
|
|
4
38
|
import * as Sqlite from "@op-engineering/op-sqlite";
|
|
5
39
|
import * as Config from "effect/Config";
|
|
40
|
+
import * as Context from "effect/Context";
|
|
6
41
|
import * as Effect from "effect/Effect";
|
|
7
42
|
import * as Fiber from "effect/Fiber";
|
|
8
43
|
import { constFalse, identity } from "effect/Function";
|
|
9
44
|
import * as Layer from "effect/Layer";
|
|
10
45
|
import * as Scope from "effect/Scope";
|
|
11
46
|
import * as Semaphore from "effect/Semaphore";
|
|
12
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
13
47
|
import * as Stream from "effect/Stream";
|
|
14
48
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
15
49
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
16
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
50
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
|
|
17
51
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
18
52
|
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
53
|
+
const classifyError = (cause, message, operation) => classifySqliteError(cause, {
|
|
54
|
+
message,
|
|
55
|
+
operation
|
|
56
|
+
});
|
|
19
57
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
58
|
+
* Runtime identifier attached to SQLite React Native client values.
|
|
59
|
+
*
|
|
60
|
+
* @category type IDs
|
|
61
|
+
* @since 4.0.0
|
|
22
62
|
*/
|
|
23
63
|
export const TypeId = "~@effect/sql-sqlite-react-native/SqliteClient";
|
|
24
64
|
/**
|
|
65
|
+
* Context service tag for the React Native SQLite client.
|
|
66
|
+
*
|
|
25
67
|
* @category tags
|
|
26
|
-
* @since
|
|
68
|
+
* @since 4.0.0
|
|
27
69
|
*/
|
|
28
|
-
export const SqliteClient = /*#__PURE__*/
|
|
70
|
+
export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-react-native/SqliteClient");
|
|
29
71
|
/**
|
|
72
|
+
* Fiber-local flag that makes the React Native SQLite client run queries through the asynchronous `execute` API instead of `executeSync`.
|
|
73
|
+
*
|
|
30
74
|
* @category fiber refs
|
|
31
|
-
* @since
|
|
75
|
+
* @since 4.0.0
|
|
32
76
|
*/
|
|
33
|
-
export const AsyncQuery = /*#__PURE__*/
|
|
77
|
+
export const AsyncQuery = /*#__PURE__*/Context.Reference("@effect/sql-sqlite-react-native/Client/asyncQuery", {
|
|
34
78
|
defaultValue: constFalse
|
|
35
79
|
});
|
|
36
80
|
/**
|
|
81
|
+
* Runs an effect with `AsyncQuery` enabled, causing React Native SQLite queries in that effect to use the asynchronous driver API.
|
|
82
|
+
*
|
|
37
83
|
* @category fiber refs
|
|
38
|
-
* @since
|
|
84
|
+
* @since 4.0.0
|
|
39
85
|
*/
|
|
40
86
|
export const withAsyncQuery = effect => Effect.provideService(effect, AsyncQuery, true);
|
|
41
87
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
88
|
+
* Creates a scoped React Native SQLite client from the supplied configuration, using a single serialized connection and honoring `AsyncQuery` for query execution.
|
|
89
|
+
*
|
|
90
|
+
* @category constructors
|
|
91
|
+
* @since 4.0.0
|
|
44
92
|
*/
|
|
45
93
|
export const make = options => Effect.gen(function* () {
|
|
46
94
|
const clientOptions = {
|
|
@@ -62,8 +110,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
62
110
|
return Effect.map(Effect.tryPromise({
|
|
63
111
|
try: () => db.execute(sql, params),
|
|
64
112
|
catch: cause => new SqlError({
|
|
65
|
-
cause,
|
|
66
|
-
message: "Failed to execute statement (async)"
|
|
113
|
+
reason: classifyError(cause, "Failed to execute statement (async)", "execute")
|
|
67
114
|
})
|
|
68
115
|
}), result => values ? result.rawRows ?? [] : result.rows);
|
|
69
116
|
}
|
|
@@ -73,8 +120,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
73
120
|
return values ? result.rawRows ?? [] : result.rows;
|
|
74
121
|
},
|
|
75
122
|
catch: cause => new SqlError({
|
|
76
|
-
cause,
|
|
77
|
-
message: "Failed to execute statement"
|
|
123
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
78
124
|
})
|
|
79
125
|
});
|
|
80
126
|
});
|
|
@@ -101,7 +147,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
101
147
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
|
|
102
148
|
const transactionAcquirer = Effect.uninterruptibleMask(restore => {
|
|
103
149
|
const fiber = Fiber.getCurrent();
|
|
104
|
-
const scope =
|
|
150
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope);
|
|
105
151
|
return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
106
152
|
});
|
|
107
153
|
return Object.assign(yield* Client.make({
|
|
@@ -116,13 +162,17 @@ export const make = options => Effect.gen(function* () {
|
|
|
116
162
|
});
|
|
117
163
|
});
|
|
118
164
|
/**
|
|
165
|
+
* Builds a layer from an Effect `Config` value, providing both the React Native `SqliteClient` service and the generic `SqlClient` service.
|
|
166
|
+
*
|
|
119
167
|
* @category layers
|
|
120
|
-
* @since
|
|
168
|
+
* @since 4.0.0
|
|
121
169
|
*/
|
|
122
|
-
export const layerConfig = config => Layer.
|
|
170
|
+
export const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
|
|
123
171
|
/**
|
|
172
|
+
* Builds a layer from a React Native SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
173
|
+
*
|
|
124
174
|
* @category layers
|
|
125
|
-
* @since
|
|
175
|
+
* @since 4.0.0
|
|
126
176
|
*/
|
|
127
|
-
export const layer = config => Layer.
|
|
177
|
+
export const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
|
|
128
178
|
//# sourceMappingURL=SqliteClient.js.map
|
package/dist/SqliteClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient.js","names":["Sqlite","Config","Effect","Fiber","constFalse","identity","Layer","Scope","Semaphore","
|
|
1
|
+
{"version":3,"file":"SqliteClient.js","names":["Sqlite","Config","Context","Effect","Fiber","constFalse","identity","Layer","Scope","Semaphore","Stream","Reactivity","Client","classifySqliteError","SqlError","Statement","ATTR_DB_SYSTEM_NAME","classifyError","cause","message","operation","TypeId","SqliteClient","Service","AsyncQuery","Reference","defaultValue","withAsyncQuery","effect","provideService","make","options","gen","clientOptions","name","filename","location","encryptionKey","compiler","makeCompilerSqlite","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","makeConnection","db","open","addFinalizer","sync","close","run","sql","params","values","withFiber","fiber","getRef","map","tryPromise","try","execute","catch","reason","result","rawRows","rows","executeSync","executeRaw","executeValues","executeUnprepared","executeStream","die","semaphore","connection","acquirer","withPermits","succeed","transactionAcquirer","uninterruptibleMask","restore","getCurrent","scope","getUnsafe","context","as","tap","take","release","Object","assign","spanAttributes","entries","config","layerConfig","effectContext","unwrap","pipe","flatMap","client","add","SqlClient","provide","layer"],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/SqliteMigrator.d.ts
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Utilities for applying Effect SQL migrations to React Native SQLite databases.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides `run` and `layer` helpers that execute ordered migrations through the
|
|
6
|
+
* current React Native SQLite `SqlClient`. Use it when a mobile app needs to
|
|
7
|
+
* bring its on-device database schema up to date during startup, before opening
|
|
8
|
+
* repositories or sync services, or in integration tests that create app-local
|
|
9
|
+
* database files.
|
|
10
|
+
*
|
|
11
|
+
* React Native SQLite databases are scoped by the client configuration, so the
|
|
12
|
+
* migrator should be run with the same `filename`, `location`, and encryption
|
|
13
|
+
* key as the rest of the application. Migrations run through the package's
|
|
14
|
+
* single serialized connection; by default statements use the synchronous
|
|
15
|
+
* driver API and can block the JS thread, so long migration sets may want to run
|
|
16
|
+
* under `SqliteClient.withAsyncQuery`. Mobile upgrades can be interrupted by app
|
|
17
|
+
* suspension or process death, so keep migrations transaction-aware and avoid
|
|
18
|
+
* assuming a fresh database on every launch.
|
|
19
|
+
*
|
|
20
|
+
* @since 4.0.0
|
|
3
21
|
*/
|
|
4
22
|
import type * as Effect from "effect/Effect";
|
|
5
23
|
import * as Layer from "effect/Layer";
|
|
@@ -7,17 +25,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
|
|
|
7
25
|
import type * as Client from "effect/unstable/sql/SqlClient";
|
|
8
26
|
import type { SqlError } from "effect/unstable/sql/SqlError";
|
|
9
27
|
/**
|
|
10
|
-
* @since
|
|
28
|
+
* @since 4.0.0
|
|
11
29
|
*/
|
|
12
30
|
export * from "effect/unstable/sql/Migrator";
|
|
13
31
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
32
|
+
* Runs SQL migrations for a React Native SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
33
|
+
*
|
|
34
|
+
* @category constructors
|
|
35
|
+
* @since 4.0.0
|
|
16
36
|
*/
|
|
17
37
|
export declare const run: <R>(options: Migrator.MigratorOptions<R>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, SqlError | Migrator.MigrationError, Client.SqlClient | R>;
|
|
18
38
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
39
|
+
* Creates a layer that runs the configured React Native SQLite migrations during layer construction and provides no services.
|
|
40
|
+
*
|
|
41
|
+
* @category constructors
|
|
42
|
+
* @since 4.0.0
|
|
21
43
|
*/
|
|
22
44
|
export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, SqlError | Migrator.MigrationError, R | Client.SqlClient>;
|
|
23
45
|
//# sourceMappingURL=SqliteMigrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteMigrator.d.ts","sourceRoot":"","sources":["../src/SqliteMigrator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"SqliteMigrator.d.ts","sourceRoot":"","sources":["../src/SqliteMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,8BAA8B,CAAA;AACxD,OAAO,KAAK,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAE5D;;GAEG;AACH,cAAc,8BAA8B,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,GAAG,EAAE,CAAC,CAAC,EAClB,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACjC,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClD,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACD,CAAA;AAErB;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EACrB,SAAS,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAsC,CAAA"}
|
package/dist/SqliteMigrator.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import * as Layer from "effect/Layer";
|
|
2
2
|
import * as Migrator from "effect/unstable/sql/Migrator";
|
|
3
3
|
/**
|
|
4
|
-
* @since
|
|
4
|
+
* @since 4.0.0
|
|
5
5
|
*/
|
|
6
6
|
export * from "effect/unstable/sql/Migrator";
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Runs SQL migrations for a React Native SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
9
|
+
*
|
|
10
|
+
* @category constructors
|
|
11
|
+
* @since 4.0.0
|
|
10
12
|
*/
|
|
11
13
|
export const run = /*#__PURE__*/Migrator.make({});
|
|
12
14
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
+
* Creates a layer that runs the configured React Native SQLite migrations during layer construction and provides no services.
|
|
16
|
+
*
|
|
17
|
+
* @category constructors
|
|
18
|
+
* @since 4.0.0
|
|
15
19
|
*/
|
|
16
20
|
export const layer = options => Layer.effectDiscard(run(options));
|
|
17
21
|
//# sourceMappingURL=SqliteMigrator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/SqliteMigrator.ts"],"sourcesContent":[null],"mappings":"
|
|
1
|
+
{"version":3,"file":"SqliteMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/SqliteMigrator.ts"],"sourcesContent":[null],"mappings":"AAsBA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,8BAA8B;AAIxD;;;AAGA,cAAc,8BAA8B;AAE5C;;;;;;AAMA,OAAO,MAAMC,GAAG,gBAMZD,QAAQ,CAACE,IAAI,CAAC,EAAE,CAAC;AAErB;;;;;;AAMA,OAAO,MAAMC,KAAK,GAChBC,OAAoC,IAC6CL,KAAK,CAACM,aAAa,CAACJ,GAAG,CAACG,OAAO,CAAC,CAAC","ignoreList":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
2
|
+
* @since 4.0.0
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* @since
|
|
5
|
+
* @since 4.0.0
|
|
6
6
|
*/
|
|
7
7
|
export * as SqliteClient from "./SqliteClient.ts";
|
|
8
8
|
/**
|
|
9
|
-
* @since
|
|
9
|
+
* @since 4.0.0
|
|
10
10
|
*/
|
|
11
11
|
export * as SqliteMigrator from "./SqliteMigrator.ts";
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
2
|
+
* @since 4.0.0
|
|
3
3
|
*/
|
|
4
4
|
// @barrel: Auto-generated exports. Do not edit manually.
|
|
5
5
|
/**
|
|
6
|
-
* @since
|
|
6
|
+
* @since 4.0.0
|
|
7
7
|
*/
|
|
8
8
|
export * as SqliteClient from "./SqliteClient.js";
|
|
9
9
|
/**
|
|
10
|
-
* @since
|
|
10
|
+
* @since 4.0.0
|
|
11
11
|
*/
|
|
12
12
|
export * as SqliteMigrator from "./SqliteMigrator.js";
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/sql-sqlite-react-native",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.71",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "A SQLite toolkit for Effect",
|
|
@@ -43,12 +43,12 @@
|
|
|
43
43
|
"provenance": true
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@op-engineering/op-sqlite": "15.2.
|
|
47
|
-
"effect": "^4.0.0-beta.
|
|
46
|
+
"@op-engineering/op-sqlite": "15.2.12",
|
|
47
|
+
"effect": "^4.0.0-beta.71"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"@op-engineering/op-sqlite": "15.0.4",
|
|
51
|
-
"effect": "^4.0.0-beta.
|
|
51
|
+
"effect": "^4.0.0-beta.71"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"codegen": "effect-utils codegen",
|
package/src/SqliteClient.ts
CHANGED
|
@@ -1,39 +1,82 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* React Native SQLite client implementation for Effect SQL, backed by
|
|
3
|
+
* `@op-engineering/op-sqlite`.
|
|
4
|
+
*
|
|
5
|
+
* This module opens an on-device SQLite database and exposes it as both the
|
|
6
|
+
* React Native-specific `SqliteClient` service and the generic Effect
|
|
7
|
+
* `SqlClient` service. Use it for mobile application storage, offline caches,
|
|
8
|
+
* local migrations, sync queues, and tests that need the same SQLite driver as
|
|
9
|
+
* the app runtime.
|
|
10
|
+
*
|
|
11
|
+
* **Mental model**
|
|
12
|
+
*
|
|
13
|
+
* A client owns one scoped op-sqlite database handle configured with the
|
|
14
|
+
* provided `filename`, optional `location`, and optional `encryptionKey`.
|
|
15
|
+
* Queries are compiled through the Effect SQL SQLite compiler and serialized
|
|
16
|
+
* through that single handle. A transaction keeps the serialized connection
|
|
17
|
+
* permit for the whole transaction scope, so other fibers using the same client
|
|
18
|
+
* wait until the transaction finishes.
|
|
19
|
+
*
|
|
20
|
+
* **Common tasks**
|
|
21
|
+
*
|
|
22
|
+
* Use `layer` when a React Native app should provide both `SqliteClient` and
|
|
23
|
+
* the generic `SqlClient` from a concrete configuration, `layerConfig` when the
|
|
24
|
+
* configuration should come from Effect `Config`, and `make` inside a custom
|
|
25
|
+
* scoped layer when you need direct lifecycle control. Use `withAsyncQuery`
|
|
26
|
+
* around UI-sensitive effects or longer migration steps to run statements with
|
|
27
|
+
* the driver's asynchronous API instead of the default synchronous API.
|
|
28
|
+
*
|
|
29
|
+
* **Gotchas**
|
|
30
|
+
*
|
|
31
|
+
* The default synchronous op-sqlite API can block the JavaScript thread, so keep
|
|
32
|
+
* transactions short and wrap multi-statement writes in a transaction to avoid
|
|
33
|
+
* partial updates. `executeStream` is not implemented for this driver, and
|
|
34
|
+
* SQLite does not support `updateValues`.
|
|
35
|
+
*
|
|
36
|
+
* @since 4.0.0
|
|
3
37
|
*/
|
|
4
38
|
import * as Sqlite from "@op-engineering/op-sqlite"
|
|
5
39
|
import * as Config from "effect/Config"
|
|
40
|
+
import * as Context from "effect/Context"
|
|
6
41
|
import * as Effect from "effect/Effect"
|
|
7
42
|
import * as Fiber from "effect/Fiber"
|
|
8
43
|
import { constFalse, identity } from "effect/Function"
|
|
9
44
|
import * as Layer from "effect/Layer"
|
|
10
45
|
import * as Scope from "effect/Scope"
|
|
11
46
|
import * as Semaphore from "effect/Semaphore"
|
|
12
|
-
import * as ServiceMap from "effect/ServiceMap"
|
|
13
47
|
import * as Stream from "effect/Stream"
|
|
14
48
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
15
49
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
16
50
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
17
|
-
import { SqlError } from "effect/unstable/sql/SqlError"
|
|
51
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
|
|
18
52
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
19
53
|
|
|
20
54
|
const ATTR_DB_SYSTEM_NAME = "db.system.name"
|
|
21
55
|
|
|
56
|
+
const classifyError = (cause: unknown, message: string, operation: string) =>
|
|
57
|
+
classifySqliteError(cause, { message, operation })
|
|
58
|
+
|
|
22
59
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
60
|
+
* Runtime identifier attached to SQLite React Native client values.
|
|
61
|
+
*
|
|
62
|
+
* @category type IDs
|
|
63
|
+
* @since 4.0.0
|
|
25
64
|
*/
|
|
26
65
|
export const TypeId: TypeId = "~@effect/sql-sqlite-react-native/SqliteClient"
|
|
27
66
|
|
|
28
67
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
68
|
+
* Type-level identifier for SQLite React Native client values.
|
|
69
|
+
*
|
|
70
|
+
* @category type IDs
|
|
71
|
+
* @since 4.0.0
|
|
31
72
|
*/
|
|
32
73
|
export type TypeId = "~@effect/sql-sqlite-react-native/SqliteClient"
|
|
33
74
|
|
|
34
75
|
/**
|
|
76
|
+
* React Native SQLite client service interface, extending `SqlClient` with its configuration and marking `updateValues` as unsupported for SQLite.
|
|
77
|
+
*
|
|
35
78
|
* @category models
|
|
36
|
-
* @since
|
|
79
|
+
* @since 4.0.0
|
|
37
80
|
*/
|
|
38
81
|
export interface SqliteClient extends Client.SqlClient {
|
|
39
82
|
readonly [TypeId]: TypeId
|
|
@@ -44,14 +87,18 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
44
87
|
}
|
|
45
88
|
|
|
46
89
|
/**
|
|
90
|
+
* Context service tag for the React Native SQLite client.
|
|
91
|
+
*
|
|
47
92
|
* @category tags
|
|
48
|
-
* @since
|
|
93
|
+
* @since 4.0.0
|
|
49
94
|
*/
|
|
50
|
-
export const SqliteClient =
|
|
95
|
+
export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-react-native/SqliteClient")
|
|
51
96
|
|
|
52
97
|
/**
|
|
98
|
+
* Configuration for a React Native SQLite client, including the database filename, optional location and encryption key, span attributes, and query/result name transforms.
|
|
99
|
+
*
|
|
53
100
|
* @category models
|
|
54
|
-
* @since
|
|
101
|
+
* @since 4.0.0
|
|
55
102
|
*/
|
|
56
103
|
export interface SqliteClientConfig {
|
|
57
104
|
readonly filename: string
|
|
@@ -63,17 +110,21 @@ export interface SqliteClientConfig {
|
|
|
63
110
|
}
|
|
64
111
|
|
|
65
112
|
/**
|
|
113
|
+
* Fiber-local flag that makes the React Native SQLite client run queries through the asynchronous `execute` API instead of `executeSync`.
|
|
114
|
+
*
|
|
66
115
|
* @category fiber refs
|
|
67
|
-
* @since
|
|
116
|
+
* @since 4.0.0
|
|
68
117
|
*/
|
|
69
|
-
export const AsyncQuery =
|
|
118
|
+
export const AsyncQuery = Context.Reference<boolean>(
|
|
70
119
|
"@effect/sql-sqlite-react-native/Client/asyncQuery",
|
|
71
120
|
{ defaultValue: constFalse }
|
|
72
121
|
)
|
|
73
122
|
|
|
74
123
|
/**
|
|
124
|
+
* Runs an effect with `AsyncQuery` enabled, causing React Native SQLite queries in that effect to use the asynchronous driver API.
|
|
125
|
+
*
|
|
75
126
|
* @category fiber refs
|
|
76
|
-
* @since
|
|
127
|
+
* @since 4.0.0
|
|
77
128
|
*/
|
|
78
129
|
export const withAsyncQuery = <R, E, A>(effect: Effect.Effect<A, E, R>) =>
|
|
79
130
|
Effect.provideService(effect, AsyncQuery, true)
|
|
@@ -81,8 +132,10 @@ export const withAsyncQuery = <R, E, A>(effect: Effect.Effect<A, E, R>) =>
|
|
|
81
132
|
interface SqliteConnection extends Connection {}
|
|
82
133
|
|
|
83
134
|
/**
|
|
84
|
-
*
|
|
85
|
-
*
|
|
135
|
+
* Creates a scoped React Native SQLite client from the supplied configuration, using a single serialized connection and honoring `AsyncQuery` for query execution.
|
|
136
|
+
*
|
|
137
|
+
* @category constructors
|
|
138
|
+
* @since 4.0.0
|
|
86
139
|
*/
|
|
87
140
|
export const make = (
|
|
88
141
|
options: SqliteClientConfig
|
|
@@ -117,7 +170,8 @@ export const make = (
|
|
|
117
170
|
return Effect.map(
|
|
118
171
|
Effect.tryPromise({
|
|
119
172
|
try: () => db.execute(sql, params as Array<any>),
|
|
120
|
-
catch: (cause) =>
|
|
173
|
+
catch: (cause) =>
|
|
174
|
+
new SqlError({ reason: classifyError(cause, "Failed to execute statement (async)", "execute") })
|
|
121
175
|
}),
|
|
122
176
|
(result) => values ? result.rawRows ?? [] : result.rows
|
|
123
177
|
)
|
|
@@ -127,7 +181,7 @@ export const make = (
|
|
|
127
181
|
const result = db.executeSync(sql, params as Array<any>)
|
|
128
182
|
return values ? result.rawRows ?? [] : result.rows
|
|
129
183
|
},
|
|
130
|
-
catch: (cause) => new SqlError({ cause,
|
|
184
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
131
185
|
})
|
|
132
186
|
})
|
|
133
187
|
|
|
@@ -158,7 +212,7 @@ export const make = (
|
|
|
158
212
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection))
|
|
159
213
|
const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
|
|
160
214
|
const fiber = Fiber.getCurrent()!
|
|
161
|
-
const scope =
|
|
215
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope)
|
|
162
216
|
return Effect.as(
|
|
163
217
|
Effect.tap(
|
|
164
218
|
restore(semaphore.take(1)),
|
|
@@ -187,34 +241,38 @@ export const make = (
|
|
|
187
241
|
})
|
|
188
242
|
|
|
189
243
|
/**
|
|
244
|
+
* Builds a layer from an Effect `Config` value, providing both the React Native `SqliteClient` service and the generic `SqlClient` service.
|
|
245
|
+
*
|
|
190
246
|
* @category layers
|
|
191
|
-
* @since
|
|
247
|
+
* @since 4.0.0
|
|
192
248
|
*/
|
|
193
249
|
export const layerConfig = (
|
|
194
250
|
config: Config.Wrap<SqliteClientConfig>
|
|
195
251
|
): Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError> =>
|
|
196
|
-
Layer.
|
|
197
|
-
Config.unwrap(config).
|
|
252
|
+
Layer.effectContext(
|
|
253
|
+
Config.unwrap(config).pipe(
|
|
198
254
|
Effect.flatMap(make),
|
|
199
255
|
Effect.map((client) =>
|
|
200
|
-
|
|
201
|
-
|
|
256
|
+
Context.make(SqliteClient, client).pipe(
|
|
257
|
+
Context.add(Client.SqlClient, client)
|
|
202
258
|
)
|
|
203
259
|
)
|
|
204
260
|
)
|
|
205
261
|
).pipe(Layer.provide(Reactivity.layer))
|
|
206
262
|
|
|
207
263
|
/**
|
|
264
|
+
* Builds a layer from a React Native SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
265
|
+
*
|
|
208
266
|
* @category layers
|
|
209
|
-
* @since
|
|
267
|
+
* @since 4.0.0
|
|
210
268
|
*/
|
|
211
269
|
export const layer = (
|
|
212
270
|
config: SqliteClientConfig
|
|
213
271
|
): Layer.Layer<SqliteClient | Client.SqlClient> =>
|
|
214
|
-
Layer.
|
|
272
|
+
Layer.effectContext(
|
|
215
273
|
Effect.map(make(config), (client) =>
|
|
216
|
-
|
|
217
|
-
|
|
274
|
+
Context.make(SqliteClient, client).pipe(
|
|
275
|
+
Context.add(Client.SqlClient, client)
|
|
218
276
|
))
|
|
219
277
|
).pipe(Layer.provide(Reactivity.layer))
|
|
220
278
|
|
|
@@ -241,10 +299,6 @@ interface DB {
|
|
|
241
299
|
*
|
|
242
300
|
* If you are writing to the database YOU SHOULD BE USING TRANSACTIONS!
|
|
243
301
|
* Transactions protect you from partial writes and ensure that your data is always in a consistent state
|
|
244
|
-
*
|
|
245
|
-
* @param query
|
|
246
|
-
* @param params
|
|
247
|
-
* @returns QueryResult
|
|
248
302
|
*/
|
|
249
303
|
executeSync: (query: string, params?: Array<any>) => QueryResult
|
|
250
304
|
/**
|
|
@@ -262,10 +316,6 @@ interface DB {
|
|
|
262
316
|
* Transactions protect you from partial writes and ensure that your data is always in a consistent state
|
|
263
317
|
*
|
|
264
318
|
* If you need a large amount of queries ran as fast as possible you should be using `executeBatch`, `executeRaw`, `loadFile` or `executeWithHostObjects`
|
|
265
|
-
*
|
|
266
|
-
* @param query string of your SQL query
|
|
267
|
-
* @param params a list of parameters to bind to the query, if any
|
|
268
|
-
* @returns Promise<QueryResult> with the result of the query
|
|
269
319
|
*/
|
|
270
320
|
execute: (query: string, params?: Array<any>) => Promise<QueryResult>
|
|
271
321
|
/**
|
package/src/SqliteMigrator.ts
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Utilities for applying Effect SQL migrations to React Native SQLite databases.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides `run` and `layer` helpers that execute ordered migrations through the
|
|
6
|
+
* current React Native SQLite `SqlClient`. Use it when a mobile app needs to
|
|
7
|
+
* bring its on-device database schema up to date during startup, before opening
|
|
8
|
+
* repositories or sync services, or in integration tests that create app-local
|
|
9
|
+
* database files.
|
|
10
|
+
*
|
|
11
|
+
* React Native SQLite databases are scoped by the client configuration, so the
|
|
12
|
+
* migrator should be run with the same `filename`, `location`, and encryption
|
|
13
|
+
* key as the rest of the application. Migrations run through the package's
|
|
14
|
+
* single serialized connection; by default statements use the synchronous
|
|
15
|
+
* driver API and can block the JS thread, so long migration sets may want to run
|
|
16
|
+
* under `SqliteClient.withAsyncQuery`. Mobile upgrades can be interrupted by app
|
|
17
|
+
* suspension or process death, so keep migrations transaction-aware and avoid
|
|
18
|
+
* assuming a fresh database on every launch.
|
|
19
|
+
*
|
|
20
|
+
* @since 4.0.0
|
|
3
21
|
*/
|
|
4
22
|
import type * as Effect from "effect/Effect"
|
|
5
23
|
import * as Layer from "effect/Layer"
|
|
@@ -8,13 +26,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
|
|
|
8
26
|
import type { SqlError } from "effect/unstable/sql/SqlError"
|
|
9
27
|
|
|
10
28
|
/**
|
|
11
|
-
* @since
|
|
29
|
+
* @since 4.0.0
|
|
12
30
|
*/
|
|
13
31
|
export * from "effect/unstable/sql/Migrator"
|
|
14
32
|
|
|
15
33
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
34
|
+
* Runs SQL migrations for a React Native SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
35
|
+
*
|
|
36
|
+
* @category constructors
|
|
37
|
+
* @since 4.0.0
|
|
18
38
|
*/
|
|
19
39
|
export const run: <R>(
|
|
20
40
|
options: Migrator.MigratorOptions<R>
|
|
@@ -25,8 +45,10 @@ export const run: <R>(
|
|
|
25
45
|
> = Migrator.make({})
|
|
26
46
|
|
|
27
47
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
48
|
+
* Creates a layer that runs the configured React Native SQLite migrations during layer construction and provides no services.
|
|
49
|
+
*
|
|
50
|
+
* @category constructors
|
|
51
|
+
* @since 4.0.0
|
|
30
52
|
*/
|
|
31
53
|
export const layer = <R>(
|
|
32
54
|
options: Migrator.MigratorOptions<R>
|
package/src/index.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @since
|
|
2
|
+
* @since 4.0.0
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
// @barrel: Auto-generated exports. Do not edit manually.
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* @since
|
|
8
|
+
* @since 4.0.0
|
|
9
9
|
*/
|
|
10
10
|
export * as SqliteClient from "./SqliteClient.ts"
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
* @since
|
|
13
|
+
* @since 4.0.0
|
|
14
14
|
*/
|
|
15
15
|
export * as SqliteMigrator from "./SqliteMigrator.ts"
|