@carbonorm/carbonnode 3.0.10 → 3.0.12

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 CHANGED
@@ -311,8 +311,13 @@ function convertForRequestBody (restfulObject, tableName, C6, regexErrorHandler)
311
311
  }, {});
312
312
  }
313
313
 
314
- var _a;
315
- var isNode = typeof process !== 'undefined' && !!((_a = process.versions) === null || _a === void 0 ? void 0 : _a.node);
314
+ var isNode = function () {
315
+ var _a;
316
+ console.log('Checking if running in Node.js environment...');
317
+ var isNodeEnv = typeof process !== 'undefined' && !!((_a = process.versions) === null || _a === void 0 ? void 0 : _a.node);
318
+ console.log("Is Node.js environment: ".concat(isNodeEnv));
319
+ return isNodeEnv;
320
+ };
316
321
 
317
322
  /**
318
323
  * Facade: routes API calls to SQL or HTTP executors based on runtime context.
@@ -325,7 +330,7 @@ function restRequest(configX) {
325
330
  switch (_a.label) {
326
331
  case 0:
327
332
  config = typeof configX === "function" ? configX() : configX;
328
- if (!(isNode && config.mysqlPool)) return [3 /*break*/, 2];
333
+ if (!(isNode() && config.mysqlPool)) return [3 /*break*/, 2];
329
334
  return [4 /*yield*/, Promise.resolve().then(function () { return SqlExecutor$1; })];
330
335
  case 1:
331
336
  SqlExecutor = (_a.sent()).SqlExecutor;
@@ -363,165 +368,6 @@ function timeout(shouldContinueAfterTimeout, cb, timeoutMs) {
363
368
  };
364
369
  }
365
370
 
366
- function buildBooleanJoinedConditions(set, andMode) {
367
- if (andMode === void 0) { andMode = true; }
368
- var booleanOperator = andMode ? 'AND' : 'OR';
369
- var sql = '';
370
- var OPERATORS = ['=', '!=', '<', '<=', '>', '>=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'IS', 'IS NOT'];
371
- var isAggregateArray = function (value) { return Array.isArray(value) && typeof value[0] === 'string' && OPERATORS.includes(value[0]); };
372
- var isNumericKeyed = function (obj) { return Array.isArray(obj) && Object.keys(obj).every(function (k) { return /^\d+$/.test(k); }); };
373
- // todo - we should be doing something with value no????
374
- var addCondition = function (column, op, _value) {
375
- var paramName = column.replace(/\W+/g, '_');
376
- return "(".concat(column, " ").concat(op, " :").concat(paramName, ")");
377
- };
378
- if (isNumericKeyed(set)) {
379
- switch (set.length) {
380
- case 2:
381
- sql += addCondition(set[0], '=', set[1]);
382
- break;
383
- case 3:
384
- if (!OPERATORS.includes(set[1])) {
385
- throw new Error("Invalid operator: ".concat(set[1]));
386
- }
387
- sql += addCondition(set[0], set[1], set[2]);
388
- break;
389
- default:
390
- throw new Error("Invalid array condition: ".concat(JSON.stringify(set)));
391
- }
392
- }
393
- else {
394
- var parts = [];
395
- for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
396
- var _b = _a[_i], key = _b[0], value = _b[1];
397
- if (/^\d+$/.test(key)) {
398
- parts.push(buildBooleanJoinedConditions(value, !andMode));
399
- continue;
400
- }
401
- if (!Array.isArray(value) || isAggregateArray(value)) {
402
- parts.push(addCondition(key, '='));
403
- continue;
404
- }
405
- if (value.length === 2 && OPERATORS.includes(value[0])) {
406
- parts.push(addCondition(key, value[0], value[1]));
407
- }
408
- else if (value.length === 1 && isAggregateArray(value[0])) {
409
- parts.push(addCondition(key, '=', value[0]));
410
- }
411
- else {
412
- throw new Error("Invalid condition for ".concat(key, ": ").concat(JSON.stringify(value)));
413
- }
414
- }
415
- sql = parts.join(" ".concat(booleanOperator, " "));
416
- }
417
- return "(".concat(sql, ")");
418
- }
419
- function buildAggregateField(field) {
420
- if (typeof field === 'string')
421
- return field;
422
- if (!Array.isArray(field))
423
- throw new Error('Invalid SELECT entry: must be string or array');
424
- var agg = field[0], args = field.slice(1);
425
- switch (agg) {
426
- case 'COUNT':
427
- return "COUNT(".concat(args[0] || '*', ")");
428
- case 'SUM':
429
- case 'AVG':
430
- case 'MIN':
431
- case 'MAX':
432
- return "".concat(agg, "(").concat(args[0], ")").concat(args[1] ? " AS ".concat(args[1]) : '');
433
- case 'DISTINCT':
434
- return "DISTINCT(".concat(args[0], ")").concat(args[1] ? " AS ".concat(args[1]) : '');
435
- case 'GROUP_CONCAT': {
436
- var col = args[0], alias = args[1], sortCol = args[2], sortType = args[3];
437
- var order = sortCol ? " ORDER BY ".concat(sortCol, " ").concat(sortType || 'ASC') : '';
438
- return "GROUP_CONCAT(DISTINCT ".concat(col).concat(order, " SEPARATOR ',')").concat(alias ? " AS ".concat(alias) : '');
439
- }
440
- case 'AS': {
441
- var col = args[0], alias = args[1];
442
- return "".concat(col, " AS ").concat(alias);
443
- }
444
- case 'CONVERT_TZ': {
445
- var ts = args[0], fromTz = args[1], toTz = args[2];
446
- return "CONVERT_TZ(".concat(ts, ", ").concat(fromTz, ", ").concat(toTz, ")");
447
- }
448
- case 'NOW':
449
- return 'NOW()';
450
- default:
451
- throw new Error("Unsupported aggregate: ".concat(agg));
452
- }
453
- }
454
- function buildSelectQuery(table, primary, args, isSubSelect) {
455
- var _a, _b;
456
- if (isSubSelect === void 0) { isSubSelect = false; }
457
- var selectList = (_a = args === null || args === void 0 ? void 0 : args[C6Constants.SELECT]) !== null && _a !== void 0 ? _a : ['*'];
458
- var selectFields = Array.isArray(selectList)
459
- ? selectList.map(function (f) { return buildAggregateField(f); }).join(', ')
460
- : '*';
461
- var sql = "SELECT ".concat(selectFields, " FROM `").concat(table, "`");
462
- if (args === null || args === void 0 ? void 0 : args[C6Constants.JOIN]) {
463
- var joins = args[C6Constants.JOIN];
464
- for (var joinType in joins) {
465
- var joinKeyword = joinType.replace('_', ' ').toUpperCase();
466
- for (var joinTable in joins[joinType]) {
467
- var onClause = buildBooleanJoinedConditions(joins[joinType][joinTable]);
468
- sql += " ".concat(joinKeyword, " JOIN `").concat(joinTable, "` ON ").concat(onClause);
469
- }
470
- }
471
- }
472
- if (args === null || args === void 0 ? void 0 : args[C6Constants.WHERE]) {
473
- sql += " WHERE ".concat(buildBooleanJoinedConditions(args[C6Constants.WHERE]));
474
- }
475
- if (args === null || args === void 0 ? void 0 : args[C6Constants.GROUP_BY]) {
476
- var groupByFields = Array.isArray(args[C6Constants.GROUP_BY]) ? args[C6Constants.GROUP_BY].join(', ') : args[C6Constants.GROUP_BY];
477
- sql += " GROUP BY ".concat(groupByFields);
478
- }
479
- if (args === null || args === void 0 ? void 0 : args[C6Constants.HAVING]) {
480
- sql += " HAVING ".concat(buildBooleanJoinedConditions(args[C6Constants.HAVING]));
481
- }
482
- if (args === null || args === void 0 ? void 0 : args[C6Constants.PAGINATION]) {
483
- var p = args[C6Constants.PAGINATION];
484
- var limitClause = '';
485
- if (p[C6Constants.ORDER]) {
486
- var orderArray = Object.entries(p[C6Constants.ORDER]).map(function (_a) {
487
- var col = _a[0], dir = _a[1];
488
- if (!['ASC', 'DESC'].includes(String(dir).toUpperCase())) {
489
- throw new Error("Invalid order direction: ".concat(dir));
490
- }
491
- return "".concat(col, " ").concat(String(dir).toUpperCase());
492
- });
493
- sql += " ORDER BY ".concat(orderArray.join(', '));
494
- }
495
- else if (primary) {
496
- sql += " ORDER BY ".concat(primary, " DESC");
497
- } /*else {
498
- // todo - this is wrong
499
- const primaryKey = C6Constants.TABLES['users'].PRIMARY_SHORT?.[0] ?? 'user_id';
500
- sql += ` ORDER BY ${primaryKey} DESC`;
501
- }*/
502
- if (p[C6Constants.LIMIT] != null) {
503
- var limit = parseInt(p[C6Constants.LIMIT], 10);
504
- if (isNaN(limit) || limit < 0) {
505
- throw new Error("Invalid LIMIT: ".concat(p[C6Constants.LIMIT]));
506
- }
507
- var page = parseInt((_b = p[C6Constants.PAGE]) !== null && _b !== void 0 ? _b : 1, 10);
508
- if (isNaN(page) || page < 1) {
509
- throw new Error("PAGE must be >= 1 (got ".concat(p[C6Constants.PAGE], ")"));
510
- }
511
- var offset = (page - 1) * limit;
512
- limitClause += " LIMIT ".concat(offset, ", ").concat(limit);
513
- }
514
- sql += limitClause;
515
- }
516
- else if (!isSubSelect && primary) {
517
- sql += " ORDER BY ".concat(primary, " ASC LIMIT 1");
518
- }
519
- else if (!isSubSelect && !primary) {
520
- sql += " ORDER BY id ASC LIMIT 100"; // fallback default limit
521
- }
522
- return sql;
523
- }
524
-
525
371
  function getEnvVar(key, fallback) {
526
372
  if (fallback === void 0) { fallback = ''; }
527
373
  // Vite-style injection
@@ -537,8 +383,10 @@ function getEnvVar(key, fallback) {
537
383
  return fallback;
538
384
  }
539
385
 
540
- var envVerbose = getEnvVar('VERBOSE') || getEnvVar('REACT_APP_VERBOSE') || getEnvVar('VITE_VERBOSE') || '';
541
- var isVerbose = ['true', '1', 'yes', 'on'].includes(envVerbose.toLowerCase());
386
+ function isVerbose () {
387
+ var envVerbose = getEnvVar('VERBOSE') || getEnvVar('REACT_APP_VERBOSE') || getEnvVar('VITE_VERBOSE') || '';
388
+ return ['true', '1', 'yes', 'on'].includes(envVerbose.toLowerCase());
389
+ }
542
390
 
543
391
  var Executor = /** @class */ (function () {
544
392
  function Executor(config, request) {
@@ -561,7 +409,7 @@ var Executor = /** @class */ (function () {
561
409
  if (!(_i < _a.length)) return [3 /*break*/, 6];
562
410
  _b = _a[_i], key = _b[0], fn = _b[1];
563
411
  if (!(typeof fn === "function")) return [3 /*break*/, 5];
564
- if (isVerbose || args.request.debug) {
412
+ if (isVerbose() || args.request.debug) {
565
413
  console.groupCollapsed("[LIFECYCLE] ".concat(this.config.requestMethod, ".").concat(String(phase), ":").concat(key));
566
414
  console.log("config:", args.config);
567
415
  console.log("request:", args.request);
@@ -592,11 +440,220 @@ var Executor = /** @class */ (function () {
592
440
  return Executor;
593
441
  }());
594
442
 
595
- var isDevelopment = getEnvVar('NODE_ENV', '') === 'development';
443
+ var SqlBuilder = /** @class */ (function (_super) {
444
+ tslib.__extends(SqlBuilder, _super);
445
+ function SqlBuilder() {
446
+ return _super !== null && _super.apply(this, arguments) || this;
447
+ }
448
+ /** Generate nested WHERE/JOIN conditions with parameter binding */
449
+ SqlBuilder.prototype.buildBooleanJoinedConditions = function (set, andMode, params) {
450
+ if (andMode === void 0) { andMode = true; }
451
+ if (params === void 0) { params = []; }
452
+ var booleanOperator = andMode ? 'AND' : 'OR';
453
+ var OPERATORS = ['=', '!=', '<', '<=', '>', '>=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'IS', 'IS NOT'];
454
+ var isAggregateArray = function (value) {
455
+ return Array.isArray(value) && typeof value[0] === 'string' && OPERATORS.includes(value[0]);
456
+ };
457
+ var isNumericKeyed = function (obj) {
458
+ return Array.isArray(obj) && Object.keys(obj).every(function (k) { return /^\d+$/.test(k); });
459
+ };
460
+ var addCondition = function (column, op, value) {
461
+ var clause;
462
+ /*if (Buffer.isBuffer(value)) { // TODO - I want this as a parameterized option, for now default to faster
463
+ params.push(value.toString('hex')); // Or use UNHEX(?) in SQL
464
+ clause = `(${column} = UNHEX(?))`;
465
+ } else {*/
466
+ params.push(value);
467
+ clause = "( ".concat(column, " ").concat(op, " ? )");
468
+ //}
469
+ isVerbose() && console.log("[WHERE] \u2795 ".concat(clause, " ->"), value);
470
+ return clause;
471
+ };
472
+ var sql;
473
+ if (isNumericKeyed(set)) {
474
+ isVerbose() && console.log("[WHERE] Numeric keyed condition:", set);
475
+ switch (set.length) {
476
+ case 2:
477
+ sql = addCondition(set[0], '=', set[1]);
478
+ break;
479
+ case 3:
480
+ if (!OPERATORS.includes(set[1]))
481
+ throw new Error("Invalid operator: ".concat(set[1]));
482
+ sql = addCondition(set[0], set[1], set[2]);
483
+ break;
484
+ default:
485
+ throw new Error("Invalid array condition: ".concat(JSON.stringify(set)));
486
+ }
487
+ }
488
+ else {
489
+ var parts = [];
490
+ for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
491
+ var _b = _a[_i], key = _b[0], value = _b[1];
492
+ if (/^\d+$/.test(key)) {
493
+ parts.push(this.buildBooleanJoinedConditions(value, !andMode, params));
494
+ }
495
+ else if (!Array.isArray(value) || isAggregateArray(value)) {
496
+ parts.push(addCondition(key, '=', value));
497
+ }
498
+ else if (value.length === 2 && OPERATORS.includes(value[0])) {
499
+ parts.push(addCondition(key, value[0], value[1]));
500
+ }
501
+ else {
502
+ throw new Error("Invalid condition for ".concat(key, ": ").concat(JSON.stringify(value)));
503
+ }
504
+ }
505
+ sql = parts.join(" ".concat(booleanOperator, " "));
506
+ }
507
+ isVerbose() && console.log("[WHERE] Final: (".concat(sql, ")"));
508
+ return "(".concat(sql, ")");
509
+ };
510
+ /** Translate array or function calls into SQL expressions */
511
+ SqlBuilder.prototype.buildAggregateField = function (field) {
512
+ if (typeof field === 'string')
513
+ return field;
514
+ if (!Array.isArray(field))
515
+ throw new Error('Invalid SELECT entry');
516
+ var fn = field[0], args = field.slice(1);
517
+ var alias;
518
+ if (args.length >= 2 && args[args.length - 2] === 'AS') {
519
+ alias = String(args.pop());
520
+ args.pop();
521
+ }
522
+ var F = String(fn).toUpperCase();
523
+ var p = args.join(', ');
524
+ isVerbose() && console.log("[SELECT] ".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : ''));
525
+ switch (F) {
526
+ case 'DATE_ADD':
527
+ return "DATE_ADD(".concat(args[0], ", ").concat(args[1], ")").concat(alias ? " AS ".concat(alias) : '');
528
+ case 'DATE_SUB':
529
+ return "DATE_SUB(".concat(args[0], ", ").concat(args[1], ")").concat(alias ? " AS ".concat(alias) : '');
530
+ case 'YEAR':
531
+ return "YEAR(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
532
+ case 'MONTH':
533
+ return "MONTH(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
534
+ case 'DAY':
535
+ return "DAY(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
536
+ case 'ROUND':
537
+ case 'CEIL':
538
+ case 'FLOOR':
539
+ case 'ABS':
540
+ case 'SQRT':
541
+ return "".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
542
+ case 'ST_DISTANCE':
543
+ return "ST_Distance(".concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
544
+ default:
545
+ if (/^[A-Z_]+$/.test(F))
546
+ return "".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
547
+ throw new Error("Unsupported function: ".concat(F));
548
+ }
549
+ };
550
+ /** Compose a parameterized SELECT query with optional JOIN/WHERE/GROUP/HAVING/PAGINATION */
551
+ SqlBuilder.prototype.buildSelectQuery = function (table, primary, args, isSubSelect) {
552
+ var _this = this;
553
+ var _a, _b, _c, _d;
554
+ if (isSubSelect === void 0) { isSubSelect = false; }
555
+ var model = this.config.C6.TABLES[table];
556
+ var params = [];
557
+ // SELECT
558
+ var selectList = (_a = args === null || args === void 0 ? void 0 : args[C6Constants.SELECT]) !== null && _a !== void 0 ? _a : ['*'];
559
+ var selectFields = Array.isArray(selectList)
560
+ ? selectList.map(function (f) { return _this.buildAggregateField(f); }).join(', ')
561
+ : '*';
562
+ var sql = "SELECT ".concat(selectFields, " FROM ").concat(table);
563
+ isVerbose() && console.log("[SELECT]", selectFields);
564
+ // JOIN
565
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.JOIN]) {
566
+ for (var jt in args[C6Constants.JOIN]) {
567
+ var jk = jt.replace('_', ' ').toUpperCase();
568
+ for (var jn in args[C6Constants.JOIN][jt]) {
569
+ var on = this.buildBooleanJoinedConditions(args[C6Constants.JOIN][jt][jn], true, params);
570
+ sql += " ".concat(jk, " JOIN `").concat(jn, "` ON ").concat(on);
571
+ isVerbose() && console.log("[JOIN]", jk, jn, on);
572
+ }
573
+ }
574
+ }
575
+ // WHERE
576
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.WHERE]) {
577
+ var wc = this.buildBooleanJoinedConditions(args[C6Constants.WHERE], true, params);
578
+ // Trim leading and trailing parentheses if they fully wrap the condition
579
+ while (wc.startsWith('(') && wc.endsWith(')')) {
580
+ wc = wc.slice(1, -1).trim();
581
+ }
582
+ sql += " WHERE ".concat(wc);
583
+ }
584
+ // GROUP BY
585
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.GROUP_BY]) {
586
+ var gb = Array.isArray(args[C6Constants.GROUP_BY])
587
+ ? args[C6Constants.GROUP_BY].join(', ')
588
+ : args[C6Constants.GROUP_BY];
589
+ sql += " GROUP BY ".concat(gb);
590
+ isVerbose() && console.log("[GROUP BY]", gb);
591
+ }
592
+ // HAVING
593
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.HAVING]) {
594
+ var hc = this.buildBooleanJoinedConditions(args[C6Constants.HAVING], true, params);
595
+ sql += " HAVING ".concat(hc);
596
+ }
597
+ // PAGINATION
598
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.PAGINATION]) {
599
+ var p = args[C6Constants.PAGINATION];
600
+ if (p[C6Constants.ORDER]) {
601
+ var ord = Object.entries(p[C6Constants.ORDER]).map(function (_a) {
602
+ var c = _a[0], d = _a[1];
603
+ return "".concat(c, " ").concat(String(d).toUpperCase());
604
+ });
605
+ sql += " ORDER BY ".concat(ord.join(', '));
606
+ isVerbose() && console.log("[ORDER BY]", ord);
607
+ }
608
+ if (p[C6Constants.LIMIT] != null) {
609
+ var lim = parseInt(p[C6Constants.LIMIT], 10);
610
+ var pg = parseInt((_b = p[C6Constants.PAGE]) !== null && _b !== void 0 ? _b : 1, 10);
611
+ var off = (pg - 1) * lim;
612
+ sql += " LIMIT ".concat(off, ", ").concat(lim);
613
+ isVerbose() && console.log("[LIMIT]", off, lim);
614
+ }
615
+ }
616
+ // Fallback ORDER/LIMIT
617
+ else if (!isSubSelect) {
618
+ var ok = void 0;
619
+ if (primary)
620
+ ok = primary;
621
+ else if ((_c = model === null || model === void 0 ? void 0 : model.PRIMARY_SHORT) === null || _c === void 0 ? void 0 : _c[0])
622
+ ok = model.PRIMARY_SHORT[0];
623
+ else
624
+ for (var _i = 0, _e = ['created_at', 'updated_at']; _i < _e.length; _i++) {
625
+ var ts = _e[_i];
626
+ if ((_d = model === null || model === void 0 ? void 0 : model.COLUMNS) === null || _d === void 0 ? void 0 : _d["".concat(table, ".").concat(ts)]) {
627
+ ok = ts;
628
+ break;
629
+ }
630
+ }
631
+ if (ok) {
632
+ var dir = primary ? 'ASC' : 'DESC';
633
+ var lim = primary ? 1 : 100;
634
+ sql += " ORDER BY ".concat(ok, " ").concat(dir, " LIMIT ").concat(lim);
635
+ isVerbose() && console.log("[ORDER]", ok, dir, lim);
636
+ }
637
+ else {
638
+ sql += " LIMIT 100";
639
+ isVerbose() && console.warn("[ORDER] fallback LIMIT 100");
640
+ }
641
+ }
642
+ isVerbose() && console.log("[SQL]", sql, params);
643
+ return { sql: sql, params: params };
644
+ };
645
+ return SqlBuilder;
646
+ }(Executor));
647
+
648
+ function isLocal () {
649
+ return getEnvVar('NODE_ENV', '') === 'development';
650
+ }
596
651
 
597
- var isTest = getEnvVar('JEST_WORKER_ID') || getEnvVar('NODE_ENV') === 'test'
598
- || getEnvVar('REACT_APP_TEST') === 'true' || getEnvVar('VITE_TEST') === 'true'
599
- || getEnvVar('MODE') === 'test' || getEnvVar('VITE_TEST_MODE') === 'true';
652
+ function isTest () {
653
+ return getEnvVar('JEST_WORKER_ID') || getEnvVar('NODE_ENV') === 'test'
654
+ || getEnvVar('REACT_APP_TEST') === 'true' || getEnvVar('VITE_TEST') === 'true'
655
+ || getEnvVar('MODE') === 'test' || getEnvVar('VITE_TEST_MODE') === 'true';
656
+ }
600
657
 
601
658
  exports.eFetchDependencies = void 0;
602
659
  (function (eFetchDependencies) {
@@ -676,7 +733,7 @@ function removeInvalidKeys(request, c6Tables) {
676
733
  intersection[key] = request[key];
677
734
  }
678
735
  });
679
- isTest || console.log('intersection', intersection);
736
+ isTest() || console.log('intersection', intersection);
680
737
  return intersection;
681
738
  }
682
739
 
@@ -701,7 +758,7 @@ function checkCache(cacheResult, requestMethod, tableName, request) {
701
758
  return cacheResult.request;
702
759
  }
703
760
  if (true === (cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.final)) {
704
- if (false === isTest || true === isVerbose) {
761
+ if (false === isTest() || true === isVerbose()) {
705
762
  console.groupCollapsed('%c API: Rest api cache (' + requestMethod + ' ' + tableName + ') has reached the final result. Returning undefined!', 'color: #cc0');
706
763
  console.log('%c ' + requestMethod + ' ' + tableName, 'color: #cc0');
707
764
  console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #cc0', request);
@@ -874,7 +931,7 @@ var HttpExecutor = /** @class */ (function (_super) {
874
931
  if (undefined !== cacheResult) return [3 /*break*/, 1];
875
932
  _p.label = 5;
876
933
  case 5:
877
- if (debug && isDevelopment) {
934
+ if (debug && isLocal()) {
878
935
  reactToastify.toast.warning("DEVS: Request in cache. (" + exports.apiRequestCache.findIndex(function (cache) { return cache.requestArgumentsSerialized === querySerialized; }) + "). Returning function to request page (" + query[C6.PAGINATION][C6.PAGE] + ")", toastOptionsDevs);
879
936
  }
880
937
  // @ts-ignore - this is an incorrect warning on TS, it's well typed
@@ -883,12 +940,12 @@ var HttpExecutor = /** @class */ (function (_super) {
883
940
  cachingConfirmed = true;
884
941
  return [3 /*break*/, 8];
885
942
  case 7:
886
- if (debug && isDevelopment) {
943
+ if (debug && isLocal()) {
887
944
  reactToastify.toast.info("DEVS: Ignore cache was set to true.", toastOptionsDevs);
888
945
  }
889
946
  _p.label = 8;
890
947
  case 8:
891
- if (debug && isDevelopment) {
948
+ if (debug && isLocal()) {
892
949
  reactToastify.toast.success("DEVS: Request not in cache." + (requestMethod === C6.GET ? "Page (" + query[C6.PAGINATION][C6.PAGE] + ")." : '') + " Logging cache 2 console.", toastOptionsDevs);
893
950
  }
894
951
  return [3 /*break*/, 12];
@@ -925,7 +982,7 @@ var HttpExecutor = /** @class */ (function (_super) {
925
982
  if (undefined === query
926
983
  || null === query
927
984
  || false === primaryKey in query) {
928
- if (true === debug && isDevelopment) {
985
+ if (true === debug && isLocal()) {
929
986
  reactToastify.toast.error('DEVS: The primary key (' + primaryKey + ') was not provided!!');
930
987
  }
931
988
  throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
@@ -1014,7 +1071,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1014
1071
  case 0:
1015
1072
  // noinspection SuspiciousTypeOfGuard
1016
1073
  if (typeof response.data === 'string') {
1017
- if (isTest) {
1074
+ if (isTest()) {
1018
1075
  console.trace();
1019
1076
  throw new Error('The response data was a string this typically indicated html was sent. Make sure all cookies (' + JSON.stringify(response.config.headers) + ') needed are present! (' + response.data + ')');
1020
1077
  }
@@ -1034,7 +1091,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1034
1091
  // todo - this feels dumb now, but i digress
1035
1092
  apiResponse = TestRestfulResponse(response, success, error);
1036
1093
  if (false === apiResponse) {
1037
- if (debug && isDevelopment) {
1094
+ if (debug && isLocal()) {
1038
1095
  reactToastify.toast.warning("DEVS: TestRestfulResponse returned false for (" + operatingTable + ").", toastOptionsDevs);
1039
1096
  }
1040
1097
  return [2 /*return*/, response];
@@ -1072,7 +1129,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1072
1129
  responseData_1 = response.data;
1073
1130
  returnGetNextPageFunction = 1 !== ((_d = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _d === void 0 ? void 0 : _d[C6.LIMIT]) &&
1074
1131
  ((_e = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _e === void 0 ? void 0 : _e[C6.LIMIT]) === responseData_1.rest.length;
1075
- if (false === isTest || true === isVerbose) {
1132
+ if (false === isTest() || true === isVerbose()) {
1076
1133
  console.groupCollapsed('%c API: Response (' + requestMethod + ' ' + tableName + ') returned length (' + ((_f = responseData_1.rest) === null || _f === void 0 ? void 0 : _f.length) + ') of possible (' + ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.LIMIT]) + ') limit!', 'color: #0c0');
1077
1134
  console.log('%c ' + requestMethod + ' ' + tableName, 'color: #0c0');
1078
1135
  console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #0c0', this.request);
@@ -1083,7 +1140,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1083
1140
  }
1084
1141
  if (false === returnGetNextPageFunction
1085
1142
  && true === debug
1086
- && isDevelopment) {
1143
+ && isLocal()) {
1087
1144
  reactToastify.toast.success("DEVS: Response returned length (" + ((_j = responseData_1.rest) === null || _j === void 0 ? void 0 : _j.length) + ") less than limit (" + ((_k = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _k === void 0 ? void 0 : _k[C6.LIMIT]) + ").", toastOptionsDevs);
1088
1145
  }
1089
1146
  if (!(fetchDependencies
@@ -1268,7 +1325,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1268
1325
  }); });
1269
1326
  _l.label = 6;
1270
1327
  case 6:
1271
- if (debug && isDevelopment) {
1328
+ if (debug && isLocal()) {
1272
1329
  reactToastify.toast.success("DEVS: (" + requestMethod + ") request complete.", toastOptionsDevs);
1273
1330
  }
1274
1331
  return [2 /*return*/, response];
@@ -1277,7 +1334,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1277
1334
  }); }).then(function (response) { return response.data; })];
1278
1335
  }
1279
1336
  catch (throwableError) {
1280
- if (isTest) {
1337
+ if (isTest()) {
1281
1338
  throw new Error(JSON.stringify(throwableError));
1282
1339
  }
1283
1340
  console.groupCollapsed('%c API: An error occurred in the try catch block. returning null!', 'color: #ff0000');
@@ -1313,13 +1370,16 @@ var SqlExecutor = /** @class */ (function (_super) {
1313
1370
  }
1314
1371
  SqlExecutor.prototype.execute = function () {
1315
1372
  return tslib.__awaiter(this, void 0, void 0, function () {
1316
- var _a, TABLE_NAME, PRIMARY, _b, rest, result, created, result, updated, result, deleted;
1317
- return tslib.__generator(this, function (_c) {
1318
- switch (_c.label) {
1373
+ var TABLE_NAME, method, _a, rest, result, created, result, updated, result, deleted;
1374
+ return tslib.__generator(this, function (_b) {
1375
+ switch (_b.label) {
1319
1376
  case 0:
1320
- _a = this.config.restModel, TABLE_NAME = _a.TABLE_NAME, PRIMARY = _a.PRIMARY;
1321
- _b = this.config.requestMethod;
1322
- switch (_b) {
1377
+ TABLE_NAME = this.config.restModel.TABLE_NAME;
1378
+ method = this.config.requestMethod;
1379
+ console.log("[SQL EXECUTOR] \u25B6\uFE0F Executing ".concat(method, " on table \"").concat(TABLE_NAME, "\""));
1380
+ console.log("[SQL EXECUTOR] \uD83E\uDDFE Request payload:", this.request);
1381
+ _a = method;
1382
+ switch (_a) {
1323
1383
  case 'GET': return [3 /*break*/, 1];
1324
1384
  case 'POST': return [3 /*break*/, 3];
1325
1385
  case 'PUT': return [3 /*break*/, 5];
@@ -1328,24 +1388,36 @@ var SqlExecutor = /** @class */ (function (_super) {
1328
1388
  return [3 /*break*/, 9];
1329
1389
  case 1: return [4 /*yield*/, this.select(TABLE_NAME, undefined, this.request)];
1330
1390
  case 2:
1331
- rest = _c.sent();
1391
+ rest = _b.sent();
1392
+ console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1332
1393
  return [2 /*return*/, { rest: rest }];
1333
1394
  case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1334
1395
  case 4:
1335
- result = _c.sent();
1396
+ result = _b.sent();
1397
+ console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1336
1398
  created = { rest: result, created: true };
1337
1399
  return [2 /*return*/, created];
1338
- case 5: return [4 /*yield*/, this.update(TABLE_NAME, PRIMARY, this.request)];
1400
+ case 5: return [4 /*yield*/, this.update(TABLE_NAME, [], this.request)];
1339
1401
  case 6:
1340
- result = _c.sent();
1341
- updated = { rest: result, updated: true, rowCount: result.affectedRows };
1402
+ result = _b.sent();
1403
+ console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
1404
+ updated = {
1405
+ rest: result,
1406
+ updated: true,
1407
+ rowCount: result.affectedRows
1408
+ };
1342
1409
  return [2 /*return*/, updated];
1343
- case 7: return [4 /*yield*/, this.delete(TABLE_NAME, PRIMARY, this.request)];
1410
+ case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1344
1411
  case 8:
1345
- result = _c.sent();
1346
- deleted = { rest: result, deleted: true, rowCount: result.affectedRows };
1412
+ result = _b.sent();
1413
+ console.log("[SQL EXECUTOR] \u2705 DELETE result:", result);
1414
+ deleted = {
1415
+ rest: result,
1416
+ deleted: true,
1417
+ rowCount: result.affectedRows
1418
+ };
1347
1419
  return [2 /*return*/, deleted];
1348
- case 9: throw new Error("Unsupported request method: ".concat(this.config.requestMethod));
1420
+ case 9: throw new Error("Unsupported request method: ".concat(method));
1349
1421
  }
1350
1422
  });
1351
1423
  });
@@ -1355,15 +1427,19 @@ var SqlExecutor = /** @class */ (function (_super) {
1355
1427
  var conn;
1356
1428
  return tslib.__generator(this, function (_a) {
1357
1429
  switch (_a.label) {
1358
- case 0: return [4 /*yield*/, this.config.mysqlPool.getConnection()];
1430
+ case 0:
1431
+ console.log("[SQL EXECUTOR] \uD83D\uDCE1 Getting DB connection");
1432
+ return [4 /*yield*/, this.config.mysqlPool.getConnection()];
1359
1433
  case 1:
1360
1434
  conn = _a.sent();
1361
1435
  _a.label = 2;
1362
1436
  case 2:
1363
1437
  _a.trys.push([2, , 4, 5]);
1438
+ console.log("[SQL EXECUTOR] \u2705 Connection acquired");
1364
1439
  return [4 /*yield*/, cb(conn)];
1365
1440
  case 3: return [2 /*return*/, _a.sent()];
1366
1441
  case 4:
1442
+ console.log("[SQL EXECUTOR] \uD83D\uDD0C Releasing DB connection");
1367
1443
  conn.release();
1368
1444
  return [7 /*endfinally*/];
1369
1445
  case 5: return [2 /*return*/];
@@ -1373,21 +1449,23 @@ var SqlExecutor = /** @class */ (function (_super) {
1373
1449
  };
1374
1450
  SqlExecutor.prototype.select = function (table, primary, args) {
1375
1451
  return tslib.__awaiter(this, void 0, void 0, function () {
1376
- var sql;
1452
+ var sql, formatted;
1377
1453
  var _this = this;
1378
1454
  return tslib.__generator(this, function (_a) {
1379
1455
  switch (_a.label) {
1380
1456
  case 0:
1381
- sql = buildSelectQuery(table, primary, args);
1457
+ sql = this.buildSelectQuery(table, primary, args);
1458
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:", sql);
1459
+ formatted = this.formatSQLWithParams(sql.sql, sql.params);
1460
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted SELECT SQL:", formatted);
1382
1461
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1383
1462
  var rows;
1384
1463
  return tslib.__generator(this, function (_a) {
1385
1464
  switch (_a.label) {
1386
- case 0:
1387
- console.log(sql);
1388
- return [4 /*yield*/, conn.query(sql)];
1465
+ case 0: return [4 /*yield*/, conn.query(sql.sql, sql.params)];
1389
1466
  case 1:
1390
1467
  rows = (_a.sent())[0];
1468
+ console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
1391
1469
  return [2 /*return*/, rows];
1392
1470
  }
1393
1471
  });
@@ -1408,6 +1486,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1408
1486
  values = keys.map(function (k) { return data[k]; });
1409
1487
  placeholders = keys.map(function () { return '?'; }).join(', ');
1410
1488
  sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ") VALUES (").concat(placeholders, ")");
1489
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
1490
+ console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1411
1491
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1412
1492
  var result;
1413
1493
  return tslib.__generator(this, function (_a) {
@@ -1438,6 +1518,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1438
1518
  updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1439
1519
  sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary[0], "` = ?");
1440
1520
  values.push(data[primary[0]]);
1521
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated UPDATE SQL:", sql);
1522
+ console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1441
1523
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1442
1524
  var result;
1443
1525
  return tslib.__generator(this, function (_a) {
@@ -1465,6 +1547,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1465
1547
  if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1466
1548
  throw new Error('Primary key and value required for delete');
1467
1549
  sql = "DELETE FROM `".concat(table, "` WHERE `").concat(key, "` = ?");
1550
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated DELETE SQL:", sql);
1551
+ console.log("[SQL EXECUTOR] \uD83D\uDD22 Value:", args[key]);
1468
1552
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1469
1553
  var result;
1470
1554
  return tslib.__generator(this, function (_a) {
@@ -1481,8 +1565,27 @@ var SqlExecutor = /** @class */ (function (_super) {
1481
1565
  });
1482
1566
  });
1483
1567
  };
1568
+ SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
1569
+ var index = 0;
1570
+ return sql.replace(/\?/g, function () {
1571
+ if (index >= params.length)
1572
+ return '?'; // fallback if params are missing
1573
+ var val = params[index++];
1574
+ if (val === null || val === undefined)
1575
+ return 'NULL';
1576
+ if (Buffer.isBuffer(val))
1577
+ return "UNHEX('".concat(val.toString('hex'), "')");
1578
+ if (typeof val === 'string')
1579
+ return "'".concat(val.replace(/'/g, "''"), "'");
1580
+ if (typeof val === 'number')
1581
+ return val.toString();
1582
+ if (val instanceof Date)
1583
+ return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1584
+ return "'".concat(JSON.stringify(val), "'");
1585
+ });
1586
+ };
1484
1587
  return SqlExecutor;
1485
- }(Executor));
1588
+ }(SqlBuilder));
1486
1589
 
1487
1590
  var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
1488
1591
  __proto__: null,
@@ -1593,7 +1696,7 @@ function getPrimaryKeyTypes(table) {
1593
1696
  * Conditionally group a log if verbose.
1594
1697
  */
1595
1698
  function group(title, data) {
1596
- if (!isVerbose)
1699
+ if (!isVerbose())
1597
1700
  return;
1598
1701
  console.groupCollapsed("%c".concat(title), "color: #007acc");
1599
1702
  if (data !== undefined)
@@ -1605,7 +1708,7 @@ function info(message) {
1605
1708
  for (var _i = 1; _i < arguments.length; _i++) {
1606
1709
  optional[_i - 1] = arguments[_i];
1607
1710
  }
1608
- if (!isVerbose)
1711
+ if (!isVerbose())
1609
1712
  return;
1610
1713
  console.info.apply(console, tslib.__spreadArray(["%cINFO: ".concat(message), "color: #0a0"], optional, false));
1611
1714
  }
@@ -1638,10 +1741,10 @@ function checkAllRequestsComplete() {
1638
1741
  }
1639
1742
 
1640
1743
  function onSuccess(message) {
1641
- reactToastify.toast.success(message, isDevelopment ? toastOptionsDevs : toastOptions);
1744
+ reactToastify.toast.success(message, isLocal() ? toastOptionsDevs : toastOptions);
1642
1745
  }
1643
1746
  function onError(message) {
1644
- reactToastify.toast.error(message, isDevelopment ? toastOptionsDevs : toastOptions);
1747
+ reactToastify.toast.error(message, isLocal() ? toastOptionsDevs : toastOptions);
1645
1748
  }
1646
1749
 
1647
1750
  exports.C6Constants = C6Constants;
@@ -1652,12 +1755,10 @@ exports.GET = GET;
1652
1755
  exports.HttpExecutor = HttpExecutor;
1653
1756
  exports.POST = POST;
1654
1757
  exports.PUT = PUT;
1758
+ exports.SqlBuilder = SqlBuilder;
1655
1759
  exports.SqlExecutor = SqlExecutor;
1656
1760
  exports.TestRestfulResponse = TestRestfulResponse;
1657
1761
  exports.axiosInstance = axiosInstance;
1658
- exports.buildAggregateField = buildAggregateField;
1659
- exports.buildBooleanJoinedConditions = buildBooleanJoinedConditions;
1660
- exports.buildSelectQuery = buildSelectQuery;
1661
1762
  exports.checkAllRequestsComplete = checkAllRequestsComplete;
1662
1763
  exports.checkCache = checkCache;
1663
1764
  exports.clearCache = clearCache;
@@ -1668,7 +1769,7 @@ exports.getEnvVar = getEnvVar;
1668
1769
  exports.getPrimaryKeyTypes = getPrimaryKeyTypes;
1669
1770
  exports.group = group;
1670
1771
  exports.info = info;
1671
- exports.isLocal = isDevelopment;
1772
+ exports.isLocal = isLocal;
1672
1773
  exports.isNode = isNode;
1673
1774
  exports.isTest = isTest;
1674
1775
  exports.isVerbose = isVerbose;