1 | var vm = require('vm');
|
2 | var path = require('path');
|
3 |
|
4 |
|
5 |
|
6 | var parseProvideRequire = function(str) {
|
7 | var provides = [];
|
8 | var requires = [];
|
9 | var match;
|
10 |
|
11 | str.split('\n').forEach(function(line) {
|
12 | match = line.match(/^\s*goog\.provide\([\"\'](.*)[\"\']\)/);
|
13 | if (match) {
|
14 | provides.push(match[1]);
|
15 | }
|
16 |
|
17 | match = line.match(/^\s*goog\.require\([\"\'](.*)[\"\']\)/);
|
18 | if (match) {
|
19 | requires.push(match[1]);
|
20 | }
|
21 | });
|
22 |
|
23 | return {
|
24 | provides: provides.sort(),
|
25 | requires: requires.sort()
|
26 | };
|
27 | };
|
28 |
|
29 | var parseDepsJs = function(filepath, content) {
|
30 | var parsed = {
|
31 | fileMap: Object.create(null),
|
32 | provideMap: Object.create(null)
|
33 | };
|
34 | var sandbox = {
|
35 | parsed: parsed,
|
36 | goog: {
|
37 | addDependency: function(relativePath, provides, requires) {
|
38 | var absolutePath = path.resolve(path.dirname(filepath), relativePath);
|
39 |
|
40 | parsed.fileMap[absolutePath] = {provides: provides, requires: requires};
|
41 | provides.forEach(function(dep) {
|
42 | parsed.provideMap[dep] = absolutePath;
|
43 | });
|
44 | }
|
45 | }
|
46 | };
|
47 |
|
48 | vm.runInNewContext(content, sandbox, filepath);
|
49 |
|
50 | return parsed;
|
51 | };
|
52 |
|
53 | exports.parseDepsJs = parseDepsJs;
|
54 | exports.parseProvideRequire = parseProvideRequire;
|