forked from tobie/modulr
-
Notifications
You must be signed in to change notification settings - Fork 7
/
modulr.sync.js
116 lines (101 loc) · 2.95 KB
/
modulr.sync.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// modulr.sync.js (c) 2010 codespeaks sàrl
// Freely distributable under the terms of the MIT license.
// For details, see:
// http://github.com/codespeaks/modulr/blob/master/LICENSE
var require = (function() {
var _factories = {},
_modules = {},
_exports = {},
_handlers = [],
_dirStack = [''],
PREFIX = '__module__', // Prefix identifiers to avoid issues in IE.
RELATIVE_IDENTIFIER_PATTERN = /^\.\.?\//,
_forEach;
_forEach = (function() {
var hasOwnProp = Object.prototype.hasOwnProperty,
DONT_ENUM_PROPERTIES = [
'constructor', 'toString', 'toLocaleString', 'valueOf',
'hasOwnProperty','isPrototypeOf', 'propertyIsEnumerable'
],
LENGTH = DONT_ENUM_PROPERTIES.length,
DONT_ENUM_BUG = true;
function _forEach(obj, callback) {
for(var prop in obj) {
if (hasOwnProp.call(obj, prop)) {
callback(prop, obj[prop]);
}
}
}
for(var prop in { toString: true }) {
DONT_ENUM_BUG = false
}
if (DONT_ENUM_BUG) {
return function(obj, callback) {
_forEach(obj, callback);
for (var i = 0; i < LENGTH; i++) {
var prop = DONT_ENUM_PROPERTIES[i];
if (hasOwnProp.call(obj, prop)) {
callback(prop, obj[prop]);
}
}
}
}
return _forEach;
})();
function require(identifier) {
var fn, mod,
id = resolveIdentifier(identifier),
key = PREFIX + id,
expts = _exports[key];
if (!expts) {
_exports[key] = expts = {};
_modules[key] = mod = { id: id };
fn = _factories[key];
_dirStack.push(id.substring(0, id.lastIndexOf('/') + 1))
try {
if (!fn) { throw 'Can\'t find module "' + identifier + '".'; }
if (typeof fn === 'string') {
fn = new Function('require', 'exports', 'module', fn);
}
if (!require.main) { require.main = mod; }
fn(require, expts, mod);
_dirStack.pop();
} catch(e) {
_dirStack.pop();
// We'd use a finally statement here if it wasn't for IE.
throw e;
}
}
return expts;
}
function resolveIdentifier(identifier) {
var dir, parts, part, path;
if (!RELATIVE_IDENTIFIER_PATTERN.test(identifier)) {
return identifier;
}
dir = _dirStack[_dirStack.length - 1];
parts = (dir + identifier).split('/');
path = [];
for (var i = 0, length = parts.length; i < length; i++) {
part = parts[i];
switch (part) {
case '':
case '.':
continue;
case '..':
path.pop();
break;
default:
path.push(part);
}
}
return path.join('/');
}
function define(descriptors) {
_forEach(descriptors, function(id, factory) {
_factories[PREFIX + id] = factory;
});
}
require.define = define;
return require;
})();