@carbonorm/carbonnode 3.7.6 → 3.7.8
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 +2 -1
- package/dist/api/orm/builders/AggregateBuilder.d.ts +1 -0
- package/dist/api/types/ormInterfaces.d.ts +2 -2
- package/dist/api/utils/cacheManager.d.ts +1 -1
- package/dist/api/utils/normalizeSingularRequest.d.ts +10 -0
- package/dist/index.cjs.js +182 -32
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.esm.js +183 -34
- package/dist/index.esm.js.map +1 -1
- package/package.json +11 -6
- package/scripts/assets/handlebars/C6.test.ts.handlebars +55 -80
- package/scripts/assets/handlebars/C6.ts.handlebars +28 -2
- package/scripts/generateRestBindings.cjs +17 -6
- package/scripts/generateRestBindings.ts +22 -8
- package/src/__tests__/fixtures/c6.fixture.ts +74 -0
- package/src/__tests__/normalizeSingularRequest.test.ts +105 -0
- package/src/__tests__/sakila-db/C6.js +1487 -0
- package/src/__tests__/sakila-db/C6.test.ts +63 -0
- package/src/__tests__/sakila-db/C6.ts +2206 -0
- package/src/__tests__/sakila-db/sakila-data.sql +46444 -0
- package/src/__tests__/sakila-db/sakila-schema.sql +686 -0
- package/src/__tests__/sakila-db/sakila.mwb +0 -0
- package/src/__tests__/sakila.generated.test.ts +46 -0
- package/src/__tests__/sqlBuilders.complex.test.ts +134 -0
- package/src/__tests__/sqlBuilders.test.ts +121 -0
- package/src/api/convertForRequestBody.ts +1 -1
- package/src/api/executors/HttpExecutor.ts +14 -3
- package/src/api/executors/SqlExecutor.ts +14 -1
- package/src/api/orm/builders/AggregateBuilder.ts +3 -0
- package/src/api/orm/builders/ConditionBuilder.ts +34 -11
- package/src/api/orm/builders/PaginationBuilder.ts +10 -4
- package/src/api/orm/queries/SelectQueryBuilder.ts +3 -0
- package/src/api/orm/queries/UpdateQueryBuilder.ts +2 -1
- package/src/api/types/ormInterfaces.ts +3 -4
- package/src/api/utils/cacheManager.ts +1 -1
- package/src/api/utils/normalizeSingularRequest.ts +144 -0
- package/src/index.ts +1 -0
package/dist/index.esm.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import Qs from 'qs';
|
|
3
|
-
import { __assign, __awaiter, __generator,
|
|
3
|
+
import { __assign, __awaiter, __generator, __spreadArray, __rest, __extends } from 'tslib';
|
|
4
4
|
import { toast } from 'react-toastify';
|
|
5
5
|
import namedPlaceholders from 'named-placeholders';
|
|
6
6
|
import { Buffer as Buffer$1 } from 'buffer';
|
|
@@ -590,6 +590,102 @@ function removeInvalidKeys(request, c6Tables) {
|
|
|
590
590
|
return intersection;
|
|
591
591
|
}
|
|
592
592
|
|
|
593
|
+
/**
|
|
594
|
+
* Converts a singular T-shaped request into complex ORM format for GET/PUT/DELETE
|
|
595
|
+
* Enforces that all primary keys are present for singular syntax and that the table has PKs.
|
|
596
|
+
* Optionally accepts a previously removed primary key (key/value) to reconstruct WHERE.
|
|
597
|
+
*/
|
|
598
|
+
function normalizeSingularRequest(requestMethod, request, restModel, removedPrimary) {
|
|
599
|
+
var _a, _b;
|
|
600
|
+
if (request == null || typeof request !== 'object')
|
|
601
|
+
return request;
|
|
602
|
+
var specialKeys = new Set([
|
|
603
|
+
C6Constants.SELECT,
|
|
604
|
+
C6Constants.UPDATE,
|
|
605
|
+
C6Constants.DELETE,
|
|
606
|
+
C6Constants.WHERE,
|
|
607
|
+
C6Constants.JOIN,
|
|
608
|
+
C6Constants.PAGINATION,
|
|
609
|
+
]);
|
|
610
|
+
// Determine if the request is already complex (has any special key besides PAGINATION)
|
|
611
|
+
var keys = Object.keys(request);
|
|
612
|
+
var hasComplexKeys = keys.some(function (k) { return k !== C6Constants.PAGINATION && specialKeys.has(k); });
|
|
613
|
+
if (hasComplexKeys)
|
|
614
|
+
return request; // already complex
|
|
615
|
+
// We treat it as singular when it's not complex.
|
|
616
|
+
// For GET, PUT, DELETE only
|
|
617
|
+
if (!(requestMethod === C6Constants.GET || requestMethod === C6Constants.PUT || requestMethod === C6Constants.DELETE)) {
|
|
618
|
+
return request;
|
|
619
|
+
}
|
|
620
|
+
var pkShorts = Array.isArray(restModel.PRIMARY_SHORT) ? __spreadArray([], restModel.PRIMARY_SHORT, true) : [];
|
|
621
|
+
if (!pkShorts.length) {
|
|
622
|
+
// For GET requests, do not enforce primary key presence; treat as a collection query.
|
|
623
|
+
if (requestMethod === C6Constants.GET)
|
|
624
|
+
return request;
|
|
625
|
+
throw new Error("Table (".concat(restModel.TABLE_NAME, ") has no primary key; singular request syntax is not allowed."));
|
|
626
|
+
}
|
|
627
|
+
// Build pk map from request + possibly removed primary key
|
|
628
|
+
var pkValues = {};
|
|
629
|
+
for (var _i = 0, pkShorts_1 = pkShorts; _i < pkShorts_1.length; _i++) {
|
|
630
|
+
var pk = pkShorts_1[_i];
|
|
631
|
+
var fromRequest = request[pk];
|
|
632
|
+
if (fromRequest !== undefined && fromRequest !== null) {
|
|
633
|
+
pkValues[pk] = fromRequest;
|
|
634
|
+
continue;
|
|
635
|
+
}
|
|
636
|
+
if (removedPrimary && removedPrimary.key === pk) {
|
|
637
|
+
pkValues[pk] = removedPrimary.value;
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
var missing = pkShorts.filter(function (pk) { return !(pk in pkValues); });
|
|
642
|
+
if (missing.length) {
|
|
643
|
+
// For GET requests, if not all PKs are provided, treat as a collection query and leave as-is.
|
|
644
|
+
if (requestMethod === C6Constants.GET) {
|
|
645
|
+
return request;
|
|
646
|
+
}
|
|
647
|
+
throw new Error("Singular request requires all primary key(s) [".concat(pkShorts.join(', '), "] for table (").concat(restModel.TABLE_NAME, "). Missing: [").concat(missing.join(', '), "]"));
|
|
648
|
+
}
|
|
649
|
+
// Strip API metadata that should remain at root
|
|
650
|
+
var _c = request, dataInsertMultipleRows = _c.dataInsertMultipleRows, cacheResults = _c.cacheResults, fetchDependencies = _c.fetchDependencies, debug = _c.debug, success = _c.success, error = _c.error, rest = __rest(_c, ["dataInsertMultipleRows", "cacheResults", "fetchDependencies", "debug", "success", "error"]);
|
|
651
|
+
if (requestMethod === C6Constants.GET) {
|
|
652
|
+
var normalized_1 = {
|
|
653
|
+
WHERE: __assign({}, pkValues),
|
|
654
|
+
};
|
|
655
|
+
// Preserve pagination if any was added previously
|
|
656
|
+
if (request[C6Constants.PAGINATION]) {
|
|
657
|
+
normalized_1[C6Constants.PAGINATION] = request[C6Constants.PAGINATION];
|
|
658
|
+
}
|
|
659
|
+
return __assign(__assign({}, normalized_1), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
660
|
+
}
|
|
661
|
+
if (requestMethod === C6Constants.DELETE) {
|
|
662
|
+
var normalized_2 = (_a = {},
|
|
663
|
+
_a[C6Constants.DELETE] = true,
|
|
664
|
+
_a.WHERE = __assign({}, pkValues),
|
|
665
|
+
_a);
|
|
666
|
+
return __assign(__assign({}, normalized_2), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
667
|
+
}
|
|
668
|
+
// PUT
|
|
669
|
+
var updateBody = {};
|
|
670
|
+
for (var _d = 0, _e = Object.keys(rest); _d < _e.length; _d++) {
|
|
671
|
+
var k = _e[_d];
|
|
672
|
+
if (pkShorts.includes(k))
|
|
673
|
+
continue; // don't update PK columns
|
|
674
|
+
// Skip special request keys if any slipped through
|
|
675
|
+
if (specialKeys.has(k))
|
|
676
|
+
continue;
|
|
677
|
+
updateBody[k] = rest[k];
|
|
678
|
+
}
|
|
679
|
+
if (Object.keys(updateBody).length === 0) {
|
|
680
|
+
throw new Error("Singular PUT request for table (".concat(restModel.TABLE_NAME, ") must include at least one non-primary field to update."));
|
|
681
|
+
}
|
|
682
|
+
var normalized = (_b = {},
|
|
683
|
+
_b[C6Constants.UPDATE] = updateBody,
|
|
684
|
+
_b.WHERE = __assign({}, pkValues),
|
|
685
|
+
_b);
|
|
686
|
+
return __assign(__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
687
|
+
}
|
|
688
|
+
|
|
593
689
|
// do not remove entries from this array. It is used to track the progress of API requests.
|
|
594
690
|
// position in array is important. Do not sort. To not add to begging.
|
|
595
691
|
var apiRequestCache = [];
|
|
@@ -727,7 +823,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
727
823
|
query[C6.PAGINATION][C6.LIMIT] = query[C6.PAGINATION][C6.LIMIT] || 100;
|
|
728
824
|
}
|
|
729
825
|
apiRequest = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
730
|
-
var _a, debug, _b, cacheResults, dataInsertMultipleRows, success, _c, fetchDependencies, _d, error, querySerialized, cacheResult, cachingConfirmed, cacheCheck, cacheCheck, addBackPK, apiResponse, returnGetNextPageFunction, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKey, removedPkValue_1, axiosActiveRequest;
|
|
826
|
+
var _a, debug, _b, cacheResults, dataInsertMultipleRows, success, _c, fetchDependencies, _d, error, querySerialized, cacheResult, cachingConfirmed, cacheCheck, cacheCheck, addBackPK, removedPrimaryKV, apiResponse, returnGetNextPageFunction, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKey, removedPkValue_1, axiosActiveRequest;
|
|
731
827
|
var _e;
|
|
732
828
|
var _this = this;
|
|
733
829
|
var _f, _g, _h, _j, _k, _l;
|
|
@@ -847,6 +943,7 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
847
943
|
&& primaryKey in query) {
|
|
848
944
|
restRequestUri += query[primaryKey] + '/';
|
|
849
945
|
removedPkValue_1 = query[primaryKey];
|
|
946
|
+
removedPrimaryKV = { key: primaryKey, value: removedPkValue_1 };
|
|
850
947
|
addBackPK = function () {
|
|
851
948
|
query !== null && query !== void 0 ? query : (query = {});
|
|
852
949
|
query[primaryKey] = removedPkValue_1;
|
|
@@ -875,9 +972,11 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
875
972
|
var baseConfig = {
|
|
876
973
|
withCredentials: withCredentials,
|
|
877
974
|
};
|
|
975
|
+
// Normalize singular request (GET/PUT/DELETE) into complex ORM shape
|
|
976
|
+
var normalizedQuery = normalizeSingularRequest(requestMethod, query, restModel, removedPrimaryKV);
|
|
878
977
|
switch (requestMethod) {
|
|
879
978
|
case GET:
|
|
880
|
-
return [__assign(__assign({}, baseConfig), { params:
|
|
979
|
+
return [__assign(__assign({}, baseConfig), { params: normalizedQuery })];
|
|
881
980
|
case POST:
|
|
882
981
|
if (dataInsertMultipleRows !== undefined) {
|
|
883
982
|
return [
|
|
@@ -887,9 +986,9 @@ var HttpExecutor = /** @class */ (function (_super) {
|
|
|
887
986
|
}
|
|
888
987
|
return [convert(query), baseConfig];
|
|
889
988
|
case PUT:
|
|
890
|
-
return [convert(
|
|
989
|
+
return [convert(normalizedQuery), baseConfig];
|
|
891
990
|
case DELETE:
|
|
892
|
-
return [__assign(__assign({}, baseConfig), { data: convert(
|
|
991
|
+
return [__assign(__assign({}, baseConfig), { data: convert(normalizedQuery) })];
|
|
893
992
|
default:
|
|
894
993
|
throw new Error("The request method (".concat(requestMethod, ") was not recognized."));
|
|
895
994
|
}
|
|
@@ -1210,7 +1309,9 @@ function convertHexIfBinary(_col, val, columnDef) {
|
|
|
1210
1309
|
var AggregateBuilder = /** @class */ (function (_super) {
|
|
1211
1310
|
__extends(AggregateBuilder, _super);
|
|
1212
1311
|
function AggregateBuilder() {
|
|
1213
|
-
|
|
1312
|
+
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
1313
|
+
_this.selectAliases = new Set();
|
|
1314
|
+
return _this;
|
|
1214
1315
|
}
|
|
1215
1316
|
AggregateBuilder.prototype.buildAggregateField = function (field) {
|
|
1216
1317
|
var _this = this;
|
|
@@ -1238,6 +1339,7 @@ var AggregateBuilder = /** @class */ (function (_super) {
|
|
|
1238
1339
|
expr = "".concat(F, "(").concat(argList, ")");
|
|
1239
1340
|
}
|
|
1240
1341
|
if (alias) {
|
|
1342
|
+
this.selectAliases.add(alias);
|
|
1241
1343
|
expr += " AS ".concat(alias);
|
|
1242
1344
|
}
|
|
1243
1345
|
this.config.verbose && console.log("[SELECT] ".concat(expr));
|
|
@@ -1304,12 +1406,21 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
1304
1406
|
throw new Error("Method not implemented.");
|
|
1305
1407
|
};
|
|
1306
1408
|
ConditionBuilder.prototype.isTableReference = function (val) {
|
|
1307
|
-
var _a, _b, _c;
|
|
1308
|
-
if (typeof val !== 'string'
|
|
1409
|
+
var _a, _b, _c, _d;
|
|
1410
|
+
if (typeof val !== 'string')
|
|
1411
|
+
return false;
|
|
1412
|
+
// Support aggregate aliases (e.g., SELECT COUNT(x) AS cnt ... HAVING cnt > 1)
|
|
1413
|
+
if (!val.includes('.')) {
|
|
1414
|
+
var isIdentifier = /^[A-Za-z_][A-Za-z0-9_]*$/.test(val);
|
|
1415
|
+
// selectAliases is defined in AggregateBuilder
|
|
1416
|
+
if (isIdentifier && ((_a = this.selectAliases) === null || _a === void 0 ? void 0 : _a.has(val))) {
|
|
1417
|
+
return true;
|
|
1418
|
+
}
|
|
1309
1419
|
return false;
|
|
1310
|
-
|
|
1311
|
-
var
|
|
1312
|
-
var
|
|
1420
|
+
}
|
|
1421
|
+
var _e = val.split('.'), prefix = _e[0], column = _e[1];
|
|
1422
|
+
var tableName = (_b = this.aliasMap[prefix]) !== null && _b !== void 0 ? _b : prefix;
|
|
1423
|
+
var table = (_d = (_c = this.config.C6) === null || _c === void 0 ? void 0 : _c.TABLES) === null || _d === void 0 ? void 0 : _d[tableName];
|
|
1313
1424
|
if (!table || !table.COLUMNS)
|
|
1314
1425
|
return false;
|
|
1315
1426
|
var fullKey = "".concat(tableName, ".").concat(column);
|
|
@@ -1322,8 +1433,14 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
1322
1433
|
}
|
|
1323
1434
|
};
|
|
1324
1435
|
ConditionBuilder.prototype.addParam = function (params, column, value) {
|
|
1325
|
-
var _a, _b;
|
|
1326
|
-
|
|
1436
|
+
var _a, _b, _c;
|
|
1437
|
+
// Determine column definition from C6.TABLES to support type-aware conversions (e.g., BINARY hex -> Buffer)
|
|
1438
|
+
var columnDef;
|
|
1439
|
+
if (typeof column === 'string' && column.includes('.')) {
|
|
1440
|
+
var tableName = column.split('.', 2)[0];
|
|
1441
|
+
var table = (_b = (_a = this.config.C6) === null || _a === void 0 ? void 0 : _a.TABLES) === null || _b === void 0 ? void 0 : _b[tableName];
|
|
1442
|
+
columnDef = (_c = table === null || table === void 0 ? void 0 : table.TYPE_VALIDATION) === null || _c === void 0 ? void 0 : _c[column];
|
|
1443
|
+
}
|
|
1327
1444
|
var val = convertHexIfBinary(column, value, columnDef);
|
|
1328
1445
|
if (this.useNamedParams) {
|
|
1329
1446
|
var key = "param".concat(Object.keys(params).length);
|
|
@@ -1367,7 +1484,7 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
1367
1484
|
var leftIsCol = _this.isColumnRef(column);
|
|
1368
1485
|
var leftIsRef = _this.isTableReference(column);
|
|
1369
1486
|
var rightIsCol = typeof value === 'string' && _this.isColumnRef(value);
|
|
1370
|
-
if (!leftIsCol && !rightIsCol) {
|
|
1487
|
+
if (!leftIsCol && !leftIsRef && !rightIsCol) {
|
|
1371
1488
|
throw new Error("Potential SQL injection detected: '".concat(column, " ").concat(op, " ").concat(value, "'"));
|
|
1372
1489
|
}
|
|
1373
1490
|
_this.validateOperator(op);
|
|
@@ -1434,21 +1551,22 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
1434
1551
|
var parts = [];
|
|
1435
1552
|
var buildFromObject = function (obj, mode) {
|
|
1436
1553
|
var subParts = [];
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1554
|
+
var entries = Object.entries(obj);
|
|
1555
|
+
var nonNumeric = entries.filter(function (_a) {
|
|
1556
|
+
var k = _a[0];
|
|
1557
|
+
return isNaN(Number(k));
|
|
1558
|
+
});
|
|
1559
|
+
var numeric = entries.filter(function (_a) {
|
|
1560
|
+
var k = _a[0];
|
|
1561
|
+
return !isNaN(Number(k));
|
|
1562
|
+
});
|
|
1563
|
+
var processEntry = function (k, v) {
|
|
1446
1564
|
if (typeof v === 'object' && v !== null && Object.keys(v).length === 1) {
|
|
1447
|
-
var
|
|
1565
|
+
var _a = Object.entries(v)[0], op = _a[0], val = _a[1];
|
|
1448
1566
|
subParts.push(addCondition(k, op, val));
|
|
1449
1567
|
}
|
|
1450
1568
|
else if (Array.isArray(v) && v.length >= 2 && typeof v[0] === 'string') {
|
|
1451
|
-
var
|
|
1569
|
+
var _b = v, op = _b[0], val = _b[1];
|
|
1452
1570
|
subParts.push(addCondition(k, op, val));
|
|
1453
1571
|
}
|
|
1454
1572
|
else if (typeof v === 'object' && v !== null) {
|
|
@@ -1459,6 +1577,18 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
1459
1577
|
else {
|
|
1460
1578
|
subParts.push(addCondition(k, '=', v));
|
|
1461
1579
|
}
|
|
1580
|
+
};
|
|
1581
|
+
// Process non-numeric keys first to preserve intuitive insertion order for params
|
|
1582
|
+
for (var _i = 0, nonNumeric_1 = nonNumeric; _i < nonNumeric_1.length; _i++) {
|
|
1583
|
+
var _a = nonNumeric_1[_i], k = _a[0], v = _a[1];
|
|
1584
|
+
processEntry(k, v);
|
|
1585
|
+
}
|
|
1586
|
+
// Then process numeric keys (treated as grouped OR conditions)
|
|
1587
|
+
for (var _b = 0, numeric_1 = numeric; _b < numeric_1.length; _b++) {
|
|
1588
|
+
var _c = numeric_1[_b]; _c[0]; var v = _c[1];
|
|
1589
|
+
var sub = _this.buildBooleanJoinedConditions(v, false, params);
|
|
1590
|
+
if (sub)
|
|
1591
|
+
subParts.push(sub);
|
|
1462
1592
|
}
|
|
1463
1593
|
return subParts.join(" ".concat(mode ? 'AND' : 'OR', " "));
|
|
1464
1594
|
};
|
|
@@ -1595,13 +1725,12 @@ var PaginationBuilder = /** @class */ (function (_super) {
|
|
|
1595
1725
|
*/
|
|
1596
1726
|
PaginationBuilder.prototype.buildPaginationClause = function (pagination) {
|
|
1597
1727
|
var _this = this;
|
|
1598
|
-
var _a;
|
|
1599
1728
|
var sql = "";
|
|
1600
1729
|
/* -------- ORDER BY -------- */
|
|
1601
1730
|
if (pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.ORDER]) {
|
|
1602
1731
|
var orderParts = [];
|
|
1603
|
-
for (var _i = 0,
|
|
1604
|
-
var
|
|
1732
|
+
for (var _i = 0, _a = Object.entries(pagination[C6Constants.ORDER]); _i < _a.length; _i++) {
|
|
1733
|
+
var _b = _a[_i], key = _b[0], val = _b[1];
|
|
1605
1734
|
// FUNCTION CALL: val is an array of args
|
|
1606
1735
|
if (Array.isArray(val)) {
|
|
1607
1736
|
var args = val
|
|
@@ -1620,9 +1749,16 @@ var PaginationBuilder = /** @class */ (function (_super) {
|
|
|
1620
1749
|
/* -------- LIMIT / OFFSET -------- */
|
|
1621
1750
|
if ((pagination === null || pagination === void 0 ? void 0 : pagination[C6Constants.LIMIT]) != null) {
|
|
1622
1751
|
var lim = parseInt(pagination[C6Constants.LIMIT], 10);
|
|
1623
|
-
var
|
|
1624
|
-
var
|
|
1625
|
-
|
|
1752
|
+
var pageRaw = pagination[C6Constants.PAGE];
|
|
1753
|
+
var pageParsed = parseInt(pageRaw !== null && pageRaw !== void 0 ? pageRaw : 1, 10);
|
|
1754
|
+
var page = isFinite(pageParsed) && pageParsed > 1 ? pageParsed : 1;
|
|
1755
|
+
if (page === 1) {
|
|
1756
|
+
sql += " LIMIT ".concat(lim);
|
|
1757
|
+
}
|
|
1758
|
+
else {
|
|
1759
|
+
var offset = (page - 1) * lim;
|
|
1760
|
+
sql += " LIMIT ".concat(offset, ", ").concat(lim);
|
|
1761
|
+
}
|
|
1626
1762
|
}
|
|
1627
1763
|
this.config.verbose && console.log("[PAGINATION] ".concat(sql.trim()));
|
|
1628
1764
|
return sql;
|
|
@@ -1640,6 +1776,10 @@ var SelectQueryBuilder = /** @class */ (function (_super) {
|
|
|
1640
1776
|
var _a;
|
|
1641
1777
|
if (isSubSelect === void 0) { isSubSelect = false; }
|
|
1642
1778
|
this.aliasMap = {};
|
|
1779
|
+
// reset any previously collected SELECT aliases (from AggregateBuilder)
|
|
1780
|
+
// @ts-ignore
|
|
1781
|
+
if (this.selectAliases && this.selectAliases.clear)
|
|
1782
|
+
this.selectAliases.clear();
|
|
1643
1783
|
var args = this.request;
|
|
1644
1784
|
this.initAlias(table, args.JOIN);
|
|
1645
1785
|
var params = this.useNamedParams ? {} : [];
|
|
@@ -1693,9 +1833,10 @@ var UpdateQueryBuilder = /** @class */ (function (_super) {
|
|
|
1693
1833
|
if (!(C6C.UPDATE in this.request)) {
|
|
1694
1834
|
throw new Error("No update data provided in the request.");
|
|
1695
1835
|
}
|
|
1696
|
-
var setClauses = Object.entries(this.request[C6C.UPDATE])
|
|
1836
|
+
var setClauses = Object.entries(this.request[C6C.UPDATE])
|
|
1837
|
+
.map(function (_a) {
|
|
1697
1838
|
var col = _a[0], val = _a[1];
|
|
1698
|
-
return _this.addParam(params, col, val);
|
|
1839
|
+
return "`".concat(col, "` = ").concat(_this.addParam(params, col, val));
|
|
1699
1840
|
});
|
|
1700
1841
|
sql += " SET ".concat(setClauses.join(', '));
|
|
1701
1842
|
if (args.WHERE) {
|
|
@@ -1727,6 +1868,14 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
1727
1868
|
case 0:
|
|
1728
1869
|
TABLE_NAME = this.config.restModel.TABLE_NAME;
|
|
1729
1870
|
method = this.config.requestMethod;
|
|
1871
|
+
// Normalize singular T-shaped requests into complex ORM shape (GET/PUT/DELETE)
|
|
1872
|
+
try {
|
|
1873
|
+
this.request = normalizeSingularRequest(method, this.request, this.config.restModel, undefined);
|
|
1874
|
+
}
|
|
1875
|
+
catch (e) {
|
|
1876
|
+
// Surface normalization errors early
|
|
1877
|
+
throw e;
|
|
1878
|
+
}
|
|
1730
1879
|
this.config.verbose && console.log("[SQL EXECUTOR] \u25B6\uFE0F Executing ".concat(method, " on table \"").concat(TABLE_NAME, "\""));
|
|
1731
1880
|
this.config.verbose && console.log("[SQL EXECUTOR] \uD83E\uDDE9 Request:", this.request);
|
|
1732
1881
|
_a = method;
|
|
@@ -2091,5 +2240,5 @@ function isVerbose () {
|
|
|
2091
2240
|
return ['true', '1', 'yes', 'on'].includes(envVerbose.toLowerCase());
|
|
2092
2241
|
}
|
|
2093
2242
|
|
|
2094
|
-
export { A, AggregateBuilder, C6C, C6Constants, ConditionBuilder, DELETE, DeleteQueryBuilder, Executor, ExpressHandler, F, GET, HttpExecutor, JoinBuilder, POST, PUT, PaginationBuilder, PostQueryBuilder, SelectQueryBuilder, SqlExecutor, TestRestfulResponse, UpdateQueryBuilder, apiRequestCache, axiosInstance, bbox, checkAllRequestsComplete, checkCache, clearCache, convertForRequestBody, convertHexIfBinary, determineRuntimeJsType, distSphere, eFetchDependencies, error, fieldEq, getEnvVar, getPrimaryKeyTypes, group, info, isLocal, isNode, isTest, isVerbose, onError, onSuccess, removeInvalidKeys, removePrefixIfExists, restOrm, restRequest, sortAndSerializeQueryObject, stContains, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, warn };
|
|
2243
|
+
export { A, AggregateBuilder, C6C, C6Constants, ConditionBuilder, DELETE, DeleteQueryBuilder, Executor, ExpressHandler, F, GET, HttpExecutor, JoinBuilder, POST, PUT, PaginationBuilder, PostQueryBuilder, SelectQueryBuilder, SqlExecutor, TestRestfulResponse, UpdateQueryBuilder, apiRequestCache, axiosInstance, bbox, checkAllRequestsComplete, checkCache, clearCache, convertForRequestBody, convertHexIfBinary, determineRuntimeJsType, distSphere, eFetchDependencies, error, fieldEq, getEnvVar, getPrimaryKeyTypes, group, info, isLocal, isNode, isTest, isVerbose, normalizeSingularRequest, onError, onSuccess, removeInvalidKeys, removePrefixIfExists, restOrm, restRequest, sortAndSerializeQueryObject, stContains, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, warn };
|
|
2095
2244
|
//# sourceMappingURL=index.esm.js.map
|