@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.
Files changed (66) hide show
  1. package/dist/src/generation/generate.d.ts +21 -0
  2. package/dist/src/generation/generate.js +2349 -0
  3. package/dist/src/index.d.ts +4 -0
  4. package/dist/src/index.js +11 -0
  5. package/dist/src/lib/CustomError.d.ts +3 -0
  6. package/dist/src/lib/CustomError.js +10 -0
  7. package/dist/src/lib/capitalizeFirstLetter.d.ts +1 -0
  8. package/dist/src/lib/capitalizeFirstLetter.js +6 -0
  9. package/dist/src/lib/getDuplicates.d.ts +1 -0
  10. package/dist/src/lib/getDuplicates.js +9 -0
  11. package/dist/src/lib/isNotNullOrUndefined.d.ts +1 -0
  12. package/dist/src/lib/isNotNullOrUndefined.js +7 -0
  13. package/dist/src/runtime/Cache.d.ts +28 -0
  14. package/dist/src/runtime/Cache.js +142 -0
  15. package/dist/src/runtime/IRuntime.d.ts +209 -0
  16. package/dist/src/runtime/IRuntime.js +12 -0
  17. package/dist/src/runtime/RuntimeMySQL.d.ts +26 -0
  18. package/dist/src/runtime/RuntimeMySQL.js +132 -0
  19. package/dist/src/runtime/RuntimePostgreSQL.d.ts +30 -0
  20. package/dist/src/runtime/RuntimePostgreSQL.js +73 -0
  21. package/dist/src/runtime/RuntimeSQLite.d.ts +42 -0
  22. package/dist/src/runtime/RuntimeSQLite.js +150 -0
  23. package/dist/src/runtime/Stats.d.ts +8 -0
  24. package/dist/src/runtime/Stats.js +31 -0
  25. package/dist/src/runtime/lib/MySQL.d.ts +13 -0
  26. package/dist/src/runtime/lib/MySQL.js +116 -0
  27. package/dist/src/runtime/lib/PostgreSQL.d.ts +14 -0
  28. package/dist/src/runtime/lib/PostgreSQL.js +110 -0
  29. package/dist/src/runtime/lib/SDKBadWhereError.d.ts +4 -0
  30. package/dist/src/runtime/lib/SDKBadWhereError.js +10 -0
  31. package/dist/src/runtime/lib/SDKNotFoundError.d.ts +4 -0
  32. package/dist/src/runtime/lib/SDKNotFoundError.js +10 -0
  33. package/dist/src/runtime/lib/addNullFallbacks.d.ts +1 -0
  34. package/dist/src/runtime/lib/addNullFallbacks.js +32 -0
  35. package/dist/src/runtime/lib/addNullFallbacks.test.d.ts +1 -0
  36. package/dist/src/runtime/lib/addNullFallbacks.test.js +206 -0
  37. package/dist/src/runtime/lib/cursor.d.ts +2 -0
  38. package/dist/src/runtime/lib/cursor.js +10 -0
  39. package/dist/src/runtime/lib/getDateTimeStringMySQL.d.ts +1 -0
  40. package/dist/src/runtime/lib/getDateTimeStringMySQL.js +7 -0
  41. package/dist/src/runtime/lib/getOrderBy.d.ts +5 -0
  42. package/dist/src/runtime/lib/getOrderBy.js +52 -0
  43. package/dist/src/runtime/lib/getSqlAst.d.ts +2 -0
  44. package/dist/src/runtime/lib/getSqlAst.js +245 -0
  45. package/dist/src/runtime/lib/getWhere.d.ts +2 -0
  46. package/dist/src/runtime/lib/getWhere.js +20 -0
  47. package/dist/src/runtime/lib/shared.d.ts +13 -0
  48. package/dist/src/runtime/lib/shared.js +1118 -0
  49. package/dist/src/runtime/lib/stringifyWhere.d.ts +18 -0
  50. package/dist/src/runtime/lib/stringifyWhere.js +257 -0
  51. package/dist/src/runtime/lib/stringifyWhere.test.d.ts +1 -0
  52. package/dist/src/runtime/lib/stringifyWhere.test.js +245 -0
  53. package/dist/src/runtime/lib/utility.d.ts +5 -0
  54. package/dist/src/runtime/lib/utility.js +14 -0
  55. package/dist/src/traverseFieldArgs.d.ts +2 -0
  56. package/dist/src/traverseFieldArgs.js +17 -0
  57. package/dist/src/traverseFieldArgs.test.d.ts +1 -0
  58. package/dist/src/traverseFieldArgs.test.js +56 -0
  59. package/dist/test/addWhereValidTrue.d.ts +1 -0
  60. package/dist/test/addWhereValidTrue.js +39 -0
  61. package/dist/test/globalSetup.d.ts +13 -0
  62. package/dist/test/globalSetup.js +436 -0
  63. package/dist/test/postgres/__generated__/sdk-ts/artifacts.d.ts +8425 -0
  64. package/dist/test/postgres/__generated__/sdk-ts/artifacts.js +10469 -0
  65. package/dist/test/postgres/__generated__/sdk-ts/index.js +12162 -0
  66. 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,4 @@
1
+ import { CustomError } from "../../lib/CustomError";
2
+ export declare class SDKBadWhereError extends CustomError {
3
+ constructor(message?: string);
4
+ }
@@ -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,4 @@
1
+ import { CustomError } from "../../lib/CustomError";
2
+ export declare class SDKNotFoundError extends CustomError {
3
+ constructor();
4
+ }
@@ -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 {};