exodus-framework 2.0.741 → 2.0.743
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/lib/controllers/messaging/database.d.ts.map +1 -1
- package/lib/controllers/messaging/database.js +3 -3
- package/lib/controllers/messaging/environment.d.ts.map +1 -1
- package/lib/controllers/messaging/environment.js +8 -3
- package/lib/services/express.d.ts.map +1 -1
- package/lib/services/express.js +5 -1
- package/lib/services/sequelize.d.ts +1 -0
- package/lib/services/sequelize.d.ts.map +1 -1
- package/lib/services/sequelize.js +20 -0
- package/lib/utils/logger.d.ts.map +1 -1
- package/lib/utils/logger.js +5 -9
- package/package.json +3 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/controllers/messaging/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAI1E,cAAM,kBAAmB,SAAQ,mBAAmB;IAClD,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC,eAAe,CAAC,CAc9D;IAEF,MAAM,EAAE,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAmB5D;IAEF,MAAM,EAAE,sBAAsB,CAAC,eAAe,CAAC,eAAe,CAAC,CAmB7D;IAEF,IAAI,EAAE,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/controllers/messaging/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAI1E,cAAM,kBAAmB,SAAQ,mBAAmB;IAClD,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC,eAAe,CAAC,CAc9D;IAEF,MAAM,EAAE,sBAAsB,CAAC,eAAe,CAAC,cAAc,CAAC,CAmB5D;IAEF,MAAM,EAAE,sBAAsB,CAAC,eAAe,CAAC,eAAe,CAAC,CAmB7D;IAEF,IAAI,EAAE,sBAAsB,CAAC,eAAe,CAAC,YAAY,CAAC,CAgBxD;CACH;AAED,eAAe,kBAAkB,CAAC"}
|
@@ -57,13 +57,13 @@ class DatabaseController extends _app.MessagingController {
|
|
57
57
|
try {
|
58
58
|
const host = await _models.DatabaseHost.findByPk(database.uuid);
|
59
59
|
if (!host) {
|
60
|
-
(0, _utils.logger)().info(database, `Sincronizando novo host
|
61
|
-
this.log(`Sincronizando novo host
|
60
|
+
(0, _utils.logger)().info(database, `Sincronizando novo host ${database.host}`);
|
61
|
+
this.log(`Sincronizando novo host ${database.host}`, 'info');
|
62
62
|
await _models.DatabaseHost.create(database);
|
63
63
|
}
|
64
64
|
} catch (error) {
|
65
65
|
(0, _utils.logger)().error(error);
|
66
|
-
this.log('Houve um erro ao tentar sincronizar
|
66
|
+
this.log('Houve um erro ao tentar sincronizar um novo host, check o log...', 'danger');
|
67
67
|
}
|
68
68
|
});
|
69
69
|
ack();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/controllers/messaging/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAK1E,cAAM,qBAAsB,SAAQ,mBAAmB;IACrD,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAkBjE;IAEF,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAoBjE;IAEF,eAAe,EAAE,sBAAsB,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAyBjF;IAEF,IAAI,EAAE,sBAAsB,CAAC,eAAe,CAAC,eAAe,CAAC,
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/controllers/messaging/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAK1E,cAAM,qBAAsB,SAAQ,mBAAmB;IACrD,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAkBjE;IAEF,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAoBjE;IAEF,eAAe,EAAE,sBAAsB,CAAC,eAAe,CAAC,0BAA0B,CAAC,CAyBjF;IAEF,IAAI,EAAE,sBAAsB,CAAC,eAAe,CAAC,eAAe,CAAC,CA6B3D;CACH;AAED,eAAe,qBAAqB,CAAC"}
|
@@ -74,17 +74,22 @@ class EnvironmentController extends _app.MessagingController {
|
|
74
74
|
}
|
75
75
|
});
|
76
76
|
if (!host) {
|
77
|
-
(0, _utils.logger)().info(env, `Sincronizando
|
78
|
-
this.log(`Sincronizando
|
77
|
+
(0, _utils.logger)().info(env, `Sincronizando relação env-db ${env.uuid}`);
|
78
|
+
this.log(`Sincronizando relação env-db ${env.uuid}`, 'info');
|
79
79
|
await _models.EnvDBHost.create({
|
80
80
|
envUuid: env.uuid,
|
81
81
|
hostUuid: env.database,
|
82
82
|
envToken: env.envToken
|
83
83
|
});
|
84
84
|
}
|
85
|
+
if (!(await _services.SequelizeService.singleton().hasDB(env.database, env.envToken))) {
|
86
|
+
(0, _utils.logger)().info(env, `Sincronizando novo banco de dados ${env.uuid}`);
|
87
|
+
this.log(`Sincronizando novo banco de dados ${env.uuid}`, 'info');
|
88
|
+
await _services.SequelizeService.singleton().createDB(env.database, env.envToken);
|
89
|
+
}
|
85
90
|
} catch (error) {
|
86
91
|
(0, _utils.logger)().error(error);
|
87
|
-
this.log('Houve um erro ao tentar sincronizar um banco de dados, check o log...', 'danger');
|
92
|
+
this.log('Houve um erro ao tentar sincronizar um novo ambiente/relação ou banco de dados, check o log...', 'danger');
|
88
93
|
}
|
89
94
|
});
|
90
95
|
ack();
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/services/express.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,sBAAsB,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAqB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/services/express.ts"],"names":[],"mappings":"AACA,OAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAElE,OAAO,sBAAsB,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAqB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKhD,cAAM,cAAe,SAAQ,OAAQ,YAAW,QAAQ;IACtD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAErB,IAAI;IAyBV,aAAa;IAIb,YAAY,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,YAAY;IAiC3E,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;IAMtE,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAWzC,0BAA0B,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY;IAUtF,2BAA2B,QACpB,GAAG,OACH,OAAO,OACP,QAAQ,KAEV,YAAY,mBAoBf;IAEI,YAAY,CAAC,MAAM,EAAE,MAAM;IAyBjC,cAAc,CAAC,MAAM,EAAE,MAAM;CAG9B;AAED,eAAe,cAAc,CAAC"}
|
package/lib/services/express.js
CHANGED
@@ -15,6 +15,7 @@ var _service = _interopRequireDefault(require("../app/service"));
|
|
15
15
|
var _http2 = require("../contracts/http");
|
16
16
|
var _logger = _interopRequireDefault(require("../utils/logger"));
|
17
17
|
var _error = require("./error");
|
18
|
+
var _expressRequestsLogger = _interopRequireDefault(require("express-requests-logger"));
|
18
19
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
19
20
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
20
21
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
@@ -30,7 +31,10 @@ class ExpressService extends _service.default {
|
|
30
31
|
});
|
31
32
|
this.server = http.createServer(expss);
|
32
33
|
expss.use('/public', _express.default.static(_app.Core.settings.getHttp().publicPath));
|
33
|
-
expss.use(
|
34
|
+
expss.use((0, _expressRequestsLogger.default)({
|
35
|
+
logger: (0, _logger.default)()
|
36
|
+
}));
|
37
|
+
// expss.use(pino);
|
34
38
|
expss.set('query parser', str => _qs.default.parse(str));
|
35
39
|
expss.use(this.responseTypeMiddleware.bind(this));
|
36
40
|
expss.use(_express.default.json());
|
@@ -14,6 +14,7 @@ declare class SequelizeService extends Service implements IService {
|
|
14
14
|
connectDatabases(): Promise<unknown>;
|
15
15
|
getDB(tenantId: string): Promise<false | Sequelize>;
|
16
16
|
createDB(hostUuid: string, name: string): Promise<boolean>;
|
17
|
+
hasDB(hostUuid: string, name: string): Promise<boolean>;
|
17
18
|
deleteDB(hostUuid: string, name: string): Promise<boolean>;
|
18
19
|
initDB(tenantId: string): Promise<false | Sequelize>;
|
19
20
|
getDBName(envToken: string): string;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/services/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEnE,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAcpD,cAAM,gBAAiB,SAAQ,OAAQ,YAAW,QAAQ;IACxD,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAM5B,IAAI;IAQJ,gBAAgB;IAgChB,KAAK,CAAC,QAAQ,EAAE,MAAM;IActB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IA6BvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAiBvC,MAAM,CAAC,QAAQ,EAAE,MAAM;IAiB7B,SAAS,CAAC,QAAQ,EAAE,MAAM;IAK1B,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,SAAI;IAe/B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IA6CpD,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB;IA6BK,WAAW,CAAC,QAAQ,EAAE,MAAM;IAe5B,QAAQ,CAAC,CAAC,SAAS,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7C,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG;QAAE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,KAAK,CAAC,CAAA;KAAE,EAC5E,QAAQ,EAAE,MAAM;IA2BlB,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE;CAG1C;AAED,eAAe,gBAAgB,CAAC"}
|
1
|
+
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/services/sequelize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEnE,OAAO,OAAO,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAcpD,cAAM,gBAAiB,SAAQ,OAAQ,YAAW,QAAQ;IACxD,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAM5B,IAAI;IAQJ,gBAAgB;IAgChB,KAAK,CAAC,QAAQ,EAAE,MAAM;IActB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IA6BvC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAqBpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAiBvC,MAAM,CAAC,QAAQ,EAAE,MAAM;IAiB7B,SAAS,CAAC,QAAQ,EAAE,MAAM;IAK1B,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,SAAI;IAe/B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IA6CpD,cAAc,CAAC,IAAI,EAAE;QACzB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB;IA6BK,WAAW,CAAC,QAAQ,EAAE,MAAM;IAe5B,QAAQ,CAAC,CAAC,SAAS,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAC7C,KAAK,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG;QAAE,UAAU,EAAE,CAAC,UAAU,EAAE,SAAS,KAAK,CAAC,CAAA;KAAE,EAC5E,QAAQ,EAAE,MAAM;IA2BlB,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE;CAG1C;AAED,eAAe,gBAAgB,CAAC"}
|
@@ -106,6 +106,26 @@ class SequelizeService extends _service.default {
|
|
106
106
|
}
|
107
107
|
return false;
|
108
108
|
}
|
109
|
+
async hasDB(hostUuid, name) {
|
110
|
+
const host = await _DatabaseHost.DatabaseHost.findByPk(hostUuid);
|
111
|
+
if (!host) {
|
112
|
+
this.log('Database host information not found: ' + hostUuid);
|
113
|
+
return false;
|
114
|
+
}
|
115
|
+
const dbQueryName = `${_app.Core.settings.getDatabase().service.database}_${name}`;
|
116
|
+
const connection = await this.createConnection(hostUuid);
|
117
|
+
if (connection) {
|
118
|
+
try {
|
119
|
+
const [results] = await connection.query(`SHOW DATABASES LIKE '${dbQueryName}';`);
|
120
|
+
return results.length > 0;
|
121
|
+
} catch (error) {
|
122
|
+
new _error.ApplicationException('Erro on creating database', error);
|
123
|
+
} finally {
|
124
|
+
connection.close();
|
125
|
+
}
|
126
|
+
}
|
127
|
+
return false;
|
128
|
+
}
|
109
129
|
async deleteDB(hostUuid, name) {
|
110
130
|
const dbQueryName = `${_app.Core.settings.getDatabase().service.database}_${name}`;
|
111
131
|
const connection = await this.createConnection(hostUuid);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA2C9B,QAAA,MAAM,MAAM,qBAKX,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/lib/utils/logger.js
CHANGED
@@ -4,12 +4,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
+
var _dateFns = require("date-fns");
|
7
8
|
var _fs = require("fs");
|
8
9
|
var _path = _interopRequireDefault(require("path"));
|
9
|
-
var
|
10
|
-
var _pinoMultiStream = require("pino-multi-stream");
|
10
|
+
var _pinoMultiStream = _interopRequireDefault(require("pino-multi-stream"));
|
11
11
|
var _app = require("../app");
|
12
|
-
var _dateFns = require("date-fns");
|
13
12
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
14
13
|
let loggerInstance = null;
|
15
14
|
const createLogger = () => {
|
@@ -39,12 +38,9 @@ const createLogger = () => {
|
|
39
38
|
_app.Core.settings.getLogger().console ?? streams.push({
|
40
39
|
stream: process.stdout
|
41
40
|
});
|
42
|
-
return (0,
|
43
|
-
|
44
|
-
|
45
|
-
// this MUST be set at the lowest level of the
|
46
|
-
timestamp: () => `,"time":"${new Date().toJSON()}"`
|
47
|
-
}, (0, _pinoMultiStream.multistream)(streams));
|
41
|
+
return (0, _pinoMultiStream.default)({
|
42
|
+
streams
|
43
|
+
});
|
48
44
|
};
|
49
45
|
const logger = () => {
|
50
46
|
if (!loggerInstance) {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "exodus-framework",
|
3
|
-
"version": "2.0.
|
3
|
+
"version": "2.0.743",
|
4
4
|
"description": "Exodus Framework",
|
5
5
|
"author": "jhownpaixao",
|
6
6
|
"license": "ISC",
|
@@ -34,6 +34,7 @@
|
|
34
34
|
"express": "^5.0.0",
|
35
35
|
"express-async-errors": "^2.0.0",
|
36
36
|
"express-jwt": "^8.4.1",
|
37
|
+
"express-requests-logger": "^4.0.1",
|
37
38
|
"fs": "^0.0.1-security",
|
38
39
|
"lodash": "^4.17.21",
|
39
40
|
"mariadb": "^3.3.1",
|
@@ -60,6 +61,7 @@
|
|
60
61
|
"@types/amqplib": "^0.10.5",
|
61
62
|
"@types/cors": "^2.8.17",
|
62
63
|
"@types/express": "^4.17.21",
|
64
|
+
"@types/express-requests-logger": "^4.0.0",
|
63
65
|
"@types/lodash": "^4.17.7",
|
64
66
|
"@types/multer": "^1.4.12",
|
65
67
|
"@types/node": "^22.5.0",
|