@noego/proper 0.0.3 → 0.0.4

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/lib/runner.js ADDED
@@ -0,0 +1,257 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var __async = (__this, __arguments, generator) => {
19
+ return new Promise((resolve, reject) => {
20
+ var fulfilled = (value) => {
21
+ try {
22
+ step(generator.next(value));
23
+ } catch (e) {
24
+ reject(e);
25
+ }
26
+ };
27
+ var rejected = (value) => {
28
+ try {
29
+ step(generator.throw(value));
30
+ } catch (e) {
31
+ reject(e);
32
+ }
33
+ };
34
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
35
+ step((generator = generator.apply(__this, __arguments)).next());
36
+ });
37
+ };
38
+
39
+ // framework/lib/runner.ts
40
+ var runner_exports = {};
41
+ __export(runner_exports, {
42
+ BaseSQLRunner: () => BaseSQLRunner,
43
+ SQLRunner: () => SQLRunner,
44
+ SQLiteRunner: () => SQLiteRunner
45
+ });
46
+ module.exports = __toCommonJS(runner_exports);
47
+
48
+ // framework/SQLRunner.ts
49
+ var BaseSQLRunner = class {
50
+ /**
51
+ * Ensures that both MySQL and SQLite return the same tuple shape that callers
52
+ * expect: `[rowsOrResult, extra]`. For SQLite there is no `extra` metadata
53
+ * comparable to MySQL's `FieldPacket[]`, so we just use `undefined`.
54
+ */
55
+ query(_0) {
56
+ return __async(this, arguments, function* (sql, params = []) {
57
+ const result = yield this._query(sql, params);
58
+ return Array.isArray(result) && result.length === 2 ? result : [result, void 0];
59
+ });
60
+ }
61
+ execute(_0) {
62
+ return __async(this, arguments, function* (sql, params = []) {
63
+ const result = yield this._execute(sql, params);
64
+ return Array.isArray(result) && result.length === 2 ? result : [result, void 0];
65
+ });
66
+ }
67
+ end() {
68
+ return __async(this, null, function* () {
69
+ yield this._end();
70
+ });
71
+ }
72
+ };
73
+ function isPromiseLike(value) {
74
+ return !!value && typeof value.then === "function";
75
+ }
76
+ var SQLRunner = class extends BaseSQLRunner {
77
+ constructor(connection) {
78
+ super();
79
+ this.connection = connection;
80
+ }
81
+ // The MySQL driver already returns the correct tuple shapes.
82
+ _query(_0) {
83
+ return __async(this, arguments, function* (sql, params = []) {
84
+ return yield this.connection.query(sql, params);
85
+ });
86
+ }
87
+ _execute(_0) {
88
+ return __async(this, arguments, function* (sql, params = []) {
89
+ return yield this.connection.execute(sql, params);
90
+ });
91
+ }
92
+ _end() {
93
+ return __async(this, null, function* () {
94
+ if (this.connection) {
95
+ yield this.connection.end();
96
+ }
97
+ });
98
+ }
99
+ };
100
+ var SQLiteRunner = class extends BaseSQLRunner {
101
+ constructor(connection) {
102
+ super();
103
+ this.connection = connection;
104
+ }
105
+ prepareStatement(sql) {
106
+ return __async(this, null, function* () {
107
+ if (typeof this.connection.prepare !== "function") {
108
+ throw new Error("SQLite connection does not support prepare()");
109
+ }
110
+ const stmt = this.connection.prepare(sql);
111
+ return isPromiseLike(stmt) ? yield stmt : stmt;
112
+ });
113
+ }
114
+ finalizeStatement(stmt) {
115
+ return __async(this, null, function* () {
116
+ if (!stmt || typeof stmt.finalize !== "function") return;
117
+ const result = stmt.finalize();
118
+ if (isPromiseLike(result)) {
119
+ yield result;
120
+ }
121
+ });
122
+ }
123
+ statementAll(stmt, params) {
124
+ return __async(this, null, function* () {
125
+ if (typeof stmt.all !== "function") {
126
+ throw new Error("SQLite statement does not support all()");
127
+ }
128
+ if (stmt.all.length >= 2) {
129
+ return yield new Promise((resolve, reject) => {
130
+ const callback = (err, rows) => {
131
+ if (err) return reject(err);
132
+ resolve(rows || []);
133
+ };
134
+ try {
135
+ if (params.length > 0) {
136
+ stmt.all(params, callback);
137
+ } else {
138
+ stmt.all(callback);
139
+ }
140
+ } catch (error) {
141
+ reject(error);
142
+ }
143
+ });
144
+ }
145
+ const result = stmt.all(...params);
146
+ return isPromiseLike(result) ? yield result : result;
147
+ });
148
+ }
149
+ statementRun(stmt, params) {
150
+ return __async(this, null, function* () {
151
+ if (typeof stmt.run !== "function") {
152
+ throw new Error("SQLite statement does not support run()");
153
+ }
154
+ if (stmt.run.length >= 2) {
155
+ return yield new Promise((resolve, reject) => {
156
+ const callback = function(err) {
157
+ var _a;
158
+ if (err) return reject(err);
159
+ resolve({ changes: (_a = this == null ? void 0 : this.changes) != null ? _a : 0, lastID: this == null ? void 0 : this.lastID });
160
+ };
161
+ try {
162
+ if (params.length > 0) {
163
+ stmt.run(params, callback);
164
+ } else {
165
+ stmt.run(callback);
166
+ }
167
+ } catch (error) {
168
+ reject(error);
169
+ }
170
+ });
171
+ }
172
+ const result = stmt.run(...params);
173
+ return isPromiseLike(result) ? yield result : result;
174
+ });
175
+ }
176
+ _query(_0) {
177
+ return __async(this, arguments, function* (sql, params = []) {
178
+ const stmt = yield this.prepareStatement(sql);
179
+ try {
180
+ const rows = yield this.statementAll(stmt, params);
181
+ return rows;
182
+ } finally {
183
+ yield this.finalizeStatement(stmt);
184
+ }
185
+ });
186
+ }
187
+ _execute(_0) {
188
+ return __async(this, arguments, function* (sql, params = []) {
189
+ if (this.isMultiStatement(sql)) {
190
+ return yield this.executeMultiStatement(sql, params).catch((err) => {
191
+ console.error(`Error executing multi-statement SQL:
192
+ ${sql}
193
+ `, err);
194
+ throw err;
195
+ });
196
+ }
197
+ const stmt = yield this.prepareStatement(sql);
198
+ try {
199
+ const info = yield this.statementRun(stmt, params);
200
+ return info;
201
+ } finally {
202
+ yield this.finalizeStatement(stmt);
203
+ }
204
+ });
205
+ }
206
+ isMultiStatement(sql) {
207
+ return sql.split(";").length > 1;
208
+ }
209
+ executeMultiStatement(_0) {
210
+ return __async(this, arguments, function* (sql, params = []) {
211
+ const statements = sql.split(";").map(
212
+ (s) => s.split("\n").map(
213
+ (s2) => this.removeComments(s2)
214
+ ).filter((s2) => s2.trim() != "").join("\n")
215
+ ).filter((s) => s.trim() !== "");
216
+ const infos = yield statements.reduce((prev, statement) => __async(this, null, function* () {
217
+ const infos2 = yield prev;
218
+ const stmt = yield this.prepareStatement(`${statement};`);
219
+ try {
220
+ const info = yield this.statementRun(stmt, params);
221
+ infos2.push(info);
222
+ return infos2;
223
+ } finally {
224
+ yield this.finalizeStatement(stmt);
225
+ }
226
+ }), Promise.resolve([null])).then((infos2) => {
227
+ return infos2.filter((info) => info !== null);
228
+ });
229
+ return infos.reduce((acc, latest) => {
230
+ if (latest) {
231
+ acc.stmt = latest.stmt;
232
+ acc.lastID = latest.lastID;
233
+ acc.changes += latest.changes;
234
+ }
235
+ return acc;
236
+ });
237
+ });
238
+ }
239
+ removeComments(sql) {
240
+ sql = sql.replace(/--.*$/gm, "");
241
+ return sql;
242
+ }
243
+ _end() {
244
+ return __async(this, null, function* () {
245
+ if (this.connection) {
246
+ yield this.connection.close();
247
+ }
248
+ });
249
+ }
250
+ };
251
+ // Annotate the CommonJS export names for ESM import in node:
252
+ 0 && (module.exports = {
253
+ BaseSQLRunner,
254
+ SQLRunner,
255
+ SQLiteRunner
256
+ });
257
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../framework/lib/runner.ts","../framework/SQLRunner.ts"],"sourcesContent":["export { ISQLRunner, BaseSQLRunner, SQLRunner, SQLiteRunner } from '../SQLRunner';\n","\nimport * as sqlite from 'sqlite';\nimport { Statement } from 'sqlite3';\nimport mysql from 'mysql2/promise';\n\n\n\ntype QueryResult = {\n stmt: Statement;\n lastID: number;\n changes: number;\n}\n\nexport interface ISQLRunner {\n query(sql: string, params?: any[]): Promise<any>;\n execute(sql: string, params?: any[]): Promise<any>;\n end(): Promise<void>;\n}\n\n/**\n * Base class that implements the common contract and helper utilities that are\n * shared between the different dialect runners. The concrete subclasses only\n * need to implement the three primitive methods `_query`, `_execute` and\n * `_end` that perform the actual driver-specific interaction. Everything else\n * – such as ensuring a uniform return shape – is handled here once.\n */\nexport abstract class BaseSQLRunner implements ISQLRunner {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n abstract _query(sql: string, params?: any[]): Promise<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n abstract _execute(sql: string, params?: any[]): Promise<any>;\n abstract _end(): Promise<void>;\n\n /**\n * Ensures that both MySQL and SQLite return the same tuple shape that callers\n * expect: `[rowsOrResult, extra]`. For SQLite there is no `extra` metadata\n * comparable to MySQL's `FieldPacket[]`, so we just use `undefined`.\n */\n async query(sql: string, params: any[] = []): Promise<any> {\n const result = await this._query(sql, params);\n\n // MySQL already returns the desired tuple. For SQLite we need to wrap.\n return Array.isArray(result) && result.length === 2 ? result : [result, undefined];\n }\n\n async execute(sql: string, params: any[] = []): Promise<any> {\n const result = await this._execute(sql, params);\n return Array.isArray(result) && result.length === 2 ? result : [result, undefined];\n }\n\n async end(): Promise<void> {\n await this._end();\n }\n}\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === \"function\";\n}\n\nexport class SQLRunner extends BaseSQLRunner {\n constructor(private connection: mysql.Connection) {\n super();\n }\n\n // The MySQL driver already returns the correct tuple shapes.\n async _query(sql: string, params: any[] = []) {\n return await this.connection.query(sql, params);\n }\n\n async _execute(sql: string, params: any[] = []) {\n return await this.connection.execute(sql, params);\n }\n\n async _end() {\n if (this.connection) {\n await this.connection.end();\n }\n }\n}\n\nexport class SQLiteRunner extends BaseSQLRunner {\n constructor(private connection: sqlite.Database | any) {\n super();\n }\n\n private async prepareStatement(sql: string) {\n if (typeof this.connection.prepare !== \"function\") {\n throw new Error(\"SQLite connection does not support prepare()\");\n }\n const stmt = this.connection.prepare(sql);\n return isPromiseLike(stmt) ? await stmt : stmt;\n }\n\n private async finalizeStatement(stmt: any) {\n if (!stmt || typeof stmt.finalize !== \"function\") return;\n const result = stmt.finalize();\n if (isPromiseLike(result)) {\n await result;\n }\n }\n\n private async statementAll(stmt: any, params: any[]) {\n if (typeof stmt.all !== \"function\") {\n throw new Error(\"SQLite statement does not support all()\");\n }\n // sqlite3 callback-style API\n if (stmt.all.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n };\n try {\n if (params.length > 0) {\n stmt.all(params, callback);\n } else {\n stmt.all(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.all(...params);\n return isPromiseLike(result) ? await result : result;\n }\n\n private async statementRun(stmt: any, params: any[]) {\n if (typeof stmt.run !== \"function\") {\n throw new Error(\"SQLite statement does not support run()\");\n }\n if (stmt.run.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ changes: this?.changes ?? 0, lastID: this?.lastID });\n };\n try {\n if (params.length > 0) {\n stmt.run(params, callback);\n } else {\n stmt.run(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.run(...params);\n return isPromiseLike(result) ? await result : result;\n }\n\n async _query(sql: string, params: any[] = []) {\n const stmt = await this.prepareStatement(sql);\n try {\n const rows = await this.statementAll(stmt, params);\n return rows;\n } finally {\n await this.finalizeStatement(stmt);\n }\n }\n\n async _execute(sql: string, params: any[] = []) {\n if (this.isMultiStatement(sql)) {\n return await this.executeMultiStatement(sql, params)\n .catch((err) => {\n console.error((\n \"Error executing multi-statement SQL:\\n\"+\n `${sql}\\n`\n ), err);\n throw err;\n });\n }\n \n const stmt = await this.prepareStatement(sql);\n try {\n const info = await this.statementRun(stmt, params);\n return info;\n } finally {\n await this.finalizeStatement(stmt);\n }\n }\n\n private isMultiStatement(sql: string): boolean {\n // SQLite does not support multiple statements in a single query.\n return sql.split(';').length > 1;\n }\n\n private async executeMultiStatement(sql: string, params: any[] = []) {\n const statements = sql.split(';')\n .map((s) => s.split('\\n')\n .map(\n s=>this.removeComments(s))\n .filter(s=>s.trim()!='')\n .join('\\n')\n )\n .filter((s) => s.trim() !== '');\n \n const infos = await statements.reduce(async (prev,statement) => {\n const infos = await prev;\n const stmt = await this.prepareStatement(`${statement};`);\n try {\n const info = await this.statementRun(stmt, params);\n infos.push(info);\n return infos;\n } finally {\n await this.finalizeStatement(stmt);\n }\n },Promise.resolve([null] as any[]))\n .then((infos:QueryResult[]) => {\n return infos.filter((info) => info !== null);\n })\n return infos.reduce((acc,latest)=>{\n if(latest){\n acc.stmt = latest.stmt;\n acc.lastID = latest.lastID;\n acc.changes += latest.changes;\n }\n return acc\n })\n }\n\n private removeComments(sql: string): string {\n // Remove single-line comments\n sql = sql.replace(/--.*$/gm, '');\n return sql;\n }\n\n\n async _end() {\n if (this.connection) {\n await this.connection.close();\n }\n }\n}\n"],"mappings":"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","names":["s","infos"]}
package/lib/runner.mjs ADDED
@@ -0,0 +1,230 @@
1
+ var __async = (__this, __arguments, generator) => {
2
+ return new Promise((resolve, reject) => {
3
+ var fulfilled = (value) => {
4
+ try {
5
+ step(generator.next(value));
6
+ } catch (e) {
7
+ reject(e);
8
+ }
9
+ };
10
+ var rejected = (value) => {
11
+ try {
12
+ step(generator.throw(value));
13
+ } catch (e) {
14
+ reject(e);
15
+ }
16
+ };
17
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
18
+ step((generator = generator.apply(__this, __arguments)).next());
19
+ });
20
+ };
21
+
22
+ // framework/SQLRunner.ts
23
+ var BaseSQLRunner = class {
24
+ /**
25
+ * Ensures that both MySQL and SQLite return the same tuple shape that callers
26
+ * expect: `[rowsOrResult, extra]`. For SQLite there is no `extra` metadata
27
+ * comparable to MySQL's `FieldPacket[]`, so we just use `undefined`.
28
+ */
29
+ query(_0) {
30
+ return __async(this, arguments, function* (sql, params = []) {
31
+ const result = yield this._query(sql, params);
32
+ return Array.isArray(result) && result.length === 2 ? result : [result, void 0];
33
+ });
34
+ }
35
+ execute(_0) {
36
+ return __async(this, arguments, function* (sql, params = []) {
37
+ const result = yield this._execute(sql, params);
38
+ return Array.isArray(result) && result.length === 2 ? result : [result, void 0];
39
+ });
40
+ }
41
+ end() {
42
+ return __async(this, null, function* () {
43
+ yield this._end();
44
+ });
45
+ }
46
+ };
47
+ function isPromiseLike(value) {
48
+ return !!value && typeof value.then === "function";
49
+ }
50
+ var SQLRunner = class extends BaseSQLRunner {
51
+ constructor(connection) {
52
+ super();
53
+ this.connection = connection;
54
+ }
55
+ // The MySQL driver already returns the correct tuple shapes.
56
+ _query(_0) {
57
+ return __async(this, arguments, function* (sql, params = []) {
58
+ return yield this.connection.query(sql, params);
59
+ });
60
+ }
61
+ _execute(_0) {
62
+ return __async(this, arguments, function* (sql, params = []) {
63
+ return yield this.connection.execute(sql, params);
64
+ });
65
+ }
66
+ _end() {
67
+ return __async(this, null, function* () {
68
+ if (this.connection) {
69
+ yield this.connection.end();
70
+ }
71
+ });
72
+ }
73
+ };
74
+ var SQLiteRunner = class extends BaseSQLRunner {
75
+ constructor(connection) {
76
+ super();
77
+ this.connection = connection;
78
+ }
79
+ prepareStatement(sql) {
80
+ return __async(this, null, function* () {
81
+ if (typeof this.connection.prepare !== "function") {
82
+ throw new Error("SQLite connection does not support prepare()");
83
+ }
84
+ const stmt = this.connection.prepare(sql);
85
+ return isPromiseLike(stmt) ? yield stmt : stmt;
86
+ });
87
+ }
88
+ finalizeStatement(stmt) {
89
+ return __async(this, null, function* () {
90
+ if (!stmt || typeof stmt.finalize !== "function") return;
91
+ const result = stmt.finalize();
92
+ if (isPromiseLike(result)) {
93
+ yield result;
94
+ }
95
+ });
96
+ }
97
+ statementAll(stmt, params) {
98
+ return __async(this, null, function* () {
99
+ if (typeof stmt.all !== "function") {
100
+ throw new Error("SQLite statement does not support all()");
101
+ }
102
+ if (stmt.all.length >= 2) {
103
+ return yield new Promise((resolve, reject) => {
104
+ const callback = (err, rows) => {
105
+ if (err) return reject(err);
106
+ resolve(rows || []);
107
+ };
108
+ try {
109
+ if (params.length > 0) {
110
+ stmt.all(params, callback);
111
+ } else {
112
+ stmt.all(callback);
113
+ }
114
+ } catch (error) {
115
+ reject(error);
116
+ }
117
+ });
118
+ }
119
+ const result = stmt.all(...params);
120
+ return isPromiseLike(result) ? yield result : result;
121
+ });
122
+ }
123
+ statementRun(stmt, params) {
124
+ return __async(this, null, function* () {
125
+ if (typeof stmt.run !== "function") {
126
+ throw new Error("SQLite statement does not support run()");
127
+ }
128
+ if (stmt.run.length >= 2) {
129
+ return yield new Promise((resolve, reject) => {
130
+ const callback = function(err) {
131
+ var _a;
132
+ if (err) return reject(err);
133
+ resolve({ changes: (_a = this == null ? void 0 : this.changes) != null ? _a : 0, lastID: this == null ? void 0 : this.lastID });
134
+ };
135
+ try {
136
+ if (params.length > 0) {
137
+ stmt.run(params, callback);
138
+ } else {
139
+ stmt.run(callback);
140
+ }
141
+ } catch (error) {
142
+ reject(error);
143
+ }
144
+ });
145
+ }
146
+ const result = stmt.run(...params);
147
+ return isPromiseLike(result) ? yield result : result;
148
+ });
149
+ }
150
+ _query(_0) {
151
+ return __async(this, arguments, function* (sql, params = []) {
152
+ const stmt = yield this.prepareStatement(sql);
153
+ try {
154
+ const rows = yield this.statementAll(stmt, params);
155
+ return rows;
156
+ } finally {
157
+ yield this.finalizeStatement(stmt);
158
+ }
159
+ });
160
+ }
161
+ _execute(_0) {
162
+ return __async(this, arguments, function* (sql, params = []) {
163
+ if (this.isMultiStatement(sql)) {
164
+ return yield this.executeMultiStatement(sql, params).catch((err) => {
165
+ console.error(`Error executing multi-statement SQL:
166
+ ${sql}
167
+ `, err);
168
+ throw err;
169
+ });
170
+ }
171
+ const stmt = yield this.prepareStatement(sql);
172
+ try {
173
+ const info = yield this.statementRun(stmt, params);
174
+ return info;
175
+ } finally {
176
+ yield this.finalizeStatement(stmt);
177
+ }
178
+ });
179
+ }
180
+ isMultiStatement(sql) {
181
+ return sql.split(";").length > 1;
182
+ }
183
+ executeMultiStatement(_0) {
184
+ return __async(this, arguments, function* (sql, params = []) {
185
+ const statements = sql.split(";").map(
186
+ (s) => s.split("\n").map(
187
+ (s2) => this.removeComments(s2)
188
+ ).filter((s2) => s2.trim() != "").join("\n")
189
+ ).filter((s) => s.trim() !== "");
190
+ const infos = yield statements.reduce((prev, statement) => __async(this, null, function* () {
191
+ const infos2 = yield prev;
192
+ const stmt = yield this.prepareStatement(`${statement};`);
193
+ try {
194
+ const info = yield this.statementRun(stmt, params);
195
+ infos2.push(info);
196
+ return infos2;
197
+ } finally {
198
+ yield this.finalizeStatement(stmt);
199
+ }
200
+ }), Promise.resolve([null])).then((infos2) => {
201
+ return infos2.filter((info) => info !== null);
202
+ });
203
+ return infos.reduce((acc, latest) => {
204
+ if (latest) {
205
+ acc.stmt = latest.stmt;
206
+ acc.lastID = latest.lastID;
207
+ acc.changes += latest.changes;
208
+ }
209
+ return acc;
210
+ });
211
+ });
212
+ }
213
+ removeComments(sql) {
214
+ sql = sql.replace(/--.*$/gm, "");
215
+ return sql;
216
+ }
217
+ _end() {
218
+ return __async(this, null, function* () {
219
+ if (this.connection) {
220
+ yield this.connection.close();
221
+ }
222
+ });
223
+ }
224
+ };
225
+ export {
226
+ BaseSQLRunner,
227
+ SQLRunner,
228
+ SQLiteRunner
229
+ };
230
+ //# sourceMappingURL=runner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../framework/SQLRunner.ts"],"sourcesContent":["\nimport * as sqlite from 'sqlite';\nimport { Statement } from 'sqlite3';\nimport mysql from 'mysql2/promise';\n\n\n\ntype QueryResult = {\n stmt: Statement;\n lastID: number;\n changes: number;\n}\n\nexport interface ISQLRunner {\n query(sql: string, params?: any[]): Promise<any>;\n execute(sql: string, params?: any[]): Promise<any>;\n end(): Promise<void>;\n}\n\n/**\n * Base class that implements the common contract and helper utilities that are\n * shared between the different dialect runners. The concrete subclasses only\n * need to implement the three primitive methods `_query`, `_execute` and\n * `_end` that perform the actual driver-specific interaction. Everything else\n * – such as ensuring a uniform return shape – is handled here once.\n */\nexport abstract class BaseSQLRunner implements ISQLRunner {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n abstract _query(sql: string, params?: any[]): Promise<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n abstract _execute(sql: string, params?: any[]): Promise<any>;\n abstract _end(): Promise<void>;\n\n /**\n * Ensures that both MySQL and SQLite return the same tuple shape that callers\n * expect: `[rowsOrResult, extra]`. For SQLite there is no `extra` metadata\n * comparable to MySQL's `FieldPacket[]`, so we just use `undefined`.\n */\n async query(sql: string, params: any[] = []): Promise<any> {\n const result = await this._query(sql, params);\n\n // MySQL already returns the desired tuple. For SQLite we need to wrap.\n return Array.isArray(result) && result.length === 2 ? result : [result, undefined];\n }\n\n async execute(sql: string, params: any[] = []): Promise<any> {\n const result = await this._execute(sql, params);\n return Array.isArray(result) && result.length === 2 ? result : [result, undefined];\n }\n\n async end(): Promise<void> {\n await this._end();\n }\n}\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n return !!value && typeof (value as Promise<T>).then === \"function\";\n}\n\nexport class SQLRunner extends BaseSQLRunner {\n constructor(private connection: mysql.Connection) {\n super();\n }\n\n // The MySQL driver already returns the correct tuple shapes.\n async _query(sql: string, params: any[] = []) {\n return await this.connection.query(sql, params);\n }\n\n async _execute(sql: string, params: any[] = []) {\n return await this.connection.execute(sql, params);\n }\n\n async _end() {\n if (this.connection) {\n await this.connection.end();\n }\n }\n}\n\nexport class SQLiteRunner extends BaseSQLRunner {\n constructor(private connection: sqlite.Database | any) {\n super();\n }\n\n private async prepareStatement(sql: string) {\n if (typeof this.connection.prepare !== \"function\") {\n throw new Error(\"SQLite connection does not support prepare()\");\n }\n const stmt = this.connection.prepare(sql);\n return isPromiseLike(stmt) ? await stmt : stmt;\n }\n\n private async finalizeStatement(stmt: any) {\n if (!stmt || typeof stmt.finalize !== \"function\") return;\n const result = stmt.finalize();\n if (isPromiseLike(result)) {\n await result;\n }\n }\n\n private async statementAll(stmt: any, params: any[]) {\n if (typeof stmt.all !== \"function\") {\n throw new Error(\"SQLite statement does not support all()\");\n }\n // sqlite3 callback-style API\n if (stmt.all.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = (err: Error | null, rows: any[]) => {\n if (err) return reject(err);\n resolve(rows || []);\n };\n try {\n if (params.length > 0) {\n stmt.all(params, callback);\n } else {\n stmt.all(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.all(...params);\n return isPromiseLike(result) ? await result : result;\n }\n\n private async statementRun(stmt: any, params: any[]) {\n if (typeof stmt.run !== \"function\") {\n throw new Error(\"SQLite statement does not support run()\");\n }\n if (stmt.run.length >= 2) {\n return await new Promise((resolve, reject) => {\n const callback = function (this: any, err: Error | null) {\n if (err) return reject(err);\n resolve({ changes: this?.changes ?? 0, lastID: this?.lastID });\n };\n try {\n if (params.length > 0) {\n stmt.run(params, callback);\n } else {\n stmt.run(callback);\n }\n } catch (error) {\n reject(error);\n }\n });\n }\n const result = stmt.run(...params);\n return isPromiseLike(result) ? await result : result;\n }\n\n async _query(sql: string, params: any[] = []) {\n const stmt = await this.prepareStatement(sql);\n try {\n const rows = await this.statementAll(stmt, params);\n return rows;\n } finally {\n await this.finalizeStatement(stmt);\n }\n }\n\n async _execute(sql: string, params: any[] = []) {\n if (this.isMultiStatement(sql)) {\n return await this.executeMultiStatement(sql, params)\n .catch((err) => {\n console.error((\n \"Error executing multi-statement SQL:\\n\"+\n `${sql}\\n`\n ), err);\n throw err;\n });\n }\n \n const stmt = await this.prepareStatement(sql);\n try {\n const info = await this.statementRun(stmt, params);\n return info;\n } finally {\n await this.finalizeStatement(stmt);\n }\n }\n\n private isMultiStatement(sql: string): boolean {\n // SQLite does not support multiple statements in a single query.\n return sql.split(';').length > 1;\n }\n\n private async executeMultiStatement(sql: string, params: any[] = []) {\n const statements = sql.split(';')\n .map((s) => s.split('\\n')\n .map(\n s=>this.removeComments(s))\n .filter(s=>s.trim()!='')\n .join('\\n')\n )\n .filter((s) => s.trim() !== '');\n \n const infos = await statements.reduce(async (prev,statement) => {\n const infos = await prev;\n const stmt = await this.prepareStatement(`${statement};`);\n try {\n const info = await this.statementRun(stmt, params);\n infos.push(info);\n return infos;\n } finally {\n await this.finalizeStatement(stmt);\n }\n },Promise.resolve([null] as any[]))\n .then((infos:QueryResult[]) => {\n return infos.filter((info) => info !== null);\n })\n return infos.reduce((acc,latest)=>{\n if(latest){\n acc.stmt = latest.stmt;\n acc.lastID = latest.lastID;\n acc.changes += latest.changes;\n }\n return acc\n })\n }\n\n private removeComments(sql: string): string {\n // Remove single-line comments\n sql = sql.replace(/--.*$/gm, '');\n return sql;\n }\n\n\n async _end() {\n if (this.connection) {\n await this.connection.close();\n }\n }\n}\n"],"mappings":"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","names":["s","infos"]}
package/package.json CHANGED
@@ -1,17 +1,25 @@
1
1
  {
2
2
  "name": "@noego/proper",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "module": "bin/index.mjs",
7
+ "types": "bin/index.d.ts",
7
8
  "exports": {
8
9
  ".": {
10
+ "types": "./bin/index.d.ts",
9
11
  "import": "./bin/index.mjs",
10
12
  "require": "./bin/index.js"
11
13
  },
12
14
  "./cli": {
15
+ "types": "./bin/cli.d.ts",
13
16
  "import": "./bin/cli.mjs",
14
17
  "require": "./bin/cli.js"
18
+ },
19
+ "./runners": {
20
+ "types": "./lib/runner.d.ts",
21
+ "import": "./lib/runner.mjs",
22
+ "require": "./lib/runner.js"
15
23
  }
16
24
  },
17
25
  "bin": {
@@ -19,6 +27,7 @@
19
27
  },
20
28
  "files": [
21
29
  "bin",
30
+ "lib",
22
31
  "readme.md"
23
32
  ],
24
33
  "scripts": {
@@ -44,6 +53,8 @@
44
53
  "dependencies": {
45
54
  "@types/argparse": "^2.0.15",
46
55
  "@types/minimist": "^1.2.5",
56
+ "ajv": "^8.17.1",
57
+ "ajv-formats": "^3.0.1",
47
58
  "argparse": "^2.0.1",
48
59
  "console-table-printer": "^2.12.0",
49
60
  "minimist": "^1.2.8",