This repository has been archived by the owner on Jan 30, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathinject.js
107 lines (91 loc) · 2.73 KB
/
inject.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
var moduleDeps = require('module-deps')
var resolve = require('resolve')
var through = require('through2')
var sort = require('sort-stream')
var deterministic = require('./deterministic')
var pack = require('./pack')
var path = require('path')
var fs = require('fs')
function exists (p) {
try {
(fs.accessSync || fs.statSync)(p)
return true
} catch (err) {
console.error('not found', p, err)
return false
}
}
function pkgRoot (file) {
var dir = path.dirname(file)
, prev
while (true) {
if (exists(path.join(dir, 'package.json')) || exists(path.join(dir, 'node_modules')))
return dir
if (prev === dir) {
throw new Error('Could not find module root for ' + file)
}
prev = dir
dir = path.join(dir, '..')
}
}
function createDepStream(opts) {
return moduleDeps({
ignoreMissing: opts.ignoreMissing,
filter: function (s) {
return (!~opts.filter.indexOf(s)) && opts.replace[s] !== false
},
resolve: function (required, module, cb) {
if(opts.replace && opts.replace[required]) {
required = opts.replace[required]
}
if(opts.replace[required] === false) throw new Error('should not resolve:'+required)
return resolve (required, {
basedir: path.dirname(module.filename),
extensions: ['.js', '.json', '.node']
},
function (err, file) {
if(err) return cb (err)
if (file) {
if (file[0] !== '/') {
var c = required.split('/')[0]
if (c[0] !== '.') console.error('missing dependency. need to install:', c)
} else if (file && file.substr(-5) === '.node') {
opts.replace[required] = path.relative(path.dirname(opts.entry), file)
return cb(null, null)
}
}
cb(null, /^\//.test(file) ? file : null)
})
},
postFilter: function (id, file, pkg) {
if(/\.node$/.test(id)) console.error(id, file)
return file || !(/\.node$/.test(id))
}
})
.on('data', function (e) {
e.id = path.relative(process.cwd(), e.id)
e.source = e.source.replace(/^\s*#![^\n]*/, '\n')
try {
JSON.parse(e.source)
e.source = 'module.exports = ' + e.source
} catch (e) { }
for(var k in e.deps) {
if(!e.deps[k])
delete e.deps[k]
else
e.deps[k] = path.relative(process.cwd(), e.deps[k])
}
})
}
module.exports = function (opts, cb) {
var deps = createDepStream(opts)
deps
.pipe(deterministic(function (err, content, deps, entry) {
if(err) cb(err)
else cb(null,
(opts.shebang !== false ? '#! /usr/bin/env node\n' : '') +
pack(content, deps, entry)
)
}))
deps.end(opts.entry)
}