@effect/sql-mysql2 4.0.0-beta.9 → 4.0.0-beta.91

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.
@@ -1,44 +1,67 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for Effect SQL, backed by the `mysql2` driver.
3
+ *
4
+ * This module provides constructors and layers for a {@link MysqlClient} and
5
+ * the generic Effect SQL client service. `make` creates a managed mysql2 pool,
6
+ * checks the connection with `SELECT 1`, maps mysql2 failures to `SqlError`,
7
+ * supports transaction connections, and exposes streaming queries through
8
+ * mysql2 query streams. It also provides direct and config-backed layers plus a
9
+ * MySQL statement compiler.
10
+ *
11
+ * @since 4.0.0
3
12
  */
4
13
  import * as Config from "effect/Config";
14
+ import * as Context from "effect/Context";
5
15
  import * as Duration from "effect/Duration";
6
16
  import * as Effect from "effect/Effect";
7
17
  import * as Layer from "effect/Layer";
8
18
  import * as Redacted from "effect/Redacted";
9
19
  import type { Scope } from "effect/Scope";
10
- import * as ServiceMap from "effect/ServiceMap";
11
20
  import * as Reactivity from "effect/unstable/reactivity/Reactivity";
12
21
  import * as Client from "effect/unstable/sql/SqlClient";
13
22
  import { SqlError } from "effect/unstable/sql/SqlError";
14
23
  import * as Statement from "effect/unstable/sql/Statement";
15
24
  import * as Mysql from "mysql2";
16
25
  /**
17
- * @category type ids
18
- * @since 1.0.0
26
+ * Runtime type identifier used to mark `MysqlClient` values.
27
+ *
28
+ * @category type IDs
29
+ * @since 4.0.0
19
30
  */
20
31
  export declare const TypeId: TypeId;
21
32
  /**
22
- * @category type ids
23
- * @since 1.0.0
33
+ * Type-level identifier used to mark `MysqlClient` values.
34
+ *
35
+ * @category type IDs
36
+ * @since 4.0.0
24
37
  */
25
38
  export type TypeId = "~@effect/sql-mysql2/MysqlClient";
26
39
  /**
40
+ * mysql2-backed SQL client service, extending `SqlClient` with its runtime type marker and client configuration.
41
+ *
27
42
  * @category models
28
- * @since 1.0.0
43
+ * @since 4.0.0
29
44
  */
30
45
  export interface MysqlClient extends Client.SqlClient {
31
46
  readonly [TypeId]: TypeId;
32
47
  readonly config: MysqlClientConfig;
33
48
  }
34
49
  /**
35
- * @category tags
36
- * @since 1.0.0
50
+ * Service tag for the mysql2 SQL client service.
51
+ *
52
+ * **When to use**
53
+ *
54
+ * Use to access or provide a mysql2 client through the Effect context.
55
+ *
56
+ * @category services
57
+ * @since 4.0.0
37
58
  */
38
- export declare const MysqlClient: ServiceMap.Service<MysqlClient, MysqlClient>;
59
+ export declare const MysqlClient: Context.Service<MysqlClient, MysqlClient>;
39
60
  /**
61
+ * Configuration for a mysql2 client, including connection URI or connection fields, pool options, span attributes, and query/result name transforms.
62
+ *
40
63
  * @category models
41
- * @since 1.0.0
64
+ * @since 4.0.0
42
65
  */
43
66
  export interface MysqlClientConfig {
44
67
  /**
@@ -58,23 +81,31 @@ export interface MysqlClientConfig {
58
81
  readonly transformQueryNames?: ((str: string) => string) | undefined;
59
82
  }
60
83
  /**
84
+ * Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
85
+ *
61
86
  * @category constructors
62
- * @since 1.0.0
87
+ * @since 4.0.0
63
88
  */
64
89
  export declare const make: (options: MysqlClientConfig) => Effect.Effect<MysqlClient, SqlError, Scope | Reactivity.Reactivity>;
65
90
  /**
91
+ * Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
92
+ *
66
93
  * @category layers
67
- * @since 1.0.0
94
+ * @since 4.0.0
68
95
  */
69
96
  export declare const layerConfig: (config: Config.Wrap<MysqlClientConfig>) => Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError>;
70
97
  /**
98
+ * Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
99
+ *
71
100
  * @category layers
72
- * @since 1.0.0
101
+ * @since 4.0.0
73
102
  */
74
103
  export declare const layer: (config: MysqlClientConfig) => Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError>;
75
104
  /**
105
+ * Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
106
+ *
76
107
  * @category compiler
77
- * @since 1.0.0
108
+ * @since 4.0.0
78
109
  */
79
110
  export declare const makeCompiler: (transform?: (_: string) => string) => Statement.Compiler;
80
111
  //# sourceMappingURL=MysqlClient.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlClient.d.ts","sourceRoot":"","sources":["../src/MysqlClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MysqlClient.d.ts","sourceRoot":"","sources":["../src/MysqlClient.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,25 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for Effect SQL, backed by the `mysql2` driver.
3
+ *
4
+ * This module provides constructors and layers for a {@link MysqlClient} and
5
+ * the generic Effect SQL client service. `make` creates a managed mysql2 pool,
6
+ * checks the connection with `SELECT 1`, maps mysql2 failures to `SqlError`,
7
+ * supports transaction connections, and exposes streaming queries through
8
+ * mysql2 query streams. It also provides direct and config-backed layers plus a
9
+ * MySQL statement compiler.
10
+ *
11
+ * @since 4.0.0
3
12
  */
4
13
  import * as Config from "effect/Config";
14
+ import * as Context from "effect/Context";
5
15
  import * as Duration from "effect/Duration";
6
16
  import * as Effect from "effect/Effect";
7
17
  import * as Layer from "effect/Layer";
8
18
  import * as Redacted from "effect/Redacted";
9
- import * as ServiceMap from "effect/ServiceMap";
10
19
  import * as Stream from "effect/Stream";
11
20
  import * as Reactivity from "effect/unstable/reactivity/Reactivity";
12
21
  import * as Client from "effect/unstable/sql/SqlClient";
13
- import { SqlError } from "effect/unstable/sql/SqlError";
22
+ import { AuthenticationError, AuthorizationError, ConnectionError, ConstraintError, DeadlockError, LockTimeoutError, SqlError, SqlSyntaxError, StatementTimeoutError, UniqueViolation, UnknownError } from "effect/unstable/sql/SqlError";
14
23
  import { asyncPauseResume } from "effect/unstable/sql/SqlStream";
15
24
  import * as Statement from "effect/unstable/sql/Statement";
16
25
  import * as Mysql from "mysql2";
@@ -18,19 +27,113 @@ const ATTR_DB_SYSTEM_NAME = "db.system.name";
18
27
  const ATTR_DB_NAMESPACE = "db.namespace";
19
28
  const ATTR_SERVER_ADDRESS = "server.address";
20
29
  const ATTR_SERVER_PORT = "server.port";
30
+ const mysqlErrnoFromCause = cause => {
31
+ if (typeof cause !== "object" || cause === null || !("errno" in cause)) {
32
+ return undefined;
33
+ }
34
+ const errno = cause.errno;
35
+ return typeof errno === "number" ? errno : undefined;
36
+ };
37
+ const mysqlConnectionErrorCodes = /*#__PURE__*/new Set([1040, 1042, 1043, 1129, 1130, 1203]);
38
+ const mysqlAuthorizationErrorCodes = /*#__PURE__*/new Set([1044, 1142, 1143, 1227]);
39
+ const mysqlSyntaxErrorCodes = /*#__PURE__*/new Set([1054, 1064, 1146]);
40
+ const mysqlConstraintErrorCodes = /*#__PURE__*/new Set([1022, 1048, 1169, 1216, 1217, 1451, 1452, 1557]);
41
+ const UNKNOWN_CONSTRAINT = "unknown";
42
+ const normalizeConstraintIdentifier = identifier => {
43
+ if (typeof identifier !== "string") {
44
+ return UNKNOWN_CONSTRAINT;
45
+ }
46
+ const trimmed = identifier.trim();
47
+ return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed;
48
+ };
49
+ const mysqlCauseProperty = (cause, property) => {
50
+ if (typeof cause !== "object" || cause === null || !(property in cause)) {
51
+ return undefined;
52
+ }
53
+ return cause[property];
54
+ };
55
+ const mysqlDuplicateEntryConstraintFromMessage = message => {
56
+ if (typeof message !== "string") {
57
+ return UNKNOWN_CONSTRAINT;
58
+ }
59
+ const match = /\bfor key\s+(?:'([^']*)'|\x60([^\x60]*)\x60|([^\s'\x60]+))/i.exec(message);
60
+ return match === null ? UNKNOWN_CONSTRAINT : normalizeConstraintIdentifier(match[1] ?? match[2] ?? match[3]);
61
+ };
62
+ const mysqlDuplicateEntryConstraintFromCause = cause => {
63
+ const constraint = normalizeConstraintIdentifier(mysqlCauseProperty(cause, "constraint"));
64
+ if (constraint !== UNKNOWN_CONSTRAINT) {
65
+ return constraint;
66
+ }
67
+ const sqlMessageConstraint = mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "sqlMessage"));
68
+ if (sqlMessageConstraint !== UNKNOWN_CONSTRAINT) {
69
+ return sqlMessageConstraint;
70
+ }
71
+ return mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "message"));
72
+ };
73
+ const classifyError = (cause, message, operation) => {
74
+ const props = {
75
+ cause,
76
+ message,
77
+ operation
78
+ };
79
+ const errno = mysqlErrnoFromCause(cause);
80
+ if (errno !== undefined) {
81
+ if (mysqlConnectionErrorCodes.has(errno)) {
82
+ return new ConnectionError(props);
83
+ }
84
+ if (errno === 1045) {
85
+ return new AuthenticationError(props);
86
+ }
87
+ if (mysqlAuthorizationErrorCodes.has(errno)) {
88
+ return new AuthorizationError(props);
89
+ }
90
+ if (mysqlSyntaxErrorCodes.has(errno)) {
91
+ return new SqlSyntaxError(props);
92
+ }
93
+ if (errno === 1062) {
94
+ return new UniqueViolation({
95
+ ...props,
96
+ constraint: mysqlDuplicateEntryConstraintFromCause(cause)
97
+ });
98
+ }
99
+ if (mysqlConstraintErrorCodes.has(errno)) {
100
+ return new ConstraintError(props);
101
+ }
102
+ if (errno === 1213) {
103
+ return new DeadlockError(props);
104
+ }
105
+ if (errno === 1205) {
106
+ return new LockTimeoutError(props);
107
+ }
108
+ if (errno === 3024) {
109
+ return new StatementTimeoutError(props);
110
+ }
111
+ }
112
+ return new UnknownError(props);
113
+ };
21
114
  /**
22
- * @category type ids
23
- * @since 1.0.0
115
+ * Runtime type identifier used to mark `MysqlClient` values.
116
+ *
117
+ * @category type IDs
118
+ * @since 4.0.0
24
119
  */
25
120
  export const TypeId = "~@effect/sql-mysql2/MysqlClient";
26
121
  /**
27
- * @category tags
28
- * @since 1.0.0
122
+ * Service tag for the mysql2 SQL client service.
123
+ *
124
+ * **When to use**
125
+ *
126
+ * Use to access or provide a mysql2 client through the Effect context.
127
+ *
128
+ * @category services
129
+ * @since 4.0.0
29
130
  */
30
- export const MysqlClient = /*#__PURE__*/ServiceMap.Service("@effect/sql-mysql2/MysqlClient");
131
+ export const MysqlClient = /*#__PURE__*/Context.Service("@effect/sql-mysql2/MysqlClient");
31
132
  /**
133
+ * Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
134
+ *
32
135
  * @category constructors
33
- * @since 1.0.0
136
+ * @since 4.0.0
34
137
  */
35
138
  export const make = options => Effect.gen(function* () {
36
139
  const compiler = makeCompiler(options.transformQueryNames);
@@ -42,7 +145,7 @@ export const make = options => Effect.gen(function* () {
42
145
  }
43
146
  runRaw(sql, values, rowsAsArray = false, method = "execute") {
44
147
  return Effect.callback(resume => {
45
- ;
148
+ const operation = method === "query" ? "executeUnprepared" : "execute";
46
149
  this.conn[method]({
47
150
  sql,
48
151
  values,
@@ -50,8 +153,7 @@ export const make = options => Effect.gen(function* () {
50
153
  }, (cause, results, _fields) => {
51
154
  if (cause) {
52
155
  resume(Effect.fail(new SqlError({
53
- cause,
54
- message: "Failed to execute statement"
156
+ reason: classifyError(cause, "Failed to execute statement", operation)
55
157
  })));
56
158
  } else {
57
159
  resume(Effect.succeed(results));
@@ -71,6 +173,9 @@ export const make = options => Effect.gen(function* () {
71
173
  executeValues(sql, params) {
72
174
  return this.run(sql, params, true);
73
175
  }
176
+ executeValuesUnprepared(sql, params) {
177
+ return this.run(sql, params, true, "query");
178
+ }
74
179
  executeUnprepared(sql, params, transformRows) {
75
180
  return transformRows ? Effect.map(this.run(sql, params, false, "query"), transformRows) : this.run(sql, params, false, "query");
76
181
  }
@@ -102,8 +207,7 @@ export const make = options => Effect.gen(function* () {
102
207
  pool.query("SELECT 1", cause => {
103
208
  if (cause) {
104
209
  resume(Effect.fail(new SqlError({
105
- cause,
106
- message: "MysqlClient: Failed to connect"
210
+ reason: classifyError(cause, "MysqlClient: Failed to connect", "connect")
107
211
  })));
108
212
  } else {
109
213
  resume(Effect.void);
@@ -113,9 +217,12 @@ export const make = options => Effect.gen(function* () {
113
217
  pool.end(() => resume(Effect.void));
114
218
  })).pipe(Effect.timeoutOrElse({
115
219
  duration: Duration.seconds(5),
116
- onTimeout: () => Effect.fail(new SqlError({
117
- message: "MysqlClient: Connection timeout",
118
- cause: new Error("connection timeout")
220
+ orElse: () => Effect.fail(new SqlError({
221
+ reason: new ConnectionError({
222
+ message: "MysqlClient: Connection timeout",
223
+ cause: new Error("connection timeout"),
224
+ operation: "connect"
225
+ })
119
226
  }))
120
227
  }));
121
228
  const poolConnection = new ConnectionImpl(pool);
@@ -123,8 +230,7 @@ export const make = options => Effect.gen(function* () {
123
230
  pool.getConnection((cause, conn) => {
124
231
  if (cause) {
125
232
  resume(Effect.fail(new SqlError({
126
- cause,
127
- message: "Failed to acquire connection"
233
+ reason: classifyError(cause, "Failed to acquire connection", "acquireConnection")
128
234
  })));
129
235
  } else {
130
236
  resume(Effect.succeed(conn));
@@ -148,18 +254,24 @@ export const make = options => Effect.gen(function* () {
148
254
  });
149
255
  });
150
256
  /**
257
+ * Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
258
+ *
151
259
  * @category layers
152
- * @since 1.0.0
260
+ * @since 4.0.0
153
261
  */
154
- export const layerConfig = config => Layer.effectServices(Config.unwrap(config).asEffect().pipe(Effect.flatMap(make), Effect.map(client => ServiceMap.make(MysqlClient, client).pipe(ServiceMap.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
262
+ export const layerConfig = config => Layer.effectContext(Config.unwrap(config).pipe(Effect.flatMap(make), Effect.map(client => Context.make(MysqlClient, client).pipe(Context.add(Client.SqlClient, client))))).pipe(Layer.provide(Reactivity.layer));
155
263
  /**
264
+ * Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
265
+ *
156
266
  * @category layers
157
- * @since 1.0.0
267
+ * @since 4.0.0
158
268
  */
159
- export const layer = config => Layer.effectServices(Effect.map(make(config), client => ServiceMap.make(MysqlClient, client).pipe(ServiceMap.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
269
+ export const layer = config => Layer.effectContext(Effect.map(make(config), client => Context.make(MysqlClient, client).pipe(Context.add(Client.SqlClient, client)))).pipe(Layer.provide(Reactivity.layer));
160
270
  /**
271
+ * Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
272
+ *
161
273
  * @category compiler
162
- * @since 1.0.0
274
+ * @since 4.0.0
163
275
  */
164
276
  export const makeCompiler = transform => Statement.makeCompiler({
165
277
  dialect: "mysql",
@@ -184,8 +296,7 @@ function queryStream(conn, sql, params) {
184
296
  let buffer = [];
185
297
  let taskPending = false;
186
298
  query.on("error", cause => emit.fail(new SqlError({
187
- cause,
188
- message: "Failed to stream statement"
299
+ reason: classifyError(cause, "Failed to stream statement", "stream")
189
300
  })));
190
301
  query.on("data", row => {
191
302
  buffer.push(row);
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlClient.js","names":["Config","Duration","Effect","Layer","Redacted","ServiceMap","Stream","Reactivity","Client","SqlError","asyncPauseResume","Statement","Mysql","ATTR_DB_SYSTEM_NAME","ATTR_DB_NAMESPACE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","TypeId","MysqlClient","Service","make","options","gen","compiler","makeCompiler","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","undefined","ConnectionImpl","conn","constructor","runRaw","sql","values","rowsAsArray","method","callback","resume","cause","results","_fields","fail","message","succeed","run","pipe","map","Array","isArray","execute","params","executeRaw","executeValues","executeUnprepared","executeStream","stream","queryStream","mapArray","_","pool","url","createPool","uri","value","multipleStatements","supportBigNumbers","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","fromInputUnsafe","poolConfig","host","port","database","user","username","password","acquireRelease","query","void","end","timeoutOrElse","duration","seconds","onTimeout","Error","poolConnection","acquireConn","getConnection","sync","release","transactionAcquirer","spanAttributes","Object","entries","push","assign","acquirer","config","layerConfig","effectServices","unwrap","asEffect","flatMap","client","add","SqlClient","provide","layer","transform","dialect","placeholder","onIdentifier","withoutTransform","escape","onCustom","onRecordUpdate","defaultEscape","fnUntraced","emit","addFinalizer","destroy","buffer","taskPending","on","row","queueMicrotask","items","length","onPause","pause","onResume"],"sources":["../src/MysqlClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"MysqlClient.js","names":["Config","Context","Duration","Effect","Layer","Redacted","Stream","Reactivity","Client","AuthenticationError","AuthorizationError","ConnectionError","ConstraintError","DeadlockError","LockTimeoutError","SqlError","SqlSyntaxError","StatementTimeoutError","UniqueViolation","UnknownError","asyncPauseResume","Statement","Mysql","ATTR_DB_SYSTEM_NAME","ATTR_DB_NAMESPACE","ATTR_SERVER_ADDRESS","ATTR_SERVER_PORT","mysqlErrnoFromCause","cause","undefined","errno","mysqlConnectionErrorCodes","Set","mysqlAuthorizationErrorCodes","mysqlSyntaxErrorCodes","mysqlConstraintErrorCodes","UNKNOWN_CONSTRAINT","normalizeConstraintIdentifier","identifier","trimmed","trim","length","mysqlCauseProperty","property","mysqlDuplicateEntryConstraintFromMessage","message","match","exec","mysqlDuplicateEntryConstraintFromCause","constraint","sqlMessageConstraint","classifyError","operation","props","has","TypeId","MysqlClient","Service","make","options","gen","compiler","makeCompiler","transformQueryNames","transformRows","transformResultNames","defaultTransforms","array","ConnectionImpl","conn","constructor","runRaw","sql","values","rowsAsArray","method","callback","resume","results","_fields","fail","reason","succeed","run","pipe","map","Array","isArray","execute","params","executeRaw","executeValues","executeValuesUnprepared","executeUnprepared","executeStream","stream","queryStream","mapArray","_","pool","url","createPool","uri","value","multipleStatements","supportBigNumbers","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","fromInputUnsafe","poolConfig","host","port","database","user","username","password","acquireRelease","query","void","end","timeoutOrElse","duration","seconds","orElse","Error","poolConnection","acquireConn","getConnection","sync","release","transactionAcquirer","spanAttributes","Object","entries","push","assign","acquirer","config","layerConfig","effectContext","unwrap","flatMap","client","add","SqlClient","provide","layer","transform","dialect","placeholder","onIdentifier","withoutTransform","escape","onCustom","onRecordUpdate","defaultEscape","fnUntraced","emit","addFinalizer","destroy","buffer","taskPending","on","row","queueMicrotask","items","onPause","pause","onResume"],"sources":["../src/MysqlClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,13 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for the shared Effect SQL migration runner.
3
+ *
4
+ * This module re-exports the shared `Migrator` loaders and error types, then
5
+ * provides `run` and `layer` helpers that apply ordered migrations through the
6
+ * current mysql2-backed `SqlClient`. `run` returns the applied migration IDs
7
+ * and names, while `layer` runs migrations during layer construction and
8
+ * provides no services.
9
+ *
10
+ * @since 4.0.0
3
11
  */
4
12
  import type * as Effect from "effect/Effect";
5
13
  import * as Layer from "effect/Layer";
@@ -7,17 +15,21 @@ import * as Migrator from "effect/unstable/sql/Migrator";
7
15
  import type * as Client from "effect/unstable/sql/SqlClient";
8
16
  import type { SqlError } from "effect/unstable/sql/SqlError";
9
17
  /**
10
- * @since 1.0.0
18
+ * @since 4.0.0
11
19
  */
12
20
  export * from "effect/unstable/sql/Migrator";
13
21
  /**
14
- * @category constructor
15
- * @since 1.0.0
22
+ * Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
23
+ *
24
+ * @category constructors
25
+ * @since 4.0.0
16
26
  */
17
27
  export declare const run: <R2 = never>({ loader, schemaDirectory, table }: Migrator.MigratorOptions<R2>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, Migrator.MigrationError | SqlError, Client.SqlClient | R2>;
18
28
  /**
29
+ * Creates a layer that runs the configured SQL migrations during layer construction.
30
+ *
19
31
  * @category layers
20
- * @since 1.0.0
32
+ * @since 4.0.0
21
33
  */
22
34
  export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, Migrator.MigrationError | SqlError, Client.SqlClient | R>;
23
35
  //# sourceMappingURL=MysqlMigrator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlMigrator.d.ts","sourceRoot":"","sources":["../src/MysqlMigrator.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,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAC7D,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,CAsDrB,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":"MysqlMigrator.d.ts","sourceRoot":"","sources":["../src/MysqlMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;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,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAC7D,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,CAsDrB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAAI,CAAC,EACrB,SAAS,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACnC,KAAK,CAAC,KAAK,CACZ,KAAK,EACL,QAAQ,CAAC,cAAc,GAAG,QAAQ,EAClC,MAAM,CAAC,SAAS,GAAG,CAAC,CACgB,CAAA"}
@@ -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 using the configured `SqlClient`, returning the migrations that were applied.
9
+ *
10
+ * @category constructors
11
+ * @since 4.0.0
10
12
  */
11
13
  export const run = /*#__PURE__*/Migrator.make({
12
14
  // TODO: re-add when Command module is available
@@ -63,8 +65,10 @@ export const run = /*#__PURE__*/Migrator.make({
63
65
  // }
64
66
  });
65
67
  /**
68
+ * Creates a layer that runs the configured SQL migrations during layer construction.
69
+ *
66
70
  * @category layers
67
- * @since 1.0.0
71
+ * @since 4.0.0
68
72
  */
69
73
  export const layer = options => Layer.effectDiscard(run(options));
70
74
  //# sourceMappingURL=MysqlMigrator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MysqlMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/MysqlMigrator.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;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":"MysqlMigrator.js","names":["Layer","Migrator","run","make","layer","options","effectDiscard"],"sources":["../src/MysqlMigrator.ts"],"sourcesContent":[null],"mappings":"AAYA,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;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 MysqlClient from "./MysqlClient.ts";
8
8
  /**
9
- * @since 1.0.0
9
+ * @since 4.0.0
10
10
  */
11
11
  export * as MysqlMigrator from "./MysqlMigrator.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 MysqlClient from "./MysqlClient.js";
9
9
  /**
10
- * @since 1.0.0
10
+ * @since 4.0.0
11
11
  */
12
12
  export * as MysqlMigrator from "./MysqlMigrator.js";
13
13
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/sql-mysql2",
3
- "version": "4.0.0-beta.9",
3
+ "version": "4.0.0-beta.91",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "A MySQL toolkit for Effect",
@@ -43,14 +43,14 @@
43
43
  "provenance": true
44
44
  },
45
45
  "devDependencies": {
46
- "@testcontainers/mysql": "^11.11.0",
47
- "effect": "^4.0.0-beta.9"
46
+ "@testcontainers/mysql": "^11.14.0",
47
+ "effect": "^4.0.0-beta.91"
48
48
  },
49
49
  "peerDependencies": {
50
- "effect": "^4.0.0-beta.9"
50
+ "effect": "^4.0.0-beta.91"
51
51
  },
52
52
  "dependencies": {
53
- "mysql2": "^3.16.2"
53
+ "mysql2": "^3.22.3"
54
54
  },
55
55
  "scripts": {
56
56
  "codegen": "effect-utils codegen",
@@ -1,18 +1,39 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for Effect SQL, backed by the `mysql2` driver.
3
+ *
4
+ * This module provides constructors and layers for a {@link MysqlClient} and
5
+ * the generic Effect SQL client service. `make` creates a managed mysql2 pool,
6
+ * checks the connection with `SELECT 1`, maps mysql2 failures to `SqlError`,
7
+ * supports transaction connections, and exposes streaming queries through
8
+ * mysql2 query streams. It also provides direct and config-backed layers plus a
9
+ * MySQL statement compiler.
10
+ *
11
+ * @since 4.0.0
3
12
  */
4
13
  import * as Config from "effect/Config"
14
+ import * as Context from "effect/Context"
5
15
  import * as Duration from "effect/Duration"
6
16
  import * as Effect from "effect/Effect"
7
17
  import * as Layer from "effect/Layer"
8
18
  import * as Redacted from "effect/Redacted"
9
19
  import type { Scope } from "effect/Scope"
10
- import * as ServiceMap from "effect/ServiceMap"
11
20
  import * as Stream from "effect/Stream"
12
21
  import * as Reactivity from "effect/unstable/reactivity/Reactivity"
13
22
  import * as Client from "effect/unstable/sql/SqlClient"
14
23
  import type { Connection } from "effect/unstable/sql/SqlConnection"
15
- import { SqlError } from "effect/unstable/sql/SqlError"
24
+ import {
25
+ AuthenticationError,
26
+ AuthorizationError,
27
+ ConnectionError,
28
+ ConstraintError,
29
+ DeadlockError,
30
+ LockTimeoutError,
31
+ SqlError,
32
+ SqlSyntaxError,
33
+ StatementTimeoutError,
34
+ UniqueViolation,
35
+ UnknownError
36
+ } from "effect/unstable/sql/SqlError"
16
37
  import { asyncPauseResume } from "effect/unstable/sql/SqlStream"
17
38
  import * as Statement from "effect/unstable/sql/Statement"
18
39
  import * as Mysql from "mysql2"
@@ -22,21 +43,118 @@ const ATTR_DB_NAMESPACE = "db.namespace"
22
43
  const ATTR_SERVER_ADDRESS = "server.address"
23
44
  const ATTR_SERVER_PORT = "server.port"
24
45
 
46
+ const mysqlErrnoFromCause = (cause: unknown): number | undefined => {
47
+ if (typeof cause !== "object" || cause === null || !("errno" in cause)) {
48
+ return undefined
49
+ }
50
+ const errno = cause.errno
51
+ return typeof errno === "number" ? errno : undefined
52
+ }
53
+
54
+ const mysqlConnectionErrorCodes = new Set([1040, 1042, 1043, 1129, 1130, 1203])
55
+ const mysqlAuthorizationErrorCodes = new Set([1044, 1142, 1143, 1227])
56
+ const mysqlSyntaxErrorCodes = new Set([1054, 1064, 1146])
57
+ const mysqlConstraintErrorCodes = new Set([1022, 1048, 1169, 1216, 1217, 1451, 1452, 1557])
58
+
59
+ const UNKNOWN_CONSTRAINT = "unknown"
60
+
61
+ const normalizeConstraintIdentifier = (identifier: unknown): string => {
62
+ if (typeof identifier !== "string") {
63
+ return UNKNOWN_CONSTRAINT
64
+ }
65
+ const trimmed = identifier.trim()
66
+ return trimmed.length === 0 ? UNKNOWN_CONSTRAINT : trimmed
67
+ }
68
+
69
+ const mysqlCauseProperty = (cause: unknown, property: "constraint" | "message" | "sqlMessage"): unknown => {
70
+ if (typeof cause !== "object" || cause === null || !(property in cause)) {
71
+ return undefined
72
+ }
73
+ return (cause as Record<string, unknown>)[property]
74
+ }
75
+
76
+ const mysqlDuplicateEntryConstraintFromMessage = (message: unknown): string => {
77
+ if (typeof message !== "string") {
78
+ return UNKNOWN_CONSTRAINT
79
+ }
80
+ const match = /\bfor key\s+(?:'([^']*)'|\x60([^\x60]*)\x60|([^\s'\x60]+))/i.exec(message)
81
+ return match === null ?
82
+ UNKNOWN_CONSTRAINT :
83
+ normalizeConstraintIdentifier(match[1] ?? match[2] ?? match[3])
84
+ }
85
+
86
+ const mysqlDuplicateEntryConstraintFromCause = (cause: unknown): string => {
87
+ const constraint = normalizeConstraintIdentifier(mysqlCauseProperty(cause, "constraint"))
88
+ if (constraint !== UNKNOWN_CONSTRAINT) {
89
+ return constraint
90
+ }
91
+ const sqlMessageConstraint = mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "sqlMessage"))
92
+ if (sqlMessageConstraint !== UNKNOWN_CONSTRAINT) {
93
+ return sqlMessageConstraint
94
+ }
95
+ return mysqlDuplicateEntryConstraintFromMessage(mysqlCauseProperty(cause, "message"))
96
+ }
97
+
98
+ const classifyError = (
99
+ cause: unknown,
100
+ message: string,
101
+ operation: string
102
+ ) => {
103
+ const props = { cause, message, operation }
104
+ const errno = mysqlErrnoFromCause(cause)
105
+ if (errno !== undefined) {
106
+ if (mysqlConnectionErrorCodes.has(errno)) {
107
+ return new ConnectionError(props)
108
+ }
109
+ if (errno === 1045) {
110
+ return new AuthenticationError(props)
111
+ }
112
+ if (mysqlAuthorizationErrorCodes.has(errno)) {
113
+ return new AuthorizationError(props)
114
+ }
115
+ if (mysqlSyntaxErrorCodes.has(errno)) {
116
+ return new SqlSyntaxError(props)
117
+ }
118
+ if (errno === 1062) {
119
+ return new UniqueViolation({ ...props, constraint: mysqlDuplicateEntryConstraintFromCause(cause) })
120
+ }
121
+ if (mysqlConstraintErrorCodes.has(errno)) {
122
+ return new ConstraintError(props)
123
+ }
124
+ if (errno === 1213) {
125
+ return new DeadlockError(props)
126
+ }
127
+ if (errno === 1205) {
128
+ return new LockTimeoutError(props)
129
+ }
130
+ if (errno === 3024) {
131
+ return new StatementTimeoutError(props)
132
+ }
133
+ }
134
+ return new UnknownError(props)
135
+ }
136
+
25
137
  /**
26
- * @category type ids
27
- * @since 1.0.0
138
+ * Runtime type identifier used to mark `MysqlClient` values.
139
+ *
140
+ * @category type IDs
141
+ * @since 4.0.0
28
142
  */
29
143
  export const TypeId: TypeId = "~@effect/sql-mysql2/MysqlClient"
30
144
 
31
145
  /**
32
- * @category type ids
33
- * @since 1.0.0
146
+ * Type-level identifier used to mark `MysqlClient` values.
147
+ *
148
+ * @category type IDs
149
+ * @since 4.0.0
34
150
  */
35
151
  export type TypeId = "~@effect/sql-mysql2/MysqlClient"
36
152
 
37
153
  /**
154
+ * mysql2-backed SQL client service, extending `SqlClient` with its runtime type marker and client configuration.
155
+ *
38
156
  * @category models
39
- * @since 1.0.0
157
+ * @since 4.0.0
40
158
  */
41
159
  export interface MysqlClient extends Client.SqlClient {
42
160
  readonly [TypeId]: TypeId
@@ -44,14 +162,22 @@ export interface MysqlClient extends Client.SqlClient {
44
162
  }
45
163
 
46
164
  /**
47
- * @category tags
48
- * @since 1.0.0
165
+ * Service tag for the mysql2 SQL client service.
166
+ *
167
+ * **When to use**
168
+ *
169
+ * Use to access or provide a mysql2 client through the Effect context.
170
+ *
171
+ * @category services
172
+ * @since 4.0.0
49
173
  */
50
- export const MysqlClient = ServiceMap.Service<MysqlClient>("@effect/sql-mysql2/MysqlClient")
174
+ export const MysqlClient = Context.Service<MysqlClient>("@effect/sql-mysql2/MysqlClient")
51
175
 
52
176
  /**
177
+ * Configuration for a mysql2 client, including connection URI or connection fields, pool options, span attributes, and query/result name transforms.
178
+ *
53
179
  * @category models
54
- * @since 1.0.0
180
+ * @since 4.0.0
55
181
  */
56
182
  export interface MysqlClientConfig {
57
183
  /**
@@ -77,8 +203,10 @@ export interface MysqlClientConfig {
77
203
  }
78
204
 
79
205
  /**
206
+ * Creates a scoped MySQL client backed by a managed mysql2 pool, verifying connectivity and supporting streaming queries through mysql2 query streams.
207
+ *
80
208
  * @category constructors
81
- * @since 1.0.0
209
+ * @since 4.0.0
82
210
  */
83
211
  export const make = (
84
212
  options: MysqlClientConfig
@@ -104,13 +232,16 @@ export const make = (
104
232
  method: "execute" | "query" = "execute"
105
233
  ) {
106
234
  return Effect.callback<unknown, SqlError>((resume) => {
235
+ const operation = method === "query" ? "executeUnprepared" : "execute"
107
236
  ;(this.conn as any)[method]({
108
237
  sql,
109
238
  values,
110
239
  rowsAsArray
111
240
  }, (cause: unknown | null, results: unknown, _fields: any) => {
112
241
  if (cause) {
113
- resume(Effect.fail(new SqlError({ cause, message: "Failed to execute statement" })))
242
+ resume(
243
+ Effect.fail(new SqlError({ reason: classifyError(cause, "Failed to execute statement", operation) }))
244
+ )
114
245
  } else {
115
246
  resume(Effect.succeed(results))
116
247
  }
@@ -144,6 +275,9 @@ export const make = (
144
275
  executeValues(sql: string, params: ReadonlyArray<unknown>) {
145
276
  return this.run(sql, params, true)
146
277
  }
278
+ executeValuesUnprepared(sql: string, params: ReadonlyArray<unknown>) {
279
+ return this.run(sql, params, true, "query")
280
+ }
147
281
  executeUnprepared(
148
282
  sql: string,
149
283
  params: ReadonlyArray<unknown>,
@@ -198,8 +332,7 @@ export const make = (
198
332
  if (cause) {
199
333
  resume(Effect.fail(
200
334
  new SqlError({
201
- cause,
202
- message: "MysqlClient: Failed to connect"
335
+ reason: classifyError(cause, "MysqlClient: Failed to connect", "connect")
203
336
  })
204
337
  ))
205
338
  } else {
@@ -214,11 +347,14 @@ export const make = (
214
347
  ).pipe(
215
348
  Effect.timeoutOrElse({
216
349
  duration: Duration.seconds(5),
217
- onTimeout: () =>
350
+ orElse: () =>
218
351
  Effect.fail(
219
352
  new SqlError({
220
- message: "MysqlClient: Connection timeout",
221
- cause: new Error("connection timeout")
353
+ reason: new ConnectionError({
354
+ message: "MysqlClient: Connection timeout",
355
+ cause: new Error("connection timeout"),
356
+ operation: "connect"
357
+ })
222
358
  })
223
359
  )
224
360
  })
@@ -230,7 +366,13 @@ export const make = (
230
366
  Effect.callback<Mysql.PoolConnection, SqlError>((resume) => {
231
367
  pool.getConnection((cause, conn) => {
232
368
  if (cause) {
233
- resume(Effect.fail(new SqlError({ cause, message: "Failed to acquire connection" })))
369
+ resume(
370
+ Effect.fail(
371
+ new SqlError({
372
+ reason: classifyError(cause, "Failed to acquire connection", "acquireConnection")
373
+ })
374
+ )
375
+ )
234
376
  } else {
235
377
  resume(Effect.succeed(conn))
236
378
  }
@@ -268,40 +410,46 @@ export const make = (
268
410
  })
269
411
 
270
412
  /**
413
+ * Creates a layer from a `Config`-wrapped MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
414
+ *
271
415
  * @category layers
272
- * @since 1.0.0
416
+ * @since 4.0.0
273
417
  */
274
418
  export const layerConfig = (
275
419
  config: Config.Wrap<MysqlClientConfig>
276
420
  ): Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError> =>
277
- Layer.effectServices(
278
- Config.unwrap(config).asEffect().pipe(
421
+ Layer.effectContext(
422
+ Config.unwrap(config).pipe(
279
423
  Effect.flatMap(make),
280
424
  Effect.map((client) =>
281
- ServiceMap.make(MysqlClient, client).pipe(
282
- ServiceMap.add(Client.SqlClient, client)
425
+ Context.make(MysqlClient, client).pipe(
426
+ Context.add(Client.SqlClient, client)
283
427
  )
284
428
  )
285
429
  )
286
430
  ).pipe(Layer.provide(Reactivity.layer))
287
431
 
288
432
  /**
433
+ * Creates a layer from a concrete MySQL client configuration, providing both `MysqlClient` and `SqlClient`.
434
+ *
289
435
  * @category layers
290
- * @since 1.0.0
436
+ * @since 4.0.0
291
437
  */
292
438
  export const layer = (
293
439
  config: MysqlClientConfig
294
440
  ): Layer.Layer<MysqlClient | Client.SqlClient, Config.ConfigError | SqlError> =>
295
- Layer.effectServices(
441
+ Layer.effectContext(
296
442
  Effect.map(make(config), (client) =>
297
- ServiceMap.make(MysqlClient, client).pipe(
298
- ServiceMap.add(Client.SqlClient, client)
443
+ Context.make(MysqlClient, client).pipe(
444
+ Context.add(Client.SqlClient, client)
299
445
  ))
300
446
  ).pipe(Layer.provide(Reactivity.layer))
301
447
 
302
448
  /**
449
+ * Creates the MySQL statement compiler, using `?` placeholders and backtick-escaped identifiers.
450
+ *
303
451
  * @category compiler
304
- * @since 1.0.0
452
+ * @since 4.0.0
305
453
  */
306
454
  export const makeCompiler = (transform?: (_: string) => string) =>
307
455
  Statement.makeCompiler({
@@ -331,11 +479,15 @@ function queryStream(
331
479
  ) {
332
480
  return asyncPauseResume<any, SqlError>(Effect.fnUntraced(function*(emit) {
333
481
  const query = (conn as any).query(sql, params).stream()
334
- yield* Effect.addFinalizer(() => Effect.sync(() => query.destroy()))
482
+ yield* Effect.addFinalizer(() => Effect.sync(() => query.destroy() as void))
335
483
 
336
484
  let buffer: Array<any> = []
337
485
  let taskPending = false
338
- query.on("error", (cause: unknown) => emit.fail(new SqlError({ cause, message: "Failed to stream statement" })))
486
+ query.on(
487
+ "error",
488
+ (cause: unknown) =>
489
+ emit.fail(new SqlError({ reason: classifyError(cause, "Failed to stream statement", "stream") }))
490
+ )
339
491
  query.on("data", (row: any) => {
340
492
  buffer.push(row)
341
493
  if (!taskPending) {
@@ -1,5 +1,13 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * MySQL adapter for the shared Effect SQL migration runner.
3
+ *
4
+ * This module re-exports the shared `Migrator` loaders and error types, then
5
+ * provides `run` and `layer` helpers that apply ordered migrations through the
6
+ * current mysql2-backed `SqlClient`. `run` returns the applied migration IDs
7
+ * and names, while `layer` runs migrations during layer construction and
8
+ * provides no services.
9
+ *
10
+ * @since 4.0.0
3
11
  */
4
12
  import type * as Effect from "effect/Effect"
5
13
  import * as Layer from "effect/Layer"
@@ -8,13 +16,15 @@ import type * as Client from "effect/unstable/sql/SqlClient"
8
16
  import type { SqlError } from "effect/unstable/sql/SqlError"
9
17
 
10
18
  /**
11
- * @since 1.0.0
19
+ * @since 4.0.0
12
20
  */
13
21
  export * from "effect/unstable/sql/Migrator"
14
22
 
15
23
  /**
16
- * @category constructor
17
- * @since 1.0.0
24
+ * Runs SQL migrations using the configured `SqlClient`, returning the migrations that were applied.
25
+ *
26
+ * @category constructors
27
+ * @since 4.0.0
18
28
  */
19
29
  export const run: <R2 = never>(
20
30
  { loader, schemaDirectory, table }: Migrator.MigratorOptions<R2>
@@ -78,8 +88,10 @@ export const run: <R2 = never>(
78
88
  })
79
89
 
80
90
  /**
91
+ * Creates a layer that runs the configured SQL migrations during layer construction.
92
+ *
81
93
  * @category layers
82
- * @since 1.0.0
94
+ * @since 4.0.0
83
95
  */
84
96
  export const layer = <R>(
85
97
  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 MysqlClient from "./MysqlClient.ts"
11
11
 
12
12
  /**
13
- * @since 1.0.0
13
+ * @since 4.0.0
14
14
  */
15
15
  export * as MysqlMigrator from "./MysqlMigrator.ts"