@effect/sql-sqlite-bun 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 +29 -13
- package/dist/SqliteClient.d.ts.map +1 -1
- package/dist/SqliteClient.js +77 -24
- package/dist/SqliteClient.js.map +1 -1
- package/dist/SqliteMigrator.d.ts +30 -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 +92 -29
- package/src/SqliteMigrator.ts +30 -6
- package/src/index.ts +3 -3
package/dist/SqliteClient.d.ts
CHANGED
|
@@ -1,24 +1,30 @@
|
|
|
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
|
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Runtime type identifier used to mark Bun `SqliteClient` values.
|
|
11
|
+
*
|
|
12
|
+
* @category type IDs
|
|
13
|
+
* @since 4.0.0
|
|
12
14
|
*/
|
|
13
15
|
export declare const TypeId: TypeId;
|
|
14
16
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
+
* Type-level identifier used to mark Bun `SqliteClient` values.
|
|
18
|
+
*
|
|
19
|
+
* @category type IDs
|
|
20
|
+
* @since 4.0.0
|
|
17
21
|
*/
|
|
18
22
|
export type TypeId = "~@effect/sql-sqlite-bun/SqliteClient";
|
|
19
23
|
/**
|
|
24
|
+
* Bun SQLite client service, extending `SqlClient` with database export and extension loading helpers. `updateValues` is not supported.
|
|
25
|
+
*
|
|
20
26
|
* @category models
|
|
21
|
-
* @since
|
|
27
|
+
* @since 4.0.0
|
|
22
28
|
*/
|
|
23
29
|
export interface SqliteClient extends Client.SqlClient {
|
|
24
30
|
readonly [TypeId]: TypeId;
|
|
@@ -29,13 +35,17 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
29
35
|
readonly updateValues: never;
|
|
30
36
|
}
|
|
31
37
|
/**
|
|
38
|
+
* Context tag used to access the Bun `SqliteClient` service.
|
|
39
|
+
*
|
|
32
40
|
* @category tags
|
|
33
|
-
* @since
|
|
41
|
+
* @since 4.0.0
|
|
34
42
|
*/
|
|
35
|
-
export declare const SqliteClient:
|
|
43
|
+
export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
|
|
36
44
|
/**
|
|
45
|
+
* Configuration for a Bun SQLite client, including filename, open mode flags, WAL behavior, span attributes, and query/result name transforms.
|
|
46
|
+
*
|
|
37
47
|
* @category models
|
|
38
|
-
* @since
|
|
48
|
+
* @since 4.0.0
|
|
39
49
|
*/
|
|
40
50
|
export interface SqliteClientConfig {
|
|
41
51
|
readonly filename: string;
|
|
@@ -48,18 +58,24 @@ export interface SqliteClientConfig {
|
|
|
48
58
|
readonly transformQueryNames?: ((str: string) => string) | undefined;
|
|
49
59
|
}
|
|
50
60
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
61
|
+
* Creates a scoped Bun SQLite client for a database file, enabling WAL by default and serializing access. Streaming queries are not implemented.
|
|
62
|
+
*
|
|
63
|
+
* @category constructors
|
|
64
|
+
* @since 4.0.0
|
|
53
65
|
*/
|
|
54
66
|
export declare const make: (options: SqliteClientConfig) => Effect.Effect<SqliteClient, never, Scope.Scope | Reactivity.Reactivity>;
|
|
55
67
|
/**
|
|
68
|
+
* Creates a layer from a `Config`-wrapped Bun SQLite client configuration, providing both `SqliteClient` and `SqlClient`.
|
|
69
|
+
*
|
|
56
70
|
* @category layers
|
|
57
|
-
* @since
|
|
71
|
+
* @since 4.0.0
|
|
58
72
|
*/
|
|
59
73
|
export declare const layerConfig: (config: Config.Wrap<SqliteClientConfig>) => Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError>;
|
|
60
74
|
/**
|
|
75
|
+
* Creates a layer from a concrete Bun SQLite client configuration, providing both `SqliteClient` and `SqlClient`.
|
|
76
|
+
*
|
|
61
77
|
* @category layers
|
|
62
|
-
* @since
|
|
78
|
+
* @since 4.0.0
|
|
63
79
|
*/
|
|
64
80
|
export declare const layer: (config: SqliteClientConfig) => Layer.Layer<SqliteClient | Client.SqlClient>;
|
|
65
81
|
//# 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":"AA+CA,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;AAEvD,OAAO,EAAuB,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AAQ5E;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,MAA+C,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,MAAM,MAAM,GAAG,sCAAsC,CAAA;AAE3D;;;;;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,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,eAAO,MAAM,YAAY,6CAAiE,CAAA;AAE1F;;;;;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,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAEzC,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;AAOD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GACf,SAAS,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CAsHrE,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,34 +1,87 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Bun SQLite client implementation for Effect SQL, backed by `bun:sqlite`.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the Bun-specific SQLite driver used by Effect SQL. It
|
|
5
|
+
* can create a scoped {@link SqliteClient} directly with {@link make}, or
|
|
6
|
+
* provide both the SQLite-specific client and the generic `SqlClient` service
|
|
7
|
+
* with {@link layer} or {@link layerConfig}. It is intended for Bun
|
|
8
|
+
* applications, local tools, migrations, integration tests, and embedded
|
|
9
|
+
* persistence that use file-backed or in-memory SQLite databases.
|
|
10
|
+
*
|
|
11
|
+
* ## Mental model
|
|
12
|
+
*
|
|
13
|
+
* A client owns one scoped `bun:sqlite` `Database` handle. Because Bun's SQLite
|
|
14
|
+
* API executes statements synchronously, this implementation serializes access
|
|
15
|
+
* to that handle. A transaction keeps the serialized connection permit for the
|
|
16
|
+
* transaction scope, so other fibers using the same client wait until the
|
|
17
|
+
* transaction completes.
|
|
18
|
+
*
|
|
19
|
+
* The client uses the Effect SQL statement compiler and result-name transforms,
|
|
20
|
+
* then adds SQLite-specific capabilities such as database export and native
|
|
21
|
+
* extension loading.
|
|
22
|
+
*
|
|
23
|
+
* ## Common tasks
|
|
24
|
+
*
|
|
25
|
+
* - Use {@link layer} when a Bun service should provide both `SqliteClient` and
|
|
26
|
+
* the generic `SqlClient` from a concrete configuration.
|
|
27
|
+
* - Use {@link layerConfig} when the filename or open flags should come from
|
|
28
|
+
* Effect `Config`.
|
|
29
|
+
* - Use {@link make} inside a custom scoped layer when the surrounding runtime
|
|
30
|
+
* needs to manage the client lifecycle explicitly.
|
|
31
|
+
* - Use `client.export` to serialize the database, or `client.loadExtension` to
|
|
32
|
+
* load a native SQLite extension.
|
|
33
|
+
*
|
|
34
|
+
* ## Gotchas
|
|
35
|
+
*
|
|
36
|
+
* WAL mode is enabled by default. Set `disableWAL` for read-only databases or
|
|
37
|
+
* when the database file or directory cannot be updated with SQLite WAL side
|
|
38
|
+
* files. Separate database handles or processes can still contend for SQLite
|
|
39
|
+
* write locks even though access through a single client is serialized.
|
|
40
|
+
*
|
|
41
|
+
* Safe integer handling follows the generic `SqlClient` fiber-local setting.
|
|
42
|
+
* `executeStream` is not implemented for this driver, and SQLite does not
|
|
43
|
+
* support `updateValues`.
|
|
44
|
+
*
|
|
45
|
+
* @since 4.0.0
|
|
3
46
|
*/
|
|
4
47
|
import { Database } from "bun:sqlite";
|
|
5
48
|
import * as Config from "effect/Config";
|
|
49
|
+
import * as Context from "effect/Context";
|
|
6
50
|
import * as Effect from "effect/Effect";
|
|
7
51
|
import * as Fiber from "effect/Fiber";
|
|
8
52
|
import { identity } from "effect/Function";
|
|
9
53
|
import * as Layer from "effect/Layer";
|
|
10
54
|
import * as Scope from "effect/Scope";
|
|
11
55
|
import * as Semaphore from "effect/Semaphore";
|
|
12
|
-
import * as ServiceMap from "effect/ServiceMap";
|
|
13
56
|
import * as Stream from "effect/Stream";
|
|
14
57
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
15
58
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
16
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
59
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
|
|
17
60
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
18
61
|
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
62
|
+
const classifyError = (cause, message, operation) => classifySqliteError(cause, {
|
|
63
|
+
message,
|
|
64
|
+
operation
|
|
65
|
+
});
|
|
19
66
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
67
|
+
* Runtime type identifier used to mark Bun `SqliteClient` values.
|
|
68
|
+
*
|
|
69
|
+
* @category type IDs
|
|
70
|
+
* @since 4.0.0
|
|
22
71
|
*/
|
|
23
72
|
export const TypeId = "~@effect/sql-sqlite-bun/SqliteClient";
|
|
24
73
|
/**
|
|
74
|
+
* Context tag used to access the Bun `SqliteClient` service.
|
|
75
|
+
*
|
|
25
76
|
* @category tags
|
|
26
|
-
* @since
|
|
77
|
+
* @since 4.0.0
|
|
27
78
|
*/
|
|
28
|
-
export const SqliteClient = /*#__PURE__*/
|
|
79
|
+
export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-bun/Client");
|
|
29
80
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
81
|
+
* Creates a scoped Bun SQLite client for a database file, enabling WAL by default and serializing access. Streaming queries are not implemented.
|
|
82
|
+
*
|
|
83
|
+
* @category constructors
|
|
84
|
+
* @since 4.0.0
|
|
32
85
|
*/
|
|
33
86
|
export const make = options => Effect.gen(function* () {
|
|
34
87
|
const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);
|
|
@@ -45,29 +98,27 @@ export const make = options => Effect.gen(function* () {
|
|
|
45
98
|
}
|
|
46
99
|
const run = (sql, params = []) => Effect.withFiber(fiber => {
|
|
47
100
|
const statement = db.query(sql);
|
|
48
|
-
const useSafeIntegers =
|
|
101
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
|
|
49
102
|
// @ts-ignore bun-types missing safeIntegers method, fixed in https://github.com/oven-sh/bun/pull/26627
|
|
50
103
|
statement.safeIntegers(useSafeIntegers);
|
|
51
104
|
try {
|
|
52
105
|
return Effect.succeed(statement.all(...params) ?? []);
|
|
53
106
|
} catch (cause) {
|
|
54
107
|
return Effect.fail(new SqlError({
|
|
55
|
-
cause,
|
|
56
|
-
message: "Failed to execute statement"
|
|
108
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
57
109
|
}));
|
|
58
110
|
}
|
|
59
111
|
});
|
|
60
112
|
const runValues = (sql, params = []) => Effect.withFiber(fiber => {
|
|
61
113
|
const statement = db.query(sql);
|
|
62
|
-
const useSafeIntegers =
|
|
114
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
|
|
63
115
|
// @ts-ignore bun-types missing safeIntegers method, fixed in https://github.com/oven-sh/bun/pull/26627
|
|
64
116
|
statement.safeIntegers(useSafeIntegers);
|
|
65
117
|
try {
|
|
66
118
|
return Effect.succeed(statement.values(...params) ?? []);
|
|
67
119
|
} catch (cause) {
|
|
68
120
|
return Effect.fail(new SqlError({
|
|
69
|
-
cause,
|
|
70
|
-
message: "Failed to execute statement"
|
|
121
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
71
122
|
}));
|
|
72
123
|
}
|
|
73
124
|
});
|
|
@@ -90,15 +141,13 @@ export const make = options => Effect.gen(function* () {
|
|
|
90
141
|
export: Effect.try({
|
|
91
142
|
try: () => db.serialize(),
|
|
92
143
|
catch: cause => new SqlError({
|
|
93
|
-
cause,
|
|
94
|
-
message: "Failed to export database"
|
|
144
|
+
reason: classifyError(cause, "Failed to export database", "export")
|
|
95
145
|
})
|
|
96
146
|
}),
|
|
97
147
|
loadExtension: path => Effect.try({
|
|
98
148
|
try: () => db.loadExtension(path),
|
|
99
149
|
catch: cause => new SqlError({
|
|
100
|
-
cause,
|
|
101
|
-
message: "Failed to load extension"
|
|
150
|
+
reason: classifyError(cause, "Failed to load extension", "loadExtension")
|
|
102
151
|
})
|
|
103
152
|
})
|
|
104
153
|
});
|
|
@@ -108,7 +157,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
108
157
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
|
|
109
158
|
const transactionAcquirer = Effect.uninterruptibleMask(restore => {
|
|
110
159
|
const fiber = Fiber.getCurrent();
|
|
111
|
-
const scope =
|
|
160
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope);
|
|
112
161
|
return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
113
162
|
});
|
|
114
163
|
return Object.assign(yield* Client.make({
|
|
@@ -125,13 +174,17 @@ export const make = options => Effect.gen(function* () {
|
|
|
125
174
|
});
|
|
126
175
|
});
|
|
127
176
|
/**
|
|
177
|
+
* Creates a layer from a `Config`-wrapped Bun SQLite client configuration, providing both `SqliteClient` and `SqlClient`.
|
|
178
|
+
*
|
|
128
179
|
* @category layers
|
|
129
|
-
* @since
|
|
180
|
+
* @since 4.0.0
|
|
130
181
|
*/
|
|
131
|
-
export const layerConfig = config => Layer.
|
|
182
|
+
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));
|
|
132
183
|
/**
|
|
184
|
+
* Creates a layer from a concrete Bun SQLite client configuration, providing both `SqliteClient` and `SqlClient`.
|
|
185
|
+
*
|
|
133
186
|
* @category layers
|
|
134
|
-
* @since
|
|
187
|
+
* @since 4.0.0
|
|
135
188
|
*/
|
|
136
|
-
export const layer = config => Layer.
|
|
189
|
+
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));
|
|
137
190
|
//# sourceMappingURL=SqliteClient.js.map
|
package/dist/SqliteClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient.js","names":["Database","Config","Effect","Fiber","identity","Layer","Scope","Semaphore","
|
|
1
|
+
{"version":3,"file":"SqliteClient.js","names":["Database","Config","Context","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","db","filename","readonly","readwrite","create","addFinalizer","sync","close","disableWAL","run","sql","params","withFiber","fiber","statement","query","useSafeIntegers","get","context","SafeIntegers","safeIntegers","succeed","all","fail","reason","runValues","values","execute","map","executeRaw","executeValues","executeUnprepared","executeStream","_sql","_params","die","export","try","serialize","catch","loadExtension","path","semaphore","connection","acquirer","withPermits","transactionAcquirer","uninterruptibleMask","restore","getCurrent","scope","getUnsafe","as","tap","take","release","Object","assign","spanAttributes","entries","config","flatMap","_","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,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Utilities for applying Effect SQL migrations to Bun SQLite databases.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides `run` and `layer` helpers for applying ordered migrations through
|
|
6
|
+
* the current Bun-backed SQLite `SqlClient`. It is typically used at
|
|
7
|
+
* application startup, in deployment or setup scripts that prepare a local
|
|
8
|
+
* SQLite file, in integration tests with temporary database files, or in layer
|
|
9
|
+
* graphs that must install the schema before dependent services are acquired.
|
|
10
|
+
*
|
|
11
|
+
* Migrations are recorded in `effect_sql_migrations` by default and are loaded
|
|
12
|
+
* using the shared `<id>_<name>` file or record-key convention. Only migrations
|
|
13
|
+
* with an id greater than the latest recorded id are applied, so every client
|
|
14
|
+
* involved in startup should point at the same SQLite filename and use a
|
|
15
|
+
* writable Bun SQLite configuration. The Bun client enables WAL by default and
|
|
16
|
+
* serializes access through a single `bun:sqlite` database handle, but separate
|
|
17
|
+
* handles or processes can still contend for SQLite write locks. Bun's SQLite
|
|
18
|
+
* driver runs statements synchronously, so large migration sets can block the
|
|
19
|
+
* invoking runtime thread, and this adapter does not currently write SQLite
|
|
20
|
+
* schema dumps for `schemaDirectory`.
|
|
21
|
+
*
|
|
22
|
+
* @since 4.0.0
|
|
3
23
|
*/
|
|
4
24
|
import type * as Effect from "effect/Effect";
|
|
5
25
|
import * as Layer from "effect/Layer";
|
|
@@ -7,17 +27,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
|
|
|
7
27
|
import type * as Client from "effect/unstable/sql/SqlClient";
|
|
8
28
|
import type { SqlError } from "effect/unstable/sql/SqlError";
|
|
9
29
|
/**
|
|
10
|
-
* @since
|
|
30
|
+
* @since 4.0.0
|
|
11
31
|
*/
|
|
12
32
|
export * from "effect/unstable/sql/Migrator";
|
|
13
33
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
34
|
+
* Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
|
|
35
|
+
*
|
|
36
|
+
* @category constructors
|
|
37
|
+
* @since 4.0.0
|
|
16
38
|
*/
|
|
17
39
|
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
40
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
41
|
+
* Creates a layer that runs the configured SQL migrations during layer construction.
|
|
42
|
+
*
|
|
43
|
+
* @category constructors
|
|
44
|
+
* @since 4.0.0
|
|
21
45
|
*/
|
|
22
46
|
export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, SqlError | Migrator.MigrationError, Client.SqlClient | R>;
|
|
23
47
|
//# 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;;;;;;;;;;;;;;;;;;;;;;GAsBG;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,GAAG,QAAQ,CAAC,cAAc,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 using the configured `SqlClient`, returning the migrations that were applied.
|
|
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 SQL migrations during layer construction.
|
|
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":"AAwBA,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-bun",
|
|
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
|
-
"@types/bun": "^1.3.
|
|
47
|
-
"@effect/platform-bun": "^4.0.0-beta.
|
|
48
|
-
"effect": "^4.0.0-beta.
|
|
46
|
+
"@types/bun": "^1.3.13",
|
|
47
|
+
"@effect/platform-bun": "^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
|
"scripts": {
|
|
54
54
|
"codegen": "effect-utils codegen",
|
package/src/SqliteClient.ts
CHANGED
|
@@ -1,39 +1,91 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Bun SQLite client implementation for Effect SQL, backed by `bun:sqlite`.
|
|
3
|
+
*
|
|
4
|
+
* This module provides the Bun-specific SQLite driver used by Effect SQL. It
|
|
5
|
+
* can create a scoped {@link SqliteClient} directly with {@link make}, or
|
|
6
|
+
* provide both the SQLite-specific client and the generic `SqlClient` service
|
|
7
|
+
* with {@link layer} or {@link layerConfig}. It is intended for Bun
|
|
8
|
+
* applications, local tools, migrations, integration tests, and embedded
|
|
9
|
+
* persistence that use file-backed or in-memory SQLite databases.
|
|
10
|
+
*
|
|
11
|
+
* ## Mental model
|
|
12
|
+
*
|
|
13
|
+
* A client owns one scoped `bun:sqlite` `Database` handle. Because Bun's SQLite
|
|
14
|
+
* API executes statements synchronously, this implementation serializes access
|
|
15
|
+
* to that handle. A transaction keeps the serialized connection permit for the
|
|
16
|
+
* transaction scope, so other fibers using the same client wait until the
|
|
17
|
+
* transaction completes.
|
|
18
|
+
*
|
|
19
|
+
* The client uses the Effect SQL statement compiler and result-name transforms,
|
|
20
|
+
* then adds SQLite-specific capabilities such as database export and native
|
|
21
|
+
* extension loading.
|
|
22
|
+
*
|
|
23
|
+
* ## Common tasks
|
|
24
|
+
*
|
|
25
|
+
* - Use {@link layer} when a Bun service should provide both `SqliteClient` and
|
|
26
|
+
* the generic `SqlClient` from a concrete configuration.
|
|
27
|
+
* - Use {@link layerConfig} when the filename or open flags should come from
|
|
28
|
+
* Effect `Config`.
|
|
29
|
+
* - Use {@link make} inside a custom scoped layer when the surrounding runtime
|
|
30
|
+
* needs to manage the client lifecycle explicitly.
|
|
31
|
+
* - Use `client.export` to serialize the database, or `client.loadExtension` to
|
|
32
|
+
* load a native SQLite extension.
|
|
33
|
+
*
|
|
34
|
+
* ## Gotchas
|
|
35
|
+
*
|
|
36
|
+
* WAL mode is enabled by default. Set `disableWAL` for read-only databases or
|
|
37
|
+
* when the database file or directory cannot be updated with SQLite WAL side
|
|
38
|
+
* files. Separate database handles or processes can still contend for SQLite
|
|
39
|
+
* write locks even though access through a single client is serialized.
|
|
40
|
+
*
|
|
41
|
+
* Safe integer handling follows the generic `SqlClient` fiber-local setting.
|
|
42
|
+
* `executeStream` is not implemented for this driver, and SQLite does not
|
|
43
|
+
* support `updateValues`.
|
|
44
|
+
*
|
|
45
|
+
* @since 4.0.0
|
|
3
46
|
*/
|
|
4
47
|
import { Database } from "bun:sqlite"
|
|
5
48
|
import * as Config from "effect/Config"
|
|
49
|
+
import * as Context from "effect/Context"
|
|
6
50
|
import * as Effect from "effect/Effect"
|
|
7
51
|
import * as Fiber from "effect/Fiber"
|
|
8
52
|
import { identity } from "effect/Function"
|
|
9
53
|
import * as Layer from "effect/Layer"
|
|
10
54
|
import * as Scope from "effect/Scope"
|
|
11
55
|
import * as Semaphore from "effect/Semaphore"
|
|
12
|
-
import * as ServiceMap from "effect/ServiceMap"
|
|
13
56
|
import * as Stream from "effect/Stream"
|
|
14
57
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
15
58
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
16
59
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
17
|
-
import { SqlError } from "effect/unstable/sql/SqlError"
|
|
60
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
|
|
18
61
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
19
62
|
|
|
20
63
|
const ATTR_DB_SYSTEM_NAME = "db.system.name"
|
|
21
64
|
|
|
65
|
+
const classifyError = (cause: unknown, message: string, operation: string) =>
|
|
66
|
+
classifySqliteError(cause, { message, operation })
|
|
67
|
+
|
|
22
68
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
69
|
+
* Runtime type identifier used to mark Bun `SqliteClient` values.
|
|
70
|
+
*
|
|
71
|
+
* @category type IDs
|
|
72
|
+
* @since 4.0.0
|
|
25
73
|
*/
|
|
26
74
|
export const TypeId: TypeId = "~@effect/sql-sqlite-bun/SqliteClient"
|
|
27
75
|
|
|
28
76
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
77
|
+
* Type-level identifier used to mark Bun `SqliteClient` values.
|
|
78
|
+
*
|
|
79
|
+
* @category type IDs
|
|
80
|
+
* @since 4.0.0
|
|
31
81
|
*/
|
|
32
82
|
export type TypeId = "~@effect/sql-sqlite-bun/SqliteClient"
|
|
33
83
|
|
|
34
84
|
/**
|
|
85
|
+
* Bun SQLite client service, extending `SqlClient` with database export and extension loading helpers. `updateValues` is not supported.
|
|
86
|
+
*
|
|
35
87
|
* @category models
|
|
36
|
-
* @since
|
|
88
|
+
* @since 4.0.0
|
|
37
89
|
*/
|
|
38
90
|
export interface SqliteClient extends Client.SqlClient {
|
|
39
91
|
readonly [TypeId]: TypeId
|
|
@@ -46,14 +98,18 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
46
98
|
}
|
|
47
99
|
|
|
48
100
|
/**
|
|
101
|
+
* Context tag used to access the Bun `SqliteClient` service.
|
|
102
|
+
*
|
|
49
103
|
* @category tags
|
|
50
|
-
* @since
|
|
104
|
+
* @since 4.0.0
|
|
51
105
|
*/
|
|
52
|
-
export const SqliteClient =
|
|
106
|
+
export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-bun/Client")
|
|
53
107
|
|
|
54
108
|
/**
|
|
109
|
+
* Configuration for a Bun SQLite client, including filename, open mode flags, WAL behavior, span attributes, and query/result name transforms.
|
|
110
|
+
*
|
|
55
111
|
* @category models
|
|
56
|
-
* @since
|
|
112
|
+
* @since 4.0.0
|
|
57
113
|
*/
|
|
58
114
|
export interface SqliteClientConfig {
|
|
59
115
|
readonly filename: string
|
|
@@ -74,8 +130,10 @@ interface SqliteConnection extends Connection {
|
|
|
74
130
|
}
|
|
75
131
|
|
|
76
132
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
133
|
+
* Creates a scoped Bun SQLite client for a database file, enabling WAL by default and serializing access. Streaming queries are not implemented.
|
|
134
|
+
*
|
|
135
|
+
* @category constructors
|
|
136
|
+
* @since 4.0.0
|
|
79
137
|
*/
|
|
80
138
|
export const make = (
|
|
81
139
|
options: SqliteClientConfig
|
|
@@ -106,13 +164,13 @@ export const make = (
|
|
|
106
164
|
) =>
|
|
107
165
|
Effect.withFiber<Array<any>, SqlError>((fiber) => {
|
|
108
166
|
const statement = db.query(sql)
|
|
109
|
-
const useSafeIntegers =
|
|
167
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
|
|
110
168
|
// @ts-ignore bun-types missing safeIntegers method, fixed in https://github.com/oven-sh/bun/pull/26627
|
|
111
169
|
statement.safeIntegers(useSafeIntegers)
|
|
112
170
|
try {
|
|
113
171
|
return Effect.succeed((statement.all(...(params as any)) ?? []) as Array<any>)
|
|
114
172
|
} catch (cause) {
|
|
115
|
-
return Effect.fail(new SqlError({ cause,
|
|
173
|
+
return Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") }))
|
|
116
174
|
}
|
|
117
175
|
})
|
|
118
176
|
|
|
@@ -122,13 +180,13 @@ export const make = (
|
|
|
122
180
|
) =>
|
|
123
181
|
Effect.withFiber<Array<any>, SqlError>((fiber) => {
|
|
124
182
|
const statement = db.query(sql)
|
|
125
|
-
const useSafeIntegers =
|
|
183
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
|
|
126
184
|
// @ts-ignore bun-types missing safeIntegers method, fixed in https://github.com/oven-sh/bun/pull/26627
|
|
127
185
|
statement.safeIntegers(useSafeIntegers)
|
|
128
186
|
try {
|
|
129
187
|
return Effect.succeed((statement.values(...(params as any)) ?? []) as Array<any>)
|
|
130
188
|
} catch (cause) {
|
|
131
|
-
return Effect.fail(new SqlError({ cause,
|
|
189
|
+
return Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") }))
|
|
132
190
|
}
|
|
133
191
|
})
|
|
134
192
|
|
|
@@ -152,12 +210,13 @@ export const make = (
|
|
|
152
210
|
},
|
|
153
211
|
export: Effect.try({
|
|
154
212
|
try: () => db.serialize(),
|
|
155
|
-
catch: (cause) => new SqlError({ cause,
|
|
213
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to export database", "export") })
|
|
156
214
|
}),
|
|
157
215
|
loadExtension: (path) =>
|
|
158
216
|
Effect.try({
|
|
159
217
|
try: () => db.loadExtension(path),
|
|
160
|
-
catch: (cause) =>
|
|
218
|
+
catch: (cause) =>
|
|
219
|
+
new SqlError({ reason: classifyError(cause, "Failed to load extension", "loadExtension") })
|
|
161
220
|
})
|
|
162
221
|
})
|
|
163
222
|
})
|
|
@@ -168,7 +227,7 @@ export const make = (
|
|
|
168
227
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection))
|
|
169
228
|
const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
|
|
170
229
|
const fiber = Fiber.getCurrent()!
|
|
171
|
-
const scope =
|
|
230
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope)
|
|
172
231
|
return Effect.as(
|
|
173
232
|
Effect.tap(
|
|
174
233
|
restore(semaphore.take(1)),
|
|
@@ -199,33 +258,37 @@ export const make = (
|
|
|
199
258
|
})
|
|
200
259
|
|
|
201
260
|
/**
|
|
261
|
+
* Creates a layer from a `Config`-wrapped Bun SQLite client configuration, providing both `SqliteClient` and `SqlClient`.
|
|
262
|
+
*
|
|
202
263
|
* @category layers
|
|
203
|
-
* @since
|
|
264
|
+
* @since 4.0.0
|
|
204
265
|
*/
|
|
205
266
|
export const layerConfig = (
|
|
206
267
|
config: Config.Wrap<SqliteClientConfig>
|
|
207
268
|
): Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError> =>
|
|
208
|
-
Layer.
|
|
209
|
-
Config.unwrap(config).
|
|
269
|
+
Layer.effectContext(
|
|
270
|
+
Config.unwrap(config).pipe(
|
|
210
271
|
Effect.flatMap(make),
|
|
211
272
|
Effect.map((client) =>
|
|
212
|
-
|
|
213
|
-
|
|
273
|
+
Context.make(SqliteClient, client).pipe(
|
|
274
|
+
Context.add(Client.SqlClient, client)
|
|
214
275
|
)
|
|
215
276
|
)
|
|
216
277
|
)
|
|
217
278
|
).pipe(Layer.provide(Reactivity.layer))
|
|
218
279
|
|
|
219
280
|
/**
|
|
281
|
+
* Creates a layer from a concrete Bun SQLite client configuration, providing both `SqliteClient` and `SqlClient`.
|
|
282
|
+
*
|
|
220
283
|
* @category layers
|
|
221
|
-
* @since
|
|
284
|
+
* @since 4.0.0
|
|
222
285
|
*/
|
|
223
286
|
export const layer = (
|
|
224
287
|
config: SqliteClientConfig
|
|
225
288
|
): Layer.Layer<SqliteClient | Client.SqlClient> =>
|
|
226
|
-
Layer.
|
|
289
|
+
Layer.effectContext(
|
|
227
290
|
Effect.map(make(config), (client) =>
|
|
228
|
-
|
|
229
|
-
|
|
291
|
+
Context.make(SqliteClient, client).pipe(
|
|
292
|
+
Context.add(Client.SqlClient, client)
|
|
230
293
|
))
|
|
231
294
|
).pipe(Layer.provide(Reactivity.layer))
|
package/src/SqliteMigrator.ts
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Utilities for applying Effect SQL migrations to Bun SQLite databases.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared `Migrator` loaders and error types, then
|
|
5
|
+
* provides `run` and `layer` helpers for applying ordered migrations through
|
|
6
|
+
* the current Bun-backed SQLite `SqlClient`. It is typically used at
|
|
7
|
+
* application startup, in deployment or setup scripts that prepare a local
|
|
8
|
+
* SQLite file, in integration tests with temporary database files, or in layer
|
|
9
|
+
* graphs that must install the schema before dependent services are acquired.
|
|
10
|
+
*
|
|
11
|
+
* Migrations are recorded in `effect_sql_migrations` by default and are loaded
|
|
12
|
+
* using the shared `<id>_<name>` file or record-key convention. Only migrations
|
|
13
|
+
* with an id greater than the latest recorded id are applied, so every client
|
|
14
|
+
* involved in startup should point at the same SQLite filename and use a
|
|
15
|
+
* writable Bun SQLite configuration. The Bun client enables WAL by default and
|
|
16
|
+
* serializes access through a single `bun:sqlite` database handle, but separate
|
|
17
|
+
* handles or processes can still contend for SQLite write locks. Bun's SQLite
|
|
18
|
+
* driver runs statements synchronously, so large migration sets can block the
|
|
19
|
+
* invoking runtime thread, and this adapter does not currently write SQLite
|
|
20
|
+
* schema dumps for `schemaDirectory`.
|
|
21
|
+
*
|
|
22
|
+
* @since 4.0.0
|
|
3
23
|
*/
|
|
4
24
|
import type * as Effect from "effect/Effect"
|
|
5
25
|
import * as Layer from "effect/Layer"
|
|
@@ -8,13 +28,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
|
|
|
8
28
|
import type { SqlError } from "effect/unstable/sql/SqlError"
|
|
9
29
|
|
|
10
30
|
/**
|
|
11
|
-
* @since
|
|
31
|
+
* @since 4.0.0
|
|
12
32
|
*/
|
|
13
33
|
export * from "effect/unstable/sql/Migrator"
|
|
14
34
|
|
|
15
35
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
36
|
+
* Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
|
|
37
|
+
*
|
|
38
|
+
* @category constructors
|
|
39
|
+
* @since 4.0.0
|
|
18
40
|
*/
|
|
19
41
|
export const run: <R2 = never>(
|
|
20
42
|
options: Migrator.MigratorOptions<R2>
|
|
@@ -67,8 +89,10 @@ export const run: <R2 = never>(
|
|
|
67
89
|
})
|
|
68
90
|
|
|
69
91
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
92
|
+
* Creates a layer that runs the configured SQL migrations during layer construction.
|
|
93
|
+
*
|
|
94
|
+
* @category constructors
|
|
95
|
+
* @since 4.0.0
|
|
72
96
|
*/
|
|
73
97
|
export const layer = <R>(
|
|
74
98
|
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"
|