@dxworks/depinder 0.1.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.
Files changed (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -0
  3. package/dist/assets/.gitkeep +0 -0
  4. package/dist/assets/depinder.docker-compose.yml +68 -0
  5. package/dist/assets/init-mongo.d.ts +0 -0
  6. package/dist/assets/init-mongo.js +16 -0
  7. package/dist/assets/init-mongo.js.map +1 -0
  8. package/dist/cache/cache.d.ts +9 -0
  9. package/dist/cache/cache.js +18 -0
  10. package/dist/cache/cache.js.map +1 -0
  11. package/dist/cache/json-cache.d.ts +2 -0
  12. package/dist/cache/json-cache.js +45 -0
  13. package/dist/cache/json-cache.js.map +1 -0
  14. package/dist/cache/mongo-cache.d.ts +5 -0
  15. package/dist/cache/mongo-cache.js +97 -0
  16. package/dist/cache/mongo-cache.js.map +1 -0
  17. package/dist/commands/analyse.d.ts +8 -0
  18. package/dist/commands/analyse.js +215 -0
  19. package/dist/commands/analyse.js.map +1 -0
  20. package/dist/commands/cache.d.ts +11 -0
  21. package/dist/commands/cache.js +83 -0
  22. package/dist/commands/cache.js.map +1 -0
  23. package/dist/commands/info.d.ts +0 -0
  24. package/dist/commands/info.js +190 -0
  25. package/dist/commands/info.js.map +1 -0
  26. package/dist/commands/update.d.ts +3 -0
  27. package/dist/commands/update.js +85 -0
  28. package/dist/commands/update.js.map +1 -0
  29. package/dist/depinder.d.ts +2 -0
  30. package/dist/depinder.js +16 -0
  31. package/dist/depinder.js.map +1 -0
  32. package/dist/extension-points/code-impact.d.ts +14 -0
  33. package/dist/extension-points/code-impact.js +3 -0
  34. package/dist/extension-points/code-impact.js.map +1 -0
  35. package/dist/extension-points/extract.d.ts +36 -0
  36. package/dist/extension-points/extract.js +3 -0
  37. package/dist/extension-points/extract.js.map +1 -0
  38. package/dist/extension-points/plugin-loader.d.ts +2 -0
  39. package/dist/extension-points/plugin-loader.js +18 -0
  40. package/dist/extension-points/plugin-loader.js.map +1 -0
  41. package/dist/extension-points/plugin.d.ts +13 -0
  42. package/dist/extension-points/plugin.js +3 -0
  43. package/dist/extension-points/plugin.js.map +1 -0
  44. package/dist/extension-points/registrar.d.ts +41 -0
  45. package/dist/extension-points/registrar.js +59 -0
  46. package/dist/extension-points/registrar.js.map +1 -0
  47. package/dist/extension-points/vulnerability-checker.d.ts +21 -0
  48. package/dist/extension-points/vulnerability-checker.js +3 -0
  49. package/dist/extension-points/vulnerability-checker.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +7 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/info/php/parser.d.ts +80 -0
  54. package/dist/info/php/parser.js +61 -0
  55. package/dist/info/php/parser.js.map +1 -0
  56. package/dist/plugins/dotnet/index.d.ts +11 -0
  57. package/dist/plugins/dotnet/index.js +146 -0
  58. package/dist/plugins/dotnet/index.js.map +1 -0
  59. package/dist/plugins/index.d.ts +3 -0
  60. package/dist/plugins/index.js +35 -0
  61. package/dist/plugins/index.js.map +1 -0
  62. package/dist/plugins/java/google.registrar.d.ts +0 -0
  63. package/dist/plugins/java/google.registrar.js +59 -0
  64. package/dist/plugins/java/google.registrar.js.map +1 -0
  65. package/dist/plugins/java/index.d.ts +7 -0
  66. package/dist/plugins/java/index.js +152 -0
  67. package/dist/plugins/java/index.js.map +1 -0
  68. package/dist/plugins/java/parsers/maven.d.ts +2 -0
  69. package/dist/plugins/java/parsers/maven.js +51 -0
  70. package/dist/plugins/java/parsers/maven.js.map +1 -0
  71. package/dist/plugins/javascript/index.d.ts +4 -0
  72. package/dist/plugins/javascript/index.js +151 -0
  73. package/dist/plugins/javascript/index.js.map +1 -0
  74. package/dist/plugins/php/index.d.ts +9 -0
  75. package/dist/plugins/php/index.js +131 -0
  76. package/dist/plugins/php/index.js.map +1 -0
  77. package/dist/plugins/php/php-interfaces.d.ts +117 -0
  78. package/dist/plugins/php/php-interfaces.js +67 -0
  79. package/dist/plugins/php/php-interfaces.js.map +1 -0
  80. package/dist/plugins/python/index.d.ts +15 -0
  81. package/dist/plugins/python/index.js +235 -0
  82. package/dist/plugins/python/index.js.map +1 -0
  83. package/dist/plugins/ruby/index.d.ts +4 -0
  84. package/dist/plugins/ruby/index.js +142 -0
  85. package/dist/plugins/ruby/index.js.map +1 -0
  86. package/dist/utils/blacklist.d.ts +1 -0
  87. package/dist/utils/blacklist.js +13 -0
  88. package/dist/utils/blacklist.js.map +1 -0
  89. package/dist/utils/npm.d.ts +8 -0
  90. package/dist/utils/npm.js +19 -0
  91. package/dist/utils/npm.js.map +1 -0
  92. package/dist/utils/utils.d.ts +10 -0
  93. package/dist/utils/utils.js +58 -0
  94. package/dist/utils/utils.js.map +1 -0
  95. package/dist/utils/vulnerabilities.d.ts +5 -0
  96. package/dist/utils/vulnerabilities.js +103 -0
  97. package/dist/utils/vulnerabilities.js.map +1 -0
  98. package/package.json +109 -0
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.analyseFiles = exports.analyseCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const plugins_1 = require("../plugins");
11
+ const cli_common_1 = require("@dxworks/cli-common");
12
+ const vulnerabilities_1 = require("../utils/vulnerabilities");
13
+ const semver_1 = require("semver");
14
+ const lodash_1 = __importDefault(require("lodash"));
15
+ const spdx_correct_1 = __importDefault(require("spdx-correct"));
16
+ const moment_1 = __importDefault(require("moment"));
17
+ const cache_1 = require("../cache/cache");
18
+ const cache_2 = require("./cache");
19
+ const json_cache_1 = require("../cache/json-cache");
20
+ const cli_progress_1 = require("cli-progress");
21
+ const utils_1 = require("../utils/utils");
22
+ const blacklist_1 = require("../utils/blacklist");
23
+ const minimatch_1 = __importDefault(require("minimatch"));
24
+ const mongo_cache_1 = require("../cache/mongo-cache");
25
+ // import {defaultPlugins} from '../extension-points/plugin-loader'
26
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
27
+ const licenseIds = require('spdx-license-ids/');
28
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
29
+ require('events').EventEmitter.prototype._maxListeners = 100;
30
+ exports.analyseCommand = new commander_1.Command()
31
+ .name('analyse')
32
+ .argument('[folders...]', 'A list of folders to walk for files')
33
+ // .argument('[depext-files...]', 'A list of files to parse for dependency information')
34
+ .option('--results, -r', 'The results folder', 'results')
35
+ .option('--refresh', 'Refresh the cache', false)
36
+ .option('--plugins, -p [plugins...]', 'A list of plugins')
37
+ .action(analyseFiles);
38
+ function extractLicenses(dep) {
39
+ var _a, _b;
40
+ return (_b = (_a = dep.libraryInfo) === null || _a === void 0 ? void 0 : _a.licenses) === null || _b === void 0 ? void 0 : _b.map(it => {
41
+ if (typeof it === 'string')
42
+ return it.substring(0, 100);
43
+ else
44
+ return JSON.stringify(it);
45
+ });
46
+ }
47
+ function convertDepToRow(proj, dep) {
48
+ var _a, _b, _c, _d;
49
+ const latestVersion = (_a = dep.libraryInfo) === null || _a === void 0 ? void 0 : _a.versions.find(it => it.latest);
50
+ const currentVersion = (_b = dep.libraryInfo) === null || _b === void 0 ? void 0 : _b.versions.find(it => it.version == dep.version.trim());
51
+ const latestVersionMoment = (0, moment_1.default)(latestVersion === null || latestVersion === void 0 ? void 0 : latestVersion.timestamp);
52
+ const currentVersionMoment = (0, moment_1.default)(currentVersion === null || currentVersion === void 0 ? void 0 : currentVersion.timestamp);
53
+ const now = (0, moment_1.default)();
54
+ const dateFormat = 'MMM YYYY';
55
+ const vulnerabilities = (_c = dep.vulnerabilities) === null || _c === void 0 ? void 0 : _c.map(v => `${v.severity} - ${v.permalink}`).join('\n');
56
+ const directDep = !dep.requestedBy || dep.requestedBy.some(it => it.startsWith(`${proj.name}@${proj.version}`));
57
+ return `${proj.path},${proj.name},${dep.name},${dep.version},${latestVersion === null || latestVersion === void 0 ? void 0 : latestVersion.version},${currentVersionMoment === null || currentVersionMoment === void 0 ? void 0 : currentVersionMoment.format(dateFormat)},${latestVersionMoment === null || latestVersionMoment === void 0 ? void 0 : latestVersionMoment.format(dateFormat)},${latestVersionMoment === null || latestVersionMoment === void 0 ? void 0 : latestVersionMoment.diff(currentVersionMoment, 'months')},${now === null || now === void 0 ? void 0 : now.diff(currentVersionMoment, 'months')},${now === null || now === void 0 ? void 0 : now.diff(latestVersionMoment, 'months')},${(_d = dep.vulnerabilities) === null || _d === void 0 ? void 0 : _d.length},"${vulnerabilities}",${directDep},${dep.type},"${extractLicenses(dep)}"`;
58
+ }
59
+ async function extractProjects(plugin, files) {
60
+ const projects = [];
61
+ for (const context of plugin.extractor.createContexts(files)) {
62
+ cli_common_1.log.info(`Parsing dependency tree information for ${JSON.stringify(context)}`);
63
+ try {
64
+ if (!plugin.parser) {
65
+ cli_common_1.log.info(`Plugin ${plugin.name} does not have a parser!`);
66
+ continue;
67
+ }
68
+ const proj = await plugin.parser.parseDependencyTree(context);
69
+ cli_common_1.log.info(`Done parsing dependency tree information for ${JSON.stringify(context)}`);
70
+ projects.push(proj);
71
+ }
72
+ catch (e) {
73
+ cli_common_1.log.warn(`Exception parsing dependency tree information for ${JSON.stringify(context)}`);
74
+ cli_common_1.log.error(e);
75
+ }
76
+ }
77
+ return projects;
78
+ }
79
+ function chooseCacheOption() {
80
+ if ((0, cache_2.getMongoDockerContainerStatus)() != 'running') {
81
+ cli_common_1.log.warn('Mongo cache is not running, using in-memory cache');
82
+ return json_cache_1.jsonCache;
83
+ }
84
+ cli_common_1.log.info('Mongo cache is up and running, using Mongo cache');
85
+ return mongo_cache_1.mongoCache;
86
+ }
87
+ async function cacheHit(cache, plugin, dep, refresh, refreshedLibs) {
88
+ if (refresh && !refreshedLibs.includes(dep.name)) {
89
+ return false;
90
+ }
91
+ return cache.has(`${plugin.name}:${dep.name}`);
92
+ }
93
+ async function analyseFiles(folders, options, useCache = true) {
94
+ var _a, _b;
95
+ const resultFolder = options.results || 'results';
96
+ if (!fs_1.default.existsSync(path_1.default.resolve(process.cwd(), resultFolder))) {
97
+ fs_1.default.mkdirSync(path_1.default.resolve(process.cwd(), resultFolder), { recursive: true });
98
+ cli_common_1.log.info('Creating results dir');
99
+ }
100
+ const allFiles = folders.flatMap(it => (0, utils_1.walkDir)(it));
101
+ const selectedPlugins = (0, plugins_1.getPluginsFromNames)(options.plugins);
102
+ for (const plugin of selectedPlugins) {
103
+ cli_common_1.log.info(`Plugin ${plugin.name} starting`);
104
+ const cache = useCache ? chooseCacheOption() : cache_1.noCache;
105
+ await cache.load();
106
+ const refreshedLibs = [];
107
+ const files = allFiles
108
+ .filter(it => plugin.extractor.filter ? plugin.extractor.filter(it) : true)
109
+ .filter(it => plugin.extractor.files
110
+ .some(pattern => (0, minimatch_1.default)(it, pattern, { matchBase: true })));
111
+ const projects = await extractProjects(plugin, files);
112
+ const multiProgressBar = new cli_progress_1.MultiBar({}, cli_progress_1.Presets.shades_grey);
113
+ const projectsBar = multiProgressBar.create(projects.length, 0, { name: 'Projects', state: 'Analysing' });
114
+ for (const project of projects) {
115
+ cli_common_1.log.info(`Plugin ${plugin.name} analyzing project ${project.name}@${project.version}`);
116
+ const dependencies = Object.values(project.dependencies);
117
+ const filteredDependencies = dependencies.filter(it => !blacklist_1.blacklistedGlobs.some(glob => (0, minimatch_1.default)(it.name, glob)));
118
+ const depProgressBar = multiProgressBar.create(filteredDependencies.length, 0, {
119
+ name: 'Deps',
120
+ state: 'Analysing deps',
121
+ });
122
+ let depsWithInfo = 0;
123
+ for (const dep of filteredDependencies) {
124
+ try {
125
+ let lib;
126
+ if (await cacheHit(cache, plugin, dep, options.refresh, refreshedLibs)) {
127
+ lib = await cache.get(`${plugin.name}:${dep.name}`);
128
+ }
129
+ else {
130
+ // log.info(`Getting remote information on ${dep.name}`)
131
+ lib = await plugin.registrar.retrieve(dep.name);
132
+ if ((_a = plugin.checker) === null || _a === void 0 ? void 0 : _a.githubSecurityAdvisoryEcosystem) {
133
+ // log.info(`Getting vulnerabilities for ${lib.name}`)
134
+ lib.vulnerabilities = await (0, vulnerabilities_1.getVulnerabilitiesFromGithub)(plugin.checker.githubSecurityAdvisoryEcosystem, lib.name);
135
+ }
136
+ await cache.set(`${plugin.name}:${dep.name}`, lib);
137
+ if (options.refresh)
138
+ refreshedLibs.push(dep.name);
139
+ }
140
+ dep.libraryInfo = lib;
141
+ const thisVersionVulnerabilities = (_b = lib.vulnerabilities) === null || _b === void 0 ? void 0 : _b.filter((it) => {
142
+ var _a, _b;
143
+ try {
144
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
145
+ const range = new semver_1.Range((_b = (_a = it.vulnerableRange) === null || _a === void 0 ? void 0 : _a.replaceAll(',', ' ')) !== null && _b !== void 0 ? _b : '');
146
+ return range.test(dep.version);
147
+ }
148
+ catch (e) {
149
+ // log.warn(`Vulnerable range unknown: ${it.vulnerableRange}`)
150
+ return false;
151
+ }
152
+ });
153
+ dep.vulnerabilities = thisVersionVulnerabilities || [];
154
+ }
155
+ catch (e) {
156
+ cli_common_1.log.warn(`Exception getting remote info for ${dep.name}`);
157
+ cli_common_1.log.error(e);
158
+ }
159
+ depProgressBar.increment();
160
+ depsWithInfo++;
161
+ cli_common_1.log.info(`Got remote information on ${dep.name} (${depsWithInfo}/${filteredDependencies.length})`);
162
+ }
163
+ depProgressBar.stop();
164
+ projectsBar.increment();
165
+ }
166
+ projectsBar.stop();
167
+ multiProgressBar.stop();
168
+ await cache.write();
169
+ const allLibsInfo = projects.flatMap(proj => Object.values(proj.dependencies).map(dep => dep.libraryInfo))
170
+ .filter(it => it !== undefined && it != null).map(it => it);
171
+ const allLicenses = lodash_1.default.groupBy(allLibsInfo, (lib) => {
172
+ const license = lib.versions.flatMap(it => it.licenses).find(() => true);
173
+ if (!license || typeof license !== 'string')
174
+ return 'unknown';
175
+ if (!licenseIds.includes(license))
176
+ return (0, spdx_correct_1.default)(license || 'unknown') || 'unknown';
177
+ return license;
178
+ });
179
+ fs_1.default.writeFileSync(path_1.default.resolve(process.cwd(), resultFolder, `${plugin.name}-licenses.csv`), Object.keys(allLicenses).map(l => {
180
+ return `${l},${allLicenses[l].length},${allLicenses[l].map((it) => it.name)}`;
181
+ }).join('\n'));
182
+ const header = 'Project Path,Project,Library,Used Version,Latest Version,Used Version Release Date,Latest Version Release Date,Latest-Used,Now-Used,Now-latest,Vulnerabilities,Vulnerability Details,DirectDependency,Type,Licenses\n';
183
+ fs_1.default.writeFileSync(path_1.default.resolve(process.cwd(), resultFolder, `${plugin.name}-libs.csv`), header + projects.flatMap(proj => Object.values(proj.dependencies).map(dep => convertDepToRow(proj, dep))).join('\n'));
184
+ const projectStatsHeader = 'Project Path,Project,Direct Deps,Indirect Deps,Direct Outdated Deps, Direct Outdated %,Indirect Outdated Deps, Indirect Outdated %, Direct Vulnerable Deps, Indirect Vulnerable Deps, Direct Out of Support, Indirect Out of Support\n';
185
+ fs_1.default.writeFileSync(path_1.default.resolve(process.cwd(), resultFolder, `${plugin.name}-project-stats.csv`), projectStatsHeader + projects.map(proj => {
186
+ const enhancedDeps = Object.values(proj.dependencies).map(dep => {
187
+ var _a, _b;
188
+ const latestVersion = (_a = dep.libraryInfo) === null || _a === void 0 ? void 0 : _a.versions.find(it => it.latest);
189
+ const currentVersion = (_b = dep.libraryInfo) === null || _b === void 0 ? void 0 : _b.versions.find(it => it.version == dep.version.trim());
190
+ const latestVersionMoment = (0, moment_1.default)(latestVersion === null || latestVersion === void 0 ? void 0 : latestVersion.timestamp);
191
+ const currentVersionMoment = (0, moment_1.default)(currentVersion === null || currentVersion === void 0 ? void 0 : currentVersion.timestamp);
192
+ const now = (0, moment_1.default)();
193
+ const directDep = !dep.requestedBy || dep.requestedBy.some(it => it.startsWith(`${proj.name}@${proj.version}`));
194
+ return Object.assign(Object.assign({}, dep), { direct: directDep, latest_used: latestVersionMoment.diff(currentVersionMoment, 'months'), now_used: now.diff(currentVersionMoment, 'months'), now_latest: now.diff(latestVersionMoment, 'months') });
195
+ });
196
+ const directDeps = enhancedDeps.filter(dep => dep.direct);
197
+ const indirectDeps = enhancedDeps.filter(dep => !dep.direct);
198
+ const outdatedThreshold = 15;
199
+ const directOutdated = directDeps.filter(dep => dep.latest_used > outdatedThreshold);
200
+ const directOutDatedPercent = directDeps.length == 0 ? 0 : directOutdated.length / directDeps.length * 100;
201
+ const indirectOutdated = indirectDeps.filter(dep => dep.latest_used > outdatedThreshold);
202
+ const indirectOutDatedPercent = indirectDeps.length == 0 ? 0 : indirectOutdated.length / indirectDeps.length * 100;
203
+ const directVulnerable = directDeps.filter(dep => dep.vulnerabilities && dep.vulnerabilities.length > 0);
204
+ const indirectVulnerable = indirectDeps.filter(dep => dep.vulnerabilities && dep.vulnerabilities.length > 0);
205
+ const outOfSupportThreshold = 24;
206
+ const directOutOfSupport = directDeps.filter(dep => dep.now_latest > outOfSupportThreshold);
207
+ const indirectOutOfSupport = indirectDeps.filter(dep => dep.now_latest > outOfSupportThreshold);
208
+ return `${proj.path},${proj.name},${directDeps.length},${indirectDeps.length},${directOutdated.length},${directOutDatedPercent},${indirectOutdated.length},${indirectOutDatedPercent},${directVulnerable.length},${indirectVulnerable.length},${directOutOfSupport.length},${indirectOutOfSupport.length}`;
209
+ }).join('\n'));
210
+ }
211
+ cli_common_1.log.info(`Results are written to ${path_1.default.resolve(process.cwd(), resultFolder)}`);
212
+ cli_common_1.log.info('Done');
213
+ }
214
+ exports.analyseFiles = analyseFiles;
215
+ //# sourceMappingURL=analyse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyse.js","sourceRoot":"","sources":["../../src/commands/analyse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ export declare function cacheUpAction(): Promise<void>;
3
+ export declare function cacheDownAction(): Promise<void>;
4
+ export declare function getMongoDockerContainerStatus(): string | null;
5
+ export declare function cacheInfoAction(): void;
6
+ export declare function cacheInitAction(): void;
7
+ export declare const cacheUpCommand: Command;
8
+ export declare const cacheDownCommand: Command;
9
+ export declare const cacheInfoCommand: Command;
10
+ export declare const cacheInitCommand: Command;
11
+ export declare const cacheCommand: Command;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.cacheCommand = exports.cacheInitCommand = exports.cacheInfoCommand = exports.cacheDownCommand = exports.cacheUpCommand = exports.cacheInitAction = exports.cacheInfoAction = exports.getMongoDockerContainerStatus = exports.cacheDownAction = exports.cacheUpAction = void 0;
7
+ const commander_1 = require("commander");
8
+ const child_process_1 = require("child_process");
9
+ const cli_common_1 = require("@dxworks/cli-common");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const utils_1 = require("../utils/utils");
13
+ const path_1 = __importDefault(require("path"));
14
+ async function cacheUpAction() {
15
+ (0, child_process_1.execSync)('docker-compose up -d', { cwd: path_1.default.resolve((0, utils_1.getHomeDir)(), 'cache'), stdio: 'inherit' });
16
+ }
17
+ exports.cacheUpAction = cacheUpAction;
18
+ async function cacheDownAction() {
19
+ (0, child_process_1.execSync)('docker-compose down', { cwd: path_1.default.resolve((0, utils_1.getHomeDir)(), 'cache'), stdio: 'inherit' });
20
+ }
21
+ exports.cacheDownAction = cacheDownAction;
22
+ function getMongoDockerContainerStatus() {
23
+ try {
24
+ const output = (0, child_process_1.execSync)('docker inspect depinder-mongo').toString();
25
+ const result = JSON.parse(output);
26
+ if (result.length == 0) {
27
+ cli_common_1.log.error('Mongo is not running');
28
+ return null;
29
+ }
30
+ return result[0].State.Status;
31
+ }
32
+ catch (e) {
33
+ return null;
34
+ }
35
+ }
36
+ exports.getMongoDockerContainerStatus = getMongoDockerContainerStatus;
37
+ function cacheInfoAction() {
38
+ const status = getMongoDockerContainerStatus();
39
+ if (status == null) {
40
+ cli_common_1.log.error('Mongo is not running');
41
+ cli_common_1.log.info(`To start Mongo cache run: ${chalk_1.default.yellow('depinder cache up')}`);
42
+ return;
43
+ }
44
+ if (status == 'running') {
45
+ cli_common_1.log.info(chalk_1.default.green('Mongo cache is up and running'));
46
+ }
47
+ else {
48
+ cli_common_1.log.info(`Mongo is ${status}`);
49
+ cli_common_1.log.info(`To start Mongo cache run: ${chalk_1.default.yellow('depinder cache up')}`);
50
+ }
51
+ }
52
+ exports.cacheInfoAction = cacheInfoAction;
53
+ function cacheInitAction() {
54
+ if (!fs_1.default.existsSync(path_1.default.join((0, utils_1.getHomeDir)(), 'cache', 'docker-compose.yml'))) {
55
+ fs_1.default.mkdirSync(path_1.default.join((0, utils_1.getHomeDir)(), 'cache'), { recursive: true });
56
+ fs_1.default.copyFileSync((0, utils_1.getAssetFile)('depinder.docker-compose.yml'), path_1.default.join((0, utils_1.getHomeDir)(), 'cache', 'docker-compose.yml'));
57
+ fs_1.default.copyFileSync((0, utils_1.getAssetFile)('init-mongo.js'), path_1.default.join((0, utils_1.getHomeDir)(), 'cache', 'init-mongo.js'));
58
+ }
59
+ }
60
+ exports.cacheInitAction = cacheInitAction;
61
+ exports.cacheUpCommand = new commander_1.Command()
62
+ .name('up')
63
+ .alias('start')
64
+ .action(cacheUpAction);
65
+ exports.cacheDownCommand = new commander_1.Command()
66
+ .name('down')
67
+ .alias('stop')
68
+ .action(cacheDownAction);
69
+ exports.cacheInfoCommand = new commander_1.Command()
70
+ .name('info')
71
+ .alias('i')
72
+ .action(cacheInfoAction);
73
+ exports.cacheInitCommand = new commander_1.Command()
74
+ .name('init')
75
+ .action(cacheInitAction);
76
+ exports.cacheCommand = new commander_1.Command()
77
+ .name('cache')
78
+ .action(cacheInfoAction)
79
+ .addCommand(exports.cacheUpCommand)
80
+ .addCommand(exports.cacheDownCommand)
81
+ .addCommand(exports.cacheInfoCommand)
82
+ .addCommand(exports.cacheInitCommand);
83
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ // import {Command} from 'commander'
3
+ // import {ComposerPackage, parseComposerFile, parseComposerLockFile} from '../info/php/parser'
4
+ // import path from 'path'
5
+ // import * as fs from 'fs'
6
+ // import {getPackageDetails} from '../plugins/php/info'
7
+ // import _ from 'lodash'
8
+ // import moment from 'moment'
9
+ // import spdxCorrect from 'spdx-correct'
10
+ // // eslint-disable-next-line @typescript-eslint/no-var-requires
11
+ // const licenseIds = require('spdx-license-ids/')
12
+ //
13
+ //
14
+ // export const infoCommand = new Command()
15
+ // .name('info')
16
+ // .argument('[composerFiles...]', 'A list of composer.json or composer.lock files, or folder to search for such files')
17
+ // .action(getInfoForFiles)
18
+ //
19
+ // // async function getComposerPackages(file: string): Promise<{ file: string, packages: ComposerPackage[] }> {
20
+ // // let packages: ComposerPackage[] = []
21
+ // // if (path.basename(file) === 'composer.json')
22
+ // // packages = await getAllDependenciesFromComposerJson(parseComposerFile(file))
23
+ // // else if (path.basename(file) === 'composer.lock')
24
+ // // packages = await getAllDependenciesFromLock(parseComposerLockFile(file))
25
+ // //
26
+ // // // console.log(packages)
27
+ // // return {file: file, packages: packages}
28
+ // // }
29
+ //
30
+ // function phpFileFilter(children: string[]) {
31
+ // const composerLock = children.find(f => path.basename(f) === 'composer.lock')
32
+ // if (composerLock)
33
+ // return [composerLock]
34
+ // const composerFile = children.find(f => path.basename(f) === 'composer.json')
35
+ // if (composerFile)
36
+ // return [composerFile]
37
+ // return []
38
+ // }
39
+ //
40
+ // // async function getComposerPackages(it: { file: string; packages: string[] }, cacheMap: Map<string, Promise<ComposerPackage | null>>): Promise<ComposerPackage[]> {
41
+ // // return (await Promise.all(it.packages.map(async p => {
42
+ // // let packageInfo = cacheMap.get(p)
43
+ // // if (packageInfo === undefined) {
44
+ // // packageInfo = getPackageDetails(p)
45
+ // // cacheMap.set(p, packageInfo)
46
+ // // return await packageInfo
47
+ // // }
48
+ // // return await packageInfo
49
+ // // }))).filter(it => it !== null) as ComposerPackage[]
50
+ // // }
51
+ //
52
+ // function getPurl(composerPackage: ComposerPackage) {
53
+ // return `pkg:composer/${composerPackage.name.replace('@', '%40')}@${composerPackage.version}`
54
+ // }
55
+ //
56
+ // export async function getDeps(composerFiles: string[]): Promise<{ file: string, packages: ComposerPackage[] }[]> {
57
+ // const allFiles: string[] = composerFiles
58
+ // .flatMap(file => {
59
+ // if (fs.statSync(path.resolve(file)).isDirectory()) {
60
+ // return walkTopDownSync(file, phpFileFilter)
61
+ // } else if (path.basename(file) === 'composer.json' || path.basename(file) === 'composer.lock')
62
+ // return [file]
63
+ // return []
64
+ // })
65
+ //
66
+ // const packagesAndFiles: { file: string, packages: string[] }[] = allFiles.map(f => {
67
+ // if (f.endsWith('composer.lock'))
68
+ // return {file: f, packages: parseComposerLockFile(f).packages.map(it => it.name)}
69
+ // if (f.endsWith('composer.json'))
70
+ // return {
71
+ // file: f,
72
+ // packages: [...Object.keys(parseComposerFile(f).require || {}), ...Object.keys(parseComposerFile(f)['require-dev'] || {})],
73
+ // }
74
+ // return {file: f, packages: []}
75
+ // }).filter(it => it.packages.length)
76
+ //
77
+ // const packageNameToInfo = new Map<string, ComposerPackage>()
78
+ //
79
+ // const uniqPackages = _.uniq(packagesAndFiles.flatMap(it => it.packages))
80
+ // const promises = await Promise.all(uniqPackages.map(p => getPackageDetails(p)))
81
+ // promises.forEach(it => {
82
+ // if (it) {
83
+ // packageNameToInfo.set(it.name, it)
84
+ // }
85
+ // })
86
+ // const foundPackages = [...packageNameToInfo.values()]
87
+ //
88
+ // const allLicenses = _.groupBy(foundPackages, p => {
89
+ // const license: string | undefined = Object.values(p.versions).flatMap(it => it.license).find(() => true)
90
+ // if (!license)
91
+ // return 'unknown'
92
+ // if (!licenseIds.includes(license))
93
+ // return spdxCorrect(license || 'unknown') || 'unknown'
94
+ // return license
95
+ // })
96
+ // fs.writeFileSync(path.resolve(process.cwd(), 'results', 'licenses.csv'), Object.keys(allLicenses).map(l => {
97
+ // return `${l},${allLicenses[l].length},${allLicenses[l].map(it => it.name)}`
98
+ // }).join('\n'))
99
+ //
100
+ // // for (const p of foundPackages) {
101
+ // // const githubResponse = await getVulnerabilitiesFromGithub('COMPOSER', p.name)
102
+ // // const vulnerabilities = githubResponse.securityVulnerabilities.nodes.filter((it: any) => {
103
+ // // try {
104
+ // // const semver = new SemVer(p.version || '', true)
105
+ // // const range = new Range(it.vulnerableVersionRange)
106
+ // // return range.test(semver)
107
+ // // } catch (e: any) {
108
+ // // return false
109
+ // // }
110
+ // // })
111
+ // // p.vulnerabilities = vulnerabilities || []
112
+ // // p.allVulnerabilities = githubResponse.securityVulnerabilities.nodes
113
+ // // }
114
+ // // const sonatypeVulnerabilities = await Promise.all(_.chunk(foundPackages, 128).map(chunk => {
115
+ // // getVulnerabilitiesFromSonatype(chunk.map(it => getPurl(it)))
116
+ // // }))
117
+ //
118
+ //
119
+ // // return (await Promise.all(it.packages.map(async p => {
120
+ // // let packageInfo = cacheMap.get(p)
121
+ // // if (packageInfo === undefined) {
122
+ // // packageInfo = getPackageDetails(p)
123
+ // // cacheMap.set(p, packageInfo)
124
+ // // return await packageInfo
125
+ // // }
126
+ // // return await packageInfo
127
+ // // }))).filter(it => it !== null) as ComposerPackage[]
128
+ //
129
+ //
130
+ // // return await Promise.all(packagesAndFiles.map(async it => {
131
+ // // return {
132
+ // // file: it.file,
133
+ // // packages: await getComposerPackages(it, packageNameToInfo),
134
+ // // }
135
+ // // }))
136
+ //
137
+ // return packagesAndFiles.map(it => {
138
+ // return {
139
+ // file: it.file,
140
+ // packages: it.packages.map(p => packageNameToInfo.get(p) as ComposerPackage).filter(it => it !== undefined),
141
+ // }
142
+ // })
143
+ //
144
+ // }
145
+ //
146
+ // export async function getInfoForFiles(composerFiles: string[]) {
147
+ // const deps: { file: string, packages: ComposerPackage[] }[] = await getDeps(composerFiles)
148
+ //
149
+ //
150
+ // fs.writeFileSync(path.resolve(process.cwd(), 'results', 'depsInfo.json'), JSON.stringify(deps))
151
+ //
152
+ // }
153
+ //
154
+ // type Transformer<T, R> = (x: T) => R
155
+ //
156
+ // function walkTopDownSync(folder: string, filter: Transformer<string[], string[]>): string[] {
157
+ // const fileNames: string[] = []
158
+ // const allFiles = fs.readdirSync(folder)
159
+ //
160
+ // const children = allFiles.map(it => path.resolve(folder, it))
161
+ // fileNames.push(...filter(children))
162
+ //
163
+ // fileNames.push(...allFiles.filter(it => fs.statSync(path.resolve(folder, it)).isDirectory()).flatMap(it => walkTopDownSync(path.resolve(folder, it), filter)))
164
+ //
165
+ // return fileNames
166
+ // }
167
+ //
168
+ // export function computeDTOForExport(pack: ComposerPackage): string {
169
+ // const dateFormat = 'MMM YYYY'
170
+ // const latestVersion = Object.values(pack.versions).sort((v1, v2) => {
171
+ // const v1mom = moment(v1.time)
172
+ // const v2mom = moment(v2.time)
173
+ // if (v1mom.isBefore(v2mom)) return 1
174
+ // if (v1mom.isAfter(v2mom)) return -1
175
+ // return 0
176
+ // })[0]
177
+ // const latestVersionMoment = moment(latestVersion.time)
178
+ //
179
+ // const thisVersionMoment = moment(pack.time)
180
+ // const nowMoment = moment()
181
+ //
182
+ // const vulns = pack.vulnerabilities || []
183
+ //
184
+ // const severities = vulns.map(v => v.severity).join('\n')
185
+ //
186
+ // const links = vulns.map(v => v.advisory.permalink).join('\n')
187
+ //
188
+ // return `${pack.name},${pack.version},${latestVersion.version},${thisVersionMoment.format(dateFormat)},${latestVersionMoment.format(dateFormat)},${nowMoment.diff(thisVersionMoment, 'months', false)},${latestVersionMoment.diff(thisVersionMoment, 'months', false)},${nowMoment.diff(latestVersionMoment, 'months', false)},${vulns.length},"${severities}","${links}"`
189
+ // }
190
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const updateCommand: Command;
3
+ export declare function updateLibs(updated_before: string, plugins: string[]): Promise<void>;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.updateLibs = exports.updateCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const cli_common_1 = require("@dxworks/cli-common");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const cache_1 = require("./cache");
11
+ const mongo_cache_1 = require("../cache/mongo-cache");
12
+ const moment_1 = __importDefault(require("moment"));
13
+ const plugins_1 = require("../plugins");
14
+ const vulnerabilities_1 = require("../utils/vulnerabilities");
15
+ const cli_progress_1 = require("cli-progress");
16
+ exports.updateCommand = new commander_1.Command()
17
+ .name('update')
18
+ .argument('[updated_before]', 'Update all libs that were updated before this date')
19
+ .argument('[plugins...]', 'A list of plugins to update database libs for')
20
+ .action(updateLibs);
21
+ async function updateLibrariesAndLogProcess(idsToUpdate, selectedPlugins) {
22
+ const progressBar = new cli_progress_1.SingleBar({
23
+ format: 'Updating |' + chalk_1.default.green('{bar}') + '| {percentage}% || {value}/{total} Libraries | {plugin} | {library}',
24
+ }, cli_progress_1.Presets.shades_grey);
25
+ progressBar.start(idsToUpdate.length, 0, { plugin: '', library: '' });
26
+ await updateLibrariesFor(selectedPlugins, idsToUpdate, progressBar);
27
+ progressBar.stop();
28
+ }
29
+ async function updateLibs(updated_before, plugins) {
30
+ const status = (0, cache_1.getMongoDockerContainerStatus)();
31
+ if (status !== 'running') {
32
+ cli_common_1.log.info(chalk_1.default.red('Mongo Cache is not running properly.'));
33
+ cli_common_1.log.info(`To start Mongo cache run: ${chalk_1.default.yellow('depinder cache up')}`);
34
+ return;
35
+ }
36
+ const lastUpdateMoment = updated_before ? (0, moment_1.default)(updated_before) : (0, moment_1.default)().subtract(1, 'month');
37
+ mongo_cache_1.mongoCache.load();
38
+ const ids = await getLibraryIdsToUpdate(lastUpdateMoment);
39
+ const selectedPlugins = (0, plugins_1.getPluginsFromNames)(plugins);
40
+ const idsToUpdate = ids.filter(id => selectedPlugins.some(plugin => id.startsWith(`${plugin.name}:`)));
41
+ if (idsToUpdate.length > 0) {
42
+ cli_common_1.log.info(`Updating ${idsToUpdate.length} of ${ids.length} libraries...`);
43
+ await updateLibrariesAndLogProcess(idsToUpdate, selectedPlugins);
44
+ }
45
+ else {
46
+ cli_common_1.log.info('No libraries to update.');
47
+ }
48
+ mongo_cache_1.mongoCache.write();
49
+ }
50
+ exports.updateLibs = updateLibs;
51
+ async function getLibraryIdsToUpdate(lastUpdateMoment) {
52
+ try {
53
+ const query = { updatedAt: { $lt: lastUpdateMoment.toDate() } };
54
+ const docs = await mongo_cache_1.LibraryInfoModel.find(query, '_id');
55
+ return docs.map(doc => doc._id.toString());
56
+ }
57
+ catch (err) {
58
+ cli_common_1.log.error('Error while searching for libraries to update in cache: ', err);
59
+ return [];
60
+ }
61
+ }
62
+ async function updateLibrariesFor(selectedPlugins, idsToUpdate, progressBar) {
63
+ var _a;
64
+ for (const plugin of selectedPlugins) {
65
+ const libsToUpdate = idsToUpdate.filter(id => id.startsWith(`${plugin.name}:`));
66
+ if (libsToUpdate.length > 0) {
67
+ for (const id of libsToUpdate) {
68
+ const libraryName = id.substring(plugin.name.length + 1);
69
+ try {
70
+ const lib = await plugin.registrar.retrieve(libraryName);
71
+ if ((_a = plugin.checker) === null || _a === void 0 ? void 0 : _a.githubSecurityAdvisoryEcosystem) {
72
+ lib.vulnerabilities = await (0, vulnerabilities_1.getVulnerabilitiesFromGithub)(plugin.checker.githubSecurityAdvisoryEcosystem, lib.name);
73
+ }
74
+ await mongo_cache_1.mongoCache.set(id, lib);
75
+ }
76
+ catch (e) {
77
+ cli_common_1.log.warn(`Exception getting remote info for ${libraryName}`);
78
+ cli_common_1.log.error(e);
79
+ }
80
+ progressBar.increment({ library: libraryName, plugin: plugin.name });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ //# sourceMappingURL=update.js.map