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:
};