@effect/sql-sqlite-node 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 +32 -14
- package/dist/SqliteClient.d.ts.map +1 -1
- package/dist/SqliteClient.js +76 -27
- package/dist/SqliteClient.js.map +1 -1
- package/dist/SqliteMigrator.d.ts +43 -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 +5 -5
- package/src/SqliteClient.ts +94 -31
- package/src/SqliteMigrator.ts +43 -6
- package/src/index.ts +3 -3
package/dist/SqliteClient.d.ts
CHANGED
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
import * as Config from "effect/Config";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
2
3
|
import * as Duration from "effect/Duration";
|
|
3
4
|
import * as Effect from "effect/Effect";
|
|
4
5
|
import * as Layer from "effect/Layer";
|
|
5
6
|
import * as Scope from "effect/Scope";
|
|
6
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
7
7
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
8
8
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
9
9
|
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Runtime type identifier used to mark Node `SqliteClient` values.
|
|
12
|
+
*
|
|
13
|
+
* @category type IDs
|
|
14
|
+
* @since 4.0.0
|
|
13
15
|
*/
|
|
14
16
|
export declare const TypeId: TypeId;
|
|
15
17
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
+
* Type-level identifier used to mark Node `SqliteClient` values.
|
|
19
|
+
*
|
|
20
|
+
* @category type IDs
|
|
21
|
+
* @since 4.0.0
|
|
18
22
|
*/
|
|
19
23
|
export type TypeId = "~@effect/sql-sqlite-node/SqliteClient";
|
|
20
24
|
/**
|
|
25
|
+
* Node SQLite client service, extending `SqlClient` with database export, backup, and extension loading helpers. `updateValues` is not supported.
|
|
26
|
+
*
|
|
21
27
|
* @category models
|
|
22
|
-
* @since
|
|
28
|
+
* @since 4.0.0
|
|
23
29
|
*/
|
|
24
30
|
export interface SqliteClient extends Client.SqlClient {
|
|
25
31
|
readonly [TypeId]: TypeId;
|
|
@@ -31,21 +37,27 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
31
37
|
readonly updateValues: never;
|
|
32
38
|
}
|
|
33
39
|
/**
|
|
40
|
+
* Metadata returned from a Node SQLite backup operation, reporting total and remaining page counts.
|
|
41
|
+
*
|
|
34
42
|
* @category models
|
|
35
|
-
* @since
|
|
43
|
+
* @since 4.0.0
|
|
36
44
|
*/
|
|
37
45
|
export interface BackupMetadata {
|
|
38
46
|
readonly totalPages: number;
|
|
39
47
|
readonly remainingPages: number;
|
|
40
48
|
}
|
|
41
49
|
/**
|
|
50
|
+
* Context service tag for the node SQLite client implementation.
|
|
51
|
+
*
|
|
42
52
|
* @category tags
|
|
43
|
-
* @since
|
|
53
|
+
* @since 4.0.0
|
|
44
54
|
*/
|
|
45
|
-
export declare const SqliteClient:
|
|
55
|
+
export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
|
|
46
56
|
/**
|
|
57
|
+
* Configuration for a node SQLite client backed by `better-sqlite3`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
|
|
58
|
+
*
|
|
47
59
|
* @category models
|
|
48
|
-
* @since
|
|
60
|
+
* @since 4.0.0
|
|
49
61
|
*/
|
|
50
62
|
export interface SqliteClientConfig {
|
|
51
63
|
readonly filename: string;
|
|
@@ -58,18 +70,24 @@ export interface SqliteClientConfig {
|
|
|
58
70
|
readonly transformQueryNames?: ((str: string) => string) | undefined;
|
|
59
71
|
}
|
|
60
72
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
73
|
+
* Creates a scoped node SQLite client from the supplied configuration, using a single serialized connection with WAL enabled by default and exposing SQLite-specific `export`, `backup`, and `loadExtension` operations.
|
|
74
|
+
*
|
|
75
|
+
* @category constructors
|
|
76
|
+
* @since 4.0.0
|
|
63
77
|
*/
|
|
64
78
|
export declare const make: (options: SqliteClientConfig) => Effect.Effect<SqliteClient, never, Scope.Scope | Reactivity.Reactivity>;
|
|
65
79
|
/**
|
|
80
|
+
* Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.
|
|
81
|
+
*
|
|
66
82
|
* @category layers
|
|
67
|
-
* @since
|
|
83
|
+
* @since 4.0.0
|
|
68
84
|
*/
|
|
69
85
|
export declare const layerConfig: (config: Config.Wrap<SqliteClientConfig>) => Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError>;
|
|
70
86
|
/**
|
|
87
|
+
* Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
88
|
+
*
|
|
71
89
|
* @category layers
|
|
72
|
-
* @since
|
|
90
|
+
* @since 4.0.0
|
|
73
91
|
*/
|
|
74
92
|
export declare const layer: (config: SqliteClientConfig) => Layer.Layer<SqliteClient | Client.SqlClient>;
|
|
75
93
|
//# 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":"AA8CA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,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;AAEvD,OAAO,EAAuB,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAQ5E;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAAgD,CAAA;AAErE;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,uCAAuC,CAAA;AAE5D;;;;;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;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACpD,QAAQ,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;IACjF,QAAQ,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAEvE,8BAA8B;IAC9B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAA;CAC7B;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,6CAAwE,CAAA;AAEjG;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC9C,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAA;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;IAE7D,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;AAQD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CA6JrE,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,9 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Node.js SQLite driver for Effect SQL, backed by `better-sqlite3`.
|
|
3
|
+
*
|
|
4
|
+
* Use this module to provide a scoped {@link SqliteClient} for file-backed or
|
|
5
|
+
* in-memory SQLite databases in Node.js. The provided layers install both the
|
|
6
|
+
* SQLite-specific service and the generic `SqlClient`, making the module useful
|
|
7
|
+
* for local applications, tests, migrations, development tools, and embedded
|
|
8
|
+
* persistence that need Effect SQL query compilation with SQLite-specific
|
|
9
|
+
* operations.
|
|
10
|
+
*
|
|
11
|
+
* ## Mental model
|
|
12
|
+
*
|
|
13
|
+
* Each client owns one scoped `better-sqlite3` database handle and serializes
|
|
14
|
+
* all SQL access through it. Because `better-sqlite3` executes statements
|
|
15
|
+
* synchronously, a long-running query or transaction holds the serialized
|
|
16
|
+
* connection until it completes. Prepared statements are cached by SQL text and
|
|
17
|
+
* result-name transforms are applied after rows are read.
|
|
18
|
+
*
|
|
19
|
+
* The service adds Node SQLite capabilities on top of the generic `SqlClient`:
|
|
20
|
+
* database export, file backup, and native extension loading.
|
|
21
|
+
*
|
|
22
|
+
* ## Common tasks
|
|
23
|
+
*
|
|
24
|
+
* - Use {@link layer} with a concrete filename and options.
|
|
25
|
+
* - Use {@link layerConfig} when the filename or flags should come from
|
|
26
|
+
* `Config`.
|
|
27
|
+
* - Use {@link make} inside a custom scoped layer when you need to manage the
|
|
28
|
+
* client lifecycle directly.
|
|
29
|
+
* - Use `client.export`, `client.backup`, or `client.loadExtension` for
|
|
30
|
+
* operations that are specific to this Node SQLite driver.
|
|
31
|
+
*
|
|
32
|
+
* ## Gotchas
|
|
33
|
+
*
|
|
34
|
+
* WAL mode is enabled by default. Set `disableWAL` for read-only databases or
|
|
35
|
+
* when the database file or directory cannot be updated with SQLite WAL side
|
|
36
|
+
* files. Separate database handles or processes can still contend for SQLite
|
|
37
|
+
* write locks even though access through one client is serialized.
|
|
38
|
+
*
|
|
39
|
+
* Safe integer handling follows the generic `SqlClient` fiber-local setting.
|
|
40
|
+
* `executeStream` is not implemented for this driver, and SQLite does not
|
|
41
|
+
* support `updateValues`.
|
|
42
|
+
*
|
|
43
|
+
* @since 4.0.0
|
|
3
44
|
*/
|
|
4
45
|
import Sqlite from "better-sqlite3";
|
|
5
46
|
import * as Cache from "effect/Cache";
|
|
6
47
|
import * as Config from "effect/Config";
|
|
48
|
+
import * as Context from "effect/Context";
|
|
7
49
|
import * as Duration from "effect/Duration";
|
|
8
50
|
import * as Effect from "effect/Effect";
|
|
9
51
|
import * as Fiber from "effect/Fiber";
|
|
@@ -11,26 +53,35 @@ import { identity } from "effect/Function";
|
|
|
11
53
|
import * as Layer from "effect/Layer";
|
|
12
54
|
import * as Scope from "effect/Scope";
|
|
13
55
|
import * as Semaphore from "effect/Semaphore";
|
|
14
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
15
56
|
import * as Stream from "effect/Stream";
|
|
16
57
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
17
58
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
18
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
59
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
|
|
19
60
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
20
61
|
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
62
|
+
const classifyError = (cause, message, operation) => classifySqliteError(cause, {
|
|
63
|
+
message,
|
|
64
|
+
operation
|
|
65
|
+
});
|
|
21
66
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
67
|
+
* Runtime type identifier used to mark Node `SqliteClient` values.
|
|
68
|
+
*
|
|
69
|
+
* @category type IDs
|
|
70
|
+
* @since 4.0.0
|
|
24
71
|
*/
|
|
25
72
|
export const TypeId = "~@effect/sql-sqlite-node/SqliteClient";
|
|
26
73
|
/**
|
|
74
|
+
* Context service tag for the node SQLite client implementation.
|
|
75
|
+
*
|
|
27
76
|
* @category tags
|
|
28
|
-
* @since
|
|
77
|
+
* @since 4.0.0
|
|
29
78
|
*/
|
|
30
|
-
export const SqliteClient = /*#__PURE__*/
|
|
79
|
+
export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-node/SqliteClient");
|
|
31
80
|
/**
|
|
32
|
-
*
|
|
33
|
-
*
|
|
81
|
+
* Creates a scoped node SQLite client from the supplied configuration, using a single serialized connection with WAL enabled by default and exposing SQLite-specific `export`, `backup`, and `loadExtension` operations.
|
|
82
|
+
*
|
|
83
|
+
* @category constructors
|
|
84
|
+
* @since 4.0.0
|
|
34
85
|
*/
|
|
35
86
|
export const make = options => Effect.gen(function* () {
|
|
36
87
|
const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);
|
|
@@ -50,13 +101,12 @@ export const make = options => Effect.gen(function* () {
|
|
|
50
101
|
lookup: sql => Effect.try({
|
|
51
102
|
try: () => db.prepare(sql),
|
|
52
103
|
catch: cause => new SqlError({
|
|
53
|
-
cause,
|
|
54
|
-
message: "Failed to prepare statement "
|
|
104
|
+
reason: classifyError(cause, "Failed to prepare statement", "prepare")
|
|
55
105
|
})
|
|
56
106
|
})
|
|
57
107
|
});
|
|
58
108
|
const runStatement = (statement, params, raw) => Effect.withFiber(fiber => {
|
|
59
|
-
if (
|
|
109
|
+
if (Context.get(fiber.context, Client.SafeIntegers)) {
|
|
60
110
|
statement.safeIntegers(true);
|
|
61
111
|
}
|
|
62
112
|
try {
|
|
@@ -67,8 +117,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
67
117
|
return Effect.succeed(raw ? result : []);
|
|
68
118
|
} catch (cause) {
|
|
69
119
|
return Effect.fail(new SqlError({
|
|
70
|
-
cause,
|
|
71
|
-
message: "Failed to execute statement"
|
|
120
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
72
121
|
}));
|
|
73
122
|
}
|
|
74
123
|
});
|
|
@@ -83,8 +132,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
83
132
|
return [];
|
|
84
133
|
},
|
|
85
134
|
catch: cause => new SqlError({
|
|
86
|
-
cause,
|
|
87
|
-
message: "Failed to execute statement"
|
|
135
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
88
136
|
})
|
|
89
137
|
}), statement => Effect.sync(() => statement.reader && statement.raw(false)));
|
|
90
138
|
return identity({
|
|
@@ -107,16 +155,14 @@ export const make = options => Effect.gen(function* () {
|
|
|
107
155
|
export: Effect.try({
|
|
108
156
|
try: () => db.serialize(),
|
|
109
157
|
catch: cause => new SqlError({
|
|
110
|
-
cause,
|
|
111
|
-
message: "Failed to export database"
|
|
158
|
+
reason: classifyError(cause, "Failed to export database", "export")
|
|
112
159
|
})
|
|
113
160
|
}),
|
|
114
161
|
backup(destination) {
|
|
115
162
|
return Effect.tryPromise({
|
|
116
163
|
try: () => db.backup(destination),
|
|
117
164
|
catch: cause => new SqlError({
|
|
118
|
-
cause,
|
|
119
|
-
message: "Failed to backup database"
|
|
165
|
+
reason: classifyError(cause, "Failed to backup database", "backup")
|
|
120
166
|
})
|
|
121
167
|
});
|
|
122
168
|
},
|
|
@@ -124,8 +170,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
124
170
|
return Effect.try({
|
|
125
171
|
try: () => db.loadExtension(path),
|
|
126
172
|
catch: cause => new SqlError({
|
|
127
|
-
cause,
|
|
128
|
-
message: "Failed to load extension"
|
|
173
|
+
reason: classifyError(cause, "Failed to load extension", "loadExtension")
|
|
129
174
|
})
|
|
130
175
|
});
|
|
131
176
|
}
|
|
@@ -136,7 +181,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
136
181
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
|
|
137
182
|
const transactionAcquirer = Effect.uninterruptibleMask(restore => {
|
|
138
183
|
const fiber = Fiber.getCurrent();
|
|
139
|
-
const scope =
|
|
184
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope);
|
|
140
185
|
return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
141
186
|
});
|
|
142
187
|
return Object.assign(yield* Client.make({
|
|
@@ -154,13 +199,17 @@ export const make = options => Effect.gen(function* () {
|
|
|
154
199
|
});
|
|
155
200
|
});
|
|
156
201
|
/**
|
|
202
|
+
* Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.
|
|
203
|
+
*
|
|
157
204
|
* @category layers
|
|
158
|
-
* @since
|
|
205
|
+
* @since 4.0.0
|
|
159
206
|
*/
|
|
160
|
-
export const layerConfig = config => Layer.
|
|
207
|
+
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));
|
|
161
208
|
/**
|
|
209
|
+
* Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
210
|
+
*
|
|
162
211
|
* @category layers
|
|
163
|
-
* @since
|
|
212
|
+
* @since 4.0.0
|
|
164
213
|
*/
|
|
165
|
-
export const layer = config => Layer.
|
|
214
|
+
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));
|
|
166
215
|
//# sourceMappingURL=SqliteClient.js.map
|
package/dist/SqliteClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient.js","names":["Sqlite","Cache","Config","Duration","Effect","Fiber","identity","Layer","Scope","Semaphore","
|
|
1
|
+
{"version":3,"file":"SqliteClient.js","names":["Sqlite","Cache","Config","Context","Duration","Effect","Fiber","identity","Layer","Scope","Semaphore","Stream","Reactivity","Client","classifySqliteError","SqlError","Statement","ATTR_DB_SYSTEM_NAME","classifyError","cause","message","operation","TypeId","SqliteClient","Service","make","options","gen","compiler","makeCompilerSqlite","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","makeConnection","scope","db","filename","readonly","addFinalizer","sync","close","disableWAL","pragma","prepareCache","capacity","prepareCacheSize","timeToLive","prepareCacheTTL","minutes","lookup","sql","try","prepare","catch","reason","runStatement","statement","params","raw","withFiber","fiber","get","context","SafeIntegers","safeIntegers","reader","succeed","all","result","run","fail","flatMap","s","runValues","acquireUseRelease","execute","map","executeRaw","executeValues","executeUnprepared","effect","executeStream","_sql","_params","die","export","serialize","backup","destination","tryPromise","loadExtension","path","semaphore","connection","acquirer","withPermits","transactionAcquirer","uninterruptibleMask","restore","getCurrent","getUnsafe","as","tap","take","release","Object","assign","spanAttributes","entries","config","_","layerConfig","effectContext","unwrap","pipe","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,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Migration runner for Node.js SQLite databases managed by Effect SQL.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides {@link run} and {@link layer} adapters that execute ordered
|
|
6
|
+
* migrations through the current SQLite `SqlClient`. Use it during application
|
|
7
|
+
* startup, in tests that create temporary database files, or in layer graphs
|
|
8
|
+
* that must prepare a file-backed SQLite schema before dependent services are
|
|
9
|
+
* acquired.
|
|
10
|
+
*
|
|
11
|
+
* ## Mental model
|
|
12
|
+
*
|
|
13
|
+
* Migrations are loaded using the shared `<id>_<name>` file or record-key
|
|
14
|
+
* convention. Applied migrations are recorded in `effect_sql_migrations` by
|
|
15
|
+
* default, and only migrations with an id greater than the latest recorded id
|
|
16
|
+
* are executed. {@link layer} runs the same migration effect during layer
|
|
17
|
+
* construction and provides no services of its own.
|
|
18
|
+
*
|
|
19
|
+
* ## Common tasks
|
|
20
|
+
*
|
|
21
|
+
* - Use {@link run} when startup code should decide where migration execution
|
|
22
|
+
* fits in the application workflow.
|
|
23
|
+
* - Use {@link layer} when a layer graph should block dependent services until
|
|
24
|
+
* the SQLite schema is up to date.
|
|
25
|
+
* - Use the re-exported shared `Migrator` loaders for file-system migrations or
|
|
26
|
+
* in-memory migration records.
|
|
27
|
+
*
|
|
28
|
+
* ## Gotchas
|
|
29
|
+
*
|
|
30
|
+
* Every client involved in startup should point at the same SQLite filename so
|
|
31
|
+
* the recorded migration ids describe the database being used. Concurrent
|
|
32
|
+
* writers can surface SQLite lock timeout errors, and this adapter does not
|
|
33
|
+
* currently write SQLite schema dumps for `schemaDirectory`.
|
|
34
|
+
*
|
|
35
|
+
* @since 4.0.0
|
|
3
36
|
*/
|
|
4
37
|
import type * as Effect from "effect/Effect";
|
|
5
38
|
import * as Layer from "effect/Layer";
|
|
@@ -7,17 +40,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
|
|
|
7
40
|
import type * as Client from "effect/unstable/sql/SqlClient";
|
|
8
41
|
import type { SqlError } from "effect/unstable/sql/SqlError";
|
|
9
42
|
/**
|
|
10
|
-
* @since
|
|
43
|
+
* @since 4.0.0
|
|
11
44
|
*/
|
|
12
45
|
export * from "effect/unstable/sql/Migrator";
|
|
13
46
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
47
|
+
* Runs SQL migrations for a SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
48
|
+
*
|
|
49
|
+
* @category constructors
|
|
50
|
+
* @since 4.0.0
|
|
16
51
|
*/
|
|
17
52
|
export declare const run: <R2 = never>(options: Migrator.MigratorOptions<R2>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, Migrator.MigrationError | SqlError, Client.SqlClient | R2>;
|
|
18
53
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
54
|
+
* Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.
|
|
55
|
+
*
|
|
56
|
+
* @category constructors
|
|
57
|
+
* @since 4.0.0
|
|
21
58
|
*/
|
|
22
59
|
export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, Migrator.MigrationError | SqlError, Client.SqlClient | R>;
|
|
23
60
|
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;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,EAAE,GAAG,KAAK,EAC3B,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAClC,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClD,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,EAAE,CA2CrB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EACrB,SAAS,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CACZ,KAAK,EACL,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACgB,CAAA"}
|
package/dist/SqliteMigrator.js
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
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 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
|
// dumpSchema(path, table) {
|
|
@@ -52,8 +54,10 @@ export const run = /*#__PURE__*/Migrator.make({
|
|
|
52
54
|
// }
|
|
53
55
|
});
|
|
54
56
|
/**
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
+
* Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.
|
|
58
|
+
*
|
|
59
|
+
* @category constructors
|
|
60
|
+
* @since 4.0.0
|
|
57
61
|
*/
|
|
58
62
|
export const layer = options => Layer.effectDiscard(run(options));
|
|
59
63
|
//# 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":"AAqCA,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;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA,CACD,CAAC;AAEF;;;;;;AAMA,OAAO,MAAMC,KAAK,GAChBC,OAAoC,IAKjCL,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-node",
|
|
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",
|
|
@@ -44,14 +44,14 @@
|
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/better-sqlite3": "^7.6.13",
|
|
47
|
-
"@effect/platform-node": "^4.0.0-beta.
|
|
48
|
-
"effect": "^4.0.0-beta.
|
|
47
|
+
"@effect/platform-node": "^4.0.0-beta.71",
|
|
48
|
+
"effect": "^4.0.0-beta.71"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"effect": "^4.0.0-beta.
|
|
51
|
+
"effect": "^4.0.0-beta.71"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"better-sqlite3": "^12.
|
|
54
|
+
"better-sqlite3": "^12.9.0"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"codegen": "effect-utils codegen",
|
package/src/SqliteClient.ts
CHANGED
|
@@ -1,9 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Node.js SQLite driver for Effect SQL, backed by `better-sqlite3`.
|
|
3
|
+
*
|
|
4
|
+
* Use this module to provide a scoped {@link SqliteClient} for file-backed or
|
|
5
|
+
* in-memory SQLite databases in Node.js. The provided layers install both the
|
|
6
|
+
* SQLite-specific service and the generic `SqlClient`, making the module useful
|
|
7
|
+
* for local applications, tests, migrations, development tools, and embedded
|
|
8
|
+
* persistence that need Effect SQL query compilation with SQLite-specific
|
|
9
|
+
* operations.
|
|
10
|
+
*
|
|
11
|
+
* ## Mental model
|
|
12
|
+
*
|
|
13
|
+
* Each client owns one scoped `better-sqlite3` database handle and serializes
|
|
14
|
+
* all SQL access through it. Because `better-sqlite3` executes statements
|
|
15
|
+
* synchronously, a long-running query or transaction holds the serialized
|
|
16
|
+
* connection until it completes. Prepared statements are cached by SQL text and
|
|
17
|
+
* result-name transforms are applied after rows are read.
|
|
18
|
+
*
|
|
19
|
+
* The service adds Node SQLite capabilities on top of the generic `SqlClient`:
|
|
20
|
+
* database export, file backup, and native extension loading.
|
|
21
|
+
*
|
|
22
|
+
* ## Common tasks
|
|
23
|
+
*
|
|
24
|
+
* - Use {@link layer} with a concrete filename and options.
|
|
25
|
+
* - Use {@link layerConfig} when the filename or flags should come from
|
|
26
|
+
* `Config`.
|
|
27
|
+
* - Use {@link make} inside a custom scoped layer when you need to manage the
|
|
28
|
+
* client lifecycle directly.
|
|
29
|
+
* - Use `client.export`, `client.backup`, or `client.loadExtension` for
|
|
30
|
+
* operations that are specific to this Node SQLite driver.
|
|
31
|
+
*
|
|
32
|
+
* ## Gotchas
|
|
33
|
+
*
|
|
34
|
+
* WAL mode is enabled by default. Set `disableWAL` for read-only databases or
|
|
35
|
+
* when the database file or directory cannot be updated with SQLite WAL side
|
|
36
|
+
* files. Separate database handles or processes can still contend for SQLite
|
|
37
|
+
* write locks even though access through one client is serialized.
|
|
38
|
+
*
|
|
39
|
+
* Safe integer handling follows the generic `SqlClient` fiber-local setting.
|
|
40
|
+
* `executeStream` is not implemented for this driver, and SQLite does not
|
|
41
|
+
* support `updateValues`.
|
|
42
|
+
*
|
|
43
|
+
* @since 4.0.0
|
|
3
44
|
*/
|
|
4
45
|
import Sqlite from "better-sqlite3"
|
|
5
46
|
import * as Cache from "effect/Cache"
|
|
6
47
|
import * as Config from "effect/Config"
|
|
48
|
+
import * as Context from "effect/Context"
|
|
7
49
|
import * as Duration from "effect/Duration"
|
|
8
50
|
import * as Effect from "effect/Effect"
|
|
9
51
|
import * as Fiber from "effect/Fiber"
|
|
@@ -11,31 +53,39 @@ import { identity } from "effect/Function"
|
|
|
11
53
|
import * as Layer from "effect/Layer"
|
|
12
54
|
import * as Scope from "effect/Scope"
|
|
13
55
|
import * as Semaphore from "effect/Semaphore"
|
|
14
|
-
import * as ServiceMap from "effect/ServiceMap"
|
|
15
56
|
import * as Stream from "effect/Stream"
|
|
16
57
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
17
58
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
18
59
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
19
|
-
import { SqlError } from "effect/unstable/sql/SqlError"
|
|
60
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
|
|
20
61
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
21
62
|
|
|
22
63
|
const ATTR_DB_SYSTEM_NAME = "db.system.name"
|
|
23
64
|
|
|
65
|
+
const classifyError = (cause: unknown, message: string, operation: string) =>
|
|
66
|
+
classifySqliteError(cause, { message, operation })
|
|
67
|
+
|
|
24
68
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
69
|
+
* Runtime type identifier used to mark Node `SqliteClient` values.
|
|
70
|
+
*
|
|
71
|
+
* @category type IDs
|
|
72
|
+
* @since 4.0.0
|
|
27
73
|
*/
|
|
28
74
|
export const TypeId: TypeId = "~@effect/sql-sqlite-node/SqliteClient"
|
|
29
75
|
|
|
30
76
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
77
|
+
* Type-level identifier used to mark Node `SqliteClient` values.
|
|
78
|
+
*
|
|
79
|
+
* @category type IDs
|
|
80
|
+
* @since 4.0.0
|
|
33
81
|
*/
|
|
34
82
|
export type TypeId = "~@effect/sql-sqlite-node/SqliteClient"
|
|
35
83
|
|
|
36
84
|
/**
|
|
85
|
+
* Node SQLite client service, extending `SqlClient` with database export, backup, and extension loading helpers. `updateValues` is not supported.
|
|
86
|
+
*
|
|
37
87
|
* @category models
|
|
38
|
-
* @since
|
|
88
|
+
* @since 4.0.0
|
|
39
89
|
*/
|
|
40
90
|
export interface SqliteClient extends Client.SqlClient {
|
|
41
91
|
readonly [TypeId]: TypeId
|
|
@@ -49,8 +99,10 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
49
99
|
}
|
|
50
100
|
|
|
51
101
|
/**
|
|
102
|
+
* Metadata returned from a Node SQLite backup operation, reporting total and remaining page counts.
|
|
103
|
+
*
|
|
52
104
|
* @category models
|
|
53
|
-
* @since
|
|
105
|
+
* @since 4.0.0
|
|
54
106
|
*/
|
|
55
107
|
export interface BackupMetadata {
|
|
56
108
|
readonly totalPages: number
|
|
@@ -58,14 +110,18 @@ export interface BackupMetadata {
|
|
|
58
110
|
}
|
|
59
111
|
|
|
60
112
|
/**
|
|
113
|
+
* Context service tag for the node SQLite client implementation.
|
|
114
|
+
*
|
|
61
115
|
* @category tags
|
|
62
|
-
* @since
|
|
116
|
+
* @since 4.0.0
|
|
63
117
|
*/
|
|
64
|
-
export const SqliteClient =
|
|
118
|
+
export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-node/SqliteClient")
|
|
65
119
|
|
|
66
120
|
/**
|
|
121
|
+
* Configuration for a node SQLite client backed by `better-sqlite3`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
|
|
122
|
+
*
|
|
67
123
|
* @category models
|
|
68
|
-
* @since
|
|
124
|
+
* @since 4.0.0
|
|
69
125
|
*/
|
|
70
126
|
export interface SqliteClientConfig {
|
|
71
127
|
readonly filename: string
|
|
@@ -86,8 +142,10 @@ interface SqliteConnection extends Connection {
|
|
|
86
142
|
}
|
|
87
143
|
|
|
88
144
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
145
|
+
* Creates a scoped node SQLite client from the supplied configuration, using a single serialized connection with WAL enabled by default and exposing SQLite-specific `export`, `backup`, and `loadExtension` operations.
|
|
146
|
+
*
|
|
147
|
+
* @category constructors
|
|
148
|
+
* @since 4.0.0
|
|
91
149
|
*/
|
|
92
150
|
export const make = (
|
|
93
151
|
options: SqliteClientConfig
|
|
@@ -117,7 +175,7 @@ export const make = (
|
|
|
117
175
|
lookup: (sql: string) =>
|
|
118
176
|
Effect.try({
|
|
119
177
|
try: () => db.prepare(sql),
|
|
120
|
-
catch: (cause) => new SqlError({ cause,
|
|
178
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to prepare statement", "prepare") })
|
|
121
179
|
})
|
|
122
180
|
})
|
|
123
181
|
|
|
@@ -127,7 +185,7 @@ export const make = (
|
|
|
127
185
|
raw: boolean
|
|
128
186
|
) =>
|
|
129
187
|
Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {
|
|
130
|
-
if (
|
|
188
|
+
if (Context.get(fiber.context, Client.SafeIntegers)) {
|
|
131
189
|
statement.safeIntegers(true)
|
|
132
190
|
}
|
|
133
191
|
try {
|
|
@@ -137,7 +195,7 @@ export const make = (
|
|
|
137
195
|
const result = statement.run(...params)
|
|
138
196
|
return Effect.succeed(raw ? result as unknown as ReadonlyArray<any> : [])
|
|
139
197
|
} catch (cause) {
|
|
140
|
-
return Effect.fail(new SqlError({ cause,
|
|
198
|
+
return Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") }))
|
|
141
199
|
}
|
|
142
200
|
})
|
|
143
201
|
|
|
@@ -169,7 +227,7 @@ export const make = (
|
|
|
169
227
|
statement.run(...params)
|
|
170
228
|
return []
|
|
171
229
|
},
|
|
172
|
-
catch: (cause) => new SqlError({ cause,
|
|
230
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
173
231
|
}),
|
|
174
232
|
(statement) => Effect.sync(() => statement.reader && statement.raw(false))
|
|
175
233
|
)
|
|
@@ -195,18 +253,19 @@ export const make = (
|
|
|
195
253
|
},
|
|
196
254
|
export: Effect.try({
|
|
197
255
|
try: () => db.serialize(),
|
|
198
|
-
catch: (cause) => new SqlError({ cause,
|
|
256
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to export database", "export") })
|
|
199
257
|
}),
|
|
200
258
|
backup(destination) {
|
|
201
259
|
return Effect.tryPromise({
|
|
202
260
|
try: () => db.backup(destination),
|
|
203
|
-
catch: (cause) => new SqlError({ cause,
|
|
261
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to backup database", "backup") })
|
|
204
262
|
})
|
|
205
263
|
},
|
|
206
264
|
loadExtension(path) {
|
|
207
265
|
return Effect.try({
|
|
208
266
|
try: () => db.loadExtension(path),
|
|
209
|
-
catch: (cause) =>
|
|
267
|
+
catch: (cause) =>
|
|
268
|
+
new SqlError({ reason: classifyError(cause, "Failed to load extension", "loadExtension") })
|
|
210
269
|
})
|
|
211
270
|
}
|
|
212
271
|
})
|
|
@@ -218,7 +277,7 @@ export const make = (
|
|
|
218
277
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection))
|
|
219
278
|
const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
|
|
220
279
|
const fiber = Fiber.getCurrent()!
|
|
221
|
-
const scope =
|
|
280
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope)
|
|
222
281
|
return Effect.as(
|
|
223
282
|
Effect.tap(
|
|
224
283
|
restore(semaphore.take(1)),
|
|
@@ -250,33 +309,37 @@ export const make = (
|
|
|
250
309
|
})
|
|
251
310
|
|
|
252
311
|
/**
|
|
312
|
+
* Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.
|
|
313
|
+
*
|
|
253
314
|
* @category layers
|
|
254
|
-
* @since
|
|
315
|
+
* @since 4.0.0
|
|
255
316
|
*/
|
|
256
317
|
export const layerConfig = (
|
|
257
318
|
config: Config.Wrap<SqliteClientConfig>
|
|
258
319
|
): Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError> =>
|
|
259
|
-
Layer.
|
|
260
|
-
Config.unwrap(config).
|
|
320
|
+
Layer.effectContext(
|
|
321
|
+
Config.unwrap(config).pipe(
|
|
261
322
|
Effect.flatMap(make),
|
|
262
323
|
Effect.map((client) =>
|
|
263
|
-
|
|
264
|
-
|
|
324
|
+
Context.make(SqliteClient, client).pipe(
|
|
325
|
+
Context.add(Client.SqlClient, client)
|
|
265
326
|
)
|
|
266
327
|
)
|
|
267
328
|
)
|
|
268
329
|
).pipe(Layer.provide(Reactivity.layer))
|
|
269
330
|
|
|
270
331
|
/**
|
|
332
|
+
* Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
333
|
+
*
|
|
271
334
|
* @category layers
|
|
272
|
-
* @since
|
|
335
|
+
* @since 4.0.0
|
|
273
336
|
*/
|
|
274
337
|
export const layer = (
|
|
275
338
|
config: SqliteClientConfig
|
|
276
339
|
): Layer.Layer<SqliteClient | Client.SqlClient> =>
|
|
277
|
-
Layer.
|
|
340
|
+
Layer.effectContext(
|
|
278
341
|
Effect.map(make(config), (client) =>
|
|
279
|
-
|
|
280
|
-
|
|
342
|
+
Context.make(SqliteClient, client).pipe(
|
|
343
|
+
Context.add(Client.SqlClient, client)
|
|
281
344
|
))
|
|
282
345
|
).pipe(Layer.provide(Reactivity.layer))
|
package/src/SqliteMigrator.ts
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Migration runner for Node.js SQLite databases managed by Effect SQL.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides {@link run} and {@link layer} adapters that execute ordered
|
|
6
|
+
* migrations through the current SQLite `SqlClient`. Use it during application
|
|
7
|
+
* startup, in tests that create temporary database files, or in layer graphs
|
|
8
|
+
* that must prepare a file-backed SQLite schema before dependent services are
|
|
9
|
+
* acquired.
|
|
10
|
+
*
|
|
11
|
+
* ## Mental model
|
|
12
|
+
*
|
|
13
|
+
* Migrations are loaded using the shared `<id>_<name>` file or record-key
|
|
14
|
+
* convention. Applied migrations are recorded in `effect_sql_migrations` by
|
|
15
|
+
* default, and only migrations with an id greater than the latest recorded id
|
|
16
|
+
* are executed. {@link layer} runs the same migration effect during layer
|
|
17
|
+
* construction and provides no services of its own.
|
|
18
|
+
*
|
|
19
|
+
* ## Common tasks
|
|
20
|
+
*
|
|
21
|
+
* - Use {@link run} when startup code should decide where migration execution
|
|
22
|
+
* fits in the application workflow.
|
|
23
|
+
* - Use {@link layer} when a layer graph should block dependent services until
|
|
24
|
+
* the SQLite schema is up to date.
|
|
25
|
+
* - Use the re-exported shared `Migrator` loaders for file-system migrations or
|
|
26
|
+
* in-memory migration records.
|
|
27
|
+
*
|
|
28
|
+
* ## Gotchas
|
|
29
|
+
*
|
|
30
|
+
* Every client involved in startup should point at the same SQLite filename so
|
|
31
|
+
* the recorded migration ids describe the database being used. Concurrent
|
|
32
|
+
* writers can surface SQLite lock timeout errors, and this adapter does not
|
|
33
|
+
* currently write SQLite schema dumps for `schemaDirectory`.
|
|
34
|
+
*
|
|
35
|
+
* @since 4.0.0
|
|
3
36
|
*/
|
|
4
37
|
import type * as Effect from "effect/Effect"
|
|
5
38
|
import * as Layer from "effect/Layer"
|
|
@@ -8,13 +41,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
|
|
|
8
41
|
import type { SqlError } from "effect/unstable/sql/SqlError"
|
|
9
42
|
|
|
10
43
|
/**
|
|
11
|
-
* @since
|
|
44
|
+
* @since 4.0.0
|
|
12
45
|
*/
|
|
13
46
|
export * from "effect/unstable/sql/Migrator"
|
|
14
47
|
|
|
15
48
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
49
|
+
* Runs SQL migrations for a SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
50
|
+
*
|
|
51
|
+
* @category constructors
|
|
52
|
+
* @since 4.0.0
|
|
18
53
|
*/
|
|
19
54
|
export const run: <R2 = never>(
|
|
20
55
|
options: Migrator.MigratorOptions<R2>
|
|
@@ -67,8 +102,10 @@ export const run: <R2 = never>(
|
|
|
67
102
|
})
|
|
68
103
|
|
|
69
104
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
105
|
+
* Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.
|
|
106
|
+
*
|
|
107
|
+
* @category constructors
|
|
108
|
+
* @since 4.0.0
|
|
72
109
|
*/
|
|
73
110
|
export const layer = <R>(
|
|
74
111
|
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"
|