@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@effect/sql-sqlite-node`
2
2
 
3
- An `@effect/sql` implementation using the `better-sqlite3` library.
3
+ An Effect SQL implementation using Node.js' built-in `node:sqlite` module.
4
4
 
5
5
  ## Documentation
6
6
 
@@ -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
- * @category type ids
12
- * @since 1.0.0
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
- * @category type ids
17
- * @since 1.0.0
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 1.0.0
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 1.0.0
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
- * @category tags
43
- * @since 1.0.0
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: ServiceMap.Service<SqliteClient, 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 1.0.0
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.DurationInput | undefined;
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
- * @category constructor
62
- * @since 1.0.0
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 1.0.0
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 1.0.0
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":"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"}
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"}
@@ -1,47 +1,64 @@
1
1
  /**
2
- * @since 1.0.0
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 ServiceMap from "effect/ServiceMap";
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
- * @category type ids
22
- * @since 1.0.0
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
- * @category tags
27
- * @since 1.0.0
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__*/ServiceMap.Service("@effect/sql-sqlite-node/SqliteClient");
42
+ export const SqliteClient = /*#__PURE__*/Context.Service("@effect/sql-sqlite-node/SqliteClient");
30
43
  /**
31
- * @category constructor
32
- * @since 1.0.0
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 Sqlite(options.filename, {
40
- readonly: options.readonly ?? false
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.pragma("journal_mode = WAL");
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
- if (ServiceMap.get(fiber.services, Client.SafeIntegers)) {
59
- statement.safeIntegers(true);
60
- }
61
- try {
62
- if (statement.reader) {
63
- return Effect.succeed(statement.all(...params));
64
- }
65
- const result = statement.run(...params);
66
- return Effect.succeed(raw ? result : []);
67
- } catch (cause) {
68
- return Effect.fail(new SqlError({
69
- cause,
70
- message: "Failed to execute statement"
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 => Effect.try({
76
- try: () => {
77
- if (statement.reader) {
78
- statement.raw(true);
79
- return statement.all(...params);
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.tryPromise({
115
- try: () => db.backup(destination),
116
- catch: cause => new SqlError({
117
- cause,
118
- message: "Failed to backup database"
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* Effect.makeSemaphore(1);
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 = ServiceMap.getUnsafe(fiber.services, Scope.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 1.0.0
204
+ * @since 4.0.0
158
205
  */
159
- export const layerConfig = config => Layer.effectServices(Config.unwrap(config).asEffect().pipe(Effect.flatMap(make), Effect.map(client => ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.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 1.0.0
211
+ * @since 4.0.0
163
212
  */
164
- export const layer = config => Layer.effectServices(Effect.map(make(config), client => ServiceMap.make(SqliteClient, client).pipe(ServiceMap.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.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
@@ -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":[]}
@@ -1,5 +1,12 @@
1
1
  /**
2
- * @since 1.0.0
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 1.0.0
17
+ * @since 4.0.0
11
18
  */
12
19
  export * from "effect/unstable/sql/Migrator";
13
20
  /**
14
- * @category constructor
15
- * @since 1.0.0
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
- * @category constructor
20
- * @since 1.0.0
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;;GAEG;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;;;GAGG;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;;;GAGG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EACrB,SAAS,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CACZ,KAAK,EACL,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACgB,CAAA"}
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"}
@@ -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 1.0.0
4
+ * @since 4.0.0
5
5
  */
6
6
  export * from "effect/unstable/sql/Migrator";
7
7
  /**
8
- * @category constructor
9
- * @since 1.0.0
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
- * @category constructor
56
- * @since 1.0.0
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":"AAIA,OAAO,KAAKA,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,QAAQ,MAAM,8BAA8B;AAIxD;;;AAGA,cAAc,8BAA8B;AAE5C;;;;AAIA,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;;;;AAIA,OAAO,MAAMC,KAAK,GAChBC,OAAoC,IAKjCL,KAAK,CAACM,aAAa,CAACJ,GAAG,CAACG,OAAO,CAAC,CAAC","ignoreList":[]}
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 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
  /**
5
- * @since 1.0.0
5
+ * @since 4.0.0
6
6
  */
7
7
  export * as SqliteClient from "./SqliteClient.ts";
8
8
  /**
9
- * @since 1.0.0
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 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
  // @barrel: Auto-generated exports. Do not edit manually.
5
5
  /**
6
- * @since 1.0.0
6
+ * @since 4.0.0
7
7
  */
8
8
  export * as SqliteClient from "./SqliteClient.js";
9
9
  /**
10
- * @since 1.0.0
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.1",
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-smol.git",
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-smol/issues"
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/better-sqlite3": "^7.6.13",
47
- "@effect/platform-node": "^4.0.0-beta.1",
48
- "effect": "^4.0.0-beta.1"
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.1"
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",
@@ -1,45 +1,60 @@
1
1
  /**
2
- * @since 1.0.0
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 ServiceMap from "effect/ServiceMap"
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
- * @category type ids
25
- * @since 1.0.0
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
- * @category type ids
31
- * @since 1.0.0
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 1.0.0
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 1.0.0
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
- * @category tags
61
- * @since 1.0.0
77
+ * Service tag for the node SQLite client implementation.
78
+ *
79
+ * @category services
80
+ * @since 4.0.0
62
81
  */
63
- export const SqliteClient = ServiceMap.Service<SqliteClient>("@effect/sql-sqlite-node/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 1.0.0
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.DurationInput | undefined
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
- * @category constructor
89
- * @since 1.0.0
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 Sqlite(options.filename, {
105
- readonly: options.readonly ?? false
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.pragma("journal_mode = WAL")
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, message: "Failed to prepare statement " })
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: Sqlite.Statement,
148
+ statement: StatementSync,
125
149
  params: ReadonlyArray<unknown>,
126
150
  raw: boolean
127
151
  ) =>
128
152
  Effect.withFiber<ReadonlyArray<any>, SqlError>((fiber) => {
129
- if (ServiceMap.get(fiber.services, Client.SafeIntegers)) {
130
- statement.safeIntegers(true)
131
- }
132
- try {
133
- if (statement.reader) {
134
- return Effect.succeed(statement.all(...params))
135
- }
136
- const result = statement.run(...params)
137
- return Effect.succeed(raw ? result as unknown as ReadonlyArray<any> : [])
138
- } catch (cause) {
139
- return Effect.fail(new SqlError({ cause, message: "Failed to execute statement" }))
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
- Effect.try({
161
- try: () => {
162
- if (statement.reader) {
163
- statement.raw(true)
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.tryPromise({
201
- try: () => db.backup(destination),
202
- catch: (cause) => new SqlError({ cause, message: "Failed to backup database" })
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.try({
207
- try: () => db.loadExtension(path),
208
- catch: (cause) => new SqlError({ cause, message: "Failed to load extension" })
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* Effect.makeSemaphore(1)
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 = ServiceMap.getUnsafe(fiber.services, Scope.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 1.0.0
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.effectServices(
259
- Config.unwrap(config).asEffect().pipe(
330
+ Layer.effectContext(
331
+ Config.unwrap(config).pipe(
260
332
  Effect.flatMap(make),
261
333
  Effect.map((client) =>
262
- ServiceMap.make(SqliteClient, client).pipe(
263
- ServiceMap.add(Client.SqlClient, client)
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 1.0.0
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.effectServices(
350
+ Layer.effectContext(
277
351
  Effect.map(make(config), (client) =>
278
- ServiceMap.make(SqliteClient, client).pipe(
279
- ServiceMap.add(Client.SqlClient, client)
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
+ }
@@ -1,5 +1,12 @@
1
1
  /**
2
- * @since 1.0.0
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 1.0.0
18
+ * @since 4.0.0
12
19
  */
13
20
  export * from "effect/unstable/sql/Migrator"
14
21
 
15
22
  /**
16
- * @category constructor
17
- * @since 1.0.0
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
- * @category constructor
71
- * @since 1.0.0
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 1.0.0
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 1.0.0
8
+ * @since 4.0.0
9
9
  */
10
10
  export * as SqliteClient from "./SqliteClient.ts"
11
11
 
12
12
  /**
13
- * @since 1.0.0
13
+ * @since 4.0.0
14
14
  */
15
15
  export * as SqliteMigrator from "./SqliteMigrator.ts"