1 |
|
2 | void function () {
|
3 | var canonicalise, esprima, PRELUDE, PRELUDE_NODE, wrapFile;
|
4 | esprima = require('esprima');
|
5 | canonicalise = require('./canonicalise');
|
6 | PRELUDE_NODE = "\nvar process = function(){\n var cwd = '/';\n return {\n title: 'browser',\n version: '" + process.version + "',\n browser: true,\n env: {},\n argv: [],\n nextTick: global.setImmediate || function(fn){ setTimeout(fn, 0); },\n cwd: function(){ return cwd; },\n chdir: function(dir){ cwd = dir; }\n };\n}();";
|
7 | PRELUDE = "\nfunction require(file, parentModule){\n if({}.hasOwnProperty.call(require.cache, file))\n return require.cache[file];\n\n var resolved = require.resolve(file);\n if(!resolved) throw new Error('Failed to resolve module ' + file);\n\n var module$ = {\n id: file,\n require: require,\n filename: file,\n exports: {},\n loaded: false,\n parent: parentModule,\n children: []\n };\n if(parentModule) parentModule.children.push(module$);\n var dirname = file.slice(0, file.lastIndexOf('/') + 1);\n\n require.cache[file] = module$.exports;\n resolved.call(module$.exports, module$, module$.exports, dirname, file);\n module$.loaded = true;\n return require.cache[file] = module$.exports;\n}\n\nrequire.modules = {};\nrequire.cache = {};\n\nrequire.resolve = function(file){\n return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0;\n};\nrequire.define = function(file, fn){ require.modules[file] = fn; };";
|
8 | wrapFile = function (name, program) {
|
9 | var wrapper, wrapperProgram;
|
10 | wrapperProgram = esprima.parse('require.define(0, function(module, exports, __dirname, __filename){});');
|
11 | wrapper = wrapperProgram.body[0];
|
12 | wrapper.expression['arguments'][0] = {
|
13 | type: 'Literal',
|
14 | value: name
|
15 | };
|
16 | wrapper.expression['arguments'][1].body.body = program.body;
|
17 | return wrapper;
|
18 | };
|
19 | module.exports = function (processed, entryPoint, root, options) {
|
20 | var ast, exportExpression, filename, iife, lhsExpression, prelude, program, requireEntryPoint;
|
21 | prelude = (null != options.node ? options.node : true) ? '' + PRELUDE + '\n' + PRELUDE_NODE : PRELUDE;
|
22 | program = esprima.parse(prelude);
|
23 | for (filename in processed) {
|
24 | if (!isOwn$(processed, filename))
|
25 | continue;
|
26 | ast = processed[filename].ast;
|
27 | program.body.push(wrapFile(ast.loc.source, ast));
|
28 | }
|
29 | requireEntryPoint = {
|
30 | type: 'CallExpression',
|
31 | callee: {
|
32 | type: 'Identifier',
|
33 | name: 'require'
|
34 | },
|
35 | 'arguments': [{
|
36 | type: 'Literal',
|
37 | value: canonicalise(root, entryPoint)
|
38 | }]
|
39 | };
|
40 | if (null != options['export']) {
|
41 | exportExpression = esprima.parse(options['export']).body[0].expression;
|
42 | lhsExpression = exportExpression.type === 'Identifier' ? {
|
43 | type: 'MemberExpression',
|
44 | computed: false,
|
45 | object: {
|
46 | type: 'Identifier',
|
47 | name: 'global'
|
48 | },
|
49 | property: {
|
50 | type: 'Identifier',
|
51 | name: exportExpression.name
|
52 | }
|
53 | } : exportExpression;
|
54 | program.body.push({
|
55 | type: 'ExpressionStatement',
|
56 | expression: {
|
57 | type: 'AssignmentExpression',
|
58 | operator: '=',
|
59 | left: lhsExpression,
|
60 | right: requireEntryPoint
|
61 | }
|
62 | });
|
63 | } else {
|
64 | program.body.push({
|
65 | type: 'ExpressionStatement',
|
66 | expression: requireEntryPoint
|
67 | });
|
68 | }
|
69 | iife = esprima.parse('(function(global){}).call(this, this);');
|
70 | iife.body[0].expression.callee.object.body.body = program.body;
|
71 | iife.leadingComments = [{
|
72 | type: 'Line',
|
73 | value: ' Generated by CommonJS Everywhere ' + require('../package.json').version
|
74 | }];
|
75 | return iife;
|
76 | };
|
77 | function isOwn$(o, p) {
|
78 | return {}.hasOwnProperty.call(o, p);
|
79 | }
|
80 | }.call(this);
|