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.
@@ -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,CAmBxD;CACH;AAED,eAAe,kBAAkB,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 do banco de dados ${database.host}`);
61
- this.log(`Sincronizando novo host do banco de dados ${database.host}`, 'info');
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 uma banco de dados, check o log...', 'danger');
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,CAoB3D;CACH;AAED,eAAe,qBAAqB,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 novo banco de dados ${env.uuid}`);
78
- this.log(`Sincronizando novo banco de dados ${env.uuid}`, 'info');
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;AAIhD,cAAM,cAAe,SAAQ,OAAQ,YAAW,QAAQ;IACtD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAErB,IAAI;IAwBV,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"}
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"}
@@ -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(pino);
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":"AAEA,OAAa,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAmDpC,QAAA,MAAM,MAAM,qBAKX,CAAC;AAEF,eAAe,MAAM,CAAC"}
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"}
@@ -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 _pino = _interopRequireDefault(require("pino"));
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, _pino.default)({
43
- name: 'exodus',
44
- level: _app.Core.settings.getLogger().level,
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.741",
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",