1 | BuiltinModule = require 'module'
|
2 | assert = (require 'assert').ok
|
3 | vm = require 'vm'
|
4 |
|
5 | NativeModule = do (natives = Object.keys process.binding 'natives') ->
|
6 | exists: (name) -> name in natives
|
7 |
|
8 | wrapper = require './wrapper'
|
9 | Sandbox = require './Sandbox'
|
10 |
|
11 | class Module extends BuiltinModule
|
12 | require: (path) ->
|
13 | assert typeof path is 'string', 'path must be a string'
|
14 | assert path, 'missing path'
|
15 |
|
16 | if path is 'gulp'
|
17 | return wrapper
|
18 |
|
19 | if path is 'gulp-util'
|
20 | return wrapper.util
|
21 |
|
22 | filename = BuiltinModule._resolveFilename path, @
|
23 | if NativeModule.exists filename
|
24 | return BuiltinModule._load.call @, path, @
|
25 |
|
26 | cached = BuiltinModule._cache[filename]
|
27 | if cached
|
28 | return cached.exports
|
29 |
|
30 | BuiltinModule._cache[filename] = module = new Module(filename, @)
|
31 |
|
32 | hadException = yes
|
33 | try
|
34 | module.load filename
|
35 | hadException = false
|
36 | finally
|
37 | if hadException
|
38 | delete BuiltinModule._cache[filename]
|
39 |
|
40 | return module.exports
|
41 |
|
42 | load: (filename) ->
|
43 | BuiltinModule.prototype.load.call @, filename
|
44 |
|
45 | _compile: (content, filename) ->
|
46 | self = @
|
47 | content = content.replace /^\#\!.*/, ''
|
48 |
|
49 | sandbox = new Sandbox({
|
50 | filename
|
51 | module: self
|
52 | imports: {gulp: wrapper}
|
53 | })
|
54 |
|
55 | vm.runInNewContext content, sandbox, filename
|
56 |
|
57 | module.exports = Module |
\ | No newline at end of file |