@carbonorm/carbonnode 3.0.13 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/api/C6Constants.d.ts +184 -0
  2. package/dist/api/builders/queryHelpers.d.ts +4 -0
  3. package/dist/api/builders/sqlBuilder.d.ts +17 -5
  4. package/dist/api/executors/Executor.d.ts +9 -15
  5. package/dist/api/executors/HttpExecutor.d.ts +7 -14
  6. package/dist/api/executors/SqlExecutor.d.ts +43 -14
  7. package/dist/api/orm/SqlBuilder.d.ts +17 -0
  8. package/dist/api/orm/builders/AggregateBuilder.d.ts +5 -0
  9. package/dist/api/orm/builders/ConditionBuilder.d.ts +11 -0
  10. package/dist/api/orm/builders/JoinBuilder.d.ts +5 -0
  11. package/dist/api/orm/builders/PaginationBuilder.d.ts +5 -0
  12. package/dist/api/orm/queries/DeleteQueryBuilder.d.ts +6 -0
  13. package/dist/api/orm/queries/SelectQueryBuilder.d.ts +6 -0
  14. package/dist/api/orm/queries/UpdateQueryBuilder.d.ts +6 -0
  15. package/dist/api/orm/queryHelpers.d.ts +4 -0
  16. package/dist/api/orm/utils/sqlUtils.d.ts +7 -0
  17. package/dist/api/restOrm.d.ts +3 -10
  18. package/dist/api/restRequest.d.ts +3 -10
  19. package/dist/api/types/ormGenerics.d.ts +13 -0
  20. package/dist/api/types/ormInterfaces.d.ts +23 -40
  21. package/dist/index.cjs.js +444 -249
  22. package/dist/index.cjs.js.map +1 -1
  23. package/dist/index.d.ts +10 -1
  24. package/dist/index.esm.js +432 -249
  25. package/dist/index.esm.js.map +1 -1
  26. package/package.json +7 -2
  27. package/scripts/assets/handlebars/C6.ts.handlebars +2 -4
  28. package/scripts/generateRestBindings.cjs +1 -1
  29. package/scripts/generateRestBindings.ts +1 -1
  30. package/src/api/C6Constants.ts +38 -2
  31. package/src/api/executors/Executor.ts +18 -36
  32. package/src/api/executors/HttpExecutor.ts +46 -59
  33. package/src/api/executors/SqlExecutor.ts +89 -58
  34. package/src/api/handlers/ExpressHandler.ts +3 -2
  35. package/src/api/orm/builders/AggregateBuilder.ts +38 -0
  36. package/src/api/orm/builders/ConditionBuilder.ts +113 -0
  37. package/src/api/orm/builders/JoinBuilder.ts +25 -0
  38. package/src/api/orm/builders/PaginationBuilder.ts +28 -0
  39. package/src/api/orm/queries/DeleteQueryBuilder.ts +28 -0
  40. package/src/api/orm/queries/SelectQueryBuilder.ts +49 -0
  41. package/src/api/orm/queries/UpdateQueryBuilder.ts +42 -0
  42. package/src/api/orm/queryHelpers.ts +18 -0
  43. package/src/api/orm/utils/sqlUtils.ts +24 -0
  44. package/src/api/restOrm.ts +4 -14
  45. package/src/api/restRequest.ts +16 -34
  46. package/src/api/types/ormGenerics.ts +18 -0
  47. package/src/api/types/ormInterfaces.ts +28 -43
  48. package/src/index.ts +10 -1
  49. package/src/api/builders/sqlBuilder.ts +0 -223
package/dist/index.esm.js CHANGED
@@ -2,6 +2,8 @@ import axios from 'axios';
2
2
  import Qs from 'qs';
3
3
  import { __assign, __awaiter, __generator, __extends, __spreadArray } from 'tslib';
4
4
  import { toast } from 'react-toastify';
5
+ import namedPlaceholders from 'named-placeholders';
6
+ import { Buffer as Buffer$1 } from 'buffer';
5
7
 
6
8
  var C6Constants = {
7
9
  // try to 1=1 match the Rest abstract class
@@ -66,6 +68,7 @@ var C6Constants = {
66
68
  LOCALTIMESTAMP: 'LOCALTIMESTAMP',
67
69
  MAKEDATE: 'MAKEDATE',
68
70
  MAKETIME: 'MAKETIME',
71
+ MATCH_AGAINST: 'MATCH_AGAINST',
69
72
  MONTHNAME: 'MONTHNAME',
70
73
  MICROSECOND: 'MICROSECOND',
71
74
  MINUTE: 'MINUTE',
@@ -86,6 +89,37 @@ var C6Constants = {
86
89
  SECOND: 'SECOND',
87
90
  SECOND_MICROSECOND: 'SECOND_MICROSECOND',
88
91
  SELECT: 'SELECT',
92
+ // MySQL Spatial Functions
93
+ ST_AREA: 'ST_Area',
94
+ ST_ASBINARY: 'ST_AsBinary',
95
+ ST_ASTEXT: 'ST_AsText',
96
+ ST_BUFFER: 'ST_Buffer',
97
+ ST_CONTAINS: 'ST_Contains',
98
+ ST_CROSSES: 'ST_Crosses',
99
+ ST_DIFFERENCE: 'ST_Difference',
100
+ ST_DIMENSION: 'ST_Dimension',
101
+ ST_DISJOINT: 'ST_Disjoint',
102
+ ST_DISTANCE: 'ST_Distance',
103
+ ST_DISTANCE_SPHERE: 'ST_Distance_Sphere',
104
+ ST_ENDPOINT: 'ST_EndPoint',
105
+ ST_ENVELOPE: 'ST_Envelope',
106
+ ST_EQUALS: 'ST_Equals',
107
+ ST_GEOMFROMGEOJSON: 'ST_GeomFromGeoJSON',
108
+ ST_GEOMFROMTEXT: 'ST_GeomFromText',
109
+ ST_GEOMFROMWKB: 'ST_GeomFromWKB',
110
+ ST_INTERSECTS: 'ST_Intersects',
111
+ ST_LENGTH: 'ST_Length',
112
+ ST_OVERLAPS: 'ST_Overlaps',
113
+ ST_POINT: 'ST_Point',
114
+ ST_SETSRID: 'ST_SetSRID',
115
+ ST_SRID: 'ST_SRID',
116
+ ST_STARTPOINT: 'ST_StartPoint',
117
+ ST_SYMDIFFERENCE: 'ST_SymDifference',
118
+ ST_TOUCHES: 'ST_Touches',
119
+ ST_UNION: 'ST_Union',
120
+ ST_WITHIN: 'ST_Within',
121
+ ST_X: 'ST_X',
122
+ ST_Y: 'ST_Y',
89
123
  STR_TO_DATE: 'STR_TO_DATE',
90
124
  SUBDATE: 'SUBDATE',
91
125
  SUBTIME: 'SUBTIME',
@@ -128,6 +162,7 @@ var C6Constants = {
128
162
  FINISH: 'FINISH',
129
163
  VALIDATE_C6_ENTITY_ID_REGEX: '#^([a-fA-F0-9]{20,35})$#',
130
164
  };
165
+ var C6C = C6Constants;
131
166
 
132
167
  // @link https://www.npmjs.com/package/axios-cache-adapter
133
168
  // updating these values
@@ -386,9 +421,11 @@ function isVerbose () {
386
421
  }
387
422
 
388
423
  var Executor = /** @class */ (function () {
389
- function Executor(config, request) {
424
+ function Executor(config, request, useNamedParams) {
425
+ if (useNamedParams === void 0) { useNamedParams = false; }
390
426
  this.config = config;
391
427
  this.request = request;
428
+ this.useNamedParams = useNamedParams;
392
429
  }
393
430
  Executor.prototype.runLifecycleHooks = function (phase, args) {
394
431
  return __awaiter(this, void 0, void 0, function () {
@@ -418,8 +455,10 @@ var Executor = /** @class */ (function () {
418
455
  _d.label = 2;
419
456
  case 2:
420
457
  _d.trys.push([2, 4, , 5]);
458
+ // todo - this
421
459
  return [4 /*yield*/, fn(args)];
422
460
  case 3:
461
+ // todo - this
423
462
  _d.sent();
424
463
  return [3 /*break*/, 5];
425
464
  case 4:
@@ -437,211 +476,6 @@ var Executor = /** @class */ (function () {
437
476
  return Executor;
438
477
  }());
439
478
 
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
479
  function isLocal () {
646
480
  return getEnvVar('NODE_ENV', '') === 'development';
647
481
  }
@@ -1360,10 +1194,246 @@ var HttpExecutor$1 = /*#__PURE__*/Object.freeze({
1360
1194
  HttpExecutor: HttpExecutor
1361
1195
  });
1362
1196
 
1197
+ function convertHexIfBinary(_col, val, columnDef) {
1198
+ if (typeof val === 'string' &&
1199
+ /^[0-9a-fA-F]{32}$/.test(val) &&
1200
+ typeof columnDef === 'object' &&
1201
+ columnDef.MYSQL_TYPE.toUpperCase().includes('BINARY')) {
1202
+ return Buffer.from(val, 'hex');
1203
+ }
1204
+ return val;
1205
+ }
1206
+
1207
+ var AggregateBuilder = /** @class */ (function (_super) {
1208
+ __extends(AggregateBuilder, _super);
1209
+ function AggregateBuilder() {
1210
+ return _super !== null && _super.apply(this, arguments) || this;
1211
+ }
1212
+ AggregateBuilder.prototype.buildAggregateField = function (field) {
1213
+ var _this = this;
1214
+ if (typeof field === 'string') {
1215
+ return field;
1216
+ }
1217
+ if (!Array.isArray(field) || field.length === 0) {
1218
+ throw new Error('Invalid SELECT field entry');
1219
+ }
1220
+ var fn = field[0], args = field.slice(1);
1221
+ var alias;
1222
+ if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
1223
+ alias = String(args.pop());
1224
+ args.pop();
1225
+ }
1226
+ var F = String(fn).toUpperCase();
1227
+ var argList = args.map(function (arg) {
1228
+ return Array.isArray(arg) ? _this.buildAggregateField(arg) : arg;
1229
+ }).join(', ');
1230
+ var expr = "".concat(F, "(").concat(argList, ")");
1231
+ if (alias) {
1232
+ expr += " AS ".concat(alias);
1233
+ }
1234
+ isVerbose() && console.log("[SELECT] ".concat(expr));
1235
+ return expr;
1236
+ };
1237
+ return AggregateBuilder;
1238
+ }(Executor));
1239
+
1240
+ var ConditionBuilder = /** @class */ (function (_super) {
1241
+ __extends(ConditionBuilder, _super);
1242
+ function ConditionBuilder() {
1243
+ var _this = _super !== null && _super.apply(this, arguments) || this;
1244
+ _this.OPERATORS = new Set([
1245
+ '=', '!=', '<', '<=', '>', '>=',
1246
+ 'LIKE', 'NOT LIKE', 'IN', 'NOT IN',
1247
+ 'IS', 'IS NOT', 'BETWEEN', 'NOT BETWEEN',
1248
+ C6Constants.MATCH_AGAINST
1249
+ ]);
1250
+ return _this;
1251
+ }
1252
+ ConditionBuilder.prototype.execute = function () {
1253
+ throw new Error("Method not implemented.");
1254
+ };
1255
+ ConditionBuilder.prototype.validateOperator = function (op) {
1256
+ if (!this.OPERATORS.has(op)) {
1257
+ throw new Error("Invalid or unsupported SQL operator detected: '".concat(op, "'"));
1258
+ }
1259
+ };
1260
+ ConditionBuilder.prototype.addParam = function (params, column, value) {
1261
+ var _a, _b;
1262
+ var columnDef = (_b = (_a = this.config.C6[column.split('.')[0]]) === null || _a === void 0 ? void 0 : _a.TYPE_VALIDATION) === null || _b === void 0 ? void 0 : _b[column];
1263
+ var val = convertHexIfBinary(column, value, columnDef);
1264
+ if (this.useNamedParams) {
1265
+ var key = "param".concat(Object.keys(params).length);
1266
+ params[key] = val;
1267
+ return ":".concat(key);
1268
+ }
1269
+ else {
1270
+ params.push(val);
1271
+ return '?';
1272
+ }
1273
+ };
1274
+ ConditionBuilder.prototype.buildBooleanJoinedConditions = function (set, andMode, params) {
1275
+ var _this = this;
1276
+ if (andMode === void 0) { andMode = true; }
1277
+ if (params === void 0) { params = []; }
1278
+ var booleanOperator = andMode ? 'AND' : 'OR';
1279
+ var addCondition = function (column, op, value) {
1280
+ _this.validateOperator(op);
1281
+ if (op === C6Constants.MATCH_AGAINST && Array.isArray(value)) {
1282
+ var search = value[0], mode = value[1];
1283
+ var paramName = _this.useNamedParams ? "param".concat(Object.keys(params).length) : null;
1284
+ if (_this.useNamedParams) {
1285
+ params[paramName] = search;
1286
+ }
1287
+ else {
1288
+ params.push(search);
1289
+ }
1290
+ var againstClause = void 0;
1291
+ switch ((mode || '').toUpperCase()) {
1292
+ case 'BOOLEAN':
1293
+ againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, " IN BOOLEAN MODE)") : "AGAINST(? IN BOOLEAN MODE)";
1294
+ break;
1295
+ case 'WITH QUERY EXPANSION':
1296
+ againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, " WITH QUERY EXPANSION)") : "AGAINST(? WITH QUERY EXPANSION)";
1297
+ break;
1298
+ default: // NATURAL or undefined
1299
+ againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, ")") : "AGAINST(?)";
1300
+ break;
1301
+ }
1302
+ var matchClause = "(MATCH(".concat(column, ") ").concat(againstClause, ")");
1303
+ isVerbose() && console.log("[MATCH_AGAINST] ".concat(matchClause));
1304
+ return matchClause;
1305
+ }
1306
+ // handle other operators
1307
+ return "( ".concat(column, " ").concat(op, " ").concat(_this.addParam(params, column, value), " )");
1308
+ };
1309
+ var parts = [];
1310
+ if (typeof set === 'object' && !Array.isArray(set)) {
1311
+ for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
1312
+ var _b = _a[_i], key = _b[0], value = _b[1];
1313
+ if (typeof value === 'object' && value !== null && Object.keys(value).length === 1) {
1314
+ var _c = Object.entries(value)[0], op = _c[0], val = _c[1];
1315
+ parts.push(addCondition(key, op, val));
1316
+ }
1317
+ else {
1318
+ parts.push(addCondition(key, '=', value));
1319
+ }
1320
+ }
1321
+ }
1322
+ var clause = parts.join(" ".concat(booleanOperator, " "));
1323
+ return clause ? "(".concat(clause, ")") : '';
1324
+ };
1325
+ ConditionBuilder.prototype.buildWhereClause = function (whereArg, params) {
1326
+ var clause = this.buildBooleanJoinedConditions(whereArg, true, params);
1327
+ if (!clause)
1328
+ return '';
1329
+ var trimmed = clause.replace(/^\((.*)\)$/, '$1');
1330
+ isVerbose() && console.log("[WHERE] ".concat(trimmed));
1331
+ return " WHERE ".concat(trimmed);
1332
+ };
1333
+ return ConditionBuilder;
1334
+ }(AggregateBuilder));
1335
+
1336
+ var JoinBuilder = /** @class */ (function (_super) {
1337
+ __extends(JoinBuilder, _super);
1338
+ function JoinBuilder() {
1339
+ return _super !== null && _super.apply(this, arguments) || this;
1340
+ }
1341
+ JoinBuilder.prototype.buildJoinClauses = function (joinArgs, params) {
1342
+ var sql = '';
1343
+ for (var joinType in joinArgs) {
1344
+ var joinKind = joinType.replace('_', ' ').toUpperCase();
1345
+ for (var raw in joinArgs[joinType]) {
1346
+ var _a = raw.split(' '), table = _a[0], alias = _a[1];
1347
+ var onClause = this.buildBooleanJoinedConditions(joinArgs[joinType][raw], true, params);
1348
+ var joinSql = alias ? "`".concat(table, "` AS `").concat(alias, "`") : "`".concat(table, "`");
1349
+ sql += " ".concat(joinKind, " JOIN ").concat(joinSql, " ON ").concat(onClause);
1350
+ }
1351
+ }
1352
+ isVerbose() && console.log("[JOIN] ".concat(sql.trim()));
1353
+ return sql;
1354
+ };
1355
+ return JoinBuilder;
1356
+ }(ConditionBuilder));
1357
+
1358
+ var PaginationBuilder = /** @class */ (function (_super) {
1359
+ __extends(PaginationBuilder, _super);
1360
+ function PaginationBuilder() {
1361
+ return _super !== null && _super.apply(this, arguments) || this;
1362
+ }
1363
+ PaginationBuilder.prototype.buildPaginationClause = function (pagination) {
1364
+ var _this = this;
1365
+ var _a;
1366
+ var sql = '';
1367
+ if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
1368
+ var orderParts = Object.entries(pagination[C6Constants.ORDER])
1369
+ .map(function (_a) {
1370
+ var col = _a[0], dir = _a[1];
1371
+ return "".concat(Array.isArray(col) ? _this.buildAggregateField(col) : col, " ").concat(String(dir).toUpperCase());
1372
+ });
1373
+ sql += " ORDER BY ".concat(orderParts.join(', '));
1374
+ }
1375
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.LIMIT]) != null) {
1376
+ var lim = parseInt(pagination[C6Constants.LIMIT], 10);
1377
+ var page = parseInt((_a = pagination[C6Constants.PAGE]) !== null && _a !== void 0 ? _a : 1, 10);
1378
+ var offset = (page - 1) * lim;
1379
+ sql += " LIMIT ".concat(offset, ", ").concat(lim);
1380
+ }
1381
+ isVerbose() && console.log("[PAGINATION] ".concat(sql.trim()));
1382
+ return sql;
1383
+ };
1384
+ return PaginationBuilder;
1385
+ }(JoinBuilder));
1386
+
1387
+ var SelectQueryBuilder = /** @class */ (function (_super) {
1388
+ __extends(SelectQueryBuilder, _super);
1389
+ function SelectQueryBuilder() {
1390
+ return _super !== null && _super.apply(this, arguments) || this;
1391
+ }
1392
+ SelectQueryBuilder.prototype.build = function (table, args, primary, isSubSelect) {
1393
+ var _this = this;
1394
+ var _a;
1395
+ if (isSubSelect === void 0) { isSubSelect = false; }
1396
+ var params = this.useNamedParams ? {} : [];
1397
+ var selectList = (_a = args.SELECT) !== null && _a !== void 0 ? _a : ['*'];
1398
+ var selectFields = selectList
1399
+ .map(function (f) { return _this.buildAggregateField(f); })
1400
+ .join(', ');
1401
+ var sql = "SELECT ".concat(selectFields, " FROM `").concat(table, "`");
1402
+ if (args.JOIN) {
1403
+ sql += this.buildJoinClauses(args.JOIN, params);
1404
+ }
1405
+ if (args.WHERE) {
1406
+ sql += this.buildWhereClause(args.WHERE, params);
1407
+ }
1408
+ if (args.GROUP_BY) {
1409
+ var groupBy = Array.isArray(args.GROUP_BY)
1410
+ ? args.GROUP_BY.join(', ')
1411
+ : args.GROUP_BY;
1412
+ sql += " GROUP BY ".concat(groupBy);
1413
+ }
1414
+ if (args.HAVING) {
1415
+ sql += " HAVING ".concat(this.buildBooleanJoinedConditions(args.HAVING, true, params));
1416
+ }
1417
+ if (args.PAGINATION) {
1418
+ sql += this.buildPaginationClause(args.PAGINATION);
1419
+ }
1420
+ else if (!isSubSelect) {
1421
+ sql += primary ? " ORDER BY ".concat(primary, " ASC LIMIT 1") : " LIMIT 100";
1422
+ }
1423
+ return { sql: sql, params: params };
1424
+ };
1425
+ return SelectQueryBuilder;
1426
+ }(PaginationBuilder));
1427
+
1363
1428
  var SqlExecutor = /** @class */ (function (_super) {
1364
1429
  __extends(SqlExecutor, _super);
1365
1430
  function SqlExecutor() {
1366
- return _super !== null && _super.apply(this, arguments) || this;
1431
+ var _this = _super !== null && _super.apply(this, arguments) || this;
1432
+ _this.serialize = function (row) { return Object.fromEntries(Object.entries(row).map(function (_a) {
1433
+ var k = _a[0], v = _a[1];
1434
+ return [k, Buffer$1.isBuffer(v) ? v.toString('hex').toUpperCase() : v];
1435
+ })); };
1436
+ return _this;
1367
1437
  }
1368
1438
  SqlExecutor.prototype.execute = function () {
1369
1439
  return __awaiter(this, void 0, void 0, function () {
@@ -1387,7 +1457,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1387
1457
  case 2:
1388
1458
  rest = _b.sent();
1389
1459
  console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1390
- return [2 /*return*/, { rest: rest }];
1460
+ return [2 /*return*/, rest];
1391
1461
  case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1392
1462
  case 4:
1393
1463
  result = _b.sent();
@@ -1398,11 +1468,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1398
1468
  case 6:
1399
1469
  result = _b.sent();
1400
1470
  console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
1401
- updated = {
1402
- rest: result,
1403
- updated: true,
1404
- rowCount: result.affectedRows
1405
- };
1471
+ updated = __assign(__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
1406
1472
  return [2 /*return*/, updated];
1407
1473
  case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1408
1474
  case 8:
@@ -1411,7 +1477,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1411
1477
  deleted = {
1412
1478
  rest: result,
1413
1479
  deleted: true,
1414
- rowCount: result.affectedRows
1480
+ rowCount: result.rest.affectedRows
1415
1481
  };
1416
1482
  return [2 /*return*/, deleted];
1417
1483
  case 9: throw new Error("Unsupported request method: ".concat(method));
@@ -1446,28 +1512,36 @@ var SqlExecutor = /** @class */ (function (_super) {
1446
1512
  };
1447
1513
  SqlExecutor.prototype.select = function (table, primary, args) {
1448
1514
  return __awaiter(this, void 0, void 0, function () {
1449
- var sql, formatted;
1515
+ var QueryResult, formatted, toUnnamed, _a, sql, values;
1450
1516
  var _this = this;
1451
- return __generator(this, function (_a) {
1452
- switch (_a.label) {
1517
+ return __generator(this, function (_b) {
1518
+ switch (_b.label) {
1453
1519
  case 0:
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);
1520
+ QueryResult = (new SelectQueryBuilder(this.config, this.request)).build(table, args, primary);
1521
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:", QueryResult);
1522
+ formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1457
1523
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted SELECT SQL:", formatted);
1524
+ toUnnamed = namedPlaceholders();
1525
+ _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1458
1526
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
1459
1527
  var rows;
1460
1528
  return __generator(this, function (_a) {
1461
1529
  switch (_a.label) {
1462
- case 0: return [4 /*yield*/, conn.query(sql.sql, sql.params)];
1530
+ case 0: return [4 /*yield*/, conn.query(sql, values)];
1463
1531
  case 1:
1464
1532
  rows = (_a.sent())[0];
1465
1533
  console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
1466
- return [2 /*return*/, rows];
1534
+ return [2 /*return*/, {
1535
+ rest: rows.map(this.serialize),
1536
+ sql: {
1537
+ sql: sql,
1538
+ values: values
1539
+ }
1540
+ }];
1467
1541
  }
1468
1542
  });
1469
1543
  }); })];
1470
- case 1: return [2 /*return*/, _a.sent()];
1544
+ case 1: return [2 /*return*/, _b.sent()];
1471
1545
  }
1472
1546
  });
1473
1547
  });
@@ -1482,7 +1556,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1482
1556
  keys = Object.keys(data);
1483
1557
  values = keys.map(function (k) { return data[k]; });
1484
1558
  placeholders = keys.map(function () { return '?'; }).join(', ');
1485
- sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ") VALUES (").concat(placeholders, ")");
1559
+ sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ")\n VALUES (").concat(placeholders, ")");
1486
1560
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
1487
1561
  console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1488
1562
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
@@ -1492,7 +1566,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1492
1566
  case 0: return [4 /*yield*/, conn.execute(sql, values)];
1493
1567
  case 1:
1494
1568
  result = (_a.sent())[0];
1495
- return [2 /*return*/, result];
1569
+ return [2 /*return*/, {
1570
+ rest: result,
1571
+ sql: {
1572
+ sql: sql,
1573
+ placeholders: placeholders
1574
+ }
1575
+ }];
1496
1576
  }
1497
1577
  });
1498
1578
  }); })];
@@ -1513,7 +1593,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1513
1593
  keys = Object.keys(data);
1514
1594
  values = keys.map(function (k) { return data[k]; });
1515
1595
  updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1516
- sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary[0], "` = ?");
1596
+ sql = "UPDATE `".concat(table, "`\n SET ").concat(updates, "\n WHERE `").concat(primary[0], "` = ?");
1517
1597
  values.push(data[primary[0]]);
1518
1598
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated UPDATE SQL:", sql);
1519
1599
  console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
@@ -1524,7 +1604,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1524
1604
  case 0: return [4 /*yield*/, conn.execute(sql, values)];
1525
1605
  case 1:
1526
1606
  result = (_a.sent())[0];
1527
- return [2 /*return*/, result];
1607
+ return [2 /*return*/, {
1608
+ rest: result,
1609
+ sql: {
1610
+ sql: sql,
1611
+ values: values
1612
+ }
1613
+ }];
1528
1614
  }
1529
1615
  });
1530
1616
  }); })];
@@ -1543,7 +1629,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1543
1629
  key = primary === null || primary === void 0 ? void 0 : primary[0];
1544
1630
  if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1545
1631
  throw new Error('Primary key and value required for delete');
1546
- sql = "DELETE FROM `".concat(table, "` WHERE `").concat(key, "` = ?");
1632
+ sql = "DELETE\n FROM `".concat(table, "`\n WHERE `").concat(key, "` = ?");
1547
1633
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated DELETE SQL:", sql);
1548
1634
  console.log("[SQL EXECUTOR] \uD83D\uDD22 Value:", args[key]);
1549
1635
  return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
@@ -1553,7 +1639,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1553
1639
  case 0: return [4 /*yield*/, conn.execute(sql, [args[key]])];
1554
1640
  case 1:
1555
1641
  result = (_a.sent())[0];
1556
- return [2 /*return*/, result];
1642
+ return [2 /*return*/, {
1643
+ rest: result,
1644
+ sql: {
1645
+ sql: sql,
1646
+ args: args
1647
+ }
1648
+ }];
1557
1649
  }
1558
1650
  });
1559
1651
  }); })];
@@ -1563,26 +1655,38 @@ var SqlExecutor = /** @class */ (function (_super) {
1563
1655
  });
1564
1656
  };
1565
1657
  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
- });
1658
+ var _this = this;
1659
+ if (Array.isArray(params)) {
1660
+ var index_1 = 0;
1661
+ return sql.replace(/\?/g, function () {
1662
+ if (index_1 >= params.length)
1663
+ return '?';
1664
+ var val = params[index_1++];
1665
+ return _this.formatValue(val);
1666
+ });
1667
+ }
1668
+ else {
1669
+ return sql.replace(/:([a-zA-Z0-9_]+)/g, function (_, key) {
1670
+ var val = params[key];
1671
+ return _this.formatValue(val);
1672
+ });
1673
+ }
1674
+ };
1675
+ SqlExecutor.prototype.formatValue = function (val) {
1676
+ if (val === null || val === undefined)
1677
+ return 'NULL';
1678
+ if (Buffer$1.isBuffer(val))
1679
+ return "UNHEX('".concat(val.toString('hex'), "')");
1680
+ if (typeof val === 'string')
1681
+ return "'".concat(val.replace(/'/g, "''"), "'");
1682
+ if (typeof val === 'number')
1683
+ return val.toString();
1684
+ if (val instanceof Date)
1685
+ return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1686
+ return "'".concat(JSON.stringify(val), "'");
1583
1687
  };
1584
1688
  return SqlExecutor;
1585
- }(SqlBuilder));
1689
+ }(Executor));
1586
1690
 
1587
1691
  var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
1588
1692
  __proto__: null,
@@ -1633,11 +1737,11 @@ function ExpressHandler(_a) {
1633
1737
  })(payload)];
1634
1738
  case 1:
1635
1739
  response = _a.sent();
1636
- console.log('response', JSON.stringify(response));
1637
1740
  res.status(200).json(__assign({ success: true }, response));
1638
1741
  return [3 /*break*/, 3];
1639
1742
  case 2:
1640
1743
  err_1 = _a.sent();
1744
+ res.status(500).json({ success: false, error: err_1 });
1641
1745
  next(err_1);
1642
1746
  return [3 /*break*/, 3];
1643
1747
  case 3: return [2 /*return*/];
@@ -1646,6 +1750,85 @@ function ExpressHandler(_a) {
1646
1750
  }); };
1647
1751
  }
1648
1752
 
1753
+ // Alias a table name with a given alias
1754
+ var A = function (tableName, alias) {
1755
+ return "".concat(tableName, " ").concat(alias);
1756
+ };
1757
+ // Qualify a column constant (e.g. 'property_units.parcel_id') to an alias
1758
+ var F = function (qualifiedCol, alias) {
1759
+ return "".concat(alias, ".").concat(qualifiedCol.split('.').pop());
1760
+ };
1761
+ // Equal join condition using full-qualified column constants
1762
+ var fieldEq = function (leftCol, rightCol, leftAlias, rightAlias) {
1763
+ var _a;
1764
+ return (_a = {},
1765
+ _a[F(leftCol, leftAlias)] = F(rightCol, rightAlias),
1766
+ _a);
1767
+ };
1768
+ // ST_Distance_Sphere for aliased fields
1769
+ var distSphere = function (fromCol, toCol, fromAlias, toAlias) {
1770
+ return [C6C.ST_DISTANCE_SPHERE, F(fromCol, fromAlias), F(toCol, toAlias)];
1771
+ };
1772
+
1773
+ var DeleteQueryBuilder = /** @class */ (function (_super) {
1774
+ __extends(DeleteQueryBuilder, _super);
1775
+ function DeleteQueryBuilder() {
1776
+ return _super !== null && _super.apply(this, arguments) || this;
1777
+ }
1778
+ DeleteQueryBuilder.prototype.build = function (table, args) {
1779
+ if (args === void 0) { args = {}; }
1780
+ var params = this.useNamedParams ? {} : [];
1781
+ var sql = args.JOIN ? "DELETE ".concat(table, "\n FROM `").concat(table, "`") : "DELETE\n FROM `".concat(table, "`");
1782
+ if (args.JOIN) {
1783
+ sql += this.buildJoinClauses(args.JOIN, params);
1784
+ }
1785
+ if (args.WHERE) {
1786
+ sql += this.buildWhereClause(args.WHERE, params);
1787
+ }
1788
+ if (args.PAGINATION) {
1789
+ sql += this.buildPaginationClause(args.PAGINATION);
1790
+ }
1791
+ return { sql: sql, params: params };
1792
+ };
1793
+ return DeleteQueryBuilder;
1794
+ }(PaginationBuilder));
1795
+
1796
+ var UpdateQueryBuilder = /** @class */ (function (_super) {
1797
+ __extends(UpdateQueryBuilder, _super);
1798
+ function UpdateQueryBuilder() {
1799
+ return _super !== null && _super.apply(this, arguments) || this;
1800
+ }
1801
+ UpdateQueryBuilder.prototype.build = function (table, data, args) {
1802
+ if (args === void 0) { args = {}; }
1803
+ var params = this.useNamedParams ? {} : [];
1804
+ var sql = "UPDATE `".concat(table, "`");
1805
+ if (args.JOIN) {
1806
+ sql += this.buildJoinClauses(args.JOIN, params);
1807
+ }
1808
+ var setClauses = Object.entries(data).map(function (_a) {
1809
+ var col = _a[0], val = _a[1];
1810
+ if (Array.isArray(params)) {
1811
+ params.push(val);
1812
+ return "`".concat(col, "` = ?");
1813
+ }
1814
+ else {
1815
+ var key = "param".concat(Object.keys(params).length);
1816
+ params[key] = val;
1817
+ return "`".concat(col, "` = :").concat(key);
1818
+ }
1819
+ });
1820
+ sql += " SET ".concat(setClauses.join(', '));
1821
+ if (args.WHERE) {
1822
+ sql += this.buildWhereClause(args.WHERE, params);
1823
+ }
1824
+ if (args.PAGINATION) {
1825
+ sql += this.buildPaginationClause(args.PAGINATION);
1826
+ }
1827
+ return { sql: sql, params: params };
1828
+ };
1829
+ return UpdateQueryBuilder;
1830
+ }(PaginationBuilder));
1831
+
1649
1832
  function determineRuntimeJsType(mysqlType) {
1650
1833
  var base = mysqlType.toLowerCase().split('(')[0];
1651
1834
  if ([
@@ -1744,5 +1927,5 @@ function onError(message) {
1744
1927
  toast.error(message, isLocal() ? toastOptionsDevs : toastOptions);
1745
1928
  }
1746
1929
 
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 };
1930
+ export { A, AggregateBuilder, C6C, C6Constants, ConditionBuilder, DELETE, DeleteQueryBuilder, Executor, ExpressHandler, F, GET, HttpExecutor, JoinBuilder, POST, PUT, PaginationBuilder, SelectQueryBuilder, SqlExecutor, TestRestfulResponse, UpdateQueryBuilder, apiRequestCache, axiosInstance, checkAllRequestsComplete, checkCache, clearCache, convertForRequestBody, convertHexIfBinary, determineRuntimeJsType, distSphere, eFetchDependencies, error, fieldEq, getEnvVar, getPrimaryKeyTypes, group, info, isLocal, isNode, isTest, isVerbose, onError, onSuccess, removeInvalidKeys, removePrefixIfExists, restOrm, restRequest, sortAndSerializeQueryObject, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, warn };
1748
1931
  //# sourceMappingURL=index.esm.js.map