@carbonorm/carbonnode 6.1.0 → 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 +509 -292
- package/dist/index.cjs.js +209 -37
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +208 -38
- package/dist/index.esm.js.map +1 -1
- package/dist/orm/utils/sqlUtils.d.ts +1 -0
- package/dist/types/ormInterfaces.d.ts +1 -0
- package/dist/utils/sqlAllowList.d.ts +5 -3
- package/package.json +1 -1
- package/src/__tests__/fixtures/c6.fixture.ts +33 -0
- 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.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 +10 -10
- 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__/sqlAllowList.test.ts +56 -1
- package/src/__tests__/sqlBuilders.test.ts +38 -1
- package/src/executors/SqlExecutor.ts +4 -3
- package/src/orm/builders/ConditionBuilder.ts +3 -10
- package/src/orm/utils/sqlUtils.ts +172 -4
- package/src/types/ormInterfaces.ts +1 -0
- package/src/utils/sqlAllowList.ts +44 -11
package/dist/index.esm.js
CHANGED
|
@@ -953,7 +953,7 @@ function colorSql(sql) {
|
|
|
953
953
|
return s;
|
|
954
954
|
}
|
|
955
955
|
|
|
956
|
-
var version = "6.1.
|
|
956
|
+
var version = "6.1.1";
|
|
957
957
|
|
|
958
958
|
var DEFAULT_STEP = 8;
|
|
959
959
|
function parseSemver(version) {
|
|
@@ -1798,14 +1798,176 @@ var HttpExecutor$1 = /*#__PURE__*/Object.freeze({
|
|
|
1798
1798
|
});
|
|
1799
1799
|
|
|
1800
1800
|
function convertHexIfBinary(_col, val, columnDef) {
|
|
1801
|
+
var _a;
|
|
1801
1802
|
if (typeof val === 'string' &&
|
|
1802
1803
|
/^[0-9a-fA-F]{32}$/.test(val) &&
|
|
1803
1804
|
typeof columnDef === 'object' &&
|
|
1804
|
-
columnDef.MYSQL_TYPE.toUpperCase().includes('BINARY')) {
|
|
1805
|
+
String((_a = columnDef.MYSQL_TYPE) !== null && _a !== void 0 ? _a : '').toUpperCase().includes('BINARY')) {
|
|
1805
1806
|
return Buffer.from(val, 'hex');
|
|
1806
1807
|
}
|
|
1807
1808
|
return val;
|
|
1808
1809
|
}
|
|
1810
|
+
var TEMPORAL_TYPES = new Set([
|
|
1811
|
+
'date',
|
|
1812
|
+
'datetime',
|
|
1813
|
+
'timestamp',
|
|
1814
|
+
'time',
|
|
1815
|
+
'year',
|
|
1816
|
+
]);
|
|
1817
|
+
var MYSQL_DATE_REGEX = /^\d{4}-\d{2}-\d{2}$/;
|
|
1818
|
+
var MYSQL_DATETIME_REGEX = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d{1,6})?$/;
|
|
1819
|
+
var MYSQL_TIME_REGEX = /^-?\d{2,3}:\d{2}:\d{2}(?:\.\d{1,6})?$/;
|
|
1820
|
+
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})?$/;
|
|
1821
|
+
var pad2 = function (value) { return value.toString().padStart(2, '0'); };
|
|
1822
|
+
function trimFraction(value, precision) {
|
|
1823
|
+
var _a = value.split('.', 2), base = _a[0], fractionRaw = _a[1];
|
|
1824
|
+
if (precision <= 0 || !fractionRaw)
|
|
1825
|
+
return base;
|
|
1826
|
+
return "".concat(base, ".").concat(fractionRaw.slice(0, precision).padEnd(precision, '0'));
|
|
1827
|
+
}
|
|
1828
|
+
function normalizeFraction(raw, precision) {
|
|
1829
|
+
if (precision <= 0)
|
|
1830
|
+
return '';
|
|
1831
|
+
if (!raw)
|
|
1832
|
+
return '';
|
|
1833
|
+
var digits = raw.startsWith('.') ? raw.slice(1) : raw;
|
|
1834
|
+
return ".".concat(digits.slice(0, precision).padEnd(precision, '0'));
|
|
1835
|
+
}
|
|
1836
|
+
function formatDateUtc(value) {
|
|
1837
|
+
return "".concat(value.getUTCFullYear(), "-").concat(pad2(value.getUTCMonth() + 1), "-").concat(pad2(value.getUTCDate()));
|
|
1838
|
+
}
|
|
1839
|
+
function formatTimeUtc(value, precision) {
|
|
1840
|
+
var base = "".concat(pad2(value.getUTCHours()), ":").concat(pad2(value.getUTCMinutes()), ":").concat(pad2(value.getUTCSeconds()));
|
|
1841
|
+
if (precision <= 0)
|
|
1842
|
+
return base;
|
|
1843
|
+
var millis = value.getUTCMilliseconds().toString().padStart(3, '0');
|
|
1844
|
+
var fraction = millis.slice(0, Math.min(precision, 3)).padEnd(precision, '0');
|
|
1845
|
+
return "".concat(base, ".").concat(fraction);
|
|
1846
|
+
}
|
|
1847
|
+
function formatDateTimeUtc(value, precision) {
|
|
1848
|
+
return "".concat(formatDateUtc(value), " ").concat(formatTimeUtc(value, precision));
|
|
1849
|
+
}
|
|
1850
|
+
function parseEpochNumber(value) {
|
|
1851
|
+
if (!Number.isFinite(value))
|
|
1852
|
+
return undefined;
|
|
1853
|
+
var abs = Math.abs(value);
|
|
1854
|
+
if (abs >= 1e12) {
|
|
1855
|
+
var date = new Date(value);
|
|
1856
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
1857
|
+
}
|
|
1858
|
+
if (abs >= 1e9) {
|
|
1859
|
+
var date = new Date(value * 1000);
|
|
1860
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
1861
|
+
}
|
|
1862
|
+
return undefined;
|
|
1863
|
+
}
|
|
1864
|
+
function parseTemporalType(columnDef) {
|
|
1865
|
+
var _a;
|
|
1866
|
+
var raw = String((_a = columnDef === null || columnDef === void 0 ? void 0 : columnDef.MYSQL_TYPE) !== null && _a !== void 0 ? _a : '').trim().toLowerCase();
|
|
1867
|
+
if (!raw)
|
|
1868
|
+
return { baseType: undefined, precision: 0 };
|
|
1869
|
+
var base = raw.split(/[\s(]/, 1)[0];
|
|
1870
|
+
if (!TEMPORAL_TYPES.has(base))
|
|
1871
|
+
return { baseType: undefined, precision: 0 };
|
|
1872
|
+
var precisionMatch = raw.match(/^(?:datetime|timestamp|time)\((\d+)\)/);
|
|
1873
|
+
if (!precisionMatch)
|
|
1874
|
+
return { baseType: base, precision: 0 };
|
|
1875
|
+
var parsed = Number.parseInt(precisionMatch[1], 10);
|
|
1876
|
+
if (!Number.isFinite(parsed))
|
|
1877
|
+
return { baseType: base, precision: 0 };
|
|
1878
|
+
return { baseType: base, precision: Math.max(0, Math.min(6, parsed)) };
|
|
1879
|
+
}
|
|
1880
|
+
function normalizeTemporalString(value, baseType, precision) {
|
|
1881
|
+
var trimmed = value.trim();
|
|
1882
|
+
if (!trimmed)
|
|
1883
|
+
return value;
|
|
1884
|
+
if (baseType === 'date') {
|
|
1885
|
+
if (MYSQL_DATE_REGEX.test(trimmed))
|
|
1886
|
+
return trimmed;
|
|
1887
|
+
var iso_1 = trimmed.match(ISO_DATETIME_REGEX);
|
|
1888
|
+
if (iso_1) {
|
|
1889
|
+
var datePart = iso_1[1], timezonePart = iso_1[4];
|
|
1890
|
+
if (!timezonePart)
|
|
1891
|
+
return datePart;
|
|
1892
|
+
var parsed_1 = new Date(trimmed);
|
|
1893
|
+
return Number.isNaN(parsed_1.getTime()) ? value : formatDateUtc(parsed_1);
|
|
1894
|
+
}
|
|
1895
|
+
var parsed_2 = new Date(trimmed);
|
|
1896
|
+
return Number.isNaN(parsed_2.getTime()) ? value : formatDateUtc(parsed_2);
|
|
1897
|
+
}
|
|
1898
|
+
if (baseType === 'time') {
|
|
1899
|
+
if (MYSQL_TIME_REGEX.test(trimmed))
|
|
1900
|
+
return trimFraction(trimmed, precision);
|
|
1901
|
+
var iso_2 = trimmed.match(ISO_DATETIME_REGEX);
|
|
1902
|
+
if (iso_2) {
|
|
1903
|
+
var timePart = iso_2[2], fractionPart = iso_2[3], timezonePart = iso_2[4];
|
|
1904
|
+
if (!timezonePart) {
|
|
1905
|
+
return "".concat(timePart).concat(normalizeFraction(fractionPart, precision));
|
|
1906
|
+
}
|
|
1907
|
+
var parsed_3 = new Date(trimmed);
|
|
1908
|
+
return Number.isNaN(parsed_3.getTime()) ? value : formatTimeUtc(parsed_3, precision);
|
|
1909
|
+
}
|
|
1910
|
+
var parsed_4 = new Date(trimmed);
|
|
1911
|
+
return Number.isNaN(parsed_4.getTime()) ? value : formatTimeUtc(parsed_4, precision);
|
|
1912
|
+
}
|
|
1913
|
+
if (baseType === 'year') {
|
|
1914
|
+
if (/^\d{2,4}$/.test(trimmed))
|
|
1915
|
+
return trimmed;
|
|
1916
|
+
var parsed_5 = new Date(trimmed);
|
|
1917
|
+
return Number.isNaN(parsed_5.getTime()) ? value : String(parsed_5.getUTCFullYear());
|
|
1918
|
+
}
|
|
1919
|
+
if (MYSQL_DATETIME_REGEX.test(trimmed))
|
|
1920
|
+
return trimFraction(trimmed, precision);
|
|
1921
|
+
var iso = trimmed.match(ISO_DATETIME_REGEX);
|
|
1922
|
+
if (iso) {
|
|
1923
|
+
var datePart = iso[1], timePart = iso[2], fractionPart = iso[3], timezonePart = iso[4];
|
|
1924
|
+
if (!timezonePart) {
|
|
1925
|
+
return "".concat(datePart, " ").concat(timePart).concat(normalizeFraction(fractionPart, precision));
|
|
1926
|
+
}
|
|
1927
|
+
var parsed_6 = new Date(trimmed);
|
|
1928
|
+
return Number.isNaN(parsed_6.getTime()) ? value : formatDateTimeUtc(parsed_6, precision);
|
|
1929
|
+
}
|
|
1930
|
+
var parsed = new Date(trimmed);
|
|
1931
|
+
return Number.isNaN(parsed.getTime()) ? value : formatDateTimeUtc(parsed, precision);
|
|
1932
|
+
}
|
|
1933
|
+
function convertTemporalIfNeeded(value, columnDef) {
|
|
1934
|
+
var _a = parseTemporalType(columnDef), baseType = _a.baseType, precision = _a.precision;
|
|
1935
|
+
if (!baseType)
|
|
1936
|
+
return value;
|
|
1937
|
+
if (value === null || value === undefined)
|
|
1938
|
+
return value;
|
|
1939
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer && Buffer.isBuffer(value))
|
|
1940
|
+
return value;
|
|
1941
|
+
if (value instanceof Date) {
|
|
1942
|
+
if (baseType === 'date')
|
|
1943
|
+
return formatDateUtc(value);
|
|
1944
|
+
if (baseType === 'time')
|
|
1945
|
+
return formatTimeUtc(value, precision);
|
|
1946
|
+
if (baseType === 'year')
|
|
1947
|
+
return String(value.getUTCFullYear());
|
|
1948
|
+
return formatDateTimeUtc(value, precision);
|
|
1949
|
+
}
|
|
1950
|
+
if (typeof value === 'number') {
|
|
1951
|
+
var parsed = parseEpochNumber(value);
|
|
1952
|
+
if (!parsed)
|
|
1953
|
+
return value;
|
|
1954
|
+
if (baseType === 'date')
|
|
1955
|
+
return formatDateUtc(parsed);
|
|
1956
|
+
if (baseType === 'time')
|
|
1957
|
+
return formatTimeUtc(parsed, precision);
|
|
1958
|
+
if (baseType === 'year')
|
|
1959
|
+
return String(parsed.getUTCFullYear());
|
|
1960
|
+
return formatDateTimeUtc(parsed, precision);
|
|
1961
|
+
}
|
|
1962
|
+
if (typeof value === 'string') {
|
|
1963
|
+
return normalizeTemporalString(value, baseType, precision);
|
|
1964
|
+
}
|
|
1965
|
+
return value;
|
|
1966
|
+
}
|
|
1967
|
+
function convertSqlValueForColumn(col, val, columnDef) {
|
|
1968
|
+
var binaryConverted = convertHexIfBinary(col, val, columnDef);
|
|
1969
|
+
return convertTemporalIfNeeded(binaryConverted, columnDef);
|
|
1970
|
+
}
|
|
1809
1971
|
|
|
1810
1972
|
// ========================
|
|
1811
1973
|
// SQL Operators & Expressions
|
|
@@ -2451,16 +2613,8 @@ var ConditionBuilder = /** @class */ (function (_super) {
|
|
|
2451
2613
|
Object.values(table.COLUMNS).includes(column));
|
|
2452
2614
|
};
|
|
2453
2615
|
ConditionBuilder.prototype.addParam = function (params, column, value) {
|
|
2454
|
-
var
|
|
2455
|
-
|
|
2456
|
-
var columnDef;
|
|
2457
|
-
if (typeof column === 'string' && column.includes('.')) {
|
|
2458
|
-
var _f = column.split('.', 2), tableName = _f[0], colName = _f[1];
|
|
2459
|
-
var table = (_b = (_a = this.config.C6) === null || _a === void 0 ? void 0 : _a.TABLES) === null || _b === void 0 ? void 0 : _b[tableName];
|
|
2460
|
-
// Support both short-keyed and fully-qualified TYPE_VALIDATION entries
|
|
2461
|
-
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)];
|
|
2462
|
-
}
|
|
2463
|
-
var val = convertHexIfBinary(column, value, columnDef);
|
|
2616
|
+
var columnDef = this.resolveColumnDefinition(column);
|
|
2617
|
+
var val = convertSqlValueForColumn(column, value, columnDef);
|
|
2464
2618
|
if (this.useNamedParams) {
|
|
2465
2619
|
var key = "param".concat(Object.keys(params).length);
|
|
2466
2620
|
params[key] = val;
|
|
@@ -3774,6 +3928,7 @@ function normalizeSingularRequest(requestMethod, request, restModel, removedPrim
|
|
|
3774
3928
|
return __assign(__assign({}, normalized), { dataInsertMultipleRows: dataInsertMultipleRows, cacheResults: cacheResults, skipReactBootstrap: skipReactBootstrap, fetchDependencies: fetchDependencies, debug: debug, success: success, error: error });
|
|
3775
3929
|
}
|
|
3776
3930
|
|
|
3931
|
+
var DEFAULT_NORMALIZER_CACHE_KEY = "__default__";
|
|
3777
3932
|
var allowListCache = new Map();
|
|
3778
3933
|
var ANSI_ESCAPE_REGEX = /\x1b\[[0-9;]*m/g;
|
|
3779
3934
|
var COLLAPSED_BIND_ROW_REGEX = /\(\?\s*×\d+\)/g;
|
|
@@ -3825,7 +3980,17 @@ var normalizeSql = function (sql) {
|
|
|
3825
3980
|
normalized = normalized.replace(/;\s*$/, "");
|
|
3826
3981
|
return normalized.replace(/\s+/g, " ").trim();
|
|
3827
3982
|
};
|
|
3828
|
-
var
|
|
3983
|
+
var normalizeSqlWith = function (sql, sqlQueryNormalizer) {
|
|
3984
|
+
var normalized = normalizeSql(sql);
|
|
3985
|
+
if (!sqlQueryNormalizer)
|
|
3986
|
+
return normalized;
|
|
3987
|
+
var customized = sqlQueryNormalizer(normalized);
|
|
3988
|
+
if (typeof customized !== "string") {
|
|
3989
|
+
throw new Error("sqlQueryNormalizer must return a string.");
|
|
3990
|
+
}
|
|
3991
|
+
return customized.replace(/\s+/g, " ").trim();
|
|
3992
|
+
};
|
|
3993
|
+
var parseAllowList = function (raw, sourcePath, sqlQueryNormalizer) {
|
|
3829
3994
|
var parsed;
|
|
3830
3995
|
try {
|
|
3831
3996
|
parsed = JSON.parse(raw);
|
|
@@ -3838,59 +4003,63 @@ var parseAllowList = function (raw, sourcePath) {
|
|
|
3838
4003
|
}
|
|
3839
4004
|
var sqlEntries = parsed
|
|
3840
4005
|
.filter(function (entry) { return typeof entry === "string"; })
|
|
3841
|
-
.map(
|
|
4006
|
+
.map(function (entry) { return normalizeSqlWith(entry, sqlQueryNormalizer); })
|
|
3842
4007
|
.filter(function (entry) { return entry.length > 0; });
|
|
3843
4008
|
if (sqlEntries.length !== parsed.length) {
|
|
3844
4009
|
throw new Error("SQL allowlist at ".concat(sourcePath, " must contain only string entries."));
|
|
3845
4010
|
}
|
|
3846
4011
|
return sqlEntries;
|
|
3847
4012
|
};
|
|
3848
|
-
var loadSqlAllowList = function (allowListPath) { return __awaiter(void 0, void 0, void 0, function () {
|
|
3849
|
-
var _a, readFile, stat, fileStat, cached, raw, sqlEntries, allowList;
|
|
3850
|
-
|
|
3851
|
-
|
|
4013
|
+
var loadSqlAllowList = function (allowListPath, sqlQueryNormalizer) { return __awaiter(void 0, void 0, void 0, function () {
|
|
4014
|
+
var _a, readFile, stat, fileStat, pathCache, cacheKey, cached, raw, sqlEntries, allowList;
|
|
4015
|
+
var _b;
|
|
4016
|
+
return __generator(this, function (_c) {
|
|
4017
|
+
switch (_c.label) {
|
|
3852
4018
|
case 0:
|
|
3853
4019
|
if (!isNode()) {
|
|
3854
4020
|
throw new Error("SQL allowlist validation requires a Node runtime.");
|
|
3855
4021
|
}
|
|
3856
4022
|
return [4 /*yield*/, import('node:fs/promises')];
|
|
3857
4023
|
case 1:
|
|
3858
|
-
_a =
|
|
3859
|
-
|
|
4024
|
+
_a = _c.sent(), readFile = _a.readFile, stat = _a.stat;
|
|
4025
|
+
_c.label = 2;
|
|
3860
4026
|
case 2:
|
|
3861
|
-
|
|
4027
|
+
_c.trys.push([2, 4, , 5]);
|
|
3862
4028
|
return [4 /*yield*/, stat(allowListPath)];
|
|
3863
4029
|
case 3:
|
|
3864
|
-
fileStat =
|
|
4030
|
+
fileStat = _c.sent();
|
|
3865
4031
|
return [3 /*break*/, 5];
|
|
3866
4032
|
case 4:
|
|
3867
|
-
|
|
4033
|
+
_c.sent();
|
|
3868
4034
|
throw new Error("SQL allowlist file not found at ".concat(allowListPath, "."));
|
|
3869
4035
|
case 5:
|
|
3870
|
-
|
|
4036
|
+
pathCache = (_b = allowListCache.get(allowListPath)) !== null && _b !== void 0 ? _b : new Map();
|
|
4037
|
+
cacheKey = sqlQueryNormalizer !== null && sqlQueryNormalizer !== void 0 ? sqlQueryNormalizer : DEFAULT_NORMALIZER_CACHE_KEY;
|
|
4038
|
+
cached = pathCache.get(cacheKey);
|
|
3871
4039
|
if (cached &&
|
|
3872
4040
|
cached.mtimeMs === fileStat.mtimeMs &&
|
|
3873
4041
|
cached.size === fileStat.size) {
|
|
3874
4042
|
return [2 /*return*/, cached.allowList];
|
|
3875
4043
|
}
|
|
3876
|
-
|
|
4044
|
+
_c.label = 6;
|
|
3877
4045
|
case 6:
|
|
3878
|
-
|
|
4046
|
+
_c.trys.push([6, 8, , 9]);
|
|
3879
4047
|
return [4 /*yield*/, readFile(allowListPath, "utf-8")];
|
|
3880
4048
|
case 7:
|
|
3881
|
-
raw =
|
|
4049
|
+
raw = _c.sent();
|
|
3882
4050
|
return [3 /*break*/, 9];
|
|
3883
4051
|
case 8:
|
|
3884
|
-
|
|
4052
|
+
_c.sent();
|
|
3885
4053
|
throw new Error("SQL allowlist file not found at ".concat(allowListPath, "."));
|
|
3886
4054
|
case 9:
|
|
3887
|
-
sqlEntries = parseAllowList(raw, allowListPath);
|
|
4055
|
+
sqlEntries = parseAllowList(raw, allowListPath, sqlQueryNormalizer);
|
|
3888
4056
|
allowList = new Set(sqlEntries);
|
|
3889
|
-
|
|
4057
|
+
pathCache.set(cacheKey, {
|
|
3890
4058
|
allowList: allowList,
|
|
3891
4059
|
mtimeMs: fileStat.mtimeMs,
|
|
3892
4060
|
size: fileStat.size,
|
|
3893
4061
|
});
|
|
4062
|
+
allowListCache.set(allowListPath, pathCache);
|
|
3894
4063
|
return [2 /*return*/, allowList];
|
|
3895
4064
|
}
|
|
3896
4065
|
});
|
|
@@ -3917,15 +4086,15 @@ var extractSqlEntries = function (payload) {
|
|
|
3917
4086
|
}
|
|
3918
4087
|
return [];
|
|
3919
4088
|
};
|
|
3920
|
-
var collectSqlAllowListEntries = function (payload, entries) {
|
|
4089
|
+
var collectSqlAllowListEntries = function (payload, entries, sqlQueryNormalizer) {
|
|
3921
4090
|
if (entries === void 0) { entries = new Set(); }
|
|
3922
4091
|
var sqlEntries = extractSqlEntries(payload)
|
|
3923
|
-
.map(
|
|
4092
|
+
.map(function (entry) { return normalizeSqlWith(entry, sqlQueryNormalizer); })
|
|
3924
4093
|
.filter(function (entry) { return entry.length > 0; });
|
|
3925
4094
|
sqlEntries.forEach(function (entry) { return entries.add(entry); });
|
|
3926
4095
|
return entries;
|
|
3927
4096
|
};
|
|
3928
|
-
var compileSqlAllowList = function (allowListPath, entries) { return __awaiter(void 0, void 0, void 0, function () {
|
|
4097
|
+
var compileSqlAllowList = function (allowListPath, entries, sqlQueryNormalizer) { return __awaiter(void 0, void 0, void 0, function () {
|
|
3929
4098
|
var _a, writeFile, mkdir, path, compiled;
|
|
3930
4099
|
return __generator(this, function (_b) {
|
|
3931
4100
|
switch (_b.label) {
|
|
@@ -3943,7 +4112,7 @@ var compileSqlAllowList = function (allowListPath, entries) { return __awaiter(v
|
|
|
3943
4112
|
case 3:
|
|
3944
4113
|
_b.sent();
|
|
3945
4114
|
compiled = Array.from(new Set(Array.from(entries)
|
|
3946
|
-
.map(
|
|
4115
|
+
.map(function (entry) { return normalizeSqlWith(entry, sqlQueryNormalizer); })
|
|
3947
4116
|
.filter(function (entry) { return entry.length > 0; }))).sort();
|
|
3948
4117
|
return [4 /*yield*/, writeFile(allowListPath, JSON.stringify(compiled, null, 2))];
|
|
3949
4118
|
case 4:
|
|
@@ -4796,7 +4965,7 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4796
4965
|
};
|
|
4797
4966
|
SqlExecutor.prototype.validateSqlAllowList = function (sql) {
|
|
4798
4967
|
return __awaiter(this, void 0, void 0, function () {
|
|
4799
|
-
var allowListPath, allowList, normalized;
|
|
4968
|
+
var allowListPath, sqlQueryNormalizer, allowList, normalized;
|
|
4800
4969
|
var _a;
|
|
4801
4970
|
return __generator(this, function (_b) {
|
|
4802
4971
|
switch (_b.label) {
|
|
@@ -4805,10 +4974,11 @@ var SqlExecutor = /** @class */ (function (_super) {
|
|
|
4805
4974
|
if (!allowListPath) {
|
|
4806
4975
|
return [2 /*return*/, "not verified"];
|
|
4807
4976
|
}
|
|
4808
|
-
|
|
4977
|
+
sqlQueryNormalizer = this.config.sqlQueryNormalizer;
|
|
4978
|
+
return [4 /*yield*/, loadSqlAllowList(allowListPath, sqlQueryNormalizer)];
|
|
4809
4979
|
case 1:
|
|
4810
4980
|
allowList = _b.sent();
|
|
4811
|
-
normalized =
|
|
4981
|
+
normalized = normalizeSqlWith(sql, sqlQueryNormalizer);
|
|
4812
4982
|
if (!allowList.has(normalized)) {
|
|
4813
4983
|
throw createSqlAllowListBlockedError({
|
|
4814
4984
|
tableName: typeof ((_a = this.config.restModel) === null || _a === void 0 ? void 0 : _a.TABLE_NAME) === "string"
|
|
@@ -5056,5 +5226,5 @@ function isVerbose() {
|
|
|
5056
5226
|
return resolveLogLevel() >= LogLevel.DEBUG;
|
|
5057
5227
|
}
|
|
5058
5228
|
|
|
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 };
|
|
5229
|
+
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, convertSqlValueForColumn, 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, normalizeSqlWith, 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 };
|
|
5060
5230
|
//# sourceMappingURL=index.esm.js.map
|