@carbonorm/carbonnode 6.0.20 → 6.1.1
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 +521 -259
- package/dist/constants/C6Constants.d.ts +342 -338
- package/dist/executors/SqlExecutor.d.ts +1 -0
- package/dist/index.cjs.js +746 -290
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +737 -291
- 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/orm/utils/sqlUtils.d.ts +1 -0
- package/dist/types/mysqlTypes.d.ts +6 -1
- package/dist/types/ormInterfaces.d.ts +7 -5
- package/dist/utils/sqlAllowList.d.ts +5 -3
- package/package.json +2 -2
- package/scripts/assets/handlebars/C6.test.ts.handlebars +4 -4
- package/src/__tests__/expressServer.e2e.test.ts +26 -17
- package/src/__tests__/fixtures/c6.fixture.ts +33 -0
- 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 +6 -6
- 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 +19 -12
- 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 +4 -4
- 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 +4 -4
- 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 +4 -4
- 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 +10 -10
- 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 +4 -4
- 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 +2 -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 +4 -4
- 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 +4 -4
- 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.post.json +6 -6
- 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__/sqlAllowList.test.ts +56 -1
- package/src/__tests__/sqlBuilders.complex.test.ts +62 -74
- package/src/__tests__/sqlBuilders.expressions.test.ts +58 -30
- package/src/__tests__/sqlBuilders.test.ts +106 -5
- package/src/constants/C6Constants.ts +3 -1
- package/src/executors/HttpExecutor.ts +2 -1
- package/src/executors/SqlExecutor.ts +29 -4
- package/src/index.ts +1 -0
- package/src/orm/builders/AggregateBuilder.ts +67 -106
- package/src/orm/builders/ConditionBuilder.ts +72 -103
- 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/orm/utils/sqlUtils.ts +172 -4
- package/src/types/mysqlTypes.ts +130 -9
- package/src/types/ormInterfaces.ts +7 -7
- package/src/utils/normalizeSingularRequest.ts +11 -4
- package/src/utils/sqlAllowList.ts +44 -11
package/dist/index.cjs.js
CHANGED
|
@@ -163,6 +163,7 @@ var C6Constants = {
|
|
|
163
163
|
AND: 'AND',
|
|
164
164
|
BETWEEN: 'BETWEEN',
|
|
165
165
|
CONCAT: 'CONCAT',
|
|
166
|
+
CALL: 'CALL',
|
|
166
167
|
CONVERT_TZ: 'CONVERT_TZ',
|
|
167
168
|
COUNT: 'COUNT',
|
|
168
169
|
COUNT_ALL: 'COUNT_ALL',
|
|
@@ -217,6 +218,7 @@ var C6Constants = {
|
|
|
217
218
|
LESS_THAN: '<',
|
|
218
219
|
LESS_THAN_OR_EQUAL_TO: '<=',
|
|
219
220
|
LIKE: 'LIKE',
|
|
221
|
+
LIT: 'LIT',
|
|
220
222
|
LIMIT: 'LIMIT',
|
|
221
223
|
LOCALTIME: 'LOCALTIME',
|
|
222
224
|
LOCALTIMESTAMP: 'LOCALTIMESTAMP',
|
|
@@ -954,7 +956,7 @@ function colorSql(sql) {
|
|
|
954
956
|
return s;
|
|
955
957
|
}
|
|
956
958
|
|
|
957
|
-
var version = "6.
|
|
959
|
+
var version = "6.1.1";
|
|
958
960
|
|
|
959
961
|
var DEFAULT_STEP = 8;
|
|
960
962
|
function parseSemver(version) {
|
|
@@ -1291,16 +1293,16 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1291
1293
|
}
|
|
1292
1294
|
query = this.request;
|
|
1293
1295
|
apiRequest = function () { return tslib.__awaiter(_this, void 0, void 0, function () {
|
|
1294
|
-
var _a, debug, _b, cacheResults, dataInsertMultipleRows, success,
|
|
1295
|
-
var
|
|
1296
|
+
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;
|
|
1297
|
+
var _f;
|
|
1296
1298
|
var _this = this;
|
|
1297
|
-
var
|
|
1298
|
-
return tslib.__generator(this, function (
|
|
1299
|
-
switch (
|
|
1299
|
+
var _g, _h, _j, _k, _l, _m;
|
|
1300
|
+
return tslib.__generator(this, function (_o) {
|
|
1301
|
+
switch (_o.label) {
|
|
1300
1302
|
case 0:
|
|
1301
|
-
_a = this.request, debug = _a.debug, _b = _a.cacheResults, cacheResults = _b === void 0 ? (C6.GET === requestMethod) : _b, dataInsertMultipleRows = _a.dataInsertMultipleRows, success = _a.success,
|
|
1303
|
+
_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 ? exports.eFetchDependencies.NONE : _d, _e = _a.error, error = _e === void 0 ? "An unexpected API error occurred!" : _e;
|
|
1302
1304
|
if (C6.GET === requestMethod
|
|
1303
|
-
&& undefined !== ((
|
|
1305
|
+
&& undefined !== ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.PAGE])
|
|
1304
1306
|
&& 1 !== query[C6.PAGINATION][C6.PAGE]
|
|
1305
1307
|
&& isLocal()
|
|
1306
1308
|
&& shouldLog(exports.LogLevel.DEBUG, logContext)) {
|
|
@@ -1335,7 +1337,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1335
1337
|
if (!cachedRequest) return [3 /*break*/, 2];
|
|
1336
1338
|
return [4 /*yield*/, cachedRequest];
|
|
1337
1339
|
case 1:
|
|
1338
|
-
cachedData = (
|
|
1340
|
+
cachedData = (_o.sent()).data;
|
|
1339
1341
|
if (evictFromCache
|
|
1340
1342
|
&& cachedData
|
|
1341
1343
|
&& typeof cachedData === "object"
|
|
@@ -1357,9 +1359,9 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1357
1359
|
needsConditionOrPrimaryCheck = (PUT === requestMethod || DELETE === requestMethod)
|
|
1358
1360
|
&& false === skipPrimaryCheck;
|
|
1359
1361
|
TABLES = C6.TABLES;
|
|
1360
|
-
primaryKeyList = structuredClone((
|
|
1362
|
+
primaryKeyList = structuredClone((_h = TABLES[operatingTable]) === null || _h === void 0 ? void 0 : _h.PRIMARY);
|
|
1361
1363
|
primaryKeyFullyQualified = primaryKeyList === null || primaryKeyList === void 0 ? void 0 : primaryKeyList.pop();
|
|
1362
|
-
primaryKey = (
|
|
1364
|
+
primaryKey = (_j = primaryKeyFullyQualified === null || primaryKeyFullyQualified === void 0 ? void 0 : primaryKeyFullyQualified.split('.')) === null || _j === void 0 ? void 0 : _j.pop();
|
|
1363
1365
|
if (needsConditionOrPrimaryCheck) {
|
|
1364
1366
|
if (undefined === primaryKey) {
|
|
1365
1367
|
whereVal = query === null || query === void 0 ? void 0 : query[C6.WHERE];
|
|
@@ -1368,7 +1370,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1368
1370
|
(typeof whereVal === 'object' && !Array.isArray(whereVal) && Object.keys(whereVal).length === 0);
|
|
1369
1371
|
if (whereIsEmpty) {
|
|
1370
1372
|
logWithLevel(exports.LogLevel.ERROR, logContext, console.error, query);
|
|
1371
|
-
throw Error('Failed to parse primary key information. Query: (' + JSON.stringify(query) + ') Primary Key: (' + JSON.stringify(primaryKey) + ') TABLES[operatingTable]?.PRIMARY: (' + JSON.stringify((
|
|
1373
|
+
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 + ').');
|
|
1372
1374
|
}
|
|
1373
1375
|
}
|
|
1374
1376
|
else {
|
|
@@ -1380,7 +1382,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1380
1382
|
}
|
|
1381
1383
|
throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
|
|
1382
1384
|
}
|
|
1383
|
-
providedPrimary = (
|
|
1385
|
+
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);
|
|
1384
1386
|
if (undefined === providedPrimary || null === providedPrimary) {
|
|
1385
1387
|
notifyToast("error", "The primary key (".concat(primaryKey, ") provided is undefined or null explicitly!!"));
|
|
1386
1388
|
throw Error('The primary key (' + primaryKey + ') provided in the request was exactly equal to undefined.');
|
|
@@ -1394,7 +1396,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1394
1396
|
&& undefined !== query
|
|
1395
1397
|
&& null !== query
|
|
1396
1398
|
&& undefined !== primaryKey) {
|
|
1397
|
-
primaryVal = (
|
|
1399
|
+
primaryVal = (_m = query[primaryKey]) !== null && _m !== void 0 ? _m : (primaryKeyFullyQualified ? query[primaryKeyFullyQualified] : undefined);
|
|
1398
1400
|
if (undefined !== primaryVal) {
|
|
1399
1401
|
restRequestUri += primaryVal + '/';
|
|
1400
1402
|
if (isLocal() && shouldLog(exports.LogLevel.DEBUG, logContext)) {
|
|
@@ -1422,7 +1424,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1422
1424
|
config: this.config,
|
|
1423
1425
|
request: this.request
|
|
1424
1426
|
});
|
|
1425
|
-
axiosActiveRequest_1 = (
|
|
1427
|
+
axiosActiveRequest_1 = (_f = axios)[requestMethod.toLowerCase()].apply(_f, tslib.__spreadArray([restRequestUri], (function () {
|
|
1426
1428
|
var convert = function (data) {
|
|
1427
1429
|
return convertForRequestBody(data, fullTableList, C6, function (message) { return notifyToast("error", message, toastOptions); });
|
|
1428
1430
|
};
|
|
@@ -1511,7 +1513,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1511
1513
|
request: _this.request,
|
|
1512
1514
|
response: response
|
|
1513
1515
|
}); };
|
|
1514
|
-
if (undefined !== reactBootstrap && response) {
|
|
1516
|
+
if (undefined !== reactBootstrap && response && !skipReactBootstrap) {
|
|
1515
1517
|
switch (requestMethod) {
|
|
1516
1518
|
case GET:
|
|
1517
1519
|
response.data && reactBootstrap.updateRestfulObjectArrays({
|
|
@@ -1799,15 +1801,489 @@ var HttpExecutor$1 = /*#__PURE__*/Object.freeze({
|
|
|
1799
1801
|
});
|
|
1800
1802
|
|
|
1801
1803
|
function convertHexIfBinary(_col, val, columnDef) {
|
|
1804
|
+
var _a;
|
|
1802
1805
|
if (typeof val === 'string' &&
|
|
1803
1806
|
/^[0-9a-fA-F]{32}$/.test(val) &&
|
|
1804
1807
|
typeof columnDef === 'object' &&
|
|
1805
|
-
columnDef.MYSQL_TYPE.toUpperCase().includes('BINARY')) {
|
|
1808
|
+
String((_a = columnDef.MYSQL_TYPE) !== null && _a !== void 0 ? _a : '').toUpperCase().includes('BINARY')) {
|
|
1806
1809
|
return Buffer.from(val, 'hex');
|
|
1807
1810
|
}
|
|
1808
1811
|
return val;
|
|
1809
1812
|
}
|
|
1813
|
+
var TEMPORAL_TYPES = new Set([
|
|
1814
|
+
'date',
|
|
1815
|
+
'datetime',
|
|
1816
|
+
'timestamp',
|
|
1817
|
+
'time',
|
|
1818
|
+
'year',
|
|
1819
|
+
]);
|
|
1820
|
+
var MYSQL_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
1821
|
+
var MYSQL_DATETIME_REGEX = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d{1,6})?$/;
|
|
1822
|
+
var MYSQL_TIME_REGEX = /^-?\d{2,3}:\d{2}:\d{2}(?:\.\d{1,6})?$/;
|
|
1823
|
+
var ISO_DATETIME_REGEX = /^(\d{4}-\d{2}-\d{2})[Tt](\d{2}:\d{2}:\d{2})(\.\d{1,6})?([zZ]|[+-]\d{2}:\d{2})?$/;
|
|
1824
|
+
var pad2 = function (value) { return value.toString().padStart(2, '0'); };
|
|
1825
|
+
function trimFraction(value, precision) {
|
|
1826
|
+
var _a = value.split('.', 2), base = _a[0], fractionRaw = _a[1];
|
|
1827
|
+
if (precision <= 0 || !fractionRaw)
|
|
1828
|
+
return base;
|
|
1829
|
+
return "".concat(base, ".").concat(fractionRaw.slice(0, precision).padEnd(precision, '0'));
|
|
1830
|
+
}
|
|
1831
|
+
function normalizeFraction(raw, precision) {
|
|
1832
|
+
if (precision <= 0)
|
|
1833
|
+
return '';
|
|
1834
|
+
if (!raw)
|
|
1835
|
+
return '';
|
|
1836
|
+
var digits = raw.startsWith('.') ? raw.slice(1) : raw;
|
|
1837
|
+
return ".".concat(digits.slice(0, precision).padEnd(precision, '0'));
|
|
1838
|
+
}
|
|
1839
|
+
function formatDateUtc(value) {
|
|
1840
|
+
return "".concat(value.getUTCFullYear(), "-").concat(pad2(value.getUTCMonth() + 1), "-").concat(pad2(value.getUTCDate()));
|
|
1841
|
+
}
|
|
1842
|
+
function formatTimeUtc(value, precision) {
|
|
1843
|
+
var base = "".concat(pad2(value.getUTCHours()), ":").concat(pad2(value.getUTCMinutes()), ":").concat(pad2(value.getUTCSeconds()));
|
|
1844
|
+
if (precision <= 0)
|
|
1845
|
+
return base;
|
|
1846
|
+
var millis = value.getUTCMilliseconds().toString().padStart(3, '0');
|
|
1847
|
+
var fraction = millis.slice(0, Math.min(precision, 3)).padEnd(precision, '0');
|
|
1848
|
+
return "".concat(base, ".").concat(fraction);
|
|
1849
|
+
}
|
|
1850
|
+
function formatDateTimeUtc(value, precision) {
|
|
1851
|
+
return "".concat(formatDateUtc(value), " ").concat(formatTimeUtc(value, precision));
|
|
1852
|
+
}
|
|
1853
|
+
function parseEpochNumber(value) {
|
|
1854
|
+
if (!Number.isFinite(value))
|
|
1855
|
+
return undefined;
|
|
1856
|
+
var abs = Math.abs(value);
|
|
1857
|
+
if (abs >= 1e12) {
|
|
1858
|
+
var date = new Date(value);
|
|
1859
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
1860
|
+
}
|
|
1861
|
+
if (abs >= 1e9) {
|
|
1862
|
+
var date = new Date(value * 1000);
|
|
1863
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
1864
|
+
}
|
|
1865
|
+
return undefined;
|
|
1866
|
+
}
|
|
1867
|
+
function parseTemporalType(columnDef) {
|
|
1868
|
+
var _a;
|
|
1869
|
+
var raw = String((_a = columnDef === null || columnDef === void 0 ? void 0 : columnDef.MYSQL_TYPE) !== null && _a !== void 0 ? _a : '').trim().toLowerCase();
|
|
1870
|
+
if (!raw)
|
|
1871
|
+
return { baseType: undefined, precision: 0 };
|
|
1872
|
+
var base = raw.split(/[\s(]/, 1)[0];
|
|
1873
|
+
if (!TEMPORAL_TYPES.has(base))
|
|
1874
|
+
return { baseType: undefined, precision: 0 };
|
|
1875
|
+
var precisionMatch = raw.match(/^(?:datetime|timestamp|time)\((\d+)\)/);
|
|
1876
|
+
if (!precisionMatch)
|
|
1877
|
+
return { baseType: base, precision: 0 };
|
|
1878
|
+
var parsed = Number.parseInt(precisionMatch[1], 10);
|
|
1879
|
+
if (!Number.isFinite(parsed))
|
|
1880
|
+
return { baseType: base, precision: 0 };
|
|
1881
|
+
return { baseType: base, precision: Math.max(0, Math.min(6, parsed)) };
|
|
1882
|
+
}
|
|
1883
|
+
function normalizeTemporalString(value, baseType, precision) {
|
|
1884
|
+
var trimmed = value.trim();
|
|
1885
|
+
if (!trimmed)
|
|
1886
|
+
return value;
|
|
1887
|
+
if (baseType === 'date') {
|
|
1888
|
+
if (MYSQL_DATE_REGEX.test(trimmed))
|
|
1889
|
+
return trimmed;
|
|
1890
|
+
var iso_1 = trimmed.match(ISO_DATETIME_REGEX);
|
|
1891
|
+
if (iso_1) {
|
|
1892
|
+
var datePart = iso_1[1], timezonePart = iso_1[4];
|
|
1893
|
+
if (!timezonePart)
|
|
1894
|
+
return datePart;
|
|
1895
|
+
var parsed_1 = new Date(trimmed);
|
|
1896
|
+
return Number.isNaN(parsed_1.getTime()) ? value : formatDateUtc(parsed_1);
|
|
1897
|
+
}
|
|
1898
|
+
var parsed_2 = new Date(trimmed);
|
|
1899
|
+
return Number.isNaN(parsed_2.getTime()) ? value : formatDateUtc(parsed_2);
|
|
1900
|
+
}
|
|
1901
|
+
if (baseType === 'time') {
|
|
1902
|
+
if (MYSQL_TIME_REGEX.test(trimmed))
|
|
1903
|
+
return trimFraction(trimmed, precision);
|
|
1904
|
+
var iso_2 = trimmed.match(ISO_DATETIME_REGEX);
|
|
1905
|
+
if (iso_2) {
|
|
1906
|
+
var timePart = iso_2[2], fractionPart = iso_2[3], timezonePart = iso_2[4];
|
|
1907
|
+
if (!timezonePart) {
|
|
1908
|
+
return "".concat(timePart).concat(normalizeFraction(fractionPart, precision));
|
|
1909
|
+
}
|
|
1910
|
+
var parsed_3 = new Date(trimmed);
|
|
1911
|
+
return Number.isNaN(parsed_3.getTime()) ? value : formatTimeUtc(parsed_3, precision);
|
|
1912
|
+
}
|
|
1913
|
+
var parsed_4 = new Date(trimmed);
|
|
1914
|
+
return Number.isNaN(parsed_4.getTime()) ? value : formatTimeUtc(parsed_4, precision);
|
|
1915
|
+
}
|
|
1916
|
+
if (baseType === 'year') {
|
|
1917
|
+
if (/^\d{2,4}$/.test(trimmed))
|
|
1918
|
+
return trimmed;
|
|
1919
|
+
var parsed_5 = new Date(trimmed);
|
|
1920
|
+
return Number.isNaN(parsed_5.getTime()) ? value : String(parsed_5.getUTCFullYear());
|
|
1921
|
+
}
|
|
1922
|
+
if (MYSQL_DATETIME_REGEX.test(trimmed))
|
|
1923
|
+
return trimFraction(trimmed, precision);
|
|
1924
|
+
var iso = trimmed.match(ISO_DATETIME_REGEX);
|
|
1925
|
+
if (iso) {
|
|
1926
|
+
var datePart = iso[1], timePart = iso[2], fractionPart = iso[3], timezonePart = iso[4];
|
|
1927
|
+
if (!timezonePart) {
|
|
1928
|
+
return "".concat(datePart, " ").concat(timePart).concat(normalizeFraction(fractionPart, precision));
|
|
1929
|
+
}
|
|
1930
|
+
var parsed_6 = new Date(trimmed);
|
|
1931
|
+
return Number.isNaN(parsed_6.getTime()) ? value : formatDateTimeUtc(parsed_6, precision);
|
|
1932
|
+
}
|
|
1933
|
+
var parsed = new Date(trimmed);
|
|
1934
|
+
return Number.isNaN(parsed.getTime()) ? value : formatDateTimeUtc(parsed, precision);
|
|
1935
|
+
}
|
|
1936
|
+
function convertTemporalIfNeeded(value, columnDef) {
|
|
1937
|
+
var _a = parseTemporalType(columnDef), baseType = _a.baseType, precision = _a.precision;
|
|
1938
|
+
if (!baseType)
|
|
1939
|
+
return value;
|
|
1940
|
+
if (value === null || value === undefined)
|
|
1941
|
+
return value;
|
|
1942
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value))
|
|
1943
|
+
return value;
|
|
1944
|
+
if (value instanceof Date) {
|
|
1945
|
+
if (baseType === 'date')
|
|
1946
|
+
return formatDateUtc(value);
|
|
1947
|
+
if (baseType === 'time')
|
|
1948
|
+
return formatTimeUtc(value, precision);
|
|
1949
|
+
if (baseType === 'year')
|
|
1950
|
+
return String(value.getUTCFullYear());
|
|
1951
|
+
return formatDateTimeUtc(value, precision);
|
|
1952
|
+
}
|
|
1953
|
+
if (typeof value === 'number') {
|
|
1954
|
+
var parsed = parseEpochNumber(value);
|
|
1955
|
+
if (!parsed)
|
|
1956
|
+
return value;
|
|
1957
|
+
if (baseType === 'date')
|
|
1958
|
+
return formatDateUtc(parsed);
|
|
1959
|
+
if (baseType === 'time')
|
|
1960
|
+
return formatTimeUtc(parsed, precision);
|
|
1961
|
+
if (baseType === 'year')
|
|
1962
|
+
return String(parsed.getUTCFullYear());
|
|
1963
|
+
return formatDateTimeUtc(parsed, precision);
|
|
1964
|
+
}
|
|
1965
|
+
if (typeof value === 'string') {
|
|
1966
|
+
return normalizeTemporalString(value, baseType, precision);
|
|
1967
|
+
}
|
|
1968
|
+
return value;
|
|
1969
|
+
}
|
|
1970
|
+
function convertSqlValueForColumn(col, val, columnDef) {
|
|
1971
|
+
var binaryConverted = convertHexIfBinary(col, val, columnDef);
|
|
1972
|
+
return convertTemporalIfNeeded(binaryConverted, columnDef);
|
|
1973
|
+
}
|
|
1974
|
+
|
|
1975
|
+
// ========================
|
|
1976
|
+
// SQL Operators & Expressions
|
|
1977
|
+
// ========================
|
|
1978
|
+
var SQL_KNOWN_FUNCTIONS = [
|
|
1979
|
+
'ADDDATE',
|
|
1980
|
+
'ADDTIME',
|
|
1981
|
+
'CONCAT',
|
|
1982
|
+
'CONVERT_TZ',
|
|
1983
|
+
'COUNT',
|
|
1984
|
+
'COUNT_ALL',
|
|
1985
|
+
'CURRENT_DATE',
|
|
1986
|
+
'CURRENT_TIMESTAMP',
|
|
1987
|
+
'DAY',
|
|
1988
|
+
'DAY_HOUR',
|
|
1989
|
+
'DAY_MICROSECOND',
|
|
1990
|
+
'DAY_MINUTE',
|
|
1991
|
+
'DAY_SECOND',
|
|
1992
|
+
'DAYNAME',
|
|
1993
|
+
'DAYOFMONTH',
|
|
1994
|
+
'DAYOFWEEK',
|
|
1995
|
+
'DAYOFYEAR',
|
|
1996
|
+
'DATE',
|
|
1997
|
+
'DATE_ADD',
|
|
1998
|
+
'DATEDIFF',
|
|
1999
|
+
'DATE_SUB',
|
|
2000
|
+
'DATE_FORMAT',
|
|
2001
|
+
'EXTRACT',
|
|
2002
|
+
'FROM_DAYS',
|
|
2003
|
+
'FROM_UNIXTIME',
|
|
2004
|
+
'GET_FORMAT',
|
|
2005
|
+
'GROUP_CONCAT',
|
|
2006
|
+
'HEX',
|
|
2007
|
+
'HOUR',
|
|
2008
|
+
'HOUR_MICROSECOND',
|
|
2009
|
+
'HOUR_MINUTE',
|
|
2010
|
+
'HOUR_SECOND',
|
|
2011
|
+
'INTERVAL',
|
|
2012
|
+
'LOCALTIME',
|
|
2013
|
+
'LOCALTIMESTAMP',
|
|
2014
|
+
'MAKEDATE',
|
|
2015
|
+
'MAKETIME',
|
|
2016
|
+
'MAX',
|
|
2017
|
+
'MBRContains',
|
|
2018
|
+
'MICROSECOND',
|
|
2019
|
+
'MIN',
|
|
2020
|
+
'MINUTE',
|
|
2021
|
+
'MINUTE_MICROSECOND',
|
|
2022
|
+
'MINUTE_SECOND',
|
|
2023
|
+
'MONTH',
|
|
2024
|
+
'MONTHNAME',
|
|
2025
|
+
'NOW',
|
|
2026
|
+
'POINT',
|
|
2027
|
+
'POLYGON',
|
|
2028
|
+
'SECOND',
|
|
2029
|
+
'SECOND_MICROSECOND',
|
|
2030
|
+
'ST_Area',
|
|
2031
|
+
'ST_AsBinary',
|
|
2032
|
+
'ST_AsText',
|
|
2033
|
+
'ST_Buffer',
|
|
2034
|
+
'ST_Contains',
|
|
2035
|
+
'ST_Crosses',
|
|
2036
|
+
'ST_Difference',
|
|
2037
|
+
'ST_Dimension',
|
|
2038
|
+
'ST_Disjoint',
|
|
2039
|
+
'ST_Distance',
|
|
2040
|
+
'ST_Distance_Sphere',
|
|
2041
|
+
'ST_EndPoint',
|
|
2042
|
+
'ST_Envelope',
|
|
2043
|
+
'ST_Equals',
|
|
2044
|
+
'ST_GeomFromGeoJSON',
|
|
2045
|
+
'ST_GeomFromText',
|
|
2046
|
+
'ST_GeomFromWKB',
|
|
2047
|
+
'ST_Intersects',
|
|
2048
|
+
'ST_Length',
|
|
2049
|
+
'ST_MakeEnvelope',
|
|
2050
|
+
'ST_Overlaps',
|
|
2051
|
+
'ST_Point',
|
|
2052
|
+
'ST_SetSRID',
|
|
2053
|
+
'ST_SRID',
|
|
2054
|
+
'ST_StartPoint',
|
|
2055
|
+
'ST_SymDifference',
|
|
2056
|
+
'ST_Touches',
|
|
2057
|
+
'ST_Union',
|
|
2058
|
+
'ST_Within',
|
|
2059
|
+
'ST_X',
|
|
2060
|
+
'ST_Y',
|
|
2061
|
+
'STR_TO_DATE',
|
|
2062
|
+
'SUBDATE',
|
|
2063
|
+
'SUBTIME',
|
|
2064
|
+
'SUM',
|
|
2065
|
+
'SYSDATE',
|
|
2066
|
+
'TIME',
|
|
2067
|
+
'TIME_FORMAT',
|
|
2068
|
+
'TIME_TO_SEC',
|
|
2069
|
+
'TIMEDIFF',
|
|
2070
|
+
'TIMESTAMP',
|
|
2071
|
+
'TIMESTAMPADD',
|
|
2072
|
+
'TIMESTAMPDIFF',
|
|
2073
|
+
'TO_DAYS',
|
|
2074
|
+
'TO_SECONDS',
|
|
2075
|
+
'TRANSACTION_TIMESTAMP',
|
|
2076
|
+
'UNHEX',
|
|
2077
|
+
'UNIX_TIMESTAMP',
|
|
2078
|
+
'UTC_DATE',
|
|
2079
|
+
'UTC_TIME',
|
|
2080
|
+
'UTC_TIMESTAMP',
|
|
2081
|
+
'WEEKDAY',
|
|
2082
|
+
'WEEKOFYEAR',
|
|
2083
|
+
'YEARWEEK',
|
|
2084
|
+
];
|
|
2085
|
+
|
|
2086
|
+
var IDENTIFIER_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
2087
|
+
var isFiniteNumber = function (value) {
|
|
2088
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
2089
|
+
};
|
|
2090
|
+
var normalizeToken = function (token) { return token.trim(); };
|
|
2091
|
+
var ensureParams = function (opts) {
|
|
2092
|
+
if (!opts.params) {
|
|
2093
|
+
throw new Error("".concat(opts.context, " requires parameter tracking for literal bindings."));
|
|
2094
|
+
}
|
|
2095
|
+
if (!opts.hooks.addParam) {
|
|
2096
|
+
throw new Error("".concat(opts.context, " requires addParam support for literal bindings."));
|
|
2097
|
+
}
|
|
2098
|
+
return opts.params;
|
|
2099
|
+
};
|
|
2100
|
+
var serializeStringReference = function (raw, opts) {
|
|
2101
|
+
var value = raw.trim();
|
|
2102
|
+
if (value === '*') {
|
|
2103
|
+
return {
|
|
2104
|
+
sql: value,
|
|
2105
|
+
isReference: true,
|
|
2106
|
+
isExpression: false,
|
|
2107
|
+
isSubSelect: false,
|
|
2108
|
+
};
|
|
2109
|
+
}
|
|
2110
|
+
if (!opts.hooks.isReference(value)) {
|
|
2111
|
+
throw new Error("Bare string '".concat(raw, "' is not a reference in ").concat(opts.context, ". Wrap literal strings with [C6C.LIT, value]."));
|
|
2112
|
+
}
|
|
2113
|
+
if (value.includes('.')) {
|
|
2114
|
+
opts.hooks.assertValidIdentifier(value, opts.context);
|
|
2115
|
+
}
|
|
2116
|
+
return {
|
|
2117
|
+
sql: value,
|
|
2118
|
+
isReference: true,
|
|
2119
|
+
isExpression: false,
|
|
2120
|
+
isSubSelect: false,
|
|
2121
|
+
};
|
|
2122
|
+
};
|
|
2123
|
+
var serializeLiteralValue = function (value, opts) {
|
|
2124
|
+
var _a;
|
|
2125
|
+
if (value === null || value === C6C.NULL) {
|
|
2126
|
+
return {
|
|
2127
|
+
sql: 'NULL',
|
|
2128
|
+
isReference: false,
|
|
2129
|
+
isExpression: false,
|
|
2130
|
+
isSubSelect: false,
|
|
2131
|
+
};
|
|
2132
|
+
}
|
|
2133
|
+
if (isFiniteNumber(value)) {
|
|
2134
|
+
return {
|
|
2135
|
+
sql: String(value),
|
|
2136
|
+
isReference: false,
|
|
2137
|
+
isExpression: false,
|
|
2138
|
+
isSubSelect: false,
|
|
2139
|
+
};
|
|
2140
|
+
}
|
|
2141
|
+
if (typeof value === 'boolean') {
|
|
2142
|
+
return {
|
|
2143
|
+
sql: value ? 'TRUE' : 'FALSE',
|
|
2144
|
+
isReference: false,
|
|
2145
|
+
isExpression: false,
|
|
2146
|
+
isSubSelect: false,
|
|
2147
|
+
};
|
|
2148
|
+
}
|
|
2149
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
|
|
2150
|
+
var params = ensureParams(opts);
|
|
2151
|
+
return {
|
|
2152
|
+
sql: opts.hooks.addParam(params, (_a = opts.contextColumn) !== null && _a !== void 0 ? _a : '', value),
|
|
2153
|
+
isReference: false,
|
|
2154
|
+
isExpression: false,
|
|
2155
|
+
isSubSelect: false,
|
|
2156
|
+
};
|
|
2157
|
+
}
|
|
2158
|
+
throw new Error("Unsupported literal value in ".concat(opts.context, ". Use [C6C.LIT, value] for non-reference strings or complex values."));
|
|
2159
|
+
};
|
|
2160
|
+
var validateAlias = function (aliasRaw, context) {
|
|
2161
|
+
if (typeof aliasRaw !== 'string' || aliasRaw.trim() === '') {
|
|
2162
|
+
throw new Error("[C6C.AS] in ".concat(context, " expects a non-empty alias string."));
|
|
2163
|
+
}
|
|
2164
|
+
var alias = aliasRaw.trim();
|
|
2165
|
+
if (!IDENTIFIER_REGEX.test(alias)) {
|
|
2166
|
+
throw new Error("[C6C.AS] alias '".concat(alias, "' in ").concat(context, " must be a valid SQL identifier."));
|
|
2167
|
+
}
|
|
2168
|
+
return alias;
|
|
2169
|
+
};
|
|
2170
|
+
var validateFunctionName = function (nameRaw, context) {
|
|
2171
|
+
if (typeof nameRaw !== 'string' || nameRaw.trim() === '') {
|
|
2172
|
+
throw new Error("[C6C.CALL] in ".concat(context, " expects the custom function name as a non-empty string."));
|
|
2173
|
+
}
|
|
2174
|
+
var name = normalizeToken(nameRaw);
|
|
2175
|
+
if (!IDENTIFIER_REGEX.test(name)) {
|
|
2176
|
+
throw new Error("[C6C.CALL] function '".concat(name, "' in ").concat(context, " must be a valid SQL identifier."));
|
|
2177
|
+
}
|
|
2178
|
+
return name;
|
|
2179
|
+
};
|
|
2180
|
+
var serializeFunctionArgs = function (args, opts) { return args
|
|
2181
|
+
.map(function (arg) { return serializeSqlExpression(arg, opts).sql; })
|
|
2182
|
+
.join(', '); };
|
|
2183
|
+
var serializeSqlExpression = function (value, opts) {
|
|
2184
|
+
var _a, _b, _c;
|
|
2185
|
+
if (value instanceof Map) {
|
|
2186
|
+
value = Object.fromEntries(value);
|
|
2187
|
+
}
|
|
2188
|
+
if (Array.isArray(value)) {
|
|
2189
|
+
if (value.length === 0) {
|
|
2190
|
+
throw new Error("Invalid empty expression array in ".concat(opts.context, "."));
|
|
2191
|
+
}
|
|
2192
|
+
var headRaw = value[0], tail = value.slice(1);
|
|
2193
|
+
if (typeof headRaw !== 'string') {
|
|
2194
|
+
throw new Error("Expression arrays in ".concat(opts.context, " must start with a string token."));
|
|
2195
|
+
}
|
|
2196
|
+
var head = normalizeToken(headRaw);
|
|
2197
|
+
var token = head.toUpperCase();
|
|
2198
|
+
if (token === C6C.AS) {
|
|
2199
|
+
if (tail.length !== 2) {
|
|
2200
|
+
throw new Error("[C6C.AS] in ".concat(opts.context, " expects [C6C.AS, expression, alias]."));
|
|
2201
|
+
}
|
|
2202
|
+
var inner = serializeSqlExpression(tail[0], opts);
|
|
2203
|
+
var alias = validateAlias(tail[1], opts.context);
|
|
2204
|
+
(_b = (_a = opts.hooks).onAlias) === null || _b === void 0 ? void 0 : _b.call(_a, alias);
|
|
2205
|
+
return {
|
|
2206
|
+
sql: "".concat(inner.sql, " AS ").concat(alias),
|
|
2207
|
+
isReference: false,
|
|
2208
|
+
isExpression: true,
|
|
2209
|
+
isSubSelect: inner.isSubSelect,
|
|
2210
|
+
};
|
|
2211
|
+
}
|
|
2212
|
+
if (token === C6C.DISTINCT) {
|
|
2213
|
+
if (tail.length !== 1) {
|
|
2214
|
+
throw new Error("[C6C.DISTINCT] in ".concat(opts.context, " expects [C6C.DISTINCT, expression]."));
|
|
2215
|
+
}
|
|
2216
|
+
var inner = serializeSqlExpression(tail[0], opts);
|
|
2217
|
+
return {
|
|
2218
|
+
sql: "DISTINCT ".concat(inner.sql),
|
|
2219
|
+
isReference: false,
|
|
2220
|
+
isExpression: true,
|
|
2221
|
+
isSubSelect: inner.isSubSelect,
|
|
2222
|
+
};
|
|
2223
|
+
}
|
|
2224
|
+
if (token === C6C.LIT || token === C6C.PARAM) {
|
|
2225
|
+
if (tail.length !== 1) {
|
|
2226
|
+
throw new Error("[".concat(head, "] in ").concat(opts.context, " expects [").concat(head, ", value]."));
|
|
2227
|
+
}
|
|
2228
|
+
var params = ensureParams(opts);
|
|
2229
|
+
return {
|
|
2230
|
+
sql: opts.hooks.addParam(params, (_c = opts.contextColumn) !== null && _c !== void 0 ? _c : '', tail[0]),
|
|
2231
|
+
isReference: false,
|
|
2232
|
+
isExpression: false,
|
|
2233
|
+
isSubSelect: false,
|
|
2234
|
+
};
|
|
2235
|
+
}
|
|
2236
|
+
if (token === C6C.SUBSELECT) {
|
|
2237
|
+
if (tail.length !== 1) {
|
|
2238
|
+
throw new Error("[C6C.SUBSELECT] in ".concat(opts.context, " expects [C6C.SUBSELECT, payload]."));
|
|
2239
|
+
}
|
|
2240
|
+
if (!opts.hooks.buildScalarSubSelect) {
|
|
2241
|
+
throw new Error("Scalar subselects in ".concat(opts.context, " require subselect builder support."));
|
|
2242
|
+
}
|
|
2243
|
+
var params = ensureParams(opts);
|
|
2244
|
+
var subSql = opts.hooks.buildScalarSubSelect(tail[0], params);
|
|
2245
|
+
return {
|
|
2246
|
+
sql: subSql,
|
|
2247
|
+
isReference: false,
|
|
2248
|
+
isExpression: true,
|
|
2249
|
+
isSubSelect: true,
|
|
2250
|
+
};
|
|
2251
|
+
}
|
|
2252
|
+
if (token === C6C.CALL) {
|
|
2253
|
+
var fnNameRaw = tail[0], args = tail.slice(1);
|
|
2254
|
+
var fnName = validateFunctionName(fnNameRaw, opts.context);
|
|
2255
|
+
var sqlArgs_1 = serializeFunctionArgs(args, opts);
|
|
2256
|
+
return {
|
|
2257
|
+
sql: "".concat(fnName, "(").concat(sqlArgs_1, ")"),
|
|
2258
|
+
isReference: false,
|
|
2259
|
+
isExpression: true,
|
|
2260
|
+
isSubSelect: false,
|
|
2261
|
+
};
|
|
2262
|
+
}
|
|
2263
|
+
if (tail.length >= 2 && String(tail[tail.length - 2]).toUpperCase() === C6C.AS) {
|
|
2264
|
+
throw new Error("Legacy positional AS syntax is not supported in ".concat(opts.context, ". Use [C6C.AS, expression, alias]."));
|
|
2265
|
+
}
|
|
2266
|
+
if (opts.hooks.isKnownFunction && !opts.hooks.isKnownFunction(head)) {
|
|
2267
|
+
throw new Error("Unknown SQL function '".concat(head, "' in ").concat(opts.context, ". Use [C6C.CALL, 'FUNCTION_NAME', ...args] for custom functions."));
|
|
2268
|
+
}
|
|
2269
|
+
var sqlArgs = serializeFunctionArgs(tail, opts);
|
|
2270
|
+
return {
|
|
2271
|
+
sql: "".concat(token, "(").concat(sqlArgs, ")"),
|
|
2272
|
+
isReference: false,
|
|
2273
|
+
isExpression: true,
|
|
2274
|
+
isSubSelect: false,
|
|
2275
|
+
};
|
|
2276
|
+
}
|
|
2277
|
+
if (typeof value === 'string') {
|
|
2278
|
+
return serializeStringReference(value, opts);
|
|
2279
|
+
}
|
|
2280
|
+
if (value && typeof value === 'object') {
|
|
2281
|
+
throw new Error("Object-rooted expressions are not supported in ".concat(opts.context, ". Use tuple syntax instead."));
|
|
2282
|
+
}
|
|
2283
|
+
return serializeLiteralValue(value, opts);
|
|
2284
|
+
};
|
|
1810
2285
|
|
|
2286
|
+
var KNOWN_FUNCTION_LOOKUP = new Set(SQL_KNOWN_FUNCTIONS.map(function (name) { return String(name).toUpperCase(); }));
|
|
1811
2287
|
var AggregateBuilder = /** @class */ (function (_super) {
|
|
1812
2288
|
tslib.__extends(AggregateBuilder, _super);
|
|
1813
2289
|
function AggregateBuilder() {
|
|
@@ -1820,112 +2296,71 @@ var AggregateBuilder = /** @class */ (function (_super) {
|
|
|
1820
2296
|
AggregateBuilder.prototype.assertValidIdentifier = function (_identifier, _context) {
|
|
1821
2297
|
// no-op placeholder for subclasses that do not implement alias validation
|
|
1822
2298
|
};
|
|
1823
|
-
AggregateBuilder.prototype.
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
return
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
// function call like [FN, ...args], serialize the list as a comma-separated
|
|
1835
|
-
// literal sequence so parent calls (like ORDER BY FN(<here>)) can embed it.
|
|
1836
|
-
var isNumericString = function (s) { return /^-?\d+(?:\.\d+)?$/.test(String(s).trim()); };
|
|
1837
|
-
if (typeof field[0] !== 'string' || isNumericString(field[0])) {
|
|
1838
|
-
return field
|
|
1839
|
-
.map(function (arg) {
|
|
1840
|
-
if (Array.isArray(arg))
|
|
1841
|
-
return _this.buildAggregateField(arg, params);
|
|
1842
|
-
return String(arg);
|
|
1843
|
-
})
|
|
1844
|
-
.join(', ');
|
|
1845
|
-
}
|
|
1846
|
-
var fn = field[0], args = field.slice(1);
|
|
1847
|
-
var alias;
|
|
1848
|
-
if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
|
|
1849
|
-
alias = String(args.pop());
|
|
1850
|
-
args.pop();
|
|
1851
|
-
}
|
|
1852
|
-
var F = String(fn).toUpperCase();
|
|
1853
|
-
var isGeomFromText = F === C6C.ST_GEOMFROMTEXT.toUpperCase();
|
|
1854
|
-
if (args.length === 1 && Array.isArray(args[0])) {
|
|
1855
|
-
args = args[0];
|
|
1856
|
-
}
|
|
1857
|
-
// Parameter placeholder helper: [C6C.PARAM, value]
|
|
1858
|
-
if (F === C6C.PARAM) {
|
|
1859
|
-
if (!params) {
|
|
1860
|
-
throw new Error('PARAM requires parameter tracking.');
|
|
1861
|
-
}
|
|
1862
|
-
var value = args[0];
|
|
1863
|
-
// Use empty column context; ORDER/SELECT literals have no column typing.
|
|
1864
|
-
// @ts-ignore addParam is provided by ConditionBuilder in our hierarchy.
|
|
1865
|
-
return this.addParam(params, '', value);
|
|
1866
|
-
}
|
|
1867
|
-
if (F === C6C.SUBSELECT) {
|
|
1868
|
-
if (!params) {
|
|
1869
|
-
throw new Error('Scalar subselects in SELECT require parameter tracking.');
|
|
1870
|
-
}
|
|
1871
|
-
var subRequest = args[0];
|
|
1872
|
-
var subSql = (_b = (_a = this).buildScalarSubSelect) === null || _b === void 0 ? void 0 : _b.call(_a, subRequest, params);
|
|
1873
|
-
if (!subSql) {
|
|
1874
|
-
throw new Error('Failed to build scalar subselect.');
|
|
1875
|
-
}
|
|
1876
|
-
var expr_1 = subSql;
|
|
1877
|
-
if (alias) {
|
|
1878
|
-
this.selectAliases.add(alias);
|
|
1879
|
-
expr_1 += " AS ".concat(alias);
|
|
1880
|
-
}
|
|
1881
|
-
logWithLevel(exports.LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(expr_1));
|
|
1882
|
-
return expr_1;
|
|
1883
|
-
}
|
|
1884
|
-
var identifierPathRegex = /^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/;
|
|
1885
|
-
var argList = args
|
|
1886
|
-
.map(function (arg, index) {
|
|
1887
|
-
if (Array.isArray(arg))
|
|
1888
|
-
return _this.buildAggregateField(arg, params);
|
|
1889
|
-
if (typeof arg === 'string') {
|
|
1890
|
-
if (identifierPathRegex.test(arg)) {
|
|
1891
|
-
_this.assertValidIdentifier(arg, 'SELECT expression');
|
|
1892
|
-
return arg;
|
|
1893
|
-
}
|
|
1894
|
-
// Treat numeric-looking strings as literals, not identifier paths
|
|
1895
|
-
if (isNumericString(arg))
|
|
1896
|
-
return arg;
|
|
1897
|
-
if (isGeomFromText && index === 0) {
|
|
1898
|
-
var trimmed = arg.trim();
|
|
1899
|
-
var alreadyQuoted = trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2;
|
|
1900
|
-
if (alreadyQuoted) {
|
|
1901
|
-
return trimmed;
|
|
1902
|
-
}
|
|
1903
|
-
var escaped = arg.replace(/'/g, "''");
|
|
1904
|
-
return "'".concat(escaped, "'");
|
|
1905
|
-
}
|
|
1906
|
-
return arg;
|
|
1907
|
-
}
|
|
1908
|
-
return String(arg);
|
|
1909
|
-
})
|
|
1910
|
-
.join(', ');
|
|
1911
|
-
var expr;
|
|
1912
|
-
if (F === 'DISTINCT') {
|
|
1913
|
-
expr = "DISTINCT ".concat(argList);
|
|
2299
|
+
AggregateBuilder.prototype.isReferenceExpression = function (value) {
|
|
2300
|
+
if (typeof value !== 'string')
|
|
2301
|
+
return false;
|
|
2302
|
+
var trimmed = value.trim();
|
|
2303
|
+
if (trimmed.length === 0)
|
|
2304
|
+
return false;
|
|
2305
|
+
if (trimmed === '*')
|
|
2306
|
+
return true;
|
|
2307
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.\*$/.test(trimmed)) {
|
|
2308
|
+
this.assertValidIdentifier(trimmed, 'SQL reference');
|
|
2309
|
+
return true;
|
|
1914
2310
|
}
|
|
1915
|
-
|
|
1916
|
-
|
|
2311
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed)) {
|
|
2312
|
+
this.assertValidIdentifier(trimmed, 'SQL reference');
|
|
2313
|
+
return true;
|
|
1917
2314
|
}
|
|
1918
|
-
if (
|
|
1919
|
-
|
|
1920
|
-
expr += " AS ".concat(alias);
|
|
2315
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed) && this.selectAliases.has(trimmed)) {
|
|
2316
|
+
return true;
|
|
1921
2317
|
}
|
|
1922
|
-
|
|
1923
|
-
|
|
2318
|
+
return false;
|
|
2319
|
+
};
|
|
2320
|
+
AggregateBuilder.prototype.isKnownFunction = function (functionName) {
|
|
2321
|
+
return KNOWN_FUNCTION_LOOKUP.has(functionName.trim().toUpperCase());
|
|
2322
|
+
};
|
|
2323
|
+
AggregateBuilder.prototype.serializeExpression = function (expression, params, context, contextColumn) {
|
|
2324
|
+
var _this = this;
|
|
2325
|
+
if (context === void 0) { context = 'SQL expression'; }
|
|
2326
|
+
return serializeSqlExpression(expression, {
|
|
2327
|
+
params: params,
|
|
2328
|
+
context: context,
|
|
2329
|
+
contextColumn: contextColumn,
|
|
2330
|
+
hooks: {
|
|
2331
|
+
assertValidIdentifier: function (identifier, hookContext) {
|
|
2332
|
+
_this.assertValidIdentifier(identifier, hookContext);
|
|
2333
|
+
},
|
|
2334
|
+
isReference: function (value) { return _this.isReferenceExpression(value); },
|
|
2335
|
+
addParam: function (target, column, value) {
|
|
2336
|
+
var addParam = _this.addParam;
|
|
2337
|
+
if (typeof addParam !== 'function') {
|
|
2338
|
+
throw new Error('Expression literal binding requires addParam support.');
|
|
2339
|
+
}
|
|
2340
|
+
return addParam.call(_this, target, column, value);
|
|
2341
|
+
},
|
|
2342
|
+
buildScalarSubSelect: function (subRequest, target) {
|
|
2343
|
+
var builder = _this.buildScalarSubSelect;
|
|
2344
|
+
if (typeof builder !== 'function') {
|
|
2345
|
+
throw new Error('Scalar subselects require SelectQueryBuilder context.');
|
|
2346
|
+
}
|
|
2347
|
+
return builder.call(_this, subRequest, target);
|
|
2348
|
+
},
|
|
2349
|
+
onAlias: function (alias) {
|
|
2350
|
+
_this.selectAliases.add(alias);
|
|
2351
|
+
},
|
|
2352
|
+
isKnownFunction: function (functionName) { return _this.isKnownFunction(functionName); },
|
|
2353
|
+
},
|
|
2354
|
+
});
|
|
2355
|
+
};
|
|
2356
|
+
AggregateBuilder.prototype.buildAggregateField = function (field, params) {
|
|
2357
|
+
var serialized = this.serializeExpression(field, params, 'SELECT expression');
|
|
2358
|
+
logWithLevel(exports.LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(serialized.sql));
|
|
2359
|
+
return serialized.sql;
|
|
1924
2360
|
};
|
|
1925
2361
|
return AggregateBuilder;
|
|
1926
2362
|
}(Executor));
|
|
1927
2363
|
|
|
1928
|
-
// Alias a table name with a given alias
|
|
1929
2364
|
var DERIVED_TABLE_PREFIX = '__c6DerivedTable__';
|
|
1930
2365
|
var DERIVED_ID_SYMBOL = Symbol('c6DerivedTableId');
|
|
1931
2366
|
var derivedTableLookup = new Map();
|
|
@@ -2003,6 +2438,29 @@ var bbox = function (minLng, minLat, maxLng, maxLat) {
|
|
|
2003
2438
|
var stContains = function (envelope, shape) {
|
|
2004
2439
|
return [C6C.ST_CONTAINS, envelope, shape];
|
|
2005
2440
|
};
|
|
2441
|
+
// Strongly-typed known function helper.
|
|
2442
|
+
var fn = function (functionName) {
|
|
2443
|
+
var args = [];
|
|
2444
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
2445
|
+
args[_i - 1] = arguments[_i];
|
|
2446
|
+
}
|
|
2447
|
+
return tslib.__spreadArray([functionName], args, true);
|
|
2448
|
+
};
|
|
2449
|
+
// Escape hatch for custom function names.
|
|
2450
|
+
var call = function (functionName) {
|
|
2451
|
+
var args = [];
|
|
2452
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
2453
|
+
args[_i - 1] = arguments[_i];
|
|
2454
|
+
}
|
|
2455
|
+
return tslib.__spreadArray([C6C.CALL, functionName], args, true);
|
|
2456
|
+
};
|
|
2457
|
+
var alias = function (expression, aliasName) { return [C6C.AS, expression, aliasName]; };
|
|
2458
|
+
var distinct = function (expression) { return [C6C.DISTINCT, expression]; };
|
|
2459
|
+
var lit = function (value) { return [C6C.LIT, value]; };
|
|
2460
|
+
var order = function (expression, direction) {
|
|
2461
|
+
if (direction === void 0) { direction = C6C.ASC; }
|
|
2462
|
+
return [expression, direction];
|
|
2463
|
+
};
|
|
2006
2464
|
|
|
2007
2465
|
var ConditionBuilder = /** @class */ (function (_super) {
|
|
2008
2466
|
tslib.__extends(ConditionBuilder, _super);
|
|
@@ -2109,6 +2567,26 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2109
2567
|
return true;
|
|
2110
2568
|
return false;
|
|
2111
2569
|
};
|
|
2570
|
+
ConditionBuilder.prototype.isReferenceExpression = function (value) {
|
|
2571
|
+
var trimmed = value.trim();
|
|
2572
|
+
if (trimmed === '*') {
|
|
2573
|
+
return true;
|
|
2574
|
+
}
|
|
2575
|
+
if (trimmed.includes('.')) {
|
|
2576
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.\*$/.test(trimmed)) {
|
|
2577
|
+
return true;
|
|
2578
|
+
}
|
|
2579
|
+
if (this.isTableReference(trimmed) || this.isColumnRef(trimmed)) {
|
|
2580
|
+
return true;
|
|
2581
|
+
}
|
|
2582
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed)) {
|
|
2583
|
+
this.assertValidIdentifier(trimmed, 'SQL reference');
|
|
2584
|
+
return true;
|
|
2585
|
+
}
|
|
2586
|
+
return false;
|
|
2587
|
+
}
|
|
2588
|
+
return _super.prototype.isReferenceExpression.call(this, trimmed);
|
|
2589
|
+
};
|
|
2112
2590
|
ConditionBuilder.prototype.execute = function () {
|
|
2113
2591
|
throw new Error("Method not implemented.");
|
|
2114
2592
|
};
|
|
@@ -2138,16 +2616,8 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2138
2616
|
Object.values(table.COLUMNS).includes(column));
|
|
2139
2617
|
};
|
|
2140
2618
|
ConditionBuilder.prototype.addParam = function (params, column, value) {
|
|
2141
|
-
var
|
|
2142
|
-
|
|
2143
|
-
var columnDef;
|
|
2144
|
-
if (typeof column === 'string' && column.includes('.')) {
|
|
2145
|
-
var _f = column.split('.', 2), tableName = _f[0], colName = _f[1];
|
|
2146
|
-
var table = (_b = (_a = this.config.C6) === null || _a === void 0 ? void 0 : _a.TABLES) === null || _b === void 0 ? void 0 : _b[tableName];
|
|
2147
|
-
// Support both short-keyed and fully-qualified TYPE_VALIDATION entries
|
|
2148
|
-
columnDef = (_d = (_c = table === null || table === void 0 ? void 0 : table.TYPE_VALIDATION) === null || _c === void 0 ? void 0 : _c[colName]) !== null && _d !== void 0 ? _d : (_e = table === null || table === void 0 ? void 0 : table.TYPE_VALIDATION) === null || _e === void 0 ? void 0 : _e["".concat(tableName, ".").concat(colName)];
|
|
2149
|
-
}
|
|
2150
|
-
var val = convertHexIfBinary(column, value, columnDef);
|
|
2619
|
+
var columnDef = this.resolveColumnDefinition(column);
|
|
2620
|
+
var val = convertSqlValueForColumn(column, value, columnDef);
|
|
2151
2621
|
if (this.useNamedParams) {
|
|
2152
2622
|
var key = "param".concat(Object.keys(params).length);
|
|
2153
2623
|
params[key] = val;
|
|
@@ -2183,41 +2653,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2183
2653
|
ConditionBuilder.prototype.isOperator = function (op) {
|
|
2184
2654
|
return !!this.normalizeOperatorKey(op);
|
|
2185
2655
|
};
|
|
2186
|
-
ConditionBuilder.prototype.looksLikeSafeFunctionExpression = function (value) {
|
|
2187
|
-
if (typeof value !== 'string')
|
|
2188
|
-
return false;
|
|
2189
|
-
var trimmed = value.trim();
|
|
2190
|
-
if (trimmed.length === 0)
|
|
2191
|
-
return false;
|
|
2192
|
-
if (trimmed.includes(';') || trimmed.includes('--') || trimmed.includes('/*') || trimmed.includes('*/')) {
|
|
2193
|
-
return false;
|
|
2194
|
-
}
|
|
2195
|
-
if (!trimmed.includes('(') || !trimmed.endsWith(')')) {
|
|
2196
|
-
return false;
|
|
2197
|
-
}
|
|
2198
|
-
var functionMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)\s*\(/);
|
|
2199
|
-
if (!functionMatch) {
|
|
2200
|
-
return false;
|
|
2201
|
-
}
|
|
2202
|
-
var allowedCharacters = /^[A-Za-z0-9_().,'"\s-]+$/;
|
|
2203
|
-
if (!allowedCharacters.test(trimmed)) {
|
|
2204
|
-
return false;
|
|
2205
|
-
}
|
|
2206
|
-
var depth = 0;
|
|
2207
|
-
for (var _i = 0, trimmed_1 = trimmed; _i < trimmed_1.length; _i++) {
|
|
2208
|
-
var char = trimmed_1[_i];
|
|
2209
|
-
if (char === '(') {
|
|
2210
|
-
depth += 1;
|
|
2211
|
-
}
|
|
2212
|
-
else if (char === ')') {
|
|
2213
|
-
depth -= 1;
|
|
2214
|
-
if (depth < 0) {
|
|
2215
|
-
return false;
|
|
2216
|
-
}
|
|
2217
|
-
}
|
|
2218
|
-
}
|
|
2219
|
-
return depth === 0;
|
|
2220
|
-
};
|
|
2221
2656
|
ConditionBuilder.prototype.ensureWrapped = function (expression) {
|
|
2222
2657
|
var trimmed = expression.trim();
|
|
2223
2658
|
if (!trimmed)
|
|
@@ -2245,42 +2680,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2245
2680
|
})
|
|
2246
2681
|
.join(" ".concat(operator, " "));
|
|
2247
2682
|
};
|
|
2248
|
-
ConditionBuilder.prototype.normalizeFunctionField = function (field, params) {
|
|
2249
|
-
var _this = this;
|
|
2250
|
-
if (field instanceof Map) {
|
|
2251
|
-
field = Object.fromEntries(field);
|
|
2252
|
-
}
|
|
2253
|
-
if (Array.isArray(field)) {
|
|
2254
|
-
if (field.length === 0)
|
|
2255
|
-
return field;
|
|
2256
|
-
var fn = field[0], args = field.slice(1);
|
|
2257
|
-
var normalizedArgs = args.map(function (arg) { return _this.normalizeFunctionField(arg, params); });
|
|
2258
|
-
return tslib.__spreadArray([fn], normalizedArgs, true);
|
|
2259
|
-
}
|
|
2260
|
-
if (field && typeof field === 'object') {
|
|
2261
|
-
if (C6C.SUBSELECT in field) {
|
|
2262
|
-
var builder = this.buildScalarSubSelect;
|
|
2263
|
-
if (typeof builder !== 'function') {
|
|
2264
|
-
throw new Error('Scalar subselect handling requires JoinBuilder context.');
|
|
2265
|
-
}
|
|
2266
|
-
return builder.call(this, field[C6C.SUBSELECT], params);
|
|
2267
|
-
}
|
|
2268
|
-
var entries = Object.entries(field);
|
|
2269
|
-
if (entries.length === 1) {
|
|
2270
|
-
var _a = entries[0], key = _a[0], value = _a[1];
|
|
2271
|
-
if (this.isOperator(key)) {
|
|
2272
|
-
return this.buildOperatorExpression(key, value, params);
|
|
2273
|
-
}
|
|
2274
|
-
return this.buildFunctionCall(key, value, params);
|
|
2275
|
-
}
|
|
2276
|
-
}
|
|
2277
|
-
return field;
|
|
2278
|
-
};
|
|
2279
|
-
ConditionBuilder.prototype.buildFunctionCall = function (fn, value, params) {
|
|
2280
|
-
var args = Array.isArray(value) ? value : [value];
|
|
2281
|
-
var normalized = this.normalizeFunctionField(tslib.__spreadArray([fn], args, true), params);
|
|
2282
|
-
return this.buildAggregateField(normalized, params);
|
|
2283
|
-
};
|
|
2284
2683
|
ConditionBuilder.prototype.serializeOperand = function (operand, params, contextColumn) {
|
|
2285
2684
|
var _a;
|
|
2286
2685
|
var _this = this;
|
|
@@ -2295,18 +2694,14 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2295
2694
|
return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
|
|
2296
2695
|
}
|
|
2297
2696
|
if (typeof operand === 'string') {
|
|
2298
|
-
|
|
2299
|
-
|
|
2697
|
+
var trimmed = operand.trim();
|
|
2698
|
+
if (this.isReferenceExpression(trimmed) || this.isTableReference(trimmed) || this.isColumnRef(trimmed)) {
|
|
2699
|
+
return { sql: trimmed, isReference: true, isExpression: false, isSubSelect: false };
|
|
2300
2700
|
}
|
|
2301
|
-
|
|
2302
|
-
return { sql: operand.trim(), isReference: false, isExpression: true, isSubSelect: false };
|
|
2303
|
-
}
|
|
2304
|
-
return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
|
|
2701
|
+
throw new Error("Bare string '".concat(operand, "' is not a reference. Wrap literal strings with [C6C.LIT, value]."));
|
|
2305
2702
|
}
|
|
2306
2703
|
if (Array.isArray(operand)) {
|
|
2307
|
-
|
|
2308
|
-
var sql = this.buildAggregateField(normalized, params);
|
|
2309
|
-
return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
|
|
2704
|
+
return this.serializeExpression(operand, params, 'SQL expression', contextColumn);
|
|
2310
2705
|
}
|
|
2311
2706
|
if (operand instanceof Map) {
|
|
2312
2707
|
operand = Object.fromEntries(operand);
|
|
@@ -2324,24 +2719,38 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2324
2719
|
if (entries.length === 1) {
|
|
2325
2720
|
var _b = entries[0], key = _b[0], value = _b[1];
|
|
2326
2721
|
if (this.isOperator(key)) {
|
|
2327
|
-
var
|
|
2328
|
-
return { sql: this.ensureWrapped(
|
|
2722
|
+
var sql = this.buildOperatorExpression(key, value, params);
|
|
2723
|
+
return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
|
|
2329
2724
|
}
|
|
2330
2725
|
if (this.BOOLEAN_OPERATORS.has(key)) {
|
|
2331
|
-
var
|
|
2332
|
-
return { sql: this.ensureWrapped(
|
|
2726
|
+
var sql = this.buildBooleanExpression((_a = {}, _a[key] = value, _a), params, 'AND');
|
|
2727
|
+
return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
|
|
2333
2728
|
}
|
|
2334
|
-
|
|
2335
|
-
return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
|
|
2729
|
+
throw new Error('Object-rooted expressions are not supported. Use tuple syntax instead.');
|
|
2336
2730
|
}
|
|
2337
2731
|
}
|
|
2338
2732
|
throw new Error('Unsupported operand type in SQL expression.');
|
|
2339
2733
|
};
|
|
2734
|
+
ConditionBuilder.prototype.isExpressionTuple = function (value) {
|
|
2735
|
+
if (!Array.isArray(value) || value.length === 0 || typeof value[0] !== 'string') {
|
|
2736
|
+
return false;
|
|
2737
|
+
}
|
|
2738
|
+
var token = String(value[0]).toUpperCase();
|
|
2739
|
+
return (token === C6C.AS
|
|
2740
|
+
|| token === C6C.DISTINCT
|
|
2741
|
+
|| token === C6C.CALL
|
|
2742
|
+
|| token === C6C.LIT
|
|
2743
|
+
|| token === C6C.PARAM
|
|
2744
|
+
|| token === C6C.SUBSELECT
|
|
2745
|
+
|| this.isKnownFunction(value[0]));
|
|
2746
|
+
};
|
|
2340
2747
|
ConditionBuilder.prototype.isPlainArrayLiteral = function (value, allowColumnRefs) {
|
|
2341
2748
|
var _this = this;
|
|
2342
2749
|
if (allowColumnRefs === void 0) { allowColumnRefs = false; }
|
|
2343
2750
|
if (!Array.isArray(value))
|
|
2344
2751
|
return false;
|
|
2752
|
+
if (this.isExpressionTuple(value))
|
|
2753
|
+
return false;
|
|
2345
2754
|
return value.every(function (item) {
|
|
2346
2755
|
if (item === null)
|
|
2347
2756
|
return true;
|
|
@@ -2411,6 +2820,16 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2411
2820
|
|| this.isPlainObjectLiteral(normalized, allowColumnRefs)) {
|
|
2412
2821
|
return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', JSON.stringify(normalized));
|
|
2413
2822
|
}
|
|
2823
|
+
if (normalized === C6C.NULL
|
|
2824
|
+
|| normalized === null
|
|
2825
|
+
|| typeof normalized === 'string'
|
|
2826
|
+
|| typeof normalized === 'number'
|
|
2827
|
+
|| typeof normalized === 'boolean'
|
|
2828
|
+
|| normalized instanceof Date
|
|
2829
|
+
|| (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(normalized))) {
|
|
2830
|
+
var scalar = normalized === C6C.NULL ? null : normalized;
|
|
2831
|
+
return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', scalar);
|
|
2832
|
+
}
|
|
2414
2833
|
var sql;
|
|
2415
2834
|
var isReference;
|
|
2416
2835
|
var isExpression;
|
|
@@ -2494,7 +2913,10 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2494
2913
|
}
|
|
2495
2914
|
var payload = this.ensurePlainObject(payloadRaw);
|
|
2496
2915
|
var subSelect;
|
|
2497
|
-
if (payload &&
|
|
2916
|
+
if (Array.isArray(payload) && payload.length === 2 && String(payload[0]).toUpperCase() === C6C.SUBSELECT) {
|
|
2917
|
+
subSelect = this.ensurePlainObject(payload[1]);
|
|
2918
|
+
}
|
|
2919
|
+
else if (payload && typeof payload === 'object' && C6C.SUBSELECT in payload) {
|
|
2498
2920
|
subSelect = this.ensurePlainObject(payload[C6C.SUBSELECT]);
|
|
2499
2921
|
}
|
|
2500
2922
|
else if (payload && typeof payload === 'object') {
|
|
@@ -2588,7 +3010,11 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2588
3010
|
throw new Error('MATCH_AGAINST expects an array [search, mode?].');
|
|
2589
3011
|
}
|
|
2590
3012
|
var search = right[0], mode = right[1];
|
|
2591
|
-
var
|
|
3013
|
+
var searchInfo = this.serializeOperand(search, params, leftInfo_1.sql);
|
|
3014
|
+
if (searchInfo.isReference || searchInfo.isExpression || searchInfo.isSubSelect) {
|
|
3015
|
+
throw new Error('MATCH_AGAINST search payload must be a literal value (wrap strings with [C6C.LIT, value]).');
|
|
3016
|
+
}
|
|
3017
|
+
var placeholder = searchInfo.sql;
|
|
2592
3018
|
var againstClause = void 0;
|
|
2593
3019
|
switch (typeof mode === 'string' ? mode.toUpperCase() : '') {
|
|
2594
3020
|
case 'BOOLEAN':
|
|
@@ -2690,7 +3116,7 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2690
3116
|
if (!Array.isArray(value)) {
|
|
2691
3117
|
throw new Error("".concat(column, " expects an array of arguments."));
|
|
2692
3118
|
}
|
|
2693
|
-
return this.
|
|
3119
|
+
return this.serializeExpression(tslib.__spreadArray([column], value, true), params, "WHERE function ".concat(column), column).sql;
|
|
2694
3120
|
}
|
|
2695
3121
|
}
|
|
2696
3122
|
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
|
|
@@ -3133,56 +3559,34 @@ var PaginationBuilder = /** @class */ (function (_super) {
|
|
|
3133
3559
|
*
|
|
3134
3560
|
* Accepted structures:
|
|
3135
3561
|
* ```ts
|
|
3136
|
-
* ORDER:
|
|
3137
|
-
*
|
|
3138
|
-
* [property_units.
|
|
3139
|
-
*
|
|
3140
|
-
* [C6Constants.ST_DISTANCE_SPHERE]: [property_units.LOCATION, F(property_units.LOCATION, "pu_target")]
|
|
3141
|
-
* }
|
|
3562
|
+
* ORDER: [
|
|
3563
|
+
* [property_units.UNIT_ID, "DESC"],
|
|
3564
|
+
* [[C6Constants.ST_DISTANCE_SPHERE, property_units.LOCATION, F(property_units.LOCATION, "pu_target")], "ASC"],
|
|
3565
|
+
* ]
|
|
3142
3566
|
* ```
|
|
3143
3567
|
*/
|
|
3144
3568
|
PaginationBuilder.prototype.buildPaginationClause = function (pagination, params) {
|
|
3145
|
-
var _this = this;
|
|
3146
3569
|
var sql = "";
|
|
3147
3570
|
/* -------- ORDER BY -------- */
|
|
3148
3571
|
if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
|
|
3149
3572
|
var orderParts = [];
|
|
3150
|
-
var
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
_this.assertValidIdentifier(arg, 'ORDER BY argument');
|
|
3165
|
-
return arg;
|
|
3166
|
-
}
|
|
3167
|
-
// numeric-looking strings should be treated as literals
|
|
3168
|
-
if (isNumericString_1(arg))
|
|
3169
|
-
return arg;
|
|
3170
|
-
return arg;
|
|
3171
|
-
}
|
|
3172
|
-
return String(arg);
|
|
3173
|
-
})
|
|
3174
|
-
.join(", ");
|
|
3175
|
-
orderParts.push("".concat(key, "(").concat(args, ")"));
|
|
3176
|
-
}
|
|
3177
|
-
// SIMPLE COLUMN + DIR (ASC/DESC)
|
|
3178
|
-
else {
|
|
3179
|
-
orderParts.push("".concat(key, " ").concat(String(val).toUpperCase()));
|
|
3573
|
+
var orderSpec = pagination[C6Constants.ORDER];
|
|
3574
|
+
if (!Array.isArray(orderSpec)) {
|
|
3575
|
+
throw new Error('PAGINATION.ORDER expects an array of terms using [expression, direction?] syntax.');
|
|
3576
|
+
}
|
|
3577
|
+
for (var _i = 0, orderSpec_1 = orderSpec; _i < orderSpec_1.length; _i++) {
|
|
3578
|
+
var rawTerm = orderSpec_1[_i];
|
|
3579
|
+
var expression = rawTerm;
|
|
3580
|
+
var direction = C6Constants.ASC;
|
|
3581
|
+
if (Array.isArray(rawTerm)
|
|
3582
|
+
&& rawTerm.length === 2
|
|
3583
|
+
&& typeof rawTerm[1] === 'string'
|
|
3584
|
+
&& (String(rawTerm[1]).toUpperCase() === C6Constants.ASC || String(rawTerm[1]).toUpperCase() === C6Constants.DESC)) {
|
|
3585
|
+
expression = rawTerm[0];
|
|
3586
|
+
direction = String(rawTerm[1]).toUpperCase();
|
|
3180
3587
|
}
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
for (var _i = 0, _a = Object.entries(pagination[C6Constants.ORDER]); _i < _a.length; _i++) {
|
|
3184
|
-
var _b = _a[_i], key = _b[0], val = _b[1];
|
|
3185
|
-
_loop_1(key, val);
|
|
3588
|
+
var serialized = this.serializeExpression(expression, params, 'ORDER BY expression');
|
|
3589
|
+
orderParts.push("".concat(serialized.sql, " ").concat(direction));
|
|
3186
3590
|
}
|
|
3187
3591
|
if (orderParts.length)
|
|
3188
3592
|
sql += " ORDER BY ".concat(orderParts.join(", "));
|
|
@@ -3472,7 +3876,7 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3472
3876
|
throw new Error("Singular request requires all primary key(s) [".concat(pkShorts.join(', '), "] for table (").concat(restModel.TABLE_NAME, "). Missing: [").concat(missing.join(', '), "]"));
|
|
3473
3877
|
}
|
|
3474
3878
|
// Strip API metadata that should remain at root
|
|
3475
|
-
var _d = request, dataInsertMultipleRows = _d.dataInsertMultipleRows, cacheResults = _d.cacheResults, fetchDependencies = _d.fetchDependencies, debug = _d.debug, success = _d.success, error = _d.error, rest = tslib.__rest(_d, ["dataInsertMultipleRows", "cacheResults", "fetchDependencies", "debug", "success", "error"]);
|
|
3879
|
+
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 = tslib.__rest(_d, ["dataInsertMultipleRows", "cacheResults", "skipReactBootstrap", "fetchDependencies", "debug", "success", "error"]);
|
|
3476
3880
|
// Map short primary keys to fully-qualified column names
|
|
3477
3881
|
var shortToFull = {};
|
|
3478
3882
|
for (var _e = 0, _f = Object.entries(restModel.COLUMNS || {}); _e < _f.length; _e++) {
|
|
@@ -3484,22 +3888,26 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3484
3888
|
var k = _a[0], v = _a[1];
|
|
3485
3889
|
return [(_b = shortToFull[k]) !== null && _b !== void 0 ? _b : k, v];
|
|
3486
3890
|
}));
|
|
3891
|
+
var pkWhereExpressions = Object.fromEntries(Object.entries(pkFullValues).map(function (_a) {
|
|
3892
|
+
var column = _a[0], value = _a[1];
|
|
3893
|
+
return [column, [C6Constants.EQUAL, [C6Constants.LIT, value]]];
|
|
3894
|
+
}));
|
|
3487
3895
|
if (requestMethod === C6Constants.GET) {
|
|
3488
3896
|
var normalized_1 = {
|
|
3489
|
-
WHERE: tslib.__assign({},
|
|
3897
|
+
WHERE: tslib.__assign({}, pkWhereExpressions),
|
|
3490
3898
|
};
|
|
3491
3899
|
// Preserve pagination if any was added previously
|
|
3492
3900
|
if (request[C6Constants.PAGINATION]) {
|
|
3493
3901
|
normalized_1[C6Constants.PAGINATION] = request[C6Constants.PAGINATION];
|
|
3494
3902
|
}
|
|
3495
|
-
return tslib.__assign(tslib.__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3903
|
+
return tslib.__assign(tslib.__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3496
3904
|
}
|
|
3497
3905
|
if (requestMethod === C6Constants.DELETE) {
|
|
3498
3906
|
var normalized_2 = (_a = {},
|
|
3499
3907
|
_a[C6Constants.DELETE] = true,
|
|
3500
|
-
_a.WHERE = tslib.__assign({},
|
|
3908
|
+
_a.WHERE = tslib.__assign({}, pkWhereExpressions),
|
|
3501
3909
|
_a);
|
|
3502
|
-
return tslib.__assign(tslib.__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3910
|
+
return tslib.__assign(tslib.__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3503
3911
|
}
|
|
3504
3912
|
// PUT
|
|
3505
3913
|
var updateBody = {};
|
|
@@ -3518,11 +3926,12 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3518
3926
|
}
|
|
3519
3927
|
var normalized = (_b = {},
|
|
3520
3928
|
_b[C6Constants.UPDATE] = updateBody,
|
|
3521
|
-
_b.WHERE = tslib.__assign({},
|
|
3929
|
+
_b.WHERE = tslib.__assign({}, pkWhereExpressions),
|
|
3522
3930
|
_b);
|
|
3523
|
-
return tslib.__assign(tslib.__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3931
|
+
return tslib.__assign(tslib.__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3524
3932
|
}
|
|
3525
3933
|
|
|
3934
|
+
var DEFAULT_NORMALIZER_CACHE_KEY = "__default__";
|
|
3526
3935
|
var allowListCache = new Map();
|
|
3527
3936
|
var ANSI_ESCAPE_REGEX = /\x1b\[[0-9;]*m/g;
|
|
3528
3937
|
var COLLAPSED_BIND_ROW_REGEX = /\(\?\s*×\d+\)/g;
|
|
@@ -3574,7 +3983,17 @@ var normalizeSql = function (sql) {
|
|
|
3574
3983
|
normalized = normalized.replace(/;\s*$/, "");
|
|
3575
3984
|
return normalized.replace(/\s+/g, " ").trim();
|
|
3576
3985
|
};
|
|
3577
|
-
var
|
|
3986
|
+
var normalizeSqlWith = function (sql, sqlQueryNormalizer) {
|
|
3987
|
+
var normalized = normalizeSql(sql);
|
|
3988
|
+
if (!sqlQueryNormalizer)
|
|
3989
|
+
return normalized;
|
|
3990
|
+
var customized = sqlQueryNormalizer(normalized);
|
|
3991
|
+
if (typeof customized !== "string") {
|
|
3992
|
+
throw new Error("sqlQueryNormalizer must return a string.");
|
|
3993
|
+
}
|
|
3994
|
+
return customized.replace(/\s+/g, " ").trim();
|
|
3995
|
+
};
|
|
3996
|
+
var parseAllowList = function (raw, sourcePath, sqlQueryNormalizer) {
|
|
3578
3997
|
var parsed;
|
|
3579
3998
|
try {
|
|
3580
3999
|
parsed = JSON.parse(raw);
|
|
@@ -3587,59 +4006,63 @@ var parseAllowList = function (raw, sourcePath) {
|
|
|
3587
4006
|
}
|
|
3588
4007
|
var sqlEntries = parsed
|
|
3589
4008
|
.filter(function (entry) { return typeof entry === "string"; })
|
|
3590
|
-
.map(
|
|
4009
|
+
.map(function (entry) { return normalizeSqlWith(entry, sqlQueryNormalizer); })
|
|
3591
4010
|
.filter(function (entry) { return entry.length > 0; });
|
|
3592
4011
|
if (sqlEntries.length !== parsed.length) {
|
|
3593
4012
|
throw new Error("SQL allowlist at ".concat(sourcePath, " must contain only string entries."));
|
|
3594
4013
|
}
|
|
3595
4014
|
return sqlEntries;
|
|
3596
4015
|
};
|
|
3597
|
-
var loadSqlAllowList = function (allowListPath) { return tslib.__awaiter(void 0, void 0, void 0, function () {
|
|
3598
|
-
var _a, readFile, stat, fileStat, cached, raw, sqlEntries, allowList;
|
|
3599
|
-
|
|
3600
|
-
|
|
4016
|
+
var loadSqlAllowList = function (allowListPath, sqlQueryNormalizer) { return tslib.__awaiter(void 0, void 0, void 0, function () {
|
|
4017
|
+
var _a, readFile, stat, fileStat, pathCache, cacheKey, cached, raw, sqlEntries, allowList;
|
|
4018
|
+
var _b;
|
|
4019
|
+
return tslib.__generator(this, function (_c) {
|
|
4020
|
+
switch (_c.label) {
|
|
3601
4021
|
case 0:
|
|
3602
4022
|
if (!isNode()) {
|
|
3603
4023
|
throw new Error("SQL allowlist validation requires a Node runtime.");
|
|
3604
4024
|
}
|
|
3605
4025
|
return [4 /*yield*/, import('node:fs/promises')];
|
|
3606
4026
|
case 1:
|
|
3607
|
-
_a =
|
|
3608
|
-
|
|
4027
|
+
_a = _c.sent(), readFile = _a.readFile, stat = _a.stat;
|
|
4028
|
+
_c.label = 2;
|
|
3609
4029
|
case 2:
|
|
3610
|
-
|
|
4030
|
+
_c.trys.push([2, 4, , 5]);
|
|
3611
4031
|
return [4 /*yield*/, stat(allowListPath)];
|
|
3612
4032
|
case 3:
|
|
3613
|
-
fileStat =
|
|
4033
|
+
fileStat = _c.sent();
|
|
3614
4034
|
return [3 /*break*/, 5];
|
|
3615
4035
|
case 4:
|
|
3616
|
-
|
|
4036
|
+
_c.sent();
|
|
3617
4037
|
throw new Error("SQL allowlist file not found at ".concat(allowListPath, "."));
|
|
3618
4038
|
case 5:
|
|
3619
|
-
|
|
4039
|
+
pathCache = (_b = allowListCache.get(allowListPath)) !== null && _b !== void 0 ? _b : new Map();
|
|
4040
|
+
cacheKey = sqlQueryNormalizer !== null && sqlQueryNormalizer !== void 0 ? sqlQueryNormalizer : DEFAULT_NORMALIZER_CACHE_KEY;
|
|
4041
|
+
cached = pathCache.get(cacheKey);
|
|
3620
4042
|
if (cached &&
|
|
3621
4043
|
cached.mtimeMs === fileStat.mtimeMs &&
|
|
3622
4044
|
cached.size === fileStat.size) {
|
|
3623
4045
|
return [2 /*return*/, cached.allowList];
|
|
3624
4046
|
}
|
|
3625
|
-
|
|
4047
|
+
_c.label = 6;
|
|
3626
4048
|
case 6:
|
|
3627
|
-
|
|
4049
|
+
_c.trys.push([6, 8, , 9]);
|
|
3628
4050
|
return [4 /*yield*/, readFile(allowListPath, "utf-8")];
|
|
3629
4051
|
case 7:
|
|
3630
|
-
raw =
|
|
4052
|
+
raw = _c.sent();
|
|
3631
4053
|
return [3 /*break*/, 9];
|
|
3632
4054
|
case 8:
|
|
3633
|
-
|
|
4055
|
+
_c.sent();
|
|
3634
4056
|
throw new Error("SQL allowlist file not found at ".concat(allowListPath, "."));
|
|
3635
4057
|
case 9:
|
|
3636
|
-
sqlEntries = parseAllowList(raw, allowListPath);
|
|
4058
|
+
sqlEntries = parseAllowList(raw, allowListPath, sqlQueryNormalizer);
|
|
3637
4059
|
allowList = new Set(sqlEntries);
|
|
3638
|
-
|
|
4060
|
+
pathCache.set(cacheKey, {
|
|
3639
4061
|
allowList: allowList,
|
|
3640
4062
|
mtimeMs: fileStat.mtimeMs,
|
|
3641
4063
|
size: fileStat.size,
|
|
3642
4064
|
});
|
|
4065
|
+
allowListCache.set(allowListPath, pathCache);
|
|
3643
4066
|
return [2 /*return*/, allowList];
|
|
3644
4067
|
}
|
|
3645
4068
|
});
|
|
@@ -3666,15 +4089,15 @@ var extractSqlEntries = function (payload) {
|
|
|
3666
4089
|
}
|
|
3667
4090
|
return [];
|
|
3668
4091
|
};
|
|
3669
|
-
var collectSqlAllowListEntries = function (payload, entries) {
|
|
4092
|
+
var collectSqlAllowListEntries = function (payload, entries, sqlQueryNormalizer) {
|
|
3670
4093
|
if (entries === void 0) { entries = new Set(); }
|
|
3671
4094
|
var sqlEntries = extractSqlEntries(payload)
|
|
3672
|
-
.map(
|
|
4095
|
+
.map(function (entry) { return normalizeSqlWith(entry, sqlQueryNormalizer); })
|
|
3673
4096
|
.filter(function (entry) { return entry.length > 0; });
|
|
3674
4097
|
sqlEntries.forEach(function (entry) { return entries.add(entry); });
|
|
3675
4098
|
return entries;
|
|
3676
4099
|
};
|
|
3677
|
-
var compileSqlAllowList = function (allowListPath, entries) { return tslib.__awaiter(void 0, void 0, void 0, function () {
|
|
4100
|
+
var compileSqlAllowList = function (allowListPath, entries, sqlQueryNormalizer) { return tslib.__awaiter(void 0, void 0, void 0, function () {
|
|
3678
4101
|
var _a, writeFile, mkdir, path, compiled;
|
|
3679
4102
|
return tslib.__generator(this, function (_b) {
|
|
3680
4103
|
switch (_b.label) {
|
|
@@ -3692,7 +4115,7 @@ var compileSqlAllowList = function (allowListPath, entries) { return tslib.__awa
|
|
|
3692
4115
|
case 3:
|
|
3693
4116
|
_b.sent();
|
|
3694
4117
|
compiled = Array.from(new Set(Array.from(entries)
|
|
3695
|
-
.map(
|
|
4118
|
+
.map(function (entry) { return normalizeSqlWith(entry, sqlQueryNormalizer); })
|
|
3696
4119
|
.filter(function (entry) { return entry.length > 0; }))).sort();
|
|
3697
4120
|
return [4 /*yield*/, writeFile(allowListPath, JSON.stringify(compiled, null, 2))];
|
|
3698
4121
|
case 4:
|
|
@@ -4068,6 +4491,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4068
4491
|
C6Constants.REPLACE,
|
|
4069
4492
|
"dataInsertMultipleRows",
|
|
4070
4493
|
"cacheResults",
|
|
4494
|
+
"skipReactBootstrap",
|
|
4071
4495
|
"fetchDependencies",
|
|
4072
4496
|
"debug",
|
|
4073
4497
|
"success",
|
|
@@ -4151,9 +4575,10 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4151
4575
|
}
|
|
4152
4576
|
}
|
|
4153
4577
|
if (value !== undefined) {
|
|
4154
|
-
pkValues[pkShort] = value;
|
|
4578
|
+
pkValues[pkShort] = this_1.unwrapPrimaryKeyValue(value);
|
|
4155
4579
|
}
|
|
4156
4580
|
};
|
|
4581
|
+
var this_1 = this;
|
|
4157
4582
|
for (var _i = 0, primaryShorts_1 = primaryShorts; _i < primaryShorts_1.length; _i++) {
|
|
4158
4583
|
var pkShort = primaryShorts_1[_i];
|
|
4159
4584
|
_loop_1(pkShort);
|
|
@@ -4163,6 +4588,26 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4163
4588
|
}
|
|
4164
4589
|
return Object.keys(pkValues).length > 0 ? pkValues : null;
|
|
4165
4590
|
};
|
|
4591
|
+
SqlExecutor.prototype.unwrapPrimaryKeyValue = function (value) {
|
|
4592
|
+
if (!Array.isArray(value))
|
|
4593
|
+
return value;
|
|
4594
|
+
if (value.length === 2) {
|
|
4595
|
+
var head = value[0], tail = value[1];
|
|
4596
|
+
if (head === C6Constants.EQUAL) {
|
|
4597
|
+
return this.unwrapPrimaryKeyValue(tail);
|
|
4598
|
+
}
|
|
4599
|
+
if (head === C6Constants.LIT || head === C6Constants.PARAM) {
|
|
4600
|
+
return tail;
|
|
4601
|
+
}
|
|
4602
|
+
}
|
|
4603
|
+
if (value.length === 3) {
|
|
4604
|
+
var operator = value[1], right = value[2];
|
|
4605
|
+
if (operator === C6Constants.EQUAL) {
|
|
4606
|
+
return this.unwrapPrimaryKeyValue(right);
|
|
4607
|
+
}
|
|
4608
|
+
}
|
|
4609
|
+
return value;
|
|
4610
|
+
};
|
|
4166
4611
|
SqlExecutor.prototype.extractPrimaryKeyValuesFromData = function (data) {
|
|
4167
4612
|
if (!data)
|
|
4168
4613
|
return null;
|
|
@@ -4523,7 +4968,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4523
4968
|
};
|
|
4524
4969
|
SqlExecutor.prototype.validateSqlAllowList = function (sql) {
|
|
4525
4970
|
return tslib.__awaiter(this, void 0, void 0, function () {
|
|
4526
|
-
var allowListPath, allowList, normalized;
|
|
4971
|
+
var allowListPath, sqlQueryNormalizer, allowList, normalized;
|
|
4527
4972
|
var _a;
|
|
4528
4973
|
return tslib.__generator(this, function (_b) {
|
|
4529
4974
|
switch (_b.label) {
|
|
@@ -4532,10 +4977,11 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4532
4977
|
if (!allowListPath) {
|
|
4533
4978
|
return [2 /*return*/, "not verified"];
|
|
4534
4979
|
}
|
|
4535
|
-
|
|
4980
|
+
sqlQueryNormalizer = this.config.sqlQueryNormalizer;
|
|
4981
|
+
return [4 /*yield*/, loadSqlAllowList(allowListPath, sqlQueryNormalizer)];
|
|
4536
4982
|
case 1:
|
|
4537
4983
|
allowList = _b.sent();
|
|
4538
|
-
normalized =
|
|
4984
|
+
normalized = normalizeSqlWith(sql, sqlQueryNormalizer);
|
|
4539
4985
|
if (!allowList.has(normalized)) {
|
|
4540
4986
|
throw createSqlAllowListBlockedError({
|
|
4541
4987
|
tableName: typeof ((_a = this.config.restModel) === null || _a === void 0 ? void 0 : _a.TABLE_NAME) === "string"
|
|
@@ -4800,14 +5246,17 @@ exports.POST = POST;
|
|
|
4800
5246
|
exports.PUT = PUT;
|
|
4801
5247
|
exports.PaginationBuilder = PaginationBuilder;
|
|
4802
5248
|
exports.PostQueryBuilder = PostQueryBuilder;
|
|
5249
|
+
exports.SQL_KNOWN_FUNCTIONS = SQL_KNOWN_FUNCTIONS;
|
|
4803
5250
|
exports.SelectQueryBuilder = SelectQueryBuilder;
|
|
4804
5251
|
exports.SqlExecutor = SqlExecutor;
|
|
4805
5252
|
exports.TestRestfulResponse = TestRestfulResponse;
|
|
4806
5253
|
exports.UpdateQueryBuilder = UpdateQueryBuilder;
|
|
5254
|
+
exports.alias = alias;
|
|
4807
5255
|
exports.apiRequestCache = apiRequestCache;
|
|
4808
5256
|
exports.applyLogLevelDefaults = applyLogLevelDefaults;
|
|
4809
5257
|
exports.axiosInstance = axiosInstance;
|
|
4810
5258
|
exports.bbox = bbox;
|
|
5259
|
+
exports.call = call;
|
|
4811
5260
|
exports.carbonNodeQsStringify = carbonNodeQsStringify;
|
|
4812
5261
|
exports.checkAllRequestsComplete = checkAllRequestsComplete;
|
|
4813
5262
|
exports.checkCache = checkCache;
|
|
@@ -4817,13 +5266,16 @@ exports.colorSql = colorSql;
|
|
|
4817
5266
|
exports.compileSqlAllowList = compileSqlAllowList;
|
|
4818
5267
|
exports.convertForRequestBody = convertForRequestBody;
|
|
4819
5268
|
exports.convertHexIfBinary = convertHexIfBinary;
|
|
5269
|
+
exports.convertSqlValueForColumn = convertSqlValueForColumn;
|
|
4820
5270
|
exports.derivedTable = derivedTable;
|
|
4821
5271
|
exports.determineRuntimeJsType = determineRuntimeJsType;
|
|
4822
5272
|
exports.distSphere = distSphere;
|
|
5273
|
+
exports.distinct = distinct;
|
|
4823
5274
|
exports.error = error;
|
|
4824
5275
|
exports.evictCacheEntry = evictCacheEntry;
|
|
4825
5276
|
exports.extractSqlEntries = extractSqlEntries;
|
|
4826
5277
|
exports.fieldEq = fieldEq;
|
|
5278
|
+
exports.fn = fn;
|
|
4827
5279
|
exports.getEnv = getEnv;
|
|
4828
5280
|
exports.getEnvBool = getEnvBool;
|
|
4829
5281
|
exports.getEnvDebug = getEnvDebug;
|
|
@@ -4837,14 +5289,17 @@ exports.isLocal = isLocal;
|
|
|
4837
5289
|
exports.isNode = isNode;
|
|
4838
5290
|
exports.isTest = isTest;
|
|
4839
5291
|
exports.isVerbose = isVerbose;
|
|
5292
|
+
exports.lit = lit;
|
|
4840
5293
|
exports.loadSqlAllowList = loadSqlAllowList;
|
|
4841
5294
|
exports.logSql = logSql;
|
|
4842
5295
|
exports.logWithLevel = logWithLevel;
|
|
4843
5296
|
exports.normalizeSingularRequest = normalizeSingularRequest;
|
|
4844
5297
|
exports.normalizeSql = normalizeSql;
|
|
5298
|
+
exports.normalizeSqlWith = normalizeSqlWith;
|
|
4845
5299
|
exports.notifyToast = notifyToast;
|
|
4846
5300
|
exports.onError = onError;
|
|
4847
5301
|
exports.onSuccess = onSuccess;
|
|
5302
|
+
exports.order = order;
|
|
4848
5303
|
exports.parseLogLevel = parseLogLevel;
|
|
4849
5304
|
exports.removeInvalidKeys = removeInvalidKeys;
|
|
4850
5305
|
exports.removePrefixIfExists = removePrefixIfExists;
|
|
@@ -4853,6 +5308,7 @@ exports.resolveLogLevel = resolveLogLevel;
|
|
|
4853
5308
|
exports.restExpressRequest = restExpressRequest;
|
|
4854
5309
|
exports.restOrm = restOrm;
|
|
4855
5310
|
exports.restRequest = restRequest;
|
|
5311
|
+
exports.serializeSqlExpression = serializeSqlExpression;
|
|
4856
5312
|
exports.setCache = setCache;
|
|
4857
5313
|
exports.setToastHandler = setToastHandler;
|
|
4858
5314
|
exports.shouldLog = shouldLog;
|