1 |
|
2 | void function () {
|
3 | var badRequireError, canonicalise, CoffeeScript, esprima, estraverse, fs, md5, path, relativeResolve;
|
4 | fs = require('fs');
|
5 | path = require('path');
|
6 | CoffeeScript = require('coffee-script-redux');
|
7 | esprima = require('esprima');
|
8 | estraverse = require('estraverse');
|
9 | md5 = require('MD5');
|
10 | canonicalise = require('./canonicalise');
|
11 | relativeResolve = require('./relative-resolve');
|
12 | badRequireError = function (filename, node, msg) {
|
13 | if (null != node.loc && null != (null != node.loc ? node.loc.start : void 0))
|
14 | filename = '' + filename + ':' + node.loc.start.line + ':' + node.loc.start.column;
|
15 | throw 'illegal require: ' + msg + '\n `' + require('escodegen').generate(node) + '`\n in ' + filename + '';
|
16 | };
|
17 | module.exports = function (entryPoint, root, options) {
|
18 | var aliases, ast, astOrJs, cache$, cache$1, canonicalName, digest, ext, extensions, extname, fileContents, filename, handler, handlers, processed, worklist;
|
19 | if (null == root)
|
20 | root = process.cwd();
|
21 | if (null == options)
|
22 | options = {};
|
23 | aliases = null != options.aliases ? options.aliases : {};
|
24 | handlers = {
|
25 | '.coffee': function (coffee, canonicalName) {
|
26 | return CoffeeScript.compile(CoffeeScript.parse(coffee, { raw: true }), { bare: true });
|
27 | },
|
28 | '.json': function (json, canonicalName) {
|
29 | return esprima.parse('module.exports = ' + json, {
|
30 | loc: true,
|
31 | source: canonicalName
|
32 | });
|
33 | }
|
34 | };
|
35 | for (ext in cache$ = null != options.handlers ? options.handlers : {}) {
|
36 | if (!isOwn$(cache$, ext))
|
37 | continue;
|
38 | handler = cache$[ext];
|
39 | handlers[ext] = handler;
|
40 | }
|
41 | extensions = ['.js'].concat([].slice.call(function (accum$) {
|
42 | for (ext in handlers) {
|
43 | if (!isOwn$(handlers, ext))
|
44 | continue;
|
45 | accum$.push(ext);
|
46 | }
|
47 | return accum$;
|
48 | }.call(this, [])));
|
49 | worklist = [relativeResolve({
|
50 | extensions: extensions,
|
51 | aliases: aliases,
|
52 | root: root,
|
53 | path: entryPoint
|
54 | })];
|
55 | processed = {};
|
56 | while (worklist.length) {
|
57 | cache$1 = worklist.pop();
|
58 | filename = cache$1.filename;
|
59 | canonicalName = cache$1.canonicalName;
|
60 | if (!filename)
|
61 | continue;
|
62 | if ({}.hasOwnProperty.call(processed, filename))
|
63 | continue;
|
64 | extname = path.extname(filename);
|
65 | fileContents = fs.readFileSync(filename).toString();
|
66 | if (options.cache) {
|
67 | digest = md5(fileContents.toString());
|
68 | if (options.cache[filename] === digest)
|
69 | continue;
|
70 | options.cache[filename] = digest;
|
71 | }
|
72 | astOrJs = {}.hasOwnProperty.call(handlers, extname) ? handlers[extname](fileContents, canonicalName) : fileContents;
|
73 | ast = typeof astOrJs === 'string' ? function () {
|
74 | var e;
|
75 | try {
|
76 | return esprima.parse(astOrJs, {
|
77 | loc: true,
|
78 | source: canonicalName
|
79 | });
|
80 | } catch (e$) {
|
81 | e = e$;
|
82 | throw new Error('Syntax error in ' + filename + ' at line ' + e.lineNumber + ', column ' + e.column + e.message.slice(e.message.indexOf(':')));
|
83 | }
|
84 | }.call(this) : astOrJs;
|
85 | processed[filename] = {
|
86 | canonicalName: canonicalName,
|
87 | ast: ast,
|
88 | fileContents: fileContents
|
89 | };
|
90 | if (null != ast.loc)
|
91 | ast.loc;
|
92 | else
|
93 | ast.loc = {};
|
94 | estraverse.replace(ast, {
|
95 | enter: function (node, parents) {
|
96 | var cwd, e, resolved;
|
97 | if (null != node.loc)
|
98 | node.loc.source = canonicalName;
|
99 | if (!(node.type === 'CallExpression' && node.callee.type === 'Identifier' && node.callee.name === 'require'))
|
100 | return;
|
101 | if (!(node['arguments'].length === 1))
|
102 | badRequireError(filename, node, 'require must be given exactly one argument');
|
103 | if (!(node['arguments'][0].type === 'Literal' && typeof node['arguments'][0].value === 'string'))
|
104 | badRequireError(filename, node, 'argument of require must be a constant string');
|
105 | cwd = path.dirname(fs.realpathSync(filename));
|
106 | if (options.verbose)
|
107 | console.error('required "' + node['arguments'][0].value + '" from "' + canonicalName + '"');
|
108 | try {
|
109 | resolved = relativeResolve({
|
110 | extensions: extensions,
|
111 | aliases: aliases,
|
112 | root: root,
|
113 | cwd: cwd,
|
114 | path: node['arguments'][0].value
|
115 | });
|
116 | worklist.push(resolved);
|
117 | } catch (e$) {
|
118 | e = e$;
|
119 | if (options.ignoreMissing) {
|
120 | return {
|
121 | type: 'Literal',
|
122 | value: null
|
123 | };
|
124 | } else {
|
125 | throw e;
|
126 | }
|
127 | }
|
128 | return {
|
129 | type: 'CallExpression',
|
130 | callee: node.callee,
|
131 | 'arguments': [
|
132 | {
|
133 | type: 'Literal',
|
134 | value: resolved.canonicalName
|
135 | },
|
136 | {
|
137 | type: 'Identifier',
|
138 | name: 'module'
|
139 | }
|
140 | ]
|
141 | };
|
142 | }
|
143 | });
|
144 | }
|
145 | return processed;
|
146 | };
|
147 | function isOwn$(o, p) {
|
148 | return {}.hasOwnProperty.call(o, p);
|
149 | }
|
150 | }.call(this);
|