@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.
- package/README.md +46 -1
- package/dist/constants/C6Constants.d.ts +342 -338
- package/dist/executors/SqlExecutor.d.ts +8 -0
- package/dist/index.cjs.js +751 -272
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +744 -273
- package/dist/index.esm.js.map +1 -1
- package/dist/orm/builders/AggregateBuilder.d.ts +5 -1
- package/dist/orm/builders/ConditionBuilder.d.ts +2 -3
- package/dist/orm/builders/ExpressionSerializer.d.ts +22 -0
- package/dist/orm/builders/PaginationBuilder.d.ts +4 -6
- package/dist/orm/queryHelpers.d.ts +12 -1
- package/dist/types/mysqlTypes.d.ts +6 -1
- package/dist/types/ormInterfaces.d.ts +7 -5
- package/dist/utils/cacheManager.d.ts +3 -2
- package/package.json +2 -2
- package/scripts/assets/handlebars/C6.test.ts.handlebars +4 -4
- package/src/__tests__/cacheManager.test.ts +28 -0
- package/src/__tests__/expressServer.e2e.test.ts +26 -17
- package/src/__tests__/httpExecutorSingular.e2e.test.ts +53 -14
- package/src/__tests__/normalizeSingularRequest.test.ts +26 -8
- package/src/__tests__/sakila-db/C6.js +1 -1
- package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
- package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
- package/src/__tests__/sakila-db/C6.sqlAllowList.json +1 -1
- package/src/__tests__/sakila-db/C6.test.ts +4 -4
- package/src/__tests__/sakila-db/C6.ts +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +11 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +26 -7
- package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +9 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +10 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +9 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +18 -6
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
- package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +18 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +9 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +9 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +13 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.join.json +10 -10
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +14 -4
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
- package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
- package/src/__tests__/sqlBuilders.complex.test.ts +62 -74
- package/src/__tests__/sqlBuilders.expressions.test.ts +58 -30
- package/src/__tests__/sqlBuilders.test.ts +68 -4
- package/src/__tests__/sqlExecutorPostUuid.test.ts +185 -0
- package/src/constants/C6Constants.ts +3 -1
- package/src/executors/HttpExecutor.ts +35 -6
- package/src/executors/SqlExecutor.ts +232 -4
- package/src/index.ts +1 -0
- package/src/orm/builders/AggregateBuilder.ts +67 -106
- package/src/orm/builders/ConditionBuilder.ts +69 -93
- package/src/orm/builders/ExpressionSerializer.ts +275 -0
- package/src/orm/builders/PaginationBuilder.ts +24 -34
- package/src/orm/queryHelpers.ts +29 -0
- package/src/types/mysqlTypes.ts +130 -9
- package/src/types/ormInterfaces.ts +7 -7
- package/src/utils/cacheManager.ts +6 -4
- 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
|
|
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
|
-
|
|
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 */
|
|
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
|
-
(
|
|
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), (
|
|
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)), (
|
|
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,
|
|
1285
|
-
var
|
|
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
|
|
1288
|
-
return __generator(this, function (
|
|
1289
|
-
switch (
|
|
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,
|
|
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 !== ((
|
|
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 = (
|
|
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((
|
|
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 = (
|
|
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((
|
|
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 = (
|
|
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 = (
|
|
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 = (
|
|
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.
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
return
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
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
|
-
|
|
1898
|
-
|
|
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 (
|
|
1901
|
-
|
|
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
|
-
|
|
1905
|
-
|
|
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
|
-
|
|
2281
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
2310
|
-
return { sql: this.ensureWrapped(
|
|
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
|
|
2314
|
-
return { sql: this.ensureWrapped(
|
|
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
|
-
|
|
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 &&
|
|
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
|
|
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.
|
|
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
|
-
*
|
|
3120
|
-
* [property_units.
|
|
3121
|
-
*
|
|
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
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
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
|
-
|
|
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({},
|
|
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({},
|
|
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({},
|
|
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
|