@technicity/data-service-generator 0.14.1 → 0.14.2
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/dist/generation/generate.d.ts +1 -0
- package/dist/generation/generate.js +916 -309
- package/dist/runtime/Cache.js +6 -3
- package/dist/runtime/IRuntime.d.ts +46 -17
- package/dist/runtime/RuntimeMSSQL.d.ts +7 -1
- package/dist/runtime/RuntimeMSSQL.js +4 -4
- package/dist/runtime/RuntimeMySQL.d.ts +3 -1
- package/dist/runtime/RuntimeMySQL.js +33 -7
- package/dist/runtime/RuntimeSQLite.d.ts +38 -0
- package/dist/runtime/RuntimeSQLite.js +135 -0
- package/dist/runtime/lib/MSSQL.d.ts +2 -1
- package/dist/runtime/lib/MSSQL.js +36 -8
- package/dist/runtime/lib/MySQL.d.ts +1 -1
- package/dist/runtime/lib/MySQL.js +15 -2
- package/dist/runtime/lib/addNullFallbacks.test.d.ts +1 -0
- package/dist/runtime/lib/addNullFallbacks.test.js +206 -0
- package/dist/runtime/lib/getSqlAst.js +158 -121
- package/dist/runtime/lib/shared.d.ts +1 -2
- package/dist/runtime/lib/shared.js +180 -71
- package/dist/runtime/lib/stringifyWhere.js +39 -12
- package/dist/runtime/lib/stringifyWhere.test.d.ts +1 -0
- package/dist/runtime/lib/stringifyWhere.test.js +236 -0
- package/dist/runtime/lib/typeCastMSSQL.js +24 -1
- package/dist/traverseFieldArgs.d.ts +2 -2
- package/dist/traverseFieldArgs.js +8 -3
- package/dist/traverseFieldArgs.test.d.ts +1 -0
- package/dist/traverseFieldArgs.test.js +56 -0
- package/package.json +1 -1
- package/dist/ksql.d.ts +0 -15
- package/dist/ksql.js +0 -55
- package/dist/runtime/RuntimeKSQL.d.ts +0 -19
- package/dist/runtime/RuntimeKSQL.js +0 -446
- package/dist/runtime/lib/runTransforms.d.ts +0 -2
- package/dist/runtime/lib/runTransforms.js +0 -36
package/dist/runtime/Cache.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
const crypto_1 = require("crypto");
|
|
4
|
-
const ioredis_1 = require("ioredis");
|
|
5
|
-
const loglevel_1 = require("loglevel");
|
|
7
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
8
|
+
const loglevel_1 = __importDefault(require("loglevel"));
|
|
6
9
|
const utility_1 = require("./lib/utility");
|
|
7
|
-
const Stats_1 = require("./Stats");
|
|
10
|
+
const Stats_1 = __importDefault(require("./Stats"));
|
|
8
11
|
class Cache {
|
|
9
12
|
constructor(redisConfig, debug) {
|
|
10
13
|
this.waiting = new Set();
|
|
@@ -5,28 +5,35 @@ export interface IRuntime {
|
|
|
5
5
|
$whereNeedsProcessing(where: any): boolean;
|
|
6
6
|
$prepareWhere(artifacts: IArtifacts, table: string, data: any): Promise<any>;
|
|
7
7
|
$shutdown(): Promise<void>;
|
|
8
|
+
$startTransaction(input?: {
|
|
9
|
+
isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE";
|
|
10
|
+
}): Promise<TBeginTransactionResult>;
|
|
8
11
|
}
|
|
12
|
+
export declare type TAction = "findUnique" | "findMany" | "findManyPaginated" | "create" | "update" | "updateMany" | "delete" | "deleteMany";
|
|
9
13
|
export declare type TResolveParams = {
|
|
10
14
|
resource: string;
|
|
11
|
-
action:
|
|
12
|
-
args?: IArgs
|
|
15
|
+
action: TAction;
|
|
16
|
+
args?: IArgs;
|
|
13
17
|
data?: any;
|
|
14
18
|
artifacts: IArtifacts;
|
|
15
|
-
fields?:
|
|
16
|
-
context?: TContext
|
|
19
|
+
fields?: TSelect;
|
|
20
|
+
context?: TContext;
|
|
17
21
|
skipCache?: boolean;
|
|
22
|
+
dbCall?: TDbCall;
|
|
18
23
|
};
|
|
19
24
|
export declare type TContext = {
|
|
20
25
|
[k: string]: any;
|
|
21
26
|
};
|
|
22
27
|
export declare type TMiddleware = (params: TResolveParams, next: (params: TResolveParams) => Promise<any>) => Promise<any>;
|
|
23
|
-
export declare type IDialect = "mysql" | "mssql" | "
|
|
28
|
+
export declare type IDialect = "mysql" | "mssql" | "sqlite";
|
|
24
29
|
export declare type TDbCall = (q: string) => Promise<any>;
|
|
25
30
|
export declare type TFormatQuery = (q: string, values: any[]) => string;
|
|
26
|
-
export declare type TBeginTransaction = () => Promise<
|
|
31
|
+
export declare type TBeginTransaction = () => Promise<TBeginTransactionResult>;
|
|
32
|
+
declare type TBeginTransactionResult = {
|
|
27
33
|
dbCall: (q: string) => Promise<any>;
|
|
28
34
|
commit: () => Promise<void>;
|
|
29
|
-
|
|
35
|
+
rollback: () => Promise<void>;
|
|
36
|
+
};
|
|
30
37
|
export declare type ISupplementClientOpts = boolean;
|
|
31
38
|
export declare type IOrderBy = {
|
|
32
39
|
column: string;
|
|
@@ -35,12 +42,10 @@ export declare type IOrderBy = {
|
|
|
35
42
|
export declare type IArgs = {
|
|
36
43
|
[k: string]: any;
|
|
37
44
|
};
|
|
38
|
-
export declare type
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
args?: IArgs;
|
|
43
|
-
transform?: (record: any) => any;
|
|
45
|
+
export declare type TSelect = {
|
|
46
|
+
[k: string]: boolean | {
|
|
47
|
+
$fields?: TSelect;
|
|
48
|
+
};
|
|
44
49
|
};
|
|
45
50
|
declare type IWhere = (table: string, args: IArgs) => string | undefined;
|
|
46
51
|
declare type IASTChildColumn = {
|
|
@@ -48,14 +53,14 @@ declare type IASTChildColumn = {
|
|
|
48
53
|
name: string;
|
|
49
54
|
fieldName: string;
|
|
50
55
|
as: string;
|
|
51
|
-
fromOtherTable?: string
|
|
56
|
+
fromOtherTable?: string;
|
|
52
57
|
};
|
|
53
58
|
declare type IASTChildComposite = {
|
|
54
59
|
type: "composite";
|
|
55
60
|
name: string[];
|
|
56
61
|
fieldName: string;
|
|
57
62
|
as: string;
|
|
58
|
-
fromOtherTable?: string
|
|
63
|
+
fromOtherTable?: string;
|
|
59
64
|
};
|
|
60
65
|
declare type ISqlJoin = (t1: string, t2: string, args: IArgs) => string;
|
|
61
66
|
declare type ISqlBatch = {
|
|
@@ -81,7 +86,7 @@ declare type IJunction = {
|
|
|
81
86
|
export declare type IGetSQLASTInput = {
|
|
82
87
|
table: string;
|
|
83
88
|
fieldName: string;
|
|
84
|
-
fields:
|
|
89
|
+
fields: TSelect;
|
|
85
90
|
args?: IArgs;
|
|
86
91
|
where?: IWhere;
|
|
87
92
|
sqlJoin?: ISqlJoin;
|
|
@@ -89,7 +94,7 @@ export declare type IGetSQLASTInput = {
|
|
|
89
94
|
junction?: IJunction;
|
|
90
95
|
grabMany: boolean;
|
|
91
96
|
getWhere: (table: string, args: any, dialect: IDialect, orderBy?: IOrderBy | undefined, rowWithMatchingCursor?: any) => string | null;
|
|
92
|
-
orderBy?: IOrderBy
|
|
97
|
+
orderBy?: IOrderBy;
|
|
93
98
|
rowWithMatchingCursor?: any;
|
|
94
99
|
artifacts: IArtifacts;
|
|
95
100
|
dialect: IDialect;
|
|
@@ -153,6 +158,30 @@ export declare type IArtifacts = {
|
|
|
153
158
|
[k: string]: boolean;
|
|
154
159
|
};
|
|
155
160
|
dateTimeFieldsCount: number;
|
|
161
|
+
fields: TField[];
|
|
162
|
+
dump: {
|
|
163
|
+
schema: string;
|
|
164
|
+
} | null;
|
|
156
165
|
};
|
|
157
166
|
};
|
|
167
|
+
export declare type TFieldType = "string" | "boolean" | "number" | "integer";
|
|
168
|
+
export declare type TField = {
|
|
169
|
+
kind: "scalar";
|
|
170
|
+
type: TFieldType;
|
|
171
|
+
name: string;
|
|
172
|
+
nullable: boolean;
|
|
173
|
+
hasDefaultValue: boolean;
|
|
174
|
+
mapped?: true;
|
|
175
|
+
} | {
|
|
176
|
+
kind: "enum";
|
|
177
|
+
values: unknown[];
|
|
178
|
+
name: string;
|
|
179
|
+
nullable: boolean;
|
|
180
|
+
} | {
|
|
181
|
+
kind: "object";
|
|
182
|
+
type: string;
|
|
183
|
+
name: string;
|
|
184
|
+
isList: boolean;
|
|
185
|
+
nullable: boolean;
|
|
186
|
+
};
|
|
158
187
|
export {};
|
|
@@ -13,7 +13,13 @@ export declare class RuntimeMSSQL implements IRuntime {
|
|
|
13
13
|
$whereNeedsProcessing(where: any): boolean;
|
|
14
14
|
$prepareWhere(artifacts: IArtifacts, table: string, data: any): Promise<{}>;
|
|
15
15
|
$shutdown(): Promise<void>;
|
|
16
|
+
$startTransaction(input?: {
|
|
17
|
+
isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE";
|
|
18
|
+
}): Promise<{
|
|
19
|
+
commit: () => Promise<void>;
|
|
20
|
+
rollback: () => Promise<void>;
|
|
21
|
+
dbCall: (q: string) => Promise<any>;
|
|
22
|
+
}>;
|
|
16
23
|
private dbCall;
|
|
17
24
|
private formatQuery;
|
|
18
|
-
private beginTransaction;
|
|
19
25
|
}
|
|
@@ -27,7 +27,7 @@ class RuntimeMSSQL {
|
|
|
27
27
|
__classPrivateFieldSet(this, _RuntimeMSSQL_middlewareHandler, new shared_1.MiddlewareHandler(), "f");
|
|
28
28
|
}
|
|
29
29
|
async resolve(input) {
|
|
30
|
-
return (0, shared_1.resolve)(input, this.dbCall.bind(this), this.formatQuery.bind(this), this.
|
|
30
|
+
return (0, shared_1.resolve)(input, input.dbCall ?? this.dbCall.bind(this), this.formatQuery.bind(this), this.$startTransaction.bind(this), __classPrivateFieldGet(this, _RuntimeMSSQL_dialect, "f"), __classPrivateFieldGet(this, _RuntimeMSSQL_middlewareHandler, "f"), input.context ?? {});
|
|
31
31
|
}
|
|
32
32
|
async $queryRaw(sql, values) {
|
|
33
33
|
return this.dbCall(this.formatQuery(sql, values ?? []));
|
|
@@ -44,15 +44,15 @@ class RuntimeMSSQL {
|
|
|
44
44
|
async $shutdown() {
|
|
45
45
|
await __classPrivateFieldGet(this, _RuntimeMSSQL_mssqlClient, "f").closePool();
|
|
46
46
|
}
|
|
47
|
+
async $startTransaction(input) {
|
|
48
|
+
return __classPrivateFieldGet(this, _RuntimeMSSQL_mssqlClient, "f").beginTransaction(input?.isolationLevel);
|
|
49
|
+
}
|
|
47
50
|
async dbCall(q) {
|
|
48
51
|
return __classPrivateFieldGet(this, _RuntimeMSSQL_mssqlClient, "f").dbCall(q);
|
|
49
52
|
}
|
|
50
53
|
formatQuery(q, values) {
|
|
51
54
|
return __classPrivateFieldGet(this, _RuntimeMSSQL_mssqlClient, "f").formatQuery(q, values);
|
|
52
55
|
}
|
|
53
|
-
beginTransaction() {
|
|
54
|
-
return __classPrivateFieldGet(this, _RuntimeMSSQL_mssqlClient, "f").beginTransaction();
|
|
55
|
-
}
|
|
56
56
|
}
|
|
57
57
|
exports.RuntimeMSSQL = RuntimeMSSQL;
|
|
58
58
|
_RuntimeMSSQL_dialect = new WeakMap(), _RuntimeMSSQL_mssqlClient = new WeakMap(), _RuntimeMSSQL_middlewareHandler = new WeakMap();
|
|
@@ -14,7 +14,9 @@ export declare class RuntimeMySQL implements IRuntime {
|
|
|
14
14
|
$whereNeedsProcessing(where: any): boolean;
|
|
15
15
|
$prepareWhere(artifacts: IArtifacts, table: string, data: any): Promise<{}>;
|
|
16
16
|
$shutdown(): Promise<void>;
|
|
17
|
+
$startTransaction(input?: {
|
|
18
|
+
isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE";
|
|
19
|
+
}): Promise<any>;
|
|
17
20
|
private dbCall;
|
|
18
21
|
private formatQuery;
|
|
19
|
-
private beginTransaction;
|
|
20
22
|
}
|
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
26
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
27
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
@@ -10,14 +33,17 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
33
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
34
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
35
|
};
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
13
39
|
var _RuntimeMySQL_dialect, _RuntimeMySQL_mysqlClient, _RuntimeMySQL_clientCache, _RuntimeMySQL_middlewareHandler;
|
|
14
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
41
|
exports.RuntimeMySQL = void 0;
|
|
16
|
-
const SqlString = require("sqlstring");
|
|
17
|
-
const Cache_1 = require("./Cache");
|
|
42
|
+
const SqlString = __importStar(require("sqlstring"));
|
|
43
|
+
const Cache_1 = __importDefault(require("./Cache"));
|
|
18
44
|
const MySQL_1 = require("./lib/MySQL");
|
|
19
45
|
const shared_1 = require("./lib/shared");
|
|
20
|
-
const loglevel_1 = require("loglevel");
|
|
46
|
+
const loglevel_1 = __importDefault(require("loglevel"));
|
|
21
47
|
loglevel_1.default.setDefaultLevel("INFO");
|
|
22
48
|
class RuntimeMySQL {
|
|
23
49
|
constructor(clientOpts, otherOpts, artifacts) {
|
|
@@ -70,7 +96,7 @@ class RuntimeMySQL {
|
|
|
70
96
|
__classPrivateFieldSet(this, _RuntimeMySQL_mysqlClient, new MySQL_1.MySQL(clientOpts), "f");
|
|
71
97
|
}
|
|
72
98
|
async resolve(input) {
|
|
73
|
-
return (0, shared_1.resolve)(input, this.dbCall.bind(this), this.formatQuery.bind(this), this.
|
|
99
|
+
return (0, shared_1.resolve)(input, input.dbCall ?? this.dbCall.bind(this), this.formatQuery.bind(this), this.$startTransaction.bind(this), __classPrivateFieldGet(this, _RuntimeMySQL_dialect, "f"), __classPrivateFieldGet(this, _RuntimeMySQL_middlewareHandler, "f"), input.context ?? {}, __classPrivateFieldGet(this, _RuntimeMySQL_clientCache, "f"));
|
|
74
100
|
}
|
|
75
101
|
async $queryRaw(sql, values) {
|
|
76
102
|
return this.dbCall(this.formatQuery(sql, values ?? []));
|
|
@@ -90,15 +116,15 @@ class RuntimeMySQL {
|
|
|
90
116
|
}
|
|
91
117
|
await __classPrivateFieldGet(this, _RuntimeMySQL_mysqlClient, "f").endPool();
|
|
92
118
|
}
|
|
119
|
+
async $startTransaction(input) {
|
|
120
|
+
return __classPrivateFieldGet(this, _RuntimeMySQL_mysqlClient, "f").beginTransaction(input?.isolationLevel);
|
|
121
|
+
}
|
|
93
122
|
dbCall(q) {
|
|
94
123
|
return __classPrivateFieldGet(this, _RuntimeMySQL_mysqlClient, "f").query(q);
|
|
95
124
|
}
|
|
96
125
|
formatQuery(q, values) {
|
|
97
126
|
return SqlString.format(q, values);
|
|
98
127
|
}
|
|
99
|
-
beginTransaction() {
|
|
100
|
-
return __classPrivateFieldGet(this, _RuntimeMySQL_mysqlClient, "f").beginTransaction();
|
|
101
|
-
}
|
|
102
128
|
}
|
|
103
129
|
exports.RuntimeMySQL = RuntimeMySQL;
|
|
104
130
|
_RuntimeMySQL_dialect = new WeakMap(), _RuntimeMySQL_mysqlClient = new WeakMap(), _RuntimeMySQL_clientCache = new WeakMap(), _RuntimeMySQL_middlewareHandler = new WeakMap();
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import type { IRuntime, TMiddleware, TResolveParams, IArtifacts, ISupplementClientOpts } from "./IRuntime";
|
|
3
|
+
import { MiddlewareHandler } from "./lib/shared";
|
|
4
|
+
declare type TClientOpts = {
|
|
5
|
+
filename: string;
|
|
6
|
+
} & Parameters<typeof Database>[1];
|
|
7
|
+
export declare class RuntimeSQLite implements IRuntime {
|
|
8
|
+
#private;
|
|
9
|
+
__middlewareHandler: MiddlewareHandler<TMiddleware>;
|
|
10
|
+
constructor(clientOpts: TClientOpts, otherOpts: {
|
|
11
|
+
createTablesString?: string;
|
|
12
|
+
seedString?: string;
|
|
13
|
+
supplementClientOpts?: ISupplementClientOpts;
|
|
14
|
+
}, artifacts: IArtifacts);
|
|
15
|
+
resolve(input: TResolveParams): Promise<any>;
|
|
16
|
+
$queryRaw(sql: string, values?: any[]): Promise<any[] | {
|
|
17
|
+
insertId: number | bigint;
|
|
18
|
+
}>;
|
|
19
|
+
$use(middleware: TMiddleware): Promise<void>;
|
|
20
|
+
$whereNeedsProcessing(where: any): boolean;
|
|
21
|
+
$prepareWhere(artifacts: IArtifacts, table: string, data: any): Promise<{}>;
|
|
22
|
+
$shutdown(): Promise<void>;
|
|
23
|
+
$startTransaction(input?: {
|
|
24
|
+
isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE";
|
|
25
|
+
}): Promise<{
|
|
26
|
+
commit: () => Promise<void>;
|
|
27
|
+
rollback: () => Promise<void>;
|
|
28
|
+
dbCall: (q: string) => Promise<any[] | {
|
|
29
|
+
insertId: number | bigint;
|
|
30
|
+
}>;
|
|
31
|
+
}>;
|
|
32
|
+
private dbCall;
|
|
33
|
+
private formatQuery;
|
|
34
|
+
private dbCallTransaction;
|
|
35
|
+
private commit;
|
|
36
|
+
private rollback;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
26
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
27
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
28
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
29
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
30
|
+
};
|
|
31
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
32
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
33
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
34
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
35
|
+
};
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
var _RuntimeSQLite_dialect, _RuntimeSQLite_db;
|
|
40
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
+
exports.RuntimeSQLite = void 0;
|
|
42
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
43
|
+
// @ts-expect-error
|
|
44
|
+
const SqliteString = __importStar(require("sqlstring-sqlite"));
|
|
45
|
+
const shared_1 = require("./lib/shared");
|
|
46
|
+
class RuntimeSQLite {
|
|
47
|
+
constructor(clientOpts, otherOpts, artifacts) {
|
|
48
|
+
_RuntimeSQLite_dialect.set(this, "sqlite");
|
|
49
|
+
_RuntimeSQLite_db.set(this, void 0);
|
|
50
|
+
const { filename, ...restOpts } = clientOpts;
|
|
51
|
+
this.__middlewareHandler = new shared_1.MiddlewareHandler();
|
|
52
|
+
__classPrivateFieldSet(this, _RuntimeSQLite_db, new better_sqlite3_1.default(filename, restOpts), "f");
|
|
53
|
+
if (clientOpts.filename === ":memory:") {
|
|
54
|
+
if (!otherOpts.createTablesString) {
|
|
55
|
+
throw new Error(`\`createTablesString\` must be supplied when filename is \`:memory:\`.`);
|
|
56
|
+
}
|
|
57
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").exec(otherOpts.createTablesString);
|
|
58
|
+
if (otherOpts.seedString) {
|
|
59
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").exec(otherOpts.seedString);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async resolve(input) {
|
|
64
|
+
return (0, shared_1.resolve)(input, input.dbCall ?? this.dbCall.bind(this), this.formatQuery.bind(this), this.$startTransaction.bind(this), __classPrivateFieldGet(this, _RuntimeSQLite_dialect, "f"), this.__middlewareHandler, input.context ?? {});
|
|
65
|
+
}
|
|
66
|
+
async $queryRaw(sql, values) {
|
|
67
|
+
return this.dbCall(this.formatQuery(sql, values ?? []));
|
|
68
|
+
}
|
|
69
|
+
async $use(middleware) {
|
|
70
|
+
this.__middlewareHandler.register(middleware);
|
|
71
|
+
}
|
|
72
|
+
$whereNeedsProcessing(where) {
|
|
73
|
+
return (0, shared_1.whereNeedsProcessing)(where);
|
|
74
|
+
}
|
|
75
|
+
async $prepareWhere(artifacts, table, data) {
|
|
76
|
+
return (0, shared_1._prepareWhere)(artifacts, table, data, this.dbCall.bind(this), this.formatQuery.bind(this));
|
|
77
|
+
}
|
|
78
|
+
async $shutdown() {
|
|
79
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").close();
|
|
80
|
+
}
|
|
81
|
+
async $startTransaction(input) {
|
|
82
|
+
const isolationLevel = input?.isolationLevel;
|
|
83
|
+
if (isolationLevel != null) {
|
|
84
|
+
if (isolationLevel !== "READ UNCOMMITTED" &&
|
|
85
|
+
isolationLevel !== "READ COMMITTED" &&
|
|
86
|
+
isolationLevel !== "REPEATABLE READ" &&
|
|
87
|
+
isolationLevel !== "SERIALIZABLE") {
|
|
88
|
+
throw new Error(`Invalid isolationLevel: ${isolationLevel}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("BEGIN TRANSACTION").run();
|
|
92
|
+
return {
|
|
93
|
+
commit: this.commit.bind(this),
|
|
94
|
+
rollback: this.rollback.bind(this),
|
|
95
|
+
dbCall: this.dbCallTransaction.bind(this)
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async dbCall(q) {
|
|
99
|
+
const statement = __classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare(q);
|
|
100
|
+
if (q.startsWith("INSERT") || q.startsWith("UPDATE") || q.startsWith("DELETE")) {
|
|
101
|
+
const result = statement.run();
|
|
102
|
+
return { insertId: result.lastInsertRowid };
|
|
103
|
+
}
|
|
104
|
+
// TODO: use statement.raw instead of typeCastSqlite? That would stop
|
|
105
|
+
// working if we start joining instead of batching, though.
|
|
106
|
+
// https://github.com/WiseLibs/better-sqlite3/blob/master/docs/api.md#rawtogglestate---this
|
|
107
|
+
return statement.all();
|
|
108
|
+
}
|
|
109
|
+
formatQuery(q, values) {
|
|
110
|
+
return SqliteString.format(q, values);
|
|
111
|
+
}
|
|
112
|
+
async dbCallTransaction(...args) {
|
|
113
|
+
try {
|
|
114
|
+
return await this.dbCall(...args);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async commit() {
|
|
122
|
+
try {
|
|
123
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("COMMIT").run();
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
127
|
+
throw err;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async rollback() {
|
|
131
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
exports.RuntimeSQLite = RuntimeSQLite;
|
|
135
|
+
_RuntimeSQLite_dialect = new WeakMap(), _RuntimeSQLite_db = new WeakMap();
|
|
@@ -5,8 +5,9 @@ export declare class MSSQL {
|
|
|
5
5
|
dbCall(q: string): Promise<any>;
|
|
6
6
|
private mapResult;
|
|
7
7
|
formatQuery(q: string, values: any[]): any;
|
|
8
|
-
beginTransaction(): Promise<{
|
|
8
|
+
beginTransaction(isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE"): Promise<{
|
|
9
9
|
commit: () => Promise<void>;
|
|
10
|
+
rollback: () => Promise<void>;
|
|
10
11
|
dbCall: (q: string) => Promise<any>;
|
|
11
12
|
}>;
|
|
12
13
|
closePool(): Promise<void>;
|
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
26
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
27
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
@@ -13,9 +36,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
13
36
|
var _MSSQL_pool, _MSSQL_poolConnect, _MSSQL_typeCast;
|
|
14
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
38
|
exports.MSSQL = void 0;
|
|
16
|
-
const mssql = require("mssql");
|
|
39
|
+
const mssql = __importStar(require("mssql"));
|
|
17
40
|
// @ts-ignore
|
|
18
|
-
const TSqlString = require("tsqlstring");
|
|
41
|
+
const TSqlString = __importStar(require("tsqlstring"));
|
|
19
42
|
class MSSQL {
|
|
20
43
|
constructor(clientOpts, typeCast) {
|
|
21
44
|
_MSSQL_pool.set(this, void 0);
|
|
@@ -42,7 +65,7 @@ class MSSQL {
|
|
|
42
65
|
formatQuery(q, values) {
|
|
43
66
|
return TSqlString.format(q, values);
|
|
44
67
|
}
|
|
45
|
-
async beginTransaction() {
|
|
68
|
+
async beginTransaction(isolationLevel) {
|
|
46
69
|
const transaction = new mssql.Transaction(__classPrivateFieldGet(this, _MSSQL_pool, "f"));
|
|
47
70
|
let rolledBack = false;
|
|
48
71
|
transaction.on("rollback", (aborted) => {
|
|
@@ -56,13 +79,18 @@ class MSSQL {
|
|
|
56
79
|
throw err;
|
|
57
80
|
}
|
|
58
81
|
const mapResult = this.mapResult.bind(this);
|
|
59
|
-
|
|
82
|
+
let isolationLevelNumber;
|
|
83
|
+
if (isolationLevel) {
|
|
84
|
+
isolationLevelNumber = mssql.ISOLATION_LEVEL[isolationLevel.replace(" ", "_")];
|
|
85
|
+
if (isolationLevelNumber == null) {
|
|
86
|
+
throw new Error(`Invalid isolationLevel: ${isolationLevel}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
await transaction.begin(isolationLevelNumber);
|
|
60
90
|
return {
|
|
61
91
|
commit: () => transaction.commit().catch(handleError),
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
.then(mapResult)
|
|
65
|
-
.catch(handleError),
|
|
92
|
+
rollback: () => transaction.rollback(),
|
|
93
|
+
dbCall: (q) => new mssql.Request(transaction).query(q).then(mapResult).catch(handleError)
|
|
66
94
|
};
|
|
67
95
|
}
|
|
68
96
|
async closePool() {
|
|
@@ -2,7 +2,7 @@ export declare class MySQL {
|
|
|
2
2
|
pool: any;
|
|
3
3
|
constructor(opts: any);
|
|
4
4
|
query(...args: any[]): any;
|
|
5
|
-
beginTransaction(): Promise<any>;
|
|
5
|
+
beginTransaction(isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE"): Promise<any>;
|
|
6
6
|
getConnection(): Promise<any>;
|
|
7
7
|
endPool(): Promise<void>;
|
|
8
8
|
}
|
|
@@ -13,16 +13,29 @@ class MySQL {
|
|
|
13
13
|
query(...args) {
|
|
14
14
|
return P.using(this.getConnection(), (connection) => connection.queryAsync(...args));
|
|
15
15
|
}
|
|
16
|
-
async beginTransaction() {
|
|
16
|
+
async beginTransaction(isolationLevel) {
|
|
17
17
|
return P.using(this.getConnection(), async (connection) => {
|
|
18
18
|
async function handleError(err) {
|
|
19
19
|
await connection.rollbackAsync();
|
|
20
20
|
throw err;
|
|
21
21
|
}
|
|
22
|
+
// https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html#set-transaction-isolation-level
|
|
23
|
+
// Without any SESSION or GLOBAL keyword:
|
|
24
|
+
// The statement applies only to the next single transaction performed within the session.
|
|
25
|
+
if (isolationLevel != null) {
|
|
26
|
+
if (isolationLevel !== "READ UNCOMMITTED" &&
|
|
27
|
+
isolationLevel !== "READ COMMITTED" &&
|
|
28
|
+
isolationLevel !== "REPEATABLE READ" &&
|
|
29
|
+
isolationLevel !== "SERIALIZABLE") {
|
|
30
|
+
throw new Error(`Invalid isolationLevel: ${isolationLevel}`);
|
|
31
|
+
}
|
|
32
|
+
await connection.queryAsync(`SET TRANSACTION ISOLATION LEVEL ${isolationLevel};`);
|
|
33
|
+
}
|
|
22
34
|
await connection.beginTransactionAsync();
|
|
23
35
|
return {
|
|
24
36
|
commit: () => connection.commitAsync().catch(handleError),
|
|
25
|
-
|
|
37
|
+
rollback: () => connection.rollbackAsync(),
|
|
38
|
+
dbCall: (q) => connection.queryAsync(q).catch(handleError)
|
|
26
39
|
};
|
|
27
40
|
});
|
|
28
41
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|