@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.cjs.js CHANGED
@@ -4,6 +4,8 @@ var axios = require('axios');
4
4
  var Qs = require('qs');
5
5
  var tslib = require('tslib');
6
6
  var reactToastify = require('react-toastify');
7
+ var namedPlaceholders = require('named-placeholders');
8
+ var buffer = require('buffer');
7
9
 
8
10
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
9
11
  var C6Constants = {
@@ -69,6 +71,7 @@ var C6Constants = {
69
71
  LOCALTIMESTAMP: 'LOCALTIMESTAMP',
70
72
  MAKEDATE: 'MAKEDATE',
71
73
  MAKETIME: 'MAKETIME',
74
+ MATCH_AGAINST: 'MATCH_AGAINST',
72
75
  MONTHNAME: 'MONTHNAME',
73
76
  MICROSECOND: 'MICROSECOND',
74
77
  MINUTE: 'MINUTE',
@@ -89,6 +92,37 @@ var C6Constants = {
89
92
  SECOND: 'SECOND',
90
93
  SECOND_MICROSECOND: 'SECOND_MICROSECOND',
91
94
  SELECT: 'SELECT',
95
+ // MySQL Spatial Functions
96
+ ST_AREA: 'ST_Area',
97
+ ST_ASBINARY: 'ST_AsBinary',
98
+ ST_ASTEXT: 'ST_AsText',
99
+ ST_BUFFER: 'ST_Buffer',
100
+ ST_CONTAINS: 'ST_Contains',
101
+ ST_CROSSES: 'ST_Crosses',
102
+ ST_DIFFERENCE: 'ST_Difference',
103
+ ST_DIMENSION: 'ST_Dimension',
104
+ ST_DISJOINT: 'ST_Disjoint',
105
+ ST_DISTANCE: 'ST_Distance',
106
+ ST_DISTANCE_SPHERE: 'ST_Distance_Sphere',
107
+ ST_ENDPOINT: 'ST_EndPoint',
108
+ ST_ENVELOPE: 'ST_Envelope',
109
+ ST_EQUALS: 'ST_Equals',
110
+ ST_GEOMFROMGEOJSON: 'ST_GeomFromGeoJSON',
111
+ ST_GEOMFROMTEXT: 'ST_GeomFromText',
112
+ ST_GEOMFROMWKB: 'ST_GeomFromWKB',
113
+ ST_INTERSECTS: 'ST_Intersects',
114
+ ST_LENGTH: 'ST_Length',
115
+ ST_OVERLAPS: 'ST_Overlaps',
116
+ ST_POINT: 'ST_Point',
117
+ ST_SETSRID: 'ST_SetSRID',
118
+ ST_SRID: 'ST_SRID',
119
+ ST_STARTPOINT: 'ST_StartPoint',
120
+ ST_SYMDIFFERENCE: 'ST_SymDifference',
121
+ ST_TOUCHES: 'ST_Touches',
122
+ ST_UNION: 'ST_Union',
123
+ ST_WITHIN: 'ST_Within',
124
+ ST_X: 'ST_X',
125
+ ST_Y: 'ST_Y',
92
126
  STR_TO_DATE: 'STR_TO_DATE',
93
127
  SUBDATE: 'SUBDATE',
94
128
  SUBTIME: 'SUBTIME',
@@ -131,6 +165,7 @@ var C6Constants = {
131
165
  FINISH: 'FINISH',
132
166
  VALIDATE_C6_ENTITY_ID_REGEX: '#^([a-fA-F0-9]{20,35})$#',
133
167
  };
168
+ var C6C = C6Constants;
134
169
 
135
170
  // @link https://www.npmjs.com/package/axios-cache-adapter
136
171
  // updating these values
@@ -389,9 +424,11 @@ function isVerbose () {
389
424
  }
390
425
 
391
426
  var Executor = /** @class */ (function () {
392
- function Executor(config, request) {
427
+ function Executor(config, request, useNamedParams) {
428
+ if (useNamedParams === void 0) { useNamedParams = false; }
393
429
  this.config = config;
394
430
  this.request = request;
431
+ this.useNamedParams = useNamedParams;
395
432
  }
396
433
  Executor.prototype.runLifecycleHooks = function (phase, args) {
397
434
  return tslib.__awaiter(this, void 0, void 0, function () {
@@ -421,8 +458,10 @@ var Executor = /** @class */ (function () {
421
458
  _d.label = 2;
422
459
  case 2:
423
460
  _d.trys.push([2, 4, , 5]);
461
+ // todo - this
424
462
  return [4 /*yield*/, fn(args)];
425
463
  case 3:
464
+ // todo - this
426
465
  _d.sent();
427
466
  return [3 /*break*/, 5];
428
467
  case 4:
@@ -440,211 +479,6 @@ var Executor = /** @class */ (function () {
440
479
  return Executor;
441
480
  }());
442
481
 
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
482
  function isLocal () {
649
483
  return getEnvVar('NODE_ENV', '') === 'development';
650
484
  }
@@ -1363,10 +1197,246 @@ var HttpExecutor$1 = /*#__PURE__*/Object.freeze({
1363
1197
  HttpExecutor: HttpExecutor
1364
1198
  });
1365
1199
 
1200
+ function convertHexIfBinary(_col, val, columnDef) {
1201
+ if (typeof val === 'string' &&
1202
+ /^[0-9a-fA-F]{32}$/.test(val) &&
1203
+ typeof columnDef === 'object' &&
1204
+ columnDef.MYSQL_TYPE.toUpperCase().includes('BINARY')) {
1205
+ return Buffer.from(val, 'hex');
1206
+ }
1207
+ return val;
1208
+ }
1209
+
1210
+ var AggregateBuilder = /** @class */ (function (_super) {
1211
+ tslib.__extends(AggregateBuilder, _super);
1212
+ function AggregateBuilder() {
1213
+ return _super !== null && _super.apply(this, arguments) || this;
1214
+ }
1215
+ AggregateBuilder.prototype.buildAggregateField = function (field) {
1216
+ var _this = this;
1217
+ if (typeof field === 'string') {
1218
+ return field;
1219
+ }
1220
+ if (!Array.isArray(field) || field.length === 0) {
1221
+ throw new Error('Invalid SELECT field entry');
1222
+ }
1223
+ var fn = field[0], args = field.slice(1);
1224
+ var alias;
1225
+ if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
1226
+ alias = String(args.pop());
1227
+ args.pop();
1228
+ }
1229
+ var F = String(fn).toUpperCase();
1230
+ var argList = args.map(function (arg) {
1231
+ return Array.isArray(arg) ? _this.buildAggregateField(arg) : arg;
1232
+ }).join(', ');
1233
+ var expr = "".concat(F, "(").concat(argList, ")");
1234
+ if (alias) {
1235
+ expr += " AS ".concat(alias);
1236
+ }
1237
+ isVerbose() && console.log("[SELECT] ".concat(expr));
1238
+ return expr;
1239
+ };
1240
+ return AggregateBuilder;
1241
+ }(Executor));
1242
+
1243
+ var ConditionBuilder = /** @class */ (function (_super) {
1244
+ tslib.__extends(ConditionBuilder, _super);
1245
+ function ConditionBuilder() {
1246
+ var _this = _super !== null && _super.apply(this, arguments) || this;
1247
+ _this.OPERATORS = new Set([
1248
+ '=', '!=', '<', '<=', '>', '>=',
1249
+ 'LIKE', 'NOT LIKE', 'IN', 'NOT IN',
1250
+ 'IS', 'IS NOT', 'BETWEEN', 'NOT BETWEEN',
1251
+ C6Constants.MATCH_AGAINST
1252
+ ]);
1253
+ return _this;
1254
+ }
1255
+ ConditionBuilder.prototype.execute = function () {
1256
+ throw new Error("Method not implemented.");
1257
+ };
1258
+ ConditionBuilder.prototype.validateOperator = function (op) {
1259
+ if (!this.OPERATORS.has(op)) {
1260
+ throw new Error("Invalid or unsupported SQL operator detected: '".concat(op, "'"));
1261
+ }
1262
+ };
1263
+ ConditionBuilder.prototype.addParam = function (params, column, value) {
1264
+ var _a, _b;
1265
+ 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];
1266
+ var val = convertHexIfBinary(column, value, columnDef);
1267
+ if (this.useNamedParams) {
1268
+ var key = "param".concat(Object.keys(params).length);
1269
+ params[key] = val;
1270
+ return ":".concat(key);
1271
+ }
1272
+ else {
1273
+ params.push(val);
1274
+ return '?';
1275
+ }
1276
+ };
1277
+ ConditionBuilder.prototype.buildBooleanJoinedConditions = function (set, andMode, params) {
1278
+ var _this = this;
1279
+ if (andMode === void 0) { andMode = true; }
1280
+ if (params === void 0) { params = []; }
1281
+ var booleanOperator = andMode ? 'AND' : 'OR';
1282
+ var addCondition = function (column, op, value) {
1283
+ _this.validateOperator(op);
1284
+ if (op === C6Constants.MATCH_AGAINST && Array.isArray(value)) {
1285
+ var search = value[0], mode = value[1];
1286
+ var paramName = _this.useNamedParams ? "param".concat(Object.keys(params).length) : null;
1287
+ if (_this.useNamedParams) {
1288
+ params[paramName] = search;
1289
+ }
1290
+ else {
1291
+ params.push(search);
1292
+ }
1293
+ var againstClause = void 0;
1294
+ switch ((mode || '').toUpperCase()) {
1295
+ case 'BOOLEAN':
1296
+ againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, " IN BOOLEAN MODE)") : "AGAINST(? IN BOOLEAN MODE)";
1297
+ break;
1298
+ case 'WITH QUERY EXPANSION':
1299
+ againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, " WITH QUERY EXPANSION)") : "AGAINST(? WITH QUERY EXPANSION)";
1300
+ break;
1301
+ default: // NATURAL or undefined
1302
+ againstClause = _this.useNamedParams ? "AGAINST(:".concat(paramName, ")") : "AGAINST(?)";
1303
+ break;
1304
+ }
1305
+ var matchClause = "(MATCH(".concat(column, ") ").concat(againstClause, ")");
1306
+ isVerbose() && console.log("[MATCH_AGAINST] ".concat(matchClause));
1307
+ return matchClause;
1308
+ }
1309
+ // handle other operators
1310
+ return "( ".concat(column, " ").concat(op, " ").concat(_this.addParam(params, column, value), " )");
1311
+ };
1312
+ var parts = [];
1313
+ if (typeof set === 'object' && !Array.isArray(set)) {
1314
+ for (var _i = 0, _a = Object.entries(set); _i < _a.length; _i++) {
1315
+ var _b = _a[_i], key = _b[0], value = _b[1];
1316
+ if (typeof value === 'object' && value !== null && Object.keys(value).length === 1) {
1317
+ var _c = Object.entries(value)[0], op = _c[0], val = _c[1];
1318
+ parts.push(addCondition(key, op, val));
1319
+ }
1320
+ else {
1321
+ parts.push(addCondition(key, '=', value));
1322
+ }
1323
+ }
1324
+ }
1325
+ var clause = parts.join(" ".concat(booleanOperator, " "));
1326
+ return clause ? "(".concat(clause, ")") : '';
1327
+ };
1328
+ ConditionBuilder.prototype.buildWhereClause = function (whereArg, params) {
1329
+ var clause = this.buildBooleanJoinedConditions(whereArg, true, params);
1330
+ if (!clause)
1331
+ return '';
1332
+ var trimmed = clause.replace(/^\((.*)\)$/, '$1');
1333
+ isVerbose() && console.log("[WHERE] ".concat(trimmed));
1334
+ return " WHERE ".concat(trimmed);
1335
+ };
1336
+ return ConditionBuilder;
1337
+ }(AggregateBuilder));
1338
+
1339
+ var JoinBuilder = /** @class */ (function (_super) {
1340
+ tslib.__extends(JoinBuilder, _super);
1341
+ function JoinBuilder() {
1342
+ return _super !== null && _super.apply(this, arguments) || this;
1343
+ }
1344
+ JoinBuilder.prototype.buildJoinClauses = function (joinArgs, params) {
1345
+ var sql = '';
1346
+ for (var joinType in joinArgs) {
1347
+ var joinKind = joinType.replace('_', ' ').toUpperCase();
1348
+ for (var raw in joinArgs[joinType]) {
1349
+ var _a = raw.split(' '), table = _a[0], alias = _a[1];
1350
+ var onClause = this.buildBooleanJoinedConditions(joinArgs[joinType][raw], true, params);
1351
+ var joinSql = alias ? "`".concat(table, "` AS `").concat(alias, "`") : "`".concat(table, "`");
1352
+ sql += " ".concat(joinKind, " JOIN ").concat(joinSql, " ON ").concat(onClause);
1353
+ }
1354
+ }
1355
+ isVerbose() && console.log("[JOIN] ".concat(sql.trim()));
1356
+ return sql;
1357
+ };
1358
+ return JoinBuilder;
1359
+ }(ConditionBuilder));
1360
+
1361
+ var PaginationBuilder = /** @class */ (function (_super) {
1362
+ tslib.__extends(PaginationBuilder, _super);
1363
+ function PaginationBuilder() {
1364
+ return _super !== null && _super.apply(this, arguments) || this;
1365
+ }
1366
+ PaginationBuilder.prototype.buildPaginationClause = function (pagination) {
1367
+ var _this = this;
1368
+ var _a;
1369
+ var sql = '';
1370
+ if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
1371
+ var orderParts = Object.entries(pagination[C6Constants.ORDER])
1372
+ .map(function (_a) {
1373
+ var col = _a[0], dir = _a[1];
1374
+ return "".concat(Array.isArray(col) ? _this.buildAggregateField(col) : col, " ").concat(String(dir).toUpperCase());
1375
+ });
1376
+ sql += " ORDER BY ".concat(orderParts.join(', '));
1377
+ }
1378
+ if ((pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.LIMIT]) != null) {
1379
+ var lim = parseInt(pagination[C6Constants.LIMIT], 10);
1380
+ var page = parseInt((_a = pagination[C6Constants.PAGE]) !== null && _a !== void 0 ? _a : 1, 10);
1381
+ var offset = (page - 1) * lim;
1382
+ sql += " LIMIT ".concat(offset, ", ").concat(lim);
1383
+ }
1384
+ isVerbose() && console.log("[PAGINATION] ".concat(sql.trim()));
1385
+ return sql;
1386
+ };
1387
+ return PaginationBuilder;
1388
+ }(JoinBuilder));
1389
+
1390
+ var SelectQueryBuilder = /** @class */ (function (_super) {
1391
+ tslib.__extends(SelectQueryBuilder, _super);
1392
+ function SelectQueryBuilder() {
1393
+ return _super !== null && _super.apply(this, arguments) || this;
1394
+ }
1395
+ SelectQueryBuilder.prototype.build = function (table, args, primary, isSubSelect) {
1396
+ var _this = this;
1397
+ var _a;
1398
+ if (isSubSelect === void 0) { isSubSelect = false; }
1399
+ var params = this.useNamedParams ? {} : [];
1400
+ var selectList = (_a = args.SELECT) !== null && _a !== void 0 ? _a : ['*'];
1401
+ var selectFields = selectList
1402
+ .map(function (f) { return _this.buildAggregateField(f); })
1403
+ .join(', ');
1404
+ var sql = "SELECT ".concat(selectFields, " FROM `").concat(table, "`");
1405
+ if (args.JOIN) {
1406
+ sql += this.buildJoinClauses(args.JOIN, params);
1407
+ }
1408
+ if (args.WHERE) {
1409
+ sql += this.buildWhereClause(args.WHERE, params);
1410
+ }
1411
+ if (args.GROUP_BY) {
1412
+ var groupBy = Array.isArray(args.GROUP_BY)
1413
+ ? args.GROUP_BY.join(', ')
1414
+ : args.GROUP_BY;
1415
+ sql += " GROUP BY ".concat(groupBy);
1416
+ }
1417
+ if (args.HAVING) {
1418
+ sql += " HAVING ".concat(this.buildBooleanJoinedConditions(args.HAVING, true, params));
1419
+ }
1420
+ if (args.PAGINATION) {
1421
+ sql += this.buildPaginationClause(args.PAGINATION);
1422
+ }
1423
+ else if (!isSubSelect) {
1424
+ sql += primary ? " ORDER BY ".concat(primary, " ASC LIMIT 1") : " LIMIT 100";
1425
+ }
1426
+ return { sql: sql, params: params };
1427
+ };
1428
+ return SelectQueryBuilder;
1429
+ }(PaginationBuilder));
1430
+
1366
1431
  var SqlExecutor = /** @class */ (function (_super) {
1367
1432
  tslib.__extends(SqlExecutor, _super);
1368
1433
  function SqlExecutor() {
1369
- return _super !== null && _super.apply(this, arguments) || this;
1434
+ var _this = _super !== null && _super.apply(this, arguments) || this;
1435
+ _this.serialize = function (row) { return Object.fromEntries(Object.entries(row).map(function (_a) {
1436
+ var k = _a[0], v = _a[1];
1437
+ return [k, buffer.Buffer.isBuffer(v) ? v.toString('hex').toUpperCase() : v];
1438
+ })); };
1439
+ return _this;
1370
1440
  }
1371
1441
  SqlExecutor.prototype.execute = function () {
1372
1442
  return tslib.__awaiter(this, void 0, void 0, function () {
@@ -1390,7 +1460,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1390
1460
  case 2:
1391
1461
  rest = _b.sent();
1392
1462
  console.log("[SQL EXECUTOR] \u2705 GET result:", rest);
1393
- return [2 /*return*/, { rest: rest }];
1463
+ return [2 /*return*/, rest];
1394
1464
  case 3: return [4 /*yield*/, this.insert(TABLE_NAME, this.request)];
1395
1465
  case 4:
1396
1466
  result = _b.sent();
@@ -1401,11 +1471,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1401
1471
  case 6:
1402
1472
  result = _b.sent();
1403
1473
  console.log("[SQL EXECUTOR] \u2705 PUT result:", result);
1404
- updated = {
1405
- rest: result,
1406
- updated: true,
1407
- rowCount: result.affectedRows
1408
- };
1474
+ updated = tslib.__assign(tslib.__assign({}, result), { updated: true, rowCount: result.rest.affectedRows });
1409
1475
  return [2 /*return*/, updated];
1410
1476
  case 7: return [4 /*yield*/, this.delete(TABLE_NAME, [], this.request)];
1411
1477
  case 8:
@@ -1414,7 +1480,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1414
1480
  deleted = {
1415
1481
  rest: result,
1416
1482
  deleted: true,
1417
- rowCount: result.affectedRows
1483
+ rowCount: result.rest.affectedRows
1418
1484
  };
1419
1485
  return [2 /*return*/, deleted];
1420
1486
  case 9: throw new Error("Unsupported request method: ".concat(method));
@@ -1449,28 +1515,36 @@ var SqlExecutor = /** @class */ (function (_super) {
1449
1515
  };
1450
1516
  SqlExecutor.prototype.select = function (table, primary, args) {
1451
1517
  return tslib.__awaiter(this, void 0, void 0, function () {
1452
- var sql, formatted;
1518
+ var QueryResult, formatted, toUnnamed, _a, sql, values;
1453
1519
  var _this = this;
1454
- return tslib.__generator(this, function (_a) {
1455
- switch (_a.label) {
1520
+ return tslib.__generator(this, function (_b) {
1521
+ switch (_b.label) {
1456
1522
  case 0:
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);
1523
+ QueryResult = (new SelectQueryBuilder(this.config, this.request)).build(table, args, primary);
1524
+ console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated SELECT SQL:", QueryResult);
1525
+ formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
1460
1526
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Formatted SELECT SQL:", formatted);
1527
+ toUnnamed = namedPlaceholders();
1528
+ _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
1461
1529
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
1462
1530
  var rows;
1463
1531
  return tslib.__generator(this, function (_a) {
1464
1532
  switch (_a.label) {
1465
- case 0: return [4 /*yield*/, conn.query(sql.sql, sql.params)];
1533
+ case 0: return [4 /*yield*/, conn.query(sql, values)];
1466
1534
  case 1:
1467
1535
  rows = (_a.sent())[0];
1468
1536
  console.log("[SQL EXECUTOR] \uD83D\uDCE6 Rows fetched:", rows);
1469
- return [2 /*return*/, rows];
1537
+ return [2 /*return*/, {
1538
+ rest: rows.map(this.serialize),
1539
+ sql: {
1540
+ sql: sql,
1541
+ values: values
1542
+ }
1543
+ }];
1470
1544
  }
1471
1545
  });
1472
1546
  }); })];
1473
- case 1: return [2 /*return*/, _a.sent()];
1547
+ case 1: return [2 /*return*/, _b.sent()];
1474
1548
  }
1475
1549
  });
1476
1550
  });
@@ -1485,7 +1559,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1485
1559
  keys = Object.keys(data);
1486
1560
  values = keys.map(function (k) { return data[k]; });
1487
1561
  placeholders = keys.map(function () { return '?'; }).join(', ');
1488
- sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ") VALUES (").concat(placeholders, ")");
1562
+ sql = "INSERT INTO `".concat(table, "` (").concat(keys.join(', '), ")\n VALUES (").concat(placeholders, ")");
1489
1563
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated INSERT SQL:", sql);
1490
1564
  console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
1491
1565
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
@@ -1495,7 +1569,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1495
1569
  case 0: return [4 /*yield*/, conn.execute(sql, values)];
1496
1570
  case 1:
1497
1571
  result = (_a.sent())[0];
1498
- return [2 /*return*/, result];
1572
+ return [2 /*return*/, {
1573
+ rest: result,
1574
+ sql: {
1575
+ sql: sql,
1576
+ placeholders: placeholders
1577
+ }
1578
+ }];
1499
1579
  }
1500
1580
  });
1501
1581
  }); })];
@@ -1516,7 +1596,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1516
1596
  keys = Object.keys(data);
1517
1597
  values = keys.map(function (k) { return data[k]; });
1518
1598
  updates = keys.map(function (k) { return "`".concat(k, "` = ?"); }).join(', ');
1519
- sql = "UPDATE `".concat(table, "` SET ").concat(updates, " WHERE `").concat(primary[0], "` = ?");
1599
+ sql = "UPDATE `".concat(table, "`\n SET ").concat(updates, "\n WHERE `").concat(primary[0], "` = ?");
1520
1600
  values.push(data[primary[0]]);
1521
1601
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated UPDATE SQL:", sql);
1522
1602
  console.log("[SQL EXECUTOR] \uD83D\uDD22 Values:", values);
@@ -1527,7 +1607,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1527
1607
  case 0: return [4 /*yield*/, conn.execute(sql, values)];
1528
1608
  case 1:
1529
1609
  result = (_a.sent())[0];
1530
- return [2 /*return*/, result];
1610
+ return [2 /*return*/, {
1611
+ rest: result,
1612
+ sql: {
1613
+ sql: sql,
1614
+ values: values
1615
+ }
1616
+ }];
1531
1617
  }
1532
1618
  });
1533
1619
  }); })];
@@ -1546,7 +1632,7 @@ var SqlExecutor = /** @class */ (function (_super) {
1546
1632
  key = primary === null || primary === void 0 ? void 0 : primary[0];
1547
1633
  if (!key || !(args === null || args === void 0 ? void 0 : args[key]))
1548
1634
  throw new Error('Primary key and value required for delete');
1549
- sql = "DELETE FROM `".concat(table, "` WHERE `").concat(key, "` = ?");
1635
+ sql = "DELETE\n FROM `".concat(table, "`\n WHERE `").concat(key, "` = ?");
1550
1636
  console.log("[SQL EXECUTOR] \uD83E\uDDE0 Generated DELETE SQL:", sql);
1551
1637
  console.log("[SQL EXECUTOR] \uD83D\uDD22 Value:", args[key]);
1552
1638
  return [4 /*yield*/, this.withConnection(function (conn) { return tslib.__awaiter(_this, void 0, void 0, function () {
@@ -1556,7 +1642,13 @@ var SqlExecutor = /** @class */ (function (_super) {
1556
1642
  case 0: return [4 /*yield*/, conn.execute(sql, [args[key]])];
1557
1643
  case 1:
1558
1644
  result = (_a.sent())[0];
1559
- return [2 /*return*/, result];
1645
+ return [2 /*return*/, {
1646
+ rest: result,
1647
+ sql: {
1648
+ sql: sql,
1649
+ args: args
1650
+ }
1651
+ }];
1560
1652
  }
1561
1653
  });
1562
1654
  }); })];
@@ -1566,26 +1658,38 @@ var SqlExecutor = /** @class */ (function (_super) {
1566
1658
  });
1567
1659
  };
1568
1660
  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
- });
1661
+ var _this = this;
1662
+ if (Array.isArray(params)) {
1663
+ var index_1 = 0;
1664
+ return sql.replace(/\?/g, function () {
1665
+ if (index_1 >= params.length)
1666
+ return '?';
1667
+ var val = params[index_1++];
1668
+ return _this.formatValue(val);
1669
+ });
1670
+ }
1671
+ else {
1672
+ return sql.replace(/:([a-zA-Z0-9_]+)/g, function (_, key) {
1673
+ var val = params[key];
1674
+ return _this.formatValue(val);
1675
+ });
1676
+ }
1677
+ };
1678
+ SqlExecutor.prototype.formatValue = function (val) {
1679
+ if (val === null || val === undefined)
1680
+ return 'NULL';
1681
+ if (buffer.Buffer.isBuffer(val))
1682
+ return "UNHEX('".concat(val.toString('hex'), "')");
1683
+ if (typeof val === 'string')
1684
+ return "'".concat(val.replace(/'/g, "''"), "'");
1685
+ if (typeof val === 'number')
1686
+ return val.toString();
1687
+ if (val instanceof Date)
1688
+ return "'".concat(val.toISOString().slice(0, 19).replace('T', ' '), "'");
1689
+ return "'".concat(JSON.stringify(val), "'");
1586
1690
  };
1587
1691
  return SqlExecutor;
1588
- }(SqlBuilder));
1692
+ }(Executor));
1589
1693
 
1590
1694
  var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
1591
1695
  __proto__: null,
@@ -1636,11 +1740,11 @@ function ExpressHandler(_a) {
1636
1740
  })(payload)];
1637
1741
  case 1:
1638
1742
  response = _a.sent();
1639
- console.log('response', JSON.stringify(response));
1640
1743
  res.status(200).json(tslib.__assign({ success: true }, response));
1641
1744
  return [3 /*break*/, 3];
1642
1745
  case 2:
1643
1746
  err_1 = _a.sent();
1747
+ res.status(500).json({ success: false, error: err_1 });
1644
1748
  next(err_1);
1645
1749
  return [3 /*break*/, 3];
1646
1750
  case 3: return [2 /*return*/];
@@ -1649,6 +1753,85 @@ function ExpressHandler(_a) {
1649
1753
  }); };
1650
1754
  }
1651
1755
 
1756
+ // Alias a table name with a given alias
1757
+ var A = function (tableName, alias) {
1758
+ return "".concat(tableName, " ").concat(alias);
1759
+ };
1760
+ // Qualify a column constant (e.g. 'property_units.parcel_id') to an alias
1761
+ var F = function (qualifiedCol, alias) {
1762
+ return "".concat(alias, ".").concat(qualifiedCol.split('.').pop());
1763
+ };
1764
+ // Equal join condition using full-qualified column constants
1765
+ var fieldEq = function (leftCol, rightCol, leftAlias, rightAlias) {
1766
+ var _a;
1767
+ return (_a = {},
1768
+ _a[F(leftCol, leftAlias)] = F(rightCol, rightAlias),
1769
+ _a);
1770
+ };
1771
+ // ST_Distance_Sphere for aliased fields
1772
+ var distSphere = function (fromCol, toCol, fromAlias, toAlias) {
1773
+ return [C6C.ST_DISTANCE_SPHERE, F(fromCol, fromAlias), F(toCol, toAlias)];
1774
+ };
1775
+
1776
+ var DeleteQueryBuilder = /** @class */ (function (_super) {
1777
+ tslib.__extends(DeleteQueryBuilder, _super);
1778
+ function DeleteQueryBuilder() {
1779
+ return _super !== null && _super.apply(this, arguments) || this;
1780
+ }
1781
+ DeleteQueryBuilder.prototype.build = function (table, args) {
1782
+ if (args === void 0) { args = {}; }
1783
+ var params = this.useNamedParams ? {} : [];
1784
+ var sql = args.JOIN ? "DELETE ".concat(table, "\n FROM `").concat(table, "`") : "DELETE\n FROM `".concat(table, "`");
1785
+ if (args.JOIN) {
1786
+ sql += this.buildJoinClauses(args.JOIN, params);
1787
+ }
1788
+ if (args.WHERE) {
1789
+ sql += this.buildWhereClause(args.WHERE, params);
1790
+ }
1791
+ if (args.PAGINATION) {
1792
+ sql += this.buildPaginationClause(args.PAGINATION);
1793
+ }
1794
+ return { sql: sql, params: params };
1795
+ };
1796
+ return DeleteQueryBuilder;
1797
+ }(PaginationBuilder));
1798
+
1799
+ var UpdateQueryBuilder = /** @class */ (function (_super) {
1800
+ tslib.__extends(UpdateQueryBuilder, _super);
1801
+ function UpdateQueryBuilder() {
1802
+ return _super !== null && _super.apply(this, arguments) || this;
1803
+ }
1804
+ UpdateQueryBuilder.prototype.build = function (table, data, args) {
1805
+ if (args === void 0) { args = {}; }
1806
+ var params = this.useNamedParams ? {} : [];
1807
+ var sql = "UPDATE `".concat(table, "`");
1808
+ if (args.JOIN) {
1809
+ sql += this.buildJoinClauses(args.JOIN, params);
1810
+ }
1811
+ var setClauses = Object.entries(data).map(function (_a) {
1812
+ var col = _a[0], val = _a[1];
1813
+ if (Array.isArray(params)) {
1814
+ params.push(val);
1815
+ return "`".concat(col, "` = ?");
1816
+ }
1817
+ else {
1818
+ var key = "param".concat(Object.keys(params).length);
1819
+ params[key] = val;
1820
+ return "`".concat(col, "` = :").concat(key);
1821
+ }
1822
+ });
1823
+ sql += " SET ".concat(setClauses.join(', '));
1824
+ if (args.WHERE) {
1825
+ sql += this.buildWhereClause(args.WHERE, params);
1826
+ }
1827
+ if (args.PAGINATION) {
1828
+ sql += this.buildPaginationClause(args.PAGINATION);
1829
+ }
1830
+ return { sql: sql, params: params };
1831
+ };
1832
+ return UpdateQueryBuilder;
1833
+ }(PaginationBuilder));
1834
+
1652
1835
  function determineRuntimeJsType(mysqlType) {
1653
1836
  var base = mysqlType.toLowerCase().split('(')[0];
1654
1837
  if ([
@@ -1747,24 +1930,36 @@ function onError(message) {
1747
1930
  reactToastify.toast.error(message, isLocal() ? toastOptionsDevs : toastOptions);
1748
1931
  }
1749
1932
 
1933
+ exports.A = A;
1934
+ exports.AggregateBuilder = AggregateBuilder;
1935
+ exports.C6C = C6C;
1750
1936
  exports.C6Constants = C6Constants;
1937
+ exports.ConditionBuilder = ConditionBuilder;
1751
1938
  exports.DELETE = DELETE;
1939
+ exports.DeleteQueryBuilder = DeleteQueryBuilder;
1752
1940
  exports.Executor = Executor;
1753
1941
  exports.ExpressHandler = ExpressHandler;
1942
+ exports.F = F;
1754
1943
  exports.GET = GET;
1755
1944
  exports.HttpExecutor = HttpExecutor;
1945
+ exports.JoinBuilder = JoinBuilder;
1756
1946
  exports.POST = POST;
1757
1947
  exports.PUT = PUT;
1758
- exports.SqlBuilder = SqlBuilder;
1948
+ exports.PaginationBuilder = PaginationBuilder;
1949
+ exports.SelectQueryBuilder = SelectQueryBuilder;
1759
1950
  exports.SqlExecutor = SqlExecutor;
1760
1951
  exports.TestRestfulResponse = TestRestfulResponse;
1952
+ exports.UpdateQueryBuilder = UpdateQueryBuilder;
1761
1953
  exports.axiosInstance = axiosInstance;
1762
1954
  exports.checkAllRequestsComplete = checkAllRequestsComplete;
1763
1955
  exports.checkCache = checkCache;
1764
1956
  exports.clearCache = clearCache;
1765
1957
  exports.convertForRequestBody = convertForRequestBody;
1958
+ exports.convertHexIfBinary = convertHexIfBinary;
1766
1959
  exports.determineRuntimeJsType = determineRuntimeJsType;
1960
+ exports.distSphere = distSphere;
1767
1961
  exports.error = error;
1962
+ exports.fieldEq = fieldEq;
1768
1963
  exports.getEnvVar = getEnvVar;
1769
1964
  exports.getPrimaryKeyTypes = getPrimaryKeyTypes;
1770
1965
  exports.group = group;