@carbonorm/carbonnode 3.0.11 → 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.esm.js CHANGED
@@ -308,7 +308,13 @@ function convertForRequestBody (restfulObject, tableName, C6, regexErrorHandler)
308
308
  }, {});
309
309
  }
310
310
 
311
- var isNode = function () { var _a; return typeof process !== 'undefined' && !!((_a = process.versions) === null || _a === void 0 ? void 0 : _a.node); };
311
+ var isNode = function () {
312
+ var _a;
313
+ console.log('Checking if running in Node.js environment...');
314
+ var isNodeEnv = typeof process !== 'undefined' && !!((_a = process.versions) === null || _a === void 0 ? void 0 : _a.node);
315
+ console.log("Is Node.js environment: ".concat(isNodeEnv));
316
+ return isNodeEnv;
317
+ };
312
318
 
313
319
  /**
314
320
  * Facade: routes API calls to SQL or HTTP executors based on runtime context.
@@ -359,165 +365,6 @@ function timeout(shouldContinueAfterTimeout, cb, timeoutMs) {
359
365
  };
360
366
  }
361
367
 
362
- function buildBooleanJoinedConditions(set, andMode) {
363
- if (andMode === void 0) { andMode = true; }
364
- var booleanOperator = andMode ? 'AND' : 'OR';
365
- var sql = '';
366
- var OPERATORS = ['=', '!=', '<', '<=', '>', '>=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'IS', 'IS NOT'];
367
- var isAggregateArray = function (value) { return Array.isArray(value) && typeof value[0] === 'string' && OPERATORS.includes(value[0]); };
368
- var isNumericKeyed = function (obj) { return Array.isArray(obj) && Object.keys(obj).every(function (k) { return /^\d+$/.test(k); }); };
369
- // todo - we should be doing something with value no????
370
- var addCondition = function (column, op, _value) {
371
- var paramName = column.replace(/\W+/g, '_');
372
- return "(".concat(column, " ").concat(op, " :").concat(paramName, ")");
373
- };
374
- if (isNumericKeyed(set)) {
375
- switch (set.length) {
376
- case 2:
377
- sql += addCondition(set[0], '=', set[1]);
378
- break;
379
- case 3:
380
- if (!OPERATORS.includes(set[1])) {
381
- throw new Error("Invalid operator: ".concat(set[1]));
382
- }
383
- sql += addCondition(set[0], set[1], set[2]);
384
- break;
385
- default:
386
- throw new Error("Invalid array condition: ".concat(JSON.stringify(set)));
387
- }
388
- }
389
- else {
390
- var parts = [];
391
- for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
392
- var _b = _a[_i], key = _b[0], value = _b[1];
393
- if (/^\d+$/.test(key)) {
394
- parts.push(buildBooleanJoinedConditions(value, !andMode));
395
- continue;
396
- }
397
- if (!Array.isArray(value) || isAggregateArray(value)) {
398
- parts.push(addCondition(key, '='));
399
- continue;
400
- }
401
- if (value.length === 2 && OPERATORS.includes(value[0])) {
402
- parts.push(addCondition(key, value[0], value[1]));
403
- }
404
- else if (value.length === 1 && isAggregateArray(value[0])) {
405
- parts.push(addCondition(key, '=', value[0]));
406
- }
407
- else {
408
- throw new Error("Invalid condition for ".concat(key, ": ").concat(JSON.stringify(value)));
409
- }
410
- }
411
- sql = parts.join(" ".concat(booleanOperator, " "));
412
- }
413
- return "(".concat(sql, ")");
414
- }
415
- function buildAggregateField(field) {
416
- if (typeof field === 'string')
417
- return field;
418
- if (!Array.isArray(field))
419
- throw new Error('Invalid SELECT entry: must be string or array');
420
- var agg = field[0], args = field.slice(1);
421
- switch (agg) {
422
- case 'COUNT':
423
- return "COUNT(".concat(args[0] || '*', ")");
424
- case 'SUM':
425
- case 'AVG':
426
- case 'MIN':
427
- case 'MAX':
428
- return "".concat(agg, "(").concat(args[0], ")").concat(args[1] ? " AS ".concat(args[1]) : '');
429
- case 'DISTINCT':
430
- return "DISTINCT(".concat(args[0], ")").concat(args[1] ? " AS ".concat(args[1]) : '');
431
- case 'GROUP_CONCAT': {
432
- var col = args[0], alias = args[1], sortCol = args[2], sortType = args[3];
433
- var order = sortCol ? " ORDER BY ".concat(sortCol, " ").concat(sortType || 'ASC') : '';
434
- return "GROUP_CONCAT(DISTINCT ".concat(col).concat(order, " SEPARATOR ',')").concat(alias ? " AS ".concat(alias) : '');
435
- }
436
- case 'AS': {
437
- var col = args[0], alias = args[1];
438
- return "".concat(col, " AS ").concat(alias);
439
- }
440
- case 'CONVERT_TZ': {
441
- var ts = args[0], fromTz = args[1], toTz = args[2];
442
- return "CONVERT_TZ(".concat(ts, ", ").concat(fromTz, ", ").concat(toTz, ")");
443
- }
444
- case 'NOW':
445
- return 'NOW()';
446
- default:
447
- throw new Error("Unsupported aggregate: ".concat(agg));
448
- }
449
- }
450
- function buildSelectQuery(table, primary, args, isSubSelect) {
451
- var _a, _b;
452
- if (isSubSelect === void 0) { isSubSelect = false; }
453
- var selectList = (_a = args === null || args === void 0 ? void 0 : args[C6Constants.SELECT]) !== null && _a !== void 0 ? _a : ['*'];
454
- var selectFields = Array.isArray(selectList)
455
- ? selectList.map(function (f) { return buildAggregateField(f); }).join(', ')
456
- : '*';
457
- var sql = "SELECT ".concat(selectFields, " FROM `").concat(table, "`");
458
- if (args === null || args === void 0 ? void 0 : args[C6Constants.JOIN]) {
459
- var joins = args[C6Constants.JOIN];
460
- for (var joinType in joins) {
461
- var joinKeyword = joinType.replace('_', ' ').toUpperCase();
462
- for (var joinTable in joins[joinType]) {
463
- var onClause = buildBooleanJoinedConditions(joins[joinType][joinTable]);
464
- sql += " ".concat(joinKeyword, " JOIN `").concat(joinTable, "` ON ").concat(onClause);
465
- }
466
- }
467
- }
468
- if (args === null || args === void 0 ? void 0 : args[C6Constants.WHERE]) {
469
- sql += " WHERE ".concat(buildBooleanJoinedConditions(args[C6Constants.WHERE]));
470
- }
471
- if (args === null || args === void 0 ? void 0 : args[C6Constants.GROUP_BY]) {
472
- var groupByFields = Array.isArray(args[C6Constants.GROUP_BY]) ? args[C6Constants.GROUP_BY].join(', ') : args[C6Constants.GROUP_BY];
473
- sql += " GROUP BY ".concat(groupByFields);
474
- }
475
- if (args === null || args === void 0 ? void 0 : args[C6Constants.HAVING]) {
476
- sql += " HAVING ".concat(buildBooleanJoinedConditions(args[C6Constants.HAVING]));
477
- }
478
- if (args === null || args === void 0 ? void 0 : args[C6Constants.PAGINATION]) {
479
- var p = args[C6Constants.PAGINATION];
480
- var limitClause = '';
481
- if (p[C6Constants.ORDER]) {
482
- var orderArray = Object.entries(p[C6Constants.ORDER]).map(function (_a) {
483
- var col = _a[0], dir = _a[1];
484
- if (!['ASC', 'DESC'].includes(String(dir).toUpperCase())) {
485
- throw new Error("Invalid order direction: ".concat(dir));
486
- }
487
- return "".concat(col, " ").concat(String(dir).toUpperCase());
488
- });
489
- sql += " ORDER BY ".concat(orderArray.join(', '));
490
- }
491
- else if (primary) {
492
- sql += " ORDER BY ".concat(primary, " DESC");
493
- } /*else {
494
- // todo - this is wrong
495
- const primaryKey = C6Constants.TABLES['users'].PRIMARY_SHORT?.[0] ?? 'user_id';
496
- sql += ` ORDER BY ${primaryKey} DESC`;
497
- }*/
498
- if (p[C6Constants.LIMIT] != null) {
499
- var limit = parseInt(p[C6Constants.LIMIT], 10);
500
- if (isNaN(limit) || limit < 0) {
501
- throw new Error("Invalid LIMIT: ".concat(p[C6Constants.LIMIT]));
502
- }
503
- var page = parseInt((_b = p[C6Constants.PAGE]) !== null && _b !== void 0 ? _b : 1, 10);
504
- if (isNaN(page) || page < 1) {
505
- throw new Error("PAGE must be >= 1 (got ".concat(p[C6Constants.PAGE], ")"));
506
- }
507
- var offset = (page - 1) * limit;
508
- limitClause += " LIMIT ".concat(offset, ", ").concat(limit);
509
- }
510
- sql += limitClause;
511
- }
512
- else if (!isSubSelect && primary) {
513
- sql += " ORDER BY ".concat(primary, " ASC LIMIT 1");
514
- }
515
- else if (!isSubSelect && !primary) {
516
- sql += " ORDER BY id ASC LIMIT 100"; // fallback default limit
517
- }
518
- return sql;
519
- }
520
-
521
368
  function getEnvVar(key, fallback) {
522
369
  if (fallback === void 0) { fallback = ''; }
523
370
  // Vite-style injection
@@ -533,8 +380,10 @@ function getEnvVar(key, fallback) {
533
380
  return fallback;
534
381
  }
535
382
 
536
- var envVerbose = getEnvVar('VERBOSE') || getEnvVar('REACT_APP_VERBOSE') || getEnvVar('VITE_VERBOSE') || '';
537
- var isVerbose = ['true', '1', 'yes', 'on'].includes(envVerbose.toLowerCase());
383
+ function isVerbose () {
384
+ var envVerbose = getEnvVar('VERBOSE') || getEnvVar('REACT_APP_VERBOSE') || getEnvVar('VITE_VERBOSE') || '';
385
+ return ['true', '1', 'yes', 'on'].includes(envVerbose.toLowerCase());
386
+ }
538
387
 
539
388
  var Executor = /** @class */ (function () {
540
389
  function Executor(config, request) {
@@ -557,7 +406,7 @@ var Executor = /** @class */ (function () {
557
406
  if (!(_i < _a.length)) return [3 /*break*/, 6];
558
407
  _b = _a[_i], key = _b[0], fn = _b[1];
559
408
  if (!(typeof fn === "function")) return [3 /*break*/, 5];
560
- if (isVerbose || args.request.debug) {
409
+ if (isVerbose() || args.request.debug) {
561
410
  console.groupCollapsed("[LIFECYCLE] ".concat(this.config.requestMethod, ".").concat(String(phase), ":").concat(key));
562
411
  console.log("config:", args.config);
563
412
  console.log("request:", args.request);
@@ -588,11 +437,220 @@ var Executor = /** @class */ (function () {
588
437
  return Executor;
589
438
  }());
590
439
 
591
- var isDevelopment = getEnvVar('NODE_ENV', '') === 'development';
440
+ var SqlBuilder = /** @class */ (function (_super) {
441
+ __extends(SqlBuilder, _super);
442
+ function SqlBuilder() {
443
+ return _super !== null && _super.apply(this, arguments) || this;
444
+ }
445
+ /** Generate nested WHERE/JOIN conditions with parameter binding */
446
+ SqlBuilder.prototype.buildBooleanJoinedConditions = function (set, andMode, params) {
447
+ if (andMode === void 0) { andMode = true; }
448
+ if (params === void 0) { params = []; }
449
+ var booleanOperator = andMode ? 'AND' : 'OR';
450
+ var OPERATORS = ['=', '!=', '<', '<=', '>', '>=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'IS', 'IS NOT'];
451
+ var isAggregateArray = function (value) {
452
+ return Array.isArray(value) && typeof value[0] === 'string' && OPERATORS.includes(value[0]);
453
+ };
454
+ var isNumericKeyed = function (obj) {
455
+ return Array.isArray(obj) && Object.keys(obj).every(function (k) { return /^\d+$/.test(k); });
456
+ };
457
+ var addCondition = function (column, op, value) {
458
+ var clause;
459
+ /*if (Buffer.isBuffer(value)) { // TODO - I want this as a parameterized option, for now default to faster
460
+ params.push(value.toString('hex')); // Or use UNHEX(?) in SQL
461
+ clause = `(${column} = UNHEX(?))`;
462
+ } else {*/
463
+ params.push(value);
464
+ clause = "( ".concat(column, " ").concat(op, " ? )");
465
+ //}
466
+ isVerbose() && console.log("[WHERE] \u2795 ".concat(clause, " ->"), value);
467
+ return clause;
468
+ };
469
+ var sql;
470
+ if (isNumericKeyed(set)) {
471
+ isVerbose() && console.log("[WHERE] Numeric keyed condition:", set);
472
+ switch (set.length) {
473
+ case 2:
474
+ sql = addCondition(set[0], '=', set[1]);
475
+ break;
476
+ case 3:
477
+ if (!OPERATORS.includes(set[1]))
478
+ throw new Error("Invalid operator: ".concat(set[1]));
479
+ sql = addCondition(set[0], set[1], set[2]);
480
+ break;
481
+ default:
482
+ throw new Error("Invalid array condition: ".concat(JSON.stringify(set)));
483
+ }
484
+ }
485
+ else {
486
+ var parts = [];
487
+ for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
488
+ var _b = _a[_i], key = _b[0], value = _b[1];
489
+ if (/^\d+$/.test(key)) {
490
+ parts.push(this.buildBooleanJoinedConditions(value, !andMode, params));
491
+ }
492
+ else if (!Array.isArray(value) || isAggregateArray(value)) {
493
+ parts.push(addCondition(key, '=', value));
494
+ }
495
+ else if (value.length === 2 && OPERATORS.includes(value[0])) {
496
+ parts.push(addCondition(key, value[0], value[1]));
497
+ }
498
+ else {
499
+ throw new Error("Invalid condition for ".concat(key, ": ").concat(JSON.stringify(value)));
500
+ }
501
+ }
502
+ sql = parts.join(" ".concat(booleanOperator, " "));
503
+ }
504
+ isVerbose() && console.log("[WHERE] Final: (".concat(sql, ")"));
505
+ return "(".concat(sql, ")");
506
+ };
507
+ /** Translate array or function calls into SQL expressions */
508
+ SqlBuilder.prototype.buildAggregateField = function (field) {
509
+ if (typeof field === 'string')
510
+ return field;
511
+ if (!Array.isArray(field))
512
+ throw new Error('Invalid SELECT entry');
513
+ var fn = field[0], args = field.slice(1);
514
+ var alias;
515
+ if (args.length >= 2 && args[args.length - 2] === 'AS') {
516
+ alias = String(args.pop());
517
+ args.pop();
518
+ }
519
+ var F = String(fn).toUpperCase();
520
+ var p = args.join(', ');
521
+ isVerbose() && console.log("[SELECT] ".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : ''));
522
+ switch (F) {
523
+ case 'DATE_ADD':
524
+ return "DATE_ADD(".concat(args[0], ", ").concat(args[1], ")").concat(alias ? " AS ".concat(alias) : '');
525
+ case 'DATE_SUB':
526
+ return "DATE_SUB(".concat(args[0], ", ").concat(args[1], ")").concat(alias ? " AS ".concat(alias) : '');
527
+ case 'YEAR':
528
+ return "YEAR(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
529
+ case 'MONTH':
530
+ return "MONTH(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
531
+ case 'DAY':
532
+ return "DAY(".concat(args[0], ")").concat(alias ? " AS ".concat(alias) : '');
533
+ case 'ROUND':
534
+ case 'CEIL':
535
+ case 'FLOOR':
536
+ case 'ABS':
537
+ case 'SQRT':
538
+ return "".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
539
+ case 'ST_DISTANCE':
540
+ return "ST_Distance(".concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
541
+ default:
542
+ if (/^[A-Z_]+$/.test(F))
543
+ return "".concat(F, "(").concat(p, ")").concat(alias ? " AS ".concat(alias) : '');
544
+ throw new Error("Unsupported function: ".concat(F));
545
+ }
546
+ };
547
+ /** Compose a parameterized SELECT query with optional JOIN/WHERE/GROUP/HAVING/PAGINATION */
548
+ SqlBuilder.prototype.buildSelectQuery = function (table, primary, args, isSubSelect) {
549
+ var _this = this;
550
+ var _a, _b, _c, _d;
551
+ if (isSubSelect === void 0) { isSubSelect = false; }
552
+ var model = this.config.C6.TABLES[table];
553
+ var params = [];
554
+ // SELECT
555
+ var selectList = (_a = args === null || args === void 0 ? void 0 : args[C6Constants.SELECT]) !== null && _a !== void 0 ? _a : ['*'];
556
+ var selectFields = Array.isArray(selectList)
557
+ ? selectList.map(function (f) { return _this.buildAggregateField(f); }).join(', ')
558
+ : '*';
559
+ var sql = "SELECT ".concat(selectFields, " FROM ").concat(table);
560
+ isVerbose() && console.log("[SELECT]", selectFields);
561
+ // JOIN
562
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.JOIN]) {
563
+ for (var jt in args[C6Constants.JOIN]) {
564
+ var jk = jt.replace('_', ' ').toUpperCase();
565
+ for (var jn in args[C6Constants.JOIN][jt]) {
566
+ var on = this.buildBooleanJoinedConditions(args[C6Constants.JOIN][jt][jn], true, params);
567
+ sql += " ".concat(jk, " JOIN `").concat(jn, "` ON ").concat(on);
568
+ isVerbose() && console.log("[JOIN]", jk, jn, on);
569
+ }
570
+ }
571
+ }
572
+ // WHERE
573
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.WHERE]) {
574
+ var wc = this.buildBooleanJoinedConditions(args[C6Constants.WHERE], true, params);
575
+ // Trim leading and trailing parentheses if they fully wrap the condition
576
+ while (wc.startsWith('(') && wc.endsWith(')')) {
577
+ wc = wc.slice(1, -1).trim();
578
+ }
579
+ sql += " WHERE ".concat(wc);
580
+ }
581
+ // GROUP BY
582
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.GROUP_BY]) {
583
+ var gb = Array.isArray(args[C6Constants.GROUP_BY])
584
+ ? args[C6Constants.GROUP_BY].join(', ')
585
+ : args[C6Constants.GROUP_BY];
586
+ sql += " GROUP BY ".concat(gb);
587
+ isVerbose() && console.log("[GROUP BY]", gb);
588
+ }
589
+ // HAVING
590
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.HAVING]) {
591
+ var hc = this.buildBooleanJoinedConditions(args[C6Constants.HAVING], true, params);
592
+ sql += " HAVING ".concat(hc);
593
+ }
594
+ // PAGINATION
595
+ if (args === null || args === void 0 ? void 0 : args[C6Constants.PAGINATION]) {
596
+ var p = args[C6Constants.PAGINATION];
597
+ if (p[C6Constants.ORDER]) {
598
+ var ord = Object.entries(p[C6Constants.ORDER]).map(function (_a) {
599
+ var c = _a[0], d = _a[1];
600
+ return "".concat(c, " ").concat(String(d).toUpperCase());
601
+ });
602
+ sql += " ORDER BY ".concat(ord.join(', '));
603
+ isVerbose() && console.log("[ORDER BY]", ord);
604
+ }
605
+ if (p[C6Constants.LIMIT] != null) {
606
+ var lim = parseInt(p[C6Constants.LIMIT], 10);
607
+ var pg = parseInt((_b = p[C6Constants.PAGE]) !== null && _b !== void 0 ? _b : 1, 10);
608
+ var off = (pg - 1) * lim;
609
+ sql += " LIMIT ".concat(off, ", ").concat(lim);
610
+ isVerbose() && console.log("[LIMIT]", off, lim);
611
+ }
612
+ }
613
+ // Fallback ORDER/LIMIT
614
+ else if (!isSubSelect) {
615
+ var ok = void 0;
616
+ if (primary)
617
+ ok = primary;
618
+ else if ((_c = model === null || model === void 0 ? void 0 : model.PRIMARY_SHORT) === null || _c === void 0 ? void 0 : _c[0])
619
+ ok = model.PRIMARY_SHORT[0];
620
+ else
621
+ for (var _i = 0, _e = ['created_at', 'updated_at']; _i < _e.length; _i++) {
622
+ var ts = _e[_i];
623
+ if ((_d = model === null || model === void 0 ? void 0 : model.COLUMNS) === null || _d === void 0 ? void 0 : _d["".concat(table, ".").concat(ts)]) {
624
+ ok = ts;
625
+ break;
626
+ }
627
+ }
628
+ if (ok) {
629
+ var dir = primary ? 'ASC' : 'DESC';
630
+ var lim = primary ? 1 : 100;
631
+ sql += " ORDER BY ".concat(ok, " ").concat(dir, " LIMIT ").concat(lim);
632
+ isVerbose() && console.log("[ORDER]", ok, dir, lim);
633
+ }
634
+ else {
635
+ sql += " LIMIT 100";
636
+ isVerbose() && console.warn("[ORDER] fallback LIMIT 100");
637
+ }
638
+ }
639
+ isVerbose() && console.log("[SQL]", sql, params);
640
+ return { sql: sql, params: params };
641
+ };
642
+ return SqlBuilder;
643
+ }(Executor));
644
+
645
+ function isLocal () {
646
+ return getEnvVar('NODE_ENV', '') === 'development';
647
+ }
592
648
 
593
- var isTest = getEnvVar('JEST_WORKER_ID') || getEnvVar('NODE_ENV') === 'test'
594
- || getEnvVar('REACT_APP_TEST') === 'true' || getEnvVar('VITE_TEST') === 'true'
595
- || getEnvVar('MODE') === 'test' || getEnvVar('VITE_TEST_MODE') === 'true';
649
+ function isTest () {
650
+ return getEnvVar('JEST_WORKER_ID') || getEnvVar('NODE_ENV') === 'test'
651
+ || getEnvVar('REACT_APP_TEST') === 'true' || getEnvVar('VITE_TEST') === 'true'
652
+ || getEnvVar('MODE') === 'test' || getEnvVar('VITE_TEST_MODE') === 'true';
653
+ }
596
654
 
597
655
  var eFetchDependencies;
598
656
  (function (eFetchDependencies) {
@@ -672,7 +730,7 @@ function removeInvalidKeys(request, c6Tables) {
672
730
  intersection[key] = request[key];
673
731
  }
674
732
  });
675
- isTest || console.log('intersection', intersection);
733
+ isTest() || console.log('intersection', intersection);
676
734
  return intersection;
677
735
  }
678
736
 
@@ -697,7 +755,7 @@ function checkCache(cacheResult, requestMethod, tableName, request) {
697
755
  return cacheResult.request;
698
756
  }
699
757
  if (true === (cacheResult === null || cacheResult === void 0 ? void 0 : cacheResult.final)) {
700
- if (false === isTest || true === isVerbose) {
758
+ if (false === isTest() || true === isVerbose()) {
701
759
  console.groupCollapsed('%c API: Rest api cache (' + requestMethod + ' ' + tableName + ') has reached the final result. Returning undefined!', 'color: #cc0');
702
760
  console.log('%c ' + requestMethod + ' ' + tableName, 'color: #cc0');
703
761
  console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #cc0', request);
@@ -870,7 +928,7 @@ var HttpExecutor = /** @class */ (function (_super) {
870
928
  if (undefined !== cacheResult) return [3 /*break*/, 1];
871
929
  _p.label = 5;
872
930
  case 5:
873
- if (debug && isDevelopment) {
931
+ if (debug && isLocal()) {
874
932
  toast.warning("DEVS: Request in cache. (" + apiRequestCache.findIndex(function (cache) { return cache.requestArgumentsSerialized === querySerialized; }) + "). Returning function to request page (" + query[C6.PAGINATION][C6.PAGE] + ")", toastOptionsDevs);
875
933
  }
876
934
  // @ts-ignore - this is an incorrect warning on TS, it's well typed
@@ -879,12 +937,12 @@ var HttpExecutor = /** @class */ (function (_super) {
879
937
  cachingConfirmed = true;
880
938
  return [3 /*break*/, 8];
881
939
  case 7:
882
- if (debug && isDevelopment) {
940
+ if (debug && isLocal()) {
883
941
  toast.info("DEVS: Ignore cache was set to true.", toastOptionsDevs);
884
942
  }
885
943
  _p.label = 8;
886
944
  case 8:
887
- if (debug && isDevelopment) {
945
+ if (debug && isLocal()) {
888
946
  toast.success("DEVS: Request not in cache." + (requestMethod === C6.GET ? "Page (" + query[C6.PAGINATION][C6.PAGE] + ")." : '') + " Logging cache 2 console.", toastOptionsDevs);
889
947
  }
890
948
  return [3 /*break*/, 12];
@@ -921,7 +979,7 @@ var HttpExecutor = /** @class */ (function (_super) {
921
979
  if (undefined === query
922
980
  || null === query
923
981
  || false === primaryKey in query) {
924
- if (true === debug && isDevelopment) {
982
+ if (true === debug && isLocal()) {
925
983
  toast.error('DEVS: The primary key (' + primaryKey + ') was not provided!!');
926
984
  }
927
985
  throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
@@ -1010,7 +1068,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1010
1068
  case 0:
1011
1069
  // noinspection SuspiciousTypeOfGuard
1012
1070
  if (typeof response.data === 'string') {
1013
- if (isTest) {
1071
+ if (isTest()) {
1014
1072
  console.trace();
1015
1073
  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 + ')');
1016
1074
  }
@@ -1030,7 +1088,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1030
1088
  // todo - this feels dumb now, but i digress
1031
1089
  apiResponse = TestRestfulResponse(response, success, error);
1032
1090
  if (false === apiResponse) {
1033
- if (debug && isDevelopment) {
1091
+ if (debug && isLocal()) {
1034
1092
  toast.warning("DEVS: TestRestfulResponse returned false for (" + operatingTable + ").", toastOptionsDevs);
1035
1093
  }
1036
1094
  return [2 /*return*/, response];
@@ -1068,7 +1126,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1068
1126
  responseData_1 = response.data;
1069
1127
  returnGetNextPageFunction = 1 !== ((_d = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _d === void 0 ? void 0 : _d[C6.LIMIT]) &&
1070
1128
  ((_e = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _e === void 0 ? void 0 : _e[C6.LIMIT]) === responseData_1.rest.length;
1071
- if (false === isTest || true === isVerbose) {
1129
+ if (false === isTest() || true === isVerbose()) {
1072
1130
  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');
1073
1131
  console.log('%c ' + requestMethod + ' ' + tableName, 'color: #0c0');
1074
1132
  console.log('%c Request Data (note you may see the success and/or error prompt):', 'color: #0c0', this.request);
@@ -1079,7 +1137,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1079
1137
  }
1080
1138
  if (false === returnGetNextPageFunction
1081
1139
  && true === debug
1082
- && isDevelopment) {
1140
+ && isLocal()) {
1083
1141
  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);
1084
1142
  }
1085
1143
  if (!(fetchDependencies
@@ -1264,7 +1322,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1264
1322
  }); });
1265
1323
  _l.label = 6;
1266
1324
  case 6:
1267
- if (debug && isDevelopment) {
1325
+ if (debug && isLocal()) {
1268
1326
  toast.success("DEVS: (" + requestMethod + ") request complete.", toastOptionsDevs);
1269
1327
  }
1270
1328
  return [2 /*return*/, response];
@@ -1273,7 +1331,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1273
1331
  }); }).then(function (response) { return response.data; })];
1274
1332
  }
1275
1333
  catch (throwableError) {
1276
- if (isTest) {
1334
+ if (isTest()) {
1277
1335
  throw new Error(JSON.stringify(throwableError));
1278
1336
  }
1279
1337
  console.groupCollapsed('%c API: An error occurred in the try catch block. returning null!', 'color: #ff0000');
@@ -1309,13 +1367,16 @@ var SqlExecutor = /** @class */ (function (_super) {
1309
1367
  }
1310
1368
  SqlExecutor.prototype.execute = function () {
1311
1369
  return __awaiter(this, void 0, void 0, function () {
1312
- var _a, TABLE_NAME, PRIMARY, _b, rest, result, created, result, updated, result, deleted;
1313
- return __generator(this, function (_c) {
1314
- switch (_c.label) {
1370
+ var TABLE_NAME, method, _a, rest, result, created, result, updated, result, deleted;
1371
+ return __generator(this, function (_b) {
1372
+ switch (_b.label) {
1315
1373
  case 0:
1316
- _a = this.config.restModel, TABLE_NAME = _a.TABLE_NAME, PRIMARY = _a.PRIMARY;
1317
- _b = this.config.requestMethod;
1318
- switch (_b) {
1374
+ TABLE_NAME = this.config.restModel.TABLE_NAME;
1375
+ method = this.config.requestMethod;
1376
+ console.log("[SQL EXECUTOR] \u25B6\uFE0F Executing ".concat(method, " on table \"").concat(TABLE_NAME, "\""));
1377
+ console.log("[SQL EXECUTOR] \uD83E\uDDFE Request payload:", this.request);
1378
+ _a = method;
1379
+ switch (_a) {
1319
1380
  case 'GET': return [3 /*break*/, 1];
1320
1381
  case 'POST': return [3 /*break*/, 3];
1321
1382
  case 'PUT': return [3 /*break*/, 5];
@@ -1324,24 +1385,36 @@ var SqlExecutor = /** @class */ (function (_super) {
1324
1385
  return [3 /*break*/, 9];
1325
1386
  case 1: return [4 /*yield*/, this.select(TABLE_NAME, undefined, this.request)];
1326
1387
  case 2:
1327
- rest = _c.sent();
1388
+ rest = _b.sent();
1389
+ console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1328
1390
  return [2 /*return*/, { rest: rest }];
1329
1391
  case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1330
1392
  case 4:
1331
- result = _c.sent();
1393
+ result = _b.sent();
1394
+ console.log("[SQL EXECUTOR] \u2705 POST result:", result);
1332
1395
  created = { rest: result, created: true };
1333
1396
  return [2 /*return*/, created];
1334
- case 5: return [4 /*yield*/, this.update(TABLE_NAME, PRIMARY, this.request)];
1397
+ case 5: return [4 /*yield*/, this.update(TABLE_NAME, [], this.request)];
1335
1398
  case 6:
1336
- result = _c.sent();
1337
- updated = { rest: result, updated: true, rowCount: result.affectedRows };
1399
+ result = _b.sent();
1400
+ console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
1401
+ updated = {
1402
+ rest: result,
1403
+ updated: true,
1404
+ rowCount: result.affectedRows
1405
+ };
1338
1406
  return [2 /*return*/, updated];
1339
- case 7: return [4 /*yield*/, this.delete(TABLE_NAME, PRIMARY, this.request)];
1407
+ case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1340
1408
  case 8:
1341
- result = _c.sent();
1342
- deleted = { rest: result, deleted: true, rowCount: result.affectedRows };
1409
+ result = _b.sent();
1410
+ console.log("[SQL EXECUTOR] \u2705 DELETE result:", result);
1411
+ deleted = {
1412
+ rest: result,
1413
+ deleted: true,
1414
+ rowCount: result.affectedRows
1415
+ };
1343
1416
  return [2 /*return*/, deleted];
1344
- case 9: throw new Error("Unsupported request method: ".concat(this.config.requestMethod));
1417
+ case 9: throw new Error("Unsupported request method: ".concat(method));
1345
1418
  }
1346
1419
  });
1347
1420
  });
@@ -1351,15 +1424,19 @@ var SqlExecutor = /** @class */ (function (_super) {
1351
1424
  var conn;
1352
1425
  return __generator(this, function (_a) {
1353
1426
  switch (_a.label) {
1354
- case 0: return [4 /*yield*/, this.config.mysqlPool.getConnection()];
1427
+ case 0:
1428
+ console.log("[SQL EXECUTOR] \uD83D\uDCE1 Getting DB connection");
1429
+ return [4 /*yield*/, this.config.mysqlPool.getConnection()];
1355
1430
  case 1:
1356
1431
  conn = _a.sent();
1357
1432
  _a.label = 2;
1358
1433
  case 2:
1359
1434
  _a.trys.push([2, , 4, 5]);
1435
+ console.log("[SQL EXECUTOR] \u2705 Connection acquired");
1360
1436
  return [4 /*yield*/, cb(conn)];
1361
1437
  case 3: return [2 /*return*/, _a.sent()];
1362
1438
  case 4:
1439
+ console.log("[SQL EXECUTOR] \uD83D\uDD0C Releasing DB connection");
1363
1440
  conn.release();
1364
1441
  return [7 /*endfinally*/];
1365
1442
  case 5: return [2 /*return*/];
@@ -1369,21 +1446,23 @@ var SqlExecutor = /** @class */ (function (_super) {
1369
1446
  };
1370
1447
  SqlExecutor.prototype.select = function (table, primary, args) {
1371
1448
  return __awaiter(this, void 0, void 0, function () {
1372
- var sql;
1449
+ var sql, formatted;
1373
1450
  var _this = this;
1374
1451
  return __generator(this, function (_a) {
1375
1452
  switch (_a.label) {
1376
1453
  case 0:
1377
- sql = buildSelectQuery(table, primary, args);
1454
+ sql = this.buildSelectQuery(table, primary, args);
1455
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:", sql);
1456
+ formatted = this.formatSQLWithParams(sql.sql, sql.params);
1457
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted SELECT SQL:", formatted);
1378
1458
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
1379
1459
  var rows;
1380
1460
  return __generator(this, function (_a) {
1381
1461
  switch (_a.label) {
1382
- case 0:
1383
- console.log(sql);
1384
- return [4 /*yield*/, conn.query(sql)];
1462
+ case 0: return [4 /*yield*/, conn.query(sql.sql, sql.params)];
1385
1463
  case 1:
1386
1464
  rows = (_a.sent())[0];
1465
+ console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
1387
1466
  return [2 /*return*/, rows];
1388
1467
  }
1389
1468
  });
@@ -1404,6 +1483,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1404
1483
  values = keys.map(function (k) { return data[k]; });
1405
1484
  placeholders = keys.map(function () { return '?'; }).join(', ');
1406
1485
  sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ") VALUES (").concat(placeholders, ")");
1486
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
1487
+ console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1407
1488
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
1408
1489
  var result;
1409
1490
  return __generator(this, function (_a) {
@@ -1434,6 +1515,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1434
1515
  updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1435
1516
  sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary[0], "` = ?");
1436
1517
  values.push(data[primary[0]]);
1518
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated UPDATE SQL:", sql);
1519
+ console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1437
1520
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
1438
1521
  var result;
1439
1522
  return __generator(this, function (_a) {
@@ -1461,6 +1544,8 @@ var SqlExecutor = /** @class */ (function (_super) {
1461
1544
  if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1462
1545
  throw new Error('Primary key and value required for delete');
1463
1546
  sql = "DELETE FROM `".concat(table, "` WHERE `").concat(key, "` = ?");
1547
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated DELETE SQL:", sql);
1548
+ console.log("[SQL EXECUTOR] \uD83D\uDD22 Value:", args[key]);
1464
1549
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
1465
1550
  var result;
1466
1551
  return __generator(this, function (_a) {
@@ -1477,8 +1562,27 @@ var SqlExecutor = /** @class */ (function (_super) {
1477
1562
  });
1478
1563
  });
1479
1564
  };
1565
+ SqlExecutor.prototype.formatSQLWithParams = function (sql, params) {
1566
+ var index = 0;
1567
+ return sql.replace(/\?/g, function () {
1568
+ if (index >= params.length)
1569
+ return '?'; // fallback if params are missing
1570
+ var val = params[index++];
1571
+ if (val === null || val === undefined)
1572
+ return 'NULL';
1573
+ if (Buffer.isBuffer(val))
1574
+ return "UNHEX('".concat(val.toString('hex'), "')");
1575
+ if (typeof val === 'string')
1576
+ return "'".concat(val.replace(/'/g, "''"), "'");
1577
+ if (typeof val === 'number')
1578
+ return val.toString();
1579
+ if (val instanceof Date)
1580
+ return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1581
+ return "'".concat(JSON.stringify(val), "'");
1582
+ });
1583
+ };
1480
1584
  return SqlExecutor;
1481
- }(Executor));
1585
+ }(SqlBuilder));
1482
1586
 
1483
1587
  var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
1484
1588
  __proto__: null,
@@ -1589,7 +1693,7 @@ function getPrimaryKeyTypes(table) {
1589
1693
  * Conditionally group a log if verbose.
1590
1694
  */
1591
1695
  function group(title, data) {
1592
- if (!isVerbose)
1696
+ if (!isVerbose())
1593
1697
  return;
1594
1698
  console.groupCollapsed("%c".concat(title), "color: #007acc");
1595
1699
  if (data !== undefined)
@@ -1601,7 +1705,7 @@ function info(message) {
1601
1705
  for (var _i = 1; _i < arguments.length; _i++) {
1602
1706
  optional[_i - 1] = arguments[_i];
1603
1707
  }
1604
- if (!isVerbose)
1708
+ if (!isVerbose())
1605
1709
  return;
1606
1710
  console.info.apply(console, __spreadArray(["%cINFO: ".concat(message), "color: #0a0"], optional, false));
1607
1711
  }
@@ -1634,11 +1738,11 @@ function checkAllRequestsComplete() {
1634
1738
  }
1635
1739
 
1636
1740
  function onSuccess(message) {
1637
- toast.success(message, isDevelopment ? toastOptionsDevs : toastOptions);
1741
+ toast.success(message, isLocal() ? toastOptionsDevs : toastOptions);
1638
1742
  }
1639
1743
  function onError(message) {
1640
- toast.error(message, isDevelopment ? toastOptionsDevs : toastOptions);
1744
+ toast.error(message, isLocal() ? toastOptionsDevs : toastOptions);
1641
1745
  }
1642
1746
 
1643
- export { C6Constants, DELETE, Executor, ExpressHandler, GET, HttpExecutor, POST, PUT, SqlExecutor, TestRestfulResponse, apiRequestCache, axiosInstance, buildAggregateField, buildBooleanJoinedConditions, buildSelectQuery, checkAllRequestsComplete, checkCache, clearCache, convertForRequestBody, determineRuntimeJsType, eFetchDependencies, error, getEnvVar, getPrimaryKeyTypes, group, info, isDevelopment as isLocal, isNode, isTest, isVerbose, onError, onSuccess, removeInvalidKeys, removePrefixIfExists, restOrm, restRequest, sortAndSerializeQueryObject, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, warn };
1747
+ export { C6Constants, DELETE, Executor, ExpressHandler, GET, HttpExecutor, POST, PUT, SqlBuilder, SqlExecutor, TestRestfulResponse, apiRequestCache, axiosInstance, checkAllRequestsComplete, checkCache, clearCache, convertForRequestBody, determineRuntimeJsType, eFetchDependencies, error, getEnvVar, getPrimaryKeyTypes, group, info, isLocal, isNode, isTest, isVerbose, onError, onSuccess, removeInvalidKeys, removePrefixIfExists, restOrm, restRequest, sortAndSerializeQueryObject, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, warn };
1644
1748
  //# sourceMappingURL=index.esm.js.map