You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.9 KiB
146 lines
3.9 KiB
var staticModule = require('static-module'); |
|
var quote = require('quote-stream'); |
|
var through = require('through2'); |
|
var fs = require('fs'); |
|
var path = require('path'); |
|
var resolve = require('resolve'); |
|
|
|
module.exports = function (file, opts) { |
|
if (/\.json$/.test(file)) return through(); |
|
|
|
function resolver (p) { |
|
return resolve.sync(p, { basedir: path.dirname(file) }); |
|
} |
|
var vars = { |
|
__filename: file, |
|
__dirname: path.dirname(file), |
|
require: { resolve: resolver } |
|
}; |
|
if (!opts) opts = {}; |
|
if (opts.vars) Object.keys(opts.vars).forEach(function (key) { |
|
vars[key] = opts.vars[key]; |
|
}); |
|
|
|
var sm = staticModule( |
|
{ |
|
fs: { |
|
readFileSync: readFileSync, |
|
readFile: readFile, |
|
readdirSync: readdirSync, |
|
readdir: readdir |
|
} |
|
}, |
|
{ vars: vars, varModules: { path: path } } |
|
); |
|
return sm; |
|
|
|
function readFile (file, enc, cb) { |
|
if (typeof enc === 'function') { |
|
cb = enc; |
|
enc = null; |
|
} |
|
if (enc && typeof enc === 'object' && enc.encoding) { |
|
enc = enc.encoding; |
|
} |
|
var isBuffer = false; |
|
if (enc === null || enc === undefined) { |
|
isBuffer = true; |
|
enc = 'base64'; |
|
} |
|
|
|
var stream = through(write, end); |
|
stream.push('process.nextTick(function(){(' + cb + ')(null,'); |
|
if (isBuffer) stream.push('Buffer('); |
|
|
|
var s = fs.createReadStream(file, { encoding: enc }); |
|
s.on('error', function (err) { sm.emit('error', err) }); |
|
return s.pipe(quote()).pipe(stream); |
|
|
|
function write (buf, enc, next) { |
|
this.push(buf); |
|
next(); |
|
} |
|
function end (next) { |
|
if (isBuffer) this.push(',"base64")'); |
|
this.push(')})'); |
|
this.push(null); |
|
sm.emit('file', file); |
|
next() |
|
} |
|
} |
|
|
|
function readFileSync (file, enc) { |
|
var isBuffer = false; |
|
if (enc === null || enc === undefined) { |
|
isBuffer = true; |
|
enc = 'base64'; |
|
} |
|
if (enc && typeof enc === 'object' && enc.encoding) { |
|
enc = enc.encoding; |
|
} |
|
var stream = fs.createReadStream(file, { encoding: enc }) |
|
.on('error', function (err) { sm.emit('error', err) }) |
|
.pipe(quote()).pipe(through(write, end)) |
|
; |
|
if (isBuffer) { |
|
stream.push('Buffer('); |
|
} |
|
return stream; |
|
|
|
function write (buf, enc, next) { |
|
this.push(buf); |
|
next(); |
|
} |
|
function end (next) { |
|
if (isBuffer) this.push(',"base64")'); |
|
this.push(null); |
|
sm.emit('file', file); |
|
next(); |
|
} |
|
} |
|
|
|
function readdir(path, cb) { |
|
var stream = through(write, end); |
|
|
|
stream.push('process.nextTick(function(){(' + cb + ')(null,'); |
|
fs.readdir(path, function (err, src) { |
|
if (err) { |
|
stream.emit('error', err); |
|
return; |
|
} |
|
stream.push(JSON.stringify(src)); |
|
stream.end(')})'); |
|
}); |
|
return stream; |
|
|
|
function write (buf, enc, next) { |
|
this.push(buf); |
|
next(); |
|
} |
|
function end (next) { |
|
this.push(null); |
|
next(); |
|
} |
|
} |
|
|
|
function readdirSync (path) { |
|
var stream = through(write, end); |
|
fs.readdir(path, function (err, src) { |
|
if (err) { |
|
stream.emit('error', err); |
|
return; |
|
} |
|
stream.end(JSON.stringify(src)); |
|
}); |
|
return stream; |
|
|
|
function write (buf, enc, next) { |
|
this.push(buf); |
|
next(); |
|
} |
|
function end (next) { |
|
this.push(null); |
|
next(); |
|
} |
|
} |
|
};
|
|
|