Name: js-handler/node_modules/nodeunit/deps/ejs/support/compile.js
| 1: | /** |
| 2: | * Module dependencies. |
| 3: | */ |
| 4: | |
| 5: | var fs = require('fs'); |
| 6: | |
| 7: | /** |
| 8: | * Arguments. |
| 9: | */ |
| 10: | |
| 11: | var args = process.argv.slice(2) |
| 12: | , pending = args.length |
| 13: | , files = {}; |
| 14: | |
| 15: | console.log(''); |
| 16: | |
| 17: | // parse arguments |
| 18: | |
| 19: | args.forEach(function(file){ |
| 20: | var mod = file.replace('lib/', ''); |
| 21: | fs.readFile(file, 'utf8', function(err, js){ |
| 22: | if (err) throw err; |
| 23: | console.log(' \033[90mcompile : \033[0m\033[36m%s\033[0m', file); |
| 24: | files[file] = parse(js); |
| 25: | --pending || compile(); |
| 26: | }); |
| 27: | }); |
| 28: | |
| 29: | /** |
| 30: | * Parse the given `js`. |
| 31: | */ |
| 32: | |
| 33: | function parse(js) { |
| 34: | return parseInheritance(parseConditionals(js)); |
| 35: | } |
| 36: | |
| 37: | /** |
| 38: | * Parse __proto__. |
| 39: | */ |
| 40: | |
| 41: | function parseInheritance(js) { |
| 42: | return js |
| 43: | .replace(/^ *(\w+)\.prototype\.__proto__ * = *(\w+)\.prototype *;?/gm, function(_, child, parent){ |
| 44: | return child + '.prototype = new ' + parent + ';\n' |
| 45: | + child + '.prototype.constructor = '+ child + ';\n'; |
| 46: | }); |
| 47: | } |
| 48: | |
| 49: | /** |
| 50: | * Parse the given `js`, currently supporting: |
| 51: | * |
| 52: | * 'if' ['node' | 'browser'] |
| 53: | * 'end' |
| 54: | * |
| 55: | */ |
| 56: | |
| 57: | function parseConditionals(js) { |
| 58: | var lines = js.split('\n') |
| 59: | , len = lines.length |
| 60: | , buffer = true |
| 61: | , browser = false |
| 62: | , buf = [] |
| 63: | , line |
| 64: | , cond; |
| 65: | |
| 66: | for (var i = 0; i < len; ++i) { |
| 67: | line = lines[i]; |
| 68: | if (/^ *\/\/ *if *(node|browser)/gm.exec(line)) { |
| 69: | cond = RegExp.$1; |
| 70: | buffer = browser = 'browser' == cond; |
| 71: | } else if (/^ *\/\/ *end/.test(line)) { |
| 72: | buffer = true; |
| 73: | browser = false; |
| 74: | } else if (browser) { |
| 75: | buf.push(line.replace(/^( *)\/\//, '$1')); |
| 76: | } else if (buffer) { |
| 77: | buf.push(line); |
| 78: | } |
| 79: | } |
| 80: | |
| 81: | return buf.join('\n'); |
| 82: | } |
| 83: | |
| 84: | /** |
| 85: | * Compile the files. |
| 86: | */ |
| 87: | |
| 88: | function compile() { |
| 89: | var buf = ''; |
| 90: | buf += '\n// CommonJS require()\n\n'; |
| 91: | buf += browser.require + '\n\n'; |
| 92: | buf += 'require.modules = {};\n\n'; |
| 93: | buf += 'require.resolve = ' + browser.resolve + ';\n\n'; |
| 94: | buf += 'require.register = ' + browser.register + ';\n\n'; |
| 95: | buf += 'require.relative = ' + browser.relative + ';\n\n'; |
| 96: | args.forEach(function(file){ |
| 97: | var js = files[file]; |
| 98: | file = file.replace('lib/', ''); |
| 99: | buf += '\nrequire.register("' + file + '", function(module, exports, require){\n'; |
| 100: | buf += js; |
| 101: | buf += '\n}); // module: ' + file + '\n'; |
| 102: | }); |
| 103: | fs.writeFile('ejs.js', buf, function(err){ |
| 104: | if (err) throw err; |
| 105: | console.log(' \033[90m create : \033[0m\033[36m%s\033[0m', 'ejs.js'); |
| 106: | console.log(); |
| 107: | }); |
| 108: | } |
| 109: | |
| 110: | // refactored version of weepy's |
| 111: | // https://github.com/weepy/brequire/blob/master/browser/brequire.js |
| 112: | |
| 113: | var browser = { |
| 114: | |
| 115: | /** |
| 116: | * Require a module. |
| 117: | */ |
| 118: | |
| 119: | require: function require(p){ |
| 120: | var path = require.resolve(p) |
| 121: | , mod = require.modules[path]; |
| 122: | if (!mod) throw new Error('failed to require "' + p + '"'); |
| 123: | if (!mod.exports) { |
| 124: | mod.exports = {}; |
| 125: | mod.call(mod.exports, mod, mod.exports, require.relative(path)); |
| 126: | } |
| 127: | return mod.exports; |
| 128: | }, |
| 129: | |
| 130: | /** |
| 131: | * Resolve module path. |
| 132: | */ |
| 133: | |
| 134: | resolve: function(path){ |
| 135: | var orig = path |
| 136: | , reg = path + '.js' |
| 137: | , index = path + '/index.js'; |
| 138: | return require.modules[reg] && reg |
| 139: | || require.modules[index] && index |
| 140: | || orig; |
| 141: | }, |
| 142: | |
| 143: | /** |
| 144: | * Return relative require(). |
| 145: | */ |
| 146: | |
| 147: | relative: function(parent) { |
| 148: | return function(p){ |
| 149: | if ('.' != p.substr(0, 1)) return require(p); |
| 150: | |
| 151: | var path = parent.split('/') |
| 152: | , segs = p.split('/'); |
| 153: | path.pop(); |
| 154: | |
| 155: | for (var i = 0; i < segs.length; i++) { |
| 156: | var seg = segs[i]; |
| 157: | if ('..' == seg) path.pop(); |
| 158: | else if ('.' != seg) path.push(seg); |
| 159: | } |
| 160: | |
| 161: | return require(path.join('/')); |
| 162: | }; |
| 163: | }, |
| 164: | |
| 165: | /** |
| 166: | * Register a module. |
| 167: | */ |
| 168: | |
| 169: | register: function(path, fn){ |
| 170: | require.modules[path] = fn; |
| 171: | } |
| 172: | }; |
