Skip to content

Commit 614c14e

Browse files
committed
Added NodeModuleCollector
1 parent 4952b91 commit 614c14e

File tree

4 files changed

+130
-1
lines changed

4 files changed

+130
-1
lines changed

dist/exceptionless.node.js

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/exceptionless.node.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/exceptionless.node.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { IModuleCollector } from './services/IModuleCollector';
3737
import { IRequestInfoCollector } from './services/IRequestInfoCollector';
3838
import { NodeEnvironmentInfoCollector } from './services/NodeEnvironmentInfoCollector';
3939
import { NodeErrorParser } from './services/NodeErrorParser';
40+
import { NodeModuleCollector } from './services/NodeModuleCollector';
4041
import { NodeRequestInfoCollector } from './services/NodeRequestInfoCollector';
4142
import { InMemoryStorage } from './storage/InMemoryStorage';
4243
import { IStorage } from './storage/IStorage';
@@ -56,6 +57,7 @@ const SIGINT_CODE: number = 2;
5657
var defaults = Configuration.defaults;
5758
defaults.environmentInfoCollector = new NodeEnvironmentInfoCollector();
5859
defaults.errorParser = new NodeErrorParser();
60+
defaults.moduleCollector = new NodeModuleCollector();
5961
defaults.requestInfoCollector = new NodeRequestInfoCollector();
6062
defaults.submissionAdapter = new NodeSubmissionAdapter();
6163

src/services/NodeModuleCollector.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { IModule } from '../models/IModule';
2+
import { IModuleCollector } from './IModuleCollector';
3+
import { EventPluginContext } from '../plugins/EventPluginContext';
4+
import { Utils } from '../Utils';
5+
6+
import child = require('child_process');
7+
import path = require('path');
8+
9+
export class NodeModuleCollector implements IModuleCollector {
10+
11+
private initialized:boolean = false;
12+
private installedModules:{[id:string]: IModule} = {};
13+
14+
public getModules(context:EventPluginContext): IModule[] {
15+
this.initialize();
16+
17+
if (!require.main) return [];
18+
19+
var modulePath = path.dirname(require.main.filename) + '/node_modules/';
20+
var pathLength = modulePath.length;
21+
22+
var loadedKeys = Object.keys(require.cache);
23+
var loadedModules = {};
24+
25+
loadedKeys.forEach(key => {
26+
var id = key.substr(pathLength);
27+
console.log(id);
28+
id = id.substr(0, id.indexOf('/'));
29+
loadedModules[id] = true;
30+
});
31+
32+
return Object.keys(loadedModules)
33+
.map(key => this.installedModules[key])
34+
.filter(m => m !== undefined);
35+
}
36+
37+
private initialize() {
38+
if (this.initialized) return;
39+
this.initialized = true;
40+
41+
var output = child.spawnSync('npm', ['ls', '--depth=0', '--json']).stdout;
42+
43+
if (!output) return;
44+
45+
var json;
46+
try {
47+
json = JSON.parse(output.toString());
48+
}
49+
catch (e) { return; }
50+
51+
var items = json.dependencies;
52+
if (!items) return;
53+
54+
var id = 0;
55+
this.installedModules = {};
56+
57+
Object.keys(items).forEach(key => {
58+
var item = items[key];
59+
var theModule = <IModule> {
60+
module_id: id++,
61+
name: key,
62+
version: item.version
63+
};
64+
65+
this.installedModules[key] = theModule;
66+
});
67+
}
68+
}

0 commit comments

Comments
 (0)