|
1 | 1 | /*jshint globalstrict: true*/
|
2 | 2 | /*jshint node: true */
|
| 3 | +/*jshint latedef: false */ |
| 4 | +/*jshint unused:false*/ |
3 | 5 | "use strict";
|
4 |
| -var fs = require('fs'); |
5 |
| -var req = require; |
| 6 | + |
| 7 | +const fs = require('fs'); |
| 8 | +//save the original require |
| 9 | +let originalRequire = require; |
| 10 | + |
6 | 11 | function loadModule(filename, module, require) {
|
7 |
| - var wrappedSrc = '( function( module, exports, require) {' + |
8 |
| - fs.readFileSync(filename, 'utf8') + |
9 |
| - '})( module, module.exports, require);'; |
10 |
| - eval(wrappedSrc); //jshint ignore:line |
| 12 | + const wrappedSrc = |
| 13 | + `(function(module, exports, require) { |
| 14 | + ${fs.readFileSync(filename, 'utf8')} |
| 15 | + })(module, module.exports, require);`; |
| 16 | + eval(wrappedSrc); // jshint ignore:line |
11 | 17 | }
|
12 | 18 |
|
13 |
| -var require = function(moduleName) { |
14 |
| - console.log('Require invoked for module: ' + moduleName); |
15 |
| - var id = require.resolve(moduleName); |
16 |
| - //[ 1] |
17 |
| - if (require.cache[id]) { |
18 |
| - //[ 2] |
| 19 | +// We intentionally use var in the next line to avoid "SyntaxError: Identifier 'require' has already been declared" |
| 20 | +var require = (moduleName) => { |
| 21 | + console.log(`Require invoked for module: ${moduleName}`); |
| 22 | + const id = require.resolve(moduleName); //[1] |
| 23 | + if(require.cache[id]) { //[2] |
19 | 24 | return require.cache[id].exports;
|
20 | 25 | }
|
21 |
| - // module metadata |
22 |
| - var module = { |
23 |
| - //[ 3] |
24 |
| - exports : {}, |
25 |
| - id : id |
| 26 | + |
| 27 | + //module metadata |
| 28 | + const module = { //[3] |
| 29 | + exports: {}, |
| 30 | + id: id |
26 | 31 | };
|
27 |
| - // Update the cache |
28 |
| - require.cache[id] = module; |
29 |
| - //[ 4] |
30 |
| - // load the module |
31 |
| - loadModule(id, module, require); |
32 |
| - //[ 5] |
33 |
| - // return exported variables |
34 |
| - return module.exports; |
35 |
| - //[ 6] |
| 32 | + //Update the cache |
| 33 | + require.cache[id] = module; //[4] |
| 34 | + |
| 35 | + //load the module |
| 36 | + loadModule(id, module, require); //[5] |
| 37 | + |
| 38 | + //return exported variables |
| 39 | + return module.exports; //[6] |
36 | 40 | };
|
| 41 | + |
37 | 42 | require.cache = {};
|
38 |
| -require.resolve = |
39 |
| - function(moduleName) { |
40 |
| - /* resolve a full module id fromthe moduleName */ |
41 |
| - if (moduleName.startsWith('./')) { |
42 |
| - if (moduleName.indexOf('.js')) |
43 |
| - return moduleName; |
44 |
| - return moduleName + '.js'; |
45 |
| - } |
46 |
| - return req.resolve(moduleName); |
| 43 | +require.resolve = (moduleName) => { |
| 44 | + //reuse the original resolving algorithm for simplicity |
| 45 | + return originalRequire.resolve(moduleName); |
47 | 46 | };
|
48 | 47 |
|
49 |
| -// load another dependency |
50 |
| -var dependency = require('./anothermodule.js'); |
51 |
| -// a private function |
52 |
| -function log() { console.log('Well done ' + dependency.username); } |
53 |
| -// the API to be exported for public use |
54 |
| -module.exports.run = function() { log(); }; |
| 48 | +//Load the entry point using our homemade 'require' |
| 49 | +require(process.argv[2]); |
0 commit comments