denodify
Version:
Use nodejs modules in the browser. Used with bb-server and html-builder
584 lines (408 loc) • 27.1 kB
HTML
<html>
<head>
<title>denodify.js</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
<div id="container">
<div id="background"></div>
<ul class="sections">
<li id="title">
<div class="annotation">
<h1>denodify.js</h1>
</div>
</li>
<li id="section-1">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-1">¶</a>
</div>
</div>
<div class="content"><div class='highlight'><pre>(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(global)</span> {</span>
<span class="hljs-keyword">if</span> (global.denodify) <span class="hljs-keyword">return</span>;
<span class="hljs-keyword">var</span> m = {};
<span class="hljs-keyword">var</span> f = {};
<span class="hljs-keyword">var</span> process = {
platform: <span class="hljs-string">'browser'</span>
};</pre></div></div>
</li>
<li id="section-2">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-2">¶</a>
</div>
<h3 id="api">API</h3>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">require</span><span class="hljs-params">(parent, moduleid)</span> {</span>
<span class="hljs-keyword">if</span> (moduleid.indexOf(<span class="hljs-string">'/'</span>) === -<span class="hljs-number">1</span>) parent = <span class="hljs-string">''</span>;
<span class="hljs-keyword">else</span> {
<span class="hljs-keyword">if</span> (Path.isAbsolute(moduleid)) parent = <span class="hljs-string">'/'</span>;
<span class="hljs-keyword">else</span> moduleid = Path.join(parent, moduleid);
<span class="hljs-keyword">if</span> (!Path.extname(moduleid)) moduleid += <span class="hljs-string">'.js'</span>;
}
<span class="hljs-keyword">var</span> module = m[moduleid];
<span class="hljs-keyword">if</span> (module) <span class="hljs-keyword">return</span> module.exports;
<span class="hljs-keyword">var</span> func = f[moduleid];
<span class="hljs-keyword">if</span> (!func)
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Couldn\'t resolve module with resolved path of '</span> +
Path.join(Path.dirname(parent), moduleid));
func(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(__filename)</span> {</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">require</span>(Path.dirname(moduleid), __filename); },
module = m[moduleid] = {},
module.exports = {},
moduleid,
Path.dirname(moduleid),
process);
<span class="hljs-keyword">return</span> module.exports;
}</pre></div></div>
</li>
<li id="section-3">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-3">¶</a>
</div>
<h3 id="denodify">denodify</h3>
<p>Use this to denodify javascript. Wrap your source code with</p>
</div>
</li>
<li id="section-4">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-4">¶</a>
</div>
<pre><code>denodify(<span class="hljs-string">'moduleid'</span>,<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(require, module, exports, __filename, __dirname, process)</span> {</span>
[your source code]
});
</code></pre>
</div>
<div class="content"><div class='highlight'><pre> global.denodify = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(__filename, func)</span> {</span>
f[__filename] = func;
};</pre></div></div>
</li>
<li id="section-5">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-5">¶</a>
</div>
<h3 id="require">require</h3>
<p>Use this function to pull in or kickstart any defined nodejs modules from
outside nodejs modules. </p>
</div>
<div class="content"><div class='highlight'><pre> global.denodify.require = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(__filename)</span> {</span>
<span class="hljs-built_in">require</span>(<span class="hljs-string">''</span>, __filename);
};</pre></div></div>
</li>
<li id="section-6">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-6">¶</a>
</div>
<h3 id="debug">debug</h3>
</div>
<div class="content"><div class='highlight'><pre> global.denodify.debug = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(__filename)</span> {</span>
console.log(<span class="hljs-string">'modules\n:'</span>, m);
console.log(<span class="hljs-string">'funcs\n:'</span>, f);
};</pre></div></div>
</li>
<li id="section-7">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-7">¶</a>
</div>
<p>End of API ———————————————————————-</p>
</div>
</li>
<li id="section-8">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-8">¶</a>
</div>
<p>The rest is <code>path</code>, copied from path-browserify</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> path = (<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> {</span>
<span class="hljs-keyword">var</span> exports = {};
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">normalizeArray</span><span class="hljs-params">(parts, allowAboveRoot)</span> {</span></pre></div></div>
</li>
<li id="section-9">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-9">¶</a>
</div>
<p>if the path tries to go above the root, <code>up</code> ends up > 0</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> up = <span class="hljs-number">0</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = parts.length - <span class="hljs-number">1</span>; i >= <span class="hljs-number">0</span>; i--) {
<span class="hljs-keyword">var</span> last = parts[i];
<span class="hljs-keyword">if</span> (last === <span class="hljs-string">'.'</span>) {
parts.splice(i, <span class="hljs-number">1</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (last === <span class="hljs-string">'..'</span>) {
parts.splice(i, <span class="hljs-number">1</span>);
up++;
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (up) {
parts.splice(i, <span class="hljs-number">1</span>);
up--;
}
}</pre></div></div>
</li>
<li id="section-10">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-10">¶</a>
</div>
<p>if the path is allowed to go above the root, restore leading ..s</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (allowAboveRoot) {
<span class="hljs-keyword">for</span> (; up--; up) {
parts.unshift(<span class="hljs-string">'..'</span>);
}
}
<span class="hljs-keyword">return</span> parts;
}</pre></div></div>
</li>
<li id="section-11">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-11">¶</a>
</div>
<p>Split a filename into [root, dir, basename, ext], unix version
‘root’ is just a slash, or nothing.</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> splitPathRe =
<span class="hljs-regexp">/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/</span>;
<span class="hljs-keyword">var</span> splitPath = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(filename)</span> {</span>
<span class="hljs-keyword">return</span> splitPathRe.exec(filename).slice(<span class="hljs-number">1</span>);
};</pre></div></div>
</li>
<li id="section-12">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-12">¶</a>
</div>
<p>path.resolve([from …], to)
posix version</p>
</div>
<div class="content"><div class='highlight'><pre> exports.resolve = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> {</span>
<span class="hljs-keyword">var</span> resolvedPath = <span class="hljs-string">''</span>,
resolvedAbsolute = <span class="hljs-literal">false</span>;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-built_in">arguments</span>.length - <span class="hljs-number">1</span>; i >= -<span class="hljs-number">1</span> && !resolvedAbsolute; i--) {
<span class="hljs-keyword">var</span> path = (i >= <span class="hljs-number">0</span>) ? <span class="hljs-built_in">arguments</span>[i] : process.cwd();</pre></div></div>
</li>
<li id="section-13">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-13">¶</a>
</div>
<p>Skip empty and invalid entries</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> path !== <span class="hljs-string">'string'</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>(<span class="hljs-string">'Arguments to path.resolve must be strings'</span>);
} <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!path) {
<span class="hljs-keyword">continue</span>;
}
resolvedPath = path + <span class="hljs-string">'/'</span> + resolvedPath;
resolvedAbsolute = path.charAt(<span class="hljs-number">0</span>) === <span class="hljs-string">'/'</span>;
}</pre></div></div>
</li>
<li id="section-14">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-14">¶</a>
</div>
<p>At this point the path should be resolved to a full absolute path, but
handle relative paths to be safe (might happen when process.cwd() fails)</p>
</div>
</li>
<li id="section-15">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-15">¶</a>
</div>
<p>Normalize the path</p>
</div>
<div class="content"><div class='highlight'><pre> resolvedPath = normalizeArray(filter(resolvedPath.split(<span class="hljs-string">'/'</span>), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(p)</span> {</span>
<span class="hljs-keyword">return</span> !!p;
}), !resolvedAbsolute).join(<span class="hljs-string">'/'</span>);
<span class="hljs-keyword">return</span> ((resolvedAbsolute ? <span class="hljs-string">'/'</span> : <span class="hljs-string">''</span>) + resolvedPath) || <span class="hljs-string">'.'</span>;
};</pre></div></div>
</li>
<li id="section-16">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-16">¶</a>
</div>
<p>path.normalize(path)
posix version</p>
</div>
<div class="content"><div class='highlight'><pre> exports.normalize = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
<span class="hljs-keyword">var</span> isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -<span class="hljs-number">1</span>) === <span class="hljs-string">'/'</span>;</pre></div></div>
</li>
<li id="section-17">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-17">¶</a>
</div>
<p>Normalize the path</p>
</div>
<div class="content"><div class='highlight'><pre> path = normalizeArray(filter(path.split(<span class="hljs-string">'/'</span>), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(p)</span> {</span>
<span class="hljs-keyword">return</span> !!p;
}), !isAbsolute).join(<span class="hljs-string">'/'</span>);
<span class="hljs-keyword">if</span> (!path && !isAbsolute) {
path = <span class="hljs-string">'.'</span>;
}
<span class="hljs-keyword">if</span> (path && trailingSlash) {
path += <span class="hljs-string">'/'</span>;
}
<span class="hljs-keyword">return</span> (isAbsolute ? <span class="hljs-string">'/'</span> : <span class="hljs-string">''</span>) + path;
};</pre></div></div>
</li>
<li id="section-18">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-18">¶</a>
</div>
<p>posix version</p>
</div>
<div class="content"><div class='highlight'><pre> exports.isAbsolute = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
<span class="hljs-keyword">return</span> path.charAt(<span class="hljs-number">0</span>) === <span class="hljs-string">'/'</span>;
};</pre></div></div>
</li>
<li id="section-19">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-19">¶</a>
</div>
<p>posix version</p>
</div>
<div class="content"><div class='highlight'><pre> exports.join = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> {</span>
<span class="hljs-keyword">var</span> paths = <span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>, <span class="hljs-number">0</span>);
<span class="hljs-keyword">return</span> exports.normalize(filter(paths, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(p, index)</span> {</span>
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> p !== <span class="hljs-string">'string'</span>) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>(<span class="hljs-string">'Arguments to path.join must be strings'</span>);
}
<span class="hljs-keyword">return</span> p;
}).join(<span class="hljs-string">'/'</span>));
};</pre></div></div>
</li>
<li id="section-20">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-20">¶</a>
</div>
<p>path.relative(from, to)
posix version</p>
</div>
<div class="content"><div class='highlight'><pre> exports.relative = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(from, to)</span> {</span>
from = exports.resolve(from).substr(<span class="hljs-number">1</span>);
to = exports.resolve(to).substr(<span class="hljs-number">1</span>);
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">trim</span><span class="hljs-params">(arr)</span> {</span>
<span class="hljs-keyword">var</span> start = <span class="hljs-number">0</span>;
<span class="hljs-keyword">for</span> (; start < arr.length; start++) {
<span class="hljs-keyword">if</span> (arr[start] !== <span class="hljs-string">''</span>) <span class="hljs-keyword">break</span>;
}
<span class="hljs-keyword">var</span> end = arr.length - <span class="hljs-number">1</span>;
<span class="hljs-keyword">for</span> (; end >= <span class="hljs-number">0</span>; end--) {
<span class="hljs-keyword">if</span> (arr[end] !== <span class="hljs-string">''</span>) <span class="hljs-keyword">break</span>;
}
<span class="hljs-keyword">if</span> (start > end) <span class="hljs-keyword">return</span> [];
<span class="hljs-keyword">return</span> arr.slice(start, end - start + <span class="hljs-number">1</span>);
}
<span class="hljs-keyword">var</span> fromParts = trim(from.split(<span class="hljs-string">'/'</span>));
<span class="hljs-keyword">var</span> toParts = trim(to.split(<span class="hljs-string">'/'</span>));
<span class="hljs-keyword">var</span> length = <span class="hljs-built_in">Math</span>.min(fromParts.length, toParts.length);
<span class="hljs-keyword">var</span> samePartsLength = length;
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < length; i++) {
<span class="hljs-keyword">if</span> (fromParts[i] !== toParts[i]) {
samePartsLength = i;
<span class="hljs-keyword">break</span>;
}
}
<span class="hljs-keyword">var</span> outputParts = [];
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = samePartsLength; i < fromParts.length; i++) {
outputParts.push(<span class="hljs-string">'..'</span>);
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
<span class="hljs-keyword">return</span> outputParts.join(<span class="hljs-string">'/'</span>);
};
exports.sep = <span class="hljs-string">'/'</span>;
exports.delimiter = <span class="hljs-string">':'</span>;
exports.dirname = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
<span class="hljs-keyword">var</span> result = splitPath(path),
root = result[<span class="hljs-number">0</span>],
dir = result[<span class="hljs-number">1</span>];
<span class="hljs-keyword">if</span> (!root && !dir) {</pre></div></div>
</li>
<li id="section-21">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-21">¶</a>
</div>
<p>No dirname whatsoever</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-string">'.'</span>;
}
<span class="hljs-keyword">if</span> (dir) {</pre></div></div>
</li>
<li id="section-22">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-22">¶</a>
</div>
<p>It has a dirname, strip trailing slash</p>
</div>
<div class="content"><div class='highlight'><pre> dir = dir.substr(<span class="hljs-number">0</span>, dir.length - <span class="hljs-number">1</span>);
}
<span class="hljs-keyword">return</span> root + dir;
};
exports.basename = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path, ext)</span> {</span>
<span class="hljs-keyword">var</span> f = splitPath(path)[<span class="hljs-number">2</span>];</pre></div></div>
</li>
<li id="section-23">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-23">¶</a>
</div>
<p>TODO: make this comparison case-insensitive on windows?</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (ext && f.substr(-<span class="hljs-number">1</span> * ext.length) === ext) {
f = f.substr(<span class="hljs-number">0</span>, f.length - ext.length);
}
<span class="hljs-keyword">return</span> f;
};
exports.extname = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
<span class="hljs-keyword">return</span> splitPath(path)[<span class="hljs-number">3</span>];
};
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">filter</span> <span class="hljs-params">(xs, f)</span> {</span>
<span class="hljs-keyword">if</span> (xs.filter) <span class="hljs-keyword">return</span> xs.filter(f);
<span class="hljs-keyword">var</span> res = [];
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i < xs.length; i++) {
<span class="hljs-keyword">if</span> (f(xs[i], i, xs)) res.push(xs[i]);
}
<span class="hljs-keyword">return</span> res;
}</pre></div></div>
</li>
<li id="section-24">
<div class="annotation">
<div class="pilwrap ">
<a class="pilcrow" href="#section-24">¶</a>
</div>
<p>String.prototype.substr - negative index don’t work in IE8</p>
</div>
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> substr = <span class="hljs-string">'ab'</span>.substr(-<span class="hljs-number">1</span>) === <span class="hljs-string">'b'</span>
? <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(str, start, len)</span> {</span> <span class="hljs-keyword">return</span> str.substr(start, len) }
: <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(str, start, len)</span> {</span>
<span class="hljs-keyword">if</span> (start < <span class="hljs-number">0</span>) start = str.length + start;
<span class="hljs-keyword">return</span> str.substr(start, len);
};
<span class="hljs-keyword">return</span> { exports: exports };
})();
m[<span class="hljs-string">'path'</span>] = path;
<span class="hljs-keyword">var</span> Path = path.exports;
})(<span class="hljs-keyword">this</span>);</pre></div></div>
</li>
</ul>
</div>
</body>
</html>