@carbonorm/carbonnode 6.0.19 → 6.1.0

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 (89) hide show
  1. package/README.md +46 -1
  2. package/dist/constants/C6Constants.d.ts +342 -338
  3. package/dist/executors/SqlExecutor.d.ts +8 -0
  4. package/dist/index.cjs.js +751 -272
  5. package/dist/index.cjs.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.esm.js +744 -273
  8. package/dist/index.esm.js.map +1 -1
  9. package/dist/orm/builders/AggregateBuilder.d.ts +5 -1
  10. package/dist/orm/builders/ConditionBuilder.d.ts +2 -3
  11. package/dist/orm/builders/ExpressionSerializer.d.ts +22 -0
  12. package/dist/orm/builders/PaginationBuilder.d.ts +4 -6
  13. package/dist/orm/queryHelpers.d.ts +12 -1
  14. package/dist/types/mysqlTypes.d.ts +6 -1
  15. package/dist/types/ormInterfaces.d.ts +7 -5
  16. package/dist/utils/cacheManager.d.ts +3 -2
  17. package/package.json +2 -2
  18. package/scripts/assets/handlebars/C6.test.ts.handlebars +4 -4
  19. package/src/__tests__/cacheManager.test.ts +28 -0
  20. package/src/__tests__/expressServer.e2e.test.ts +26 -17
  21. package/src/__tests__/httpExecutorSingular.e2e.test.ts +53 -14
  22. package/src/__tests__/normalizeSingularRequest.test.ts +26 -8
  23. package/src/__tests__/sakila-db/C6.js +1 -1
  24. package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
  25. package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
  26. package/src/__tests__/sakila-db/C6.sqlAllowList.json +1 -1
  27. package/src/__tests__/sakila-db/C6.test.ts +4 -4
  28. package/src/__tests__/sakila-db/C6.ts +1 -1
  29. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +11 -4
  30. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
  31. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
  32. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
  33. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +26 -7
  34. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
  35. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
  36. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
  37. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +9 -3
  38. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
  39. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
  40. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
  41. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +10 -3
  42. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
  43. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
  44. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
  45. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +9 -3
  46. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
  47. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
  48. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
  49. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +18 -6
  50. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
  51. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
  52. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
  53. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +18 -3
  54. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
  55. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
  56. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
  57. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +9 -2
  58. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
  59. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
  60. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
  61. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +9 -3
  62. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
  63. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
  64. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
  65. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +13 -3
  66. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
  67. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
  68. package/src/__tests__/sakila-db/sqlResponses/C6.rental.join.json +10 -10
  69. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +14 -4
  70. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
  71. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
  72. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
  73. package/src/__tests__/sqlBuilders.complex.test.ts +62 -74
  74. package/src/__tests__/sqlBuilders.expressions.test.ts +58 -30
  75. package/src/__tests__/sqlBuilders.test.ts +68 -4
  76. package/src/__tests__/sqlExecutorPostUuid.test.ts +185 -0
  77. package/src/constants/C6Constants.ts +3 -1
  78. package/src/executors/HttpExecutor.ts +35 -6
  79. package/src/executors/SqlExecutor.ts +232 -4
  80. package/src/index.ts +1 -0
  81. package/src/orm/builders/AggregateBuilder.ts +67 -106
  82. package/src/orm/builders/ConditionBuilder.ts +69 -93
  83. package/src/orm/builders/ExpressionSerializer.ts +275 -0
  84. package/src/orm/builders/PaginationBuilder.ts +24 -34
  85. package/src/orm/queryHelpers.ts +29 -0
  86. package/src/types/mysqlTypes.ts +130 -9
  87. package/src/types/ormInterfaces.ts +7 -7
  88. package/src/utils/cacheManager.ts +6 -4
  89. package/src/utils/normalizeSingularRequest.ts +11 -4
package/dist/index.esm.js CHANGED
@@ -160,6 +160,7 @@ var C6Constants = {
160
160
  AND: 'AND',
161
161
  BETWEEN: 'BETWEEN',
162
162
  CONCAT: 'CONCAT',
163
+ CALL: 'CALL',
163
164
  CONVERT_TZ: 'CONVERT_TZ',
164
165
  COUNT: 'COUNT',
165
166
  COUNT_ALL: 'COUNT_ALL',
@@ -214,6 +215,7 @@ var C6Constants = {
214
215
  LESS_THAN: '<',
215
216
  LESS_THAN_OR_EQUAL_TO: '<=',
216
217
  LIKE: 'LIKE',
218
+ LIT: 'LIT',
217
219
  LIMIT: 'LIMIT',
218
220
  LOCALTIME: 'LOCALTIME',
219
221
  LOCALTIMESTAMP: 'LOCALTIMESTAMP',
@@ -951,7 +953,7 @@ function colorSql(sql) {
951
953
  return s;
952
954
  }
953
955
 
954
- var version = "6.0.19";
956
+ var version = "6.1.0";
955
957
 
956
958
  var DEFAULT_STEP = 8;
957
959
  function parseSemver(version) {
@@ -1111,8 +1113,8 @@ function clearCache(props) {
1111
1113
  // -----------------------------------------------------------------------------
1112
1114
  // Check Cache (dedupe via hashed key)
1113
1115
  // -----------------------------------------------------------------------------
1114
- function checkCache(method, tableName, requestData, logContext) {
1115
- var _a, _b, _c, _d, _e;
1116
+ function checkCache(method, tableName, requestData, logContext, allowListStatus) {
1117
+ var _a, _b, _c, _d, _e, _f, _g;
1116
1118
  var key = makeCacheKey(method, tableName, requestData);
1117
1119
  var cached = apiRequestCache.get(key);
1118
1120
  if (!cached) {
@@ -1122,7 +1124,7 @@ function checkCache(method, tableName, requestData, logContext) {
1122
1124
  var sql = (_d = (_c = (_b = (_a = cached.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.sql) === null || _c === void 0 ? void 0 : _c.sql) !== null && _d !== void 0 ? _d : "";
1123
1125
  var sqlMethod = ((_e = sql.trim().split(/\s+/, 1)[0]) === null || _e === void 0 ? void 0 : _e.toUpperCase()) || method;
1124
1126
  logSql({
1125
- allowListStatus: "not verified",
1127
+ allowListStatus: (_g = (_f = cached.allowListStatus) !== null && _f !== void 0 ? _f : allowListStatus) !== null && _g !== void 0 ? _g : "not verified",
1126
1128
  cacheStatus: "hit",
1127
1129
  context: logContext,
1128
1130
  method: sqlMethod,
@@ -1138,8 +1140,8 @@ function setCache(method, tableName, requestData, cacheEntry) {
1138
1140
  var key = makeCacheKey(method, tableName, requestData);
1139
1141
  apiRequestCache.set(key, cacheEntry);
1140
1142
  }
1141
- function evictCacheEntry(method, tableName, requestData, logContext) {
1142
- var _a, _b, _c, _d, _e;
1143
+ function evictCacheEntry(method, tableName, requestData, logContext, allowListStatus) {
1144
+ var _a, _b, _c, _d, _e, _f, _g;
1143
1145
  var key = makeCacheKey(method, tableName, requestData);
1144
1146
  var cached = apiRequestCache.get(key);
1145
1147
  var deleted = apiRequestCache.delete(key);
@@ -1147,7 +1149,7 @@ function evictCacheEntry(method, tableName, requestData, logContext) {
1147
1149
  var sql = (_d = (_c = (_b = (_a = cached === null || cached === void 0 ? void 0 : cached.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.sql) === null || _c === void 0 ? void 0 : _c.sql) !== null && _d !== void 0 ? _d : "";
1148
1150
  var sqlMethod = ((_e = sql.trim().split(/\s+/, 1)[0]) === null || _e === void 0 ? void 0 : _e.toUpperCase()) || method;
1149
1151
  logSql({
1150
- allowListStatus: "not verified",
1152
+ allowListStatus: (_g = (_f = cached === null || cached === void 0 ? void 0 : cached.allowListStatus) !== null && _f !== void 0 ? _f : allowListStatus) !== null && _g !== void 0 ? _g : "not verified",
1151
1153
  cacheStatus: "evicted",
1152
1154
  context: logContext,
1153
1155
  method: sqlMethod,
@@ -1202,27 +1204,34 @@ var HttpExecutor = /** @class */ (function (_super) {
1202
1204
  };
1203
1205
  HttpExecutor.prototype.postState = function (response, request, callback) {
1204
1206
  var _this = this;
1205
- var _a, _b, _c;
1207
+ var _a, _b, _c, _d, _e, _f;
1208
+ var responseRestRaw = (_a = response.data) === null || _a === void 0 ? void 0 : _a.rest;
1209
+ var responseRows = Array.isArray(responseRestRaw)
1210
+ ? responseRestRaw
1211
+ : (responseRestRaw ? [responseRestRaw] : []);
1206
1212
  if (this.config.restModel.PRIMARY_SHORT.length === 1) {
1207
1213
  var pk = this.config.restModel.PRIMARY_SHORT[0];
1208
1214
  try {
1209
- request[pk] = (_a = response.data) === null || _a === void 0 ? void 0 : _a.created;
1215
+ var created = (_c = (_b = response.data) === null || _b === void 0 ? void 0 : _b.created) !== null && _c !== void 0 ? _c : (_d = responseRows[0]) === null || _d === void 0 ? void 0 : _d[pk];
1216
+ if (created !== undefined) {
1217
+ request[pk] = created;
1218
+ }
1210
1219
  }
1211
- catch ( /* best-effort */_d) { /* best-effort */ }
1220
+ catch ( /* best-effort */_g) { /* best-effort */ }
1212
1221
  }
1213
1222
  else if (isLocal()) {
1214
1223
  logWithLevel(LogLevel.ERROR, getLogContext(this.config, this.request), console.error, "C6 received unexpected results given the primary key length");
1215
1224
  }
1216
- (_b = this.config.reactBootstrap) === null || _b === void 0 ? void 0 : _b.updateRestfulObjectArrays({
1225
+ (_e = this.config.reactBootstrap) === null || _e === void 0 ? void 0 : _e.updateRestfulObjectArrays({
1217
1226
  callback: callback,
1218
1227
  dataOrCallback: undefined !== request.dataInsertMultipleRows
1219
1228
  ? request.dataInsertMultipleRows.map(function (row, index) {
1220
1229
  var _a;
1221
1230
  var normalizedRow = _this.stripTableNameFromKeys(row);
1222
- return removeInvalidKeys(__assign(__assign({}, normalizedRow), (index === 0 ? (_a = response === null || response === void 0 ? void 0 : response.data) === null || _a === void 0 ? void 0 : _a.rest : {})), _this.config.C6.TABLES);
1231
+ return removeInvalidKeys(__assign(__assign({}, normalizedRow), ((_a = responseRows[index]) !== null && _a !== void 0 ? _a : {})), _this.config.C6.TABLES);
1223
1232
  })
1224
1233
  : [
1225
- removeInvalidKeys(__assign(__assign({}, this.stripTableNameFromKeys(request)), (_c = response === null || response === void 0 ? void 0 : response.data) === null || _c === void 0 ? void 0 : _c.rest), this.config.C6.TABLES)
1234
+ removeInvalidKeys(__assign(__assign({}, this.stripTableNameFromKeys(request)), ((_f = responseRows[0]) !== null && _f !== void 0 ? _f : {})), this.config.C6.TABLES)
1226
1235
  ],
1227
1236
  stateKey: this.config.restModel.TABLE_NAME,
1228
1237
  uniqueObjectId: this.config.restModel.PRIMARY_SHORT
@@ -1281,16 +1290,16 @@ var HttpExecutor = /** @class */ (function (_super) {
1281
1290
  }
1282
1291
  query = this.request;
1283
1292
  apiRequest = function () { return __awaiter(_this, void 0, void 0, function () {
1284
- var _a, debug, _b, cacheResults, dataInsertMultipleRows, success, _c, fetchDependencies, _d, error, cachingConfirmed, cacheRequestData, evictFromCache, querySerialized, cachedRequest, cachedData, apiResponse, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKeyList, primaryKeyFullyQualified, primaryKey, whereVal, whereIsEmpty, providedPrimary, primaryVal, axiosActiveRequest_1;
1285
- var _e;
1293
+ var _a, debug, _b, cacheResults, _c, skipReactBootstrap, dataInsertMultipleRows, success, _d, fetchDependencies, _e, error, cachingConfirmed, cacheRequestData, cacheAllowListStatus, evictFromCache, querySerialized, cachedRequest, cachedData, apiResponse, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKeyList, primaryKeyFullyQualified, primaryKey, whereVal, whereIsEmpty, providedPrimary, primaryVal, axiosActiveRequest_1;
1294
+ var _f;
1286
1295
  var _this = this;
1287
- var _f, _g, _h, _j, _k, _l;
1288
- return __generator(this, function (_m) {
1289
- switch (_m.label) {
1296
+ var _g, _h, _j, _k, _l, _m;
1297
+ return __generator(this, function (_o) {
1298
+ switch (_o.label) {
1290
1299
  case 0:
1291
- _a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success, _c = _a.fetchDependencies, fetchDependencies = _c === void 0 ? eFetchDependencies.NONE : _c, _d = _a.error, error = _d === void 0 ? "An unexpected API error occurred!" : _d;
1300
+ _a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, _c = _a.skipReactBootstrap, skipReactBootstrap = _c === void 0 ? false : _c, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success, _d = _a.fetchDependencies, fetchDependencies = _d === void 0 ? eFetchDependencies.NONE : _d, _e = _a.error, error = _e === void 0 ? "An unexpected API error occurred!" : _e;
1292
1301
  if (C6.GET === requestMethod
1293
- && undefined !== ((_f = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _f === void 0 ? void 0 : _f[C6.PAGE])
1302
+ && undefined !== ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.PAGE])
1294
1303
  && 1 !== query[C6.PAGINATION][C6.PAGE]
1295
1304
  && isLocal()
1296
1305
  && shouldLog(LogLevel.DEBUG, logContext)) {
@@ -1311,18 +1320,21 @@ var HttpExecutor = /** @class */ (function (_super) {
1311
1320
  query[C6.PAGINATION][C6.LIMIT] = query[C6.PAGINATION][C6.LIMIT] || 100;
1312
1321
  }
1313
1322
  cacheRequestData = JSON.parse(JSON.stringify(query !== null && query !== void 0 ? query : {}));
1323
+ cacheAllowListStatus = this.config.sqlAllowListPath
1324
+ ? "allowed"
1325
+ : "not verified";
1314
1326
  evictFromCache = requestMethod === GET && cacheResults
1315
- ? function () { return evictCacheEntry(requestMethod, tableName, cacheRequestData, logContext); }
1327
+ ? function () { return evictCacheEntry(requestMethod, tableName, cacheRequestData, logContext, cacheAllowListStatus); }
1316
1328
  : undefined;
1317
1329
  querySerialized = sortAndSerializeQueryObject(tables, cacheRequestData !== null && cacheRequestData !== void 0 ? cacheRequestData : {});
1318
1330
  cachedRequest = false;
1319
1331
  if (cacheResults) {
1320
- cachedRequest = checkCache(requestMethod, tableName, cacheRequestData, logContext);
1332
+ cachedRequest = checkCache(requestMethod, tableName, cacheRequestData, logContext, cacheAllowListStatus);
1321
1333
  }
1322
1334
  if (!cachedRequest) return [3 /*break*/, 2];
1323
1335
  return [4 /*yield*/, cachedRequest];
1324
1336
  case 1:
1325
- cachedData = (_m.sent()).data;
1337
+ cachedData = (_o.sent()).data;
1326
1338
  if (evictFromCache
1327
1339
  && cachedData
1328
1340
  && typeof cachedData === "object"
@@ -1344,9 +1356,9 @@ var HttpExecutor = /** @class */ (function (_super) {
1344
1356
  needsConditionOrPrimaryCheck = (PUT === requestMethod || DELETE === requestMethod)
1345
1357
  && false === skipPrimaryCheck;
1346
1358
  TABLES = C6.TABLES;
1347
- primaryKeyList = structuredClone((_g = TABLES[operatingTable]) === null || _g === void 0 ? void 0 : _g.PRIMARY);
1359
+ primaryKeyList = structuredClone((_h = TABLES[operatingTable]) === null || _h === void 0 ? void 0 : _h.PRIMARY);
1348
1360
  primaryKeyFullyQualified = primaryKeyList === null || primaryKeyList === void 0 ? void 0 : primaryKeyList.pop();
1349
- primaryKey = (_h = primaryKeyFullyQualified === null || primaryKeyFullyQualified === void 0 ? void 0 : primaryKeyFullyQualified.split('.')) === null || _h === void 0 ? void 0 : _h.pop();
1361
+ primaryKey = (_j = primaryKeyFullyQualified === null || primaryKeyFullyQualified === void 0 ? void 0 : primaryKeyFullyQualified.split('.')) === null || _j === void 0 ? void 0 : _j.pop();
1350
1362
  if (needsConditionOrPrimaryCheck) {
1351
1363
  if (undefined === primaryKey) {
1352
1364
  whereVal = query === null || query === void 0 ? void 0 : query[C6.WHERE];
@@ -1355,7 +1367,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1355
1367
  (typeof whereVal === 'object' && !Array.isArray(whereVal) && Object.keys(whereVal).length === 0);
1356
1368
  if (whereIsEmpty) {
1357
1369
  logWithLevel(LogLevel.ERROR, logContext, console.error, query);
1358
- throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((_j = TABLES[operatingTable]) === null || _j === void 0 ? void 0 : _j.PRIMARY) + ') for operatingTable (' + operatingTable + ').');
1370
+ throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((_k = TABLES[operatingTable]) === null || _k === void 0 ? void 0 : _k.PRIMARY) + ') for operatingTable (' + operatingTable + ').');
1359
1371
  }
1360
1372
  }
1361
1373
  else {
@@ -1367,7 +1379,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1367
1379
  }
1368
1380
  throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
1369
1381
  }
1370
- providedPrimary = (_k = query === null || query === void 0 ? void 0 : query[primaryKey]) !== null && _k !== void 0 ? _k : (primaryKeyFullyQualified ? query === null || query === void 0 ? void 0 : query[primaryKeyFullyQualified] : undefined);
1382
+ providedPrimary = (_l = query === null || query === void 0 ? void 0 : query[primaryKey]) !== null && _l !== void 0 ? _l : (primaryKeyFullyQualified ? query === null || query === void 0 ? void 0 : query[primaryKeyFullyQualified] : undefined);
1371
1383
  if (undefined === providedPrimary || null === providedPrimary) {
1372
1384
  notifyToast("error", "The primary key (".concat(primaryKey, ") provided is undefined or null explicitly!!"));
1373
1385
  throw Error('The primary key (' + primaryKey + ') provided in the request was exactly equal to undefined.');
@@ -1381,7 +1393,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1381
1393
  && undefined !== query
1382
1394
  && null !== query
1383
1395
  && undefined !== primaryKey) {
1384
- primaryVal = (_l = query[primaryKey]) !== null && _l !== void 0 ? _l : (primaryKeyFullyQualified ? query[primaryKeyFullyQualified] : undefined);
1396
+ primaryVal = (_m = query[primaryKey]) !== null && _m !== void 0 ? _m : (primaryKeyFullyQualified ? query[primaryKeyFullyQualified] : undefined);
1385
1397
  if (undefined !== primaryVal) {
1386
1398
  restRequestUri += primaryVal + '/';
1387
1399
  if (isLocal() && shouldLog(LogLevel.DEBUG, logContext)) {
@@ -1409,7 +1421,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1409
1421
  config: this.config,
1410
1422
  request: this.request
1411
1423
  });
1412
- axiosActiveRequest_1 = (_e = axios)[requestMethod.toLowerCase()].apply(_e, __spreadArray([restRequestUri], (function () {
1424
+ axiosActiveRequest_1 = (_f = axios)[requestMethod.toLowerCase()].apply(_f, __spreadArray([restRequestUri], (function () {
1413
1425
  var convert = function (data) {
1414
1426
  return convertForRequestBody(data, fullTableList, C6, function (message) { return notifyToast("error", message, toastOptions); });
1415
1427
  };
@@ -1441,6 +1453,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1441
1453
  setCache(requestMethod, tableName, cacheRequestData, {
1442
1454
  requestArgumentsSerialized: querySerialized,
1443
1455
  request: axiosActiveRequest_1,
1456
+ allowListStatus: cacheAllowListStatus,
1444
1457
  });
1445
1458
  }
1446
1459
  // returning the promise with this then is important for tests. todo - we could make that optional.
@@ -1458,6 +1471,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1458
1471
  setCache(requestMethod, tableName, cacheRequestData, {
1459
1472
  requestArgumentsSerialized: querySerialized,
1460
1473
  request: axiosActiveRequest_1,
1474
+ allowListStatus: cacheAllowListStatus,
1461
1475
  response: response,
1462
1476
  final: true,
1463
1477
  });
@@ -1474,6 +1488,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1474
1488
  setCache(requestMethod, tableName, cacheRequestData, {
1475
1489
  requestArgumentsSerialized: querySerialized,
1476
1490
  request: axiosActiveRequest_1,
1491
+ allowListStatus: cacheAllowListStatus,
1477
1492
  response: response,
1478
1493
  });
1479
1494
  }
@@ -1495,7 +1510,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1495
1510
  request: _this.request,
1496
1511
  response: response
1497
1512
  }); };
1498
- if (undefined !== reactBootstrap && response) {
1513
+ if (undefined !== reactBootstrap && response && !skipReactBootstrap) {
1499
1514
  switch (requestMethod) {
1500
1515
  case GET:
1501
1516
  response.data && reactBootstrap.updateRestfulObjectArrays({
@@ -1538,6 +1553,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1538
1553
  setCache(requestMethod, tableName, cacheRequestData, {
1539
1554
  requestArgumentsSerialized: querySerialized,
1540
1555
  request: axiosActiveRequest_1,
1556
+ allowListStatus: cacheAllowListStatus,
1541
1557
  response: response,
1542
1558
  final: !hasNext,
1543
1559
  });
@@ -1737,6 +1753,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1737
1753
  setCache(requestMethod, tableName, cacheRequestData, {
1738
1754
  requestArgumentsSerialized: querySerialized,
1739
1755
  request: axiosActiveRequest_1,
1756
+ allowListStatus: cacheAllowListStatus,
1740
1757
  response: response,
1741
1758
  final: true,
1742
1759
  });
@@ -1790,6 +1807,318 @@ function convertHexIfBinary(_col, val, columnDef) {
1790
1807
  return val;
1791
1808
  }
1792
1809
 
1810
+ // ========================
1811
+ // SQL Operators & Expressions
1812
+ // ========================
1813
+ var SQL_KNOWN_FUNCTIONS = [
1814
+ 'ADDDATE',
1815
+ 'ADDTIME',
1816
+ 'CONCAT',
1817
+ 'CONVERT_TZ',
1818
+ 'COUNT',
1819
+ 'COUNT_ALL',
1820
+ 'CURRENT_DATE',
1821
+ 'CURRENT_TIMESTAMP',
1822
+ 'DAY',
1823
+ 'DAY_HOUR',
1824
+ 'DAY_MICROSECOND',
1825
+ 'DAY_MINUTE',
1826
+ 'DAY_SECOND',
1827
+ 'DAYNAME',
1828
+ 'DAYOFMONTH',
1829
+ 'DAYOFWEEK',
1830
+ 'DAYOFYEAR',
1831
+ 'DATE',
1832
+ 'DATE_ADD',
1833
+ 'DATEDIFF',
1834
+ 'DATE_SUB',
1835
+ 'DATE_FORMAT',
1836
+ 'EXTRACT',
1837
+ 'FROM_DAYS',
1838
+ 'FROM_UNIXTIME',
1839
+ 'GET_FORMAT',
1840
+ 'GROUP_CONCAT',
1841
+ 'HEX',
1842
+ 'HOUR',
1843
+ 'HOUR_MICROSECOND',
1844
+ 'HOUR_MINUTE',
1845
+ 'HOUR_SECOND',
1846
+ 'INTERVAL',
1847
+ 'LOCALTIME',
1848
+ 'LOCALTIMESTAMP',
1849
+ 'MAKEDATE',
1850
+ 'MAKETIME',
1851
+ 'MAX',
1852
+ 'MBRContains',
1853
+ 'MICROSECOND',
1854
+ 'MIN',
1855
+ 'MINUTE',
1856
+ 'MINUTE_MICROSECOND',
1857
+ 'MINUTE_SECOND',
1858
+ 'MONTH',
1859
+ 'MONTHNAME',
1860
+ 'NOW',
1861
+ 'POINT',
1862
+ 'POLYGON',
1863
+ 'SECOND',
1864
+ 'SECOND_MICROSECOND',
1865
+ 'ST_Area',
1866
+ 'ST_AsBinary',
1867
+ 'ST_AsText',
1868
+ 'ST_Buffer',
1869
+ 'ST_Contains',
1870
+ 'ST_Crosses',
1871
+ 'ST_Difference',
1872
+ 'ST_Dimension',
1873
+ 'ST_Disjoint',
1874
+ 'ST_Distance',
1875
+ 'ST_Distance_Sphere',
1876
+ 'ST_EndPoint',
1877
+ 'ST_Envelope',
1878
+ 'ST_Equals',
1879
+ 'ST_GeomFromGeoJSON',
1880
+ 'ST_GeomFromText',
1881
+ 'ST_GeomFromWKB',
1882
+ 'ST_Intersects',
1883
+ 'ST_Length',
1884
+ 'ST_MakeEnvelope',
1885
+ 'ST_Overlaps',
1886
+ 'ST_Point',
1887
+ 'ST_SetSRID',
1888
+ 'ST_SRID',
1889
+ 'ST_StartPoint',
1890
+ 'ST_SymDifference',
1891
+ 'ST_Touches',
1892
+ 'ST_Union',
1893
+ 'ST_Within',
1894
+ 'ST_X',
1895
+ 'ST_Y',
1896
+ 'STR_TO_DATE',
1897
+ 'SUBDATE',
1898
+ 'SUBTIME',
1899
+ 'SUM',
1900
+ 'SYSDATE',
1901
+ 'TIME',
1902
+ 'TIME_FORMAT',
1903
+ 'TIME_TO_SEC',
1904
+ 'TIMEDIFF',
1905
+ 'TIMESTAMP',
1906
+ 'TIMESTAMPADD',
1907
+ 'TIMESTAMPDIFF',
1908
+ 'TO_DAYS',
1909
+ 'TO_SECONDS',
1910
+ 'TRANSACTION_TIMESTAMP',
1911
+ 'UNHEX',
1912
+ 'UNIX_TIMESTAMP',
1913
+ 'UTC_DATE',
1914
+ 'UTC_TIME',
1915
+ 'UTC_TIMESTAMP',
1916
+ 'WEEKDAY',
1917
+ 'WEEKOFYEAR',
1918
+ 'YEARWEEK',
1919
+ ];
1920
+
1921
+ var IDENTIFIER_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
1922
+ var isFiniteNumber = function (value) {
1923
+ return typeof value === 'number' && Number.isFinite(value);
1924
+ };
1925
+ var normalizeToken = function (token) { return token.trim(); };
1926
+ var ensureParams = function (opts) {
1927
+ if (!opts.params) {
1928
+ throw new Error("".concat(opts.context, " requires parameter tracking for literal bindings."));
1929
+ }
1930
+ if (!opts.hooks.addParam) {
1931
+ throw new Error("".concat(opts.context, " requires addParam support for literal bindings."));
1932
+ }
1933
+ return opts.params;
1934
+ };
1935
+ var serializeStringReference = function (raw, opts) {
1936
+ var value = raw.trim();
1937
+ if (value === '*') {
1938
+ return {
1939
+ sql: value,
1940
+ isReference: true,
1941
+ isExpression: false,
1942
+ isSubSelect: false,
1943
+ };
1944
+ }
1945
+ if (!opts.hooks.isReference(value)) {
1946
+ throw new Error("Bare string '".concat(raw, "' is not a reference in ").concat(opts.context, ". Wrap literal strings with [C6C.LIT, value]."));
1947
+ }
1948
+ if (value.includes('.')) {
1949
+ opts.hooks.assertValidIdentifier(value, opts.context);
1950
+ }
1951
+ return {
1952
+ sql: value,
1953
+ isReference: true,
1954
+ isExpression: false,
1955
+ isSubSelect: false,
1956
+ };
1957
+ };
1958
+ var serializeLiteralValue = function (value, opts) {
1959
+ var _a;
1960
+ if (value === null || value === C6C.NULL) {
1961
+ return {
1962
+ sql: 'NULL',
1963
+ isReference: false,
1964
+ isExpression: false,
1965
+ isSubSelect: false,
1966
+ };
1967
+ }
1968
+ if (isFiniteNumber(value)) {
1969
+ return {
1970
+ sql: String(value),
1971
+ isReference: false,
1972
+ isExpression: false,
1973
+ isSubSelect: false,
1974
+ };
1975
+ }
1976
+ if (typeof value === 'boolean') {
1977
+ return {
1978
+ sql: value ? 'TRUE' : 'FALSE',
1979
+ isReference: false,
1980
+ isExpression: false,
1981
+ isSubSelect: false,
1982
+ };
1983
+ }
1984
+ if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
1985
+ var params = ensureParams(opts);
1986
+ return {
1987
+ sql: opts.hooks.addParam(params, (_a = opts.contextColumn) !== null && _a !== void 0 ? _a : '', value),
1988
+ isReference: false,
1989
+ isExpression: false,
1990
+ isSubSelect: false,
1991
+ };
1992
+ }
1993
+ throw new Error("Unsupported literal value in ".concat(opts.context, ". Use [C6C.LIT, value] for non-reference strings or complex values."));
1994
+ };
1995
+ var validateAlias = function (aliasRaw, context) {
1996
+ if (typeof aliasRaw !== 'string' || aliasRaw.trim() === '') {
1997
+ throw new Error("[C6C.AS] in ".concat(context, " expects a non-empty alias string."));
1998
+ }
1999
+ var alias = aliasRaw.trim();
2000
+ if (!IDENTIFIER_REGEX.test(alias)) {
2001
+ throw new Error("[C6C.AS] alias '".concat(alias, "' in ").concat(context, " must be a valid SQL identifier."));
2002
+ }
2003
+ return alias;
2004
+ };
2005
+ var validateFunctionName = function (nameRaw, context) {
2006
+ if (typeof nameRaw !== 'string' || nameRaw.trim() === '') {
2007
+ throw new Error("[C6C.CALL] in ".concat(context, " expects the custom function name as a non-empty string."));
2008
+ }
2009
+ var name = normalizeToken(nameRaw);
2010
+ if (!IDENTIFIER_REGEX.test(name)) {
2011
+ throw new Error("[C6C.CALL] function '".concat(name, "' in ").concat(context, " must be a valid SQL identifier."));
2012
+ }
2013
+ return name;
2014
+ };
2015
+ var serializeFunctionArgs = function (args, opts) { return args
2016
+ .map(function (arg) { return serializeSqlExpression(arg, opts).sql; })
2017
+ .join(', '); };
2018
+ var serializeSqlExpression = function (value, opts) {
2019
+ var _a, _b, _c;
2020
+ if (value instanceof Map) {
2021
+ value = Object.fromEntries(value);
2022
+ }
2023
+ if (Array.isArray(value)) {
2024
+ if (value.length === 0) {
2025
+ throw new Error("Invalid empty expression array in ".concat(opts.context, "."));
2026
+ }
2027
+ var headRaw = value[0], tail = value.slice(1);
2028
+ if (typeof headRaw !== 'string') {
2029
+ throw new Error("Expression arrays in ".concat(opts.context, " must start with a string token."));
2030
+ }
2031
+ var head = normalizeToken(headRaw);
2032
+ var token = head.toUpperCase();
2033
+ if (token === C6C.AS) {
2034
+ if (tail.length !== 2) {
2035
+ throw new Error("[C6C.AS] in ".concat(opts.context, " expects [C6C.AS, expression, alias]."));
2036
+ }
2037
+ var inner = serializeSqlExpression(tail[0], opts);
2038
+ var alias = validateAlias(tail[1], opts.context);
2039
+ (_b = (_a = opts.hooks).onAlias) === null || _b === void 0 ? void 0 : _b.call(_a, alias);
2040
+ return {
2041
+ sql: "".concat(inner.sql, " AS ").concat(alias),
2042
+ isReference: false,
2043
+ isExpression: true,
2044
+ isSubSelect: inner.isSubSelect,
2045
+ };
2046
+ }
2047
+ if (token === C6C.DISTINCT) {
2048
+ if (tail.length !== 1) {
2049
+ throw new Error("[C6C.DISTINCT] in ".concat(opts.context, " expects [C6C.DISTINCT, expression]."));
2050
+ }
2051
+ var inner = serializeSqlExpression(tail[0], opts);
2052
+ return {
2053
+ sql: "DISTINCT ".concat(inner.sql),
2054
+ isReference: false,
2055
+ isExpression: true,
2056
+ isSubSelect: inner.isSubSelect,
2057
+ };
2058
+ }
2059
+ if (token === C6C.LIT || token === C6C.PARAM) {
2060
+ if (tail.length !== 1) {
2061
+ throw new Error("[".concat(head, "] in ").concat(opts.context, " expects [").concat(head, ", value]."));
2062
+ }
2063
+ var params = ensureParams(opts);
2064
+ return {
2065
+ sql: opts.hooks.addParam(params, (_c = opts.contextColumn) !== null && _c !== void 0 ? _c : '', tail[0]),
2066
+ isReference: false,
2067
+ isExpression: false,
2068
+ isSubSelect: false,
2069
+ };
2070
+ }
2071
+ if (token === C6C.SUBSELECT) {
2072
+ if (tail.length !== 1) {
2073
+ throw new Error("[C6C.SUBSELECT] in ".concat(opts.context, " expects [C6C.SUBSELECT, payload]."));
2074
+ }
2075
+ if (!opts.hooks.buildScalarSubSelect) {
2076
+ throw new Error("Scalar subselects in ".concat(opts.context, " require subselect builder support."));
2077
+ }
2078
+ var params = ensureParams(opts);
2079
+ var subSql = opts.hooks.buildScalarSubSelect(tail[0], params);
2080
+ return {
2081
+ sql: subSql,
2082
+ isReference: false,
2083
+ isExpression: true,
2084
+ isSubSelect: true,
2085
+ };
2086
+ }
2087
+ if (token === C6C.CALL) {
2088
+ var fnNameRaw = tail[0], args = tail.slice(1);
2089
+ var fnName = validateFunctionName(fnNameRaw, opts.context);
2090
+ var sqlArgs_1 = serializeFunctionArgs(args, opts);
2091
+ return {
2092
+ sql: "".concat(fnName, "(").concat(sqlArgs_1, ")"),
2093
+ isReference: false,
2094
+ isExpression: true,
2095
+ isSubSelect: false,
2096
+ };
2097
+ }
2098
+ if (tail.length >= 2 && String(tail[tail.length - 2]).toUpperCase() === C6C.AS) {
2099
+ throw new Error("Legacy positional AS syntax is not supported in ".concat(opts.context, ". Use [C6C.AS, expression, alias]."));
2100
+ }
2101
+ if (opts.hooks.isKnownFunction && !opts.hooks.isKnownFunction(head)) {
2102
+ throw new Error("Unknown SQL function '".concat(head, "' in ").concat(opts.context, ". Use [C6C.CALL, 'FUNCTION_NAME', ...args] for custom functions."));
2103
+ }
2104
+ var sqlArgs = serializeFunctionArgs(tail, opts);
2105
+ return {
2106
+ sql: "".concat(token, "(").concat(sqlArgs, ")"),
2107
+ isReference: false,
2108
+ isExpression: true,
2109
+ isSubSelect: false,
2110
+ };
2111
+ }
2112
+ if (typeof value === 'string') {
2113
+ return serializeStringReference(value, opts);
2114
+ }
2115
+ if (value && typeof value === 'object') {
2116
+ throw new Error("Object-rooted expressions are not supported in ".concat(opts.context, ". Use tuple syntax instead."));
2117
+ }
2118
+ return serializeLiteralValue(value, opts);
2119
+ };
2120
+
2121
+ var KNOWN_FUNCTION_LOOKUP = new Set(SQL_KNOWN_FUNCTIONS.map(function (name) { return String(name).toUpperCase(); }));
1793
2122
  var AggregateBuilder = /** @class */ (function (_super) {
1794
2123
  __extends(AggregateBuilder, _super);
1795
2124
  function AggregateBuilder() {
@@ -1802,112 +2131,71 @@ var AggregateBuilder = /** @class */ (function (_super) {
1802
2131
  AggregateBuilder.prototype.assertValidIdentifier = function (_identifier, _context) {
1803
2132
  // no-op placeholder for subclasses that do not implement alias validation
1804
2133
  };
1805
- AggregateBuilder.prototype.buildAggregateField = function (field, params) {
1806
- var _this = this;
1807
- var _a, _b;
1808
- if (typeof field === 'string') {
1809
- this.assertValidIdentifier(field, 'SELECT field');
1810
- return field;
1811
- }
1812
- if (!Array.isArray(field) || field.length === 0) {
1813
- throw new Error('Invalid SELECT field entry');
1814
- }
1815
- // If the array represents a tuple/literal list (e.g., [lng, lat]) rather than a
1816
- // function call like [FN, ...args], serialize the list as a comma-separated
1817
- // literal sequence so parent calls (like ORDER BY FN(<here>)) can embed it.
1818
- var isNumericString = function (s) { return /^-?\d+(?:\.\d+)?$/.test(String(s).trim()); };
1819
- if (typeof field[0] !== 'string' || isNumericString(field[0])) {
1820
- return field
1821
- .map(function (arg) {
1822
- if (Array.isArray(arg))
1823
- return _this.buildAggregateField(arg, params);
1824
- return String(arg);
1825
- })
1826
- .join(', ');
1827
- }
1828
- var fn = field[0], args = field.slice(1);
1829
- var alias;
1830
- if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
1831
- alias = String(args.pop());
1832
- args.pop();
1833
- }
1834
- var F = String(fn).toUpperCase();
1835
- var isGeomFromText = F === C6C.ST_GEOMFROMTEXT.toUpperCase();
1836
- if (args.length === 1 && Array.isArray(args[0])) {
1837
- args = args[0];
1838
- }
1839
- // Parameter placeholder helper: [C6C.PARAM, value]
1840
- if (F === C6C.PARAM) {
1841
- if (!params) {
1842
- throw new Error('PARAM requires parameter tracking.');
1843
- }
1844
- var value = args[0];
1845
- // Use empty column context; ORDER/SELECT literals have no column typing.
1846
- // @ts-ignore addParam is provided by ConditionBuilder in our hierarchy.
1847
- return this.addParam(params, '', value);
1848
- }
1849
- if (F === C6C.SUBSELECT) {
1850
- if (!params) {
1851
- throw new Error('Scalar subselects in SELECT require parameter tracking.');
1852
- }
1853
- var subRequest = args[0];
1854
- var subSql = (_b = (_a = this).buildScalarSubSelect) === null || _b === void 0 ? void 0 : _b.call(_a, subRequest, params);
1855
- if (!subSql) {
1856
- throw new Error('Failed to build scalar subselect.');
1857
- }
1858
- var expr_1 = subSql;
1859
- if (alias) {
1860
- this.selectAliases.add(alias);
1861
- expr_1 += " AS ".concat(alias);
1862
- }
1863
- logWithLevel(LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(expr_1));
1864
- return expr_1;
1865
- }
1866
- var identifierPathRegex = /^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/;
1867
- var argList = args
1868
- .map(function (arg, index) {
1869
- if (Array.isArray(arg))
1870
- return _this.buildAggregateField(arg, params);
1871
- if (typeof arg === 'string') {
1872
- if (identifierPathRegex.test(arg)) {
1873
- _this.assertValidIdentifier(arg, 'SELECT expression');
1874
- return arg;
1875
- }
1876
- // Treat numeric-looking strings as literals, not identifier paths
1877
- if (isNumericString(arg))
1878
- return arg;
1879
- if (isGeomFromText && index === 0) {
1880
- var trimmed = arg.trim();
1881
- var alreadyQuoted = trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2;
1882
- if (alreadyQuoted) {
1883
- return trimmed;
1884
- }
1885
- var escaped = arg.replace(/'/g, "''");
1886
- return "'".concat(escaped, "'");
1887
- }
1888
- return arg;
1889
- }
1890
- return String(arg);
1891
- })
1892
- .join(', ');
1893
- var expr;
1894
- if (F === 'DISTINCT') {
1895
- expr = "DISTINCT ".concat(argList);
2134
+ AggregateBuilder.prototype.isReferenceExpression = function (value) {
2135
+ if (typeof value !== 'string')
2136
+ return false;
2137
+ var trimmed = value.trim();
2138
+ if (trimmed.length === 0)
2139
+ return false;
2140
+ if (trimmed === '*')
2141
+ return true;
2142
+ if (/^[A-Za-z_][A-Za-z0-9_]*\.\*$/.test(trimmed)) {
2143
+ this.assertValidIdentifier(trimmed, 'SQL reference');
2144
+ return true;
1896
2145
  }
1897
- else {
1898
- expr = "".concat(F, "(").concat(argList, ")");
2146
+ if (/^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed)) {
2147
+ this.assertValidIdentifier(trimmed, 'SQL reference');
2148
+ return true;
1899
2149
  }
1900
- if (alias) {
1901
- this.selectAliases.add(alias);
1902
- expr += " AS ".concat(alias);
2150
+ if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed) && this.selectAliases.has(trimmed)) {
2151
+ return true;
1903
2152
  }
1904
- logWithLevel(LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(expr));
1905
- return expr;
2153
+ return false;
2154
+ };
2155
+ AggregateBuilder.prototype.isKnownFunction = function (functionName) {
2156
+ return KNOWN_FUNCTION_LOOKUP.has(functionName.trim().toUpperCase());
2157
+ };
2158
+ AggregateBuilder.prototype.serializeExpression = function (expression, params, context, contextColumn) {
2159
+ var _this = this;
2160
+ if (context === void 0) { context = 'SQL expression'; }
2161
+ return serializeSqlExpression(expression, {
2162
+ params: params,
2163
+ context: context,
2164
+ contextColumn: contextColumn,
2165
+ hooks: {
2166
+ assertValidIdentifier: function (identifier, hookContext) {
2167
+ _this.assertValidIdentifier(identifier, hookContext);
2168
+ },
2169
+ isReference: function (value) { return _this.isReferenceExpression(value); },
2170
+ addParam: function (target, column, value) {
2171
+ var addParam = _this.addParam;
2172
+ if (typeof addParam !== 'function') {
2173
+ throw new Error('Expression literal binding requires addParam support.');
2174
+ }
2175
+ return addParam.call(_this, target, column, value);
2176
+ },
2177
+ buildScalarSubSelect: function (subRequest, target) {
2178
+ var builder = _this.buildScalarSubSelect;
2179
+ if (typeof builder !== 'function') {
2180
+ throw new Error('Scalar subselects require SelectQueryBuilder context.');
2181
+ }
2182
+ return builder.call(_this, subRequest, target);
2183
+ },
2184
+ onAlias: function (alias) {
2185
+ _this.selectAliases.add(alias);
2186
+ },
2187
+ isKnownFunction: function (functionName) { return _this.isKnownFunction(functionName); },
2188
+ },
2189
+ });
2190
+ };
2191
+ AggregateBuilder.prototype.buildAggregateField = function (field, params) {
2192
+ var serialized = this.serializeExpression(field, params, 'SELECT expression');
2193
+ logWithLevel(LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(serialized.sql));
2194
+ return serialized.sql;
1906
2195
  };
1907
2196
  return AggregateBuilder;
1908
2197
  }(Executor));
1909
2198
 
1910
- // Alias a table name with a given alias
1911
2199
  var DERIVED_TABLE_PREFIX = '__c6DerivedTable__';
1912
2200
  var DERIVED_ID_SYMBOL = Symbol('c6DerivedTableId');
1913
2201
  var derivedTableLookup = new Map();
@@ -1985,6 +2273,29 @@ var bbox = function (minLng, minLat, maxLng, maxLat) {
1985
2273
  var stContains = function (envelope, shape) {
1986
2274
  return [C6C.ST_CONTAINS, envelope, shape];
1987
2275
  };
2276
+ // Strongly-typed known function helper.
2277
+ var fn = function (functionName) {
2278
+ var args = [];
2279
+ for (var _i = 1; _i < arguments.length; _i++) {
2280
+ args[_i - 1] = arguments[_i];
2281
+ }
2282
+ return __spreadArray([functionName], args, true);
2283
+ };
2284
+ // Escape hatch for custom function names.
2285
+ var call = function (functionName) {
2286
+ var args = [];
2287
+ for (var _i = 1; _i < arguments.length; _i++) {
2288
+ args[_i - 1] = arguments[_i];
2289
+ }
2290
+ return __spreadArray([C6C.CALL, functionName], args, true);
2291
+ };
2292
+ var alias = function (expression, aliasName) { return [C6C.AS, expression, aliasName]; };
2293
+ var distinct = function (expression) { return [C6C.DISTINCT, expression]; };
2294
+ var lit = function (value) { return [C6C.LIT, value]; };
2295
+ var order = function (expression, direction) {
2296
+ if (direction === void 0) { direction = C6C.ASC; }
2297
+ return [expression, direction];
2298
+ };
1988
2299
 
1989
2300
  var ConditionBuilder = /** @class */ (function (_super) {
1990
2301
  __extends(ConditionBuilder, _super);
@@ -2091,6 +2402,26 @@ var ConditionBuilder = /** @class */ (function (_super) {
2091
2402
  return true;
2092
2403
  return false;
2093
2404
  };
2405
+ ConditionBuilder.prototype.isReferenceExpression = function (value) {
2406
+ var trimmed = value.trim();
2407
+ if (trimmed === '*') {
2408
+ return true;
2409
+ }
2410
+ if (trimmed.includes('.')) {
2411
+ if (/^[A-Za-z_][A-Za-z0-9_]*\.\*$/.test(trimmed)) {
2412
+ return true;
2413
+ }
2414
+ if (this.isTableReference(trimmed) || this.isColumnRef(trimmed)) {
2415
+ return true;
2416
+ }
2417
+ if (/^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed)) {
2418
+ this.assertValidIdentifier(trimmed, 'SQL reference');
2419
+ return true;
2420
+ }
2421
+ return false;
2422
+ }
2423
+ return _super.prototype.isReferenceExpression.call(this, trimmed);
2424
+ };
2094
2425
  ConditionBuilder.prototype.execute = function () {
2095
2426
  throw new Error("Method not implemented.");
2096
2427
  };
@@ -2165,41 +2496,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
2165
2496
  ConditionBuilder.prototype.isOperator = function (op) {
2166
2497
  return !!this.normalizeOperatorKey(op);
2167
2498
  };
2168
- ConditionBuilder.prototype.looksLikeSafeFunctionExpression = function (value) {
2169
- if (typeof value !== 'string')
2170
- return false;
2171
- var trimmed = value.trim();
2172
- if (trimmed.length === 0)
2173
- return false;
2174
- if (trimmed.includes(';') || trimmed.includes('--') || trimmed.includes('/*') || trimmed.includes('*/')) {
2175
- return false;
2176
- }
2177
- if (!trimmed.includes('(') || !trimmed.endsWith(')')) {
2178
- return false;
2179
- }
2180
- var functionMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)\s*\(/);
2181
- if (!functionMatch) {
2182
- return false;
2183
- }
2184
- var allowedCharacters = /^[A-Za-z0-9_().,'"\s-]+$/;
2185
- if (!allowedCharacters.test(trimmed)) {
2186
- return false;
2187
- }
2188
- var depth = 0;
2189
- for (var _i = 0, trimmed_1 = trimmed; _i < trimmed_1.length; _i++) {
2190
- var char = trimmed_1[_i];
2191
- if (char === '(') {
2192
- depth += 1;
2193
- }
2194
- else if (char === ')') {
2195
- depth -= 1;
2196
- if (depth < 0) {
2197
- return false;
2198
- }
2199
- }
2200
- }
2201
- return depth === 0;
2202
- };
2203
2499
  ConditionBuilder.prototype.ensureWrapped = function (expression) {
2204
2500
  var trimmed = expression.trim();
2205
2501
  if (!trimmed)
@@ -2227,42 +2523,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
2227
2523
  })
2228
2524
  .join(" ".concat(operator, " "));
2229
2525
  };
2230
- ConditionBuilder.prototype.normalizeFunctionField = function (field, params) {
2231
- var _this = this;
2232
- if (field instanceof Map) {
2233
- field = Object.fromEntries(field);
2234
- }
2235
- if (Array.isArray(field)) {
2236
- if (field.length === 0)
2237
- return field;
2238
- var fn = field[0], args = field.slice(1);
2239
- var normalizedArgs = args.map(function (arg) { return _this.normalizeFunctionField(arg, params); });
2240
- return __spreadArray([fn], normalizedArgs, true);
2241
- }
2242
- if (field && typeof field === 'object') {
2243
- if (C6C.SUBSELECT in field) {
2244
- var builder = this.buildScalarSubSelect;
2245
- if (typeof builder !== 'function') {
2246
- throw new Error('Scalar subselect handling requires JoinBuilder context.');
2247
- }
2248
- return builder.call(this, field[C6C.SUBSELECT], params);
2249
- }
2250
- var entries = Object.entries(field);
2251
- if (entries.length === 1) {
2252
- var _a = entries[0], key = _a[0], value = _a[1];
2253
- if (this.isOperator(key)) {
2254
- return this.buildOperatorExpression(key, value, params);
2255
- }
2256
- return this.buildFunctionCall(key, value, params);
2257
- }
2258
- }
2259
- return field;
2260
- };
2261
- ConditionBuilder.prototype.buildFunctionCall = function (fn, value, params) {
2262
- var args = Array.isArray(value) ? value : [value];
2263
- var normalized = this.normalizeFunctionField(__spreadArray([fn], args, true), params);
2264
- return this.buildAggregateField(normalized, params);
2265
- };
2266
2526
  ConditionBuilder.prototype.serializeOperand = function (operand, params, contextColumn) {
2267
2527
  var _a;
2268
2528
  var _this = this;
@@ -2277,18 +2537,14 @@ var ConditionBuilder = /** @class */ (function (_super) {
2277
2537
  return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
2278
2538
  }
2279
2539
  if (typeof operand === 'string') {
2280
- if (this.isTableReference(operand) || this.isColumnRef(operand)) {
2281
- return { sql: operand, isReference: true, isExpression: false, isSubSelect: false };
2282
- }
2283
- if (this.looksLikeSafeFunctionExpression(operand)) {
2284
- return { sql: operand.trim(), isReference: false, isExpression: true, isSubSelect: false };
2540
+ var trimmed = operand.trim();
2541
+ if (this.isReferenceExpression(trimmed) || this.isTableReference(trimmed) || this.isColumnRef(trimmed)) {
2542
+ return { sql: trimmed, isReference: true, isExpression: false, isSubSelect: false };
2285
2543
  }
2286
- return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
2544
+ throw new Error("Bare string '".concat(operand, "' is not a reference. Wrap literal strings with [C6C.LIT, value]."));
2287
2545
  }
2288
2546
  if (Array.isArray(operand)) {
2289
- var normalized = this.normalizeFunctionField(operand, params);
2290
- var sql = this.buildAggregateField(normalized, params);
2291
- return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
2547
+ return this.serializeExpression(operand, params, 'SQL expression', contextColumn);
2292
2548
  }
2293
2549
  if (operand instanceof Map) {
2294
2550
  operand = Object.fromEntries(operand);
@@ -2306,24 +2562,38 @@ var ConditionBuilder = /** @class */ (function (_super) {
2306
2562
  if (entries.length === 1) {
2307
2563
  var _b = entries[0], key = _b[0], value = _b[1];
2308
2564
  if (this.isOperator(key)) {
2309
- var sql_1 = this.buildOperatorExpression(key, value, params);
2310
- return { sql: this.ensureWrapped(sql_1), isReference: false, isExpression: true, isSubSelect: false };
2565
+ var sql = this.buildOperatorExpression(key, value, params);
2566
+ return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
2311
2567
  }
2312
2568
  if (this.BOOLEAN_OPERATORS.has(key)) {
2313
- var sql_2 = this.buildBooleanExpression((_a = {}, _a[key] = value, _a), params, 'AND');
2314
- return { sql: this.ensureWrapped(sql_2), isReference: false, isExpression: true, isSubSelect: false };
2569
+ var sql = this.buildBooleanExpression((_a = {}, _a[key] = value, _a), params, 'AND');
2570
+ return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
2315
2571
  }
2316
- var sql = this.buildFunctionCall(key, value, params);
2317
- return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
2572
+ throw new Error('Object-rooted expressions are not supported. Use tuple syntax instead.');
2318
2573
  }
2319
2574
  }
2320
2575
  throw new Error('Unsupported operand type in SQL expression.');
2321
2576
  };
2577
+ ConditionBuilder.prototype.isExpressionTuple = function (value) {
2578
+ if (!Array.isArray(value) || value.length === 0 || typeof value[0] !== 'string') {
2579
+ return false;
2580
+ }
2581
+ var token = String(value[0]).toUpperCase();
2582
+ return (token === C6C.AS
2583
+ || token === C6C.DISTINCT
2584
+ || token === C6C.CALL
2585
+ || token === C6C.LIT
2586
+ || token === C6C.PARAM
2587
+ || token === C6C.SUBSELECT
2588
+ || this.isKnownFunction(value[0]));
2589
+ };
2322
2590
  ConditionBuilder.prototype.isPlainArrayLiteral = function (value, allowColumnRefs) {
2323
2591
  var _this = this;
2324
2592
  if (allowColumnRefs === void 0) { allowColumnRefs = false; }
2325
2593
  if (!Array.isArray(value))
2326
2594
  return false;
2595
+ if (this.isExpressionTuple(value))
2596
+ return false;
2327
2597
  return value.every(function (item) {
2328
2598
  if (item === null)
2329
2599
  return true;
@@ -2393,6 +2663,16 @@ var ConditionBuilder = /** @class */ (function (_super) {
2393
2663
  || this.isPlainObjectLiteral(normalized, allowColumnRefs)) {
2394
2664
  return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', JSON.stringify(normalized));
2395
2665
  }
2666
+ if (normalized === C6C.NULL
2667
+ || normalized === null
2668
+ || typeof normalized === 'string'
2669
+ || typeof normalized === 'number'
2670
+ || typeof normalized === 'boolean'
2671
+ || normalized instanceof Date
2672
+ || (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(normalized))) {
2673
+ var scalar = normalized === C6C.NULL ? null : normalized;
2674
+ return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', scalar);
2675
+ }
2396
2676
  var sql;
2397
2677
  var isReference;
2398
2678
  var isExpression;
@@ -2476,7 +2756,10 @@ var ConditionBuilder = /** @class */ (function (_super) {
2476
2756
  }
2477
2757
  var payload = this.ensurePlainObject(payloadRaw);
2478
2758
  var subSelect;
2479
- if (payload && typeof payload === 'object' && C6C.SUBSELECT in payload) {
2759
+ if (Array.isArray(payload) && payload.length === 2 && String(payload[0]).toUpperCase() === C6C.SUBSELECT) {
2760
+ subSelect = this.ensurePlainObject(payload[1]);
2761
+ }
2762
+ else if (payload && typeof payload === 'object' && C6C.SUBSELECT in payload) {
2480
2763
  subSelect = this.ensurePlainObject(payload[C6C.SUBSELECT]);
2481
2764
  }
2482
2765
  else if (payload && typeof payload === 'object') {
@@ -2570,7 +2853,11 @@ var ConditionBuilder = /** @class */ (function (_super) {
2570
2853
  throw new Error('MATCH_AGAINST expects an array [search, mode?].');
2571
2854
  }
2572
2855
  var search = right[0], mode = right[1];
2573
- var placeholder = this.addParam(params, leftInfo_1.sql, search);
2856
+ var searchInfo = this.serializeOperand(search, params, leftInfo_1.sql);
2857
+ if (searchInfo.isReference || searchInfo.isExpression || searchInfo.isSubSelect) {
2858
+ throw new Error('MATCH_AGAINST search payload must be a literal value (wrap strings with [C6C.LIT, value]).');
2859
+ }
2860
+ var placeholder = searchInfo.sql;
2574
2861
  var againstClause = void 0;
2575
2862
  switch (typeof mode === 'string' ? mode.toUpperCase() : '') {
2576
2863
  case 'BOOLEAN':
@@ -2672,7 +2959,7 @@ var ConditionBuilder = /** @class */ (function (_super) {
2672
2959
  if (!Array.isArray(value)) {
2673
2960
  throw new Error("".concat(column, " expects an array of arguments."));
2674
2961
  }
2675
- return this.buildFunctionCall(column, value, params);
2962
+ return this.serializeExpression(__spreadArray([column], value, true), params, "WHERE function ".concat(column), column).sql;
2676
2963
  }
2677
2964
  }
2678
2965
  if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
@@ -3115,56 +3402,34 @@ var PaginationBuilder = /** @class */ (function (_super) {
3115
3402
  *
3116
3403
  * Accepted structures:
3117
3404
  * ```ts
3118
- * ORDER: {
3119
- * // simple column with direction
3120
- * [property_units.UNIT_ID]: "DESC",
3121
- * // function call (array of arguments)
3122
- * [C6Constants.ST_DISTANCE_SPHERE]: [property_units.LOCATION, F(property_units.LOCATION, "pu_target")]
3123
- * }
3405
+ * ORDER: [
3406
+ * [property_units.UNIT_ID, "DESC"],
3407
+ * [[C6Constants.ST_DISTANCE_SPHERE, property_units.LOCATION, F(property_units.LOCATION, "pu_target")], "ASC"],
3408
+ * ]
3124
3409
  * ```
3125
3410
  */
3126
3411
  PaginationBuilder.prototype.buildPaginationClause = function (pagination, params) {
3127
- var _this = this;
3128
3412
  var sql = "";
3129
3413
  /* -------- ORDER BY -------- */
3130
3414
  if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
3131
3415
  var orderParts = [];
3132
- var _loop_1 = function (key, val) {
3133
- if (typeof key === 'string' && key.includes('.')) {
3134
- this_1.assertValidIdentifier(key, 'ORDER BY');
3135
- }
3136
- // FUNCTION CALL: val is an array of args
3137
- if (Array.isArray(val)) {
3138
- var identifierPathRegex_1 = /^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/;
3139
- var isNumericString_1 = function (s) { return /^-?\d+(?:\.\d+)?$/.test(s.trim()); };
3140
- var args = val
3141
- .map(function (arg) {
3142
- if (Array.isArray(arg))
3143
- return _this.buildAggregateField(arg, params);
3144
- if (typeof arg === 'string') {
3145
- if (identifierPathRegex_1.test(arg)) {
3146
- _this.assertValidIdentifier(arg, 'ORDER BY argument');
3147
- return arg;
3148
- }
3149
- // numeric-looking strings should be treated as literals
3150
- if (isNumericString_1(arg))
3151
- return arg;
3152
- return arg;
3153
- }
3154
- return String(arg);
3155
- })
3156
- .join(", ");
3157
- orderParts.push("".concat(key, "(").concat(args, ")"));
3158
- }
3159
- // SIMPLE COLUMN + DIR (ASC/DESC)
3160
- else {
3161
- orderParts.push("".concat(key, " ").concat(String(val).toUpperCase()));
3416
+ var orderSpec = pagination[C6Constants.ORDER];
3417
+ if (!Array.isArray(orderSpec)) {
3418
+ throw new Error('PAGINATION.ORDER expects an array of terms using [expression, direction?] syntax.');
3419
+ }
3420
+ for (var _i = 0, orderSpec_1 = orderSpec; _i < orderSpec_1.length; _i++) {
3421
+ var rawTerm = orderSpec_1[_i];
3422
+ var expression = rawTerm;
3423
+ var direction = C6Constants.ASC;
3424
+ if (Array.isArray(rawTerm)
3425
+ && rawTerm.length === 2
3426
+ && typeof rawTerm[1] === 'string'
3427
+ && (String(rawTerm[1]).toUpperCase() === C6Constants.ASC || String(rawTerm[1]).toUpperCase() === C6Constants.DESC)) {
3428
+ expression = rawTerm[0];
3429
+ direction = String(rawTerm[1]).toUpperCase();
3162
3430
  }
3163
- };
3164
- var this_1 = this;
3165
- for (var _i = 0, _a = Object.entries(pagination[C6Constants.ORDER]); _i < _a.length; _i++) {
3166
- var _b = _a[_i], key = _b[0], val = _b[1];
3167
- _loop_1(key, val);
3431
+ var serialized = this.serializeExpression(expression, params, 'ORDER BY expression');
3432
+ orderParts.push("".concat(serialized.sql, " ").concat(direction));
3168
3433
  }
3169
3434
  if (orderParts.length)
3170
3435
  sql += " ORDER BY ".concat(orderParts.join(", "));
@@ -3454,7 +3719,7 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
3454
3719
  throw new Error("Singular request requires all primary key(s) [".concat(pkShorts.join(', '), "] for table (").concat(restModel.TABLE_NAME, "). Missing: [").concat(missing.join(', '), "]"));
3455
3720
  }
3456
3721
  // Strip API metadata that should remain at root
3457
- var _d = request, dataInsertMultipleRows = _d.dataInsertMultipleRows, cacheResults = _d.cacheResults, fetchDependencies = _d.fetchDependencies, debug = _d.debug, success = _d.success, error = _d.error, rest = __rest(_d, ["dataInsertMultipleRows", "cacheResults", "fetchDependencies", "debug", "success", "error"]);
3722
+ var _d = request, dataInsertMultipleRows = _d.dataInsertMultipleRows, cacheResults = _d.cacheResults, skipReactBootstrap = _d.skipReactBootstrap, fetchDependencies = _d.fetchDependencies, debug = _d.debug, success = _d.success, error = _d.error, rest = __rest(_d, ["dataInsertMultipleRows", "cacheResults", "skipReactBootstrap", "fetchDependencies", "debug", "success", "error"]);
3458
3723
  // Map short primary keys to fully-qualified column names
3459
3724
  var shortToFull = {};
3460
3725
  for (var _e = 0, _f = Object.entries(restModel.COLUMNS || {}); _e < _f.length; _e++) {
@@ -3466,22 +3731,26 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
3466
3731
  var k = _a[0], v = _a[1];
3467
3732
  return [(_b = shortToFull[k]) !== null && _b !== void 0 ? _b : k, v];
3468
3733
  }));
3734
+ var pkWhereExpressions = Object.fromEntries(Object.entries(pkFullValues).map(function (_a) {
3735
+ var column = _a[0], value = _a[1];
3736
+ return [column, [C6Constants.EQUAL, [C6Constants.LIT, value]]];
3737
+ }));
3469
3738
  if (requestMethod === C6Constants.GET) {
3470
3739
  var normalized_1 = {
3471
- WHERE: __assign({}, pkFullValues),
3740
+ WHERE: __assign({}, pkWhereExpressions),
3472
3741
  };
3473
3742
  // Preserve pagination if any was added previously
3474
3743
  if (request[C6Constants.PAGINATION]) {
3475
3744
  normalized_1[C6Constants.PAGINATION] = request[C6Constants.PAGINATION];
3476
3745
  }
3477
- return __assign(__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
3746
+ return __assign(__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
3478
3747
  }
3479
3748
  if (requestMethod === C6Constants.DELETE) {
3480
3749
  var normalized_2 = (_a = {},
3481
3750
  _a[C6Constants.DELETE] = true,
3482
- _a.WHERE = __assign({}, pkFullValues),
3751
+ _a.WHERE = __assign({}, pkWhereExpressions),
3483
3752
  _a);
3484
- return __assign(__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
3753
+ return __assign(__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
3485
3754
  }
3486
3755
  // PUT
3487
3756
  var updateBody = {};
@@ -3500,9 +3769,9 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
3500
3769
  }
3501
3770
  var normalized = (_b = {},
3502
3771
  _b[C6Constants.UPDATE] = updateBody,
3503
- _b.WHERE = __assign({}, pkFullValues),
3772
+ _b.WHERE = __assign({}, pkWhereExpressions),
3504
3773
  _b);
3505
- return __assign(__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
3774
+ return __assign(__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
3506
3775
  }
3507
3776
 
3508
3777
  var allowListCache = new Map();
@@ -3685,6 +3954,38 @@ var compileSqlAllowList = function (allowListPath, entries) { return __awaiter(v
3685
3954
  }); };
3686
3955
 
3687
3956
  var SQL_ALLOWLIST_BLOCKED_CODE = "SQL_ALLOWLIST_BLOCKED";
3957
+ var fillRandomBytes = function (bytes) {
3958
+ var cryptoRef = globalThis.crypto;
3959
+ if (!cryptoRef || typeof cryptoRef.getRandomValues !== "function") {
3960
+ throw new Error("Secure random source unavailable: crypto.getRandomValues is required for UUID generation.");
3961
+ }
3962
+ cryptoRef.getRandomValues(bytes);
3963
+ };
3964
+ var generateUuidV7 = function () {
3965
+ var bytes = new Uint8Array(16);
3966
+ var random = new Uint8Array(10);
3967
+ fillRandomBytes(random);
3968
+ var timestampMs = Date.now();
3969
+ bytes[0] = Math.floor(timestampMs / 1099511627776) & 0xff; // 2^40
3970
+ bytes[1] = Math.floor(timestampMs / 4294967296) & 0xff; // 2^32
3971
+ bytes[2] = Math.floor(timestampMs / 16777216) & 0xff; // 2^24
3972
+ bytes[3] = Math.floor(timestampMs / 65536) & 0xff; // 2^16
3973
+ bytes[4] = Math.floor(timestampMs / 256) & 0xff; // 2^8
3974
+ bytes[5] = timestampMs & 0xff;
3975
+ // RFC 9562 UUIDv7 layout
3976
+ bytes[6] = 0x70 | (random[0] & 0x0f); // version 7 + rand_a high bits
3977
+ bytes[7] = random[1]; // rand_a low bits
3978
+ bytes[8] = 0x80 | (random[2] & 0x3f); // variant + rand_b high bits
3979
+ bytes[9] = random[3];
3980
+ bytes[10] = random[4];
3981
+ bytes[11] = random[5];
3982
+ bytes[12] = random[6];
3983
+ bytes[13] = random[7];
3984
+ bytes[14] = random[8];
3985
+ bytes[15] = random[9];
3986
+ var hex = Array.from(bytes, function (byte) { return byte.toString(16).padStart(2, "0"); }).join("");
3987
+ return "".concat(hex.slice(0, 8), "-").concat(hex.slice(8, 12), "-").concat(hex.slice(12, 16), "-").concat(hex.slice(16, 20), "-").concat(hex.slice(20));
3988
+ };
3688
3989
  var createSqlAllowListBlockedError = function (args) {
3689
3990
  var _a, _b;
3690
3991
  var error = new Error("SQL statement is not permitted by allowlist (".concat(args.allowListPath, ")."));
@@ -3713,6 +4014,146 @@ var SqlExecutor = /** @class */ (function (_super) {
3713
4014
  })); };
3714
4015
  return _this;
3715
4016
  }
4017
+ SqlExecutor.prototype.getPostRequestRows = function () {
4018
+ var request = this.request;
4019
+ if (!request)
4020
+ return [];
4021
+ if (Array.isArray(request)) {
4022
+ return request;
4023
+ }
4024
+ if (Array.isArray(request.dataInsertMultipleRows)
4025
+ && request.dataInsertMultipleRows.length > 0) {
4026
+ return request.dataInsertMultipleRows;
4027
+ }
4028
+ var verb = C6Constants.REPLACE in request ? C6Constants.REPLACE : C6Constants.INSERT;
4029
+ if (verb in request && request[verb] && typeof request[verb] === "object") {
4030
+ return [request[verb]];
4031
+ }
4032
+ if (typeof request === "object") {
4033
+ return [request];
4034
+ }
4035
+ return [];
4036
+ };
4037
+ SqlExecutor.prototype.getTypeValidationForColumn = function (shortKey, fullKey) {
4038
+ var _a, _b;
4039
+ var validation = (_a = this.config.restModel) === null || _a === void 0 ? void 0 : _a.TYPE_VALIDATION;
4040
+ if (!validation || typeof validation !== "object")
4041
+ return undefined;
4042
+ return (_b = validation[shortKey]) !== null && _b !== void 0 ? _b : validation[fullKey];
4043
+ };
4044
+ SqlExecutor.prototype.isUuidLikePrimaryColumn = function (columnDef) {
4045
+ var _a, _b;
4046
+ if (!columnDef || typeof columnDef !== "object")
4047
+ return false;
4048
+ if (columnDef.AUTO_INCREMENT === true)
4049
+ return false;
4050
+ var mysqlType = String((_a = columnDef.MYSQL_TYPE) !== null && _a !== void 0 ? _a : "").toLowerCase();
4051
+ var maxLength = String((_b = columnDef.MAX_LENGTH) !== null && _b !== void 0 ? _b : "").trim();
4052
+ if (mysqlType.includes("uuid"))
4053
+ return true;
4054
+ var isBinary16 = mysqlType.includes("binary")
4055
+ && (maxLength === "16" || /\b16\b/.test(mysqlType) || mysqlType === "binary");
4056
+ var isUuidString = (mysqlType.includes("char") || mysqlType.includes("varchar"))
4057
+ && (maxLength === "32" || maxLength === "36");
4058
+ return isBinary16 || isUuidString;
4059
+ };
4060
+ SqlExecutor.prototype.hasDefinedValue = function (value) {
4061
+ if (value === undefined || value === null)
4062
+ return false;
4063
+ if (typeof value === "string" && value.trim() === "")
4064
+ return false;
4065
+ return true;
4066
+ };
4067
+ SqlExecutor.prototype.generatePrimaryUuidValue = function (columnDef) {
4068
+ var _a, _b;
4069
+ var mysqlType = String((_a = columnDef.MYSQL_TYPE) !== null && _a !== void 0 ? _a : "").toLowerCase();
4070
+ var maxLength = String((_b = columnDef.MAX_LENGTH) !== null && _b !== void 0 ? _b : "").trim();
4071
+ var uuid = generateUuidV7();
4072
+ // BINARY(16) and CHAR/VARCHAR(32) commonly persist UUIDs as 32-hex.
4073
+ if (mysqlType.includes("binary") || maxLength === "32") {
4074
+ return uuid.replace(/-/g, "").toUpperCase();
4075
+ }
4076
+ return uuid;
4077
+ };
4078
+ SqlExecutor.prototype.assignMissingPostPrimaryUuids = function () {
4079
+ var _this = this;
4080
+ var _a, _b;
4081
+ if (this.config.requestMethod !== C6Constants.POST)
4082
+ return;
4083
+ var rows = this.getPostRequestRows();
4084
+ if (rows.length === 0)
4085
+ return;
4086
+ var columns = this.config.restModel.COLUMNS;
4087
+ var tableName = this.config.restModel.TABLE_NAME;
4088
+ var primaryShorts = (_a = this.config.restModel.PRIMARY_SHORT) !== null && _a !== void 0 ? _a : [];
4089
+ var primaryColumns = primaryShorts
4090
+ .map(function (shortKey) {
4091
+ var _a;
4092
+ var fullKey = (_a = Object.keys(columns).find(function (key) { return columns[key] === shortKey; })) !== null && _a !== void 0 ? _a : "".concat(tableName, ".").concat(shortKey);
4093
+ var columnDef = _this.getTypeValidationForColumn(shortKey, fullKey);
4094
+ return { shortKey: shortKey, fullKey: fullKey, columnDef: columnDef };
4095
+ })
4096
+ .filter(function (_a) {
4097
+ var columnDef = _a.columnDef;
4098
+ return _this.isUuidLikePrimaryColumn(columnDef);
4099
+ });
4100
+ if (primaryColumns.length === 0)
4101
+ return;
4102
+ for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {
4103
+ var row = rows_1[_i];
4104
+ if (!row || typeof row !== "object")
4105
+ continue;
4106
+ var useQualifiedKeyByDefault = Object.keys(row).some(function (key) { return key.includes("."); });
4107
+ for (var _c = 0, primaryColumns_1 = primaryColumns; _c < primaryColumns_1.length; _c++) {
4108
+ var primaryColumn = primaryColumns_1[_c];
4109
+ var existing = (_b = row[primaryColumn.shortKey]) !== null && _b !== void 0 ? _b : row[primaryColumn.fullKey];
4110
+ if (this.hasDefinedValue(existing))
4111
+ continue;
4112
+ var generated = this.generatePrimaryUuidValue(primaryColumn.columnDef);
4113
+ if (Object.prototype.hasOwnProperty.call(row, primaryColumn.shortKey)) {
4114
+ row[primaryColumn.shortKey] = generated;
4115
+ continue;
4116
+ }
4117
+ if (Object.prototype.hasOwnProperty.call(row, primaryColumn.fullKey)) {
4118
+ row[primaryColumn.fullKey] = generated;
4119
+ continue;
4120
+ }
4121
+ row[useQualifiedKeyByDefault ? primaryColumn.fullKey : primaryColumn.shortKey] = generated;
4122
+ }
4123
+ }
4124
+ };
4125
+ SqlExecutor.prototype.buildPostResponseRows = function (insertId) {
4126
+ var _this = this;
4127
+ var _a;
4128
+ var rows = this.getPostRequestRows();
4129
+ if (rows.length === 0)
4130
+ return [];
4131
+ var columns = this.config.restModel.COLUMNS;
4132
+ var validColumns = new Set(Object.values(columns));
4133
+ var pkShorts = (_a = this.config.restModel.PRIMARY_SHORT) !== null && _a !== void 0 ? _a : [];
4134
+ var now = new Date().toISOString();
4135
+ return rows.map(function (row, index) {
4136
+ var normalized = _this.normalizeRequestPayload(row !== null && row !== void 0 ? row : {});
4137
+ if (validColumns.has("changed_at") && normalized.changed_at === undefined) {
4138
+ normalized.changed_at = now;
4139
+ }
4140
+ if (validColumns.has("created_at") && normalized.created_at === undefined) {
4141
+ normalized.created_at = now;
4142
+ }
4143
+ if (validColumns.has("updated_at") && normalized.updated_at === undefined) {
4144
+ normalized.updated_at = now;
4145
+ }
4146
+ // When DB generated PK is numeric/autoincrement, expose it for the single-row insert.
4147
+ if (index === 0
4148
+ && insertId !== undefined
4149
+ && insertId !== null
4150
+ && pkShorts.length === 1
4151
+ && !_this.hasDefinedValue(normalized[pkShorts[0]])) {
4152
+ normalized[pkShorts[0]] = insertId;
4153
+ }
4154
+ return normalized;
4155
+ });
4156
+ };
3716
4157
  SqlExecutor.prototype.resolveSqlLogMethod = function (method, sql) {
3717
4158
  var _a;
3718
4159
  var token = (_a = sql.trim().split(/\s+/, 1)[0]) === null || _a === void 0 ? void 0 : _a.toUpperCase();
@@ -3751,6 +4192,7 @@ var SqlExecutor = /** @class */ (function (_super) {
3751
4192
  // Surface normalization errors early
3752
4193
  throw e;
3753
4194
  }
4195
+ this.assignMissingPostPrimaryUuids();
3754
4196
  logContext = getLogContext(this.config, this.request);
3755
4197
  logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \u25B6\uFE0F Executing ".concat(method, " on table \"").concat(TABLE_NAME, "\""));
3756
4198
  logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDE9 Request:", this.request);
@@ -3877,6 +4319,7 @@ var SqlExecutor = /** @class */ (function (_super) {
3877
4319
  C6Constants.REPLACE,
3878
4320
  "dataInsertMultipleRows",
3879
4321
  "cacheResults",
4322
+ "skipReactBootstrap",
3880
4323
  "fetchDependencies",
3881
4324
  "debug",
3882
4325
  "success",
@@ -3960,9 +4403,10 @@ var SqlExecutor = /** @class */ (function (_super) {
3960
4403
  }
3961
4404
  }
3962
4405
  if (value !== undefined) {
3963
- pkValues[pkShort] = value;
4406
+ pkValues[pkShort] = this_1.unwrapPrimaryKeyValue(value);
3964
4407
  }
3965
4408
  };
4409
+ var this_1 = this;
3966
4410
  for (var _i = 0, primaryShorts_1 = primaryShorts; _i < primaryShorts_1.length; _i++) {
3967
4411
  var pkShort = primaryShorts_1[_i];
3968
4412
  _loop_1(pkShort);
@@ -3972,6 +4416,26 @@ var SqlExecutor = /** @class */ (function (_super) {
3972
4416
  }
3973
4417
  return Object.keys(pkValues).length > 0 ? pkValues : null;
3974
4418
  };
4419
+ SqlExecutor.prototype.unwrapPrimaryKeyValue = function (value) {
4420
+ if (!Array.isArray(value))
4421
+ return value;
4422
+ if (value.length === 2) {
4423
+ var head = value[0], tail = value[1];
4424
+ if (head === C6Constants.EQUAL) {
4425
+ return this.unwrapPrimaryKeyValue(tail);
4426
+ }
4427
+ if (head === C6Constants.LIT || head === C6Constants.PARAM) {
4428
+ return tail;
4429
+ }
4430
+ }
4431
+ if (value.length === 3) {
4432
+ var operator = value[1], right = value[2];
4433
+ if (operator === C6Constants.EQUAL) {
4434
+ return this.unwrapPrimaryKeyValue(right);
4435
+ }
4436
+ }
4437
+ return value;
4438
+ };
3975
4439
  SqlExecutor.prototype.extractPrimaryKeyValuesFromData = function (data) {
3976
4440
  if (!data)
3977
4441
  return null;
@@ -4100,7 +4564,7 @@ var SqlExecutor = /** @class */ (function (_super) {
4100
4564
  };
4101
4565
  SqlExecutor.prototype.runQuery = function () {
4102
4566
  return __awaiter(this, void 0, void 0, function () {
4103
- var method, tableName, logContext, cacheResults, cacheRequestData, requestArgumentsSerialized, evictFromCache, cachedRequest, cachedData, sqlExecution, sqlMethod, queryPromise, cacheRequest, cacheResponse;
4567
+ var method, tableName, logContext, cacheResults, cacheAllowListStatus, cacheRequestData, requestArgumentsSerialized, evictFromCache, cachedRequest, cachedData, sqlExecution, sqlMethod, queryPromise, cacheRequest, cacheResponse;
4104
4568
  var _this = this;
4105
4569
  var _a, _b;
4106
4570
  return __generator(this, function (_c) {
@@ -4111,6 +4575,9 @@ var SqlExecutor = /** @class */ (function (_super) {
4111
4575
  logContext = getLogContext(this.config, this.request);
4112
4576
  cacheResults = method === C6Constants.GET
4113
4577
  && ((_a = this.request.cacheResults) !== null && _a !== void 0 ? _a : true);
4578
+ cacheAllowListStatus = this.config.sqlAllowListPath
4579
+ ? "allowed"
4580
+ : "not verified";
4114
4581
  cacheRequestData = cacheResults
4115
4582
  ? JSON.parse(JSON.stringify((_b = this.request) !== null && _b !== void 0 ? _b : {}))
4116
4583
  : undefined;
@@ -4118,10 +4585,10 @@ var SqlExecutor = /** @class */ (function (_super) {
4118
4585
  ? sortAndSerializeQueryObject(tableName, cacheRequestData !== null && cacheRequestData !== void 0 ? cacheRequestData : {})
4119
4586
  : undefined;
4120
4587
  evictFromCache = method === C6Constants.GET && cacheResults && cacheRequestData
4121
- ? function () { return evictCacheEntry(method, tableName, cacheRequestData, logContext); }
4588
+ ? function () { return evictCacheEntry(method, tableName, cacheRequestData, logContext, cacheAllowListStatus); }
4122
4589
  : undefined;
4123
4590
  if (!cacheResults) return [3 /*break*/, 2];
4124
- cachedRequest = checkCache(method, tableName, cacheRequestData, logContext);
4591
+ cachedRequest = checkCache(method, tableName, cacheRequestData, logContext, cacheAllowListStatus);
4125
4592
  if (!cachedRequest) return [3 /*break*/, 2];
4126
4593
  return [4 /*yield*/, cachedRequest];
4127
4594
  case 1:
@@ -4157,6 +4624,7 @@ var SqlExecutor = /** @class */ (function (_super) {
4157
4624
  setCache(method, tableName, cacheRequestData, {
4158
4625
  requestArgumentsSerialized: requestArgumentsSerialized,
4159
4626
  request: cacheRequest,
4627
+ allowListStatus: cacheAllowListStatus,
4160
4628
  });
4161
4629
  return [4 /*yield*/, cacheRequest];
4162
4630
  case 5:
@@ -4164,6 +4632,7 @@ var SqlExecutor = /** @class */ (function (_super) {
4164
4632
  setCache(method, tableName, cacheRequestData, {
4165
4633
  requestArgumentsSerialized: requestArgumentsSerialized,
4166
4634
  request: cacheRequest,
4635
+ allowListStatus: cacheAllowListStatus,
4167
4636
  response: cacheResponse,
4168
4637
  final: true,
4169
4638
  });
@@ -4207,7 +4676,9 @@ var SqlExecutor = /** @class */ (function (_super) {
4207
4676
  return {
4208
4677
  affected: result.affectedRows,
4209
4678
  insertId: result.insertId,
4210
- rest: [],
4679
+ rest: method === C6Constants.POST
4680
+ ? this.buildPostResponseRows(result.insertId)
4681
+ : [],
4211
4682
  sql: { sql: sqlExecution.sql, values: sqlExecution.values },
4212
4683
  };
4213
4684
  };
@@ -4585,5 +5056,5 @@ function isVerbose() {
4585
5056
  return resolveLogLevel() >= LogLevel.DEBUG;
4586
5057
  }
4587
5058
 
4588
- export { A, AggregateBuilder, C6C, C6Constants, ConditionBuilder, DELETE, DeleteQueryBuilder, Executor, ExpressHandler, F, GET, HttpExecutor, JoinBuilder, LogLevel, POST, PUT, PaginationBuilder, PostQueryBuilder, SelectQueryBuilder, SqlExecutor, TestRestfulResponse, UpdateQueryBuilder, apiRequestCache, applyLogLevelDefaults, axiosInstance, bbox, carbonNodeQsStringify, checkAllRequestsComplete, checkCache, clearCache, collectSqlAllowListEntries, colorSql, compileSqlAllowList, convertForRequestBody, convertHexIfBinary, derivedTable, determineRuntimeJsType, distSphere, eFetchDependencies, error, evictCacheEntry, extractSqlEntries, fieldEq, getEnv, getEnvBool, getEnvDebug, getEnvLogLevel, getLogContext, getPrimaryKeyTypes, group, info, isDerivedTableKey, isLocal, isNode, isTest, isVerbose, loadSqlAllowList, logSql, logWithLevel, normalizeSingularRequest, normalizeSql, notifyToast, onError, onSuccess, parseLogLevel, removeInvalidKeys, removePrefixIfExists, resolveDerivedTable, resolveLogLevel, restExpressRequest, restOrm, restRequest, setCache, setToastHandler, shouldLog, sortAndSerializeQueryObject, stContains, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, versionToRgb as versionColor, warn };
5059
+ export { A, AggregateBuilder, C6C, C6Constants, ConditionBuilder, DELETE, DeleteQueryBuilder, Executor, ExpressHandler, F, GET, HttpExecutor, JoinBuilder, LogLevel, POST, PUT, PaginationBuilder, PostQueryBuilder, SQL_KNOWN_FUNCTIONS, SelectQueryBuilder, SqlExecutor, TestRestfulResponse, UpdateQueryBuilder, alias, apiRequestCache, applyLogLevelDefaults, axiosInstance, bbox, call, carbonNodeQsStringify, checkAllRequestsComplete, checkCache, clearCache, collectSqlAllowListEntries, colorSql, compileSqlAllowList, convertForRequestBody, convertHexIfBinary, derivedTable, determineRuntimeJsType, distSphere, distinct, eFetchDependencies, error, evictCacheEntry, extractSqlEntries, fieldEq, fn, getEnv, getEnvBool, getEnvDebug, getEnvLogLevel, getLogContext, getPrimaryKeyTypes, group, info, isDerivedTableKey, isLocal, isNode, isTest, isVerbose, lit, loadSqlAllowList, logSql, logWithLevel, normalizeSingularRequest, normalizeSql, notifyToast, onError, onSuccess, order, parseLogLevel, removeInvalidKeys, removePrefixIfExists, resolveDerivedTable, resolveLogLevel, restExpressRequest, restOrm, restRequest, serializeSqlExpression, setCache, setToastHandler, shouldLog, sortAndSerializeQueryObject, stContains, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, versionToRgb as versionColor, warn };
4589
5060
  //# sourceMappingURL=index.esm.js.map