@effect/sql-mysql2 0.0.0-snapshot-189d4cae80e186661241002ad9d729628096520f

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.
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/Client.js",
3
+ "module": "../dist/esm/Client.js",
4
+ "types": "../dist/dts/Client.d.ts",
5
+ "sideEffects": []
6
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023-present The Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../dist/cjs/Migrator.js",
3
+ "module": "../dist/esm/Migrator.js",
4
+ "types": "../dist/dts/Migrator.d.ts",
5
+ "sideEffects": []
6
+ }
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Effect SQL - MySQL
2
+
3
+ An @effect/sql implementation using the `mysql2` library.
4
+
5
+ See here for more information: https://github.com/Effect-TS/effect/tree/main/packages/sql
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeCompiler = exports.make = exports.layer = exports.MysqlClient = void 0;
7
+ var Client = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Client"));
8
+ var _Error = /*#__PURE__*/require("@effect/sql/Error");
9
+ var Statement = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Statement"));
10
+ var _Stream = /*#__PURE__*/require("@effect/sql/Stream");
11
+ var Chunk = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Chunk"));
12
+ var Config = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Config"));
13
+ var Context = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Context"));
14
+ var Duration = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Duration"));
15
+ var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
16
+ var Layer = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Layer"));
17
+ var Secret = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Secret"));
18
+ var Stream = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Stream"));
19
+ var Mysql = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("mysql2"));
20
+ function _getRequireWildcardCache(e) {
21
+ if ("function" != typeof WeakMap) return null;
22
+ var r = new WeakMap(),
23
+ t = new WeakMap();
24
+ return (_getRequireWildcardCache = function (e) {
25
+ return e ? t : r;
26
+ })(e);
27
+ }
28
+ function _interopRequireWildcard(e, r) {
29
+ if (!r && e && e.__esModule) return e;
30
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
31
+ default: e
32
+ };
33
+ var t = _getRequireWildcardCache(r);
34
+ if (t && t.has(e)) return t.get(e);
35
+ var n = {
36
+ __proto__: null
37
+ },
38
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
39
+ for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
40
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
41
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
42
+ }
43
+ return n.default = e, t && t.set(e, n), n;
44
+ }
45
+ /**
46
+ * @since 1.0.0
47
+ */
48
+
49
+ /**
50
+ * @category tags
51
+ * @since 1.0.0
52
+ */
53
+ const MysqlClient = exports.MysqlClient = /*#__PURE__*/Context.GenericTag("sqlfx/mysql2/MysqlClient");
54
+ const escape = /*#__PURE__*/Statement.defaultEscape("`");
55
+ /**
56
+ * @category constructors
57
+ * @since 1.0.0
58
+ */
59
+ const make = options => Effect.gen(function* (_) {
60
+ const compiler = makeCompiler(options.transformQueryNames);
61
+ const transformRows = Client.defaultTransforms(options.transformResultNames).array;
62
+ class ConnectionImpl {
63
+ conn;
64
+ constructor(conn) {
65
+ this.conn = conn;
66
+ }
67
+ run(sql, values, transform = true, rowsAsArray = false, method = "execute") {
68
+ return Effect.async(resume => {
69
+ this.conn[method]({
70
+ sql,
71
+ values,
72
+ rowsAsArray
73
+ }, (error, results, _fields) => {
74
+ if (error) {
75
+ resume(Effect.fail(new _Error.SqlError({
76
+ error
77
+ })));
78
+ } else if (transform && !rowsAsArray && options.transformResultNames) {
79
+ resume(Effect.succeed(transformRows(results)));
80
+ } else {
81
+ resume(Effect.succeed(results));
82
+ }
83
+ });
84
+ });
85
+ }
86
+ execute(sql, params) {
87
+ return this.run(sql, params);
88
+ }
89
+ executeWithoutTransform(sql, params) {
90
+ return this.run(sql, params, false);
91
+ }
92
+ executeValues(sql, params) {
93
+ return this.run(sql, params, true, true);
94
+ }
95
+ executeRaw(sql, params) {
96
+ return this.run(sql, params, true, false, "query");
97
+ }
98
+ executeStream(sql, params) {
99
+ const stream = queryStream(this.conn, sql, params);
100
+ return options.transformResultNames ? Stream.mapChunks(stream, _ => Chunk.unsafeFromArray(transformRows(Chunk.toReadonlyArray(_)))) : stream;
101
+ }
102
+ }
103
+ const pool = options.url ? Mysql.createPool(Secret.value(options.url)) : Mysql.createPool({
104
+ ...(options.poolConfig ?? {}),
105
+ host: options.host,
106
+ port: options.port,
107
+ database: options.database,
108
+ user: options.username,
109
+ password: options.password ? Secret.value(options.password) : undefined,
110
+ connectionLimit: options.maxConnections,
111
+ idleTimeout: options.connectionTTL ? Duration.toMillis(options.connectionTTL) : undefined
112
+ });
113
+ yield* _(Effect.addFinalizer(() => Effect.async(resume => {
114
+ pool.end(() => resume(Effect.void));
115
+ })));
116
+ const poolConnection = new ConnectionImpl(pool);
117
+ const acquireConn = Effect.acquireRelease(Effect.async(resume => {
118
+ pool.getConnection((error, conn) => {
119
+ if (error) {
120
+ resume(new _Error.SqlError({
121
+ error
122
+ }));
123
+ } else {
124
+ resume(Effect.succeed(conn));
125
+ }
126
+ });
127
+ }), conn => Effect.sync(() => conn.release()));
128
+ const transactionAcquirer = Effect.map(acquireConn, conn => new ConnectionImpl(conn));
129
+ return Object.assign(Client.make({
130
+ acquirer: Effect.succeed(poolConnection),
131
+ transactionAcquirer,
132
+ compiler
133
+ }), {
134
+ config: options
135
+ });
136
+ });
137
+ /**
138
+ * @category layers
139
+ * @since 1.0.0
140
+ */
141
+ exports.make = make;
142
+ const layer = config => Layer.scoped(MysqlClient, Effect.flatMap(Config.unwrap(config), make));
143
+ /**
144
+ * @category compiler
145
+ * @since 1.0.0
146
+ */
147
+ exports.layer = layer;
148
+ const makeCompiler = transform => Statement.makeCompiler({
149
+ placeholder: _ => `?`,
150
+ onIdentifier: transform ? _ => escape(transform(_)) : escape,
151
+ onCustom: () => ["", []],
152
+ onRecordUpdate: () => ["", []]
153
+ });
154
+ exports.makeCompiler = makeCompiler;
155
+ function queryStream(conn, sql, params) {
156
+ return (0, _Stream.asyncPauseResume)(emit => {
157
+ const query = conn.query(sql, params).stream();
158
+ let buffer = [];
159
+ let taskPending = false;
160
+ query.on("error", error => emit.fail(new _Error.SqlError({
161
+ error
162
+ })));
163
+ query.on("data", row => {
164
+ buffer.push(row);
165
+ if (!taskPending) {
166
+ taskPending = true;
167
+ queueMicrotask(() => {
168
+ const items = buffer;
169
+ buffer = [];
170
+ emit.array(items);
171
+ taskPending = false;
172
+ });
173
+ }
174
+ });
175
+ query.on("end", () => emit.end());
176
+ return {
177
+ onInterrupt: Effect.sync(() => query.destroy()),
178
+ onPause: Effect.sync(() => query.pause()),
179
+ onResume: Effect.sync(() => query.resume())
180
+ };
181
+ });
182
+ }
183
+ //# sourceMappingURL=Client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Client.js","names":["Client","_interopRequireWildcard","require","_Error","Statement","_Stream","Chunk","Config","Context","Duration","Effect","Layer","Secret","Stream","Mysql","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","MysqlClient","exports","GenericTag","escape","defaultEscape","make","options","gen","_","compiler","makeCompiler","transformQueryNames","transformRows","defaultTransforms","transformResultNames","array","ConnectionImpl","conn","constructor","run","sql","values","transform","rowsAsArray","method","async","resume","error","results","_fields","fail","SqlError","succeed","execute","params","executeWithoutTransform","executeValues","executeRaw","executeStream","stream","queryStream","mapChunks","unsafeFromArray","toReadonlyArray","pool","url","createPool","value","poolConfig","host","port","database","user","username","password","undefined","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","addFinalizer","end","void","poolConnection","acquireConn","acquireRelease","getConnection","sync","release","transactionAcquirer","map","assign","acquirer","config","layer","scoped","flatMap","unwrap","placeholder","onIdentifier","onCustom","onRecordUpdate","asyncPauseResume","emit","query","buffer","taskPending","on","row","push","queueMicrotask","items","onInterrupt","destroy","onPause","pause","onResume"],"sources":["../../src/Client.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {
7
+ run: true,
8
+ layer: true
9
+ };
10
+ exports.run = exports.layer = void 0;
11
+ var Command = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/platform/Command"));
12
+ var _FileSystem = /*#__PURE__*/require("@effect/platform/FileSystem");
13
+ var _Path = /*#__PURE__*/require("@effect/platform/Path");
14
+ var Migrator = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Migrator"));
15
+ Object.keys(Migrator).forEach(function (key) {
16
+ if (key === "default" || key === "__esModule") return;
17
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
18
+ if (key in exports && exports[key] === Migrator[key]) return;
19
+ Object.defineProperty(exports, key, {
20
+ enumerable: true,
21
+ get: function () {
22
+ return Migrator[key];
23
+ }
24
+ });
25
+ });
26
+ var Effect = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Effect"));
27
+ var Layer = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Layer"));
28
+ var Secret = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("effect/Secret"));
29
+ var Client = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./Client.js"));
30
+ function _getRequireWildcardCache(e) {
31
+ if ("function" != typeof WeakMap) return null;
32
+ var r = new WeakMap(),
33
+ t = new WeakMap();
34
+ return (_getRequireWildcardCache = function (e) {
35
+ return e ? t : r;
36
+ })(e);
37
+ }
38
+ function _interopRequireWildcard(e, r) {
39
+ if (!r && e && e.__esModule) return e;
40
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
41
+ default: e
42
+ };
43
+ var t = _getRequireWildcardCache(r);
44
+ if (t && t.has(e)) return t.get(e);
45
+ var n = {
46
+ __proto__: null
47
+ },
48
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
49
+ for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
50
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
51
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
52
+ }
53
+ return n.default = e, t && t.set(e, n), n;
54
+ }
55
+ /**
56
+ * @since 1.0.0
57
+ */
58
+
59
+ /**
60
+ * @since 1.0.0
61
+ */
62
+
63
+ /**
64
+ * @category constructor
65
+ * @since 1.0.0
66
+ */
67
+ const run = exports.run = /*#__PURE__*/Migrator.make({
68
+ getClient: Client.MysqlClient,
69
+ ensureTable(sql, table) {
70
+ return sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (
71
+ migration_id INTEGER UNSIGNED NOT NULL,
72
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
73
+ name VARCHAR(255) NOT NULL,
74
+ PRIMARY KEY (migration_id)
75
+ )`;
76
+ },
77
+ lockTable(sql, table) {
78
+ return sql`LOCK TABLE ${sql(table)} IN ACCESS EXCLUSIVE MODE`;
79
+ },
80
+ dumpSchema(sql, path, table) {
81
+ const mysqlDump = args => Effect.gen(function* (_) {
82
+ const dump = yield* _(Command.make("mysqldump", ...(sql.config.username ? ["-u", sql.config.username] : []), ...(sql.config.database ? [sql.config.database] : []), "--skip-comments", "--compact", ...args), Command.env({
83
+ PATH: globalThis.process?.env.PATH,
84
+ MYSQL_HOST: sql.config.host,
85
+ MYSQL_TCP_PORT: sql.config.port?.toString(),
86
+ MYSQL_PWD: sql.config.password ? Secret.value(sql.config.password) : undefined
87
+ }), Command.string);
88
+ return dump.replace(/^\/\*.*$/gm, "").replace(/\n{2,}/gm, "\n\n").trim();
89
+ }).pipe(Effect.mapError(error => new Migrator.MigrationError({
90
+ reason: "failed",
91
+ message: error.message
92
+ })));
93
+ const dumpSchema = mysqlDump(["--no-data"]);
94
+ const dumpMigrations = mysqlDump(["--no-create-info", "--tables", table]);
95
+ const dumpAll = Effect.map(Effect.all([dumpSchema, dumpMigrations], {
96
+ concurrency: 2
97
+ }), ([schema, migrations]) => schema + "\n\n" + migrations);
98
+ const dumpFile = file => Effect.gen(function* (_) {
99
+ const fs = yield* _(_FileSystem.FileSystem);
100
+ const path = yield* _(_Path.Path);
101
+ const dump = yield* _(dumpAll);
102
+ yield* _(fs.makeDirectory(path.dirname(file), {
103
+ recursive: true
104
+ }));
105
+ yield* _(fs.writeFileString(file, dump));
106
+ }).pipe(Effect.mapError(error => new Migrator.MigrationError({
107
+ reason: "failed",
108
+ message: error.message
109
+ })));
110
+ return dumpFile(path);
111
+ }
112
+ });
113
+ /**
114
+ * @category layers
115
+ * @since 1.0.0
116
+ */
117
+ const layer = options => Layer.effectDiscard(run(options));
118
+ exports.layer = layer;
119
+ //# sourceMappingURL=Migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrator.js","names":["Command","_interopRequireWildcard","require","_FileSystem","_Path","Migrator","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","Effect","Layer","Secret","Client","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","run","make","getClient","MysqlClient","ensureTable","sql","table","lockTable","dumpSchema","path","mysqlDump","args","gen","_","dump","config","username","database","env","PATH","globalThis","process","MYSQL_HOST","host","MYSQL_TCP_PORT","port","toString","MYSQL_PWD","password","value","undefined","string","replace","trim","pipe","mapError","error","MigrationError","reason","message","dumpMigrations","dumpAll","map","all","concurrency","schema","migrations","dumpFile","file","fs","FileSystem","Path","makeDirectory","dirname","recursive","writeFileString","layer","options","effectDiscard"],"sources":["../../src/Migrator.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;AAGA,IAAAA,OAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAEA,IAAAC,WAAA,gBAAAD,OAAA;AACA,IAAAE,KAAA,gBAAAF,OAAA;AAEA,IAAAG,QAAA,gBAAAJ,uBAAA,eAAAC,OAAA;AASAI,MAAA,CAAAC,IAAA,CAAAF,QAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,QAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,QAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AARA,IAAAS,MAAA,gBAAAjB,uBAAA,eAAAC,OAAA;AACA,IAAAiB,KAAA,gBAAAlB,uBAAA,eAAAC,OAAA;AACA,IAAAkB,MAAA,gBAAAnB,uBAAA,eAAAC,OAAA;AACA,IAAAmB,MAAA,gBAAApB,uBAAA,eAAAC,OAAA;AAAqC,SAAAoB,yBAAAC,CAAA;EAAA,yBAAAC,OAAA;EAAA,IAAAC,CAAA,OAAAD,OAAA;IAAAE,CAAA,OAAAF,OAAA;EAAA,QAAAF,wBAAA,YAAAA,CAAAC,CAAA;IAAA,OAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA;EAAA,GAAAF,CAAA;AAAA;AAAA,SAAAtB,wBAAAsB,CAAA,EAAAE,CAAA;EAAA,KAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA;EAAA,aAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA;IAAAK,OAAA,EAAAL;EAAA;EAAA,IAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA;EAAA,IAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAT,GAAA,CAAAM,CAAA;EAAA,IAAAO,CAAA;MAAAC,SAAA;IAAA;IAAAC,CAAA,GAAA1B,MAAA,CAAAS,cAAA,IAAAT,MAAA,CAAA2B,wBAAA;EAAA,SAAAC,CAAA,IAAAX,CAAA,oBAAAW,CAAA,OAAAvB,cAAA,CAAAC,IAAA,CAAAW,CAAA,EAAAW,CAAA;IAAA,IAAAC,CAAA,GAAAH,CAAA,GAAA1B,MAAA,CAAA2B,wBAAA,CAAAV,CAAA,EAAAW,CAAA;IAAAC,CAAA,KAAAA,CAAA,CAAAlB,GAAA,IAAAkB,CAAA,CAAAC,GAAA,IAAA9B,MAAA,CAAAS,cAAA,CAAAe,CAAA,EAAAI,CAAA,EAAAC,CAAA,IAAAL,CAAA,CAAAI,CAAA,IAAAX,CAAA,CAAAW,CAAA;EAAA;EAAA,OAAAJ,CAAA,CAAAF,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAU,GAAA,CAAAb,CAAA,EAAAO,CAAA,GAAAA,CAAA;AAAA;AAZrC;;;;AAcA;;;;AAKA;;;;AAIO,MAAMO,GAAG,GAAAvB,OAAA,CAAAuB,GAAA,gBAMZhC,QAAQ,CAACiC,IAAI,CAAC;EAChBC,SAAS,EAAElB,MAAM,CAACmB,WAAW;EAC7BC,WAAWA,CAACC,GAAG,EAAEC,KAAK;IACpB,OAAOD,GAAG,8BAA8BA,GAAG,CAACC,KAAK,CAAC;;;;;MAKhD;EACJ,CAAC;EACDC,SAASA,CAACF,GAAG,EAAEC,KAAK;IAClB,OAAOD,GAAG,cAAcA,GAAG,CAACC,KAAK,CAAC,2BAA2B;EAC/D,CAAC;EACDE,UAAUA,CAACH,GAAG,EAAEI,IAAI,EAAEH,KAAK;IACzB,MAAMI,SAAS,GAAIC,IAAmB,IACpC9B,MAAM,CAAC+B,GAAG,CAAC,WAAUC,CAAC;MACpB,MAAMC,IAAI,GAAG,OAAOD,CAAC,CACnBlD,OAAO,CAACsC,IAAI,CACV,WAAW,EACX,IAAII,GAAG,CAACU,MAAM,CAACC,QAAQ,GAAG,CAAC,IAAI,EAAEX,GAAG,CAACU,MAAM,CAACC,QAAQ,CAAC,GAAG,EAAE,CAAC,EAC3D,IAAIX,GAAG,CAACU,MAAM,CAACE,QAAQ,GAAG,CAACZ,GAAG,CAACU,MAAM,CAACE,QAAQ,CAAC,GAAG,EAAE,CAAC,EACrD,iBAAiB,EACjB,WAAW,EACX,GAAGN,IAAI,CACR,EACDhD,OAAO,CAACuD,GAAG,CAAC;QACVC,IAAI,EAAGC,UAAkB,CAACC,OAAO,EAAEH,GAAG,CAACC,IAAI;QAC3CG,UAAU,EAAEjB,GAAG,CAACU,MAAM,CAACQ,IAAI;QAC3BC,cAAc,EAAEnB,GAAG,CAACU,MAAM,CAACU,IAAI,EAAEC,QAAQ,EAAE;QAC3CC,SAAS,EAAEtB,GAAG,CAACU,MAAM,CAACa,QAAQ,GAC1B7C,MAAM,CAAC8C,KAAK,CAACxB,GAAG,CAACU,MAAM,CAACa,QAAQ,CAAC,GACjCE;OACL,CAAC,EACFnE,OAAO,CAACoE,MAAM,CACf;MAED,OAAOjB,IAAI,CAACkB,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAClCA,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAC3BC,IAAI,EAAE;IACX,CAAC,CAAC,CAACC,IAAI,CACLrD,MAAM,CAACsD,QAAQ,CAAEC,KAAK,IAAK,IAAIpE,QAAQ,CAACqE,cAAc,CAAC;MAAEC,MAAM,EAAE,QAAQ;MAAEC,OAAO,EAAEH,KAAK,CAACG;IAAO,CAAE,CAAC,CAAC,CACtG;IAEH,MAAM/B,UAAU,GAAGE,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC;IAE3C,MAAM8B,cAAc,GAAG9B,SAAS,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAEJ,KAAK,CAAC,CAAC;IAEzE,MAAMmC,OAAO,GAAG5D,MAAM,CAAC6D,GAAG,CACxB7D,MAAM,CAAC8D,GAAG,CAAC,CAACnC,UAAU,EAAEgC,cAAc,CAAC,EAAE;MAAEI,WAAW,EAAE;IAAC,CAAE,CAAC,EAC5D,CAAC,CAACC,MAAM,EAAEC,UAAU,CAAC,KAAKD,MAAM,GAAG,MAAM,GAAGC,UAAU,CACvD;IAED,MAAMC,QAAQ,GAAIC,IAAY,IAC5BnE,MAAM,CAAC+B,GAAG,CAAC,WAAUC,CAAC;MACpB,MAAMoC,EAAE,GAAG,OAAOpC,CAAC,CAAC/C,WAAA,CAAAoF,UAAU,CAAC;MAC/B,MAAMzC,IAAI,GAAG,OAAOI,CAAC,CAAC9C,KAAA,CAAAoF,IAAI,CAAC;MAC3B,MAAMrC,IAAI,GAAG,OAAOD,CAAC,CAAC4B,OAAO,CAAC;MAC9B,OAAO5B,CAAC,CAACoC,EAAE,CAACG,aAAa,CAAC3C,IAAI,CAAC4C,OAAO,CAACL,IAAI,CAAC,EAAE;QAAEM,SAAS,EAAE;MAAI,CAAE,CAAC,CAAC;MACnE,OAAOzC,CAAC,CAACoC,EAAE,CAACM,eAAe,CAACP,IAAI,EAAElC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAACoB,IAAI,CACLrD,MAAM,CAACsD,QAAQ,CAAEC,KAAK,IAAK,IAAIpE,QAAQ,CAACqE,cAAc,CAAC;MAAEC,MAAM,EAAE,QAAQ;MAAEC,OAAO,EAAEH,KAAK,CAACG;IAAO,CAAE,CAAC,CAAC,CACtG;IAEH,OAAOQ,QAAQ,CAACtC,IAAI,CAAC;EACvB;CACD,CAAC;AAEF;;;;AAIO,MAAM+C,KAAK,GAChBC,OAAoC,IAKjC3E,KAAK,CAAC4E,aAAa,CAAC1D,GAAG,CAACyD,OAAO,CAAC,CAAC;AAAAhF,OAAA,CAAA+E,KAAA,GAAAA,KAAA","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.statement = exports.schema = exports.resolver = exports.migrator = exports.error = exports.client = void 0;
7
+ var _client = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./Client.js"));
8
+ exports.client = _client;
9
+ var _error = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Error"));
10
+ exports.error = _error;
11
+ var _migrator = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./Migrator.js"));
12
+ exports.migrator = _migrator;
13
+ var _resolver = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Resolver"));
14
+ exports.resolver = _resolver;
15
+ var _schema = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Schema"));
16
+ exports.schema = _schema;
17
+ var _statement = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("@effect/sql/Statement"));
18
+ exports.statement = _statement;
19
+ function _getRequireWildcardCache(e) {
20
+ if ("function" != typeof WeakMap) return null;
21
+ var r = new WeakMap(),
22
+ t = new WeakMap();
23
+ return (_getRequireWildcardCache = function (e) {
24
+ return e ? t : r;
25
+ })(e);
26
+ }
27
+ function _interopRequireWildcard(e, r) {
28
+ if (!r && e && e.__esModule) return e;
29
+ if (null === e || "object" != typeof e && "function" != typeof e) return {
30
+ default: e
31
+ };
32
+ var t = _getRequireWildcardCache(r);
33
+ if (t && t.has(e)) return t.get(e);
34
+ var n = {
35
+ __proto__: null
36
+ },
37
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
38
+ for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
39
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
40
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u];
41
+ }
42
+ return n.default = e, t && t.set(e, n), n;
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"","ignoreList":[]}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Client from "@effect/sql/Client";
5
+ import * as Statement from "@effect/sql/Statement";
6
+ import * as Config from "effect/Config";
7
+ import type { ConfigError } from "effect/ConfigError";
8
+ import * as Context from "effect/Context";
9
+ import * as Duration from "effect/Duration";
10
+ import * as Effect from "effect/Effect";
11
+ import * as Layer from "effect/Layer";
12
+ import type { Scope } from "effect/Scope";
13
+ import * as Secret from "effect/Secret";
14
+ import * as Mysql from "mysql2";
15
+ /**
16
+ * @category models
17
+ * @since 1.0.0
18
+ */
19
+ export interface MysqlClient extends Client.Client {
20
+ readonly config: MysqlClientConfig;
21
+ }
22
+ /**
23
+ * @category tags
24
+ * @since 1.0.0
25
+ */
26
+ export declare const MysqlClient: Context.Tag<MysqlClient, MysqlClient>;
27
+ /**
28
+ * @category models
29
+ * @since 1.0.0
30
+ */
31
+ export interface MysqlClientConfig {
32
+ /**
33
+ * Connection URI. Setting this will override the other connection options
34
+ */
35
+ readonly url?: Secret.Secret;
36
+ readonly host?: string;
37
+ readonly port?: number;
38
+ readonly database?: string;
39
+ readonly username?: string;
40
+ readonly password?: Secret.Secret;
41
+ readonly maxConnections?: number;
42
+ readonly connectionTTL?: Duration.DurationInput;
43
+ readonly poolConfig?: Mysql.PoolOptions;
44
+ readonly transformResultNames?: (str: string) => string;
45
+ readonly transformQueryNames?: (str: string) => string;
46
+ }
47
+ /**
48
+ * @category constructors
49
+ * @since 1.0.0
50
+ */
51
+ export declare const make: (options: MysqlClientConfig) => Effect.Effect<MysqlClient, never, Scope>;
52
+ /**
53
+ * @category layers
54
+ * @since 1.0.0
55
+ */
56
+ export declare const layer: (config: Config.Config.Wrap<MysqlClientConfig>) => Layer.Layer<MysqlClient, ConfigError>;
57
+ /**
58
+ * @category compiler
59
+ * @since 1.0.0
60
+ */
61
+ export declare const makeCompiler: (transform?: ((_: string) => string) | undefined) => Statement.Compiler;
62
+ //# sourceMappingURL=Client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../../src/Client.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAG5C,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAGlD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAA;AAE/B;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,MAAM,CAAC,MAAM;IAChD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;CACnC;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,uCAA8D,CAAA;AAEtF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,CAAA;IAE5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,CAAA;IAEjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;IAE/C,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,WAAW,CAAA;IAEvC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IACvD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CACvD;AAID;;;GAGG;AACH,eAAO,MAAM,IAAI,YACN,iBAAiB,KACzB,aAAa,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CA6GtC,CAAA;AAEJ;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,CAClB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAC1C,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAEkC,CAAA;AAE3E;;;GAGG;AACH,eAAO,MAAM,YAAY,oBAAoB,MAAM,KAAK,MAAM,oCAM1D,CAAA"}
@@ -0,0 +1,23 @@
1
+ import type { CommandExecutor } from "@effect/platform/CommandExecutor";
2
+ import { FileSystem } from "@effect/platform/FileSystem";
3
+ import { Path } from "@effect/platform/Path";
4
+ import type { SqlError } from "@effect/sql/Error";
5
+ import * as Migrator from "@effect/sql/Migrator";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Layer from "effect/Layer";
8
+ import * as Client from "./Client.js";
9
+ /**
10
+ * @since 1.0.0
11
+ */
12
+ export * from "@effect/sql/Migrator";
13
+ /**
14
+ * @category constructor
15
+ * @since 1.0.0
16
+ */
17
+ export declare const run: <R>(options: Migrator.MigratorOptions<R>) => Effect.Effect<ReadonlyArray<readonly [id: number, name: string]>, SqlError | Migrator.MigrationError, Client.MysqlClient | R | FileSystem | Path | CommandExecutor>;
18
+ /**
19
+ * @category layers
20
+ * @since 1.0.0
21
+ */
22
+ export declare const layer: <R>(options: Migrator.MigratorOptions<R>) => Layer.Layer<never, SqlError | Migrator.MigrationError, Client.MysqlClient | FileSystem | Path | CommandExecutor | R>;
23
+ //# sourceMappingURL=Migrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrator.d.ts","sourceRoot":"","sources":["../../src/Migrator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAChD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC;;GAEG;AACH,cAAc,sBAAsB,CAAA;AAEpC;;;GAGG;AACH,eAAO,MAAM,GAAG,EAAE,CAAC,CAAC,EAClB,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,KACjC,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,EAClD,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAClC,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,UAAU,GAAG,IAAI,GAAG,eAAe,CAkE5D,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,KAAK,eACP,SAAS,eAAe,CAAC,CAAC,CAAC,KACnC,WAAW,CACZ,KAAK,EACL,QAAQ,GAAG,SAAS,cAAc,EAClC,OAAO,WAAW,GAAG,UAAU,GAAG,IAAI,GAAG,eAAe,GAAG,CAAC,CACxB,CAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ /**
5
+ * @since 1.0.0
6
+ */
7
+ export * as client from "./Client.js";
8
+ /**
9
+ * @since 1.0.0
10
+ */
11
+ export * as error from "@effect/sql/Error";
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+ export * as migrator from "./Migrator.js";
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * as resolver from "@effect/sql/Resolver";
20
+ /**
21
+ * @since 1.0.0
22
+ */
23
+ export * as schema from "@effect/sql/Schema";
24
+ /**
25
+ * @since 1.0.0
26
+ */
27
+ export * as statement from "@effect/sql/Statement";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC;;GAEG;AACH,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAA;AAE1C;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AAEzC;;GAEG;AACH,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAEhD;;GAEG;AACH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAA;AAE5C;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Client from "@effect/sql/Client";
5
+ import { SqlError } from "@effect/sql/Error";
6
+ import * as Statement from "@effect/sql/Statement";
7
+ import { asyncPauseResume } from "@effect/sql/Stream";
8
+ import * as Chunk from "effect/Chunk";
9
+ import * as Config from "effect/Config";
10
+ import * as Context from "effect/Context";
11
+ import * as Duration from "effect/Duration";
12
+ import * as Effect from "effect/Effect";
13
+ import * as Layer from "effect/Layer";
14
+ import * as Secret from "effect/Secret";
15
+ import * as Stream from "effect/Stream";
16
+ import * as Mysql from "mysql2";
17
+ /**
18
+ * @category tags
19
+ * @since 1.0.0
20
+ */
21
+ export const MysqlClient = /*#__PURE__*/Context.GenericTag("sqlfx/mysql2/MysqlClient");
22
+ const escape = /*#__PURE__*/Statement.defaultEscape("`");
23
+ /**
24
+ * @category constructors
25
+ * @since 1.0.0
26
+ */
27
+ export const make = options => Effect.gen(function* (_) {
28
+ const compiler = makeCompiler(options.transformQueryNames);
29
+ const transformRows = Client.defaultTransforms(options.transformResultNames).array;
30
+ class ConnectionImpl {
31
+ conn;
32
+ constructor(conn) {
33
+ this.conn = conn;
34
+ }
35
+ run(sql, values, transform = true, rowsAsArray = false, method = "execute") {
36
+ return Effect.async(resume => {
37
+ this.conn[method]({
38
+ sql,
39
+ values,
40
+ rowsAsArray
41
+ }, (error, results, _fields) => {
42
+ if (error) {
43
+ resume(Effect.fail(new SqlError({
44
+ error
45
+ })));
46
+ } else if (transform && !rowsAsArray && options.transformResultNames) {
47
+ resume(Effect.succeed(transformRows(results)));
48
+ } else {
49
+ resume(Effect.succeed(results));
50
+ }
51
+ });
52
+ });
53
+ }
54
+ execute(sql, params) {
55
+ return this.run(sql, params);
56
+ }
57
+ executeWithoutTransform(sql, params) {
58
+ return this.run(sql, params, false);
59
+ }
60
+ executeValues(sql, params) {
61
+ return this.run(sql, params, true, true);
62
+ }
63
+ executeRaw(sql, params) {
64
+ return this.run(sql, params, true, false, "query");
65
+ }
66
+ executeStream(sql, params) {
67
+ const stream = queryStream(this.conn, sql, params);
68
+ return options.transformResultNames ? Stream.mapChunks(stream, _ => Chunk.unsafeFromArray(transformRows(Chunk.toReadonlyArray(_)))) : stream;
69
+ }
70
+ }
71
+ const pool = options.url ? Mysql.createPool(Secret.value(options.url)) : Mysql.createPool({
72
+ ...(options.poolConfig ?? {}),
73
+ host: options.host,
74
+ port: options.port,
75
+ database: options.database,
76
+ user: options.username,
77
+ password: options.password ? Secret.value(options.password) : undefined,
78
+ connectionLimit: options.maxConnections,
79
+ idleTimeout: options.connectionTTL ? Duration.toMillis(options.connectionTTL) : undefined
80
+ });
81
+ yield* _(Effect.addFinalizer(() => Effect.async(resume => {
82
+ pool.end(() => resume(Effect.void));
83
+ })));
84
+ const poolConnection = new ConnectionImpl(pool);
85
+ const acquireConn = Effect.acquireRelease(Effect.async(resume => {
86
+ pool.getConnection((error, conn) => {
87
+ if (error) {
88
+ resume(new SqlError({
89
+ error
90
+ }));
91
+ } else {
92
+ resume(Effect.succeed(conn));
93
+ }
94
+ });
95
+ }), conn => Effect.sync(() => conn.release()));
96
+ const transactionAcquirer = Effect.map(acquireConn, conn => new ConnectionImpl(conn));
97
+ return Object.assign(Client.make({
98
+ acquirer: Effect.succeed(poolConnection),
99
+ transactionAcquirer,
100
+ compiler
101
+ }), {
102
+ config: options
103
+ });
104
+ });
105
+ /**
106
+ * @category layers
107
+ * @since 1.0.0
108
+ */
109
+ export const layer = config => Layer.scoped(MysqlClient, Effect.flatMap(Config.unwrap(config), make));
110
+ /**
111
+ * @category compiler
112
+ * @since 1.0.0
113
+ */
114
+ export const makeCompiler = transform => Statement.makeCompiler({
115
+ placeholder: _ => `?`,
116
+ onIdentifier: transform ? _ => escape(transform(_)) : escape,
117
+ onCustom: () => ["", []],
118
+ onRecordUpdate: () => ["", []]
119
+ });
120
+ function queryStream(conn, sql, params) {
121
+ return asyncPauseResume(emit => {
122
+ const query = conn.query(sql, params).stream();
123
+ let buffer = [];
124
+ let taskPending = false;
125
+ query.on("error", error => emit.fail(new SqlError({
126
+ error
127
+ })));
128
+ query.on("data", row => {
129
+ buffer.push(row);
130
+ if (!taskPending) {
131
+ taskPending = true;
132
+ queueMicrotask(() => {
133
+ const items = buffer;
134
+ buffer = [];
135
+ emit.array(items);
136
+ taskPending = false;
137
+ });
138
+ }
139
+ });
140
+ query.on("end", () => emit.end());
141
+ return {
142
+ onInterrupt: Effect.sync(() => query.destroy()),
143
+ onPause: Effect.sync(() => query.pause()),
144
+ onResume: Effect.sync(() => query.resume())
145
+ };
146
+ });
147
+ }
148
+ //# sourceMappingURL=Client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Client.js","names":["Client","SqlError","Statement","asyncPauseResume","Chunk","Config","Context","Duration","Effect","Layer","Secret","Stream","Mysql","MysqlClient","GenericTag","escape","defaultEscape","make","options","gen","_","compiler","makeCompiler","transformQueryNames","transformRows","defaultTransforms","transformResultNames","array","ConnectionImpl","conn","constructor","run","sql","values","transform","rowsAsArray","method","async","resume","error","results","_fields","fail","succeed","execute","params","executeWithoutTransform","executeValues","executeRaw","executeStream","stream","queryStream","mapChunks","unsafeFromArray","toReadonlyArray","pool","url","createPool","value","poolConfig","host","port","database","user","username","password","undefined","connectionLimit","maxConnections","idleTimeout","connectionTTL","toMillis","addFinalizer","end","void","poolConnection","acquireConn","acquireRelease","getConnection","sync","release","transactionAcquirer","map","Object","assign","acquirer","config","layer","scoped","flatMap","unwrap","placeholder","onIdentifier","onCustom","onRecordUpdate","emit","query","buffer","taskPending","on","row","push","queueMicrotask","items","onInterrupt","destroy","onPause","pause","onResume"],"sources":["../../src/Client.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Command from "@effect/platform/Command";
5
+ import { FileSystem } from "@effect/platform/FileSystem";
6
+ import { Path } from "@effect/platform/Path";
7
+ import * as Migrator from "@effect/sql/Migrator";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Layer from "effect/Layer";
10
+ import * as Secret from "effect/Secret";
11
+ import * as Client from "./Client.js";
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+ export * from "@effect/sql/Migrator";
16
+ /**
17
+ * @category constructor
18
+ * @since 1.0.0
19
+ */
20
+ export const run = /*#__PURE__*/Migrator.make({
21
+ getClient: Client.MysqlClient,
22
+ ensureTable(sql, table) {
23
+ return sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (
24
+ migration_id INTEGER UNSIGNED NOT NULL,
25
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
26
+ name VARCHAR(255) NOT NULL,
27
+ PRIMARY KEY (migration_id)
28
+ )`;
29
+ },
30
+ lockTable(sql, table) {
31
+ return sql`LOCK TABLE ${sql(table)} IN ACCESS EXCLUSIVE MODE`;
32
+ },
33
+ dumpSchema(sql, path, table) {
34
+ const mysqlDump = args => Effect.gen(function* (_) {
35
+ const dump = yield* _(Command.make("mysqldump", ...(sql.config.username ? ["-u", sql.config.username] : []), ...(sql.config.database ? [sql.config.database] : []), "--skip-comments", "--compact", ...args), Command.env({
36
+ PATH: globalThis.process?.env.PATH,
37
+ MYSQL_HOST: sql.config.host,
38
+ MYSQL_TCP_PORT: sql.config.port?.toString(),
39
+ MYSQL_PWD: sql.config.password ? Secret.value(sql.config.password) : undefined
40
+ }), Command.string);
41
+ return dump.replace(/^\/\*.*$/gm, "").replace(/\n{2,}/gm, "\n\n").trim();
42
+ }).pipe(Effect.mapError(error => new Migrator.MigrationError({
43
+ reason: "failed",
44
+ message: error.message
45
+ })));
46
+ const dumpSchema = mysqlDump(["--no-data"]);
47
+ const dumpMigrations = mysqlDump(["--no-create-info", "--tables", table]);
48
+ const dumpAll = Effect.map(Effect.all([dumpSchema, dumpMigrations], {
49
+ concurrency: 2
50
+ }), ([schema, migrations]) => schema + "\n\n" + migrations);
51
+ const dumpFile = file => Effect.gen(function* (_) {
52
+ const fs = yield* _(FileSystem);
53
+ const path = yield* _(Path);
54
+ const dump = yield* _(dumpAll);
55
+ yield* _(fs.makeDirectory(path.dirname(file), {
56
+ recursive: true
57
+ }));
58
+ yield* _(fs.writeFileString(file, dump));
59
+ }).pipe(Effect.mapError(error => new Migrator.MigrationError({
60
+ reason: "failed",
61
+ message: error.message
62
+ })));
63
+ return dumpFile(path);
64
+ }
65
+ });
66
+ /**
67
+ * @category layers
68
+ * @since 1.0.0
69
+ */
70
+ export const layer = options => Layer.effectDiscard(run(options));
71
+ //# sourceMappingURL=Migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrator.js","names":["Command","FileSystem","Path","Migrator","Effect","Layer","Secret","Client","run","make","getClient","MysqlClient","ensureTable","sql","table","lockTable","dumpSchema","path","mysqlDump","args","gen","_","dump","config","username","database","env","PATH","globalThis","process","MYSQL_HOST","host","MYSQL_TCP_PORT","port","toString","MYSQL_PWD","password","value","undefined","string","replace","trim","pipe","mapError","error","MigrationError","reason","message","dumpMigrations","dumpAll","map","all","concurrency","schema","migrations","dumpFile","file","fs","makeDirectory","dirname","recursive","writeFileString","layer","options","effectDiscard"],"sources":["../../src/Migrator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ /**
5
+ * @since 1.0.0
6
+ */
7
+ export * as client from "./Client.js";
8
+ /**
9
+ * @since 1.0.0
10
+ */
11
+ export * as error from "@effect/sql/Error";
12
+ /**
13
+ * @since 1.0.0
14
+ */
15
+ export * as migrator from "./Migrator.js";
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * as resolver from "@effect/sql/Resolver";
20
+ /**
21
+ * @since 1.0.0
22
+ */
23
+ export * as schema from "@effect/sql/Schema";
24
+ /**
25
+ * @since 1.0.0
26
+ */
27
+ export * as statement from "@effect/sql/Statement";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["client","error","migrator","resolver","schema","statement"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAIA;;;AAGA,OAAO,KAAKA,MAAM,MAAM,aAAa;AAErC;;;AAGA,OAAO,KAAKC,KAAK,MAAM,mBAAmB;AAE1C;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,sBAAsB;AAEhD;;;AAGA,OAAO,KAAKC,MAAM,MAAM,oBAAoB;AAE5C;;;AAGA,OAAO,KAAKC,SAAS,MAAM,uBAAuB","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "sideEffects": []
4
+ }
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@effect/sql-mysql2",
3
+ "version": "0.0.0-snapshot-189d4cae80e186661241002ad9d729628096520f",
4
+ "description": "A MySQL toolkit for Effect",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/effect-ts/effect.git",
9
+ "directory": "packages/sql-mysql2"
10
+ },
11
+ "sideEffects": [],
12
+ "dependencies": {
13
+ "mysql2": "^3"
14
+ },
15
+ "peerDependencies": {
16
+ "@effect/platform": "^0.0.0-snapshot-189d4cae80e186661241002ad9d729628096520f",
17
+ "@effect/sql": "^0.0.0-snapshot-189d4cae80e186661241002ad9d729628096520f",
18
+ "effect": "^0.0.0-snapshot-189d4cae80e186661241002ad9d729628096520f"
19
+ },
20
+ "main": "./dist/cjs/index.js",
21
+ "module": "./dist/esm/index.js",
22
+ "types": "./dist/dts/index.d.ts",
23
+ "exports": {
24
+ "./package.json": "./package.json",
25
+ ".": {
26
+ "types": "./dist/dts/index.d.ts",
27
+ "import": "./dist/esm/index.js",
28
+ "default": "./dist/cjs/index.js"
29
+ },
30
+ "./Client": {
31
+ "types": "./dist/dts/Client.d.ts",
32
+ "import": "./dist/esm/Client.js",
33
+ "default": "./dist/cjs/Client.js"
34
+ },
35
+ "./Migrator": {
36
+ "types": "./dist/dts/Migrator.d.ts",
37
+ "import": "./dist/esm/Migrator.js",
38
+ "default": "./dist/cjs/Migrator.js"
39
+ }
40
+ },
41
+ "typesVersions": {
42
+ "*": {
43
+ "Client": [
44
+ "./dist/dts/Client.d.ts"
45
+ ],
46
+ "Migrator": [
47
+ "./dist/dts/Migrator.d.ts"
48
+ ]
49
+ }
50
+ }
51
+ }
package/src/Client.ts ADDED
@@ -0,0 +1,230 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Client from "@effect/sql/Client"
5
+ import type { Connection } from "@effect/sql/Connection"
6
+ import { SqlError } from "@effect/sql/Error"
7
+ import * as Statement from "@effect/sql/Statement"
8
+ import { asyncPauseResume } from "@effect/sql/Stream"
9
+ import * as Chunk from "effect/Chunk"
10
+ import * as Config from "effect/Config"
11
+ import type { ConfigError } from "effect/ConfigError"
12
+ import * as Context from "effect/Context"
13
+ import * as Duration from "effect/Duration"
14
+ import * as Effect from "effect/Effect"
15
+ import * as Layer from "effect/Layer"
16
+ import type { Scope } from "effect/Scope"
17
+ import * as Secret from "effect/Secret"
18
+ import * as Stream from "effect/Stream"
19
+ import * as Mysql from "mysql2"
20
+
21
+ /**
22
+ * @category models
23
+ * @since 1.0.0
24
+ */
25
+ export interface MysqlClient extends Client.Client {
26
+ readonly config: MysqlClientConfig
27
+ }
28
+
29
+ /**
30
+ * @category tags
31
+ * @since 1.0.0
32
+ */
33
+ export const MysqlClient = Context.GenericTag<MysqlClient>("sqlfx/mysql2/MysqlClient")
34
+
35
+ /**
36
+ * @category models
37
+ * @since 1.0.0
38
+ */
39
+ export interface MysqlClientConfig {
40
+ /**
41
+ * Connection URI. Setting this will override the other connection options
42
+ */
43
+ readonly url?: Secret.Secret
44
+
45
+ readonly host?: string
46
+ readonly port?: number
47
+ readonly database?: string
48
+ readonly username?: string
49
+ readonly password?: Secret.Secret
50
+
51
+ readonly maxConnections?: number
52
+ readonly connectionTTL?: Duration.DurationInput
53
+
54
+ readonly poolConfig?: Mysql.PoolOptions
55
+
56
+ readonly transformResultNames?: (str: string) => string
57
+ readonly transformQueryNames?: (str: string) => string
58
+ }
59
+
60
+ const escape = Statement.defaultEscape("`")
61
+
62
+ /**
63
+ * @category constructors
64
+ * @since 1.0.0
65
+ */
66
+ export const make = (
67
+ options: MysqlClientConfig
68
+ ): Effect.Effect<MysqlClient, never, Scope> =>
69
+ Effect.gen(function*(_) {
70
+ const compiler = makeCompiler(options.transformQueryNames)
71
+
72
+ const transformRows = Client.defaultTransforms(
73
+ options.transformResultNames!
74
+ ).array
75
+
76
+ class ConnectionImpl implements Connection {
77
+ constructor(private readonly conn: Mysql.PoolConnection | Mysql.Pool) {}
78
+
79
+ private run(
80
+ sql: string,
81
+ values?: ReadonlyArray<any>,
82
+ transform = true,
83
+ rowsAsArray = false,
84
+ method: "execute" | "query" = "execute"
85
+ ) {
86
+ return Effect.async<ReadonlyArray<any>, SqlError>((resume) => {
87
+ this.conn[method]({
88
+ sql,
89
+ values,
90
+ rowsAsArray
91
+ }, (error: unknown | null, results: ReadonlyArray<any>, _fields: any) => {
92
+ if (error) {
93
+ resume(Effect.fail(new SqlError({ error })))
94
+ } else if (transform && !rowsAsArray && options.transformResultNames) {
95
+ resume(Effect.succeed(transformRows(results)))
96
+ } else {
97
+ resume(Effect.succeed(results))
98
+ }
99
+ })
100
+ })
101
+ }
102
+
103
+ execute(sql: string, params: ReadonlyArray<Statement.Primitive>) {
104
+ return this.run(sql, params)
105
+ }
106
+ executeWithoutTransform(sql: string, params: ReadonlyArray<Statement.Primitive>) {
107
+ return this.run(sql, params, false)
108
+ }
109
+ executeValues(sql: string, params: ReadonlyArray<Statement.Primitive>) {
110
+ return this.run(sql, params, true, true)
111
+ }
112
+ executeRaw(sql: string, params?: ReadonlyArray<Statement.Primitive>) {
113
+ return this.run(sql, params, true, false, "query")
114
+ }
115
+ executeStream(sql: string, params: ReadonlyArray<Statement.Primitive>) {
116
+ const stream = queryStream(this.conn as any, sql, params)
117
+ return options.transformResultNames
118
+ ? Stream.mapChunks(stream, (_) =>
119
+ Chunk.unsafeFromArray(
120
+ transformRows(Chunk.toReadonlyArray(_) as Array<object>)
121
+ ))
122
+ : stream
123
+ }
124
+ }
125
+
126
+ const pool = options.url
127
+ ? Mysql.createPool(Secret.value(options.url))
128
+ : Mysql.createPool({
129
+ ...(options.poolConfig ?? {}),
130
+ host: options.host,
131
+ port: options.port,
132
+ database: options.database,
133
+ user: options.username,
134
+ password: options.password
135
+ ? Secret.value(options.password)
136
+ : undefined,
137
+ connectionLimit: options.maxConnections,
138
+ idleTimeout: options.connectionTTL
139
+ ? Duration.toMillis(options.connectionTTL)
140
+ : undefined
141
+ } as Mysql.PoolOptions)
142
+
143
+ yield* _(Effect.addFinalizer(() =>
144
+ Effect.async<void>((resume) => {
145
+ pool.end(() => resume(Effect.void))
146
+ })
147
+ ))
148
+
149
+ const poolConnection = new ConnectionImpl(pool)
150
+
151
+ const acquireConn = Effect.acquireRelease(
152
+ Effect.async<Mysql.PoolConnection, SqlError>((resume) => {
153
+ pool.getConnection((error, conn) => {
154
+ if (error) {
155
+ resume(new SqlError({ error }))
156
+ } else {
157
+ resume(Effect.succeed(conn))
158
+ }
159
+ })
160
+ }),
161
+ (conn) => Effect.sync(() => conn.release())
162
+ )
163
+
164
+ const transactionAcquirer = Effect.map(
165
+ acquireConn,
166
+ (conn) => new ConnectionImpl(conn)
167
+ )
168
+
169
+ return Object.assign(
170
+ Client.make({
171
+ acquirer: Effect.succeed(poolConnection),
172
+ transactionAcquirer,
173
+ compiler
174
+ }),
175
+ { config: options }
176
+ )
177
+ })
178
+
179
+ /**
180
+ * @category layers
181
+ * @since 1.0.0
182
+ */
183
+ export const layer: (
184
+ config: Config.Config.Wrap<MysqlClientConfig>
185
+ ) => Layer.Layer<MysqlClient, ConfigError> = (
186
+ config: Config.Config.Wrap<MysqlClientConfig>
187
+ ) => Layer.scoped(MysqlClient, Effect.flatMap(Config.unwrap(config), make))
188
+
189
+ /**
190
+ * @category compiler
191
+ * @since 1.0.0
192
+ */
193
+ export const makeCompiler = (transform?: (_: string) => string) =>
194
+ Statement.makeCompiler({
195
+ placeholder: (_) => `?`,
196
+ onIdentifier: transform ? (_) => escape(transform(_)) : escape,
197
+ onCustom: () => ["", []],
198
+ onRecordUpdate: () => ["", []]
199
+ })
200
+
201
+ function queryStream(
202
+ conn: Mysql.PoolConnection,
203
+ sql: string,
204
+ params?: ReadonlyArray<any>
205
+ ) {
206
+ return asyncPauseResume<any, SqlError>((emit) => {
207
+ const query = conn.query(sql, params).stream()
208
+ let buffer: Array<any> = []
209
+ let taskPending = false
210
+ query.on("error", (error: unknown) => emit.fail(new SqlError({ error })))
211
+ query.on("data", (row: any) => {
212
+ buffer.push(row)
213
+ if (!taskPending) {
214
+ taskPending = true
215
+ queueMicrotask(() => {
216
+ const items = buffer
217
+ buffer = []
218
+ emit.array(items)
219
+ taskPending = false
220
+ })
221
+ }
222
+ })
223
+ query.on("end", () => emit.end())
224
+ return {
225
+ onInterrupt: Effect.sync(() => query.destroy()),
226
+ onPause: Effect.sync(() => query.pause()),
227
+ onResume: Effect.sync(() => query.resume())
228
+ }
229
+ })
230
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Command from "@effect/platform/Command"
5
+ import type { CommandExecutor } from "@effect/platform/CommandExecutor"
6
+ import { FileSystem } from "@effect/platform/FileSystem"
7
+ import { Path } from "@effect/platform/Path"
8
+ import type { SqlError } from "@effect/sql/Error"
9
+ import * as Migrator from "@effect/sql/Migrator"
10
+ import * as Effect from "effect/Effect"
11
+ import * as Layer from "effect/Layer"
12
+ import * as Secret from "effect/Secret"
13
+ import * as Client from "./Client.js"
14
+
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export * from "@effect/sql/Migrator"
19
+
20
+ /**
21
+ * @category constructor
22
+ * @since 1.0.0
23
+ */
24
+ export const run: <R>(
25
+ options: Migrator.MigratorOptions<R>
26
+ ) => Effect.Effect<
27
+ ReadonlyArray<readonly [id: number, name: string]>,
28
+ SqlError | Migrator.MigrationError,
29
+ Client.MysqlClient | R | FileSystem | Path | CommandExecutor
30
+ > = Migrator.make({
31
+ getClient: Client.MysqlClient,
32
+ ensureTable(sql, table) {
33
+ return sql`CREATE TABLE IF NOT EXISTS ${sql(table)} (
34
+ migration_id INTEGER UNSIGNED NOT NULL,
35
+ created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
36
+ name VARCHAR(255) NOT NULL,
37
+ PRIMARY KEY (migration_id)
38
+ )`
39
+ },
40
+ lockTable(sql, table) {
41
+ return sql`LOCK TABLE ${sql(table)} IN ACCESS EXCLUSIVE MODE`
42
+ },
43
+ dumpSchema(sql, path, table) {
44
+ const mysqlDump = (args: Array<string>) =>
45
+ Effect.gen(function*(_) {
46
+ const dump = yield* _(
47
+ Command.make(
48
+ "mysqldump",
49
+ ...(sql.config.username ? ["-u", sql.config.username] : []),
50
+ ...(sql.config.database ? [sql.config.database] : []),
51
+ "--skip-comments",
52
+ "--compact",
53
+ ...args
54
+ ),
55
+ Command.env({
56
+ PATH: (globalThis as any).process?.env.PATH,
57
+ MYSQL_HOST: sql.config.host,
58
+ MYSQL_TCP_PORT: sql.config.port?.toString(),
59
+ MYSQL_PWD: sql.config.password
60
+ ? Secret.value(sql.config.password)
61
+ : undefined
62
+ }),
63
+ Command.string
64
+ )
65
+
66
+ return dump.replace(/^\/\*.*$/gm, "")
67
+ .replace(/\n{2,}/gm, "\n\n")
68
+ .trim()
69
+ }).pipe(
70
+ Effect.mapError((error) => new Migrator.MigrationError({ reason: "failed", message: error.message }))
71
+ )
72
+
73
+ const dumpSchema = mysqlDump(["--no-data"])
74
+
75
+ const dumpMigrations = mysqlDump(["--no-create-info", "--tables", table])
76
+
77
+ const dumpAll = Effect.map(
78
+ Effect.all([dumpSchema, dumpMigrations], { concurrency: 2 }),
79
+ ([schema, migrations]) => schema + "\n\n" + migrations
80
+ )
81
+
82
+ const dumpFile = (file: string) =>
83
+ Effect.gen(function*(_) {
84
+ const fs = yield* _(FileSystem)
85
+ const path = yield* _(Path)
86
+ const dump = yield* _(dumpAll)
87
+ yield* _(fs.makeDirectory(path.dirname(file), { recursive: true }))
88
+ yield* _(fs.writeFileString(file, dump))
89
+ }).pipe(
90
+ Effect.mapError((error) => new Migrator.MigrationError({ reason: "failed", message: error.message }))
91
+ )
92
+
93
+ return dumpFile(path)
94
+ }
95
+ })
96
+
97
+ /**
98
+ * @category layers
99
+ * @since 1.0.0
100
+ */
101
+ export const layer = <R>(
102
+ options: Migrator.MigratorOptions<R>
103
+ ): Layer.Layer<
104
+ never,
105
+ SqlError | Migrator.MigrationError,
106
+ Client.MysqlClient | FileSystem | Path | CommandExecutor | R
107
+ > => Layer.effectDiscard(run(options))
package/src/index.ts ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+
5
+ /**
6
+ * @since 1.0.0
7
+ */
8
+ export * as client from "./Client.js"
9
+
10
+ /**
11
+ * @since 1.0.0
12
+ */
13
+ export * as error from "@effect/sql/Error"
14
+
15
+ /**
16
+ * @since 1.0.0
17
+ */
18
+ export * as migrator from "./Migrator.js"
19
+
20
+ /**
21
+ * @since 1.0.0
22
+ */
23
+ export * as resolver from "@effect/sql/Resolver"
24
+
25
+ /**
26
+ * @since 1.0.0
27
+ */
28
+ export * as schema from "@effect/sql/Schema"
29
+
30
+ /**
31
+ * @since 1.0.0
32
+ */
33
+ export * as statement from "@effect/sql/Statement"