@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/api/builders/sqlBuilder.d.ts +21 -3
- package/dist/api/executors/Executor.d.ts +1 -1
- package/dist/api/executors/SqlExecutor.d.ts +4 -3
- package/dist/index.cjs.js +311 -209
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +310 -206
- package/dist/index.esm.js.map +1 -1
- package/dist/variables/isLocal.d.ts +1 -2
- package/dist/variables/isTest.d.ts +1 -2
- package/dist/variables/isVerbose.d.ts +1 -2
- package/package.json +2 -2
- package/src/api/builders/sqlBuilder.ts +199 -149
- package/src/api/executors/Executor.ts +2 -2
- package/src/api/executors/HttpExecutor.ts +10 -10
- package/src/api/executors/SqlExecutor.ts +71 -15
- package/src/api/utils/apiHelpers.ts +1 -1
- package/src/api/utils/cacheManager.ts +1 -1
- package/src/api/utils/logger.ts +2 -2
- package/src/api/utils/toastNotifier.ts +2 -2
- package/src/variables/isLocal.ts +3 -2
- package/src/variables/isNode.ts +10 -1
- package/src/variables/isTest.ts +5 -4
- package/src/variables/isVerbose.ts +4 -5
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 () {
|
|
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
|
-
|
|
540
|
-
var
|
|
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
|
|
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
|
-
|
|
597
|
-
|
|
598
|
-
|
|
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 &&
|
|
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 &&
|
|
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 &&
|
|
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 &&
|
|
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 &&
|
|
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
|
-
&&
|
|
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 &&
|
|
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
|
|
1316
|
-
return tslib.__generator(this, function (
|
|
1317
|
-
switch (
|
|
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
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
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 =
|
|
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 =
|
|
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,
|
|
1400
|
+
case 5: return [4 /*yield*/, this.update(TABLE_NAME, [], this.request)];
|
|
1338
1401
|
case 6:
|
|
1339
|
-
result =
|
|
1340
|
-
|
|
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,
|
|
1410
|
+
case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
|
|
1343
1411
|
case 8:
|
|
1344
|
-
result =
|
|
1345
|
-
|
|
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(
|
|
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:
|
|
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
|
-
}(
|
|
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,
|
|
1744
|
+
reactToastify.toast.success(message, isLocal() ? toastOptionsDevs : toastOptions);
|
|
1641
1745
|
}
|
|
1642
1746
|
function onError(message) {
|
|
1643
|
-
reactToastify.toast.error(message,
|
|
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 =
|
|
1772
|
+
exports.isLocal = isLocal;
|
|
1671
1773
|
exports.isNode = isNode;
|
|
1672
1774
|
exports.isTest = isTest;
|
|
1673
1775
|
exports.isVerbose = isVerbose;
|