@carbonorm/carbonnode 3.0.11 → 3.0.13

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,7 +311,13 @@ function convertForRequestBody (restfulObject, tableName, C6, regexErrorHandler)
311
311
  }, {});
312
312
  }
313
313
 
314
- var isNode = function () { var _a; return 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
+ };
315
321
 
316
322
  /**
317
323
  * Facade: routes API calls to SQL or HTTP executors based on runtime context.
@@ -362,165 +368,6 @@ function timeout(shouldContinueAfterTimeout, cb, timeoutMs) {
362
368
  };
363
369
  }
364
370
 
365
- function buildBooleanJoinedConditions(set, andMode) {
366
- if (andMode === void 0) { andMode = true; }
367
- var booleanOperator = andMode ? 'AND' : 'OR';
368
- var sql = '';
369
- var OPERATORS = ['=', '!=', '<', '<=', '>', '>=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'IS', 'IS NOT'];
370
- var isAggregateArray = function (value) { return Array.isArray(value) && typeof value[0] === 'string' && OPERATORS.includes(value[0]); };
371
- var isNumericKeyed = function (obj) { return Array.isArray(obj) && Object.keys(obj).every(function (k) { return /^\d+$/.test(k); }); };
372
- // todo - we should be doing something with value no????
373
- var addCondition = function (column, op, _value) {
374
- var paramName = column.replace(/\W+/g, '_');
375
- return "(".concat(column, " ").concat(op, " :").concat(paramName, ")");
376
- };
377
- if (isNumericKeyed(set)) {
378
- switch (set.length) {
379
- case 2:
380
- sql += addCondition(set[0], '=', set[1]);
381
- break;
382
- case 3:
383
- if (!OPERATORS.includes(set[1])) {
384
- throw new Error("Invalid operator: ".concat(set[1]));
385
- }
386
- sql += addCondition(set[0], set[1], set[2]);
387
- break;
388
- default:
389
- throw new Error("Invalid array condition: ".concat(JSON.stringify(set)));
390
- }
391
- }
392
- else {
393
- var parts = [];
394
- for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
395
- var _b = _a[_i], key = _b[0], value = _b[1];
396
- if (/^\d+$/.test(key)) {
397
- parts.push(buildBooleanJoinedConditions(value, !andMode));
398
- continue;
399
- }
400
- if (!Array.isArray(value) || isAggregateArray(value)) {
401
- parts.push(addCondition(key, '='));
402
- continue;
403
- }
404
- if (value.length === 2 && OPERATORS.includes(value[0])) {
405
- parts.push(addCondition(key, value[0], value[1]));
406
- }
407
- else if (value.length === 1 && isAggregateArray(value[0])) {
408
- parts.push(addCondition(key, '=', value[0]));
409
- }
410
- else {
411
- throw new Error("Invalid condition for ".concat(key, ": ").concat(JSON.stringify(value)));
412
- }
413
- }
414
- sql = parts.join(" ".concat(booleanOperator, " "));
415
- }
416
- return "(".concat(sql, ")");
417
- }
418
- function buildAggregateField(field) {
419
- if (typeof field === 'string')
420
- return field;
421
- if (!Array.isArray(field))
422
- throw new Error('Invalid SELECT entry: must be string or array');
423
- var agg = field[0], args = field.slice(1);
424
- switch (agg) {
425
- case 'COUNT':
426
- return "COUNT(".concat(args[0] || '*', ")");
427
- case 'SUM':
428
- case 'AVG':
429
- case 'MIN':
430
- case 'MAX':
431
- return "".concat(agg, "(").concat(args[0], ")").concat(args[1] ? " AS ".concat(args[1]) : '');
432
- case 'DISTINCT':
433
- return "DISTINCT(".concat(args[0], ")").concat(args[1] ? " AS ".concat(args[1]) : '');
434
- case 'GROUP_CONCAT': {
435
- var col = args[0], alias = args[1], sortCol = args[2], sortType = args[3];
436
- var order = sortCol ? " ORDER BY ".concat(sortCol, " ").concat(sortType || 'ASC') : '';
437
- return "GROUP_CONCAT(DISTINCT ".concat(col).concat(order, " SEPARATOR ',')").concat(alias ? " AS ".concat(alias) : '');
438
- }
439
- case 'AS': {
440
- var col = args[0], alias = args[1];
441
- return "".concat(col, " AS ").concat(alias);
442
- }
443
- case 'CONVERT_TZ': {
444
- var ts = args[0], fromTz = args[1], toTz = args[2];
445
- return "CONVERT_TZ(".concat(ts, ", ").concat(fromTz, ", ").concat(toTz, ")");
446
- }
447
- case 'NOW':
448
- return 'NOW()';
449
- default:
450
- throw new Error("Unsupported aggregate: ".concat(agg));
451
- }
452
- }
453
- function buildSelectQuery(table, primary, args, isSubSelect) {
454
- var _a, _b;
455
- if (isSubSelect === void 0) { isSubSelect = false; }
456
- var selectList = (_a = args === null || args === void 0 ? void 0 : args[C6Constants.SELECT]) !== null && _a !== void 0 ? _a : ['*'];
457
- var selectFields = Array.isArray(selectList)
458
- ? selectList.map(function (f) { return buildAggregateField(f); }).join(', ')
459
- : '*';
460
- var sql = "SELECT ".concat(selectFields, " FROM `").concat(table, "`");
461
- if (args === null || args === void 0 ? void 0 : args[C6Constants.JOIN]) {
462
- var joins = args[C6Constants.JOIN];
463
- for (var joinType in joins) {
464
- var joinKeyword = joinType.replace('_', ' ').toUpperCase();
465
- for (var joinTable in joins[joinType]) {
466
- var onClause = buildBooleanJoinedConditions(joins[joinType][joinTable]);
467
- sql += " ".concat(joinKeyword, " JOIN `").concat(joinTable, "` ON ").concat(onClause);
468
- }
469
- }
470
- }
471
- if (args === null || args === void 0 ? void 0 : args[C6Constants.WHERE]) {
472
- sql += " WHERE ".concat(buildBooleanJoinedConditions(args[C6Constants.WHERE]));
473
- }
474
- if (args === null || args === void 0 ? void 0 : args[C6Constants.GROUP_BY]) {
475
- var groupByFields = Array.isArray(args[C6Constants.GROUP_BY]) ? args[C6Constants.GROUP_BY].join(', ') : args[C6Constants.GROUP_BY];
476
- sql += " GROUP BY ".concat(groupByFields);
477
- }
478
- if (args === null || args === void 0 ? void 0 : args[C6Constants.HAVING]) {
479
- sql += " HAVING ".concat(buildBooleanJoinedConditions(args[C6Constants.HAVING]));
480
- }
481
- if (args === null || args === void 0 ? void 0 : args[C6Constants.PAGINATION]) {
482
- var p = args[C6Constants.PAGINATION];
483
- var limitClause = '';
484
- if (p[C6Constants.ORDER]) {
485
- var orderArray = Object.entries(p[C6Constants.ORDER]).map(function (_a) {
486
- var col = _a[0], dir = _a[1];
487
- if (!['ASC', 'DESC'].includes(String(dir).toUpperCase())) {
488
- throw new Error("Invalid order direction: ".concat(dir));
489
- }
490
- return "".concat(col, " ").concat(String(dir).toUpperCase());
491
- });
492
- sql += " ORDER BY ".concat(orderArray.join(', '));
493
- }
494
- else if (primary) {
495
- sql += " ORDER BY ".concat(primary, " DESC");
496
- } /*else {
497
- // todo - this is wrong
498
- const primaryKey = C6Constants.TABLES['users'].PRIMARY_SHORT?.[0] ?? 'user_id';
499
- sql += ` ORDER BY ${primaryKey} DESC`;
500
- }*/
501
- if (p[C6Constants.LIMIT] != null) {
502
- var limit = parseInt(p[C6Constants.LIMIT], 10);
503
- if (isNaN(limit) || limit < 0) {
504
- throw new Error("Invalid LIMIT: ".concat(p[C6Constants.LIMIT]));
505
- }
506
- var page = parseInt((_b = p[C6Constants.PAGE]) !== null && _b !== void 0 ? _b : 1, 10);
507
- if (isNaN(page) || page < 1) {
508
- throw new Error("PAGE must be >= 1 (got ".concat(p[C6Constants.PAGE], ")"));
509
- }
510
- var offset = (page - 1) * limit;
511
- limitClause += " LIMIT ".concat(offset, ", ").concat(limit);
512
- }
513
- sql += limitClause;
514
- }
515
- else if (!isSubSelect && primary) {
516
- sql += " ORDER BY ".concat(primary, " ASC LIMIT 1");
517
- }
518
- else if (!isSubSelect && !primary) {
519
- sql += " ORDER BY id ASC LIMIT 100"; // fallback default limit
520
- }
521
- return sql;
522
- }
523
-
524
371
  function getEnvVar(key, fallback) {
525
372
  if (fallback === void 0) { fallback = ''; }
526
373
  // Vite-style injection
@@ -536,8 +383,10 @@ function getEnvVar(key, fallback) {
536
383
  return fallback;
537
384
  }
538
385
 
539
- var envVerbose = getEnvVar('VERBOSE') || getEnvVar('REACT_APP_VERBOSE') || getEnvVar('VITE_VERBOSE') || '';
540
- 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
+ }
541
390
 
542
391
  var Executor = /** @class */ (function () {
543
392
  function Executor(config, request) {
@@ -560,7 +409,7 @@ var Executor = /** @class */ (function () {
560
409
  if (!(_i < _a.length)) return [3 /*break*/, 6];
561
410
  _b = _a[_i], key = _b[0], fn = _b[1];
562
411
  if (!(typeof fn === "function")) return [3 /*break*/, 5];
563
- if (isVerbose || args.request.debug) {
412
+ if (isVerbose() || args.request.debug) {
564
413
  console.groupCollapsed("[LIFECYCLE] ".concat(this.config.requestMethod, ".").concat(String(phase), ":").concat(key));
565
414
  console.log("config:", args.config);
566
415
  console.log("request:", args.request);
@@ -591,11 +440,220 @@ var Executor = /** @class */ (function () {
591
440
  return Executor;
592
441
  }());
593
442
 
594
- 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
+ }
595
651
 
596
- var isTest = getEnvVar('JEST_WORKER_ID') || getEnvVar('NODE_ENV') === 'test'
597
- || getEnvVar('REACT_APP_TEST') === 'true' || getEnvVar('VITE_TEST') === 'true'
598
- || 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
+ }
599
657
 
600
658
  exports.eFetchDependencies = void 0;
601
659
  (function (eFetchDependencies) {
@@ -675,7 +733,7 @@ function removeInvalidKeys(request, c6Tables) {
675
733
  intersection[key] = request[key];
676
734
  }
677
735
  });
678
- isTest || console.log('intersection', intersection);
736
+ isTest() || console.log('intersection', intersection);
679
737
  return intersection;
680
738
  }
681
739
 
@@ -700,7 +758,7 @@ function checkCache(cacheResult, requestMethod, tableName, request) {
700
758
  return cacheResult.request;
701
759
  }
702
760
  if (true === (cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.final)) {
703
- if (false === isTest || true === isVerbose) {
761
+ if (false === isTest() || true === isVerbose()) {
704
762
  console.groupCollapsed('%c API: Rest api cache (' + requestMethod + ' ' + tableName + ') has reached the final result. Returning undefined!', 'color: #cc0');
705
763
  console.log('%c ' + requestMethod + ' ' + tableName, 'color: #cc0');
706
764
  console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #cc0', request);
@@ -873,7 +931,7 @@ var HttpExecutor = /** @class */ (function (_super) {
873
931
  if (undefined !== cacheResult) return [3 /*break*/, 1];
874
932
  _p.label = 5;
875
933
  case 5:
876
- if (debug && isDevelopment) {
934
+ if (debug && isLocal()) {
877
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);
878
936
  }
879
937
  // @ts-ignore - this is an incorrect warning on TS, it's well typed
@@ -882,12 +940,12 @@ var HttpExecutor = /** @class */ (function (_super) {
882
940
  cachingConfirmed = true;
883
941
  return [3 /*break*/, 8];
884
942
  case 7:
885
- if (debug && isDevelopment) {
943
+ if (debug && isLocal()) {
886
944
  reactToastify.toast.info("DEVS: Ignore cache was set to true.", toastOptionsDevs);
887
945
  }
888
946
  _p.label = 8;
889
947
  case 8:
890
- if (debug && isDevelopment) {
948
+ if (debug && isLocal()) {
891
949
  reactToastify.toast.success("DEVS: Request not in cache." + (requestMethod === C6.GET ? "Page (" + query[C6.PAGINATION][C6.PAGE] + ")." : '') + " Logging cache 2 console.", toastOptionsDevs);
892
950
  }
893
951
  return [3 /*break*/, 12];
@@ -924,7 +982,7 @@ var HttpExecutor = /** @class */ (function (_super) {
924
982
  if (undefined === query
925
983
  || null === query
926
984
  || false === primaryKey in query) {
927
- if (true === debug && isDevelopment) {
985
+ if (true === debug && isLocal()) {
928
986
  reactToastify.toast.error('DEVS: The primary key (' + primaryKey + ') was not provided!!');
929
987
  }
930
988
  throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
@@ -1013,7 +1071,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1013
1071
  case 0:
1014
1072
  // noinspection SuspiciousTypeOfGuard
1015
1073
  if (typeof response.data === 'string') {
1016
- if (isTest) {
1074
+ if (isTest()) {
1017
1075
  console.trace();
1018
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 + ')');
1019
1077
  }
@@ -1033,7 +1091,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1033
1091
  // todo - this feels dumb now, but i digress
1034
1092
  apiResponse = TestRestfulResponse(response, success, error);
1035
1093
  if (false === apiResponse) {
1036
- if (debug && isDevelopment) {
1094
+ if (debug && isLocal()) {
1037
1095
  reactToastify.toast.warning("DEVS: TestRestfulResponse returned false for (" + operatingTable + ").", toastOptionsDevs);
1038
1096
  }
1039
1097
  return [2 /*return*/, response];
@@ -1071,7 +1129,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1071
1129
  responseData_1 = response.data;
1072
1130
  returnGetNextPageFunction = 1 !== ((_d = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _d === void 0 ? void 0 : _d[C6.LIMIT]) &&
1073
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;
1074
- if (false === isTest || true === isVerbose) {
1132
+ if (false === isTest() || true === isVerbose()) {
1075
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');
1076
1134
  console.log('%c ' + requestMethod + ' ' + tableName, 'color: #0c0');
1077
1135
  console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #0c0', this.request);
@@ -1082,7 +1140,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1082
1140
  }
1083
1141
  if (false === returnGetNextPageFunction
1084
1142
  && true === debug
1085
- && isDevelopment) {
1143
+ && isLocal()) {
1086
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);
1087
1145
  }
1088
1146
  if (!(fetchDependencies
@@ -1267,7 +1325,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1267
1325
  }); });
1268
1326
  _l.label = 6;
1269
1327
  case 6:
1270
- if (debug && isDevelopment) {
1328
+ if (debug && isLocal()) {
1271
1329
  reactToastify.toast.success("DEVS: (" + requestMethod + ") request complete.", toastOptionsDevs);
1272
1330
  }
1273
1331
  return [2 /*return*/, response];
@@ -1276,7 +1334,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1276
1334
  }); }).then(function (response) { return response.data; })];
1277
1335
  }
1278
1336
  catch (throwableError) {
1279
- if (isTest) {
1337
+ if (isTest()) {
1280
1338
  throw new Error(JSON.stringify(throwableError));
1281
1339
  }
1282
1340
  console.groupCollapsed('%c API: An error occurred in the try catch block. returning null!', 'color: #ff0000');
@@ -1312,13 +1370,16 @@ var SqlExecutor = /** @class */ (function (_super) {
1312
1370
  }
1313
1371
  SqlExecutor.prototype.execute = function () {
1314
1372
  return tslib.__awaiter(this, void 0, void 0, function () {
1315
- var _a, TABLE_NAME, PRIMARY, _b, rest, result, created, result, updated, result, deleted;
1316
- return tslib.__generator(this, function (_c) {
1317
- 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) {
1318
1376
  case 0:
1319
- _a = this.config.restModel, TABLE_NAME = _a.TABLE_NAME, PRIMARY = _a.PRIMARY;
1320
- _b = this.config.requestMethod;
1321
- 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) {
1322
1383
  case 'GET': return [3 /*break*/, 1];
1323
1384
  case 'POST': return [3 /*break*/, 3];
1324
1385
  case 'PUT': return [3 /*break*/, 5];
@@ -1327,24 +1388,36 @@ var SqlExecutor = /** @class */ (function (_super) {
1327
1388
  return [3 /*break*/, 9];
1328
1389
  case 1: return [4 /*yield*/, this.select(TABLE_NAME, undefined, this.request)];
1329
1390
  case 2:
1330
- rest = _c.sent();
1391
+ rest = _b.sent();
1392
+ console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1331
1393
  return [2 /*return*/, { rest: rest }];
1332
1394
  case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1333
1395
  case 4:
1334
- result = _c.sent();
1396
+ result = _b.sent();
1397
+ console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1335
1398
  created = { rest: result, created: true };
1336
1399
  return [2 /*return*/, created];
1337
- case 5: return [4 /*yield*/, this.update(TABLE_NAME, PRIMARY, this.request)];
1400
+ case 5: return [4 /*yield*/, this.update(TABLE_NAME, [], this.request)];
1338
1401
  case 6:
1339
- result = _c.sent();
1340
- 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
+ };
1341
1409
  return [2 /*return*/, updated];
1342
- case 7: return [4 /*yield*/, this.delete(TABLE_NAME, PRIMARY, this.request)];
1410
+ case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1343
1411
  case 8:
1344
- result = _c.sent();
1345
- 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
+ };
1346
1419
  return [2 /*return*/, deleted];
1347
- case 9: throw new Error("Unsupported request method: ".concat(this.config.requestMethod));
1420
+ case 9: throw new Error("Unsupported request method: ".concat(method));
1348
1421
  }
1349
1422
  });
1350
1423
  });
@@ -1354,15 +1427,19 @@ var SqlExecutor = /** @class */ (function (_super) {
1354
1427
  var conn;
1355
1428
  return tslib.__generator(this, function (_a) {
1356
1429
  switch (_a.label) {
1357
- 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()];
1358
1433
  case 1:
1359
1434
  conn = _a.sent();
1360
1435
  _a.label = 2;
1361
1436
  case 2:
1362
1437
  _a.trys.push([2, , 4, 5]);
1438
+ console.log("[SQL EXECUTOR] \u2705 Connection acquired");
1363
1439
  return [4 /*yield*/, cb(conn)];
1364
1440
  case 3: return [2 /*return*/, _a.sent()];
1365
1441
  case 4:
1442
+ console.log("[SQL EXECUTOR] \uD83D\uDD0C Releasing DB connection");
1366
1443
  conn.release();
1367
1444
  return [7 /*endfinally*/];
1368
1445
  case 5: return [2 /*return*/];
@@ -1372,21 +1449,23 @@ var SqlExecutor = /** @class */ (function (_super) {
1372
1449
  };
1373
1450
  SqlExecutor.prototype.select = function (table, primary, args) {
1374
1451
  return tslib.__awaiter(this, void 0, void 0, function () {
1375
- var sql;
1452
+ var sql, formatted;
1376
1453
  var _this = this;
1377
1454
  return tslib.__generator(this, function (_a) {
1378
1455
  switch (_a.label) {
1379
1456
  case 0:
1380
- 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);
1381
1461
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1382
1462
  var rows;
1383
1463
  return tslib.__generator(this, function (_a) {
1384
1464
  switch (_a.label) {
1385
- case 0:
1386
- console.log(sql);
1387
- return [4 /*yield*/, conn.query(sql)];
1465
+ case 0: return [4 /*yield*/, conn.query(sql.sql, sql.params)];
1388
1466
  case 1:
1389
1467
  rows = (_a.sent())[0];
1468
+ console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
1390
1469
  return [2 /*return*/, rows];
1391
1470
  }
1392
1471
  });
@@ -1407,6 +1486,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1407
1486
  values = keys.map(function (k) { return data[k]; });
1408
1487
  placeholders = keys.map(function () { return '?'; }).join(', ');
1409
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);
1410
1491
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1411
1492
  var result;
1412
1493
  return tslib.__generator(this, function (_a) {
@@ -1437,6 +1518,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1437
1518
  updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1438
1519
  sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary[0], "` = ?");
1439
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);
1440
1523
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1441
1524
  var result;
1442
1525
  return tslib.__generator(this, function (_a) {
@@ -1464,6 +1547,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1464
1547
  if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1465
1548
  throw new Error('Primary key and value required for delete');
1466
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]);
1467
1552
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1468
1553
  var result;
1469
1554
  return tslib.__generator(this, function (_a) {
@@ -1480,8 +1565,27 @@ var SqlExecutor = /** @class */ (function (_super) {
1480
1565
  });
1481
1566
  });
1482
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
+ };
1483
1587
  return SqlExecutor;
1484
- }(Executor));
1588
+ }(SqlBuilder));
1485
1589
 
1486
1590
  var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
1487
1591
  __proto__: null,
@@ -1592,7 +1696,7 @@ function getPrimaryKeyTypes(table) {
1592
1696
  * Conditionally group a log if verbose.
1593
1697
  */
1594
1698
  function group(title, data) {
1595
- if (!isVerbose)
1699
+ if (!isVerbose())
1596
1700
  return;
1597
1701
  console.groupCollapsed("%c".concat(title), "color: #007acc");
1598
1702
  if (data !== undefined)
@@ -1604,7 +1708,7 @@ function info(message) {
1604
1708
  for (var _i = 1; _i < arguments.length; _i++) {
1605
1709
  optional[_i - 1] = arguments[_i];
1606
1710
  }
1607
- if (!isVerbose)
1711
+ if (!isVerbose())
1608
1712
  return;
1609
1713
  console.info.apply(console, tslib.__spreadArray(["%cINFO: ".concat(message), "color: #0a0"], optional, false));
1610
1714
  }
@@ -1637,10 +1741,10 @@ function checkAllRequestsComplete() {
1637
1741
  }
1638
1742
 
1639
1743
  function onSuccess(message) {
1640
- reactToastify.toast.success(message, isDevelopment ? toastOptionsDevs : toastOptions);
1744
+ reactToastify.toast.success(message, isLocal() ? toastOptionsDevs : toastOptions);
1641
1745
  }
1642
1746
  function onError(message) {
1643
- reactToastify.toast.error(message, isDevelopment ? toastOptionsDevs : toastOptions);
1747
+ reactToastify.toast.error(message, isLocal() ? toastOptionsDevs : toastOptions);
1644
1748
  }
1645
1749
 
1646
1750
  exports.C6Constants = C6Constants;
@@ -1651,12 +1755,10 @@ exports.GET = GET;
1651
1755
  exports.HttpExecutor = HttpExecutor;
1652
1756
  exports.POST = POST;
1653
1757
  exports.PUT = PUT;
1758
+ exports.SqlBuilder = SqlBuilder;
1654
1759
  exports.SqlExecutor = SqlExecutor;
1655
1760
  exports.TestRestfulResponse = TestRestfulResponse;
1656
1761
  exports.axiosInstance = axiosInstance;
1657
- exports.buildAggregateField = buildAggregateField;
1658
- exports.buildBooleanJoinedConditions = buildBooleanJoinedConditions;
1659
- exports.buildSelectQuery = buildSelectQuery;
1660
1762
  exports.checkAllRequestsComplete = checkAllRequestsComplete;
1661
1763
  exports.checkCache = checkCache;
1662
1764
  exports.clearCache = clearCache;
@@ -1667,7 +1769,7 @@ exports.getEnvVar = getEnvVar;
1667
1769
  exports.getPrimaryKeyTypes = getPrimaryKeyTypes;
1668
1770
  exports.group = group;
1669
1771
  exports.info = info;
1670
- exports.isLocal = isDevelopment;
1772
+ exports.isLocal = isLocal;
1671
1773
  exports.isNode = isNode;
1672
1774
  exports.isTest = isTest;
1673
1775
  exports.isVerbose = isVerbose;