/
index.js
84 lines (64 loc) · 1.68 KB
/
index.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
/*
Copyright 2013 Lcf.vs
Released under the MIT license
https://github.com/Lcfvs/rwin
*/
'use strict';
var resolve,
getOwnPropertyNames,
defineProperty,
rwin,
setDescriptor,
setGetter,
load;
resolve = require('path').resolve;
getOwnPropertyNames = Object.getOwnPropertyNames.bind(Object);
defineProperty = Object.defineProperty.bind(Object);
rwin = function rwin(imports, dirname) {
var store,
rwinLib,
propertyNames,
onEachProperty;
store = {};
rwinLib = {};
propertyNames = getOwnPropertyNames(imports);
onEachProperty = setDescriptor.bind(rwinLib, imports, store, dirname);
propertyNames.forEach(onEachProperty);
return rwinLib;
};
setDescriptor = function setDescriptor(imports, store, dirname, name) {
var path,
descriptor;
path = imports[name];
descriptor = {
enumerable: true,
configurable: true
};
descriptor.get = setGetter.bind(descriptor, store, dirname, path, name);
defineProperty(this, name, descriptor);
};
setGetter = function setGetter(store, dirname, path, name) {
var isRequired,
filename;
isRequired = !store.hasOwnProperty(name);
if (isRequired) {
store[name] = load(dirname, path);
}
return store[name];
};
load = function load(dirname, path) {
var firstChar,
isNodeModule,
modulePath,
module;
firstChar = path.charAt(0);
isNodeModule = firstChar !== '.' && firstChar !== '/';
if (isNodeModule) {
modulePath = path;
} else {
modulePath = resolve(dirname, path);
}
module = require(modulePath);
return module;
};
module.exports = rwin;