@carbonorm/carbonnode 6.0.7 → 6.0.9
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/index.cjs.js +445 -169
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.esm.js +437 -170
- package/dist/index.esm.js.map +1 -1
- package/dist/types/ormInterfaces.d.ts +1 -0
- package/dist/utils/logLevel.d.ts +32 -0
- package/dist/utils/logSql.d.ts +2 -0
- package/dist/utils/logger.d.ts +0 -3
- package/dist/utils/versionColor.d.ts +6 -0
- package/dist/variables/isVerbose.d.ts +1 -1
- package/package.json +2 -2
- package/src/__tests__/fixtures/c6.fixture.ts +5 -0
- package/src/__tests__/logLevel.test.ts +54 -0
- package/src/__tests__/logSql.test.ts +70 -0
- package/src/__tests__/sakila-db/C6.js +1 -1
- package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
- package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
- package/src/__tests__/sakila-db/C6.ts +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
- package/src/__tests__/versionColor.test.ts +42 -0
- package/src/api/convertForRequestBody.ts +8 -1
- package/src/api/restRequest.ts +5 -4
- package/src/executors/Executor.ts +11 -2
- package/src/executors/HttpExecutor.ts +91 -53
- package/src/executors/SqlExecutor.ts +151 -40
- package/src/handlers/ExpressHandler.ts +7 -1
- package/src/index.ts +5 -0
- package/src/orm/builders/AggregateBuilder.ts +13 -2
- package/src/orm/builders/ConditionBuilder.ts +13 -2
- package/src/orm/builders/JoinBuilder.ts +7 -1
- package/src/orm/builders/PaginationBuilder.ts +7 -1
- package/src/orm/queries/DeleteQueryBuilder.ts +4 -0
- package/src/orm/queries/PostQueryBuilder.ts +4 -0
- package/src/orm/queries/SelectQueryBuilder.ts +3 -14
- package/src/orm/queries/UpdateQueryBuilder.ts +4 -0
- package/src/types/ormInterfaces.ts +1 -0
- package/src/utils/apiHelpers.ts +4 -1
- package/src/utils/cacheManager.ts +13 -7
- package/src/utils/colorSql.ts +2 -2
- package/src/utils/logLevel.ts +158 -0
- package/src/utils/logSql.ts +59 -0
- package/src/utils/logger.ts +7 -1
- package/src/utils/testHelpers.ts +2 -1
- package/src/utils/versionColor.ts +54 -0
- package/src/variables/getEnv.ts +6 -4
- package/src/variables/isVerbose.ts +4 -4
|
@@ -14,6 +14,7 @@ import { Buffer } from 'buffer';
|
|
|
14
14
|
import { Executor } from "./Executor";
|
|
15
15
|
import { normalizeSingularRequest } from "../utils/normalizeSingularRequest";
|
|
16
16
|
import { loadSqlAllowList, normalizeSql } from "../utils/sqlAllowList";
|
|
17
|
+
import { getLogContext, LogLevel, logWithLevel } from "../utils/logLevel";
|
|
17
18
|
|
|
18
19
|
export class SqlExecutor<
|
|
19
20
|
G extends OrmGenerics
|
|
@@ -36,8 +37,20 @@ export class SqlExecutor<
|
|
|
36
37
|
throw e;
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
this.config
|
|
40
|
-
|
|
40
|
+
const logContext = getLogContext(this.config, this.request);
|
|
41
|
+
logWithLevel(
|
|
42
|
+
LogLevel.DEBUG,
|
|
43
|
+
logContext,
|
|
44
|
+
console.log,
|
|
45
|
+
`[SQL EXECUTOR] ▶️ Executing ${method} on table "${TABLE_NAME}"`,
|
|
46
|
+
);
|
|
47
|
+
logWithLevel(
|
|
48
|
+
LogLevel.DEBUG,
|
|
49
|
+
logContext,
|
|
50
|
+
console.log,
|
|
51
|
+
`[SQL EXECUTOR] 🧩 Request:`,
|
|
52
|
+
this.request,
|
|
53
|
+
);
|
|
41
54
|
|
|
42
55
|
switch (method) {
|
|
43
56
|
case 'GET': {
|
|
@@ -76,13 +89,29 @@ export class SqlExecutor<
|
|
|
76
89
|
}
|
|
77
90
|
|
|
78
91
|
private async withConnection<T>(cb: (conn: PoolConnection) => Promise<T>): Promise<T> {
|
|
79
|
-
this.config
|
|
92
|
+
const logContext = getLogContext(this.config, this.request);
|
|
93
|
+
logWithLevel(
|
|
94
|
+
LogLevel.DEBUG,
|
|
95
|
+
logContext,
|
|
96
|
+
console.log,
|
|
97
|
+
`[SQL EXECUTOR] 📡 Getting DB connection`,
|
|
98
|
+
);
|
|
80
99
|
const conn = await this.config.mysqlPool!.getConnection();
|
|
81
100
|
try {
|
|
82
|
-
|
|
101
|
+
logWithLevel(
|
|
102
|
+
LogLevel.DEBUG,
|
|
103
|
+
logContext,
|
|
104
|
+
console.log,
|
|
105
|
+
`[SQL EXECUTOR] ✅ Connection acquired`,
|
|
106
|
+
);
|
|
83
107
|
return await cb(conn);
|
|
84
108
|
} finally {
|
|
85
|
-
|
|
109
|
+
logWithLevel(
|
|
110
|
+
LogLevel.DEBUG,
|
|
111
|
+
logContext,
|
|
112
|
+
console.log,
|
|
113
|
+
`[SQL EXECUTOR] 🔌 Releasing DB connection`,
|
|
114
|
+
);
|
|
86
115
|
conn.release();
|
|
87
116
|
}
|
|
88
117
|
}
|
|
@@ -267,14 +296,27 @@ export class SqlExecutor<
|
|
|
267
296
|
response?: DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>
|
|
268
297
|
): Promise<void> {
|
|
269
298
|
const broadcast = this.config.websocketBroadcast;
|
|
270
|
-
this.config
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
299
|
+
const logContext = getLogContext(this.config, this.request);
|
|
300
|
+
logWithLevel(
|
|
301
|
+
LogLevel.DEBUG,
|
|
302
|
+
logContext,
|
|
303
|
+
console.log,
|
|
304
|
+
"[SQL EXECUTOR] 📣 broadcastWebsocketIfConfigured start",
|
|
305
|
+
{
|
|
306
|
+
method: this.config.requestMethod,
|
|
307
|
+
hasBroadcast: Boolean(broadcast),
|
|
308
|
+
},
|
|
309
|
+
);
|
|
274
310
|
if (!broadcast || this.config.requestMethod === C6C.GET) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
311
|
+
logWithLevel(
|
|
312
|
+
LogLevel.DEBUG,
|
|
313
|
+
logContext,
|
|
314
|
+
console.log,
|
|
315
|
+
"[SQL EXECUTOR] 📣 websocket broadcast skipped",
|
|
316
|
+
{
|
|
317
|
+
reason: !broadcast ? "no broadcast configured" : "GET request",
|
|
318
|
+
},
|
|
319
|
+
);
|
|
278
320
|
return;
|
|
279
321
|
}
|
|
280
322
|
|
|
@@ -285,27 +327,51 @@ export class SqlExecutor<
|
|
|
285
327
|
let responseRest = response?.rest;
|
|
286
328
|
let responsePrimaryKey = this.extractPrimaryKeyValuesFromData(responseRest);
|
|
287
329
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
330
|
+
logWithLevel(
|
|
331
|
+
LogLevel.DEBUG,
|
|
332
|
+
logContext,
|
|
333
|
+
console.log,
|
|
334
|
+
"[SQL EXECUTOR] 📣 websocket request payload",
|
|
335
|
+
{
|
|
336
|
+
normalizedRequest,
|
|
337
|
+
requestPrimaryKey: this.extractPrimaryKeyValues(),
|
|
338
|
+
pkShorts,
|
|
339
|
+
},
|
|
340
|
+
);
|
|
341
|
+
logWithLevel(
|
|
342
|
+
LogLevel.DEBUG,
|
|
343
|
+
logContext,
|
|
344
|
+
console.log,
|
|
345
|
+
"[SQL EXECUTOR] 📣 websocket response payload",
|
|
346
|
+
{
|
|
347
|
+
responseRest,
|
|
348
|
+
responsePrimaryKey,
|
|
349
|
+
},
|
|
350
|
+
);
|
|
297
351
|
|
|
298
352
|
if (
|
|
299
353
|
(responseRest === null || (Array.isArray(responseRest) && responseRest.length === 0))
|
|
300
354
|
&& this.config.requestMethod === C6C.POST
|
|
301
355
|
) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
356
|
+
logWithLevel(
|
|
357
|
+
LogLevel.DEBUG,
|
|
358
|
+
logContext,
|
|
359
|
+
console.log,
|
|
360
|
+
"[SQL EXECUTOR] 📣 response rest empty, attempting synthesize",
|
|
361
|
+
{
|
|
362
|
+
responseRest,
|
|
363
|
+
},
|
|
364
|
+
);
|
|
305
365
|
const insertId = (response as DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']> & { insertId?: number | string | null })?.insertId;
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
366
|
+
logWithLevel(
|
|
367
|
+
LogLevel.DEBUG,
|
|
368
|
+
logContext,
|
|
369
|
+
console.log,
|
|
370
|
+
"[SQL EXECUTOR] 📣 POST insertId lookup",
|
|
371
|
+
{
|
|
372
|
+
insertId,
|
|
373
|
+
},
|
|
374
|
+
);
|
|
309
375
|
if (insertId !== undefined && pkShorts.length === 1) {
|
|
310
376
|
const synthesizedRequest = {
|
|
311
377
|
...normalizedRequest,
|
|
@@ -330,10 +396,16 @@ export class SqlExecutor<
|
|
|
330
396
|
responsePrimaryKey = {
|
|
331
397
|
[pkShorts[0]]: insertId,
|
|
332
398
|
};
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
399
|
+
logWithLevel(
|
|
400
|
+
LogLevel.DEBUG,
|
|
401
|
+
logContext,
|
|
402
|
+
console.log,
|
|
403
|
+
"[SQL EXECUTOR] 📣 synthesized response payload",
|
|
404
|
+
{
|
|
405
|
+
synthesized,
|
|
406
|
+
responsePrimaryKey,
|
|
407
|
+
},
|
|
408
|
+
);
|
|
337
409
|
}
|
|
338
410
|
}
|
|
339
411
|
|
|
@@ -349,16 +421,36 @@ export class SqlExecutor<
|
|
|
349
421
|
},
|
|
350
422
|
};
|
|
351
423
|
|
|
352
|
-
|
|
424
|
+
logWithLevel(
|
|
425
|
+
LogLevel.DEBUG,
|
|
426
|
+
logContext,
|
|
427
|
+
console.log,
|
|
428
|
+
"[SQL EXECUTOR] 📣 websocket payload ready",
|
|
429
|
+
payload,
|
|
430
|
+
);
|
|
353
431
|
|
|
354
432
|
try {
|
|
355
|
-
|
|
433
|
+
logWithLevel(
|
|
434
|
+
LogLevel.DEBUG,
|
|
435
|
+
logContext,
|
|
436
|
+
console.log,
|
|
437
|
+
"[SQL EXECUTOR] 📣 websocket broadcast dispatch start",
|
|
438
|
+
);
|
|
356
439
|
await broadcast(payload);
|
|
357
|
-
|
|
440
|
+
logWithLevel(
|
|
441
|
+
LogLevel.DEBUG,
|
|
442
|
+
logContext,
|
|
443
|
+
console.log,
|
|
444
|
+
"[SQL EXECUTOR] 📣 websocket broadcast dispatch complete",
|
|
445
|
+
);
|
|
358
446
|
} catch (error) {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
447
|
+
logWithLevel(
|
|
448
|
+
LogLevel.ERROR,
|
|
449
|
+
logContext,
|
|
450
|
+
console.error,
|
|
451
|
+
"[SQL EXECUTOR] websocketBroadcast failed",
|
|
452
|
+
error,
|
|
453
|
+
);
|
|
362
454
|
}
|
|
363
455
|
}
|
|
364
456
|
async runQuery(): Promise<DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>> {
|
|
@@ -385,10 +477,23 @@ export class SqlExecutor<
|
|
|
385
477
|
|
|
386
478
|
const QueryResult = builder.build(TABLE_NAME);
|
|
387
479
|
|
|
388
|
-
this.config
|
|
480
|
+
const logContext = getLogContext(this.config, this.request);
|
|
481
|
+
logWithLevel(
|
|
482
|
+
LogLevel.DEBUG,
|
|
483
|
+
logContext,
|
|
484
|
+
console.log,
|
|
485
|
+
`[SQL EXECUTOR] 🧠 Generated ${method.toUpperCase()} SQL:`,
|
|
486
|
+
QueryResult,
|
|
487
|
+
);
|
|
389
488
|
|
|
390
489
|
const formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
|
|
391
|
-
|
|
490
|
+
logWithLevel(
|
|
491
|
+
LogLevel.DEBUG,
|
|
492
|
+
logContext,
|
|
493
|
+
console.log,
|
|
494
|
+
`[SQL EXECUTOR] 🧠 Formatted ${method.toUpperCase()} SQL:`,
|
|
495
|
+
formatted,
|
|
496
|
+
);
|
|
392
497
|
|
|
393
498
|
const toUnnamed = namedPlaceholders();
|
|
394
499
|
const [sql, values] = toUnnamed(QueryResult.sql, QueryResult.params);
|
|
@@ -404,7 +509,13 @@ export class SqlExecutor<
|
|
|
404
509
|
sql: { sql, values }
|
|
405
510
|
} as DetermineResponseDataType<G['RequestMethod'], G['RestTableInterface']>;
|
|
406
511
|
} else {
|
|
407
|
-
|
|
512
|
+
logWithLevel(
|
|
513
|
+
LogLevel.DEBUG,
|
|
514
|
+
logContext,
|
|
515
|
+
console.log,
|
|
516
|
+
`[SQL EXECUTOR] ✏️ Rows affected:`,
|
|
517
|
+
result.affectedRows,
|
|
518
|
+
);
|
|
408
519
|
return {
|
|
409
520
|
affected: result.affectedRows as number,
|
|
410
521
|
insertId: result.insertId as number,
|
|
@@ -3,6 +3,7 @@ import type {Pool} from "mysql2/promise";
|
|
|
3
3
|
import {C6C} from "../constants/C6Constants";
|
|
4
4
|
import restRequest from "../api/restRequest";
|
|
5
5
|
import type {iC6Object, iRestMethods, tWebsocketBroadcast} from "../types/ormInterfaces";
|
|
6
|
+
import {LogLevel, logWithLevel} from "../utils/logLevel";
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
// TODO - WE MUST make this a generic - optional, but helpful
|
|
@@ -40,7 +41,12 @@ export function ExpressHandler({
|
|
|
40
41
|
|
|
41
42
|
// Warn for unsupported overrides but continue normally
|
|
42
43
|
if (incomingMethod !== 'GET' && methodOverride && methodOverride !== 'GET') {
|
|
43
|
-
|
|
44
|
+
logWithLevel(
|
|
45
|
+
LogLevel.WARN,
|
|
46
|
+
undefined,
|
|
47
|
+
console.warn,
|
|
48
|
+
`Ignoring unsupported METHOD override: ${methodOverride}`,
|
|
49
|
+
);
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
if (!(table in C6.TABLES)) {
|
package/src/index.ts
CHANGED
|
@@ -36,6 +36,9 @@ export * from "./utils/cacheManager";
|
|
|
36
36
|
export { default as colorSql } from "./utils/colorSql";
|
|
37
37
|
export * from "./utils/colorSql";
|
|
38
38
|
export * from "./utils/determineRuntimeJsType";
|
|
39
|
+
export * from "./utils/logLevel";
|
|
40
|
+
export { default as logSql } from "./utils/logSql";
|
|
41
|
+
export * from "./utils/logSql";
|
|
39
42
|
export * from "./utils/logger";
|
|
40
43
|
export * from "./utils/normalizeSingularRequest";
|
|
41
44
|
export * from "./utils/sortAndSerializeQueryObject";
|
|
@@ -43,6 +46,8 @@ export * from "./utils/sqlAllowList";
|
|
|
43
46
|
export * from "./utils/testHelpers";
|
|
44
47
|
export * from "./utils/toastNotifier";
|
|
45
48
|
export * from "./utils/toastRuntime";
|
|
49
|
+
export { default as versionColor } from "./utils/versionColor";
|
|
50
|
+
export * from "./utils/versionColor";
|
|
46
51
|
export * from "./variables/getEnv";
|
|
47
52
|
export { default as isLocal } from "./variables/isLocal";
|
|
48
53
|
export * from "./variables/isLocal";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {Executor} from "../../executors/Executor";
|
|
2
2
|
import {OrmGenerics} from "../../types/ormGenerics";
|
|
3
3
|
import {C6C} from "../../constants/C6Constants";
|
|
4
|
+
import {getLogContext, LogLevel, logWithLevel} from "../../utils/logLevel";
|
|
4
5
|
|
|
5
6
|
export abstract class AggregateBuilder<G extends OrmGenerics> extends Executor<G>{
|
|
6
7
|
protected selectAliases: Set<string> = new Set<string>();
|
|
@@ -76,7 +77,12 @@ export abstract class AggregateBuilder<G extends OrmGenerics> extends Executor<G
|
|
|
76
77
|
expr += ` AS ${alias}`;
|
|
77
78
|
}
|
|
78
79
|
|
|
79
|
-
|
|
80
|
+
logWithLevel(
|
|
81
|
+
LogLevel.DEBUG,
|
|
82
|
+
getLogContext(this.config, this.request),
|
|
83
|
+
console.log,
|
|
84
|
+
`[SELECT] ${expr}`,
|
|
85
|
+
);
|
|
80
86
|
|
|
81
87
|
return expr;
|
|
82
88
|
}
|
|
@@ -123,7 +129,12 @@ export abstract class AggregateBuilder<G extends OrmGenerics> extends Executor<G
|
|
|
123
129
|
expr += ` AS ${alias}`;
|
|
124
130
|
}
|
|
125
131
|
|
|
126
|
-
|
|
132
|
+
logWithLevel(
|
|
133
|
+
LogLevel.DEBUG,
|
|
134
|
+
getLogContext(this.config, this.request),
|
|
135
|
+
console.log,
|
|
136
|
+
`[SELECT] ${expr}`,
|
|
137
|
+
);
|
|
127
138
|
|
|
128
139
|
return expr;
|
|
129
140
|
}
|
|
@@ -4,6 +4,7 @@ import {DetermineResponseDataType} from "../../types/ormInterfaces";
|
|
|
4
4
|
import {convertHexIfBinary, SqlBuilderResult} from "../utils/sqlUtils";
|
|
5
5
|
import {AggregateBuilder} from "./AggregateBuilder";
|
|
6
6
|
import {isDerivedTableKey} from "../queryHelpers";
|
|
7
|
+
import {getLogContext, LogLevel, logWithLevel} from "../../utils/logLevel";
|
|
7
8
|
|
|
8
9
|
export abstract class ConditionBuilder<
|
|
9
10
|
G extends OrmGenerics
|
|
@@ -639,7 +640,12 @@ export abstract class ConditionBuilder<
|
|
|
639
640
|
}
|
|
640
641
|
|
|
641
642
|
const clause = `(MATCH(${leftInfo.sql}) ${againstClause})`;
|
|
642
|
-
|
|
643
|
+
logWithLevel(
|
|
644
|
+
LogLevel.DEBUG,
|
|
645
|
+
getLogContext(this.config, this.request),
|
|
646
|
+
console.log,
|
|
647
|
+
`[MATCH_AGAINST] ${clause}`,
|
|
648
|
+
);
|
|
643
649
|
return clause;
|
|
644
650
|
}
|
|
645
651
|
|
|
@@ -914,7 +920,12 @@ export abstract class ConditionBuilder<
|
|
|
914
920
|
}
|
|
915
921
|
}
|
|
916
922
|
|
|
917
|
-
|
|
923
|
+
logWithLevel(
|
|
924
|
+
LogLevel.DEBUG,
|
|
925
|
+
getLogContext(this.config, this.request),
|
|
926
|
+
console.log,
|
|
927
|
+
`[WHERE] ${trimmed}`,
|
|
928
|
+
);
|
|
918
929
|
return ` WHERE ${trimmed}`;
|
|
919
930
|
}
|
|
920
931
|
}
|
|
@@ -2,6 +2,7 @@ import {OrmGenerics} from "../../types/ormGenerics";
|
|
|
2
2
|
import {ConditionBuilder} from "./ConditionBuilder";
|
|
3
3
|
import {C6C} from "../../constants/C6Constants";
|
|
4
4
|
import {resolveDerivedTable, isDerivedTableKey} from "../queryHelpers";
|
|
5
|
+
import {getLogContext, LogLevel, logWithLevel} from "../../utils/logLevel";
|
|
5
6
|
|
|
6
7
|
export abstract class JoinBuilder<G extends OrmGenerics> extends ConditionBuilder<G>{
|
|
7
8
|
|
|
@@ -238,7 +239,12 @@ export abstract class JoinBuilder<G extends OrmGenerics> extends ConditionBuilde
|
|
|
238
239
|
}
|
|
239
240
|
}
|
|
240
241
|
|
|
241
|
-
|
|
242
|
+
logWithLevel(
|
|
243
|
+
LogLevel.DEBUG,
|
|
244
|
+
getLogContext(this.config, this.request),
|
|
245
|
+
console.log,
|
|
246
|
+
`[JOIN] ${sql.trim()}`,
|
|
247
|
+
);
|
|
242
248
|
|
|
243
249
|
return sql;
|
|
244
250
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {C6Constants} from "../../constants/C6Constants";
|
|
2
2
|
import {OrmGenerics} from "../../types/ormGenerics";
|
|
3
3
|
import {JoinBuilder} from "./JoinBuilder";
|
|
4
|
+
import {getLogContext, LogLevel, logWithLevel} from "../../utils/logLevel";
|
|
4
5
|
|
|
5
6
|
export abstract class PaginationBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
|
|
6
7
|
|
|
@@ -72,7 +73,12 @@ export abstract class PaginationBuilder<G extends OrmGenerics> extends JoinBuild
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
|
|
76
|
+
logWithLevel(
|
|
77
|
+
LogLevel.DEBUG,
|
|
78
|
+
getLogContext(this.config, this.request),
|
|
79
|
+
console.log,
|
|
80
|
+
`[PAGINATION] ${sql.trim()}`,
|
|
81
|
+
);
|
|
76
82
|
return sql;
|
|
77
83
|
}
|
|
78
84
|
}
|
|
@@ -2,6 +2,8 @@ import { OrmGenerics } from "../../types/ormGenerics";
|
|
|
2
2
|
import { SqlBuilderResult } from "../utils/sqlUtils";
|
|
3
3
|
import { JoinBuilder } from "../builders/JoinBuilder";
|
|
4
4
|
import { SelectQueryBuilder } from "./SelectQueryBuilder";
|
|
5
|
+
import logSql from "../../utils/logSql";
|
|
6
|
+
import {getLogContext} from "../../utils/logLevel";
|
|
5
7
|
|
|
6
8
|
export class DeleteQueryBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
|
|
7
9
|
protected createSelectBuilder(request: any) {
|
|
@@ -25,6 +27,8 @@ export class DeleteQueryBuilder<G extends OrmGenerics> extends JoinBuilder<G> {
|
|
|
25
27
|
sql += this.buildWhereClause(this.request.WHERE, params);
|
|
26
28
|
}
|
|
27
29
|
|
|
30
|
+
logSql("DELETE", sql, getLogContext(this.config, this.request));
|
|
31
|
+
|
|
28
32
|
return { sql, params };
|
|
29
33
|
}
|
|
30
34
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {C6C} from "../../constants/C6Constants";
|
|
2
2
|
import {ConditionBuilder} from "../builders/ConditionBuilder";
|
|
3
3
|
import {OrmGenerics} from "../../types/ormGenerics";
|
|
4
|
+
import logSql from "../../utils/logSql";
|
|
5
|
+
import {getLogContext} from "../../utils/logLevel";
|
|
4
6
|
|
|
5
7
|
export class PostQueryBuilder<G extends OrmGenerics> extends ConditionBuilder<G>{
|
|
6
8
|
|
|
@@ -47,6 +49,8 @@ export class PostQueryBuilder<G extends OrmGenerics> extends ConditionBuilder<G>
|
|
|
47
49
|
sql += ` ON DUPLICATE KEY UPDATE ${updateClause}`;
|
|
48
50
|
}
|
|
49
51
|
|
|
52
|
+
logSql(verb, sql, getLogContext(this.config, this.request));
|
|
53
|
+
|
|
50
54
|
return {sql, params};
|
|
51
55
|
}
|
|
52
56
|
}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
import {OrmGenerics} from "../../types/ormGenerics";
|
|
2
2
|
import {PaginationBuilder} from "../builders/PaginationBuilder";
|
|
3
3
|
import {SqlBuilderResult} from "../utils/sqlUtils";
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import { version } from "../../../package.json";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const C = {
|
|
10
|
-
SSR: "\x1b[95m", // bright magenta
|
|
11
|
-
HTTP: "\x1b[94m", // bright blue
|
|
12
|
-
SQL: "\x1b[96m", // bright cyan (your SELECT teal)
|
|
13
|
-
RESET: "\x1b[0m",
|
|
14
|
-
};
|
|
4
|
+
import logSql from "../../utils/logSql";
|
|
5
|
+
import {getLogContext} from "../../utils/logLevel";
|
|
15
6
|
|
|
16
7
|
export class SelectQueryBuilder<G extends OrmGenerics> extends PaginationBuilder<G>{
|
|
17
8
|
|
|
@@ -67,9 +58,7 @@ export class SelectQueryBuilder<G extends OrmGenerics> extends PaginationBuilder
|
|
|
67
58
|
sql += ` LIMIT 100`;
|
|
68
59
|
}
|
|
69
60
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
console.log(`[${version}] ${preText}${C.SQL}[SELECT]${C.RESET} ${colorSql(sql)}`);
|
|
61
|
+
logSql("SELECT", sql, getLogContext(this.config, this.request));
|
|
73
62
|
|
|
74
63
|
return { sql, params };
|
|
75
64
|
}
|
|
@@ -3,6 +3,8 @@ import {OrmGenerics} from "../../types/ormGenerics";
|
|
|
3
3
|
import { PaginationBuilder } from '../builders/PaginationBuilder';
|
|
4
4
|
import {SqlBuilderResult} from "../utils/sqlUtils";
|
|
5
5
|
import {SelectQueryBuilder} from "./SelectQueryBuilder";
|
|
6
|
+
import logSql from "../../utils/logSql";
|
|
7
|
+
import {getLogContext} from "../../utils/logLevel";
|
|
6
8
|
|
|
7
9
|
export class UpdateQueryBuilder<G extends OrmGenerics> extends PaginationBuilder<G>{
|
|
8
10
|
protected createSelectBuilder(request: any) {
|
|
@@ -54,6 +56,8 @@ export class UpdateQueryBuilder<G extends OrmGenerics> extends PaginationBuilder
|
|
|
54
56
|
sql += this.buildPaginationClause(args.PAGINATION, params);
|
|
55
57
|
}
|
|
56
58
|
|
|
59
|
+
logSql("UPDATE", sql, getLogContext(this.config, this.request));
|
|
60
|
+
|
|
57
61
|
return { sql, params };
|
|
58
62
|
}
|
|
59
63
|
}
|
package/src/utils/apiHelpers.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type {AxiosResponse} from "axios";
|
|
|
4
4
|
import {toastOptions} from "../variables/toastOptions";
|
|
5
5
|
import type {C6RestfulModel} from "../types/ormInterfaces";
|
|
6
6
|
import {notifyToast} from "./toastRuntime";
|
|
7
|
+
import {LogLevel, logWithLevel} from "./logLevel";
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
|
|
@@ -79,7 +80,9 @@ export function removeInvalidKeys<iRestObject>(request: any, c6Tables: {
|
|
|
79
80
|
|
|
80
81
|
});
|
|
81
82
|
|
|
82
|
-
isTest()
|
|
83
|
+
if (!isTest()) {
|
|
84
|
+
logWithLevel(LogLevel.DEBUG, undefined, console.log, 'intersection', intersection);
|
|
85
|
+
}
|
|
83
86
|
|
|
84
87
|
return intersection
|
|
85
88
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type {AxiosPromise} from "axios";
|
|
2
2
|
import type {iCacheAPI} from "../types/ormInterfaces";
|
|
3
|
+
import {LogLevel, logWithLevel, shouldLog} from "./logLevel";
|
|
3
4
|
|
|
4
5
|
// -----------------------------------------------------------------------------
|
|
5
6
|
// Cache Storage
|
|
@@ -36,7 +37,10 @@ function makeCacheKey(
|
|
|
36
37
|
// -----------------------------------------------------------------------------
|
|
37
38
|
export function clearCache(props?: { ignoreWarning?: boolean }): void {
|
|
38
39
|
if (!props?.ignoreWarning) {
|
|
39
|
-
|
|
40
|
+
logWithLevel(
|
|
41
|
+
LogLevel.WARN,
|
|
42
|
+
undefined,
|
|
43
|
+
console.warn,
|
|
40
44
|
"The REST API clearCache should only be used with extreme care!",
|
|
41
45
|
);
|
|
42
46
|
}
|
|
@@ -63,12 +67,14 @@ export function checkCache<ResponseDataType = any>(
|
|
|
63
67
|
|
|
64
68
|
if (!cached) return false;
|
|
65
69
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
if (shouldLog(LogLevel.DEBUG, undefined)) {
|
|
71
|
+
console.groupCollapsed(
|
|
72
|
+
`%c API cache hit for ${method} ${tableName}`,
|
|
73
|
+
"color:#0c0",
|
|
74
|
+
);
|
|
75
|
+
console.log("Request Data:", requestData);
|
|
76
|
+
console.groupEnd();
|
|
77
|
+
}
|
|
72
78
|
|
|
73
79
|
return cached.request;
|
|
74
80
|
}
|
package/src/utils/colorSql.ts
CHANGED
|
@@ -98,7 +98,7 @@ export default function colorSql(sql: string): string {
|
|
|
98
98
|
|
|
99
99
|
/* 4️⃣ SQL keywords */
|
|
100
100
|
s = s.replace(
|
|
101
|
-
/\b(SELECT|WHERE|AND|OR|ON|IN|BETWEEN|EXISTS|ORDER BY)\b/gi,
|
|
101
|
+
/\b(SELECT|WHERE|AND|OR|ON|IN|BETWEEN|EXISTS|ORDER BY|GROUP BY|HAVING|SET|VALUES|INSERT|REPLACE|DELETE|UPDATE|DUPLICATE|KEY)\b/gi,
|
|
102
102
|
`${C.KEYWORD}$1${RESET}`,
|
|
103
103
|
);
|
|
104
104
|
|
|
@@ -109,4 +109,4 @@ export default function colorSql(sql: string): string {
|
|
|
109
109
|
);
|
|
110
110
|
|
|
111
111
|
return s;
|
|
112
|
-
}
|
|
112
|
+
}
|