ts-node-client 3.1.0 → 3.2.1

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,327 +1,334 @@
1
- /* eslint-disable */
2
- /**********************************************************
3
- * Copyright (c) 2017. Enterprise Architecture Group, EACG
4
- *
5
- * SPDX-License-Identifier: Apache-2.0
6
- *********************************************************/
7
- /* eslint-enable */
8
-
9
- const fs = require('fs');
10
- const path = require('path');
11
- // eslint-disable-next-line import/no-extraneous-dependencies
12
- const lockfile = require('@yarnpkg/lockfile');
13
- const yaml = require('js-yaml');
14
- const debuglog = (require('debuglog'))('ts-npm-scanner');
15
- const ScanResult = require('./scanresult');
16
- const { RestClient } = require('./rest-client');
17
- const Dependency = require('./dependency');
18
-
19
- exports.Scanner = Scanner;
20
-
21
- function Scanner(options) {
22
- this.options = options;
23
- this.name = 'ts-npm-scanner';
24
- }
25
-
26
- function getPackageJson(self) {
27
- try {
28
- const file = path.resolve(process.cwd(), 'package.json');
29
- const data = fs.readFileSync(file);
30
- if (data && data.code === 'ENOENT') {
31
- debuglog('npm.fs.package - error:', data);
32
- return null;
33
- }
34
- const jsonFile = JSON.parse(data);
35
- debuglog('Project: ', jsonFile.name, jsonFile.version);
36
- const dependencies = self.walkPackage(jsonFile, 0, jsonFile);
37
- return { root: jsonFile, dependencies };
38
- } catch (e) {
39
- debuglog('npm.fs.package - error:', e);
40
- return null;
41
- }
42
- }
43
- function getPackageLockJson(self) {
44
- try {
45
- const file = path.resolve(process.cwd(), 'package-lock.json');
46
- const data = fs.readFileSync(file);
47
- if (data && data.code === 'ENOENT') {
48
- debuglog('npm.fs.package-lock - error:', data);
49
- return null;
50
- }
51
- const jsonFile = JSON.parse(data);
52
- debuglog('Project: ', jsonFile.name, jsonFile.version);
53
- const dependencies = self.walk(jsonFile, 0, jsonFile);
54
- return { root: jsonFile, dependencies };
55
- } catch (e) {
56
- debuglog('npm.fs.package-lock - error:', e);
57
- return null;
58
- }
59
- }
60
- function getYarnLock(self, packageData) {
61
- try {
62
- const file = path.resolve(process.cwd(), 'yarn.lock');
63
- const data = fs.readFileSync(file);
64
- if (data && data.code === 'ENOENT') {
65
- debuglog('npm.fs.yarn-lock - error:', data);
66
- return null;
67
- }
68
- // yarn 1
69
- try {
70
- const jsonFile = lockfile.parse(data.toString());
71
- if (jsonFile && jsonFile.type === 'success') {
72
- const dependencies = yarnToResults(self, jsonFile.object, packageData);
73
- return { root: jsonFile, dependencies };
74
- }
75
- } catch (e) {
76
- debuglog('npm.fs.yarn-v1-lock - error:', e);
77
- }
78
- // yarn 2+
79
- try {
80
- const json = yaml.load(data.toString());
81
- // eslint-disable-next-line no-underscore-dangle
82
- if (json && json.__metadata) {
83
- // eslint-disable-next-line no-underscore-dangle
84
- delete json.__metadata;
85
- const dependencies = yarnToResults(self, json, packageData);
86
- return { root: json, dependencies };
87
- }
88
- } catch (e) {
89
- debuglog('npm.fs.yarn-v2-lock - error:', e);
90
- }
91
- debuglog('npm.fs.yarn-lock - error: Failed to parse file');
92
- return null;
93
- } catch (e) {
94
- debuglog('npm.fs.yarn-lock - error:', e);
95
- return null;
96
- }
97
- }
98
-
99
- function yarnToResults(self, json, packageData) {
100
- const base = {
101
- name: (packageData && packageData.root && packageData.root.name) || 'root',
102
- version: (packageData && packageData.root && packageData.root.version) || '1',
103
- dependencies: json
104
- };
105
- debuglog('Project: ', base.name, base.version);
106
- return self.walkYarn(base, 0, base);
107
- }
108
-
109
- function saveResults(cb, options, root, dependencies) {
110
- const result = new ScanResult(options.project, root.name, `npm:${root.name}`, dependencies);
111
- debuglog('result: ', JSON.stringify(result));
112
- cb(undefined, result);
113
- }
114
-
115
- Scanner.prototype.scan = function scan(cb) {
116
- const self = this;
117
- const { options } = this;
118
-
119
- const packageData = getPackageJson(self);
120
- const packageLockData = getPackageLockJson(self);
121
- const yarnLockData = getYarnLock(self, packageData);
122
- if (packageData && yarnLockData) {
123
- yarnLockData.root = packageData.root;
124
- }
125
- const data = packageLockData || yarnLockData || packageData;
126
- if (data && data.root) {
127
- saveResults(cb, options, data.root, data.dependencies);
128
- } else {
129
- const err = {
130
- status: 404,
131
- message: 'No results found in `package-lock.json` or `package.json` or `yarn.lock`'
132
- };
133
- debuglog('result: ', JSON.stringify(err));
134
- cb(err);
135
- }
136
- };
137
-
138
- Scanner.prototype.transfer = function transfer(scan, cb) {
139
- const client = new RestClient(this.options);
140
- client.transfer(scan, cb);
141
- };
142
-
143
- /* eslint-disable no-underscore-dangle, prefer-rest-params, no-mixed-operators */
144
- Scanner.prototype.walk = function walk(npmDependency, level, root) {
145
- const self = this;
146
- const opts = this.options || {};
147
- level = level || 0;
148
-
149
- printDependency(npmDependency, level);
150
-
151
- if (npmDependency.name) {
152
- let pkg = root && root.packages && root.packages[`node_modules/${npmDependency.name}`];
153
- if (!pkg) {
154
- pkg = root && root.packages && root.packages[''];
155
- }
156
- let repository = npmDependency.repository && npmDependency.repository.url;
157
- if (!repository) {
158
- repository = pkg && pkg.repository && pkg.repository.url;
159
- }
160
- const dependency = new Dependency(
161
- npmDependency.name,
162
- npmDependency.version,
163
- 'npm',
164
- npmDependency.description,
165
- npmDependency.private,
166
- npmDependency.licenses || npmDependency.license || (pkg && (pkg.licenses || pkg.license)),
167
- npmDependency.homepage || (pkg && pkg.homepage),
168
- repository
169
- );
170
- if (npmDependency.dependencies) {
171
- Object.getOwnPropertyNames(npmDependency.dependencies).forEach((val) => {
172
- const childDependency = npmDependency.dependencies[val];
173
- if (childDependency) {
174
- childDependency.name = val;
175
- }
176
- checkForChild(self, opts, dependency, childDependency, val, level, root);
177
- });
178
- }
179
- return dependency;
180
- }
181
- return null;
182
- };
183
-
184
- function checkForChild(self, opts, dependency, childDependency, val, level, root) {
185
- let child = null;
186
-
187
- function log() {
188
- const args = [].slice.call(arguments, 0);
189
- if (opts.verbose) {
190
- console.log.apply(this, args);
191
- } else {
192
- debuglog.apply(this, args);
193
- }
194
- }
195
- // check for errorneous dependencies (e.g a nmp-debug.log file)
196
- if (childDependency.error) {
197
- log('Skipping errorneous dependency on level %d: ', level, val);
198
- // check for blacklisted dependencies on level 0
199
- } else if (level === 0 && (opts.exclude instanceof Array && opts.exclude.indexOf(val) >= 0 || opts.exclude === val)) {
200
- log('Skipping level 0 blacklisted dependency: ', val);
201
- // include dev dependencies on level 0 if configured
202
- } else if (level === 0 && opts.includeDevDependencies && childDependency && childDependency.dev) {
203
- log('Adding level 0 devDependency:', val);
204
- child = self.walk(childDependency, level + 1, root);
205
- // include runtime dependencies
206
- } else if (childDependency && !childDependency.dev) {
207
- log('Adding dependency on level %d:', level, val);
208
- child = self.walk(childDependency, level + 1, root);
209
- } else {
210
- log('Skipping undeclared dependency on level %d: ', level, val);
211
- }
212
- if (child) {
213
- dependency.addDependency(child);
214
- }
215
- }
216
-
217
- /* eslint-enable no-underscore-dangle, prefer-rest-params, no-mixed-operators */
218
- // eslint-disable-next-line sonarjs/cognitive-complexity
219
- Scanner.prototype.walkPackage = function walkPackage(npmDependency, level) {
220
- const self = this;
221
- const opts = this.options || {};
222
- level = level || 0;
223
-
224
- printDependency(npmDependency, level);
225
-
226
- if (npmDependency.name) {
227
- const repository = npmDependency.repository && npmDependency.repository.url;
228
- const dependency = new Dependency(
229
- npmDependency.name,
230
- npmDependency.version,
231
- 'npm',
232
- npmDependency.description,
233
- npmDependency.private,
234
- npmDependency.licenses || npmDependency.license,
235
- npmDependency.homepage,
236
- repository
237
- );
238
- if (npmDependency.dependencies) {
239
- Object.getOwnPropertyNames(npmDependency.dependencies).forEach((val) => {
240
- const childDependency = {
241
- name: val,
242
- version: npmDependency.dependencies[val]
243
- };
244
-
245
- checkForChild(self, opts, dependency, childDependency, val, level);
246
- });
247
- if (opts.includeDevDependencies) {
248
- Object.getOwnPropertyNames(npmDependency.devDependencies).forEach((val) => {
249
- const childDependency = {
250
- name: val,
251
- version: npmDependency.devDependencies[val]
252
- };
253
-
254
- checkForChild(self, opts, dependency, childDependency, val, level);
255
- });
256
- }
257
- }
258
- return dependency;
259
- }
260
- return null;
261
- };
262
-
263
- // eslint-disable-next-line sonarjs/cognitive-complexity
264
- Scanner.prototype.walkYarn = function walkPackage(npmDependency, level) {
265
- const self = this;
266
- const opts = this.options || {};
267
- level = level || 0;
268
-
269
- printDependency(npmDependency, level);
270
-
271
- if (npmDependency.name) {
272
- const repository = npmDependency.repository && npmDependency.repository.url;
273
- const dependency = new Dependency(
274
- npmDependency.name,
275
- npmDependency.version,
276
- 'npm',
277
- npmDependency.description,
278
- npmDependency.private,
279
- npmDependency.licenses || npmDependency.license,
280
- npmDependency.homepage,
281
- repository
282
- );
283
- if (npmDependency.dependencies) {
284
- Object.getOwnPropertyNames(npmDependency.dependencies).forEach((val) => {
285
- const name = val.split('@')[0];
286
- const depData = npmDependency.dependencies[val];
287
- const version = (depData && depData.version) || depData;
288
- const childDependency = {
289
- name,
290
- version: version && typeof version === 'string' ? version : null
291
- };
292
-
293
- checkForChild(self, opts, dependency, childDependency, val, level);
294
- });
295
- if (opts.includeDevDependencies) {
296
- Object.getOwnPropertyNames(npmDependency.devDependencies).forEach((val) => {
297
- const depData = npmDependency.devDependencies[val];
298
- const version = (depData && depData.version) || depData;
299
- const childDependency = {
300
- name: val,
301
- version: version && typeof version === 'string' ? version : null
302
- };
303
-
304
- checkForChild(self, opts, dependency, childDependency, val, level);
305
- });
306
- }
307
- }
308
- return dependency;
309
- }
310
- return null;
311
- };
312
-
313
- function printDependency(dep, level) {
314
- level = level || 0;
315
- const fill = level === 0 ? '' : new Array(level * 4).join(' ');
316
-
317
- debuglog(`${fill}-----------------------------------------`);
318
- debuglog(`${fill}Name, Version: `, dep.name, dep.version);
319
- debuglog(`${fill}License: `, dep.license || dep.licenses);
320
- debuglog(`${fill}Private: `, dep.private);
321
- debuglog(`${fill}Description: `, dep.description);
322
- if (dep.repository) {
323
- debuglog(`${fill}Repository type:`, dep.repository.type);
324
- debuglog(`${fill}Repository url:`, dep.repository.url);
325
- }
326
- debuglog(`${fill}Homepage: `, dep.homepage);
327
- }
1
+ /* eslint-disable */
2
+ /**********************************************************
3
+ * Copyright (c) 2017. Enterprise Architecture Group, EACG
4
+ *
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ *********************************************************/
7
+ /* eslint-enable */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ // eslint-disable-next-line import/no-extraneous-dependencies
12
+ const lockfile = require('@yarnpkg/lockfile');
13
+ const yaml = require('js-yaml');
14
+ const debuglog = (require('debuglog'))('ts-npm-scanner');
15
+ const ScanResult = require('./scanresult');
16
+ const { RestClient } = require('./rest-client');
17
+ const Dependency = require('./dependency');
18
+
19
+ exports.Scanner = Scanner;
20
+
21
+ function Scanner(options) {
22
+ this.options = options;
23
+ this.name = 'ts-npm-scanner';
24
+ }
25
+
26
+ function getPackageJson(self) {
27
+ try {
28
+ const file = path.resolve(process.cwd(), 'package.json');
29
+ const data = fs.readFileSync(file);
30
+ if (data && data.code === 'ENOENT') {
31
+ debuglog('npm.fs.package - error:', data);
32
+ return null;
33
+ }
34
+ const jsonFile = JSON.parse(data);
35
+ debuglog('Project: ', jsonFile.name, jsonFile.version);
36
+ const dependencies = self.walkPackage(jsonFile, 0, jsonFile);
37
+ return { root: jsonFile, dependencies };
38
+ } catch (e) {
39
+ debuglog('npm.fs.package - error:', e);
40
+ return null;
41
+ }
42
+ }
43
+ function getPackageLockJson(self) {
44
+ try {
45
+ const file = path.resolve(process.cwd(), 'package-lock.json');
46
+ const data = fs.readFileSync(file);
47
+ if (data && data.code === 'ENOENT') {
48
+ debuglog('npm.fs.package-lock - error:', data);
49
+ return null;
50
+ }
51
+ const jsonFile = JSON.parse(data);
52
+ debuglog('Project: ', jsonFile.name, jsonFile.version);
53
+ const dependencies = self.walk(jsonFile, 0, JSON.parse(JSON.stringify(jsonFile)));
54
+ return { root: jsonFile, dependencies };
55
+ } catch (e) {
56
+ debuglog('npm.fs.package-lock - error:', e);
57
+ return null;
58
+ }
59
+ }
60
+ function getYarnLock(self, packageData) {
61
+ try {
62
+ const file = path.resolve(process.cwd(), 'yarn.lock');
63
+ const data = fs.readFileSync(file);
64
+ if (data && data.code === 'ENOENT') {
65
+ debuglog('npm.fs.yarn-lock - error:', data);
66
+ return null;
67
+ }
68
+ // yarn 1
69
+ try {
70
+ const jsonFile = lockfile.parse(data.toString());
71
+ if (jsonFile && jsonFile.type === 'success') {
72
+ const dependencies = yarnToResults(self, jsonFile.object, packageData);
73
+ return { root: jsonFile, dependencies };
74
+ }
75
+ } catch (e) {
76
+ debuglog('npm.fs.yarn-v1-lock - error:', e);
77
+ }
78
+ // yarn 2+
79
+ try {
80
+ const json = yaml.load(data.toString());
81
+ // eslint-disable-next-line no-underscore-dangle
82
+ if (json && json.__metadata) {
83
+ // eslint-disable-next-line no-underscore-dangle
84
+ delete json.__metadata;
85
+ const dependencies = yarnToResults(self, json, packageData);
86
+ return { root: json, dependencies };
87
+ }
88
+ } catch (e) {
89
+ debuglog('npm.fs.yarn-v2-lock - error:', e);
90
+ }
91
+ debuglog('npm.fs.yarn-lock - error: Failed to parse file');
92
+ return null;
93
+ } catch (e) {
94
+ debuglog('npm.fs.yarn-lock - error:', e);
95
+ return null;
96
+ }
97
+ }
98
+ function yarnToResults(self, json, packageData) {
99
+ const base = {
100
+ name: (packageData && packageData.root && packageData.root.name) || 'root',
101
+ version: (packageData && packageData.root && packageData.root.version) || '1',
102
+ dependencies: json
103
+ };
104
+ debuglog('Project: ', base.name, base.version);
105
+ return self.walkYarn(base, 0, base);
106
+ }
107
+ function saveResults(cb, options, root, dependencies) {
108
+ const result = new ScanResult(options.project, root.name, `npm:${root.name}`, dependencies);
109
+ debuglog('result: ', JSON.stringify(result));
110
+ cb(undefined, result);
111
+ }
112
+
113
+ Scanner.prototype.scan = function scan(cb) {
114
+ const self = this;
115
+ const { options } = this;
116
+
117
+ const packageData = getPackageJson(self);
118
+ const packageLockData = getPackageLockJson(self);
119
+ const yarnLockData = getYarnLock(self, packageData);
120
+ if (packageData && yarnLockData) {
121
+ yarnLockData.root = packageData.root;
122
+ }
123
+ const data = packageLockData || yarnLockData || packageData;
124
+ if (data && data.root) {
125
+ saveResults(cb, options, data.root, data.dependencies);
126
+ } else {
127
+ const err = {
128
+ status: 404,
129
+ message: 'No results found in `package-lock.json` or `package.json` or `yarn.lock`'
130
+ };
131
+ debuglog('result: ', JSON.stringify(err));
132
+ cb(err);
133
+ }
134
+ };
135
+
136
+ Scanner.prototype.transfer = function transfer(scan, cb) {
137
+ const client = new RestClient(this.options);
138
+ client.transfer(scan, cb);
139
+ };
140
+
141
+ /* eslint-disable no-underscore-dangle, prefer-rest-params, no-mixed-operators */
142
+ Scanner.prototype.walk = function walk(npmDependency, level, root) {
143
+ const self = this;
144
+ const opts = this.options || {};
145
+ level = level || 0;
146
+
147
+ printDependency(npmDependency, level);
148
+ if (npmDependency.name) {
149
+ let pkg = root && root.packages && root.packages[`node_modules/${npmDependency.name}`];
150
+ if (!pkg) {
151
+ pkg = root && root.packages && root.packages[''];
152
+ }
153
+ let repository = npmDependency.repository && npmDependency.repository.url;
154
+ if (!repository) {
155
+ repository = pkg && pkg.repository && pkg.repository.url;
156
+ }
157
+ const dependency = new Dependency(
158
+ npmDependency.name,
159
+ npmDependency.version,
160
+ 'npm',
161
+ npmDependency.description,
162
+ npmDependency.private,
163
+ npmDependency.licenses || npmDependency.license || (pkg && (pkg.licenses || pkg.license)),
164
+ npmDependency.homepage || (pkg && pkg.homepage),
165
+ repository
166
+ );
167
+ if (npmDependency.dependencies) {
168
+ Object.getOwnPropertyNames(npmDependency.dependencies).forEach((val) => {
169
+ const childDependency = npmDependency.dependencies[val];
170
+ if (childDependency) {
171
+ childDependency.name = val;
172
+ }
173
+ checkForChild(self, opts, dependency, childDependency, val, level, root);
174
+ });
175
+ } else if (npmDependency.packages) {
176
+ Object.getOwnPropertyNames(npmDependency.packages).forEach((val) => {
177
+ const childDependency = npmDependency.packages[val];
178
+ if (childDependency) {
179
+ const parts = val.split('node_modules/');
180
+ childDependency.name = parts.length > 1 ? parts.slice(1).join('node_modules/') : parts[0];
181
+ }
182
+ checkForChild(self, opts, dependency, childDependency, val, level, root);
183
+ });
184
+ }
185
+ return dependency;
186
+ }
187
+ return null;
188
+ };
189
+
190
+ function checkForChild(self, opts, dependency, childDependency, val, level, root) {
191
+ let child = null;
192
+
193
+ function log() {
194
+ const args = [].slice.call(arguments, 0);
195
+ if (opts.verbose) {
196
+ console.log.apply(this, args);
197
+ } else {
198
+ debuglog.apply(this, args);
199
+ }
200
+ }
201
+ // check for errorneous dependencies (e.g a nmp-debug.log file)
202
+ if (childDependency.error) {
203
+ log('Skipping errorneous dependency on level %d: ', level, val);
204
+ // check for blacklisted dependencies on level 0
205
+ } else if (level === 0 && (opts.exclude instanceof Array && opts.exclude.indexOf(val) >= 0 || opts.exclude === val)) {
206
+ log('Skipping level 0 blacklisted dependency: ', val);
207
+ // include dev dependencies on level 0 if configured
208
+ } else if (level === 0 && opts.includeDevDependencies
209
+ && (opts.includeDevDependencies !== 'false') && childDependency && childDependency.dev) {
210
+ log('Adding level 0 devDependency:', val);
211
+ child = self.walk(childDependency, level + 1, root);
212
+ // include runtime dependencies
213
+ } else if (childDependency && !childDependency.dev) {
214
+ log('Adding dependency on level %d:', level, val);
215
+ child = self.walk(childDependency, level + 1, root);
216
+ } else {
217
+ log('Skipping undeclared dependency on level %d: ', level, val);
218
+ }
219
+ if (child) {
220
+ dependency.addDependency(child);
221
+ }
222
+ }
223
+
224
+ /* eslint-enable no-underscore-dangle, prefer-rest-params, no-mixed-operators */
225
+ // eslint-disable-next-line sonarjs/cognitive-complexity
226
+ Scanner.prototype.walkPackage = function walkPackage(npmDependency, level) {
227
+ const self = this;
228
+ const opts = this.options || {};
229
+ level = level || 0;
230
+
231
+ printDependency(npmDependency, level);
232
+
233
+ if (npmDependency.name) {
234
+ const repository = npmDependency.repository && npmDependency.repository.url;
235
+ const dependency = new Dependency(
236
+ npmDependency.name,
237
+ npmDependency.version,
238
+ 'npm',
239
+ npmDependency.description,
240
+ npmDependency.private,
241
+ npmDependency.licenses || npmDependency.license,
242
+ npmDependency.homepage,
243
+ repository
244
+ );
245
+ if (npmDependency.dependencies) {
246
+ Object.getOwnPropertyNames(npmDependency.dependencies).forEach((val) => {
247
+ const childDependency = {
248
+ name: val,
249
+ version: npmDependency.dependencies[val]
250
+ };
251
+
252
+ checkForChild(self, opts, dependency, childDependency, val, level);
253
+ });
254
+ if (opts.includeDevDependencies) {
255
+ Object.getOwnPropertyNames(npmDependency.devDependencies).forEach((val) => {
256
+ const childDependency = {
257
+ name: val,
258
+ version: npmDependency.devDependencies[val]
259
+ };
260
+
261
+ checkForChild(self, opts, dependency, childDependency, val, level);
262
+ });
263
+ }
264
+ }
265
+ return dependency;
266
+ }
267
+ return null;
268
+ };
269
+
270
+ // eslint-disable-next-line sonarjs/cognitive-complexity
271
+ Scanner.prototype.walkYarn = function walkPackage(npmDependency, level) {
272
+ const self = this;
273
+ const opts = this.options || {};
274
+ level = level || 0;
275
+
276
+ printDependency(npmDependency, level);
277
+
278
+ if (npmDependency.name) {
279
+ const repository = npmDependency.repository && npmDependency.repository.url;
280
+ const dependency = new Dependency(
281
+ npmDependency.name,
282
+ npmDependency.version,
283
+ 'npm',
284
+ npmDependency.description,
285
+ npmDependency.private,
286
+ npmDependency.licenses || npmDependency.license,
287
+ npmDependency.homepage,
288
+ repository
289
+ );
290
+ if (npmDependency.dependencies) {
291
+ Object.getOwnPropertyNames(npmDependency.dependencies).forEach((val) => {
292
+ const name = val.split('@')[0];
293
+ const depData = npmDependency.dependencies[val];
294
+ const version = (depData && depData.version) || depData;
295
+ const childDependency = {
296
+ name,
297
+ version: version && typeof version === 'string' ? version : null
298
+ };
299
+
300
+ checkForChild(self, opts, dependency, childDependency, val, level);
301
+ });
302
+ if (opts.includeDevDependencies && opts.includeDevDependencies !== 'false') {
303
+ Object.getOwnPropertyNames(npmDependency.devDependencies).forEach((val) => {
304
+ const depData = npmDependency.devDependencies[val];
305
+ const version = (depData && depData.version) || depData;
306
+ const childDependency = {
307
+ name: val,
308
+ version: version && typeof version === 'string' ? version : null
309
+ };
310
+
311
+ checkForChild(self, opts, dependency, childDependency, val, level);
312
+ });
313
+ }
314
+ }
315
+ return dependency;
316
+ }
317
+ return null;
318
+ };
319
+
320
+ function printDependency(dep, level) {
321
+ level = level || 0;
322
+ const fill = level === 0 ? '' : new Array(level * 4).join(' ');
323
+
324
+ debuglog(`${fill}-----------------------------------------`);
325
+ debuglog(`${fill}Name, Version: `, dep.name, dep.version);
326
+ debuglog(`${fill}License: `, dep.license || dep.licenses);
327
+ debuglog(`${fill}Private: `, dep.private);
328
+ debuglog(`${fill}Description: `, dep.description);
329
+ if (dep.repository) {
330
+ debuglog(`${fill}Repository type:`, dep.repository.type);
331
+ debuglog(`${fill}Repository url:`, dep.repository.url);
332
+ }
333
+ debuglog(`${fill}Homepage: `, dep.homepage);
334
+ }