@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.
Files changed (65) hide show
  1. package/README.md +509 -292
  2. package/dist/index.cjs.js +209 -37
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.esm.js +208 -38
  5. package/dist/index.esm.js.map +1 -1
  6. package/dist/orm/utils/sqlUtils.d.ts +1 -0
  7. package/dist/types/ormInterfaces.d.ts +1 -0
  8. package/dist/utils/sqlAllowList.d.ts +5 -3
  9. package/package.json +1 -1
  10. package/src/__tests__/fixtures/c6.fixture.ts +33 -0
  11. package/src/__tests__/sakila-db/C6.js +1 -1
  12. package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
  13. package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
  14. package/src/__tests__/sakila-db/C6.ts +1 -1
  15. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +6 -6
  16. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
  17. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
  18. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
  19. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +10 -10
  20. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
  21. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
  22. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
  23. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +4 -4
  24. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
  25. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
  26. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
  27. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +4 -4
  28. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
  29. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
  30. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
  31. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +4 -4
  32. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
  33. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
  34. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
  35. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +10 -10
  36. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
  37. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
  38. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
  39. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +4 -4
  40. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
  41. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
  42. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
  43. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +2 -2
  44. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
  45. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
  46. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
  47. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +4 -4
  48. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
  49. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
  50. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
  51. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +4 -4
  52. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
  53. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
  54. package/src/__tests__/sakila-db/sqlResponses/C6.rental.join.json +10 -10
  55. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +6 -6
  56. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
  57. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
  58. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
  59. package/src/__tests__/sqlAllowList.test.ts +56 -1
  60. package/src/__tests__/sqlBuilders.test.ts +38 -1
  61. package/src/executors/SqlExecutor.ts +4 -3
  62. package/src/orm/builders/ConditionBuilder.ts +3 -10
  63. package/src/orm/utils/sqlUtils.ts +172 -4
  64. package/src/types/ormInterfaces.ts +1 -0
  65. 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.0";
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 _a, _b, _c, _d, _e;
2455
- // Determine column definition from C6.TABLES to support type-aware conversions (e.g., BINARY hex -> Buffer)
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 parseAllowList = function (raw, sourcePath) {
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(normalizeSql)
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
- return __generator(this, function (_b) {
3851
- switch (_b.label) {
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 = _b.sent(), readFile = _a.readFile, stat = _a.stat;
3859
- _b.label = 2;
4024
+ _a = _c.sent(), readFile = _a.readFile, stat = _a.stat;
4025
+ _c.label = 2;
3860
4026
  case 2:
3861
- _b.trys.push([2, 4, , 5]);
4027
+ _c.trys.push([2, 4, , 5]);
3862
4028
  return [4 /*yield*/, stat(allowListPath)];
3863
4029
  case 3:
3864
- fileStat = _b.sent();
4030
+ fileStat = _c.sent();
3865
4031
  return [3 /*break*/, 5];
3866
4032
  case 4:
3867
- _b.sent();
4033
+ _c.sent();
3868
4034
  throw new Error("SQL allowlist file not found at ".concat(allowListPath, "."));
3869
4035
  case 5:
3870
- cached = allowListCache.get(allowListPath);
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
- _b.label = 6;
4044
+ _c.label = 6;
3877
4045
  case 6:
3878
- _b.trys.push([6, 8, , 9]);
4046
+ _c.trys.push([6, 8, , 9]);
3879
4047
  return [4 /*yield*/, readFile(allowListPath, "utf-8")];
3880
4048
  case 7:
3881
- raw = _b.sent();
4049
+ raw = _c.sent();
3882
4050
  return [3 /*break*/, 9];
3883
4051
  case 8:
3884
- _b.sent();
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
- allowListCache.set(allowListPath, {
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(normalizeSql)
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(normalizeSql)
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
- return [4 /*yield*/, loadSqlAllowList(allowListPath)];
4977
+ sqlQueryNormalizer = this.config.sqlQueryNormalizer;
4978
+ return [4 /*yield*/, loadSqlAllowList(allowListPath, sqlQueryNormalizer)];
4809
4979
  case 1:
4810
4980
  allowList = _b.sent();
4811
- normalized = normalizeSql(sql);
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