@effect/sql-sqlite-node 4.0.0-beta.5 → 4.0.0-beta.50
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 +3 -3
- package/dist/SqliteClient.d.ts.map +1 -1
- package/dist/SqliteClient.js +19 -20
- package/dist/SqliteClient.js.map +1 -1
- package/package.json +5 -5
- package/src/SqliteClient.ts +24 -19
package/dist/SqliteClient.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
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";
|
|
@@ -42,7 +42,7 @@ export interface BackupMetadata {
|
|
|
42
42
|
* @category tags
|
|
43
43
|
* @since 1.0.0
|
|
44
44
|
*/
|
|
45
|
-
export declare const SqliteClient:
|
|
45
|
+
export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
|
|
46
46
|
/**
|
|
47
47
|
* @category models
|
|
48
48
|
* @since 1.0.0
|
|
@@ -51,7 +51,7 @@ export interface SqliteClientConfig {
|
|
|
51
51
|
readonly filename: string;
|
|
52
52
|
readonly readonly?: boolean | undefined;
|
|
53
53
|
readonly prepareCacheSize?: number | undefined;
|
|
54
|
-
readonly prepareCacheTTL?: Duration.
|
|
54
|
+
readonly prepareCacheTTL?: Duration.Input | undefined;
|
|
55
55
|
readonly disableWAL?: boolean | undefined;
|
|
56
56
|
readonly spanAttributes?: Record<string, unknown> | undefined;
|
|
57
57
|
readonly transformResultNames?: ((str: string) => string) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"SqliteClient.d.ts","sourceRoot":"","sources":["../src/SqliteClient.ts"],"names":[],"mappings":"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"}
|
package/dist/SqliteClient.js
CHANGED
|
@@ -4,19 +4,24 @@
|
|
|
4
4
|
import Sqlite from "better-sqlite3";
|
|
5
5
|
import * as Cache from "effect/Cache";
|
|
6
6
|
import * as Config from "effect/Config";
|
|
7
|
+
import * as Context from "effect/Context";
|
|
7
8
|
import * as Duration from "effect/Duration";
|
|
8
9
|
import * as Effect from "effect/Effect";
|
|
9
10
|
import * as Fiber from "effect/Fiber";
|
|
10
11
|
import { identity } from "effect/Function";
|
|
11
12
|
import * as Layer from "effect/Layer";
|
|
12
13
|
import * as Scope from "effect/Scope";
|
|
13
|
-
import * as
|
|
14
|
+
import * as Semaphore from "effect/Semaphore";
|
|
14
15
|
import * as Stream from "effect/Stream";
|
|
15
16
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
16
17
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
17
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
18
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
|
|
18
19
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
19
20
|
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
21
|
+
const classifyError = (cause, message, operation) => classifySqliteError(cause, {
|
|
22
|
+
message,
|
|
23
|
+
operation
|
|
24
|
+
});
|
|
20
25
|
/**
|
|
21
26
|
* @category type ids
|
|
22
27
|
* @since 1.0.0
|
|
@@ -26,7 +31,7 @@ export const TypeId = "~@effect/sql-sqlite-node/SqliteClient";
|
|
|
26
31
|
* @category tags
|
|
27
32
|
* @since 1.0.0
|
|
28
33
|
*/
|
|
29
|
-
export const SqliteClient = /*#__PURE__*/
|
|
34
|
+
export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-node/SqliteClient");
|
|
30
35
|
/**
|
|
31
36
|
* @category constructor
|
|
32
37
|
* @since 1.0.0
|
|
@@ -49,13 +54,12 @@ export const make = options => Effect.gen(function* () {
|
|
|
49
54
|
lookup: sql => Effect.try({
|
|
50
55
|
try: () => db.prepare(sql),
|
|
51
56
|
catch: cause => new SqlError({
|
|
52
|
-
cause,
|
|
53
|
-
message: "Failed to prepare statement "
|
|
57
|
+
reason: classifyError(cause, "Failed to prepare statement", "prepare")
|
|
54
58
|
})
|
|
55
59
|
})
|
|
56
60
|
});
|
|
57
61
|
const runStatement = (statement, params, raw) => Effect.withFiber(fiber => {
|
|
58
|
-
if (
|
|
62
|
+
if (Context.get(fiber.context, Client.SafeIntegers)) {
|
|
59
63
|
statement.safeIntegers(true);
|
|
60
64
|
}
|
|
61
65
|
try {
|
|
@@ -66,8 +70,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
66
70
|
return Effect.succeed(raw ? result : []);
|
|
67
71
|
} catch (cause) {
|
|
68
72
|
return Effect.fail(new SqlError({
|
|
69
|
-
cause,
|
|
70
|
-
message: "Failed to execute statement"
|
|
73
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
71
74
|
}));
|
|
72
75
|
}
|
|
73
76
|
});
|
|
@@ -82,8 +85,7 @@ export const make = options => Effect.gen(function* () {
|
|
|
82
85
|
return [];
|
|
83
86
|
},
|
|
84
87
|
catch: cause => new SqlError({
|
|
85
|
-
cause,
|
|
86
|
-
message: "Failed to execute statement"
|
|
88
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
87
89
|
})
|
|
88
90
|
}), statement => Effect.sync(() => statement.reader && statement.raw(false)));
|
|
89
91
|
return identity({
|
|
@@ -106,16 +108,14 @@ export const make = options => Effect.gen(function* () {
|
|
|
106
108
|
export: Effect.try({
|
|
107
109
|
try: () => db.serialize(),
|
|
108
110
|
catch: cause => new SqlError({
|
|
109
|
-
cause,
|
|
110
|
-
message: "Failed to export database"
|
|
111
|
+
reason: classifyError(cause, "Failed to export database", "export")
|
|
111
112
|
})
|
|
112
113
|
}),
|
|
113
114
|
backup(destination) {
|
|
114
115
|
return Effect.tryPromise({
|
|
115
116
|
try: () => db.backup(destination),
|
|
116
117
|
catch: cause => new SqlError({
|
|
117
|
-
cause,
|
|
118
|
-
message: "Failed to backup database"
|
|
118
|
+
reason: classifyError(cause, "Failed to backup database", "backup")
|
|
119
119
|
})
|
|
120
120
|
});
|
|
121
121
|
},
|
|
@@ -123,19 +123,18 @@ export const make = options => Effect.gen(function* () {
|
|
|
123
123
|
return Effect.try({
|
|
124
124
|
try: () => db.loadExtension(path),
|
|
125
125
|
catch: cause => new SqlError({
|
|
126
|
-
cause,
|
|
127
|
-
message: "Failed to load extension"
|
|
126
|
+
reason: classifyError(cause, "Failed to load extension", "loadExtension")
|
|
128
127
|
})
|
|
129
128
|
});
|
|
130
129
|
}
|
|
131
130
|
});
|
|
132
131
|
});
|
|
133
|
-
const semaphore = yield*
|
|
132
|
+
const semaphore = yield* Semaphore.make(1);
|
|
134
133
|
const connection = yield* makeConnection;
|
|
135
134
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
|
|
136
135
|
const transactionAcquirer = Effect.uninterruptibleMask(restore => {
|
|
137
136
|
const fiber = Fiber.getCurrent();
|
|
138
|
-
const scope =
|
|
137
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope);
|
|
139
138
|
return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
140
139
|
});
|
|
141
140
|
return Object.assign(yield* Client.make({
|
|
@@ -156,10 +155,10 @@ export const make = options => Effect.gen(function* () {
|
|
|
156
155
|
* @category layers
|
|
157
156
|
* @since 1.0.0
|
|
158
157
|
*/
|
|
159
|
-
export const layerConfig = config => Layer.
|
|
158
|
+
export const layerConfig = config => Layer.effectContext(Config.unwrap(config).asEffect().pipe(Effect.flatMap(make), Effect.map(client => Context.make(SqliteClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
|
|
160
159
|
/**
|
|
161
160
|
* @category layers
|
|
162
161
|
* @since 1.0.0
|
|
163
162
|
*/
|
|
164
|
-
export const layer = config => Layer.
|
|
163
|
+
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));
|
|
165
164
|
//# 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","
|
|
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","asEffect","pipe","client","add","SqlClient","provide","layer"],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
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.50",
|
|
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.50",
|
|
48
|
+
"effect": "^4.0.0-beta.50"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"effect": "^4.0.0-beta.
|
|
51
|
+
"effect": "^4.0.0-beta.50"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"better-sqlite3": "^12.
|
|
54
|
+
"better-sqlite3": "^12.8.0"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"codegen": "effect-utils codegen",
|
package/src/SqliteClient.ts
CHANGED
|
@@ -4,22 +4,26 @@
|
|
|
4
4
|
import Sqlite from "better-sqlite3"
|
|
5
5
|
import * as Cache from "effect/Cache"
|
|
6
6
|
import * as Config from "effect/Config"
|
|
7
|
+
import * as Context from "effect/Context"
|
|
7
8
|
import * as Duration from "effect/Duration"
|
|
8
9
|
import * as Effect from "effect/Effect"
|
|
9
10
|
import * as Fiber from "effect/Fiber"
|
|
10
11
|
import { identity } from "effect/Function"
|
|
11
12
|
import * as Layer from "effect/Layer"
|
|
12
13
|
import * as Scope from "effect/Scope"
|
|
13
|
-
import * as
|
|
14
|
+
import * as Semaphore from "effect/Semaphore"
|
|
14
15
|
import * as Stream from "effect/Stream"
|
|
15
16
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
16
17
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
17
18
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
18
|
-
import { SqlError } from "effect/unstable/sql/SqlError"
|
|
19
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
|
|
19
20
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
20
21
|
|
|
21
22
|
const ATTR_DB_SYSTEM_NAME = "db.system.name"
|
|
22
23
|
|
|
24
|
+
const classifyError = (cause: unknown, message: string, operation: string) =>
|
|
25
|
+
classifySqliteError(cause, { message, operation })
|
|
26
|
+
|
|
23
27
|
/**
|
|
24
28
|
* @category type ids
|
|
25
29
|
* @since 1.0.0
|
|
@@ -60,7 +64,7 @@ export interface BackupMetadata {
|
|
|
60
64
|
* @category tags
|
|
61
65
|
* @since 1.0.0
|
|
62
66
|
*/
|
|
63
|
-
export const SqliteClient =
|
|
67
|
+
export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-node/SqliteClient")
|
|
64
68
|
|
|
65
69
|
/**
|
|
66
70
|
* @category models
|
|
@@ -70,7 +74,7 @@ export interface SqliteClientConfig {
|
|
|
70
74
|
readonly filename: string
|
|
71
75
|
readonly readonly?: boolean | undefined
|
|
72
76
|
readonly prepareCacheSize?: number | undefined
|
|
73
|
-
readonly prepareCacheTTL?: Duration.
|
|
77
|
+
readonly prepareCacheTTL?: Duration.Input | undefined
|
|
74
78
|
readonly disableWAL?: boolean | undefined
|
|
75
79
|
readonly spanAttributes?: Record<string, unknown> | undefined
|
|
76
80
|
|
|
@@ -116,7 +120,7 @@ export const make = (
|
|
|
116
120
|
lookup: (sql: string) =>
|
|
117
121
|
Effect.try({
|
|
118
122
|
try: () => db.prepare(sql),
|
|
119
|
-
catch: (cause) => new SqlError({ cause,
|
|
123
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to prepare statement", "prepare") })
|
|
120
124
|
})
|
|
121
125
|
})
|
|
122
126
|
|
|
@@ -126,7 +130,7 @@ export const make = (
|
|
|
126
130
|
raw: boolean
|
|
127
131
|
) =>
|
|
128
132
|
Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {
|
|
129
|
-
if (
|
|
133
|
+
if (Context.get(fiber.context, Client.SafeIntegers)) {
|
|
130
134
|
statement.safeIntegers(true)
|
|
131
135
|
}
|
|
132
136
|
try {
|
|
@@ -136,7 +140,7 @@ export const make = (
|
|
|
136
140
|
const result = statement.run(...params)
|
|
137
141
|
return Effect.succeed(raw ? result as unknown as ReadonlyArray<any> : [])
|
|
138
142
|
} catch (cause) {
|
|
139
|
-
return Effect.fail(new SqlError({ cause,
|
|
143
|
+
return Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") }))
|
|
140
144
|
}
|
|
141
145
|
})
|
|
142
146
|
|
|
@@ -168,7 +172,7 @@ export const make = (
|
|
|
168
172
|
statement.run(...params)
|
|
169
173
|
return []
|
|
170
174
|
},
|
|
171
|
-
catch: (cause) => new SqlError({ cause,
|
|
175
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
172
176
|
}),
|
|
173
177
|
(statement) => Effect.sync(() => statement.reader && statement.raw(false))
|
|
174
178
|
)
|
|
@@ -194,30 +198,31 @@ export const make = (
|
|
|
194
198
|
},
|
|
195
199
|
export: Effect.try({
|
|
196
200
|
try: () => db.serialize(),
|
|
197
|
-
catch: (cause) => new SqlError({ cause,
|
|
201
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to export database", "export") })
|
|
198
202
|
}),
|
|
199
203
|
backup(destination) {
|
|
200
204
|
return Effect.tryPromise({
|
|
201
205
|
try: () => db.backup(destination),
|
|
202
|
-
catch: (cause) => new SqlError({ cause,
|
|
206
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to backup database", "backup") })
|
|
203
207
|
})
|
|
204
208
|
},
|
|
205
209
|
loadExtension(path) {
|
|
206
210
|
return Effect.try({
|
|
207
211
|
try: () => db.loadExtension(path),
|
|
208
|
-
catch: (cause) =>
|
|
212
|
+
catch: (cause) =>
|
|
213
|
+
new SqlError({ reason: classifyError(cause, "Failed to load extension", "loadExtension") })
|
|
209
214
|
})
|
|
210
215
|
}
|
|
211
216
|
})
|
|
212
217
|
})
|
|
213
218
|
|
|
214
|
-
const semaphore = yield*
|
|
219
|
+
const semaphore = yield* Semaphore.make(1)
|
|
215
220
|
const connection = yield* makeConnection
|
|
216
221
|
|
|
217
222
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection))
|
|
218
223
|
const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
|
|
219
224
|
const fiber = Fiber.getCurrent()!
|
|
220
|
-
const scope =
|
|
225
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope)
|
|
221
226
|
return Effect.as(
|
|
222
227
|
Effect.tap(
|
|
223
228
|
restore(semaphore.take(1)),
|
|
@@ -255,12 +260,12 @@ export const make = (
|
|
|
255
260
|
export const layerConfig = (
|
|
256
261
|
config: Config.Wrap<SqliteClientConfig>
|
|
257
262
|
): Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError> =>
|
|
258
|
-
Layer.
|
|
263
|
+
Layer.effectContext(
|
|
259
264
|
Config.unwrap(config).asEffect().pipe(
|
|
260
265
|
Effect.flatMap(make),
|
|
261
266
|
Effect.map((client) =>
|
|
262
|
-
|
|
263
|
-
|
|
267
|
+
Context.make(SqliteClient, client).pipe(
|
|
268
|
+
Context.add(Client.SqlClient, client)
|
|
264
269
|
)
|
|
265
270
|
)
|
|
266
271
|
)
|
|
@@ -273,9 +278,9 @@ export const layerConfig = (
|
|
|
273
278
|
export const layer = (
|
|
274
279
|
config: SqliteClientConfig
|
|
275
280
|
): Layer.Layer<SqliteClient | Client.SqlClient> =>
|
|
276
|
-
Layer.
|
|
281
|
+
Layer.effectContext(
|
|
277
282
|
Effect.map(make(config), (client) =>
|
|
278
|
-
|
|
279
|
-
|
|
283
|
+
Context.make(SqliteClient, client).pipe(
|
|
284
|
+
Context.add(Client.SqlClient, client)
|
|
280
285
|
))
|
|
281
286
|
).pipe(Layer.provide(Reactivity.layer))
|