@atlaskit/dependency-version-analytics 0.4.1 → 1.0.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 (45) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/cli.js +4 -18
  3. package/dist/cjs/commands/populate-historic-data/index.js +0 -3
  4. package/dist/cjs/commands/populate-historic-data/lib/dependency-store.js +24 -141
  5. package/dist/cjs/commands/populate-historic-data/package.js +3 -27
  6. package/dist/cjs/commands/populate-historic-data/product.js +15 -88
  7. package/dist/cjs/commands/populate-historic-data/util/generate-csv.js +4 -16
  8. package/dist/cjs/index.js +0 -2
  9. package/dist/cjs/util/analytics.js +0 -38
  10. package/dist/cjs/util/assert.js +0 -1
  11. package/dist/cjs/util/env-with-guard.js +0 -2
  12. package/dist/cjs/util/get-file-history-from-git.js +0 -5
  13. package/dist/cjs/util/get-package-version-history.js +0 -6
  14. package/dist/cjs/util/git.js +20 -58
  15. package/dist/cjs/util/statlas.js +0 -25
  16. package/dist/cjs/util/yarn.js +0 -32
  17. package/dist/cjs/version.json +1 -1
  18. package/dist/es2019/cli.js +4 -8
  19. package/dist/es2019/commands/populate-historic-data/lib/dependency-store.js +24 -73
  20. package/dist/es2019/commands/populate-historic-data/package.js +0 -8
  21. package/dist/es2019/commands/populate-historic-data/product.js +4 -22
  22. package/dist/es2019/commands/populate-historic-data/util/generate-csv.js +2 -9
  23. package/dist/es2019/util/analytics.js +4 -19
  24. package/dist/es2019/util/env-with-guard.js +0 -1
  25. package/dist/es2019/util/get-file-history-from-git.js +2 -3
  26. package/dist/es2019/util/get-package-version-history.js +0 -4
  27. package/dist/es2019/util/git.js +29 -24
  28. package/dist/es2019/util/statlas.js +0 -6
  29. package/dist/es2019/util/yarn.js +2 -11
  30. package/dist/es2019/version.json +1 -1
  31. package/dist/esm/cli.js +6 -12
  32. package/dist/esm/commands/populate-historic-data/lib/dependency-store.js +27 -131
  33. package/dist/esm/commands/populate-historic-data/package.js +3 -20
  34. package/dist/esm/commands/populate-historic-data/product.js +15 -72
  35. package/dist/esm/commands/populate-historic-data/util/generate-csv.js +4 -13
  36. package/dist/esm/util/analytics.js +2 -28
  37. package/dist/esm/util/env-with-guard.js +0 -1
  38. package/dist/esm/util/get-file-history-from-git.js +2 -3
  39. package/dist/esm/util/get-package-version-history.js +0 -4
  40. package/dist/esm/util/git.js +21 -50
  41. package/dist/esm/util/statlas.js +0 -19
  42. package/dist/esm/util/yarn.js +0 -19
  43. package/dist/esm/version.json +1 -1
  44. package/package.json +4 -4
  45. package/report.api.md +1 -1
@@ -10,20 +10,18 @@ import * as statlas from '../../util/statlas';
10
10
  import { generateCSV } from './util/generate-csv';
11
11
  import { assert } from '../../util/assert';
12
12
  import { DependencyStore } from './lib/dependency-store';
13
-
14
13
  var getUpgradeEventsFromPkgChange = function getUpgradeEventsFromPkgChange(oldDeps, newDeps, _ref) {
15
14
  var date = _ref.date,
16
- commitHash = _ref.commitHash;
15
+ commitHash = _ref.commitHash;
17
16
  var addOrUpgradeEvents = Object.entries(newDeps).map(function (_ref2) {
18
17
  var _ref3 = _slicedToArray(_ref2, 2),
19
- name = _ref3[0],
20
- _ref3$ = _ref3[1],
21
- version = _ref3$.version,
22
- type = _ref3$.type;
23
-
24
- var prevDep = oldDeps[name]; // Only treat a dependency as previous if the dependency type matches
18
+ name = _ref3[0],
19
+ _ref3$ = _ref3[1],
20
+ version = _ref3$.version,
21
+ type = _ref3$.type;
22
+ var prevDep = oldDeps[name];
23
+ // Only treat a dependency as previous if the dependency type matches
25
24
  // Otherwise, we want separate add/remove events
26
-
27
25
  var prevVersion = prevDep && prevDep.type === type ? prevDep.version : undefined;
28
26
  return createUpgradeEvent(name, version, prevVersion, date, {
29
27
  commitHash: commitHash,
@@ -35,19 +33,18 @@ var getUpgradeEventsFromPkgChange = function getUpgradeEventsFromPkgChange(oldDe
35
33
  });
36
34
  var removeEvents = Object.entries(oldDeps).filter(function (_ref4) {
37
35
  var _ref5 = _slicedToArray(_ref4, 2),
38
- name = _ref5[0],
39
- type = _ref5[1].type;
40
-
41
- return (// Treat the same dep under a different dependency type as a new dep
36
+ name = _ref5[0],
37
+ type = _ref5[1].type;
38
+ return (
39
+ // Treat the same dep under a different dependency type as a new dep
42
40
  newDeps[name] == null || newDeps[name].type !== type
43
41
  );
44
42
  }).map(function (_ref6) {
45
43
  var _ref7 = _slicedToArray(_ref6, 2),
46
- name = _ref7[0],
47
- _ref7$ = _ref7[1],
48
- version = _ref7$.version,
49
- type = _ref7$.type;
50
-
44
+ name = _ref7[0],
45
+ _ref7$ = _ref7[1],
46
+ version = _ref7$.version,
47
+ type = _ref7$.type;
51
48
  return createUpgradeEvent(name, undefined, version, date, {
52
49
  commitHash: commitHash,
53
50
  dependencyType: type,
@@ -58,7 +55,6 @@ var getUpgradeEventsFromPkgChange = function getUpgradeEventsFromPkgChange(oldDe
58
55
  });
59
56
  return [].concat(_toConsumableArray(addOrUpgradeEvents), _toConsumableArray(removeEvents));
60
57
  };
61
-
62
58
  var getEventsFromHistory = /*#__PURE__*/function () {
63
59
  var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(packageChangesLog, prevRunHash, _ref8) {
64
60
  var cwd, allPackageChanges, allUpgradeEvents, dependencyStore, dependencies, i, item, newDependencies, packageChange, upgradeEvents;
@@ -73,26 +69,20 @@ var getEventsFromHistory = /*#__PURE__*/function () {
73
69
  dependencyStore = new DependencyStore(cwd);
74
70
  _context.next = 7;
75
71
  return dependencyStore.initialise(prevRunHash);
76
-
77
72
  case 7:
78
73
  dependencies = _context.sent;
79
74
  i = 0;
80
-
81
75
  case 9:
82
76
  if (!(i < packageChangesLog.all.length)) {
83
77
  _context.next = 21;
84
78
  break;
85
79
  }
86
-
87
80
  item = packageChangesLog.all[i];
88
-
89
81
  if (allPackageChanges.length > 0) {
90
82
  dependencies = allPackageChanges[allPackageChanges.length - 1].akDeps;
91
83
  }
92
-
93
84
  _context.next = 14;
94
85
  return dependencyStore.update(item);
95
-
96
86
  case 14:
97
87
  newDependencies = _context.sent;
98
88
  packageChange = {
@@ -103,23 +93,19 @@ var getEventsFromHistory = /*#__PURE__*/function () {
103
93
  date: packageChange.date,
104
94
  commitHash: item.hash
105
95
  });
106
-
107
96
  if (upgradeEvents.length > 0) {
108
97
  allUpgradeEvents.push.apply(allUpgradeEvents, _toConsumableArray(upgradeEvents));
109
98
  allPackageChanges.push(packageChange);
110
99
  }
111
-
112
100
  case 18:
113
101
  i++;
114
102
  _context.next = 9;
115
103
  break;
116
-
117
104
  case 21:
118
105
  return _context.abrupt("return", {
119
106
  allPackageChanges: allPackageChanges,
120
107
  allUpgradeEvents: allUpgradeEvents
121
108
  });
122
-
123
109
  case 22:
124
110
  case "end":
125
111
  return _context.stop();
@@ -127,16 +113,13 @@ var getEventsFromHistory = /*#__PURE__*/function () {
127
113
  }
128
114
  }, _callee);
129
115
  }));
130
-
131
116
  return function getEventsFromHistory(_x, _x2, _x3) {
132
117
  return _ref9.apply(this, arguments);
133
118
  };
134
119
  }();
135
-
136
120
  function getSinceRef(_x4) {
137
121
  return _getSinceRef.apply(this, arguments);
138
122
  }
139
-
140
123
  function _getSinceRef() {
141
124
  _getSinceRef = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(flags) {
142
125
  var meta, tag, tagExists;
@@ -148,45 +131,33 @@ function _getSinceRef() {
148
131
  _context2.next = 9;
149
132
  break;
150
133
  }
151
-
152
134
  _context2.next = 3;
153
135
  return statlas.getMeta(flags.product);
154
-
155
136
  case 3:
156
137
  meta = _context2.sent;
157
-
158
138
  if (!(!meta || !meta.lastRunHash)) {
159
139
  _context2.next = 6;
160
140
  break;
161
141
  }
162
-
163
142
  throw new Error(chalk.red("Missing or invalid metadata file for ".concat(flags.product, ". Must use --reset for populating from start of history")));
164
-
165
143
  case 6:
166
144
  return _context2.abrupt("return", meta.lastRunHash);
167
-
168
145
  case 9:
169
146
  tag = flags.tag || DEFAULT_TAG;
170
147
  _context2.next = 12;
171
148
  return refetchTag(tag);
172
-
173
149
  case 12:
174
150
  _context2.next = 14;
175
151
  return doesTagExist(tag);
176
-
177
152
  case 14:
178
153
  tagExists = _context2.sent;
179
-
180
154
  if (tagExists) {
181
155
  _context2.next = 17;
182
156
  break;
183
157
  }
184
-
185
158
  throw new Error(chalk.red("Tag '".concat(tag, "' does not exist. Must use --reset for populating from start of history.")));
186
-
187
159
  case 17:
188
160
  return _context2.abrupt("return", tag);
189
-
190
161
  case 18:
191
162
  case "end":
192
163
  return _context2.stop();
@@ -196,88 +167,69 @@ function _getSinceRef() {
196
167
  }));
197
168
  return _getSinceRef.apply(this, arguments);
198
169
  }
199
-
200
170
  export default function populateProduct(_x5) {
201
171
  return _populateProduct.apply(this, arguments);
202
172
  }
203
-
204
173
  function _populateProduct() {
205
174
  _populateProduct = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(flags) {
206
175
  var cwd, sinceRef, log, _yield$getEventsFromH, allPackageChanges, allUpgradeEvents, csv, currentCommit;
207
-
208
176
  return _regeneratorRuntime.wrap(function _callee3$(_context3) {
209
177
  while (1) {
210
178
  switch (_context3.prev = _context3.next) {
211
179
  case 0:
212
180
  cwd = flags.cwd || process.cwd();
213
-
214
181
  if (!flags.reset) {
215
182
  _context3.next = 5;
216
183
  break;
217
184
  }
218
-
219
185
  _context3.t0 = undefined;
220
186
  _context3.next = 8;
221
187
  break;
222
-
223
188
  case 5:
224
189
  _context3.next = 7;
225
190
  return getSinceRef(flags);
226
-
227
191
  case 7:
228
192
  _context3.t0 = _context3.sent;
229
-
230
193
  case 8:
231
194
  sinceRef = _context3.t0;
232
195
  _context3.next = 11;
233
196
  return getChangesSince(sinceRef);
234
-
235
197
  case 11:
236
198
  log = _context3.sent;
237
-
238
199
  if (!(log.all.length === 0)) {
239
200
  _context3.next = 15;
240
201
  break;
241
202
  }
242
-
243
203
  console.log("No package.json changes found since '".concat(sinceRef, "'."));
244
204
  return _context3.abrupt("return");
245
-
246
205
  case 15:
247
206
  _context3.next = 17;
248
207
  return getEventsFromHistory(log, sinceRef, {
249
208
  cwd: cwd
250
209
  });
251
-
252
210
  case 17:
253
211
  _yield$getEventsFromH = _context3.sent;
254
212
  allPackageChanges = _yield$getEventsFromH.allPackageChanges;
255
213
  allUpgradeEvents = _yield$getEventsFromH.allUpgradeEvents;
256
-
257
214
  if (!flags.csv) {
258
215
  _context3.next = 24;
259
216
  break;
260
217
  }
261
-
262
218
  csv = generateCSV(allPackageChanges);
263
219
  console.log(csv);
264
220
  return _context3.abrupt("return");
265
-
266
221
  case 24:
267
222
  if (!flags.dryRun) {
268
223
  _context3.next = 27;
269
224
  break;
270
225
  }
271
-
272
226
  console.log(JSON.stringify(allUpgradeEvents));
273
227
  return _context3.abrupt("return");
274
-
275
228
  case 27:
276
229
  if (!(allUpgradeEvents.length > 0)) {
277
230
  _context3.next = 32;
278
231
  break;
279
232
  }
280
-
281
233
  _context3.next = 30;
282
234
  return sendAnalytics(allUpgradeEvents, {
283
235
  dev: flags.dev,
@@ -285,41 +237,32 @@ function _populateProduct() {
285
237
  product: flags.product,
286
238
  skipPrompt: !flags.interactive
287
239
  });
288
-
289
240
  case 30:
290
241
  _context3.next = 33;
291
242
  break;
292
-
293
243
  case 32:
294
244
  console.log("Found no AK dependency changes since last run from ref \"".concat(sinceRef, "\"'"));
295
-
296
245
  case 33:
297
246
  if (!flags.statlas) {
298
247
  _context3.next = 42;
299
248
  break;
300
249
  }
301
-
302
250
  _context3.next = 36;
303
251
  return getHash('HEAD');
304
-
305
252
  case 36:
306
253
  currentCommit = _context3.sent;
307
254
  _context3.next = 39;
308
255
  return statlas.uploadMeta(flags.product, currentCommit);
309
-
310
256
  case 39:
311
257
  console.log('Finished');
312
258
  _context3.next = 46;
313
259
  break;
314
-
315
260
  case 42:
316
261
  console.log('Updating tag to current commit...');
317
262
  _context3.next = 45;
318
263
  return tagCommit(DEFAULT_TAG);
319
-
320
264
  case 45:
321
265
  console.log("Finished. Run 'git push origin tag ".concat(sinceRef, "'."));
322
-
323
266
  case 46:
324
267
  case "end":
325
268
  return _context3.stop();
@@ -1,5 +1,4 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
-
3
2
  /** Generates a CSV of product package changes over time */
4
3
  export var generateCSV = function generateCSV(packageChanges) {
5
4
  var csvData = [['']];
@@ -8,22 +7,19 @@ export var generateCSV = function generateCSV(packageChanges) {
8
7
  var currentRow = firstColumn.push(packageChange.date) - 1;
9
8
  Object.entries(packageChange.akDeps).forEach(function (_ref) {
10
9
  var _ref2 = _slicedToArray(_ref, 2),
11
- name = _ref2[0],
12
- version = _ref2[1].version;
13
-
10
+ name = _ref2[0],
11
+ version = _ref2[1].version;
14
12
  var depColumnIndex = csvData.findIndex(function (item) {
15
13
  return item[0] === name;
16
14
  });
17
-
18
15
  if (depColumnIndex === -1) {
19
16
  depColumnIndex = csvData.push([name]) - 1;
20
- } // console.log(csvData)
21
-
17
+ }
22
18
 
19
+ // console.log(csvData)
23
20
  csvData[depColumnIndex][currentRow] = version;
24
21
  });
25
22
  });
26
-
27
23
  for (var i = 0; i < csvData.length; i++) {
28
24
  for (var j = 0; j < csvData.length; j++) {
29
25
  if (typeof csvData[i][j] !== 'string') {
@@ -31,23 +27,18 @@ export var generateCSV = function generateCSV(packageChanges) {
31
27
  csvData[i][j] = '';
32
28
  }
33
29
  }
34
-
35
30
  if (i !== 0 && csvData[0].length < csvData[i].length) {}
36
31
  }
37
-
38
32
  var csvStrings = [];
39
33
  csvData.forEach(function (column) {
40
34
  if (!column) {
41
35
  return;
42
36
  }
43
-
44
37
  for (var rowIndex = 0; rowIndex < csvData[0].length; rowIndex++) {
45
38
  var rowItem = column[rowIndex] || '';
46
-
47
39
  if (typeof csvStrings[rowIndex] !== 'string') {
48
40
  csvStrings[rowIndex] = '';
49
41
  }
50
-
51
42
  csvStrings[rowIndex] += "\"".concat(rowItem, "\",");
52
43
  }
53
44
  });
@@ -1,20 +1,15 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import _regeneratorRuntime from "@babel/runtime/regenerator";
4
-
5
4
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
-
7
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
-
9
- import chalk from 'chalk'; // @ts-ignore
10
-
6
+ import chalk from 'chalk';
7
+ // @ts-ignore
11
8
  import inquirer from 'inquirer';
12
9
  import semver from 'semver';
13
10
  /* eslint-disable-next-line import/no-unresolved */
14
-
15
11
  import { analyticsClient } from '@atlassiansox/analytics-node-client';
16
12
  import { version as packageVersion } from '../version.json';
17
-
18
13
  function getUpgradeType(version, previousVersion) {
19
14
  if (previousVersion == null && version != null) {
20
15
  return 'add';
@@ -23,12 +18,10 @@ function getUpgradeType(version, previousVersion) {
23
18
  } else if (previousVersion != null && version != null && previousVersion !== version) {
24
19
  var coercedPrevious = semver.coerce(previousVersion);
25
20
  var coercedNew = semver.coerce(version);
26
-
27
21
  if (coercedNew == null) {
28
22
  console.error("Found invalid version \"".concat(version, "\", skipping"));
29
23
  return null;
30
24
  }
31
-
32
25
  if (coercedPrevious != null && semver.lt(coercedNew, coercedPrevious)) {
33
26
  return 'downgrade';
34
27
  } else {
@@ -38,38 +31,28 @@ function getUpgradeType(version, previousVersion) {
38
31
  return null;
39
32
  }
40
33
  }
41
-
42
34
  function getUpgradeSubType(version, previousVersion) {
43
35
  var upgradeSubType = null;
44
-
45
36
  if (version == null || previousVersion == null) {
46
37
  return upgradeSubType;
47
38
  }
48
-
49
39
  var parsedOld = semver.coerce(previousVersion);
50
40
  var parsedNew = semver.coerce(version);
51
-
52
41
  if (parsedOld && parsedNew) {
53
42
  upgradeSubType = semver.diff(parsedOld.version, parsedNew.version);
54
43
  }
55
-
56
44
  return upgradeSubType;
57
45
  }
58
-
59
46
  export function createUpgradeEvent(name, version, previousVersion, date) {
60
47
  var optionalArgs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
61
-
62
48
  if (Number.isNaN(Date.parse(date))) {
63
49
  throw new Error("Invalid date: '".concat(date, "'"));
64
50
  }
65
-
66
51
  var upgradeType = getUpgradeType(version, previousVersion);
67
-
68
52
  if (!upgradeType) {
69
53
  // Not an upgrade for this dependency, return null
70
54
  return null;
71
55
  }
72
-
73
56
  var upgradeSubType = getUpgradeSubType(version, previousVersion);
74
57
  var eventVersion = upgradeType !== 'remove' ? version : previousVersion;
75
58
  var parsedVersion = semver.coerce(eventVersion);
@@ -88,7 +71,6 @@ export function createUpgradeEvent(name, version, previousVersion, date) {
88
71
  export function sendAnalytics(_x, _x2) {
89
72
  return _sendAnalytics.apply(this, arguments);
90
73
  }
91
-
92
74
  function _sendAnalytics() {
93
75
  _sendAnalytics = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(analyticsEvents, _ref) {
94
76
  var dev, limit, product, skipPrompt, analyticsEnv, eventsToSend, client, answers, promises;
@@ -103,12 +85,10 @@ function _sendAnalytics() {
103
85
  env: dev ? 'dev' : 'prod',
104
86
  product: product
105
87
  });
106
-
107
88
  if (skipPrompt) {
108
89
  _context.next = 9;
109
90
  break;
110
91
  }
111
-
112
92
  _context.next = 7;
113
93
  return inquirer.prompt([{
114
94
  type: 'confirm',
@@ -116,15 +96,12 @@ function _sendAnalytics() {
116
96
  message: "Are you sure you want to send ".concat(eventsToSend.length, " historical analytics events to '").concat(analyticsEnv, "' env for product '").concat(product, "?"),
117
97
  default: false
118
98
  }]);
119
-
120
99
  case 7:
121
100
  answers = _context.sent;
122
-
123
101
  if (!answers.continue) {
124
102
  console.log('Aborting');
125
103
  process.exit(0);
126
104
  }
127
-
128
105
  case 9:
129
106
  _context.prev = 9;
130
107
  _context.next = 12;
@@ -142,20 +119,17 @@ function _sendAnalytics() {
142
119
  }
143
120
  });
144
121
  }));
145
-
146
122
  case 12:
147
123
  promises = _context.sent;
148
124
  console.log(chalk.green("Sent ".concat(promises.length, " dependency version upgrade analytics events")));
149
125
  _context.next = 21;
150
126
  break;
151
-
152
127
  case 16:
153
128
  _context.prev = 16;
154
129
  _context.t0 = _context["catch"](9);
155
130
  console.error(chalk.red('Sending analytics failed'));
156
131
  console.error(_context.t0);
157
132
  process.exit(1);
158
-
159
133
  case 21:
160
134
  case "end":
161
135
  return _context.stop();
@@ -2,6 +2,5 @@ export default function (name) {
2
2
  if (!process.env.hasOwnProperty(name) || !process.env[name] || typeof process.env[name] !== 'string') {
3
3
  return null;
4
4
  }
5
-
6
5
  return process.env[name];
7
6
  }
@@ -1,5 +1,6 @@
1
- import { exec } from 'child_process'; // Lock files tend to be huge
1
+ import { exec } from 'child_process';
2
2
 
3
+ // Lock files tend to be huge
3
4
  var FiveMBBuffer = 1024 * 5000;
4
5
  export default function getFileHistoryFromGit(fileName) {
5
6
  return new Promise(function (resolve, reject) {
@@ -9,11 +10,9 @@ export default function getFileHistoryFromGit(fileName) {
9
10
  if (error) {
10
11
  reject(error);
11
12
  }
12
-
13
13
  if (stderr) {
14
14
  reject(stderr);
15
15
  }
16
-
17
16
  resolve(stdout);
18
17
  });
19
18
  });
@@ -5,19 +5,15 @@ export default function getPackageVersionHistory(packageName) {
5
5
  if (error) {
6
6
  reject(error);
7
7
  }
8
-
9
8
  if (stderr) {
10
9
  reject(stderr);
11
10
  }
12
-
13
11
  var json;
14
-
15
12
  try {
16
13
  json = JSON.parse(stdout).data;
17
14
  } catch (e) {
18
15
  reject("Error parsing json output: ".concat(e));
19
16
  }
20
-
21
17
  resolve(json);
22
18
  });
23
19
  });