1 | 'use strict';
|
2 |
|
3 | var detective = require('detective');
|
4 |
|
5 | function simpleRequire(n) {
|
6 |
|
7 | return n.parent
|
8 | && n.parent.id
|
9 | && n.parent.id.name;
|
10 | }
|
11 |
|
12 | function requireWithImmediateCall(n) {
|
13 |
|
14 | var p = n.parent;
|
15 | return p.parent
|
16 | && p.parent.id
|
17 | && p.parent.id.name;
|
18 | }
|
19 |
|
20 | function findProxyquireVars(src) {
|
21 | return detective
|
22 | .find(src, { nodes: true }).nodes
|
23 | .map(function (n) {
|
24 | var arg = n.arguments[0];
|
25 | return arg
|
26 | && arg.value === 'proxyquireify'
|
27 | && arg.type === 'Literal'
|
28 | && ( simpleRequire(n) || requireWithImmediateCall(n) );
|
29 | })
|
30 | .filter(function (n) { return n; })
|
31 | ;
|
32 | }
|
33 |
|
34 | module.exports = function(src) {
|
35 | if (!/require\(.+proxyquireify.+\)/.test(src)) return [];
|
36 |
|
37 |
|
38 | var hash = findProxyquireVars(src)
|
39 | .map(function (name) {
|
40 | return detective(src, { word: name });
|
41 | })
|
42 | .reduce(function (acc, arr) {
|
43 | arr.forEach(function (x) { acc[x] = true;});
|
44 | return acc;
|
45 | }, {});
|
46 |
|
47 | return Object.keys(hash);
|
48 | };
|