@technicity/data-service-generator 0.22.2 → 0.23.0-next.0
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/src/generation/generate.d.ts +21 -0
- package/dist/src/generation/generate.js +2349 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +11 -0
- package/dist/src/lib/CustomError.d.ts +3 -0
- package/dist/src/lib/CustomError.js +10 -0
- package/dist/src/lib/capitalizeFirstLetter.d.ts +1 -0
- package/dist/src/lib/capitalizeFirstLetter.js +6 -0
- package/dist/src/lib/getDuplicates.d.ts +1 -0
- package/dist/src/lib/getDuplicates.js +9 -0
- package/dist/src/lib/isNotNullOrUndefined.d.ts +1 -0
- package/dist/src/lib/isNotNullOrUndefined.js +7 -0
- package/dist/src/runtime/Cache.d.ts +28 -0
- package/dist/src/runtime/Cache.js +142 -0
- package/dist/src/runtime/IRuntime.d.ts +209 -0
- package/dist/src/runtime/IRuntime.js +12 -0
- package/dist/src/runtime/RuntimeMySQL.d.ts +26 -0
- package/dist/src/runtime/RuntimeMySQL.js +132 -0
- package/dist/src/runtime/RuntimePostgreSQL.d.ts +30 -0
- package/dist/src/runtime/RuntimePostgreSQL.js +73 -0
- package/dist/src/runtime/RuntimeSQLite.d.ts +42 -0
- package/dist/src/runtime/RuntimeSQLite.js +150 -0
- package/dist/src/runtime/Stats.d.ts +8 -0
- package/dist/src/runtime/Stats.js +31 -0
- package/dist/src/runtime/lib/MySQL.d.ts +13 -0
- package/dist/src/runtime/lib/MySQL.js +116 -0
- package/dist/src/runtime/lib/PostgreSQL.d.ts +14 -0
- package/dist/src/runtime/lib/PostgreSQL.js +110 -0
- package/dist/src/runtime/lib/SDKBadWhereError.d.ts +4 -0
- package/dist/src/runtime/lib/SDKBadWhereError.js +10 -0
- package/dist/src/runtime/lib/SDKNotFoundError.d.ts +4 -0
- package/dist/src/runtime/lib/SDKNotFoundError.js +10 -0
- package/dist/src/runtime/lib/addNullFallbacks.d.ts +1 -0
- package/dist/src/runtime/lib/addNullFallbacks.js +32 -0
- package/dist/src/runtime/lib/addNullFallbacks.test.d.ts +1 -0
- package/dist/src/runtime/lib/addNullFallbacks.test.js +206 -0
- package/dist/src/runtime/lib/cursor.d.ts +2 -0
- package/dist/src/runtime/lib/cursor.js +10 -0
- package/dist/src/runtime/lib/getDateTimeStringMySQL.d.ts +1 -0
- package/dist/src/runtime/lib/getDateTimeStringMySQL.js +7 -0
- package/dist/src/runtime/lib/getOrderBy.d.ts +5 -0
- package/dist/src/runtime/lib/getOrderBy.js +52 -0
- package/dist/src/runtime/lib/getSqlAst.d.ts +2 -0
- package/dist/src/runtime/lib/getSqlAst.js +245 -0
- package/dist/src/runtime/lib/getWhere.d.ts +2 -0
- package/dist/src/runtime/lib/getWhere.js +20 -0
- package/dist/src/runtime/lib/shared.d.ts +13 -0
- package/dist/src/runtime/lib/shared.js +1118 -0
- package/dist/src/runtime/lib/stringifyWhere.d.ts +18 -0
- package/dist/src/runtime/lib/stringifyWhere.js +257 -0
- package/dist/src/runtime/lib/stringifyWhere.test.d.ts +1 -0
- package/dist/src/runtime/lib/stringifyWhere.test.js +245 -0
- package/dist/src/runtime/lib/utility.d.ts +5 -0
- package/dist/src/runtime/lib/utility.js +14 -0
- package/dist/src/traverseFieldArgs.d.ts +2 -0
- package/dist/src/traverseFieldArgs.js +17 -0
- package/dist/src/traverseFieldArgs.test.d.ts +1 -0
- package/dist/src/traverseFieldArgs.test.js +56 -0
- package/dist/test/addWhereValidTrue.d.ts +1 -0
- package/dist/test/addWhereValidTrue.js +39 -0
- package/dist/test/globalSetup.d.ts +13 -0
- package/dist/test/globalSetup.js +436 -0
- package/dist/test/postgres/__generated__/sdk-ts/artifacts.d.ts +8425 -0
- package/dist/test/postgres/__generated__/sdk-ts/artifacts.js +10469 -0
- package/dist/test/postgres/__generated__/sdk-ts/index.js +12162 -0
- package/package.json +5 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
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");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
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
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
var _RuntimePostgreSQL_dialect, _RuntimePostgreSQL_pgClient, _RuntimePostgreSQL_clientCache, _RuntimePostgreSQL_middlewareHandler;
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.RuntimePostgreSQL = void 0;
|
|
19
|
+
const pg_format_1 = __importDefault(require("pg-format"));
|
|
20
|
+
const Cache_1 = __importDefault(require("./Cache"));
|
|
21
|
+
const PostgreSQL_1 = require("./lib/PostgreSQL");
|
|
22
|
+
const shared_1 = require("./lib/shared");
|
|
23
|
+
class RuntimePostgreSQL {
|
|
24
|
+
constructor(clientOpts, otherOpts, artifacts) {
|
|
25
|
+
_RuntimePostgreSQL_dialect.set(this, "postgresql");
|
|
26
|
+
_RuntimePostgreSQL_pgClient.set(this, void 0);
|
|
27
|
+
_RuntimePostgreSQL_clientCache.set(this, void 0);
|
|
28
|
+
_RuntimePostgreSQL_middlewareHandler.set(this, void 0);
|
|
29
|
+
__classPrivateFieldSet(this, _RuntimePostgreSQL_middlewareHandler, new shared_1.MiddlewareHandler(), "f");
|
|
30
|
+
if (otherOpts.redis) {
|
|
31
|
+
__classPrivateFieldSet(this, _RuntimePostgreSQL_clientCache, new Cache_1.default(otherOpts.redis, clientOpts?.debug), "f");
|
|
32
|
+
}
|
|
33
|
+
__classPrivateFieldSet(this, _RuntimePostgreSQL_pgClient, new PostgreSQL_1.PostgreSQL(clientOpts), "f");
|
|
34
|
+
}
|
|
35
|
+
async resolve(input) {
|
|
36
|
+
return (0, shared_1.resolve)(input, input.dbCall ?? this.dbCall.bind(this), this.formatQuery.bind(this), this.$startTransaction.bind(this), __classPrivateFieldGet(this, _RuntimePostgreSQL_dialect, "f"), __classPrivateFieldGet(this, _RuntimePostgreSQL_middlewareHandler, "f"), input.context ?? {}, __classPrivateFieldGet(this, _RuntimePostgreSQL_clientCache, "f"));
|
|
37
|
+
}
|
|
38
|
+
async $queryRaw(sql, values) {
|
|
39
|
+
return this.dbCall(this.formatQuery(sql, values ?? []));
|
|
40
|
+
}
|
|
41
|
+
async $use(middleware) {
|
|
42
|
+
__classPrivateFieldGet(this, _RuntimePostgreSQL_middlewareHandler, "f").register(middleware);
|
|
43
|
+
}
|
|
44
|
+
$whereNeedsProcessing(where) {
|
|
45
|
+
return (0, shared_1.whereNeedsProcessing)(where);
|
|
46
|
+
}
|
|
47
|
+
async $prepareWhere(artifacts, table, data) {
|
|
48
|
+
return (0, shared_1._prepareWhere)(artifacts, table, data, this.dbCall.bind(this), this.formatQuery.bind(this));
|
|
49
|
+
}
|
|
50
|
+
async $shutdown() {
|
|
51
|
+
if (__classPrivateFieldGet(this, _RuntimePostgreSQL_clientCache, "f")) {
|
|
52
|
+
await __classPrivateFieldGet(this, _RuntimePostgreSQL_clientCache, "f").shutdown();
|
|
53
|
+
}
|
|
54
|
+
await __classPrivateFieldGet(this, _RuntimePostgreSQL_pgClient, "f").endPool();
|
|
55
|
+
}
|
|
56
|
+
async $startTransaction(input) {
|
|
57
|
+
return __classPrivateFieldGet(this, _RuntimePostgreSQL_pgClient, "f").beginTransaction(input?.isolationLevel);
|
|
58
|
+
}
|
|
59
|
+
dbCall(q) {
|
|
60
|
+
return __classPrivateFieldGet(this, _RuntimePostgreSQL_pgClient, "f").query(
|
|
61
|
+
// join-monster doesn't use formatQuery, so this is needed
|
|
62
|
+
q.replace(/`/g, '"'));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Converts MySQL-style ?? (identifier) and ? (value) placeholders to
|
|
66
|
+
* pg-format placeholders (%I and %L) and formats the query.
|
|
67
|
+
*/
|
|
68
|
+
formatQuery(q, values) {
|
|
69
|
+
return pg_format_1.default.withArray(q.replace(/`/g, '"').replace(/\?\?/g, "%I").replace(/\?/g, "%L"), values);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.RuntimePostgreSQL = RuntimePostgreSQL;
|
|
73
|
+
_RuntimePostgreSQL_dialect = new WeakMap(), _RuntimePostgreSQL_pgClient = new WeakMap(), _RuntimePostgreSQL_clientCache = new WeakMap(), _RuntimePostgreSQL_middlewareHandler = new WeakMap();
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import type { IRuntime, TMiddleware, TResolveParams, IArtifacts, ISupplementClientOpts } from "./IRuntime";
|
|
3
|
+
import { MiddlewareHandler } from "./lib/shared";
|
|
4
|
+
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<unknown[] | {
|
|
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<unknown[] | {
|
|
29
|
+
insertId: number | bigint;
|
|
30
|
+
}>;
|
|
31
|
+
queryRaw: (sql: string, values?: any[] | undefined) => Promise<unknown[] | {
|
|
32
|
+
insertId: number | bigint;
|
|
33
|
+
}>;
|
|
34
|
+
}>;
|
|
35
|
+
private dbCall;
|
|
36
|
+
private formatQuery;
|
|
37
|
+
private dbCallTransaction;
|
|
38
|
+
private queryRawTransaction;
|
|
39
|
+
private commit;
|
|
40
|
+
private rollback;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
@@ -0,0 +1,150 @@
|
|
|
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
|
+
queryRaw: this.queryRawTransaction.bind(this)
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async dbCall(q) {
|
|
100
|
+
const statement = __classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare(q);
|
|
101
|
+
if (q.startsWith("INSERT") || q.startsWith("UPDATE") || q.startsWith("DELETE")) {
|
|
102
|
+
const result = statement.run();
|
|
103
|
+
return { insertId: result.lastInsertRowid };
|
|
104
|
+
}
|
|
105
|
+
// TODO: use statement.raw instead of typeCastSqlite? That would stop
|
|
106
|
+
// working if we start joining instead of batching, though.
|
|
107
|
+
// https://github.com/WiseLibs/better-sqlite3/blob/master/docs/api.md#rawtogglestate---this
|
|
108
|
+
return statement.all();
|
|
109
|
+
}
|
|
110
|
+
formatQuery(q, values) {
|
|
111
|
+
return SqliteString.format(q, values);
|
|
112
|
+
}
|
|
113
|
+
async dbCallTransaction(...args) {
|
|
114
|
+
try {
|
|
115
|
+
return await this.dbCall(...args);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async queryRawTransaction(...args) {
|
|
123
|
+
try {
|
|
124
|
+
return await this.$queryRaw(...args);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
128
|
+
throw err;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async commit() {
|
|
132
|
+
try {
|
|
133
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("COMMIT").run();
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
137
|
+
throw err;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async rollback() {
|
|
141
|
+
try {
|
|
142
|
+
__classPrivateFieldGet(this, _RuntimeSQLite_db, "f").prepare("ROLLBACK").run();
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
console.log(e);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
exports.RuntimeSQLite = RuntimeSQLite;
|
|
150
|
+
_RuntimeSQLite_dialect = new WeakMap(), _RuntimeSQLite_db = new WeakMap();
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import Redis, { Cluster } from "ioredis";
|
|
2
|
+
declare class Stats {
|
|
3
|
+
client: Redis | Cluster;
|
|
4
|
+
constructor(client: Redis | Cluster);
|
|
5
|
+
updateStats: (ms: number, category: string) => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export declare function timer(): <T extends timer.Callback>(callback: T, ...args: timer.Params<T>) => void;
|
|
8
|
+
export default Stats;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.timer = timer;
|
|
4
|
+
const perf_hooks_1 = require("perf_hooks");
|
|
5
|
+
class Stats {
|
|
6
|
+
constructor(client) {
|
|
7
|
+
this.client = client;
|
|
8
|
+
this.updateStats = async (ms, category) => {
|
|
9
|
+
const redis = this.client;
|
|
10
|
+
const requests = Number(await redis.get(`stats:${category}_requests`)) || 0;
|
|
11
|
+
const average = Number(await redis.get(`stats:${category}_avg`)) || 0;
|
|
12
|
+
const max = Number(await redis.get(`stats:${category}_max`)) || 0;
|
|
13
|
+
const min = Number(await redis.get(`stats:${category}_min`)) || Infinity;
|
|
14
|
+
const newTotalRequests = requests + 1;
|
|
15
|
+
const newAverage = (average * requests + ms) / newTotalRequests;
|
|
16
|
+
await redis.set(`stats:${category}_requests`, newTotalRequests);
|
|
17
|
+
await redis.set(`stats:${category}_avg`, newAverage);
|
|
18
|
+
if (ms > max)
|
|
19
|
+
await redis.set(`stats:${category}_max`, ms);
|
|
20
|
+
if (ms < min)
|
|
21
|
+
await redis.set(`stats:${category}_min`, ms);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function timer() {
|
|
26
|
+
const start = perf_hooks_1.performance.now();
|
|
27
|
+
return (callback, ...args) => {
|
|
28
|
+
callback(perf_hooks_1.performance.now() - start, ...args);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
exports.default = Stats;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as mysql from "mysql2/promise";
|
|
2
|
+
export declare class MySQL {
|
|
3
|
+
pool: mysql.Pool;
|
|
4
|
+
constructor(opts: Parameters<typeof mysql.createPool>[0]);
|
|
5
|
+
query(...args: any[]): Promise<mysql.OkPacket | mysql.ResultSetHeader | mysql.ResultSetHeader[] | mysql.RowDataPacket[] | mysql.RowDataPacket[][] | mysql.OkPacket[] | [mysql.RowDataPacket[], mysql.ResultSetHeader]>;
|
|
6
|
+
beginTransaction(isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE"): Promise<{
|
|
7
|
+
commit: () => Promise<void>;
|
|
8
|
+
rollback: () => Promise<void>;
|
|
9
|
+
dbCall: (q: string) => Promise<mysql.OkPacket | mysql.ResultSetHeader | mysql.ResultSetHeader[] | mysql.RowDataPacket[] | mysql.RowDataPacket[][] | mysql.OkPacket[] | [mysql.RowDataPacket[], mysql.ResultSetHeader]>;
|
|
10
|
+
queryRaw: (q: string, values: any[]) => Promise<mysql.OkPacket | mysql.ResultSetHeader | mysql.ResultSetHeader[] | mysql.RowDataPacket[] | mysql.RowDataPacket[][] | mysql.OkPacket[] | [mysql.RowDataPacket[], mysql.ResultSetHeader]>;
|
|
11
|
+
}>;
|
|
12
|
+
endPool(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.MySQL = void 0;
|
|
27
|
+
const mysql = __importStar(require("mysql2/promise"));
|
|
28
|
+
class MySQL {
|
|
29
|
+
constructor(opts) {
|
|
30
|
+
this.pool = mysql.createPool({
|
|
31
|
+
...opts,
|
|
32
|
+
// For backward compat with the previous mysql implementation https://github.com/mysqljs/mysql
|
|
33
|
+
// https://sidorares.github.io/node-mysql2/docs/documentation#known-incompatibilities-with-node-mysql
|
|
34
|
+
jsonStrings: true
|
|
35
|
+
});
|
|
36
|
+
if (opts.debug) {
|
|
37
|
+
this.pool.on("acquire", (connection) => {
|
|
38
|
+
console.log("Connection %d acquired", connection.threadId);
|
|
39
|
+
});
|
|
40
|
+
this.pool.on("connection", (connection) => {
|
|
41
|
+
console.log("Connection %d connected", connection.threadId);
|
|
42
|
+
});
|
|
43
|
+
this.pool.on("enqueue", () => {
|
|
44
|
+
console.log("Waiting for available connection slot");
|
|
45
|
+
});
|
|
46
|
+
this.pool.on("release", (connection) => {
|
|
47
|
+
console.log("Connection %d released", connection.threadId);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
query(...args) {
|
|
52
|
+
return this.pool
|
|
53
|
+
.query(
|
|
54
|
+
// @ts-expect-error
|
|
55
|
+
...args)
|
|
56
|
+
.then(([rows]) => rows);
|
|
57
|
+
}
|
|
58
|
+
async beginTransaction(isolationLevel) {
|
|
59
|
+
const connection = await this.pool.getConnection();
|
|
60
|
+
// https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html#set-transaction-isolation-level
|
|
61
|
+
// Without any SESSION or GLOBAL keyword:
|
|
62
|
+
// The statement applies only to the next single transaction performed within the session.
|
|
63
|
+
if (isolationLevel != null) {
|
|
64
|
+
if (isolationLevel !== "READ UNCOMMITTED" &&
|
|
65
|
+
isolationLevel !== "READ COMMITTED" &&
|
|
66
|
+
isolationLevel !== "REPEATABLE READ" &&
|
|
67
|
+
isolationLevel !== "SERIALIZABLE") {
|
|
68
|
+
throw new Error(`Invalid isolationLevel: ${isolationLevel}`);
|
|
69
|
+
}
|
|
70
|
+
await connection.query(`SET TRANSACTION ISOLATION LEVEL ${isolationLevel};`);
|
|
71
|
+
}
|
|
72
|
+
await connection.beginTransaction();
|
|
73
|
+
return {
|
|
74
|
+
commit: () => connection
|
|
75
|
+
.commit()
|
|
76
|
+
.catch(async (err) => {
|
|
77
|
+
await connection.rollback();
|
|
78
|
+
throw err;
|
|
79
|
+
})
|
|
80
|
+
.finally(() => {
|
|
81
|
+
connection.release();
|
|
82
|
+
}),
|
|
83
|
+
rollback: () => connection.rollback().finally(() => {
|
|
84
|
+
connection.release();
|
|
85
|
+
}),
|
|
86
|
+
dbCall: (q) => connection
|
|
87
|
+
.query(q)
|
|
88
|
+
.then(([rows]) => rows)
|
|
89
|
+
.catch(async (err) => {
|
|
90
|
+
try {
|
|
91
|
+
await connection.rollback();
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
connection.release();
|
|
95
|
+
}
|
|
96
|
+
throw err;
|
|
97
|
+
}),
|
|
98
|
+
queryRaw: (q, values) => connection
|
|
99
|
+
.query(q, values)
|
|
100
|
+
.then(([rows]) => rows)
|
|
101
|
+
.catch(async (err) => {
|
|
102
|
+
try {
|
|
103
|
+
await connection.rollback();
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
connection.release();
|
|
107
|
+
}
|
|
108
|
+
throw err;
|
|
109
|
+
})
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async endPool() {
|
|
113
|
+
await this.pool.end();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
exports.MySQL = MySQL;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Pool } from "pg";
|
|
2
|
+
export type TPoolConfig = ConstructorParameters<typeof Pool>[0];
|
|
3
|
+
export declare class PostgreSQL {
|
|
4
|
+
pool: Pool;
|
|
5
|
+
constructor(opts: TPoolConfig);
|
|
6
|
+
query(q: string): Promise<any[]>;
|
|
7
|
+
beginTransaction(isolationLevel?: "READ UNCOMMITTED" | "READ COMMITTED" | "REPEATABLE READ" | "SERIALIZABLE"): Promise<{
|
|
8
|
+
commit: () => Promise<void>;
|
|
9
|
+
rollback: () => Promise<void>;
|
|
10
|
+
dbCall: (q: string) => Promise<any[]>;
|
|
11
|
+
queryRaw: (q: string, values: any[]) => Promise<any[]>;
|
|
12
|
+
}>;
|
|
13
|
+
endPool(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PostgreSQL = void 0;
|
|
4
|
+
const pg_1 = require("pg");
|
|
5
|
+
// OID 20 = int8 (BIGINT/BIGSERIAL). Parse as number for consistency with MySQL.
|
|
6
|
+
const BIGINT_OID = 20;
|
|
7
|
+
pg_1.types.setTypeParser(BIGINT_OID, (val) => val === null ? null : parseInt(val, 10));
|
|
8
|
+
// OID 114 = json, 3802 = jsonb. Return raw string for consistency with MySQL.
|
|
9
|
+
pg_1.types.setTypeParser(114, (val) => val);
|
|
10
|
+
pg_1.types.setTypeParser(3802, (val) => val);
|
|
11
|
+
class PostgreSQL {
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
this.pool = new pg_1.Pool(opts);
|
|
14
|
+
if (opts && opts.debug) {
|
|
15
|
+
this.pool.on("acquire", () => {
|
|
16
|
+
console.log("Connection acquired from pool");
|
|
17
|
+
});
|
|
18
|
+
this.pool.on("connect", () => {
|
|
19
|
+
console.log("Client connected to PostgreSQL");
|
|
20
|
+
});
|
|
21
|
+
this.pool.on("remove", () => {
|
|
22
|
+
console.log("Client removed from pool");
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
query(q) {
|
|
27
|
+
return this.pool.query(q).then((result) => result.rows);
|
|
28
|
+
}
|
|
29
|
+
async beginTransaction(isolationLevel) {
|
|
30
|
+
const client = await this.pool.connect();
|
|
31
|
+
let released = false;
|
|
32
|
+
const releaseOnce = () => {
|
|
33
|
+
if (!released) {
|
|
34
|
+
released = true;
|
|
35
|
+
client.release();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (isolationLevel != null) {
|
|
39
|
+
if (isolationLevel !== "READ UNCOMMITTED" &&
|
|
40
|
+
isolationLevel !== "READ COMMITTED" &&
|
|
41
|
+
isolationLevel !== "REPEATABLE READ" &&
|
|
42
|
+
isolationLevel !== "SERIALIZABLE") {
|
|
43
|
+
releaseOnce();
|
|
44
|
+
throw new Error(`Invalid isolationLevel: ${isolationLevel}`);
|
|
45
|
+
}
|
|
46
|
+
// PostgreSQL: BEGIN ISOLATION LEVEL <level>
|
|
47
|
+
await client.query(`BEGIN ISOLATION LEVEL ${isolationLevel}`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
await client.query("BEGIN");
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
commit: () => {
|
|
54
|
+
if (released)
|
|
55
|
+
return Promise.resolve();
|
|
56
|
+
return client
|
|
57
|
+
.query("COMMIT")
|
|
58
|
+
.then(() => undefined)
|
|
59
|
+
.catch(async (err) => {
|
|
60
|
+
try {
|
|
61
|
+
await client.query("ROLLBACK");
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Ignore
|
|
65
|
+
}
|
|
66
|
+
throw err;
|
|
67
|
+
})
|
|
68
|
+
.finally(releaseOnce);
|
|
69
|
+
},
|
|
70
|
+
rollback: () => {
|
|
71
|
+
if (released)
|
|
72
|
+
return Promise.resolve();
|
|
73
|
+
return client
|
|
74
|
+
.query("ROLLBACK")
|
|
75
|
+
.then(() => undefined)
|
|
76
|
+
.finally(releaseOnce);
|
|
77
|
+
},
|
|
78
|
+
dbCall: (q) => client
|
|
79
|
+
.query(q)
|
|
80
|
+
.then((result) => result.rows)
|
|
81
|
+
.catch(async (err) => {
|
|
82
|
+
try {
|
|
83
|
+
await client.query("ROLLBACK");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Ignore
|
|
87
|
+
}
|
|
88
|
+
releaseOnce();
|
|
89
|
+
throw err;
|
|
90
|
+
}),
|
|
91
|
+
queryRaw: (q, values) => client
|
|
92
|
+
.query(q, values)
|
|
93
|
+
.then((result) => result.rows)
|
|
94
|
+
.catch(async (err) => {
|
|
95
|
+
try {
|
|
96
|
+
await client.query("ROLLBACK");
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Ignore
|
|
100
|
+
}
|
|
101
|
+
releaseOnce();
|
|
102
|
+
throw err;
|
|
103
|
+
})
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async endPool() {
|
|
107
|
+
await this.pool.end();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.PostgreSQL = PostgreSQL;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SDKBadWhereError = void 0;
|
|
4
|
+
const CustomError_1 = require("../../lib/CustomError");
|
|
5
|
+
class SDKBadWhereError extends CustomError_1.CustomError {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message || "Invalid $where");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.SDKBadWhereError = SDKBadWhereError;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SDKNotFoundError = void 0;
|
|
4
|
+
const CustomError_1 = require("../../lib/CustomError");
|
|
5
|
+
class SDKNotFoundError extends CustomError_1.CustomError {
|
|
6
|
+
constructor() {
|
|
7
|
+
super("Not found");
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.SDKNotFoundError = SDKNotFoundError;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function addNullFallbacks(sqlAST: any, data: any): void;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// If a many-to-one relation's ID field is null, we want the
|
|
3
|
+
// relation field to be null as well, not undefined.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.addNullFallbacks = addNullFallbacks;
|
|
6
|
+
function addNullFallbacks(sqlAST, data) {
|
|
7
|
+
if (data == null) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
for (let child of sqlAST.children ?? []) {
|
|
11
|
+
if (child.type === "table") {
|
|
12
|
+
if (Array.isArray(data)) {
|
|
13
|
+
for (let d of data) {
|
|
14
|
+
if (d[child.fieldName] == null) {
|
|
15
|
+
d[child.fieldName] = null;
|
|
16
|
+
}
|
|
17
|
+
if (child.children.length > 0 && d[child.fieldName] != null) {
|
|
18
|
+
addNullFallbacks(child, d[child.fieldName]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
if (data[child.fieldName] == null) {
|
|
24
|
+
data[child.fieldName] = null;
|
|
25
|
+
}
|
|
26
|
+
if (child.children.length > 0 && data[child.fieldName] != null) {
|
|
27
|
+
addNullFallbacks(child, data[child.fieldName]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|