@carbonorm/carbonnode 6.0.9 → 6.0.12

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 (60) hide show
  1. package/dist/executors/SqlExecutor.d.ts +5 -0
  2. package/dist/handlers/ExpressHandler.d.ts +10 -3
  3. package/dist/index.cjs.js +170 -78
  4. package/dist/index.cjs.js.map +1 -1
  5. package/dist/index.esm.js +170 -79
  6. package/dist/index.esm.js.map +1 -1
  7. package/dist/types/ormInterfaces.d.ts +12 -2
  8. package/package.json +2 -1
  9. package/src/__tests__/sakila-db/C6.js +1 -1
  10. package/src/__tests__/sakila-db/C6.mysqldump.json +1 -1
  11. package/src/__tests__/sakila-db/C6.mysqldump.sql +1 -1
  12. package/src/__tests__/sakila-db/C6.ts +1 -1
  13. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.json +3 -3
  14. package/src/__tests__/sakila-db/sqlResponses/C6.actor.post.latest.json +3 -3
  15. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.json +1 -1
  16. package/src/__tests__/sakila-db/sqlResponses/C6.actor.put.lookup.json +3 -3
  17. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.json +5 -5
  18. package/src/__tests__/sakila-db/sqlResponses/C6.address.post.latest.json +5 -5
  19. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.json +1 -1
  20. package/src/__tests__/sakila-db/sqlResponses/C6.address.put.lookup.json +5 -5
  21. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.json +2 -2
  22. package/src/__tests__/sakila-db/sqlResponses/C6.category.post.latest.json +2 -2
  23. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.json +1 -1
  24. package/src/__tests__/sakila-db/sqlResponses/C6.category.put.lookup.json +2 -2
  25. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.json +2 -2
  26. package/src/__tests__/sakila-db/sqlResponses/C6.city.post.latest.json +2 -2
  27. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.json +1 -1
  28. package/src/__tests__/sakila-db/sqlResponses/C6.city.put.lookup.json +2 -2
  29. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.json +2 -2
  30. package/src/__tests__/sakila-db/sqlResponses/C6.country.post.latest.json +2 -2
  31. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.json +1 -1
  32. package/src/__tests__/sakila-db/sqlResponses/C6.country.put.lookup.json +2 -2
  33. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.json +5 -5
  34. package/src/__tests__/sakila-db/sqlResponses/C6.customer.post.latest.json +5 -5
  35. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.json +1 -1
  36. package/src/__tests__/sakila-db/sqlResponses/C6.customer.put.lookup.json +5 -5
  37. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.json +2 -2
  38. package/src/__tests__/sakila-db/sqlResponses/C6.film.post.latest.json +2 -2
  39. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.json +1 -1
  40. package/src/__tests__/sakila-db/sqlResponses/C6.film.put.lookup.json +2 -2
  41. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.json +1 -1
  42. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.post.latest.json +1 -1
  43. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.json +1 -1
  44. package/src/__tests__/sakila-db/sqlResponses/C6.inventory.put.lookup.json +1 -1
  45. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.json +2 -2
  46. package/src/__tests__/sakila-db/sqlResponses/C6.language.post.latest.json +2 -2
  47. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.json +1 -1
  48. package/src/__tests__/sakila-db/sqlResponses/C6.language.put.lookup.json +2 -2
  49. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.json +2 -2
  50. package/src/__tests__/sakila-db/sqlResponses/C6.payment.post.latest.json +2 -2
  51. package/src/__tests__/sakila-db/sqlResponses/C6.payment.put.lookup.json +2 -2
  52. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.json +3 -3
  53. package/src/__tests__/sakila-db/sqlResponses/C6.rental.post.latest.json +3 -3
  54. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.json +1 -1
  55. package/src/__tests__/sakila-db/sqlResponses/C6.rental.put.lookup.json +3 -3
  56. package/src/__tests__/sakila.generated.test.ts +11 -3
  57. package/src/__tests__/sqlExecutorLifecycleHooks.test.ts +122 -0
  58. package/src/executors/SqlExecutor.ts +190 -49
  59. package/src/handlers/ExpressHandler.ts +22 -7
  60. package/src/types/ormInterfaces.ts +16 -2
package/dist/index.esm.js CHANGED
@@ -2970,7 +2970,7 @@ function colorSql(sql) {
2970
2970
  return s;
2971
2971
  }
2972
2972
 
2973
- var version = "6.0.9";
2973
+ var version = "6.0.12";
2974
2974
 
2975
2975
  var DEFAULT_STEP = 8;
2976
2976
  function parseSemver(version) {
@@ -3491,12 +3491,18 @@ var SqlExecutor = /** @class */ (function (_super) {
3491
3491
  }
3492
3492
  SqlExecutor.prototype.execute = function () {
3493
3493
  return __awaiter(this, void 0, void 0, function () {
3494
- var TABLE_NAME, method, logContext, _a, rest, result, result, result;
3494
+ var TABLE_NAME, method, logContext, response, _a, rest, getResponse, restRows, result, result, result;
3495
3495
  return __generator(this, function (_b) {
3496
3496
  switch (_b.label) {
3497
3497
  case 0:
3498
3498
  TABLE_NAME = this.config.restModel.TABLE_NAME;
3499
3499
  method = this.config.requestMethod;
3500
+ return [4 /*yield*/, this.runLifecycleHooks("beforeProcessing", {
3501
+ config: this.config,
3502
+ request: this.request,
3503
+ })];
3504
+ case 1:
3505
+ _b.sent();
3500
3506
  // Normalize singular T-shaped requests into complex ORM shape (GET/PUT/DELETE)
3501
3507
  try {
3502
3508
  this.request = normalizeSingularRequest(method, this.request, this.config.restModel, undefined);
@@ -3510,45 +3516,54 @@ var SqlExecutor = /** @class */ (function (_super) {
3510
3516
  logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDE9 Request:", this.request);
3511
3517
  _a = method;
3512
3518
  switch (_a) {
3513
- case 'GET': return [3 /*break*/, 1];
3514
- case 'POST': return [3 /*break*/, 3];
3515
- case 'PUT': return [3 /*break*/, 6];
3516
- case 'DELETE': return [3 /*break*/, 9];
3519
+ case 'GET': return [3 /*break*/, 2];
3520
+ case 'POST': return [3 /*break*/, 4];
3521
+ case 'PUT': return [3 /*break*/, 7];
3522
+ case 'DELETE': return [3 /*break*/, 10];
3517
3523
  }
3518
- return [3 /*break*/, 12];
3519
- case 1: return [4 /*yield*/, this.runQuery()];
3520
- case 2:
3524
+ return [3 /*break*/, 13];
3525
+ case 2: return [4 /*yield*/, this.runQuery()];
3526
+ case 3:
3521
3527
  rest = _b.sent();
3522
3528
  if (this.config.reactBootstrap) {
3529
+ getResponse = rest;
3530
+ restRows = Array.isArray(getResponse.rest)
3531
+ ? getResponse.rest
3532
+ : [getResponse.rest];
3523
3533
  this.config.reactBootstrap.updateRestfulObjectArrays({
3524
- dataOrCallback: rest.rest,
3534
+ dataOrCallback: restRows,
3525
3535
  stateKey: this.config.restModel.TABLE_NAME,
3526
3536
  uniqueObjectId: this.config.restModel.PRIMARY_SHORT,
3527
3537
  });
3528
3538
  }
3529
- return [2 /*return*/, rest];
3530
- case 3: return [4 /*yield*/, this.runQuery()];
3531
- case 4:
3539
+ response = rest;
3540
+ return [3 /*break*/, 14];
3541
+ case 4: return [4 /*yield*/, this.runQuery()];
3542
+ case 5:
3532
3543
  result = _b.sent();
3533
3544
  return [4 /*yield*/, this.broadcastWebsocketIfConfigured(result)];
3534
- case 5:
3545
+ case 6:
3535
3546
  _b.sent();
3536
- return [2 /*return*/, result];
3537
- case 6: return [4 /*yield*/, this.runQuery()];
3538
- case 7:
3547
+ response = result;
3548
+ return [3 /*break*/, 14];
3549
+ case 7: return [4 /*yield*/, this.runQuery()];
3550
+ case 8:
3539
3551
  result = _b.sent();
3540
3552
  return [4 /*yield*/, this.broadcastWebsocketIfConfigured(result)];
3541
- case 8:
3553
+ case 9:
3542
3554
  _b.sent();
3543
- return [2 /*return*/, result];
3544
- case 9: return [4 /*yield*/, this.runQuery()];
3545
- case 10:
3555
+ response = result;
3556
+ return [3 /*break*/, 14];
3557
+ case 10: return [4 /*yield*/, this.runQuery()];
3558
+ case 11:
3546
3559
  result = _b.sent();
3547
3560
  return [4 /*yield*/, this.broadcastWebsocketIfConfigured(result)];
3548
- case 11:
3561
+ case 12:
3549
3562
  _b.sent();
3550
- return [2 /*return*/, result];
3551
- case 12: throw new Error("Unsupported request method: ".concat(method));
3563
+ response = result;
3564
+ return [3 /*break*/, 14];
3565
+ case 13: throw new Error("Unsupported request method: ".concat(method));
3566
+ case 14: return [2 /*return*/, response];
3552
3567
  }
3553
3568
  });
3554
3569
  });
@@ -3845,65 +3860,137 @@ var SqlExecutor = /** @class */ (function (_super) {
3845
3860
  };
3846
3861
  SqlExecutor.prototype.runQuery = function () {
3847
3862
  return __awaiter(this, void 0, void 0, function () {
3848
- var TABLE_NAME, method, builder, QueryResult, logContext, formatted, toUnnamed, _a, sql, values;
3863
+ var method, tableName, logContext, sqlExecution;
3849
3864
  var _this = this;
3850
- return __generator(this, function (_b) {
3851
- switch (_b.label) {
3865
+ return __generator(this, function (_a) {
3866
+ switch (_a.label) {
3852
3867
  case 0:
3853
- TABLE_NAME = this.config.restModel.TABLE_NAME;
3854
3868
  method = this.config.requestMethod;
3855
- switch (method) {
3856
- case 'GET':
3857
- builder = new SelectQueryBuilder(this.config, this.request);
3858
- break;
3859
- case 'PUT':
3860
- builder = new UpdateQueryBuilder(this.config, this.request);
3861
- break;
3862
- case 'DELETE':
3863
- builder = new DeleteQueryBuilder(this.config, this.request);
3864
- break;
3865
- case 'POST':
3866
- builder = new PostQueryBuilder(this.config, this.request);
3867
- break;
3868
- default:
3869
- throw new Error("Unsupported query method: ".concat(method));
3870
- }
3871
- QueryResult = builder.build(TABLE_NAME);
3869
+ tableName = this.config.restModel.TABLE_NAME;
3872
3870
  logContext = getLogContext(this.config, this.request);
3873
- logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(method.toUpperCase(), " SQL:"), QueryResult);
3874
- formatted = this.formatSQLWithParams(QueryResult.sql, QueryResult.params);
3875
- logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(method.toUpperCase(), " SQL:"), formatted);
3876
- toUnnamed = namedPlaceholders();
3877
- _a = toUnnamed(QueryResult.sql, QueryResult.params), sql = _a[0], values = _a[1];
3878
- return [4 /*yield*/, this.validateSqlAllowList(sql)];
3871
+ sqlExecution = this.buildSqlExecutionContext(method, tableName, logContext);
3872
+ return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
3873
+ return [2 /*return*/, this.executeQueryWithLifecycle(conn, method, sqlExecution, logContext)];
3874
+ }); }); })];
3875
+ case 1: return [2 /*return*/, _a.sent()];
3876
+ }
3877
+ });
3878
+ });
3879
+ };
3880
+ SqlExecutor.prototype.getQueryBuilder = function (method) {
3881
+ switch (method) {
3882
+ case C6Constants.GET:
3883
+ return new SelectQueryBuilder(this.config, this.request);
3884
+ case C6Constants.PUT:
3885
+ return new UpdateQueryBuilder(this.config, this.request);
3886
+ case C6Constants.DELETE:
3887
+ return new DeleteQueryBuilder(this.config, this.request);
3888
+ case C6Constants.POST:
3889
+ return new PostQueryBuilder(this.config, this.request);
3890
+ default:
3891
+ throw new Error("Unsupported query method: ".concat(method));
3892
+ }
3893
+ };
3894
+ SqlExecutor.prototype.buildSqlExecutionContext = function (method, tableName, logContext) {
3895
+ var builder = this.getQueryBuilder(method);
3896
+ var queryResult = builder.build(tableName);
3897
+ logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDE0 Generated ".concat(method.toUpperCase(), " SQL:"), queryResult);
3898
+ var formatted = this.formatSQLWithParams(queryResult.sql, queryResult.params);
3899
+ logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDE0 Formatted ".concat(method.toUpperCase(), " SQL:"), formatted);
3900
+ var toUnnamed = namedPlaceholders();
3901
+ var _a = toUnnamed(queryResult.sql, queryResult.params), sql = _a[0], values = _a[1];
3902
+ return { sql: sql, values: values };
3903
+ };
3904
+ SqlExecutor.prototype.createResponseFromQueryResult = function (method, result, sqlExecution, logContext) {
3905
+ if (method === C6Constants.GET) {
3906
+ return {
3907
+ rest: result.map(this.serialize),
3908
+ sql: { sql: sqlExecution.sql, values: sqlExecution.values },
3909
+ };
3910
+ }
3911
+ logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \u270F\uFE0F Rows affected:", result.affectedRows);
3912
+ return {
3913
+ affected: result.affectedRows,
3914
+ insertId: result.insertId,
3915
+ rest: [],
3916
+ sql: { sql: sqlExecution.sql, values: sqlExecution.values },
3917
+ };
3918
+ };
3919
+ SqlExecutor.prototype.createLifecycleHookResponse = function (response) {
3920
+ var data = Object.assign({ success: true }, response);
3921
+ return { data: data };
3922
+ };
3923
+ SqlExecutor.prototype.executeQueryWithLifecycle = function (conn, method, sqlExecution, logContext) {
3924
+ return __awaiter(this, void 0, void 0, function () {
3925
+ var useTransaction, committed, result, response, hookResponse, err_1, rollbackErr_1;
3926
+ return __generator(this, function (_a) {
3927
+ switch (_a.label) {
3928
+ case 0:
3929
+ useTransaction = method !== C6Constants.GET;
3930
+ committed = false;
3931
+ _a.label = 1;
3879
3932
  case 1:
3880
- _b.sent();
3881
- return [4 /*yield*/, this.withConnection(function (conn) { return __awaiter(_this, void 0, void 0, function () {
3882
- var result;
3883
- return __generator(this, function (_a) {
3884
- switch (_a.label) {
3885
- case 0: return [4 /*yield*/, conn.query(sql, values)];
3886
- case 1:
3887
- result = (_a.sent())[0];
3888
- if (method === 'GET') {
3889
- return [2 /*return*/, {
3890
- rest: result.map(this.serialize),
3891
- sql: { sql: sql, values: values }
3892
- }];
3893
- }
3894
- else {
3895
- logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \u270F\uFE0F Rows affected:", result.affectedRows);
3896
- return [2 /*return*/, {
3897
- affected: result.affectedRows,
3898
- insertId: result.insertId,
3899
- rest: [], // TODO - remove rest empty array from non-GET responses?
3900
- sql: { sql: sql, values: values }
3901
- }];
3902
- }
3903
- }
3904
- });
3905
- }); })];
3906
- case 2: return [2 /*return*/, _b.sent()];
3933
+ _a.trys.push([1, 11, , 16]);
3934
+ if (!useTransaction) return [3 /*break*/, 3];
3935
+ logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDFE Beginning transaction");
3936
+ return [4 /*yield*/, conn.beginTransaction()];
3937
+ case 2:
3938
+ _a.sent();
3939
+ _a.label = 3;
3940
+ case 3: return [4 /*yield*/, this.validateSqlAllowList(sqlExecution.sql)];
3941
+ case 4:
3942
+ _a.sent();
3943
+ return [4 /*yield*/, this.runLifecycleHooks("beforeExecution", {
3944
+ config: this.config,
3945
+ request: this.request,
3946
+ sqlExecution: sqlExecution,
3947
+ })];
3948
+ case 5:
3949
+ _a.sent();
3950
+ return [4 /*yield*/, conn.query(sqlExecution.sql, sqlExecution.values)];
3951
+ case 6:
3952
+ result = (_a.sent())[0];
3953
+ response = this.createResponseFromQueryResult(method, result, sqlExecution, logContext);
3954
+ hookResponse = this.createLifecycleHookResponse(response);
3955
+ return [4 /*yield*/, this.runLifecycleHooks("afterExecution", {
3956
+ config: this.config,
3957
+ request: this.request,
3958
+ response: hookResponse,
3959
+ })];
3960
+ case 7:
3961
+ _a.sent();
3962
+ if (!useTransaction) return [3 /*break*/, 9];
3963
+ return [4 /*yield*/, conn.commit()];
3964
+ case 8:
3965
+ _a.sent();
3966
+ committed = true;
3967
+ logWithLevel(LogLevel.DEBUG, logContext, console.log, "[SQL EXECUTOR] \uD83E\uDDFE Transaction committed");
3968
+ _a.label = 9;
3969
+ case 9: return [4 /*yield*/, this.runLifecycleHooks("afterCommit", {
3970
+ config: this.config,
3971
+ request: this.request,
3972
+ response: hookResponse,
3973
+ })];
3974
+ case 10:
3975
+ _a.sent();
3976
+ return [2 /*return*/, response];
3977
+ case 11:
3978
+ err_1 = _a.sent();
3979
+ if (!(useTransaction && !committed)) return [3 /*break*/, 15];
3980
+ _a.label = 12;
3981
+ case 12:
3982
+ _a.trys.push([12, 14, , 15]);
3983
+ return [4 /*yield*/, conn.rollback()];
3984
+ case 13:
3985
+ _a.sent();
3986
+ logWithLevel(LogLevel.WARN, logContext, console.warn, "[SQL EXECUTOR] \uD83E\uDDFE Transaction rolled back");
3987
+ return [3 /*break*/, 15];
3988
+ case 14:
3989
+ rollbackErr_1 = _a.sent();
3990
+ logWithLevel(LogLevel.ERROR, logContext, console.error, "[SQL EXECUTOR] Rollback failed", rollbackErr_1);
3991
+ return [3 /*break*/, 15];
3992
+ case 15: throw err_1;
3993
+ case 16: return [2 /*return*/];
3907
3994
  }
3908
3995
  });
3909
3996
  });
@@ -3938,6 +4025,10 @@ var SqlExecutor$1 = /*#__PURE__*/Object.freeze({
3938
4025
  SqlExecutor: SqlExecutor
3939
4026
  });
3940
4027
 
4028
+ function restExpressRequest(_a) {
4029
+ var router = _a.router, _b = _a.routePath, routePath = _b === void 0 ? "/rest/:table{/:primary}" : _b, handlerConfig = __rest(_a, ["router", "routePath"]);
4030
+ router.all(routePath, ExpressHandler(handlerConfig));
4031
+ }
3941
4032
  // TODO - WE MUST make this a generic - optional, but helpful
3942
4033
  // note sure how it would help anyone actually...
3943
4034
  function ExpressHandler(_a) {
@@ -4152,5 +4243,5 @@ function isVerbose() {
4152
4243
  return resolveLogLevel() >= LogLevel.DEBUG;
4153
4244
  }
4154
4245
 
4155
- 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, 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, restOrm, restRequest, setCache, setToastHandler, shouldLog, sortAndSerializeQueryObject, stContains, timeout, toastOptions, toastOptionsDevs, userCustomClearCache, versionToRgb as versionColor, warn };
4246
+ 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, 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 };
4156
4247
  //# sourceMappingURL=index.esm.js.map