@carbonorm/carbonnode 6.0.17 → 6.0.19

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/dist/index.cjs.js +58 -7
  2. package/dist/index.cjs.js.map +1 -1
  3. package/dist/index.esm.js +58 -8
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/types/ormInterfaces.d.ts +1 -0
  6. package/dist/utils/cacheManager.d.ts +1 -0
  7. package/dist/utils/logSql.d.ts +1 -1
  8. package/package.json +2 -2
  9. package/src/__tests__/cacheManager.test.ts +27 -1
  10. package/src/__tests__/httpExecutor.cacheEviction.test.ts +70 -0
  11. package/src/__tests__/logSql.test.ts +16 -0
  12. package/src/__tests__/sakila-db/C6.js +1 -1
  13. package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
  14. package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
  15. package/src/__tests__/sakila-db/C6.ts +1 -1
  16. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +3 -3
  17. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
  18. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
  19. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
  20. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +5 -5
  21. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
  22. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
  23. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
  24. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +2 -2
  25. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
  26. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
  27. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
  28. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +2 -2
  29. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
  30. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
  31. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
  32. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +2 -2
  33. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
  34. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
  35. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
  36. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +5 -5
  37. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
  38. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
  39. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
  40. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +2 -2
  41. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
  42. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
  43. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
  44. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +1 -1
  45. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
  46. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
  47. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
  48. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +2 -2
  49. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
  50. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
  51. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
  52. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +2 -2
  53. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
  54. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
  55. package/src/__tests__/sakila-db/sqlResponses/C6.rental.join.json +10 -10
  56. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +3 -3
  57. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
  58. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
  59. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
  60. package/src/__tests__/sqlExecutor.cacheEviction.test.ts +79 -0
  61. package/src/executors/HttpExecutor.ts +19 -3
  62. package/src/executors/SqlExecutor.ts +23 -5
  63. package/src/types/ormInterfaces.ts +4 -1
  64. package/src/utils/cacheManager.ts +25 -1
  65. package/src/utils/logSql.ts +3 -1
package/dist/index.cjs.js CHANGED
@@ -954,7 +954,7 @@ function colorSql(sql) {
954
954
  return s;
955
955
  }
956
956
 
957
- var version = "6.0.17";
957
+ var version = "6.0.19";
958
958
 
959
959
  var DEFAULT_STEP = 8;
960
960
  function parseSemver(version) {
@@ -1040,6 +1040,8 @@ var cacheLabel = function (cacheStatus) {
1040
1040
  switch (cacheStatus) {
1041
1041
  case "hit":
1042
1042
  return "".concat(C.METHOD_COLORS.SELECT, "[CACHE HIT]").concat(C.RESET);
1043
+ case "evicted":
1044
+ return "".concat(C.WARN, "[CACHE EVICTED]").concat(C.RESET);
1043
1045
  case "ignored":
1044
1046
  return "".concat(C.WARN, "[CACHE IGNORED]").concat(C.RESET);
1045
1047
  default:
@@ -1117,7 +1119,6 @@ function checkCache(method, tableName, requestData, logContext) {
1117
1119
  var key = makeCacheKey(method, tableName, requestData);
1118
1120
  var cached = apiRequestCache.get(key);
1119
1121
  if (!cached) {
1120
- console.log('apiRequestCache.size', apiRequestCache.size);
1121
1122
  return false;
1122
1123
  }
1123
1124
  if (shouldLog(exports.LogLevel.INFO, logContext)) {
@@ -1140,6 +1141,24 @@ function setCache(method, tableName, requestData, cacheEntry) {
1140
1141
  var key = makeCacheKey(method, tableName, requestData);
1141
1142
  apiRequestCache.set(key, cacheEntry);
1142
1143
  }
1144
+ function evictCacheEntry(method, tableName, requestData, logContext) {
1145
+ var _a, _b, _c, _d, _e;
1146
+ var key = makeCacheKey(method, tableName, requestData);
1147
+ var cached = apiRequestCache.get(key);
1148
+ var deleted = apiRequestCache.delete(key);
1149
+ if (deleted && shouldLog(exports.LogLevel.INFO, logContext)) {
1150
+ var sql = (_d = (_c = (_b = (_a = cached === null || cached === void 0 ? void 0 : cached.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.sql) === null || _c === void 0 ? void 0 : _c.sql) !== null && _d !== void 0 ? _d : "";
1151
+ var sqlMethod = ((_e = sql.trim().split(/\s+/, 1)[0]) === null || _e === void 0 ? void 0 : _e.toUpperCase()) || method;
1152
+ logSql({
1153
+ allowListStatus: "not verified",
1154
+ cacheStatus: "evicted",
1155
+ context: logContext,
1156
+ method: sqlMethod,
1157
+ sql: sql,
1158
+ });
1159
+ }
1160
+ return deleted;
1161
+ }
1143
1162
 
1144
1163
  function sortAndSerializeQueryObject(tables, query) {
1145
1164
  var orderedQuery = Object.keys(query).sort().reduce(function (obj, key) {
@@ -1265,7 +1284,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1265
1284
  }
1266
1285
  query = this.request;
1267
1286
  apiRequest = function () { return tslib.__awaiter(_this, void 0, void 0, function () {
1268
- var _a, debug, _b, cacheResults, dataInsertMultipleRows, success, _c, fetchDependencies, _d, error, cachingConfirmed, cacheRequestData, querySerialized, cachedRequest, apiResponse, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKeyList, primaryKeyFullyQualified, primaryKey, whereVal, whereIsEmpty, providedPrimary, primaryVal, axiosActiveRequest_1;
1287
+ var _a, debug, _b, cacheResults, dataInsertMultipleRows, success, _c, fetchDependencies, _d, error, cachingConfirmed, cacheRequestData, evictFromCache, querySerialized, cachedRequest, cachedData, apiResponse, restRequestUri, needsConditionOrPrimaryCheck, TABLES, primaryKeyList, primaryKeyFullyQualified, primaryKey, whereVal, whereIsEmpty, providedPrimary, primaryVal, axiosActiveRequest_1;
1269
1288
  var _e;
1270
1289
  var _this = this;
1271
1290
  var _f, _g, _h, _j, _k, _l;
@@ -1295,6 +1314,9 @@ var HttpExecutor = /** @class */ (function (_super) {
1295
1314
  query[C6.PAGINATION][C6.LIMIT] = query[C6.PAGINATION][C6.LIMIT] || 100;
1296
1315
  }
1297
1316
  cacheRequestData = JSON.parse(JSON.stringify(query !== null && query !== void 0 ? query : {}));
1317
+ evictFromCache = requestMethod === GET && cacheResults
1318
+ ? function () { return evictCacheEntry(requestMethod, tableName, cacheRequestData, logContext); }
1319
+ : undefined;
1298
1320
  querySerialized = sortAndSerializeQueryObject(tables, cacheRequestData !== null && cacheRequestData !== void 0 ? cacheRequestData : {});
1299
1321
  cachedRequest = false;
1300
1322
  if (cacheResults) {
@@ -1302,7 +1324,15 @@ var HttpExecutor = /** @class */ (function (_super) {
1302
1324
  }
1303
1325
  if (!cachedRequest) return [3 /*break*/, 2];
1304
1326
  return [4 /*yield*/, cachedRequest];
1305
- case 1: return [2 /*return*/, (_m.sent()).data];
1327
+ case 1:
1328
+ cachedData = (_m.sent()).data;
1329
+ if (evictFromCache
1330
+ && cachedData
1331
+ && typeof cachedData === "object"
1332
+ && Array.isArray(cachedData.rest)) {
1333
+ cachedData.evictFromCache = evictFromCache;
1334
+ }
1335
+ return [2 /*return*/, cachedData];
1306
1336
  case 2:
1307
1337
  if (cacheResults) {
1308
1338
  cachingConfirmed = true;
@@ -1493,7 +1523,7 @@ var HttpExecutor = /** @class */ (function (_super) {
1493
1523
  else {
1494
1524
  callback();
1495
1525
  }
1496
- if (!(C6.GET === requestMethod && this.isRestResponse(response))) return [3 /*break*/, 2];
1526
+ if (!(requestMethod === GET && this.isRestResponse(response))) return [3 /*break*/, 2];
1497
1527
  responseData_1 = response.data;
1498
1528
  pageLimit = (_a = query === null || query === void 0 ? void 0 : query[C6.PAGINATION]) === null || _a === void 0 ? void 0 : _a[C6.LIMIT];
1499
1529
  got = responseData_1.rest.length;
@@ -1504,6 +1534,9 @@ var HttpExecutor = /** @class */ (function (_super) {
1504
1534
  else {
1505
1535
  responseData_1.next = undefined; // short page => done
1506
1536
  }
1537
+ if (cachingConfirmed && evictFromCache) {
1538
+ responseData_1.evictFromCache = evictFromCache;
1539
+ }
1507
1540
  if (cachingConfirmed) {
1508
1541
  setCache(requestMethod, tableName, cacheRequestData, {
1509
1542
  requestArgumentsSerialized: querySerialized,
@@ -4070,7 +4103,7 @@ var SqlExecutor = /** @class */ (function (_super) {
4070
4103
  };
4071
4104
  SqlExecutor.prototype.runQuery = function () {
4072
4105
  return tslib.__awaiter(this, void 0, void 0, function () {
4073
- var method, tableName, logContext, cacheResults, cacheRequestData, requestArgumentsSerialized, cachedRequest, sqlExecution, sqlMethod, queryPromise, cacheRequest, cacheResponse;
4106
+ var method, tableName, logContext, cacheResults, cacheRequestData, requestArgumentsSerialized, evictFromCache, cachedRequest, cachedData, sqlExecution, sqlMethod, queryPromise, cacheRequest, cacheResponse;
4074
4107
  var _this = this;
4075
4108
  var _a, _b;
4076
4109
  return tslib.__generator(this, function (_c) {
@@ -4087,11 +4120,22 @@ var SqlExecutor = /** @class */ (function (_super) {
4087
4120
  requestArgumentsSerialized = cacheResults
4088
4121
  ? sortAndSerializeQueryObject(tableName, cacheRequestData !== null && cacheRequestData !== void 0 ? cacheRequestData : {})
4089
4122
  : undefined;
4123
+ evictFromCache = method === C6Constants.GET && cacheResults && cacheRequestData
4124
+ ? function () { return evictCacheEntry(method, tableName, cacheRequestData, logContext); }
4125
+ : undefined;
4090
4126
  if (!cacheResults) return [3 /*break*/, 2];
4091
4127
  cachedRequest = checkCache(method, tableName, cacheRequestData, logContext);
4092
4128
  if (!cachedRequest) return [3 /*break*/, 2];
4093
4129
  return [4 /*yield*/, cachedRequest];
4094
- case 1: return [2 /*return*/, (_c.sent()).data];
4130
+ case 1:
4131
+ cachedData = (_c.sent()).data;
4132
+ if (evictFromCache
4133
+ && cachedData
4134
+ && typeof cachedData === "object"
4135
+ && Array.isArray(cachedData.rest)) {
4136
+ cachedData.evictFromCache = evictFromCache;
4137
+ }
4138
+ return [2 /*return*/, cachedData];
4095
4139
  case 2:
4096
4140
  sqlExecution = this.buildSqlExecutionContext(method, tableName, logContext);
4097
4141
  sqlMethod = this.resolveSqlLogMethod(method, sqlExecution.sql);
@@ -4105,6 +4149,12 @@ var SqlExecutor = /** @class */ (function (_super) {
4105
4149
  case 3: return [2 /*return*/, _c.sent()];
4106
4150
  case 4:
4107
4151
  cacheRequest = queryPromise.then(function (data) {
4152
+ if (evictFromCache
4153
+ && data
4154
+ && typeof data === "object"
4155
+ && Array.isArray(data.rest)) {
4156
+ data.evictFromCache = evictFromCache;
4157
+ }
4108
4158
  return _this.createCacheResponseEnvelope(method, tableName, data);
4109
4159
  });
4110
4160
  setCache(method, tableName, cacheRequestData, {
@@ -4576,6 +4626,7 @@ exports.derivedTable = derivedTable;
4576
4626
  exports.determineRuntimeJsType = determineRuntimeJsType;
4577
4627
  exports.distSphere = distSphere;
4578
4628
  exports.error = error;
4629
+ exports.evictCacheEntry = evictCacheEntry;
4579
4630
  exports.extractSqlEntries = extractSqlEntries;
4580
4631
  exports.fieldEq = fieldEq;
4581
4632
  exports.getEnv = getEnv;