@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.
- package/Client/package.json +6 -0
- package/LICENSE +21 -0
- package/Migrator/package.json +6 -0
- package/README.md +5 -0
- package/dist/cjs/Client.js +183 -0
- package/dist/cjs/Client.js.map +1 -0
- package/dist/cjs/Migrator.js +119 -0
- package/dist/cjs/Migrator.js.map +1 -0
- package/dist/cjs/index.js +44 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/dts/Client.d.ts +62 -0
- package/dist/dts/Client.d.ts.map +1 -0
- package/dist/dts/Migrator.d.ts +23 -0
- package/dist/dts/Migrator.d.ts.map +1 -0
- package/dist/dts/index.d.ts +28 -0
- package/dist/dts/index.d.ts.map +1 -0
- package/dist/esm/Client.js +148 -0
- package/dist/esm/Client.js.map +1 -0
- package/dist/esm/Migrator.js +71 -0
- package/dist/esm/Migrator.js.map +1 -0
- package/dist/esm/index.js +28 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +4 -0
- package/package.json +51 -0
- package/src/Client.ts +230 -0
- package/src/Migrator.ts +107 -0
- package/src/index.ts +33 -0
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.
|
package/README.md
ADDED
|
@@ -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":"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","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":[]}
|
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
|
+
}
|
package/src/Migrator.ts
ADDED
|
@@ -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"
|