@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,436 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.default = globalSetup;
30
+ const node_path_1 = __importDefault(require("node:path"));
31
+ const promises_1 = __importDefault(require("node:fs/promises"));
32
+ const node_crypto_1 = __importDefault(require("node:crypto"));
33
+ const testcontainers_1 = require("testcontainers");
34
+ const mysql_1 = require("@testcontainers/mysql");
35
+ const postgresql_1 = require("@testcontainers/postgresql");
36
+ const src_1 = require("../src");
37
+ const RuntimeMySQL_1 = require("../src/runtime/RuntimeMySQL");
38
+ const RuntimePostgreSQL_1 = require("../src/runtime/RuntimePostgreSQL");
39
+ const RuntimeSQLite_1 = require("../src/runtime/RuntimeSQLite");
40
+ const MySQL_1 = require("../src/runtime/lib/MySQL");
41
+ const PostgreSQL_1 = require("../src/runtime/lib/PostgreSQL");
42
+ const isNotNullOrUndefined_1 = require("../src/lib/isNotNullOrUndefined");
43
+ // Use globalSetup because of https://github.com/facebook/jest/issues/9709
44
+ // https://github.com/facebook/jest/issues/7184
45
+ // The globalThis hack only seems to work if there's 1 test file :/
46
+ // When there's multiple, the stuff I put on globalThis is undefined in test.ts.
47
+ async function globalSetup() {
48
+ let testItems = await Promise.all([
49
+ setUpMySQL57(false),
50
+ setUpMySQL80(false),
51
+ // TODO: testcontainers version update seems to have broken these
52
+ // process.env.CI ? null : setUpMySQL57(true),
53
+ // process.env.CI ? null : setUpMySQL80(true)
54
+ setUpPostgreSQL()
55
+ ]).then((xs) => xs.filter(isNotNullOrUndefined_1.isNotNullOrUndefined));
56
+ // TODO: seems to be broken by TableWithColumnWithDefaultEmptyString
57
+ // testItems.push(await setUpSQLite(testItems[1].SDK, testItems[1].sdkPath));
58
+ globalThis.__testItems__ = testItems;
59
+ // So instanceof checks work
60
+ globalThis.SDKNotFoundError = src_1.SDKNotFoundError;
61
+ }
62
+ async function setUpMySQL57(withRedisCaching) {
63
+ const { containers, mysql: { host, port, user, password, database }, redis } = await _setUpMySQL57(withRedisCaching);
64
+ console.log("MySQL 5.7", host, port, user, password, database);
65
+ console.log("MySQL 5.7 redis", redis);
66
+ const mysql = new MySQL_1.MySQL({
67
+ host,
68
+ port,
69
+ user,
70
+ password,
71
+ database,
72
+ multipleStatements: true
73
+ });
74
+ await mysql.query(await promises_1.default.readFile(node_path_1.default.join(__dirname, "mysql57/data-model.sql"), "utf-8"));
75
+ await mysql.query(await promises_1.default
76
+ .readFile(node_path_1.default.join(__dirname, "mysql57/insert.sql"), "utf-8")
77
+ .then((x) => processSqlString(x)));
78
+ await mysql.endPool();
79
+ const outdir = node_path_1.default.join(__dirname, "mysql57/__generated__");
80
+ await promises_1.default.rm(outdir, { recursive: true, force: true });
81
+ const dialect = "mysql";
82
+ await (0, src_1.generate)({
83
+ dialect,
84
+ outdir,
85
+ user,
86
+ password,
87
+ host,
88
+ port,
89
+ database,
90
+ outputSqliteSchema: true
91
+ });
92
+ const sdkPath = node_path_1.default.join(outdir, "sdk-ts");
93
+ const { SDK } = require(sdkPath);
94
+ const sdkOpts = {
95
+ runtime: RuntimeMySQL_1.RuntimeMySQL,
96
+ clientOpts: {
97
+ user,
98
+ password,
99
+ host,
100
+ port,
101
+ database
102
+ // debug: [
103
+ // "ComQueryPacket", "RowDataPacket"
104
+ // ]
105
+ },
106
+ otherOpts: withRedisCaching
107
+ ? {
108
+ redis: {
109
+ host: redis.host,
110
+ port: redis.port,
111
+ clusterMode: false,
112
+ tls: false,
113
+ db: 10,
114
+ socketTimeout: 50000
115
+ }
116
+ }
117
+ : undefined,
118
+ passBeforeValueToAfterCallback: true
119
+ };
120
+ const sdk = new SDK(sdkOpts);
121
+ const artifacts = require(node_path_1.default.join(sdkPath, "artifacts")).artifacts;
122
+ return {
123
+ displayName: `MySQL 5.7${withRedisCaching ? " (Redis Cache)" : ""}`,
124
+ dialect,
125
+ sdk,
126
+ SDK,
127
+ sdkOpts,
128
+ sdkPath,
129
+ artifacts,
130
+ containers
131
+ };
132
+ }
133
+ async function _setUpMySQL57(withRedisCaching) {
134
+ if (process.env.CI) {
135
+ const database = node_crypto_1.default.randomUUID();
136
+ const out = {
137
+ containers: [],
138
+ mysql: {
139
+ // See .gitlab-ci.yml
140
+ host: process.env.MYSQL57_HOST,
141
+ port: parseInt(process.env.MYSQL57_PORT),
142
+ user: process.env.MYSQL57_USER,
143
+ password: process.env.MYSQL57_PASSWORD,
144
+ database
145
+ },
146
+ redis: {
147
+ host: process.env.REDIS_HOST,
148
+ port: parseInt(process.env.REDIS_PORT)
149
+ }
150
+ };
151
+ const mysql = new MySQL_1.MySQL({ ...out.mysql, database: "mysql" });
152
+ await mysql.query("CREATE DATABASE ??", [database]);
153
+ await mysql.endPool();
154
+ return out;
155
+ }
156
+ // Note: there's no linux/arm64, so on M1 machines, need to run ahead of time:
157
+ // docker pull --platform linux/amd64 mysql:5.7.41
158
+ const containerMysqlP = new mysql_1.MySqlContainer("mysql:5.7.41").withReuse().start();
159
+ const containers = withRedisCaching
160
+ ? await Promise.all([
161
+ containerMysqlP,
162
+ new testcontainers_1.GenericContainer("redis:6.2.2")
163
+ .withReuse()
164
+ .withExposedPorts(6379)
165
+ .start()
166
+ ])
167
+ : [await containerMysqlP];
168
+ const [containerMySql, containerRedis] = containers;
169
+ return {
170
+ mysql: {
171
+ user: containerMySql.getUsername(),
172
+ password: containerMySql.getUserPassword(),
173
+ host: containerMySql.getHost(),
174
+ port: containerMySql.getPort(),
175
+ database: containerMySql.getDatabase()
176
+ },
177
+ redis: {
178
+ host: containerRedis?.getHost(),
179
+ port: containerRedis?.getMappedPort(6379)
180
+ },
181
+ containers
182
+ };
183
+ }
184
+ async function setUpMySQL80(withRedisCaching) {
185
+ const { containers, mysql: { host, port, user, password, database }, redis } = await _setUpMySQL80(withRedisCaching);
186
+ console.log("MySQL 8.0", host, port, user, password, database);
187
+ console.log("MySQL 8.0 redis", redis);
188
+ const mysql = new MySQL_1.MySQL({
189
+ host,
190
+ port,
191
+ user,
192
+ password,
193
+ database,
194
+ multipleStatements: true
195
+ });
196
+ await mysql.query(await promises_1.default.readFile(node_path_1.default.join(__dirname, "mysql57/data-model.sql"), "utf-8"));
197
+ await mysql.query(await promises_1.default
198
+ .readFile(node_path_1.default.join(__dirname, "mysql57/insert.sql"), "utf-8")
199
+ .then((x) => processSqlString(x)));
200
+ await mysql.endPool();
201
+ const outdir = node_path_1.default.join(__dirname, "mysql80/__generated__");
202
+ await promises_1.default.rm(outdir, { recursive: true, force: true });
203
+ const dialect = "mysql";
204
+ await (0, src_1.generate)({
205
+ dialect,
206
+ outdir,
207
+ user,
208
+ password,
209
+ host,
210
+ port,
211
+ database,
212
+ outputSqliteSchema: true
213
+ });
214
+ const sdkPath = node_path_1.default.join(outdir, "sdk-ts");
215
+ const { SDK } = require(sdkPath);
216
+ const sdkOpts = {
217
+ runtime: RuntimeMySQL_1.RuntimeMySQL,
218
+ clientOpts: {
219
+ user,
220
+ password,
221
+ host,
222
+ port,
223
+ database
224
+ // debug: [
225
+ // "ComQueryPacket", "RowDataPacket"
226
+ // ]
227
+ },
228
+ otherOpts: withRedisCaching
229
+ ? {
230
+ redis: {
231
+ host: redis?.host,
232
+ port: redis?.port,
233
+ clusterMode: false,
234
+ tls: false,
235
+ db: 10,
236
+ socketTimeout: 50000
237
+ }
238
+ }
239
+ : undefined,
240
+ passBeforeValueToAfterCallback: true
241
+ };
242
+ const sdk = new SDK(sdkOpts);
243
+ const artifacts = require(node_path_1.default.join(sdkPath, "artifacts")).artifacts;
244
+ return {
245
+ displayName: `MySQL 8.0${withRedisCaching ? " (Redis Cache)" : ""}`,
246
+ dialect,
247
+ sdk,
248
+ SDK,
249
+ sdkOpts,
250
+ sdkPath,
251
+ artifacts,
252
+ containers
253
+ };
254
+ }
255
+ async function _setUpMySQL80(withRedisCaching) {
256
+ if (process.env.CI) {
257
+ const database = node_crypto_1.default.randomUUID();
258
+ const out = {
259
+ containers: [],
260
+ mysql: {
261
+ host: process.env.MYSQL80_HOST,
262
+ port: parseInt(process.env.MYSQL80_PORT),
263
+ user: process.env.MYSQL80_USER,
264
+ password: process.env.MYSQL80_PASSWORD,
265
+ database
266
+ },
267
+ redis: {
268
+ host: process.env.REDIS_HOST,
269
+ port: parseInt(process.env.REDIS_PORT)
270
+ }
271
+ };
272
+ const mysql = new MySQL_1.MySQL({ ...out.mysql, database: "mysql" });
273
+ await mysql.query("CREATE DATABASE ??", [database]);
274
+ await mysql.endPool();
275
+ return out;
276
+ }
277
+ const containerMysqlP = new mysql_1.MySqlContainer("mysql:8.0.32")
278
+ .withReuse()
279
+ // https://github.com/mysqljs/mysql/issues/2499
280
+ .withCommand(["--default-authentication-plugin=mysql_native_password"])
281
+ .start();
282
+ const containers = withRedisCaching
283
+ ? await Promise.all([
284
+ containerMysqlP,
285
+ new testcontainers_1.GenericContainer("redis:6.2.2")
286
+ .withReuse()
287
+ .withExposedPorts(6379)
288
+ .start()
289
+ ])
290
+ : [await containerMysqlP];
291
+ const [containerMySql, containerRedis] = containers;
292
+ return {
293
+ mysql: {
294
+ user: containerMySql.getUsername(),
295
+ password: containerMySql.getUserPassword(),
296
+ host: containerMySql.getHost(),
297
+ port: containerMySql.getPort(),
298
+ database: containerMySql.getDatabase()
299
+ },
300
+ redis: {
301
+ host: containerRedis?.getHost(),
302
+ port: containerRedis?.getMappedPort(6379)
303
+ },
304
+ containers
305
+ };
306
+ }
307
+ async function setUpPostgreSQL() {
308
+ const dialect = "postgresql";
309
+ let container = null;
310
+ let host;
311
+ let port;
312
+ let user;
313
+ let password;
314
+ let database;
315
+ if (process.env.CI) {
316
+ const dbName = node_crypto_1.default.randomUUID().replace(/-/g, "_").slice(0, 20);
317
+ host = process.env.POSTGRES_HOST;
318
+ port = parseInt(process.env.POSTGRES_PORT);
319
+ user = process.env.POSTGRES_USER;
320
+ password = process.env.POSTGRES_PASSWORD;
321
+ database = dbName;
322
+ const pg = new (await Promise.resolve().then(() => __importStar(require("pg")))).Pool({
323
+ host,
324
+ port,
325
+ user,
326
+ password,
327
+ database: process.env.POSTGRES_DATABASE ?? "postgres"
328
+ });
329
+ await pg.query(`CREATE DATABASE "${dbName}"`);
330
+ await pg.end();
331
+ }
332
+ else {
333
+ const postgresContainer = await new postgresql_1.PostgreSqlContainer("postgres:17.7-alpine")
334
+ .withReuse()
335
+ .start();
336
+ container = postgresContainer;
337
+ host = postgresContainer.getHost();
338
+ port = postgresContainer.getPort();
339
+ user = postgresContainer.getUsername();
340
+ password = postgresContainer.getPassword();
341
+ database = postgresContainer.getDatabase();
342
+ }
343
+ console.log("PostgreSQL", host, port, user, database);
344
+ const pg = new PostgreSQL_1.PostgreSQL({
345
+ host,
346
+ port,
347
+ user,
348
+ password,
349
+ database
350
+ });
351
+ const runSql = async (sql) => {
352
+ const statements = sql
353
+ .split(/;\s*/)
354
+ .map((s) => s.trim())
355
+ .filter((s) => s.length > 0 && !s.startsWith("--"));
356
+ for (const st of statements) {
357
+ await pg.pool.query(st);
358
+ }
359
+ };
360
+ await runSql(await promises_1.default.readFile(node_path_1.default.join(__dirname, "postgres/data-model.sql"), "utf-8"));
361
+ await runSql(await promises_1.default.readFile(node_path_1.default.join(__dirname, "postgres/insert.sql"), "utf-8"));
362
+ await pg.endPool();
363
+ const outdir = node_path_1.default.join(__dirname, "postgres/__generated__");
364
+ await promises_1.default.rm(outdir, { recursive: true, force: true });
365
+ await (0, src_1.generate)({
366
+ dialect,
367
+ outdir,
368
+ user,
369
+ password,
370
+ host,
371
+ port,
372
+ database,
373
+ outputSqliteSchema: false
374
+ });
375
+ const sdkPath = node_path_1.default.join(outdir, "sdk-ts");
376
+ const { SDK } = require(sdkPath);
377
+ const artifacts = require(node_path_1.default.join(sdkPath, "artifacts")).artifacts;
378
+ const sdkOpts = {
379
+ runtime: RuntimePostgreSQL_1.RuntimePostgreSQL,
380
+ clientOpts: {
381
+ host,
382
+ port,
383
+ user,
384
+ password,
385
+ database
386
+ },
387
+ otherOpts: undefined,
388
+ passBeforeValueToAfterCallback: true
389
+ };
390
+ const sdk = new SDK(sdkOpts);
391
+ return {
392
+ displayName: "PostgreSQL 17.7",
393
+ dialect,
394
+ sdk,
395
+ SDK,
396
+ sdkOpts,
397
+ sdkPath,
398
+ artifacts,
399
+ containers: container ? [container] : []
400
+ };
401
+ }
402
+ // Reuse generated MySQL SDK, since we don't support generation with SQLite.
403
+ async function setUpSQLite(SDK, sdkPath) {
404
+ const dialect = "sqlite";
405
+ const sdkOpts = {
406
+ runtime: RuntimeSQLite_1.RuntimeSQLite,
407
+ clientOpts: { filename: ":memory:" },
408
+ otherOpts: {
409
+ seedString: await promises_1.default
410
+ .readFile(node_path_1.default.join(__dirname, "mysql57/insert.sql"), "utf-8")
411
+ .then((x) => processSqlString(x))
412
+ },
413
+ passBeforeValueToAfterCallback: true
414
+ };
415
+ const sdk = new SDK(sdkOpts);
416
+ const artifacts = require(node_path_1.default.join(sdkPath, "artifacts")).artifacts;
417
+ return {
418
+ displayName: "SQLite :memory:",
419
+ dialect,
420
+ sdk,
421
+ SDK,
422
+ sdkOpts,
423
+ sdkPath,
424
+ artifacts,
425
+ containers: []
426
+ };
427
+ }
428
+ function processSqlString(input) {
429
+ return (input
430
+ .split("\n")
431
+ // Remove comments
432
+ .filter((x) => !x.startsWith("--"))
433
+ .join("\n")
434
+ .replace(/\\/g, "")
435
+ .replace(/\n/g, ""));
436
+ }