@stemy/backend 5.1.0 → 5.2.0

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 (32) hide show
  1. package/common-types.d.ts +37 -17
  2. package/esm2020/common-types.mjs +3 -1
  3. package/esm2020/public_api.mjs +10 -3
  4. package/esm2020/rest-middlewares/error-handler.middleware.mjs +4 -4
  5. package/esm2020/services/assets.mjs +19 -12
  6. package/esm2020/services/backend-provider.mjs +5 -5
  7. package/esm2020/services/drivers/asset-grid.driver.mjs +25 -0
  8. package/esm2020/services/entities/asset.mjs +23 -10
  9. package/esm2020/services/entities/base-entity.mjs +8 -8
  10. package/esm2020/services/entities/lazy-asset.mjs +11 -12
  11. package/esm2020/services/entities/progress.mjs +17 -17
  12. package/esm2020/services/entities/temp-asset.mjs +4 -4
  13. package/esm2020/services/mail-sender.mjs +4 -4
  14. package/esm2020/services/mongo-connector.mjs +5 -11
  15. package/esm2020/services/open-api.mjs +6 -6
  16. package/esm2020/utilities/base-doc.mjs +1 -1
  17. package/esm2020/utilities/di-container.mjs +7 -7
  18. package/esm2020/utilities/lazy-asset-generator.mjs +6 -6
  19. package/esm2020/utilities/tree.mjs +4 -4
  20. package/fesm2015/stemy-backend.mjs +134 -91
  21. package/fesm2015/stemy-backend.mjs.map +1 -1
  22. package/fesm2020/stemy-backend.mjs +133 -90
  23. package/fesm2020/stemy-backend.mjs.map +1 -1
  24. package/package.json +1 -1
  25. package/public_api.d.ts +1 -1
  26. package/services/assets.d.ts +4 -4
  27. package/services/drivers/asset-grid.driver.d.ts +11 -0
  28. package/services/entities/asset.d.ts +4 -4
  29. package/services/entities/base-entity.d.ts +2 -2
  30. package/services/mongo-connector.d.ts +1 -3
  31. package/utilities/base-doc.d.ts +3 -3
  32. package/utils.d.ts +1 -1
@@ -15,7 +15,7 @@ import { exec } from 'child_process';
15
15
  import { createHash } from 'crypto';
16
16
  import { Subscription, Observable, Subject, from, BehaviorSubject } from 'rxjs';
17
17
  import { canReportError } from 'rxjs/internal/util/canReportError';
18
- import { ObjectId, GridFSBucket } from 'mongodb';
18
+ import { ObjectId } from 'mongodb';
19
19
  import mongoose from 'mongoose';
20
20
  import { Readable, PassThrough } from 'stream';
21
21
  import fileType from 'file-type/core';
@@ -37,6 +37,7 @@ import * as Handlebars from 'handlebars';
37
37
  import { CommandsAddon, AnsiCodes } from '@stemy/terminal-commands-addon';
38
38
  import { compare } from 'bcrypt';
39
39
  import moment from 'moment';
40
+ import { GridFSBucket } from 'mongodb/lib/gridfs';
40
41
  import { getModelForClass } from '@typegoose/typegoose';
41
42
  import { getValue as getValue$1, setValue } from 'mongoose/lib/utils';
42
43
 
@@ -53,6 +54,8 @@ const SOCKET_CONTROLLERS = Symbol.for("socket-controllers-token");
53
54
  const PARAMETER = Symbol.for("parameter-token");
54
55
  const DI_CONTAINER = Symbol.for("di-container-token");
55
56
  const OPENAPI_VALIDATION = Symbol.for("openapi-validation-token");
57
+ const LOCAL_DIR = Symbol.for('asset-local-dir');
58
+ const ASSET_DRIVER = Symbol.for('assets-driver');
56
59
  class Parameter {
57
60
  constructor(name, defaultValue, resolver = null) {
58
61
  this.name = name;
@@ -941,20 +944,16 @@ Configuration = __decorate([
941
944
  ], Configuration);
942
945
 
943
946
  let MongoConnector = class MongoConnector {
944
- constructor(configuration) {
945
- this.configuration = configuration;
946
- this.conn = null;
947
- this.db = null;
948
- this.fsBucket = null;
949
- }
950
947
  get connection() {
951
948
  return this.conn;
952
949
  }
953
950
  get database() {
954
951
  return this.db;
955
952
  }
956
- get bucket() {
957
- return this.fsBucket;
953
+ constructor(configuration) {
954
+ this.configuration = configuration;
955
+ this.conn = null;
956
+ this.db = null;
958
957
  }
959
958
  connect() {
960
959
  return __awaiter(this, void 0, void 0, function* () {
@@ -966,7 +965,6 @@ let MongoConnector = class MongoConnector {
966
965
  pass: this.configuration.resolve("mongoPassword")
967
966
  })).connection;
968
967
  this.db = this.conn.db;
969
- this.fsBucket = new GridFSBucket(this.db, { bucketName: "assets" });
970
968
  });
971
969
  }
972
970
  };
@@ -976,20 +974,20 @@ MongoConnector = __decorate([
976
974
  ], MongoConnector);
977
975
 
978
976
  class BaseEntity {
979
- constructor(mId, data, collection) {
980
- this.mId = mId;
977
+ get id() {
978
+ return this.oid.toHexString();
979
+ }
980
+ constructor(oid, data, collection) {
981
+ this.oid = oid;
981
982
  this.data = data;
982
983
  this.collection = collection;
983
984
  }
984
- get id() {
985
- return this.mId.toHexString();
986
- }
987
985
  save() {
988
- return this.collection.updateOne({ _id: this.mId }, { $set: this.toJSON() });
986
+ return this.collection.updateOne({ _id: this.oid }, { $set: this.toJSON() }, { upsert: true });
989
987
  }
990
988
  load() {
991
989
  return __awaiter(this, void 0, void 0, function* () {
992
- const res = yield this.collection.findOne({ _id: this.mId });
990
+ const res = yield this.collection.findOne({ _id: this.oid });
993
991
  this.deleted = !res;
994
992
  this.data = res || {};
995
993
  return this;
@@ -1006,10 +1004,6 @@ class BaseEntity {
1006
1004
  }
1007
1005
 
1008
1006
  class Asset extends BaseEntity {
1009
- constructor(id, data, collection, bucket) {
1010
- super(id, data, collection);
1011
- this.bucket = bucket;
1012
- }
1013
1007
  get filename() {
1014
1008
  return this.data.filename;
1015
1009
  }
@@ -1020,17 +1014,34 @@ class Asset extends BaseEntity {
1020
1014
  return this.data.metadata;
1021
1015
  }
1022
1016
  get stream() {
1023
- return this.bucket.openDownloadStream(this.mId);
1017
+ return this.driver.openDownloadStream(this.oid);
1018
+ }
1019
+ constructor(id, data, collection, driver) {
1020
+ super(id, data, collection);
1021
+ this.driver = driver;
1024
1022
  }
1025
1023
  unlink() {
1026
1024
  return __awaiter(this, void 0, void 0, function* () {
1027
- return deleteFromBucket(this.bucket, this.mId);
1025
+ try {
1026
+ yield this.driver.delete(this.oid);
1027
+ yield this.collection.deleteOne({ _id: this.oid });
1028
+ }
1029
+ catch (error) {
1030
+ let err = error;
1031
+ if (error) {
1032
+ err = error.message || error || "";
1033
+ if (!isString(err) || !err.startsWith("FileNotFound")) {
1034
+ throw err;
1035
+ }
1036
+ }
1037
+ }
1038
+ return this.id;
1028
1039
  });
1029
1040
  }
1030
1041
  setMeta(metadata) {
1031
1042
  return __awaiter(this, void 0, void 0, function* () {
1032
1043
  metadata = Object.assign(this.metadata, metadata || {});
1033
- yield this.collection.updateOne({ _id: this.mId }, { $set: { metadata } });
1044
+ yield this.collection.updateOne({ _id: this.oid }, { $set: { metadata } });
1034
1045
  });
1035
1046
  }
1036
1047
  getBuffer() {
@@ -1044,7 +1055,7 @@ class Asset extends BaseEntity {
1044
1055
  : metadata.downloadCount + 1;
1045
1056
  metadata.firstDownload = metadata.firstDownload || new Date();
1046
1057
  metadata.lastDownload = new Date();
1047
- yield this.collection.updateOne({ _id: this.mId }, { $set: { metadata } });
1058
+ yield this.collection.updateOne({ _id: this.oid }, { $set: { metadata } });
1048
1059
  return this.stream;
1049
1060
  });
1050
1061
  }
@@ -1061,6 +1072,9 @@ class Asset extends BaseEntity {
1061
1072
  }
1062
1073
 
1063
1074
  class TempAsset {
1075
+ get stream() {
1076
+ return bufferToStream(this.buffer);
1077
+ }
1064
1078
  constructor(buffer, filename, contentType, metadata) {
1065
1079
  this.buffer = buffer;
1066
1080
  this.filename = filename;
@@ -1068,9 +1082,6 @@ class TempAsset {
1068
1082
  this.metadata = metadata;
1069
1083
  this.id = new ObjectId$1().toHexString();
1070
1084
  }
1071
- get stream() {
1072
- return bufferToStream(this.buffer);
1073
- }
1074
1085
  unlink() {
1075
1086
  return __awaiter(this, void 0, void 0, function* () {
1076
1087
  throw new Error(`Temp asset '${this.id}' can not be removed!`);
@@ -1119,12 +1130,12 @@ class TempAsset {
1119
1130
  }
1120
1131
 
1121
1132
  let Assets = class Assets {
1122
- constructor(connector, assetProcessor) {
1133
+ constructor(connector, assetProcessor, driver) {
1123
1134
  var _a;
1124
1135
  this.connector = connector;
1125
1136
  this.assetProcessor = assetProcessor;
1126
- this.bucket = connector.bucket;
1127
- this.collection = (_a = connector.database) === null || _a === void 0 ? void 0 : _a.collection("assets.files");
1137
+ this.driver = driver;
1138
+ this.collection = (_a = connector.database) === null || _a === void 0 ? void 0 : _a.collection(driver.metaCollection);
1128
1139
  }
1129
1140
  write(stream, contentType = null, metadata = null) {
1130
1141
  return __awaiter(this, void 0, void 0, function* () {
@@ -1204,7 +1215,7 @@ let Assets = class Assets {
1204
1215
  find(where) {
1205
1216
  return __awaiter(this, void 0, void 0, function* () {
1206
1217
  const data = yield this.collection.findOne(where);
1207
- return !data ? null : new Asset(data._id, data, this.collection, this.bucket);
1218
+ return !data ? null : new Asset(data._id, data, this.collection, this.driver);
1208
1219
  });
1209
1220
  }
1210
1221
  findMany(where) {
@@ -1215,7 +1226,7 @@ let Assets = class Assets {
1215
1226
  for (let item of items) {
1216
1227
  if (!item)
1217
1228
  continue;
1218
- result.push(new Asset(item._id, item, this.collection, this.bucket));
1229
+ result.push(new Asset(item._id, item, this.collection, this.driver));
1219
1230
  }
1220
1231
  return result;
1221
1232
  });
@@ -1245,7 +1256,11 @@ let Assets = class Assets {
1245
1256
  metadata.filename = metadata.filename || new ObjectId$1().toHexString();
1246
1257
  metadata.extension = (fileType.ext || "").trim();
1247
1258
  return new Promise(((resolve, reject) => {
1248
- const uploaderStream = this.bucket.openUploadStream(metadata.filename);
1259
+ const uploaderStream = this.driver.openUploadStream(metadata.filename, {
1260
+ chunkSizeBytes: 1048576,
1261
+ metadata,
1262
+ contentType: fileType.mime
1263
+ });
1249
1264
  stream.pipe(uploaderStream)
1250
1265
  .on("error", error => {
1251
1266
  reject(error.message || error);
@@ -1255,7 +1270,7 @@ let Assets = class Assets {
1255
1270
  filename: metadata.filename,
1256
1271
  contentType,
1257
1272
  metadata
1258
- }, this.collection, this.bucket);
1273
+ }, this.collection, this.driver);
1259
1274
  asset.save().then(() => {
1260
1275
  resolve(asset);
1261
1276
  }, error => {
@@ -1269,16 +1284,12 @@ let Assets = class Assets {
1269
1284
  Assets = __decorate([
1270
1285
  injectable(),
1271
1286
  scoped(Lifecycle.ContainerScoped),
1272
- __metadata("design:paramtypes", [MongoConnector, AssetProcessor])
1287
+ __param(2, inject(ASSET_DRIVER)),
1288
+ __metadata("design:paramtypes", [MongoConnector,
1289
+ AssetProcessor, Object])
1273
1290
  ], Assets);
1274
1291
 
1275
1292
  class LazyAsset extends BaseEntity {
1276
- constructor(id, data, collection, logger, assets, progresses) {
1277
- super(id, data, collection);
1278
- this.logger = logger;
1279
- this.assets = assets;
1280
- this.progresses = progresses;
1281
- }
1282
1293
  get jobName() {
1283
1294
  return this.data.jobName;
1284
1295
  }
@@ -1300,13 +1311,19 @@ class LazyAsset extends BaseEntity {
1300
1311
  get assetId() {
1301
1312
  return this.data.assetId;
1302
1313
  }
1314
+ constructor(id, data, collection, logger, assets, progresses) {
1315
+ super(id, data, collection);
1316
+ this.logger = logger;
1317
+ this.assets = assets;
1318
+ this.progresses = progresses;
1319
+ }
1303
1320
  unlink() {
1304
1321
  return __awaiter(this, void 0, void 0, function* () {
1305
1322
  yield this.load();
1306
1323
  if (!this.progressId) {
1307
- yield this.collection.deleteOne({ _id: this.mId });
1324
+ yield this.collection.deleteOne({ _id: this.oid });
1308
1325
  }
1309
- return deleteFromBucket(this.assets.bucket, new ObjectId$1(this.assetId));
1326
+ return this.assets.unlink(this.assetId);
1310
1327
  });
1311
1328
  }
1312
1329
  startWorking() {
@@ -1355,7 +1372,7 @@ class LazyAsset extends BaseEntity {
1355
1372
  this.data.progressId = (yield this.progresses.create()).id;
1356
1373
  this.data.assetId = null;
1357
1374
  yield this.save();
1358
- yield deleteFromBucket(this.assets.bucket, oldAsset);
1375
+ yield this.assets.unlink(oldAsset);
1359
1376
  const jobParams = JSON.parse(yield gunzipPromised(this.data.jobParams));
1360
1377
  yield this.progresses.jobMan.enqueueWithName(this.data.jobName, Object.assign(Object.assign({}, jobParams), { lazyId: this.id, fromLoad }));
1361
1378
  });
@@ -1566,9 +1583,6 @@ JobManager = __decorate([
1566
1583
  ], JobManager);
1567
1584
 
1568
1585
  class Progress extends BaseEntity {
1569
- constructor(id, data, collection) {
1570
- super(id, data, collection);
1571
- }
1572
1586
  get current() {
1573
1587
  return this.data.current;
1574
1588
  }
@@ -1590,6 +1604,9 @@ class Progress extends BaseEntity {
1590
1604
  get remaining() {
1591
1605
  return this.max > 0 ? this.max - this.current : 0;
1592
1606
  }
1607
+ constructor(id, data, collection) {
1608
+ super(id, data, collection);
1609
+ }
1593
1610
  setMessageBridge(messageBridge) {
1594
1611
  this.messageBridge = messageBridge || this.messageBridge;
1595
1612
  return this;
@@ -1655,19 +1672,6 @@ class Progress extends BaseEntity {
1655
1672
  }
1656
1673
  }
1657
1674
  class SubProgress {
1658
- constructor(parent, progressFrom, progressValue, mMax = 100) {
1659
- this.parent = parent;
1660
- this.progressFrom = progressFrom;
1661
- this.progressValue = progressValue;
1662
- this.mMax = mMax;
1663
- if (progressFrom < 0) {
1664
- throw "Progress from must be bigger than or zero";
1665
- }
1666
- if (progressValue <= 0) {
1667
- throw "Progress value must be bigger than zero";
1668
- }
1669
- this.mCurrent = 0;
1670
- }
1671
1675
  get id() {
1672
1676
  return this.parent.id;
1673
1677
  }
@@ -1692,6 +1696,19 @@ class SubProgress {
1692
1696
  get canceled() {
1693
1697
  return !this.parent || this.parent.canceled;
1694
1698
  }
1699
+ constructor(parent, progressFrom, progressValue, mMax = 100) {
1700
+ this.parent = parent;
1701
+ this.progressFrom = progressFrom;
1702
+ this.progressValue = progressValue;
1703
+ this.mMax = mMax;
1704
+ if (progressFrom < 0) {
1705
+ throw "Progress from must be bigger than or zero";
1706
+ }
1707
+ if (progressValue <= 0) {
1708
+ throw "Progress value must be bigger than zero";
1709
+ }
1710
+ this.mCurrent = 0;
1711
+ }
1695
1712
  setMessageBridge(messageBridge) {
1696
1713
  if (!this.parent)
1697
1714
  return this;
@@ -1993,11 +2010,6 @@ IsObjectId = __decorate([
1993
2010
  ], IsObjectId);
1994
2011
 
1995
2012
  let OpenApi = class OpenApi {
1996
- constructor(container, customValidation) {
1997
- this.container = container;
1998
- this.customValidation = customValidation;
1999
- this.docs = null;
2000
- }
2001
2013
  get apiDocs() {
2002
2014
  if (!this.docs)
2003
2015
  this.docs = this.createApiDocs();
@@ -2008,6 +2020,11 @@ let OpenApi = class OpenApi {
2008
2020
  this.docsStr = JSON.stringify(this.apiDocs);
2009
2021
  return this.docsStr;
2010
2022
  }
2023
+ constructor(container, customValidation) {
2024
+ this.container = container;
2025
+ this.customValidation = customValidation;
2026
+ this.docs = null;
2027
+ }
2011
2028
  schemaToExample(src, req) {
2012
2029
  var _a, _b, _c;
2013
2030
  return __awaiter(this, void 0, void 0, function* () {
@@ -2138,10 +2155,6 @@ Fixtures = __decorate([
2138
2155
 
2139
2156
  const express = express_;
2140
2157
  let BackendProvider = class BackendProvider {
2141
- constructor(config, container) {
2142
- this.config = config;
2143
- this.container = container;
2144
- }
2145
2158
  get io() {
2146
2159
  this.ioServer = this.ioServer || new Server(this.server, {
2147
2160
  path: "/socket",
@@ -2175,6 +2188,10 @@ let BackendProvider = class BackendProvider {
2175
2188
  this.httpServer = this.httpServer || createServer(this.express);
2176
2189
  return this.httpServer;
2177
2190
  }
2191
+ constructor(config, container) {
2192
+ this.config = config;
2193
+ this.container = container;
2194
+ }
2178
2195
  quickStart() {
2179
2196
  return __awaiter(this, void 0, void 0, function* () {
2180
2197
  const port = this.config.resolve("appPort");
@@ -2670,6 +2687,9 @@ TemplateRenderer = __decorate([
2670
2687
  ], TemplateRenderer);
2671
2688
 
2672
2689
  let MailSender = class MailSender {
2690
+ get translator() {
2691
+ return this.renderer.translator;
2692
+ }
2673
2693
  constructor(config, renderer) {
2674
2694
  this.config = config;
2675
2695
  this.renderer = renderer;
@@ -2682,9 +2702,6 @@ let MailSender = class MailSender {
2682
2702
  }
2683
2703
  });
2684
2704
  }
2685
- get translator() {
2686
- return this.renderer.translator;
2687
- }
2688
2705
  sendMail(language, options) {
2689
2706
  return __awaiter(this, void 0, void 0, function* () {
2690
2707
  const subject = yield this.translator.getTranslation(language, options.subject || "-");
@@ -3430,13 +3447,13 @@ TerminalController$1 = __decorate([
3430
3447
  ], TerminalController$1);
3431
3448
 
3432
3449
  let ErrorHandlerMiddleware = class ErrorHandlerMiddleware {
3450
+ get isDev() {
3451
+ return this.configuration.resolve("nodeEnv") === "development";
3452
+ }
3433
3453
  constructor(configuration, translator) {
3434
3454
  this.configuration = configuration;
3435
3455
  this.translator = translator;
3436
3456
  }
3437
- get isDev() {
3438
- return this.configuration.resolve("nodeEnv") === "development";
3439
- }
3440
3457
  error(error, req, res, next) {
3441
3458
  var _a;
3442
3459
  return __awaiter(this, void 0, void 0, function* () {
@@ -3784,15 +3801,15 @@ CompressionMiddleware = __decorate([
3784
3801
  ], CompressionMiddleware);
3785
3802
 
3786
3803
  class Tree {
3804
+ get parentTree() {
3805
+ return this.container.parent.tree;
3806
+ }
3787
3807
  constructor(container, exists, path) {
3788
3808
  this.container = container;
3789
3809
  this.exists = exists;
3790
3810
  this.path = path;
3791
3811
  this.map = new Map();
3792
3812
  }
3793
- get parentTree() {
3794
- return this.container.parent.tree;
3795
- }
3796
3813
  resolveService() {
3797
3814
  return !this.exists ? null : this.container.resolve(this.path);
3798
3815
  }
@@ -3898,6 +3915,13 @@ class Tree {
3898
3915
  }
3899
3916
 
3900
3917
  class DiContainer {
3918
+ get registeredTokens() {
3919
+ var _a;
3920
+ return (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.registeredTokens) || []).concat(this.tokens);
3921
+ }
3922
+ get tree() {
3923
+ return this.root;
3924
+ }
3901
3925
  constructor(container, parent = null) {
3902
3926
  this.container = container;
3903
3927
  this.parent = parent;
@@ -3906,13 +3930,6 @@ class DiContainer {
3906
3930
  this.tokenSet = new Set();
3907
3931
  this.root = new Tree(this, false, "");
3908
3932
  }
3909
- get registeredTokens() {
3910
- var _a;
3911
- return (((_a = this.parent) === null || _a === void 0 ? void 0 : _a.registeredTokens) || []).concat(this.tokens);
3912
- }
3913
- get tree() {
3914
- return this.root;
3915
- }
3916
3933
  beforeResolution(token, callback, options) {
3917
3934
  this.container.beforeResolution(token, callback, options);
3918
3935
  }
@@ -4075,6 +4092,26 @@ const fixtures = [
4075
4092
  TtlFixture,
4076
4093
  ];
4077
4094
 
4095
+ let AssetGridDriver = class AssetGridDriver {
4096
+ constructor(connector) {
4097
+ this.bucket = new GridFSBucket(connector.database, { bucketName: 'assets' });
4098
+ this.metaCollection = "assets.files";
4099
+ }
4100
+ openUploadStream(filename, opts) {
4101
+ return this.bucket.openUploadStream(filename, opts);
4102
+ }
4103
+ openDownloadStream(id) {
4104
+ return this.bucket.openDownloadStream(id);
4105
+ }
4106
+ delete(id) {
4107
+ return this.bucket.delete(id);
4108
+ }
4109
+ };
4110
+ AssetGridDriver = __decorate([
4111
+ injectable(),
4112
+ __metadata("design:paramtypes", [MongoConnector])
4113
+ ], AssetGridDriver);
4114
+
4078
4115
  class BaseDoc {
4079
4116
  /**
4080
4117
  * Casts this to DocumentType<this> to allow using document methods in get/set-s
@@ -4146,17 +4183,17 @@ function ResponseType(type, options = {}) {
4146
4183
  }
4147
4184
 
4148
4185
  class LazyAssetGenerator {
4149
- constructor(assetResolver, progresses, lazyId) {
4150
- this.assetResolver = assetResolver;
4151
- this.progresses = progresses;
4152
- this.lazyId = lazyId;
4153
- }
4154
4186
  get assets() {
4155
4187
  return this.assetResolver.assets;
4156
4188
  }
4157
4189
  get lazyAssets() {
4158
4190
  return this.assetResolver.lazyAssets;
4159
4191
  }
4192
+ constructor(assetResolver, progresses, lazyId) {
4193
+ this.assetResolver = assetResolver;
4194
+ this.progresses = progresses;
4195
+ this.lazyId = lazyId;
4196
+ }
4160
4197
  process(messaging) {
4161
4198
  return __awaiter(this, void 0, void 0, function* () {
4162
4199
  const lazyAsset = yield this.lazyAssets.read(this.lazyId);
@@ -4605,6 +4642,12 @@ function setupBackend(config, providers, parent) {
4605
4642
  diContainer.register(OPENAPI_VALIDATION, {
4606
4643
  useValue: config.customValidation || (() => null)
4607
4644
  });
4645
+ diContainer.register(LOCAL_DIR, {
4646
+ useValue: config.assetLocalDir || "assets_files"
4647
+ });
4648
+ diContainer.register(ASSET_DRIVER, {
4649
+ useClass: config.assetDriver || AssetGridDriver
4650
+ });
4608
4651
  diContainers.appContainer = diContainers.appContainer || diContainer;
4609
4652
  // Authentication
4610
4653
  restOptions.authorizationChecker = (action, roles) => __awaiter(this, void 0, void 0, function* () {