@effect/sql-sqlite-node 4.0.0-beta.1 → 4.0.0-beta.100
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/README.md +1 -1
- package/dist/SqliteClient.d.ts +34 -17
- package/dist/SqliteClient.d.ts.map +1 -1
- package/dist/SqliteClient.js +135 -69
- package/dist/SqliteClient.js.map +1 -1
- package/dist/SqliteMigrator.d.ts +17 -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 +7 -11
- package/src/SqliteClient.ts +164 -74
- package/src/SqliteMigrator.ts +17 -6
- package/src/index.ts +3 -3
package/README.md
CHANGED
package/dist/SqliteClient.d.ts
CHANGED
|
@@ -1,75 +1,92 @@
|
|
|
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;
|
|
26
32
|
readonly config: SqliteClientConfig;
|
|
27
|
-
readonly export: Effect.Effect<Uint8Array, SqlError>;
|
|
28
33
|
readonly backup: (destination: string) => Effect.Effect<BackupMetadata, SqlError>;
|
|
29
34
|
readonly loadExtension: (path: string) => Effect.Effect<void, SqlError>;
|
|
30
35
|
/** Not supported in sqlite */
|
|
31
36
|
readonly updateValues: never;
|
|
32
37
|
}
|
|
33
38
|
/**
|
|
39
|
+
* Metadata returned from a Node SQLite backup operation, reporting total and remaining page counts.
|
|
40
|
+
*
|
|
34
41
|
* @category models
|
|
35
|
-
* @since
|
|
42
|
+
* @since 4.0.0
|
|
36
43
|
*/
|
|
37
44
|
export interface BackupMetadata {
|
|
38
45
|
readonly totalPages: number;
|
|
39
46
|
readonly remainingPages: number;
|
|
40
47
|
}
|
|
41
48
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
49
|
+
* Service tag for the node SQLite client implementation.
|
|
50
|
+
*
|
|
51
|
+
* @category services
|
|
52
|
+
* @since 4.0.0
|
|
44
53
|
*/
|
|
45
|
-
export declare const SqliteClient:
|
|
54
|
+
export declare const SqliteClient: Context.Service<SqliteClient, SqliteClient>;
|
|
46
55
|
/**
|
|
56
|
+
* Configuration for a node SQLite client backed by `node:sqlite`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
|
|
57
|
+
*
|
|
47
58
|
* @category models
|
|
48
|
-
* @since
|
|
59
|
+
* @since 4.0.0
|
|
49
60
|
*/
|
|
50
61
|
export interface SqliteClientConfig {
|
|
51
62
|
readonly filename: string;
|
|
52
63
|
readonly readonly?: boolean | undefined;
|
|
53
64
|
readonly prepareCacheSize?: number | undefined;
|
|
54
|
-
readonly prepareCacheTTL?: Duration.
|
|
65
|
+
readonly prepareCacheTTL?: Duration.Input | undefined;
|
|
55
66
|
readonly disableWAL?: boolean | undefined;
|
|
56
67
|
readonly spanAttributes?: Record<string, unknown> | undefined;
|
|
57
68
|
readonly transformResultNames?: ((str: string) => string) | undefined;
|
|
58
69
|
readonly transformQueryNames?: ((str: string) => string) | undefined;
|
|
59
70
|
}
|
|
60
71
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
72
|
+
* 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.
|
|
73
|
+
*
|
|
74
|
+
* @category constructors
|
|
75
|
+
* @since 4.0.0
|
|
63
76
|
*/
|
|
64
77
|
export declare const make: (options: SqliteClientConfig) => Effect.Effect<SqliteClient, never, Scope.Scope | Reactivity.Reactivity>;
|
|
65
78
|
/**
|
|
79
|
+
* Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.
|
|
80
|
+
*
|
|
66
81
|
* @category layers
|
|
67
|
-
* @since
|
|
82
|
+
* @since 4.0.0
|
|
68
83
|
*/
|
|
69
84
|
export declare const layerConfig: (config: Config.Wrap<SqliteClientConfig>) => Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError>;
|
|
70
85
|
/**
|
|
86
|
+
* Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
87
|
+
*
|
|
71
88
|
* @category layers
|
|
72
|
-
* @since
|
|
89
|
+
* @since 4.0.0
|
|
73
90
|
*/
|
|
74
91
|
export declare const layer: (config: SqliteClientConfig) => Layer.Layer<SqliteClient | Client.SqlClient>;
|
|
75
92
|
//# 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":"AAYA,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;AAO5E;;;;;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,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;AAOD;;;;;GAKG;AACH,eAAO,MAAM,IAAI,YACN,kBAAkB,KAC1B,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,UAAU,CA4MrE,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,WAAW,WACd,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,WACR,kBAAkB,KACzB,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,CAML,CAAA"}
|
package/dist/SqliteClient.js
CHANGED
|
@@ -1,47 +1,64 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Connects Effect SQL to SQLite on Node.js using `node:sqlite`.
|
|
3
|
+
*
|
|
4
|
+
* This module opens a SQLite database and exposes it as both `SqliteClient` and
|
|
5
|
+
* the generic Effect SQL client. It serializes access through one connection,
|
|
6
|
+
* caches prepared statements, enables WAL mode unless disabled, and supports
|
|
7
|
+
* database backup, and extension loading. Streaming queries and
|
|
8
|
+
* `updateValues` are not supported by this driver.
|
|
9
|
+
*
|
|
10
|
+
* @since 4.0.0
|
|
3
11
|
*/
|
|
4
|
-
import Sqlite from "better-sqlite3";
|
|
5
12
|
import * as Cache from "effect/Cache";
|
|
6
13
|
import * as Config from "effect/Config";
|
|
14
|
+
import * as Context from "effect/Context";
|
|
7
15
|
import * as Duration from "effect/Duration";
|
|
8
16
|
import * as Effect from "effect/Effect";
|
|
9
17
|
import * as Fiber from "effect/Fiber";
|
|
10
18
|
import { identity } from "effect/Function";
|
|
11
19
|
import * as Layer from "effect/Layer";
|
|
12
20
|
import * as Scope from "effect/Scope";
|
|
13
|
-
import * as
|
|
21
|
+
import * as Semaphore from "effect/Semaphore";
|
|
14
22
|
import * as Stream from "effect/Stream";
|
|
15
23
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity";
|
|
16
24
|
import * as Client from "effect/unstable/sql/SqlClient";
|
|
17
|
-
import { SqlError } from "effect/unstable/sql/SqlError";
|
|
25
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError";
|
|
18
26
|
import * as Statement from "effect/unstable/sql/Statement";
|
|
27
|
+
import { backup as backupDatabase, DatabaseSync } from "node:sqlite";
|
|
19
28
|
const ATTR_DB_SYSTEM_NAME = "db.system.name";
|
|
20
29
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
30
|
+
* Runtime type identifier used to mark Node `SqliteClient` values.
|
|
31
|
+
*
|
|
32
|
+
* @category type IDs
|
|
33
|
+
* @since 4.0.0
|
|
23
34
|
*/
|
|
24
35
|
export const TypeId = "~@effect/sql-sqlite-node/SqliteClient";
|
|
25
36
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
37
|
+
* Service tag for the node SQLite client implementation.
|
|
38
|
+
*
|
|
39
|
+
* @category services
|
|
40
|
+
* @since 4.0.0
|
|
28
41
|
*/
|
|
29
|
-
export const SqliteClient = /*#__PURE__*/
|
|
42
|
+
export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-node/SqliteClient");
|
|
30
43
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
44
|
+
* 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.
|
|
45
|
+
*
|
|
46
|
+
* @category constructors
|
|
47
|
+
* @since 4.0.0
|
|
33
48
|
*/
|
|
34
49
|
export const make = options => Effect.gen(function* () {
|
|
35
50
|
const compiler = Statement.makeCompilerSqlite(options.transformQueryNames);
|
|
36
51
|
const transformRows = options.transformResultNames ? Statement.defaultTransforms(options.transformResultNames).array : undefined;
|
|
37
52
|
const makeConnection = Effect.gen(function* () {
|
|
38
53
|
const scope = yield* Effect.scope;
|
|
39
|
-
const db = new
|
|
40
|
-
|
|
54
|
+
const db = new DatabaseSync(options.filename, {
|
|
55
|
+
readOnly: options.readonly ?? false,
|
|
56
|
+
allowExtension: true
|
|
41
57
|
});
|
|
42
58
|
yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()));
|
|
59
|
+
db.enableLoadExtension(false);
|
|
43
60
|
if (options.disableWAL !== true) {
|
|
44
|
-
db.
|
|
61
|
+
db.exec("PRAGMA journal_mode = WAL");
|
|
45
62
|
}
|
|
46
63
|
const prepareCache = yield* Cache.make({
|
|
47
64
|
capacity: options.prepareCacheSize ?? 200,
|
|
@@ -49,43 +66,68 @@ export const make = options => Effect.gen(function* () {
|
|
|
49
66
|
lookup: sql => Effect.try({
|
|
50
67
|
try: () => db.prepare(sql),
|
|
51
68
|
catch: cause => new SqlError({
|
|
52
|
-
cause,
|
|
53
|
-
message: "Failed to prepare statement "
|
|
69
|
+
reason: classifyError(cause, "Failed to prepare statement", "prepare")
|
|
54
70
|
})
|
|
55
71
|
})
|
|
56
72
|
});
|
|
57
73
|
const runStatement = (statement, params, raw) => Effect.withFiber(fiber => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
|
|
75
|
+
return Effect.try({
|
|
76
|
+
try: () => {
|
|
77
|
+
statement.setReadBigInts(useSafeIntegers);
|
|
78
|
+
if (statement.columns().length > 0) {
|
|
79
|
+
return statement.all(...params);
|
|
80
|
+
}
|
|
81
|
+
const result = statement.run(...params);
|
|
82
|
+
return raw ? {
|
|
83
|
+
changes: result.changes,
|
|
84
|
+
lastInsertRowid: result.lastInsertRowid
|
|
85
|
+
} : [];
|
|
86
|
+
},
|
|
87
|
+
catch: cause => new SqlError({
|
|
88
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
89
|
+
})
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
const runStatementValues = (statement, params) => Effect.withFiber(fiber => {
|
|
93
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
|
|
94
|
+
return Effect.try({
|
|
95
|
+
try: () => {
|
|
96
|
+
statement.setReadBigInts(useSafeIntegers);
|
|
97
|
+
if (statement.columns().length > 0) {
|
|
98
|
+
return statement.all(...params);
|
|
99
|
+
}
|
|
100
|
+
statement.run(...params);
|
|
101
|
+
return [];
|
|
102
|
+
},
|
|
103
|
+
catch: cause => new SqlError({
|
|
104
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
const runStatementValuesUnprepared = (statement, params) => Effect.withFiber(fiber => {
|
|
109
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers);
|
|
110
|
+
return Effect.try({
|
|
111
|
+
try: () => {
|
|
112
|
+
statement.setReadBigInts(useSafeIntegers);
|
|
113
|
+
statement.setReturnArrays(true);
|
|
114
|
+
if (statement.columns().length > 0) {
|
|
115
|
+
return statement.all(...params);
|
|
116
|
+
}
|
|
117
|
+
statement.run(...params);
|
|
118
|
+
return [];
|
|
119
|
+
},
|
|
120
|
+
catch: cause => new SqlError({
|
|
121
|
+
reason: classifyError(cause, "Failed to execute statement", "execute")
|
|
122
|
+
})
|
|
123
|
+
});
|
|
73
124
|
});
|
|
74
125
|
const run = (sql, params, raw = false) => Effect.flatMap(Cache.get(prepareCache, sql), s => runStatement(s, params, raw));
|
|
75
|
-
const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), statement =>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}
|
|
81
|
-
statement.run(...params);
|
|
82
|
-
return [];
|
|
83
|
-
},
|
|
84
|
-
catch: cause => new SqlError({
|
|
85
|
-
cause,
|
|
86
|
-
message: "Failed to execute statement"
|
|
87
|
-
})
|
|
88
|
-
}), statement => Effect.sync(() => statement.reader && statement.raw(false)));
|
|
126
|
+
const runValues = (sql, params) => Effect.acquireUseRelease(Cache.get(prepareCache, sql), statement => {
|
|
127
|
+
statement.setReturnArrays(true);
|
|
128
|
+
return runStatementValues(statement, params);
|
|
129
|
+
}, statement => Effect.sync(() => statement.setReturnArrays(false)));
|
|
130
|
+
const runValuesUnprepared = (sql, params) => runStatementValuesUnprepared(db.prepare(sql), params);
|
|
89
131
|
return identity({
|
|
90
132
|
execute(sql, params, transformRows) {
|
|
91
133
|
return transformRows ? Effect.map(run(sql, params), transformRows) : run(sql, params);
|
|
@@ -96,6 +138,9 @@ export const make = options => Effect.gen(function* () {
|
|
|
96
138
|
executeValues(sql, params) {
|
|
97
139
|
return runValues(sql, params);
|
|
98
140
|
},
|
|
141
|
+
executeValuesUnprepared(sql, params) {
|
|
142
|
+
return runValuesUnprepared(sql, params);
|
|
143
|
+
},
|
|
99
144
|
executeUnprepared(sql, params, transformRows) {
|
|
100
145
|
const effect = runStatement(db.prepare(sql), params ?? [], false);
|
|
101
146
|
return transformRows ? Effect.map(effect, transformRows) : effect;
|
|
@@ -103,39 +148,40 @@ export const make = options => Effect.gen(function* () {
|
|
|
103
148
|
executeStream(_sql, _params) {
|
|
104
149
|
return Stream.die("executeStream not implemented");
|
|
105
150
|
},
|
|
106
|
-
export: Effect.try({
|
|
107
|
-
try: () => db.serialize(),
|
|
108
|
-
catch: cause => new SqlError({
|
|
109
|
-
cause,
|
|
110
|
-
message: "Failed to export database"
|
|
111
|
-
})
|
|
112
|
-
}),
|
|
113
151
|
backup(destination) {
|
|
114
|
-
return Effect.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
152
|
+
return Effect.suspend(() => {
|
|
153
|
+
let totalPages = 0;
|
|
154
|
+
return Effect.tryPromise({
|
|
155
|
+
try: () => backupDatabase(db, destination, {
|
|
156
|
+
progress: progress => {
|
|
157
|
+
totalPages = progress.totalPages;
|
|
158
|
+
}
|
|
159
|
+
}).then(pages => ({
|
|
160
|
+
totalPages: totalPages || pages,
|
|
161
|
+
remainingPages: 0
|
|
162
|
+
})),
|
|
163
|
+
catch: cause => new SqlError({
|
|
164
|
+
reason: classifyError(cause, "Failed to backup database", "backup")
|
|
165
|
+
})
|
|
166
|
+
});
|
|
120
167
|
});
|
|
121
168
|
},
|
|
122
169
|
loadExtension(path) {
|
|
123
|
-
return Effect.try({
|
|
170
|
+
return Effect.acquireUseRelease(Effect.sync(() => db.enableLoadExtension(true)), () => Effect.try({
|
|
124
171
|
try: () => db.loadExtension(path),
|
|
125
172
|
catch: cause => new SqlError({
|
|
126
|
-
cause,
|
|
127
|
-
message: "Failed to load extension"
|
|
173
|
+
reason: classifyError(cause, "Failed to load extension", "loadExtension")
|
|
128
174
|
})
|
|
129
|
-
});
|
|
175
|
+
}), () => Effect.sync(() => db.enableLoadExtension(false)));
|
|
130
176
|
}
|
|
131
177
|
});
|
|
132
178
|
});
|
|
133
|
-
const semaphore = yield*
|
|
179
|
+
const semaphore = yield* Semaphore.make(1);
|
|
134
180
|
const connection = yield* makeConnection;
|
|
135
181
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection));
|
|
136
182
|
const transactionAcquirer = Effect.uninterruptibleMask(restore => {
|
|
137
183
|
const fiber = Fiber.getCurrent();
|
|
138
|
-
const scope =
|
|
184
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope);
|
|
139
185
|
return Effect.as(Effect.tap(restore(semaphore.take(1)), () => Scope.addFinalizer(scope, semaphore.release(1))), connection);
|
|
140
186
|
});
|
|
141
187
|
return Object.assign(yield* Client.make({
|
|
@@ -147,19 +193,39 @@ export const make = options => Effect.gen(function* () {
|
|
|
147
193
|
}), {
|
|
148
194
|
[TypeId]: TypeId,
|
|
149
195
|
config: options,
|
|
150
|
-
export: Effect.flatMap(acquirer, _ => _.export),
|
|
151
196
|
backup: destination => Effect.flatMap(acquirer, _ => _.backup(destination)),
|
|
152
197
|
loadExtension: path => Effect.flatMap(acquirer, _ => _.loadExtension(path))
|
|
153
198
|
});
|
|
154
199
|
});
|
|
155
200
|
/**
|
|
201
|
+
* Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.
|
|
202
|
+
*
|
|
156
203
|
* @category layers
|
|
157
|
-
* @since
|
|
204
|
+
* @since 4.0.0
|
|
158
205
|
*/
|
|
159
|
-
export const layerConfig = config => Layer.
|
|
206
|
+
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));
|
|
160
207
|
/**
|
|
208
|
+
* Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
209
|
+
*
|
|
161
210
|
* @category layers
|
|
162
|
-
* @since
|
|
211
|
+
* @since 4.0.0
|
|
163
212
|
*/
|
|
164
|
-
export const layer = config => Layer.
|
|
213
|
+
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));
|
|
214
|
+
// internal
|
|
215
|
+
const classifyError = (cause, message, operation) => classifySqliteError(sqliteCauseWithErrno(cause), {
|
|
216
|
+
message,
|
|
217
|
+
operation
|
|
218
|
+
});
|
|
219
|
+
const sqliteCauseWithErrno = cause => {
|
|
220
|
+
if (typeof cause !== "object" || cause === null || !("errcode" in cause) || "errno" in cause) {
|
|
221
|
+
return cause;
|
|
222
|
+
}
|
|
223
|
+
const errcode = cause.errcode;
|
|
224
|
+
if (typeof errcode !== "number") {
|
|
225
|
+
return cause;
|
|
226
|
+
}
|
|
227
|
+
return Object.assign(cause, {
|
|
228
|
+
errno: errcode
|
|
229
|
+
});
|
|
230
|
+
};
|
|
165
231
|
//# 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","ServiceMap","Stream","Reactivity","Client","SqlError","Statement","ATTR_DB_SYSTEM_NAME","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","cause","message","runStatement","statement","params","raw","withFiber","fiber","get","services","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","makeSemaphore","connection","acquirer","withPermits","transactionAcquirer","uninterruptibleMask","restore","getCurrent","getUnsafe","as","tap","take","release","Object","assign","spanAttributes","entries","config","_","layerConfig","effectServices","unwrap","asEffect","pipe","client","add","SqlClient","provide","layer"],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SqliteClient.js","names":["Cache","Config","Context","Duration","Effect","Fiber","identity","Layer","Scope","Semaphore","Stream","Reactivity","Client","classifySqliteError","SqlError","Statement","backup","backupDatabase","DatabaseSync","ATTR_DB_SYSTEM_NAME","TypeId","SqliteClient","Service","make","options","gen","compiler","makeCompilerSqlite","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","makeConnection","scope","db","filename","readOnly","readonly","allowExtension","addFinalizer","sync","close","enableLoadExtension","disableWAL","exec","prepareCache","capacity","prepareCacheSize","timeToLive","prepareCacheTTL","minutes","lookup","sql","try","prepare","catch","cause","reason","classifyError","runStatement","statement","params","raw","withFiber","fiber","useSafeIntegers","get","context","SafeIntegers","setReadBigInts","columns","length","all","result","run","changes","lastInsertRowid","runStatementValues","runStatementValuesUnprepared","setReturnArrays","flatMap","s","runValues","acquireUseRelease","runValuesUnprepared","execute","map","executeRaw","executeValues","executeValuesUnprepared","executeUnprepared","effect","executeStream","_sql","_params","die","destination","suspend","totalPages","tryPromise","progress","then","pages","remainingPages","loadExtension","path","semaphore","connection","acquirer","withPermits","succeed","transactionAcquirer","uninterruptibleMask","restore","getCurrent","getUnsafe","as","tap","take","release","Object","assign","spanAttributes","entries","config","_","layerConfig","effectContext","unwrap","pipe","client","add","SqlClient","provide","layer","message","operation","sqliteCauseWithErrno","errcode","errno"],"sources":["../src/SqliteClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/SqliteMigrator.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Runs database migrations for Node.js SQLite projects that use Effect SQL.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared migration loaders and errors, then provides
|
|
5
|
+
* `run` and `layer` helpers that apply pending migration files with the current
|
|
6
|
+
* `SqlClient`. It does not add Node-specific schema dump support; migration
|
|
7
|
+
* execution is handled by the shared SQL migrator.
|
|
8
|
+
*
|
|
9
|
+
* @since 4.0.0
|
|
3
10
|
*/
|
|
4
11
|
import type * as Effect from "effect/Effect";
|
|
5
12
|
import * as Layer from "effect/Layer";
|
|
@@ -7,17 +14,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
|
|
|
7
14
|
import type * as Client from "effect/unstable/sql/SqlClient";
|
|
8
15
|
import type { SqlError } from "effect/unstable/sql/SqlError";
|
|
9
16
|
/**
|
|
10
|
-
* @since
|
|
17
|
+
* @since 4.0.0
|
|
11
18
|
*/
|
|
12
19
|
export * from "effect/unstable/sql/Migrator";
|
|
13
20
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
21
|
+
* Runs SQL migrations for a SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
22
|
+
*
|
|
23
|
+
* @category constructors
|
|
24
|
+
* @since 4.0.0
|
|
16
25
|
*/
|
|
17
26
|
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
27
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
28
|
+
* Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.
|
|
29
|
+
*
|
|
30
|
+
* @category constructors
|
|
31
|
+
* @since 4.0.0
|
|
21
32
|
*/
|
|
22
33
|
export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, Migrator.MigrationError | SqlError, Client.SqlClient | R>;
|
|
23
34
|
//# 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;;;;;;;;;GASG;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,WACZ,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":"AAWA,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,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect/sql-sqlite-node",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.100",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "A SQLite toolkit for Effect",
|
|
7
7
|
"homepage": "https://effect.website",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
|
-
"url": "https://github.com/Effect-TS/effect
|
|
10
|
+
"url": "https://github.com/Effect-TS/effect.git",
|
|
11
11
|
"directory": "packages/sql/sqlite-node"
|
|
12
12
|
},
|
|
13
13
|
"bugs": {
|
|
14
|
-
"url": "https://github.com/Effect-TS/effect
|
|
14
|
+
"url": "https://github.com/Effect-TS/effect/issues"
|
|
15
15
|
},
|
|
16
16
|
"tags": [
|
|
17
17
|
"typescript",
|
|
@@ -43,20 +43,16 @@
|
|
|
43
43
|
"provenance": true
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@types/
|
|
47
|
-
"@effect/platform-node": "^4.0.0-beta.
|
|
48
|
-
"effect": "^4.0.0-beta.
|
|
46
|
+
"@types/node": "^26.1.1",
|
|
47
|
+
"@effect/platform-node": "^4.0.0-beta.100",
|
|
48
|
+
"effect": "^4.0.0-beta.100"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
|
-
"effect": "^4.0.0-beta.
|
|
52
|
-
},
|
|
53
|
-
"dependencies": {
|
|
54
|
-
"better-sqlite3": "^12.6.2"
|
|
51
|
+
"effect": "^4.0.0-beta.100"
|
|
55
52
|
},
|
|
56
53
|
"scripts": {
|
|
57
54
|
"codegen": "effect-utils codegen",
|
|
58
55
|
"build": "tsc -b tsconfig.json && pnpm babel",
|
|
59
|
-
"build:tsgo": "tsgo -b tsconfig.json && pnpm babel",
|
|
60
56
|
"babel": "babel dist --plugins annotate-pure-calls --out-dir dist --source-maps",
|
|
61
57
|
"check": "tsc -b tsconfig.json",
|
|
62
58
|
"test": "vitest",
|
package/src/SqliteClient.ts
CHANGED
|
@@ -1,45 +1,60 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Connects Effect SQL to SQLite on Node.js using `node:sqlite`.
|
|
3
|
+
*
|
|
4
|
+
* This module opens a SQLite database and exposes it as both `SqliteClient` and
|
|
5
|
+
* the generic Effect SQL client. It serializes access through one connection,
|
|
6
|
+
* caches prepared statements, enables WAL mode unless disabled, and supports
|
|
7
|
+
* database backup, and extension loading. Streaming queries and
|
|
8
|
+
* `updateValues` are not supported by this driver.
|
|
9
|
+
*
|
|
10
|
+
* @since 4.0.0
|
|
3
11
|
*/
|
|
4
|
-
import Sqlite from "better-sqlite3"
|
|
5
12
|
import * as Cache from "effect/Cache"
|
|
6
13
|
import * as Config from "effect/Config"
|
|
14
|
+
import * as Context from "effect/Context"
|
|
7
15
|
import * as Duration from "effect/Duration"
|
|
8
16
|
import * as Effect from "effect/Effect"
|
|
9
17
|
import * as Fiber from "effect/Fiber"
|
|
10
18
|
import { identity } from "effect/Function"
|
|
11
19
|
import * as Layer from "effect/Layer"
|
|
12
20
|
import * as Scope from "effect/Scope"
|
|
13
|
-
import * as
|
|
21
|
+
import * as Semaphore from "effect/Semaphore"
|
|
14
22
|
import * as Stream from "effect/Stream"
|
|
15
23
|
import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
16
24
|
import * as Client from "effect/unstable/sql/SqlClient"
|
|
17
25
|
import type { Connection } from "effect/unstable/sql/SqlConnection"
|
|
18
|
-
import { SqlError } from "effect/unstable/sql/SqlError"
|
|
26
|
+
import { classifySqliteError, SqlError } from "effect/unstable/sql/SqlError"
|
|
19
27
|
import * as Statement from "effect/unstable/sql/Statement"
|
|
28
|
+
import { backup as backupDatabase, DatabaseSync } from "node:sqlite"
|
|
29
|
+
import type { StatementSync } from "node:sqlite"
|
|
20
30
|
|
|
21
31
|
const ATTR_DB_SYSTEM_NAME = "db.system.name"
|
|
22
32
|
|
|
23
33
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
34
|
+
* Runtime type identifier used to mark Node `SqliteClient` values.
|
|
35
|
+
*
|
|
36
|
+
* @category type IDs
|
|
37
|
+
* @since 4.0.0
|
|
26
38
|
*/
|
|
27
39
|
export const TypeId: TypeId = "~@effect/sql-sqlite-node/SqliteClient"
|
|
28
40
|
|
|
29
41
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
42
|
+
* Type-level identifier used to mark Node `SqliteClient` values.
|
|
43
|
+
*
|
|
44
|
+
* @category type IDs
|
|
45
|
+
* @since 4.0.0
|
|
32
46
|
*/
|
|
33
47
|
export type TypeId = "~@effect/sql-sqlite-node/SqliteClient"
|
|
34
48
|
|
|
35
49
|
/**
|
|
50
|
+
* Node SQLite client service, extending `SqlClient` with database export, backup, and extension loading helpers. `updateValues` is not supported.
|
|
51
|
+
*
|
|
36
52
|
* @category models
|
|
37
|
-
* @since
|
|
53
|
+
* @since 4.0.0
|
|
38
54
|
*/
|
|
39
55
|
export interface SqliteClient extends Client.SqlClient {
|
|
40
56
|
readonly [TypeId]: TypeId
|
|
41
57
|
readonly config: SqliteClientConfig
|
|
42
|
-
readonly export: Effect.Effect<Uint8Array, SqlError>
|
|
43
58
|
readonly backup: (destination: string) => Effect.Effect<BackupMetadata, SqlError>
|
|
44
59
|
readonly loadExtension: (path: string) => Effect.Effect<void, SqlError>
|
|
45
60
|
|
|
@@ -48,8 +63,10 @@ export interface SqliteClient extends Client.SqlClient {
|
|
|
48
63
|
}
|
|
49
64
|
|
|
50
65
|
/**
|
|
66
|
+
* Metadata returned from a Node SQLite backup operation, reporting total and remaining page counts.
|
|
67
|
+
*
|
|
51
68
|
* @category models
|
|
52
|
-
* @since
|
|
69
|
+
* @since 4.0.0
|
|
53
70
|
*/
|
|
54
71
|
export interface BackupMetadata {
|
|
55
72
|
readonly totalPages: number
|
|
@@ -57,20 +74,24 @@ export interface BackupMetadata {
|
|
|
57
74
|
}
|
|
58
75
|
|
|
59
76
|
/**
|
|
60
|
-
*
|
|
61
|
-
*
|
|
77
|
+
* Service tag for the node SQLite client implementation.
|
|
78
|
+
*
|
|
79
|
+
* @category services
|
|
80
|
+
* @since 4.0.0
|
|
62
81
|
*/
|
|
63
|
-
export const SqliteClient =
|
|
82
|
+
export const SqliteClient = Context.Service<SqliteClient>("@effect/sql-sqlite-node/SqliteClient")
|
|
64
83
|
|
|
65
84
|
/**
|
|
85
|
+
* Configuration for a node SQLite client backed by `node:sqlite`, including the database filename, read-only mode, statement cache settings, WAL behavior, span attributes, and query/result name transforms.
|
|
86
|
+
*
|
|
66
87
|
* @category models
|
|
67
|
-
* @since
|
|
88
|
+
* @since 4.0.0
|
|
68
89
|
*/
|
|
69
90
|
export interface SqliteClientConfig {
|
|
70
91
|
readonly filename: string
|
|
71
92
|
readonly readonly?: boolean | undefined
|
|
72
93
|
readonly prepareCacheSize?: number | undefined
|
|
73
|
-
readonly prepareCacheTTL?: Duration.
|
|
94
|
+
readonly prepareCacheTTL?: Duration.Input | undefined
|
|
74
95
|
readonly disableWAL?: boolean | undefined
|
|
75
96
|
readonly spanAttributes?: Record<string, unknown> | undefined
|
|
76
97
|
|
|
@@ -79,14 +100,15 @@ export interface SqliteClientConfig {
|
|
|
79
100
|
}
|
|
80
101
|
|
|
81
102
|
interface SqliteConnection extends Connection {
|
|
82
|
-
readonly export: Effect.Effect<Uint8Array, SqlError>
|
|
83
103
|
readonly backup: (destination: string) => Effect.Effect<BackupMetadata, SqlError>
|
|
84
104
|
readonly loadExtension: (path: string) => Effect.Effect<void, SqlError>
|
|
85
105
|
}
|
|
86
106
|
|
|
87
107
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
108
|
+
* 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.
|
|
109
|
+
*
|
|
110
|
+
* @category constructors
|
|
111
|
+
* @since 4.0.0
|
|
90
112
|
*/
|
|
91
113
|
export const make = (
|
|
92
114
|
options: SqliteClientConfig
|
|
@@ -101,13 +123,15 @@ export const make = (
|
|
|
101
123
|
|
|
102
124
|
const makeConnection = Effect.gen(function*() {
|
|
103
125
|
const scope = yield* Effect.scope
|
|
104
|
-
const db = new
|
|
105
|
-
|
|
126
|
+
const db = new DatabaseSync(options.filename, {
|
|
127
|
+
readOnly: options.readonly ?? false,
|
|
128
|
+
allowExtension: true
|
|
106
129
|
})
|
|
107
130
|
yield* Scope.addFinalizer(scope, Effect.sync(() => db.close()))
|
|
131
|
+
db.enableLoadExtension(false)
|
|
108
132
|
|
|
109
133
|
if (options.disableWAL !== true) {
|
|
110
|
-
db.
|
|
134
|
+
db.exec("PRAGMA journal_mode = WAL")
|
|
111
135
|
}
|
|
112
136
|
|
|
113
137
|
const prepareCache = yield* Cache.make({
|
|
@@ -116,28 +140,67 @@ export const make = (
|
|
|
116
140
|
lookup: (sql: string) =>
|
|
117
141
|
Effect.try({
|
|
118
142
|
try: () => db.prepare(sql),
|
|
119
|
-
catch: (cause) => new SqlError({ cause,
|
|
143
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to prepare statement", "prepare") })
|
|
120
144
|
})
|
|
121
145
|
})
|
|
122
146
|
|
|
123
147
|
const runStatement = (
|
|
124
|
-
statement:
|
|
148
|
+
statement: StatementSync,
|
|
125
149
|
params: ReadonlyArray<unknown>,
|
|
126
150
|
raw: boolean
|
|
127
151
|
) =>
|
|
128
152
|
Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
153
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
|
|
154
|
+
return Effect.try({
|
|
155
|
+
try: () => {
|
|
156
|
+
statement.setReadBigInts(useSafeIntegers)
|
|
157
|
+
if (statement.columns().length > 0) {
|
|
158
|
+
return statement.all(...(params as Array<any>)) as ReadonlyArray<any>
|
|
159
|
+
}
|
|
160
|
+
const result = statement.run(...(params as Array<any>))
|
|
161
|
+
return raw ? { changes: result.changes, lastInsertRowid: result.lastInsertRowid } as any : []
|
|
162
|
+
},
|
|
163
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
const runStatementValues = (
|
|
168
|
+
statement: StatementSync,
|
|
169
|
+
params: ReadonlyArray<unknown>
|
|
170
|
+
) =>
|
|
171
|
+
Effect.withFiber<ReadonlyArray<ReadonlyArray<unknown>>, SqlError>((fiber) => {
|
|
172
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
|
|
173
|
+
return Effect.try({
|
|
174
|
+
try: () => {
|
|
175
|
+
statement.setReadBigInts(useSafeIntegers)
|
|
176
|
+
if (statement.columns().length > 0) {
|
|
177
|
+
return statement.all(...(params as Array<any>)) as unknown as ReadonlyArray<ReadonlyArray<unknown>>
|
|
178
|
+
}
|
|
179
|
+
statement.run(...(params as Array<any>))
|
|
180
|
+
return []
|
|
181
|
+
},
|
|
182
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
183
|
+
})
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
const runStatementValuesUnprepared = (
|
|
187
|
+
statement: StatementSync,
|
|
188
|
+
params: ReadonlyArray<unknown>
|
|
189
|
+
) =>
|
|
190
|
+
Effect.withFiber<ReadonlyArray<ReadonlyArray<unknown>>, SqlError>((fiber) => {
|
|
191
|
+
const useSafeIntegers = Context.get(fiber.context, Client.SafeIntegers)
|
|
192
|
+
return Effect.try({
|
|
193
|
+
try: () => {
|
|
194
|
+
statement.setReadBigInts(useSafeIntegers)
|
|
195
|
+
statement.setReturnArrays(true)
|
|
196
|
+
if (statement.columns().length > 0) {
|
|
197
|
+
return statement.all(...(params as Array<any>)) as unknown as ReadonlyArray<ReadonlyArray<unknown>>
|
|
198
|
+
}
|
|
199
|
+
statement.run(...(params as Array<any>))
|
|
200
|
+
return []
|
|
201
|
+
},
|
|
202
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to execute statement", "execute") })
|
|
203
|
+
})
|
|
141
204
|
})
|
|
142
205
|
|
|
143
206
|
const run = (
|
|
@@ -156,23 +219,18 @@ export const make = (
|
|
|
156
219
|
) =>
|
|
157
220
|
Effect.acquireUseRelease(
|
|
158
221
|
Cache.get(prepareCache, sql),
|
|
159
|
-
(statement) =>
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
return statement.all(...params) as ReadonlyArray<
|
|
165
|
-
ReadonlyArray<unknown>
|
|
166
|
-
>
|
|
167
|
-
}
|
|
168
|
-
statement.run(...params)
|
|
169
|
-
return []
|
|
170
|
-
},
|
|
171
|
-
catch: (cause) => new SqlError({ cause, message: "Failed to execute statement" })
|
|
172
|
-
}),
|
|
173
|
-
(statement) => Effect.sync(() => statement.reader && statement.raw(false))
|
|
222
|
+
(statement) => {
|
|
223
|
+
statement.setReturnArrays(true)
|
|
224
|
+
return runStatementValues(statement, params)
|
|
225
|
+
},
|
|
226
|
+
(statement) => Effect.sync(() => statement.setReturnArrays(false))
|
|
174
227
|
)
|
|
175
228
|
|
|
229
|
+
const runValuesUnprepared = (
|
|
230
|
+
sql: string,
|
|
231
|
+
params: ReadonlyArray<unknown>
|
|
232
|
+
) => runStatementValuesUnprepared(db.prepare(sql), params)
|
|
233
|
+
|
|
176
234
|
return identity<SqliteConnection>({
|
|
177
235
|
execute(sql, params, transformRows) {
|
|
178
236
|
return transformRows
|
|
@@ -185,6 +243,9 @@ export const make = (
|
|
|
185
243
|
executeValues(sql, params) {
|
|
186
244
|
return runValues(sql, params)
|
|
187
245
|
},
|
|
246
|
+
executeValuesUnprepared(sql, params) {
|
|
247
|
+
return runValuesUnprepared(sql, params)
|
|
248
|
+
},
|
|
188
249
|
executeUnprepared(sql, params, transformRows) {
|
|
189
250
|
const effect = runStatement(db.prepare(sql), params ?? [], false)
|
|
190
251
|
return transformRows ? Effect.map(effect, transformRows) : effect
|
|
@@ -192,32 +253,42 @@ export const make = (
|
|
|
192
253
|
executeStream(_sql, _params) {
|
|
193
254
|
return Stream.die("executeStream not implemented")
|
|
194
255
|
},
|
|
195
|
-
export: Effect.try({
|
|
196
|
-
try: () => db.serialize(),
|
|
197
|
-
catch: (cause) => new SqlError({ cause, message: "Failed to export database" })
|
|
198
|
-
}),
|
|
199
256
|
backup(destination) {
|
|
200
|
-
return Effect.
|
|
201
|
-
|
|
202
|
-
|
|
257
|
+
return Effect.suspend(() => {
|
|
258
|
+
let totalPages = 0
|
|
259
|
+
return Effect.tryPromise({
|
|
260
|
+
try: () =>
|
|
261
|
+
backupDatabase(db, destination, {
|
|
262
|
+
progress: (progress) => {
|
|
263
|
+
totalPages = progress.totalPages
|
|
264
|
+
}
|
|
265
|
+
}).then((pages): BackupMetadata => ({ totalPages: totalPages || pages, remainingPages: 0 })),
|
|
266
|
+
catch: (cause) => new SqlError({ reason: classifyError(cause, "Failed to backup database", "backup") })
|
|
267
|
+
})
|
|
203
268
|
})
|
|
204
269
|
},
|
|
205
270
|
loadExtension(path) {
|
|
206
|
-
return Effect.
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
271
|
+
return Effect.acquireUseRelease(
|
|
272
|
+
Effect.sync(() => db.enableLoadExtension(true)),
|
|
273
|
+
() =>
|
|
274
|
+
Effect.try({
|
|
275
|
+
try: () => db.loadExtension(path),
|
|
276
|
+
catch: (cause) =>
|
|
277
|
+
new SqlError({ reason: classifyError(cause, "Failed to load extension", "loadExtension") })
|
|
278
|
+
}),
|
|
279
|
+
() => Effect.sync(() => db.enableLoadExtension(false))
|
|
280
|
+
)
|
|
210
281
|
}
|
|
211
282
|
})
|
|
212
283
|
})
|
|
213
284
|
|
|
214
|
-
const semaphore = yield*
|
|
285
|
+
const semaphore = yield* Semaphore.make(1)
|
|
215
286
|
const connection = yield* makeConnection
|
|
216
287
|
|
|
217
288
|
const acquirer = semaphore.withPermits(1)(Effect.succeed(connection))
|
|
218
289
|
const transactionAcquirer = Effect.uninterruptibleMask((restore) => {
|
|
219
290
|
const fiber = Fiber.getCurrent()!
|
|
220
|
-
const scope =
|
|
291
|
+
const scope = Context.getUnsafe(fiber.context, Scope.Scope)
|
|
221
292
|
return Effect.as(
|
|
222
293
|
Effect.tap(
|
|
223
294
|
restore(semaphore.take(1)),
|
|
@@ -241,7 +312,6 @@ export const make = (
|
|
|
241
312
|
{
|
|
242
313
|
[TypeId]: TypeId as TypeId,
|
|
243
314
|
config: options,
|
|
244
|
-
export: Effect.flatMap(acquirer, (_) => _.export),
|
|
245
315
|
backup: (destination: string) => Effect.flatMap(acquirer, (_) => _.backup(destination)),
|
|
246
316
|
loadExtension: (path: string) => Effect.flatMap(acquirer, (_) => _.loadExtension(path))
|
|
247
317
|
}
|
|
@@ -249,33 +319,53 @@ export const make = (
|
|
|
249
319
|
})
|
|
250
320
|
|
|
251
321
|
/**
|
|
322
|
+
* Builds a layer from an Effect `Config` value, providing both the node `SqliteClient` service and the generic `SqlClient` service.
|
|
323
|
+
*
|
|
252
324
|
* @category layers
|
|
253
|
-
* @since
|
|
325
|
+
* @since 4.0.0
|
|
254
326
|
*/
|
|
255
327
|
export const layerConfig = (
|
|
256
328
|
config: Config.Wrap<SqliteClientConfig>
|
|
257
329
|
): Layer.Layer<SqliteClient | Client.SqlClient, Config.ConfigError> =>
|
|
258
|
-
Layer.
|
|
259
|
-
Config.unwrap(config).
|
|
330
|
+
Layer.effectContext(
|
|
331
|
+
Config.unwrap(config).pipe(
|
|
260
332
|
Effect.flatMap(make),
|
|
261
333
|
Effect.map((client) =>
|
|
262
|
-
|
|
263
|
-
|
|
334
|
+
Context.make(SqliteClient, client).pipe(
|
|
335
|
+
Context.add(Client.SqlClient, client)
|
|
264
336
|
)
|
|
265
337
|
)
|
|
266
338
|
)
|
|
267
339
|
).pipe(Layer.provide(Reactivity.layer))
|
|
268
340
|
|
|
269
341
|
/**
|
|
342
|
+
* Builds a layer from a node SQLite client configuration, providing both `SqliteClient` and the generic `SqlClient` service.
|
|
343
|
+
*
|
|
270
344
|
* @category layers
|
|
271
|
-
* @since
|
|
345
|
+
* @since 4.0.0
|
|
272
346
|
*/
|
|
273
347
|
export const layer = (
|
|
274
348
|
config: SqliteClientConfig
|
|
275
349
|
): Layer.Layer<SqliteClient | Client.SqlClient> =>
|
|
276
|
-
Layer.
|
|
350
|
+
Layer.effectContext(
|
|
277
351
|
Effect.map(make(config), (client) =>
|
|
278
|
-
|
|
279
|
-
|
|
352
|
+
Context.make(SqliteClient, client).pipe(
|
|
353
|
+
Context.add(Client.SqlClient, client)
|
|
280
354
|
))
|
|
281
355
|
).pipe(Layer.provide(Reactivity.layer))
|
|
356
|
+
|
|
357
|
+
// internal
|
|
358
|
+
|
|
359
|
+
const classifyError = (cause: unknown, message: string, operation: string) =>
|
|
360
|
+
classifySqliteError(sqliteCauseWithErrno(cause), { message, operation })
|
|
361
|
+
|
|
362
|
+
const sqliteCauseWithErrno = (cause: unknown): unknown => {
|
|
363
|
+
if (typeof cause !== "object" || cause === null || !("errcode" in cause) || "errno" in cause) {
|
|
364
|
+
return cause
|
|
365
|
+
}
|
|
366
|
+
const errcode = (cause as { readonly errcode: unknown }).errcode
|
|
367
|
+
if (typeof errcode !== "number") {
|
|
368
|
+
return cause
|
|
369
|
+
}
|
|
370
|
+
return Object.assign(cause, { errno: errcode })
|
|
371
|
+
}
|
package/src/SqliteMigrator.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Runs database migrations for Node.js SQLite projects that use Effect SQL.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the shared migration loaders and errors, then provides
|
|
5
|
+
* `run` and `layer` helpers that apply pending migration files with the current
|
|
6
|
+
* `SqlClient`. It does not add Node-specific schema dump support; migration
|
|
7
|
+
* execution is handled by the shared SQL migrator.
|
|
8
|
+
*
|
|
9
|
+
* @since 4.0.0
|
|
3
10
|
*/
|
|
4
11
|
import type * as Effect from "effect/Effect"
|
|
5
12
|
import * as Layer from "effect/Layer"
|
|
@@ -8,13 +15,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
|
|
|
8
15
|
import type { SqlError } from "effect/unstable/sql/SqlError"
|
|
9
16
|
|
|
10
17
|
/**
|
|
11
|
-
* @since
|
|
18
|
+
* @since 4.0.0
|
|
12
19
|
*/
|
|
13
20
|
export * from "effect/unstable/sql/Migrator"
|
|
14
21
|
|
|
15
22
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
23
|
+
* Runs SQL migrations for a SQLite database using the shared `Migrator` implementation and the current `SqlClient`.
|
|
24
|
+
*
|
|
25
|
+
* @category constructors
|
|
26
|
+
* @since 4.0.0
|
|
18
27
|
*/
|
|
19
28
|
export const run: <R2 = never>(
|
|
20
29
|
options: Migrator.MigratorOptions<R2>
|
|
@@ -67,8 +76,10 @@ export const run: <R2 = never>(
|
|
|
67
76
|
})
|
|
68
77
|
|
|
69
78
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
79
|
+
* Creates a layer that runs the configured SQLite migrations during layer construction and provides no services.
|
|
80
|
+
*
|
|
81
|
+
* @category constructors
|
|
82
|
+
* @since 4.0.0
|
|
72
83
|
*/
|
|
73
84
|
export const layer = <R>(
|
|
74
85
|
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"
|