@abtnode/core 1.7.7 → 1.7.8

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/api/team.js CHANGED
@@ -211,7 +211,7 @@ class TeamAPI extends EventEmitter {
211
211
 
212
212
  // Invite member
213
213
 
214
- async createInvitation({ teamDid, role, remark, interfaceName }, context) {
214
+ async createInvitation({ teamDid, role, remark }, context) {
215
215
  await this.teamManager.checkEnablePassportIssuance(teamDid);
216
216
 
217
217
  if (!role) {
@@ -242,7 +242,6 @@ class TeamAPI extends EventEmitter {
242
242
  expireDate,
243
243
  inviter: user,
244
244
  teamDid,
245
- interfaceName,
246
245
  });
247
246
 
248
247
  logger.info('Create invite member', { role, user, inviteId });
@@ -254,7 +253,6 @@ class TeamAPI extends EventEmitter {
254
253
  expireDate: new Date(expireDate).toString(),
255
254
  inviter: user,
256
255
  teamDid,
257
- interfaceName,
258
256
  };
259
257
  }
260
258
 
@@ -271,7 +269,6 @@ class TeamAPI extends EventEmitter {
271
269
  expireDate: new Date(d.expireDate).toString(),
272
270
  inviter: d.inviter,
273
271
  teamDid: d.teamDid,
274
- interfaceName: d.interfaceName,
275
272
  }));
276
273
  }
277
274
 
@@ -104,6 +104,7 @@ const blockletPm2Events = require('./pm2-events');
104
104
  const { getFactoryState } = require('../../util/chain');
105
105
  const runMigrationScripts = require('../migration');
106
106
  const hooks = require('../hooks');
107
+ const { formatName } = require('../../util/get-domain-for-blocklet');
107
108
 
108
109
  const {
109
110
  isInProgress,
@@ -279,9 +280,9 @@ class BlockletManager extends BaseBlockletManager {
279
280
  return this._installFromStore({ did, registry }, { ...context, blockletPurchaseVerified: true });
280
281
  }
281
282
 
282
- async start({ did, checkHealthImmediately = false, throwOnError }, context) {
283
+ async start({ did, throwOnError, checkHealthImmediately = false, e2eMode = false }, context) {
283
284
  logger.info('start blocklet', { did });
284
- const blocklet = await this.ensureBlocklet(did);
285
+ const blocklet = await this.ensureBlocklet(did, e2eMode);
285
286
 
286
287
  try {
287
288
  if (!hasRunnableComponent(blocklet)) {
@@ -319,6 +320,7 @@ class BlockletManager extends BaseBlockletManager {
319
320
  }),
320
321
  nodeEnvironments,
321
322
  nodeInfo: await states.node.read(),
323
+ e2eMode,
322
324
  });
323
325
 
324
326
  // check blocklet healthy
@@ -481,6 +483,40 @@ class BlockletManager extends BaseBlockletManager {
481
483
  }
482
484
  }
483
485
 
486
+ async reset({ did }, context = {}) {
487
+ logger.info('reset blocklet', { did });
488
+
489
+ const blocklet = await this.ensureBlocklet(did);
490
+
491
+ if (isInProgress(blocklet.status)) {
492
+ throw new Error('Cannot reset when blocklet is in progress');
493
+ }
494
+
495
+ try {
496
+ await this.deleteProcess({ did }, context);
497
+ } catch {
498
+ // do nothing
499
+ }
500
+
501
+ // Cleanup disk storage
502
+ const { name } = blocklet.meta;
503
+ const dataDir = path.join(this.dataDirs.data, name);
504
+ const logsDir = path.join(this.dataDirs.logs, name);
505
+ const cacheDir = path.join(this.dataDirs.cache, name);
506
+ fs.removeSync(cacheDir);
507
+ fs.removeSync(dataDir);
508
+ fs.removeSync(logsDir);
509
+
510
+ // Reset config in db
511
+ await this._delExtras(did);
512
+ await this._setConfigs(did);
513
+ await this.updateBlockletEnvironment(did);
514
+ await this.resetSiteByDid(did, context);
515
+
516
+ logger.info('blocklet reset', { did });
517
+ return blocklet;
518
+ }
519
+
484
520
  async deleteComponent({ did, rootDid }, context) {
485
521
  logger.info('delete blocklet component', { did, rootDid });
486
522
 
@@ -928,14 +964,22 @@ class BlockletManager extends BaseBlockletManager {
928
964
  * After the dev function finished, the caller should send a BlockletEvents.deployed event to the daemon
929
965
  * @returns {Object} blocklet
930
966
  */
931
- async dev(folder) {
932
- logger.info('dev blocklet', { folder });
967
+ async dev(folder, { rootDid, mountPoint } = {}) {
968
+ logger.info('dev component', { folder, rootDid, mountPoint });
933
969
 
934
970
  const meta = getBlockletMeta(folder);
935
971
  if (meta.group !== 'static' && (!meta.scripts || !meta.scripts.dev)) {
936
972
  throw new Error('Incorrect blocklet manifest: missing `scripts.dev` field');
937
973
  }
938
974
 
975
+ if (rootDid) {
976
+ return this._devComponent({ folder, meta, rootDid, mountPoint });
977
+ }
978
+
979
+ return this._devBlocklet({ folder, meta });
980
+ }
981
+
982
+ async _devBlocklet({ folder, meta }) {
939
983
  const { did, version } = meta;
940
984
 
941
985
  const exist = await states.blocklet.getBlocklet(did);
@@ -990,7 +1034,58 @@ class BlockletManager extends BaseBlockletManager {
990
1034
  return blocklet;
991
1035
  }
992
1036
 
993
- async ensureBlocklet(did) {
1037
+ async _devComponent({ folder, meta, rootDid, mountPoint }) {
1038
+ const { did, version } = meta;
1039
+
1040
+ const existRoot = await states.blocklet.getBlocklet(rootDid);
1041
+ if (!existRoot) {
1042
+ throw new Error('Root blocklet does not exist');
1043
+ }
1044
+
1045
+ const exist = existRoot.children.find((x) => x.meta.did === meta.did);
1046
+ if (exist) {
1047
+ if (exist.mode === BLOCKLET_MODES.PRODUCTION) {
1048
+ throw new Error('The blocklet component of production mode already exists, please remove it before developing');
1049
+ }
1050
+
1051
+ const status = fromBlockletStatus(exist.status);
1052
+ if (['starting', 'running'].includes(status)) {
1053
+ throw new Error(`The blocklet component is already on ${status}, please stop it before developing`);
1054
+ }
1055
+
1056
+ logger.info('remove blocklet component for dev', { did, version });
1057
+
1058
+ await this.deleteComponent({ did, rootDid });
1059
+ }
1060
+
1061
+ const defaultPath = formatName(meta.name);
1062
+ const children = await parseChildren(existRoot.meta, {
1063
+ children: [
1064
+ {
1065
+ meta,
1066
+ mountPoint: mountPoint || `/${defaultPath}`,
1067
+ source: BlockletSource.local,
1068
+ deployedFrom: folder,
1069
+ status: BlockletStatus.installed,
1070
+ mode: BLOCKLET_MODES.DEVELOPMENT,
1071
+ },
1072
+ ],
1073
+ dynamic: true,
1074
+ });
1075
+ await states.blocklet.addChildren(rootDid, children);
1076
+
1077
+ logger.info('add blocklet component for dev', { did, version, meta });
1078
+
1079
+ // Add environments
1080
+ await this._setConfigs(rootDid);
1081
+ await this.updateBlockletEnvironment(rootDid);
1082
+
1083
+ const rootBlocklet = await this.ensureBlocklet(rootDid);
1084
+
1085
+ return rootBlocklet;
1086
+ }
1087
+
1088
+ async ensureBlocklet(did, e2eMode = false) {
994
1089
  if (!isValidDid(did)) {
995
1090
  throw new Error(`Blocklet did is invalid: ${did}`);
996
1091
  }
@@ -1008,6 +1103,7 @@ class BlockletManager extends BaseBlockletManager {
1008
1103
  ...getBlockletDirs(blocklet, {
1009
1104
  dataDirs: this.dataDirs,
1010
1105
  ensure: true,
1106
+ e2eMode,
1011
1107
  }),
1012
1108
  };
1013
1109
 
@@ -1736,7 +1832,7 @@ class BlockletManager extends BaseBlockletManager {
1736
1832
  meta,
1737
1833
  mountPoint,
1738
1834
  source: BlockletSource.upload,
1739
- deployedFrom: `Upload by ${context.user.did}`,
1835
+ deployedFrom: `Upload by ${context.user.fullName}`,
1740
1836
  sourceUrl: '',
1741
1837
  dynamic: true,
1742
1838
  };
package/lib/event.js CHANGED
@@ -30,6 +30,8 @@ module.exports = ({
30
30
  const nodeState = states.node;
31
31
 
32
32
  const events = new EventEmitter();
33
+ events.setMaxListeners(0);
34
+
33
35
  // HACK: do not emit any events from CLI
34
36
  if (isCLI() && process.env.NODE_ENV !== 'test') {
35
37
  events.emit = (name) => logger.debug('stopped core state event in CLI', name);
package/lib/index.js CHANGED
@@ -133,11 +133,13 @@ function ABTNode(options) {
133
133
  registry: blockletRegistry,
134
134
  daemon: options.daemon,
135
135
  });
136
+ blockletManager.setMaxListeners(0);
136
137
 
137
138
  const {
138
139
  handleRouting,
139
140
  getRoutingRulesByDid,
140
141
  getSiteByDid,
142
+ resetSiteByDid,
141
143
  updateNodeRouting,
142
144
  takeRoutingSnapshot,
143
145
  getRoutingSites,
@@ -159,6 +161,7 @@ function ABTNode(options) {
159
161
 
160
162
  blockletManager.getRoutingRulesByDid = getRoutingRulesByDid;
161
163
  blockletManager.getSiteByDid = getSiteByDid;
164
+ blockletManager.resetSiteByDid = resetSiteByDid;
162
165
 
163
166
  // Generate an on node ready callback
164
167
  const onStatesReady = createStateReadyQueue({ states, options, dataDirs });
@@ -216,6 +219,7 @@ function ABTNode(options) {
216
219
  updateChildBlocklets: blockletManager.updateChildren.bind(blockletManager),
217
220
  getLatestBlockletVersion: blockletManager.getLatestBlockletVersion.bind(blockletManager),
218
221
  getBlockletMetaFromUrl: blockletManager.getMetaFromUrl.bind(blockletManager),
222
+ resetBlocklet: blockletManager.reset.bind(blockletManager),
219
223
 
220
224
  deleteBlockletProcess: blockletManager.deleteProcess.bind(blockletManager),
221
225
 
@@ -7,7 +7,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
7
7
  printInfo('Try to update node config to 1.0.21...');
8
8
  let changed = false;
9
9
 
10
- const rawConfig = yaml.safeLoad(fs.readFileSync(configFile).toString());
10
+ const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
11
11
  const info = await states.node.read();
12
12
 
13
13
  const updates = [
@@ -13,7 +13,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
13
13
  printInfo('Try to update node config to 1.0.22...');
14
14
  let changed = false;
15
15
 
16
- const rawConfig = yaml.safeLoad(fs.readFileSync(configFile).toString());
16
+ const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
17
17
  const info = await states.node.read();
18
18
 
19
19
  const updates = [
@@ -10,7 +10,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
10
10
  printInfo('Try to update node config to 1.0.25...');
11
11
  let changed = false;
12
12
 
13
- const rawConfig = yaml.safeLoad(fs.readFileSync(configFile).toString());
13
+ const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
14
14
  const info = await states.node.read();
15
15
 
16
16
  const updates = [
@@ -7,7 +7,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
7
7
  printInfo('Try to update node config to 1.0.32...');
8
8
  let changed = false;
9
9
 
10
- const rawConfig = yaml.safeLoad(fs.readFileSync(configFile).toString());
10
+ const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
11
11
  const info = await states.node.read();
12
12
 
13
13
  const updates = [{ key: 'routing.https', value: true }];
@@ -22,7 +22,7 @@ module.exports = async ({ states, printInfo, configFile }) => {
22
22
  await states.node.updateNodeInfo(info);
23
23
 
24
24
  if (process.env.NODE_ENV !== 'development') {
25
- let rawConfig = yaml.safeLoad(fs.readFileSync(configFile).toString());
25
+ let rawConfig = yaml.load(fs.readFileSync(configFile).toString());
26
26
  set(rawConfig, 'node.routing.ipWildcardDomain', info.routing.ipWildcardDomain);
27
27
  set(rawConfig, 'node.routing.wildcardCertHost', DEFAULT_WILDCARD_CERT_HOST);
28
28
  set(rawConfig, 'node.didDomain', DEFAULT_DID_DOMAIN);
@@ -19,7 +19,7 @@ module.exports = async ({ states, configFile, dataDir }) => {
19
19
  try {
20
20
  fs.writeFileSync(file, crypto.randomBytes(32), { encoding: 'binary', mode: '0600' });
21
21
 
22
- const config = yaml.safeLoad(fs.readFileSync(configFile).toString(), { json: true });
22
+ const config = yaml.load(fs.readFileSync(configFile).toString(), { json: true });
23
23
  config.node.sk = security.encrypt(config.node.sk, config.node.did, fs.readFileSync(file));
24
24
  fs.writeFileSync(configFile, yaml.dump(config));
25
25
  await states.node.updateNodeInfo({ sk: config.node.sk });
@@ -41,7 +41,7 @@ module.exports = async ({ states, config, configFile, printInfo }) => {
41
41
  printInfo('Try to update node config to 1.0.21...');
42
42
  let changed = false;
43
43
 
44
- const rawConfig = yaml.safeLoad(fs.readFileSync(configFile).toString());
44
+ const rawConfig = yaml.load(fs.readFileSync(configFile).toString());
45
45
  const info = await states.node.read();
46
46
 
47
47
  const updates = [
@@ -1131,6 +1131,16 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1131
1131
  return (sites || []).find((x) => x.domain === domain);
1132
1132
  }
1133
1133
 
1134
+ async function resetSiteByDid(did, { refreshRouterProvider = true } = {}) {
1135
+ const blocklet = await states.blocklet.getBlocklet(did);
1136
+ await removeBlockletRouting(blocklet);
1137
+ await ensureBlockletRouting(blocklet);
1138
+ if (refreshRouterProvider) {
1139
+ const hash = await takeRoutingSnapshot({ message: `Reset blocklet ${did}`, dryRun: false });
1140
+ logger.info('reset blocklet routing rules', { did, hash });
1141
+ }
1142
+ }
1143
+
1134
1144
  const providers = {}; // we need to keep reference for different router instances
1135
1145
  const handleRouting = async (nodeInfo) => {
1136
1146
  const providerName = get(nodeInfo, 'routing.provider', null);
@@ -1382,6 +1392,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
1382
1392
  handleRouting,
1383
1393
  getRoutingRulesByDid,
1384
1394
  getSiteByDid,
1395
+ resetSiteByDid,
1385
1396
  updateNodeRouting,
1386
1397
  takeRoutingSnapshot,
1387
1398
  getRoutingSites,
@@ -66,6 +66,16 @@ const formatBlocklet = (blocklet, phase, dek) => {
66
66
  return blocklet;
67
67
  };
68
68
 
69
+ const fixChildren = (children) => {
70
+ if (!children) {
71
+ return;
72
+ }
73
+
74
+ children.forEach((child) => {
75
+ child.mode = child.mode || BLOCKLET_MODES.PRODUCTION;
76
+ });
77
+ };
78
+
69
79
  class BlockletState extends BaseState {
70
80
  /**
71
81
  * Creates an instance of BlockletState
@@ -163,6 +173,8 @@ class BlockletState extends BaseState {
163
173
  defaultPort: getMaxPort(ports),
164
174
  });
165
175
 
176
+ fixChildren(children);
177
+
166
178
  // add to db
167
179
  this.db.insert(
168
180
  {
@@ -244,6 +256,8 @@ class BlockletState extends BaseState {
244
256
  logger.info('Fill children ports when when upgrading blocklet', { name: doc.meta.name, did: doc.meta.did });
245
257
  await this.fillChildrenPorts(children, { oldChildren: doc.children, defaultPort: getMaxPort(ports) });
246
258
 
259
+ fixChildren(children);
260
+
247
261
  // add to db
248
262
  const newDoc = await this.updateBlocklet(meta.did, {
249
263
  meta: omit(sanitized, ['htmlAst']),
@@ -506,7 +520,7 @@ class BlockletState extends BaseState {
506
520
 
507
521
  const newChildren = [...oldChildren];
508
522
  for (const child of children) {
509
- const { meta, mountPoint, sourceUrl = '', source = '', deployedFrom = '' } = child;
523
+ const { meta, mountPoint, sourceUrl = '', source = '', deployedFrom = '', mode } = child;
510
524
 
511
525
  if (!mountPoint) {
512
526
  throw new Error(`mountPoint is required when adding component ${getDisplayName(child, true)}`);
@@ -524,9 +538,12 @@ class BlockletState extends BaseState {
524
538
  sourceUrl,
525
539
  source,
526
540
  deployedFrom,
541
+ mode,
527
542
  dynamic: true,
528
543
  status: BlockletStatus.added,
529
544
  });
545
+
546
+ fixChildren(newChildren);
530
547
  }
531
548
 
532
549
  // use upgradeBlocklet to assign ports to children and write new data to db
@@ -104,7 +104,7 @@ const PRIVATE_NODE_ENVS = [
104
104
  * appMain: app entry file or script (run appMain to start blocklet process)
105
105
  * appCwd: cwd of appMain
106
106
  */
107
- const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false } = {}) => {
107
+ const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false, e2eMode = false } = {}) => {
108
108
  if (!rootBlocklet) {
109
109
  // eslint-disable-next-line no-param-reassign
110
110
  rootBlocklet = blocklet;
@@ -126,8 +126,13 @@ const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false } =
126
126
 
127
127
  const { main, group } = blocklet.meta;
128
128
 
129
- const startFromDevEntry =
130
- blocklet.mode === BLOCKLET_MODES.DEVELOPMENT && blocklet.meta.scripts && blocklet.meta.scripts.dev;
129
+ let startFromDevEntry = '';
130
+ if (blocklet.mode === BLOCKLET_MODES.DEVELOPMENT && blocklet.meta.scripts) {
131
+ startFromDevEntry = blocklet.meta.scripts.dev;
132
+ if (e2eMode && blocklet.meta.scripts.e2eDev) {
133
+ startFromDevEntry = blocklet.meta.scripts.e2eDev;
134
+ }
135
+ }
131
136
 
132
137
  if (!main && !startFromDevEntry && group !== BlockletGroup.gateway) {
133
138
  throw new Error('Incorrect blocklet manifest: missing `main` field');
@@ -174,7 +179,7 @@ const getBlockletDirs = (blocklet, { rootBlocklet, dataDirs, ensure = false } =
174
179
  let appMain = null;
175
180
  let appCwd = null;
176
181
  if (startFromDevEntry) {
177
- appMain = blocklet.meta.scripts.dev;
182
+ appMain = startFromDevEntry;
178
183
  appCwd = appDir;
179
184
  } else if (group === 'dapp') {
180
185
  appMain = getBlockletEngine(blocklet.meta).script || BLOCKLET_ENTRY_FILE;
@@ -414,7 +419,7 @@ const getBlockletMetaFromUrl = async (url) => {
414
419
  * Start all precesses of a blocklet
415
420
  * @param {*} blocklet should contain env props
416
421
  */
417
- const startBlockletProcess = async (blocklet, { preStart = noop, nodeEnvironments, nodeInfo } = {}) => {
422
+ const startBlockletProcess = async (blocklet, { preStart = noop, nodeEnvironments, nodeInfo, e2eMode } = {}) => {
418
423
  if (!blocklet) {
419
424
  throw new Error('blocklet should not be empty');
420
425
  }
@@ -463,7 +468,7 @@ const startBlockletProcess = async (blocklet, { preStart = noop, nodeEnvironment
463
468
  }
464
469
 
465
470
  if (b.mode === BLOCKLET_MODES.DEVELOPMENT) {
466
- options.env.NODE_ENV = 'development';
471
+ options.env.NODE_ENV = e2eMode ? 'e2e' : 'development';
467
472
  options.env.BROWSER = 'none';
468
473
  options.env.PORT = options.env[BLOCKLET_DEFAULT_PORT_NAME];
469
474
  options.script = appMain;
@@ -23,4 +23,4 @@ const getDidDomainForBlocklet = ({ name, daemonDid, didDomain }) => {
23
23
  return `${prefix}-${daemonDid.toLowerCase()}.${didDomain}`;
24
24
  };
25
25
 
26
- module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet };
26
+ module.exports = { getIpDnsDomainForBlocklet, getDidDomainForBlocklet, formatName };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.7.7",
6
+ "version": "1.7.8",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,32 +19,32 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
- "@abtnode/certificate-manager": "1.7.7",
23
- "@abtnode/constant": "1.7.7",
24
- "@abtnode/cron": "1.7.7",
25
- "@abtnode/db": "1.7.7",
26
- "@abtnode/logger": "1.7.7",
27
- "@abtnode/queue": "1.7.7",
28
- "@abtnode/rbac": "1.7.7",
29
- "@abtnode/router-provider": "1.7.7",
30
- "@abtnode/static-server": "1.7.7",
31
- "@abtnode/timemachine": "1.7.7",
32
- "@abtnode/util": "1.7.7",
33
- "@arcblock/did": "^1.16.0",
34
- "@arcblock/did-motif": "^1.1.4",
35
- "@arcblock/event-hub": "1.16.0",
22
+ "@abtnode/certificate-manager": "1.7.8",
23
+ "@abtnode/constant": "1.7.8",
24
+ "@abtnode/cron": "1.7.8",
25
+ "@abtnode/db": "1.7.8",
26
+ "@abtnode/logger": "1.7.8",
27
+ "@abtnode/queue": "1.7.8",
28
+ "@abtnode/rbac": "1.7.8",
29
+ "@abtnode/router-provider": "1.7.8",
30
+ "@abtnode/static-server": "1.7.8",
31
+ "@abtnode/timemachine": "1.7.8",
32
+ "@abtnode/util": "1.7.8",
33
+ "@arcblock/did": "^1.16.3",
34
+ "@arcblock/did-motif": "^1.1.5",
35
+ "@arcblock/event-hub": "1.16.3",
36
36
  "@arcblock/pm2-events": "^0.0.5",
37
- "@arcblock/vc": "^1.16.0",
38
- "@blocklet/meta": "1.7.7",
37
+ "@arcblock/vc": "^1.16.3",
38
+ "@blocklet/meta": "1.7.8",
39
39
  "@fidm/x509": "^1.2.1",
40
40
  "@nedb/core": "^1.2.2",
41
41
  "@nedb/multi": "^1.2.2",
42
- "@ocap/mcrypto": "^1.16.0",
43
- "@ocap/util": "^1.16.0",
44
- "@ocap/wallet": "^1.16.0",
42
+ "@ocap/mcrypto": "^1.16.3",
43
+ "@ocap/util": "^1.16.3",
44
+ "@ocap/wallet": "^1.16.3",
45
45
  "@slack/webhook": "^5.0.3",
46
46
  "ajv": "^7.0.3",
47
- "axios": "^0.25.0",
47
+ "axios": "^0.26.1",
48
48
  "axon": "^2.0.3",
49
49
  "chalk": "^4.0.0",
50
50
  "deep-diff": "^1.0.2",
@@ -56,7 +56,7 @@
56
56
  "is-ip": "^3.1.0",
57
57
  "is-url": "^1.2.4",
58
58
  "joi": "^17.6.0",
59
- "js-yaml": "^3.14.0",
59
+ "js-yaml": "^4.1.0",
60
60
  "lodash": "^4.17.21",
61
61
  "lru-cache": "^6.0.0",
62
62
  "pm2": "^5.1.2",
@@ -78,5 +78,5 @@
78
78
  "express": "^4.17.1",
79
79
  "jest": "^27.4.5"
80
80
  },
81
- "gitHead": "619db37ea7a91c64a9bf30836a55c70d55325e73"
81
+ "gitHead": "ae75dd20b4750a31dc53c88b75ed1d95c8f15397"
82
82
  }