@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.
Files changed (89) hide show
  1. package/dist/index.cjs.js +445 -169
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.d.ts +5 -0
  4. package/dist/index.esm.js +437 -170
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/types/ormInterfaces.d.ts +1 -0
  7. package/dist/utils/logLevel.d.ts +32 -0
  8. package/dist/utils/logSql.d.ts +2 -0
  9. package/dist/utils/logger.d.ts +0 -3
  10. package/dist/utils/versionColor.d.ts +6 -0
  11. package/dist/variables/isVerbose.d.ts +1 -1
  12. package/package.json +2 -2
  13. package/src/__tests__/fixtures/c6.fixture.ts +5 -0
  14. package/src/__tests__/logLevel.test.ts +54 -0
  15. package/src/__tests__/logSql.test.ts +70 -0
  16. package/src/__tests__/sakila-db/C6.js +1 -1
  17. package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
  18. package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
  19. package/src/__tests__/sakila-db/C6.ts +1 -1
  20. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +3 -3
  21. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
  22. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
  23. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
  24. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +5 -5
  25. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
  26. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
  27. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
  28. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +2 -2
  29. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
  30. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
  31. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
  32. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +2 -2
  33. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
  34. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
  35. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
  36. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +2 -2
  37. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
  38. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
  39. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
  40. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +5 -5
  41. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
  42. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
  43. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
  44. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +2 -2
  45. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
  46. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
  47. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
  48. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +1 -1
  49. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
  50. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
  51. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
  52. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +2 -2
  53. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
  54. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
  55. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
  56. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +2 -2
  57. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
  58. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
  59. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +3 -3
  60. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
  61. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
  62. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
  63. package/src/__tests__/versionColor.test.ts +42 -0
  64. package/src/api/convertForRequestBody.ts +8 -1
  65. package/src/api/restRequest.ts +5 -4
  66. package/src/executors/Executor.ts +11 -2
  67. package/src/executors/HttpExecutor.ts +91 -53
  68. package/src/executors/SqlExecutor.ts +151 -40
  69. package/src/handlers/ExpressHandler.ts +7 -1
  70. package/src/index.ts +5 -0
  71. package/src/orm/builders/AggregateBuilder.ts +13 -2
  72. package/src/orm/builders/ConditionBuilder.ts +13 -2
  73. package/src/orm/builders/JoinBuilder.ts +7 -1
  74. package/src/orm/builders/PaginationBuilder.ts +7 -1
  75. package/src/orm/queries/DeleteQueryBuilder.ts +4 -0
  76. package/src/orm/queries/PostQueryBuilder.ts +4 -0
  77. package/src/orm/queries/SelectQueryBuilder.ts +3 -14
  78. package/src/orm/queries/UpdateQueryBuilder.ts +4 -0
  79. package/src/types/ormInterfaces.ts +1 -0
  80. package/src/utils/apiHelpers.ts +4 -1
  81. package/src/utils/cacheManager.ts +13 -7
  82. package/src/utils/colorSql.ts +2 -2
  83. package/src/utils/logLevel.ts +158 -0
  84. package/src/utils/logSql.ts +59 -0
  85. package/src/utils/logger.ts +7 -1
  86. package/src/utils/testHelpers.ts +2 -1
  87. package/src/utils/versionColor.ts +54 -0
  88. package/src/variables/getEnv.ts +6 -4
  89. 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.verbose && console.log(`[SQL EXECUTOR] ▶️ Executing ${method} on table "${TABLE_NAME}"`);
40
- this.config.verbose && console.log(`[SQL EXECUTOR] 🧩 Request:`, this.request);
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.verbose && console.log(`[SQL EXECUTOR] 📡 Getting DB connection`);
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
- this.config.verbose && console.log(`[SQL EXECUTOR] ✅ Connection acquired`);
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
- this.config.verbose && console.log(`[SQL EXECUTOR] 🔌 Releasing DB connection`);
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.verbose && console.log("[SQL EXECUTOR] 📣 broadcastWebsocketIfConfigured start", {
271
- method: this.config.requestMethod,
272
- hasBroadcast: Boolean(broadcast),
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 websocket broadcast skipped", {
276
- reason: !broadcast ? "no broadcast configured" : "GET request",
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 websocket request payload", {
289
- normalizedRequest,
290
- requestPrimaryKey: this.extractPrimaryKeyValues(),
291
- pkShorts,
292
- });
293
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 websocket response payload", {
294
- responseRest,
295
- responsePrimaryKey,
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 response rest empty, attempting synthesize", {
303
- responseRest,
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 POST insertId lookup", {
307
- insertId,
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 synthesized response payload", {
334
- synthesized,
335
- responsePrimaryKey,
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 websocket payload ready", payload);
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
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 websocket broadcast dispatch start");
433
+ logWithLevel(
434
+ LogLevel.DEBUG,
435
+ logContext,
436
+ console.log,
437
+ "[SQL EXECUTOR] 📣 websocket broadcast dispatch start",
438
+ );
356
439
  await broadcast(payload);
357
- this.config.verbose && console.log("[SQL EXECUTOR] 📣 websocket broadcast dispatch complete");
440
+ logWithLevel(
441
+ LogLevel.DEBUG,
442
+ logContext,
443
+ console.log,
444
+ "[SQL EXECUTOR] 📣 websocket broadcast dispatch complete",
445
+ );
358
446
  } catch (error) {
359
- if (this.config.verbose) {
360
- console.error("[SQL EXECUTOR] websocketBroadcast failed", error);
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.verbose && console.log(`[SQL EXECUTOR] 🧠 Generated ${method.toUpperCase()} SQL:`, QueryResult);
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
- this.config.verbose && console.log(`[SQL EXECUTOR] 🧠 Formatted ${method.toUpperCase()} SQL:`, formatted);
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
- this.config.verbose && console.log(`[SQL EXECUTOR] ✏️ Rows affected:`, result.affectedRows);
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
- console.warn(`Ignoring unsupported METHOD override: ${methodOverride}`);
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
- this.config.verbose && console.log(`[SELECT] ${expr}`);
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
- this.config.verbose && console.log(`[SELECT] ${expr}`);
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
- this.config.verbose && console.log(`[MATCH_AGAINST] ${clause}`);
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
- this.config.verbose && console.log(`[WHERE] ${trimmed}`);
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
- this.config.verbose && console.log(`[JOIN] ${sql.trim()}`);
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
- this.config.verbose && console.log(`[PAGINATION] ${sql.trim()}`);
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 {getEnvBool} from "../../variables/getEnv";
5
- import colorSql from "../../utils/colorSql";
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
- const preText = getEnvBool("SSR", false) ? `${C.SSR}[SSR]${C.RESET} ` : `${C.HTTP}[API]${C.RESET} `;
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
  }
@@ -204,6 +204,7 @@ export interface iRest<
204
204
  clearCache?: () => void;
205
205
  skipPrimaryCheck?: boolean;
206
206
  websocketBroadcast?: tWebsocketBroadcast;
207
+ logLevel?: number;
207
208
  verbose?: boolean;
208
209
  sqlAllowListPath?: string;
209
210
  }
@@ -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() || console.log('intersection', intersection)
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
- console.warn(
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
- console.groupCollapsed(
67
- `%c API cache hit for ${method} ${tableName}`,
68
- "color:#0c0",
69
- );
70
- console.log("Request Data:", requestData);
71
- console.groupEnd();
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
  }
@@ -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
+ }