@carbonorm/carbonnode 6.0.20 → 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 +1 -0
- package/dist/index.cjs.js +538 -254
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +531 -255
- 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 +6 -5
- 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__/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.join.json +10 -10
- 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__/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/constants/C6Constants.ts +3 -1
- package/src/executors/HttpExecutor.ts +2 -1
- package/src/executors/SqlExecutor.ts +25 -1
- 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 +6 -7
- 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) {
|
|
@@ -1288,16 +1290,16 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1288
1290
|
}
|
|
1289
1291
|
query = this.request;
|
|
1290
1292
|
apiRequest = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
1291
|
-
var _a, debug, _b, cacheResults, dataInsertMultipleRows, success,
|
|
1292
|
-
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;
|
|
1293
1295
|
var _this = this;
|
|
1294
|
-
var
|
|
1295
|
-
return __generator(this, function (
|
|
1296
|
-
switch (
|
|
1296
|
+
var _g, _h, _j, _k, _l, _m;
|
|
1297
|
+
return __generator(this, function (_o) {
|
|
1298
|
+
switch (_o.label) {
|
|
1297
1299
|
case 0:
|
|
1298
|
-
_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;
|
|
1299
1301
|
if (C6.GET === requestMethod
|
|
1300
|
-
&& undefined !== ((
|
|
1302
|
+
&& undefined !== ((_g = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _g === void 0 ? void 0 : _g[C6.PAGE])
|
|
1301
1303
|
&& 1 !== query[C6.PAGINATION][C6.PAGE]
|
|
1302
1304
|
&& isLocal()
|
|
1303
1305
|
&& shouldLog(LogLevel.DEBUG, logContext)) {
|
|
@@ -1332,7 +1334,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1332
1334
|
if (!cachedRequest) return [3 /*break*/, 2];
|
|
1333
1335
|
return [4 /*yield*/, cachedRequest];
|
|
1334
1336
|
case 1:
|
|
1335
|
-
cachedData = (
|
|
1337
|
+
cachedData = (_o.sent()).data;
|
|
1336
1338
|
if (evictFromCache
|
|
1337
1339
|
&& cachedData
|
|
1338
1340
|
&& typeof cachedData === "object"
|
|
@@ -1354,9 +1356,9 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1354
1356
|
needsConditionOrPrimaryCheck = (PUT === requestMethod || DELETE === requestMethod)
|
|
1355
1357
|
&& false === skipPrimaryCheck;
|
|
1356
1358
|
TABLES = C6.TABLES;
|
|
1357
|
-
primaryKeyList = structuredClone((
|
|
1359
|
+
primaryKeyList = structuredClone((_h = TABLES[operatingTable]) === null || _h === void 0 ? void 0 : _h.PRIMARY);
|
|
1358
1360
|
primaryKeyFullyQualified = primaryKeyList === null || primaryKeyList === void 0 ? void 0 : primaryKeyList.pop();
|
|
1359
|
-
primaryKey = (
|
|
1361
|
+
primaryKey = (_j = primaryKeyFullyQualified === null || primaryKeyFullyQualified === void 0 ? void 0 : primaryKeyFullyQualified.split('.')) === null || _j === void 0 ? void 0 : _j.pop();
|
|
1360
1362
|
if (needsConditionOrPrimaryCheck) {
|
|
1361
1363
|
if (undefined === primaryKey) {
|
|
1362
1364
|
whereVal = query === null || query === void 0 ? void 0 : query[C6.WHERE];
|
|
@@ -1365,7 +1367,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1365
1367
|
(typeof whereVal === 'object' && !Array.isArray(whereVal) && Object.keys(whereVal).length === 0);
|
|
1366
1368
|
if (whereIsEmpty) {
|
|
1367
1369
|
logWithLevel(LogLevel.ERROR, logContext, console.error, query);
|
|
1368
|
-
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 + ').');
|
|
1369
1371
|
}
|
|
1370
1372
|
}
|
|
1371
1373
|
else {
|
|
@@ -1377,7 +1379,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1377
1379
|
}
|
|
1378
1380
|
throw Error('You must provide the primary key (' + primaryKey + ') for table (' + operatingTable + '). Request (' + JSON.stringify(this.request, undefined, 4) + ') Query (' + JSON.stringify(query) + ')');
|
|
1379
1381
|
}
|
|
1380
|
-
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);
|
|
1381
1383
|
if (undefined === providedPrimary || null === providedPrimary) {
|
|
1382
1384
|
notifyToast("error", "The primary key (".concat(primaryKey, ") provided is undefined or null explicitly!!"));
|
|
1383
1385
|
throw Error('The primary key (' + primaryKey + ') provided in the request was exactly equal to undefined.');
|
|
@@ -1391,7 +1393,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1391
1393
|
&& undefined !== query
|
|
1392
1394
|
&& null !== query
|
|
1393
1395
|
&& undefined !== primaryKey) {
|
|
1394
|
-
primaryVal = (
|
|
1396
|
+
primaryVal = (_m = query[primaryKey]) !== null && _m !== void 0 ? _m : (primaryKeyFullyQualified ? query[primaryKeyFullyQualified] : undefined);
|
|
1395
1397
|
if (undefined !== primaryVal) {
|
|
1396
1398
|
restRequestUri += primaryVal + '/';
|
|
1397
1399
|
if (isLocal() && shouldLog(LogLevel.DEBUG, logContext)) {
|
|
@@ -1419,7 +1421,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1419
1421
|
config: this.config,
|
|
1420
1422
|
request: this.request
|
|
1421
1423
|
});
|
|
1422
|
-
axiosActiveRequest_1 = (
|
|
1424
|
+
axiosActiveRequest_1 = (_f = axios)[requestMethod.toLowerCase()].apply(_f, __spreadArray([restRequestUri], (function () {
|
|
1423
1425
|
var convert = function (data) {
|
|
1424
1426
|
return convertForRequestBody(data, fullTableList, C6, function (message) { return notifyToast("error", message, toastOptions); });
|
|
1425
1427
|
};
|
|
@@ -1508,7 +1510,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
1508
1510
|
request: _this.request,
|
|
1509
1511
|
response: response
|
|
1510
1512
|
}); };
|
|
1511
|
-
if (undefined !== reactBootstrap && response) {
|
|
1513
|
+
if (undefined !== reactBootstrap && response && !skipReactBootstrap) {
|
|
1512
1514
|
switch (requestMethod) {
|
|
1513
1515
|
case GET:
|
|
1514
1516
|
response.data && reactBootstrap.updateRestfulObjectArrays({
|
|
@@ -1805,6 +1807,318 @@ function convertHexIfBinary(_col, val, columnDef) {
|
|
|
1805
1807
|
return val;
|
|
1806
1808
|
}
|
|
1807
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(); }));
|
|
1808
2122
|
var AggregateBuilder = /** @class */ (function (_super) {
|
|
1809
2123
|
__extends(AggregateBuilder, _super);
|
|
1810
2124
|
function AggregateBuilder() {
|
|
@@ -1817,112 +2131,71 @@ var AggregateBuilder = /** @class */ (function (_super) {
|
|
|
1817
2131
|
AggregateBuilder.prototype.assertValidIdentifier = function (_identifier, _context) {
|
|
1818
2132
|
// no-op placeholder for subclasses that do not implement alias validation
|
|
1819
2133
|
};
|
|
1820
|
-
AggregateBuilder.prototype.
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
return
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
// function call like [FN, ...args], serialize the list as a comma-separated
|
|
1832
|
-
// literal sequence so parent calls (like ORDER BY FN(<here>)) can embed it.
|
|
1833
|
-
var isNumericString = function (s) { return /^-?\d+(?:\.\d+)?$/.test(String(s).trim()); };
|
|
1834
|
-
if (typeof field[0] !== 'string' || isNumericString(field[0])) {
|
|
1835
|
-
return field
|
|
1836
|
-
.map(function (arg) {
|
|
1837
|
-
if (Array.isArray(arg))
|
|
1838
|
-
return _this.buildAggregateField(arg, params);
|
|
1839
|
-
return String(arg);
|
|
1840
|
-
})
|
|
1841
|
-
.join(', ');
|
|
1842
|
-
}
|
|
1843
|
-
var fn = field[0], args = field.slice(1);
|
|
1844
|
-
var alias;
|
|
1845
|
-
if (args.length >= 2 && String(args[args.length - 2]).toUpperCase() === 'AS') {
|
|
1846
|
-
alias = String(args.pop());
|
|
1847
|
-
args.pop();
|
|
1848
|
-
}
|
|
1849
|
-
var F = String(fn).toUpperCase();
|
|
1850
|
-
var isGeomFromText = F === C6C.ST_GEOMFROMTEXT.toUpperCase();
|
|
1851
|
-
if (args.length === 1 && Array.isArray(args[0])) {
|
|
1852
|
-
args = args[0];
|
|
1853
|
-
}
|
|
1854
|
-
// Parameter placeholder helper: [C6C.PARAM, value]
|
|
1855
|
-
if (F === C6C.PARAM) {
|
|
1856
|
-
if (!params) {
|
|
1857
|
-
throw new Error('PARAM requires parameter tracking.');
|
|
1858
|
-
}
|
|
1859
|
-
var value = args[0];
|
|
1860
|
-
// Use empty column context; ORDER/SELECT literals have no column typing.
|
|
1861
|
-
// @ts-ignore addParam is provided by ConditionBuilder in our hierarchy.
|
|
1862
|
-
return this.addParam(params, '', value);
|
|
1863
|
-
}
|
|
1864
|
-
if (F === C6C.SUBSELECT) {
|
|
1865
|
-
if (!params) {
|
|
1866
|
-
throw new Error('Scalar subselects in SELECT require parameter tracking.');
|
|
1867
|
-
}
|
|
1868
|
-
var subRequest = args[0];
|
|
1869
|
-
var subSql = (_b = (_a = this).buildScalarSubSelect) === null || _b === void 0 ? void 0 : _b.call(_a, subRequest, params);
|
|
1870
|
-
if (!subSql) {
|
|
1871
|
-
throw new Error('Failed to build scalar subselect.');
|
|
1872
|
-
}
|
|
1873
|
-
var expr_1 = subSql;
|
|
1874
|
-
if (alias) {
|
|
1875
|
-
this.selectAliases.add(alias);
|
|
1876
|
-
expr_1 += " AS ".concat(alias);
|
|
1877
|
-
}
|
|
1878
|
-
logWithLevel(LogLevel.DEBUG, getLogContext(this.config, this.request), console.log, "[SELECT] ".concat(expr_1));
|
|
1879
|
-
return expr_1;
|
|
1880
|
-
}
|
|
1881
|
-
var identifierPathRegex = /^[A-Za-z_][A-Za-z0-9_]*\.[A-Za-z_][A-Za-z0-9_]*$/;
|
|
1882
|
-
var argList = args
|
|
1883
|
-
.map(function (arg, index) {
|
|
1884
|
-
if (Array.isArray(arg))
|
|
1885
|
-
return _this.buildAggregateField(arg, params);
|
|
1886
|
-
if (typeof arg === 'string') {
|
|
1887
|
-
if (identifierPathRegex.test(arg)) {
|
|
1888
|
-
_this.assertValidIdentifier(arg, 'SELECT expression');
|
|
1889
|
-
return arg;
|
|
1890
|
-
}
|
|
1891
|
-
// Treat numeric-looking strings as literals, not identifier paths
|
|
1892
|
-
if (isNumericString(arg))
|
|
1893
|
-
return arg;
|
|
1894
|
-
if (isGeomFromText && index === 0) {
|
|
1895
|
-
var trimmed = arg.trim();
|
|
1896
|
-
var alreadyQuoted = trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2;
|
|
1897
|
-
if (alreadyQuoted) {
|
|
1898
|
-
return trimmed;
|
|
1899
|
-
}
|
|
1900
|
-
var escaped = arg.replace(/'/g, "''");
|
|
1901
|
-
return "'".concat(escaped, "'");
|
|
1902
|
-
}
|
|
1903
|
-
return arg;
|
|
1904
|
-
}
|
|
1905
|
-
return String(arg);
|
|
1906
|
-
})
|
|
1907
|
-
.join(', ');
|
|
1908
|
-
var expr;
|
|
1909
|
-
if (F === 'DISTINCT') {
|
|
1910
|
-
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;
|
|
1911
2145
|
}
|
|
1912
|
-
|
|
1913
|
-
|
|
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;
|
|
1914
2149
|
}
|
|
1915
|
-
if (
|
|
1916
|
-
|
|
1917
|
-
expr += " AS ".concat(alias);
|
|
2150
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(trimmed) && this.selectAliases.has(trimmed)) {
|
|
2151
|
+
return true;
|
|
1918
2152
|
}
|
|
1919
|
-
|
|
1920
|
-
|
|
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;
|
|
1921
2195
|
};
|
|
1922
2196
|
return AggregateBuilder;
|
|
1923
2197
|
}(Executor));
|
|
1924
2198
|
|
|
1925
|
-
// Alias a table name with a given alias
|
|
1926
2199
|
var DERIVED_TABLE_PREFIX = '__c6DerivedTable__';
|
|
1927
2200
|
var DERIVED_ID_SYMBOL = Symbol('c6DerivedTableId');
|
|
1928
2201
|
var derivedTableLookup = new Map();
|
|
@@ -2000,6 +2273,29 @@ var bbox = function (minLng, minLat, maxLng, maxLat) {
|
|
|
2000
2273
|
var stContains = function (envelope, shape) {
|
|
2001
2274
|
return [C6C.ST_CONTAINS, envelope, shape];
|
|
2002
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
|
+
};
|
|
2003
2299
|
|
|
2004
2300
|
var ConditionBuilder = /** @class */ (function (_super) {
|
|
2005
2301
|
__extends(ConditionBuilder, _super);
|
|
@@ -2106,6 +2402,26 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2106
2402
|
return true;
|
|
2107
2403
|
return false;
|
|
2108
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
|
+
};
|
|
2109
2425
|
ConditionBuilder.prototype.execute = function () {
|
|
2110
2426
|
throw new Error("Method not implemented.");
|
|
2111
2427
|
};
|
|
@@ -2180,41 +2496,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2180
2496
|
ConditionBuilder.prototype.isOperator = function (op) {
|
|
2181
2497
|
return !!this.normalizeOperatorKey(op);
|
|
2182
2498
|
};
|
|
2183
|
-
ConditionBuilder.prototype.looksLikeSafeFunctionExpression = function (value) {
|
|
2184
|
-
if (typeof value !== 'string')
|
|
2185
|
-
return false;
|
|
2186
|
-
var trimmed = value.trim();
|
|
2187
|
-
if (trimmed.length === 0)
|
|
2188
|
-
return false;
|
|
2189
|
-
if (trimmed.includes(';') || trimmed.includes('--') || trimmed.includes('/*') || trimmed.includes('*/')) {
|
|
2190
|
-
return false;
|
|
2191
|
-
}
|
|
2192
|
-
if (!trimmed.includes('(') || !trimmed.endsWith(')')) {
|
|
2193
|
-
return false;
|
|
2194
|
-
}
|
|
2195
|
-
var functionMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*)\s*\(/);
|
|
2196
|
-
if (!functionMatch) {
|
|
2197
|
-
return false;
|
|
2198
|
-
}
|
|
2199
|
-
var allowedCharacters = /^[A-Za-z0-9_().,'"\s-]+$/;
|
|
2200
|
-
if (!allowedCharacters.test(trimmed)) {
|
|
2201
|
-
return false;
|
|
2202
|
-
}
|
|
2203
|
-
var depth = 0;
|
|
2204
|
-
for (var _i = 0, trimmed_1 = trimmed; _i < trimmed_1.length; _i++) {
|
|
2205
|
-
var char = trimmed_1[_i];
|
|
2206
|
-
if (char === '(') {
|
|
2207
|
-
depth += 1;
|
|
2208
|
-
}
|
|
2209
|
-
else if (char === ')') {
|
|
2210
|
-
depth -= 1;
|
|
2211
|
-
if (depth < 0) {
|
|
2212
|
-
return false;
|
|
2213
|
-
}
|
|
2214
|
-
}
|
|
2215
|
-
}
|
|
2216
|
-
return depth === 0;
|
|
2217
|
-
};
|
|
2218
2499
|
ConditionBuilder.prototype.ensureWrapped = function (expression) {
|
|
2219
2500
|
var trimmed = expression.trim();
|
|
2220
2501
|
if (!trimmed)
|
|
@@ -2242,42 +2523,6 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2242
2523
|
})
|
|
2243
2524
|
.join(" ".concat(operator, " "));
|
|
2244
2525
|
};
|
|
2245
|
-
ConditionBuilder.prototype.normalizeFunctionField = function (field, params) {
|
|
2246
|
-
var _this = this;
|
|
2247
|
-
if (field instanceof Map) {
|
|
2248
|
-
field = Object.fromEntries(field);
|
|
2249
|
-
}
|
|
2250
|
-
if (Array.isArray(field)) {
|
|
2251
|
-
if (field.length === 0)
|
|
2252
|
-
return field;
|
|
2253
|
-
var fn = field[0], args = field.slice(1);
|
|
2254
|
-
var normalizedArgs = args.map(function (arg) { return _this.normalizeFunctionField(arg, params); });
|
|
2255
|
-
return __spreadArray([fn], normalizedArgs, true);
|
|
2256
|
-
}
|
|
2257
|
-
if (field && typeof field === 'object') {
|
|
2258
|
-
if (C6C.SUBSELECT in field) {
|
|
2259
|
-
var builder = this.buildScalarSubSelect;
|
|
2260
|
-
if (typeof builder !== 'function') {
|
|
2261
|
-
throw new Error('Scalar subselect handling requires JoinBuilder context.');
|
|
2262
|
-
}
|
|
2263
|
-
return builder.call(this, field[C6C.SUBSELECT], params);
|
|
2264
|
-
}
|
|
2265
|
-
var entries = Object.entries(field);
|
|
2266
|
-
if (entries.length === 1) {
|
|
2267
|
-
var _a = entries[0], key = _a[0], value = _a[1];
|
|
2268
|
-
if (this.isOperator(key)) {
|
|
2269
|
-
return this.buildOperatorExpression(key, value, params);
|
|
2270
|
-
}
|
|
2271
|
-
return this.buildFunctionCall(key, value, params);
|
|
2272
|
-
}
|
|
2273
|
-
}
|
|
2274
|
-
return field;
|
|
2275
|
-
};
|
|
2276
|
-
ConditionBuilder.prototype.buildFunctionCall = function (fn, value, params) {
|
|
2277
|
-
var args = Array.isArray(value) ? value : [value];
|
|
2278
|
-
var normalized = this.normalizeFunctionField(__spreadArray([fn], args, true), params);
|
|
2279
|
-
return this.buildAggregateField(normalized, params);
|
|
2280
|
-
};
|
|
2281
2526
|
ConditionBuilder.prototype.serializeOperand = function (operand, params, contextColumn) {
|
|
2282
2527
|
var _a;
|
|
2283
2528
|
var _this = this;
|
|
@@ -2292,18 +2537,14 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2292
2537
|
return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
|
|
2293
2538
|
}
|
|
2294
2539
|
if (typeof operand === 'string') {
|
|
2295
|
-
|
|
2296
|
-
|
|
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 };
|
|
2297
2543
|
}
|
|
2298
|
-
|
|
2299
|
-
return { sql: operand.trim(), isReference: false, isExpression: true, isSubSelect: false };
|
|
2300
|
-
}
|
|
2301
|
-
return { sql: asParam(operand), isReference: false, isExpression: false, isSubSelect: false };
|
|
2544
|
+
throw new Error("Bare string '".concat(operand, "' is not a reference. Wrap literal strings with [C6C.LIT, value]."));
|
|
2302
2545
|
}
|
|
2303
2546
|
if (Array.isArray(operand)) {
|
|
2304
|
-
|
|
2305
|
-
var sql = this.buildAggregateField(normalized, params);
|
|
2306
|
-
return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
|
|
2547
|
+
return this.serializeExpression(operand, params, 'SQL expression', contextColumn);
|
|
2307
2548
|
}
|
|
2308
2549
|
if (operand instanceof Map) {
|
|
2309
2550
|
operand = Object.fromEntries(operand);
|
|
@@ -2321,24 +2562,38 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2321
2562
|
if (entries.length === 1) {
|
|
2322
2563
|
var _b = entries[0], key = _b[0], value = _b[1];
|
|
2323
2564
|
if (this.isOperator(key)) {
|
|
2324
|
-
var
|
|
2325
|
-
return { sql: this.ensureWrapped(
|
|
2565
|
+
var sql = this.buildOperatorExpression(key, value, params);
|
|
2566
|
+
return { sql: this.ensureWrapped(sql), isReference: false, isExpression: true, isSubSelect: false };
|
|
2326
2567
|
}
|
|
2327
2568
|
if (this.BOOLEAN_OPERATORS.has(key)) {
|
|
2328
|
-
var
|
|
2329
|
-
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 };
|
|
2330
2571
|
}
|
|
2331
|
-
|
|
2332
|
-
return { sql: sql, isReference: false, isExpression: true, isSubSelect: false };
|
|
2572
|
+
throw new Error('Object-rooted expressions are not supported. Use tuple syntax instead.');
|
|
2333
2573
|
}
|
|
2334
2574
|
}
|
|
2335
2575
|
throw new Error('Unsupported operand type in SQL expression.');
|
|
2336
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
|
+
};
|
|
2337
2590
|
ConditionBuilder.prototype.isPlainArrayLiteral = function (value, allowColumnRefs) {
|
|
2338
2591
|
var _this = this;
|
|
2339
2592
|
if (allowColumnRefs === void 0) { allowColumnRefs = false; }
|
|
2340
2593
|
if (!Array.isArray(value))
|
|
2341
2594
|
return false;
|
|
2595
|
+
if (this.isExpressionTuple(value))
|
|
2596
|
+
return false;
|
|
2342
2597
|
return value.every(function (item) {
|
|
2343
2598
|
if (item === null)
|
|
2344
2599
|
return true;
|
|
@@ -2408,6 +2663,16 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2408
2663
|
|| this.isPlainObjectLiteral(normalized, allowColumnRefs)) {
|
|
2409
2664
|
return this.addParam(params, contextColumn !== null && contextColumn !== void 0 ? contextColumn : '', JSON.stringify(normalized));
|
|
2410
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
|
+
}
|
|
2411
2676
|
var sql;
|
|
2412
2677
|
var isReference;
|
|
2413
2678
|
var isExpression;
|
|
@@ -2491,7 +2756,10 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2491
2756
|
}
|
|
2492
2757
|
var payload = this.ensurePlainObject(payloadRaw);
|
|
2493
2758
|
var subSelect;
|
|
2494
|
-
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) {
|
|
2495
2763
|
subSelect = this.ensurePlainObject(payload[C6C.SUBSELECT]);
|
|
2496
2764
|
}
|
|
2497
2765
|
else if (payload && typeof payload === 'object') {
|
|
@@ -2585,7 +2853,11 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2585
2853
|
throw new Error('MATCH_AGAINST expects an array [search, mode?].');
|
|
2586
2854
|
}
|
|
2587
2855
|
var search = right[0], mode = right[1];
|
|
2588
|
-
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;
|
|
2589
2861
|
var againstClause = void 0;
|
|
2590
2862
|
switch (typeof mode === 'string' ? mode.toUpperCase() : '') {
|
|
2591
2863
|
case 'BOOLEAN':
|
|
@@ -2687,7 +2959,7 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2687
2959
|
if (!Array.isArray(value)) {
|
|
2688
2960
|
throw new Error("".concat(column, " expects an array of arguments."));
|
|
2689
2961
|
}
|
|
2690
|
-
return this.
|
|
2962
|
+
return this.serializeExpression(__spreadArray([column], value, true), params, "WHERE function ".concat(column), column).sql;
|
|
2691
2963
|
}
|
|
2692
2964
|
}
|
|
2693
2965
|
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value)) {
|
|
@@ -3130,56 +3402,34 @@ var PaginationBuilder = /** @class */ (function (_super) {
|
|
|
3130
3402
|
*
|
|
3131
3403
|
* Accepted structures:
|
|
3132
3404
|
* ```ts
|
|
3133
|
-
* ORDER:
|
|
3134
|
-
*
|
|
3135
|
-
* [property_units.
|
|
3136
|
-
*
|
|
3137
|
-
* [C6Constants.ST_DISTANCE_SPHERE]: [property_units.LOCATION, F(property_units.LOCATION, "pu_target")]
|
|
3138
|
-
* }
|
|
3405
|
+
* ORDER: [
|
|
3406
|
+
* [property_units.UNIT_ID, "DESC"],
|
|
3407
|
+
* [[C6Constants.ST_DISTANCE_SPHERE, property_units.LOCATION, F(property_units.LOCATION, "pu_target")], "ASC"],
|
|
3408
|
+
* ]
|
|
3139
3409
|
* ```
|
|
3140
3410
|
*/
|
|
3141
3411
|
PaginationBuilder.prototype.buildPaginationClause = function (pagination, params) {
|
|
3142
|
-
var _this = this;
|
|
3143
3412
|
var sql = "";
|
|
3144
3413
|
/* -------- ORDER BY -------- */
|
|
3145
3414
|
if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
|
|
3146
3415
|
var orderParts = [];
|
|
3147
|
-
var
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3160
|
-
|
|
3161
|
-
_this.assertValidIdentifier(arg, 'ORDER BY argument');
|
|
3162
|
-
return arg;
|
|
3163
|
-
}
|
|
3164
|
-
// numeric-looking strings should be treated as literals
|
|
3165
|
-
if (isNumericString_1(arg))
|
|
3166
|
-
return arg;
|
|
3167
|
-
return arg;
|
|
3168
|
-
}
|
|
3169
|
-
return String(arg);
|
|
3170
|
-
})
|
|
3171
|
-
.join(", ");
|
|
3172
|
-
orderParts.push("".concat(key, "(").concat(args, ")"));
|
|
3173
|
-
}
|
|
3174
|
-
// SIMPLE COLUMN + DIR (ASC/DESC)
|
|
3175
|
-
else {
|
|
3176
|
-
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();
|
|
3177
3430
|
}
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
for (var _i = 0, _a = Object.entries(pagination[C6Constants.ORDER]); _i < _a.length; _i++) {
|
|
3181
|
-
var _b = _a[_i], key = _b[0], val = _b[1];
|
|
3182
|
-
_loop_1(key, val);
|
|
3431
|
+
var serialized = this.serializeExpression(expression, params, 'ORDER BY expression');
|
|
3432
|
+
orderParts.push("".concat(serialized.sql, " ").concat(direction));
|
|
3183
3433
|
}
|
|
3184
3434
|
if (orderParts.length)
|
|
3185
3435
|
sql += " ORDER BY ".concat(orderParts.join(", "));
|
|
@@ -3469,7 +3719,7 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3469
3719
|
throw new Error("Singular request requires all primary key(s) [".concat(pkShorts.join(', '), "] for table (").concat(restModel.TABLE_NAME, "). Missing: [").concat(missing.join(', '), "]"));
|
|
3470
3720
|
}
|
|
3471
3721
|
// Strip API metadata that should remain at root
|
|
3472
|
-
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"]);
|
|
3473
3723
|
// Map short primary keys to fully-qualified column names
|
|
3474
3724
|
var shortToFull = {};
|
|
3475
3725
|
for (var _e = 0, _f = Object.entries(restModel.COLUMNS || {}); _e < _f.length; _e++) {
|
|
@@ -3481,22 +3731,26 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3481
3731
|
var k = _a[0], v = _a[1];
|
|
3482
3732
|
return [(_b = shortToFull[k]) !== null && _b !== void 0 ? _b : k, v];
|
|
3483
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
|
+
}));
|
|
3484
3738
|
if (requestMethod === C6Constants.GET) {
|
|
3485
3739
|
var normalized_1 = {
|
|
3486
|
-
WHERE: __assign({},
|
|
3740
|
+
WHERE: __assign({}, pkWhereExpressions),
|
|
3487
3741
|
};
|
|
3488
3742
|
// Preserve pagination if any was added previously
|
|
3489
3743
|
if (request[C6Constants.PAGINATION]) {
|
|
3490
3744
|
normalized_1[C6Constants.PAGINATION] = request[C6Constants.PAGINATION];
|
|
3491
3745
|
}
|
|
3492
|
-
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 });
|
|
3493
3747
|
}
|
|
3494
3748
|
if (requestMethod === C6Constants.DELETE) {
|
|
3495
3749
|
var normalized_2 = (_a = {},
|
|
3496
3750
|
_a[C6Constants.DELETE] = true,
|
|
3497
|
-
_a.WHERE = __assign({},
|
|
3751
|
+
_a.WHERE = __assign({}, pkWhereExpressions),
|
|
3498
3752
|
_a);
|
|
3499
|
-
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 });
|
|
3500
3754
|
}
|
|
3501
3755
|
// PUT
|
|
3502
3756
|
var updateBody = {};
|
|
@@ -3515,9 +3769,9 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3515
3769
|
}
|
|
3516
3770
|
var normalized = (_b = {},
|
|
3517
3771
|
_b[C6Constants.UPDATE] = updateBody,
|
|
3518
|
-
_b.WHERE = __assign({},
|
|
3772
|
+
_b.WHERE = __assign({}, pkWhereExpressions),
|
|
3519
3773
|
_b);
|
|
3520
|
-
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 });
|
|
3521
3775
|
}
|
|
3522
3776
|
|
|
3523
3777
|
var allowListCache = new Map();
|
|
@@ -4065,6 +4319,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4065
4319
|
C6Constants.REPLACE,
|
|
4066
4320
|
"dataInsertMultipleRows",
|
|
4067
4321
|
"cacheResults",
|
|
4322
|
+
"skipReactBootstrap",
|
|
4068
4323
|
"fetchDependencies",
|
|
4069
4324
|
"debug",
|
|
4070
4325
|
"success",
|
|
@@ -4148,9 +4403,10 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4148
4403
|
}
|
|
4149
4404
|
}
|
|
4150
4405
|
if (value !== undefined) {
|
|
4151
|
-
pkValues[pkShort] = value;
|
|
4406
|
+
pkValues[pkShort] = this_1.unwrapPrimaryKeyValue(value);
|
|
4152
4407
|
}
|
|
4153
4408
|
};
|
|
4409
|
+
var this_1 = this;
|
|
4154
4410
|
for (var _i = 0, primaryShorts_1 = primaryShorts; _i < primaryShorts_1.length; _i++) {
|
|
4155
4411
|
var pkShort = primaryShorts_1[_i];
|
|
4156
4412
|
_loop_1(pkShort);
|
|
@@ -4160,6 +4416,26 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4160
4416
|
}
|
|
4161
4417
|
return Object.keys(pkValues).length > 0 ? pkValues : null;
|
|
4162
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
|
+
};
|
|
4163
4439
|
SqlExecutor.prototype.extractPrimaryKeyValuesFromData = function (data) {
|
|
4164
4440
|
if (!data)
|
|
4165
4441
|
return null;
|
|
@@ -4780,5 +5056,5 @@ function isVerbose() {
|
|
|
4780
5056
|
return resolveLogLevel() >= LogLevel.DEBUG;
|
|
4781
5057
|
}
|
|
4782
5058
|
|
|
4783
|
-
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 };
|
|
4784
5060
|
//# sourceMappingURL=index.esm.js.map
|