52 lines
1.4 KiB
JavaScript
52 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
var through2 = require('through2');
|
|
var fs = require('graceful-fs');
|
|
var File = require('vinyl');
|
|
|
|
function wrapWithVinylFile(options) {
|
|
|
|
// A stat property is exposed on file objects as a (wanted) side effect
|
|
function resolveFile(globFile, enc, cb) {
|
|
fs.lstat(globFile.path, function(err, stat) {
|
|
if (err) {
|
|
return cb(err);
|
|
}
|
|
|
|
globFile.stat = stat;
|
|
|
|
if (!stat.isSymbolicLink() || !options.followSymlinks) {
|
|
var vinylFile = new File(globFile);
|
|
if (globFile.originalSymlinkPath) {
|
|
// If we reach here, it means there is at least one
|
|
// symlink on the path and we need to rewrite the path
|
|
// to its original value.
|
|
// Updated file stats will tell getContents() to actually read it.
|
|
vinylFile.path = globFile.originalSymlinkPath;
|
|
}
|
|
return cb(null, vinylFile);
|
|
}
|
|
|
|
fs.realpath(globFile.path, function(err, filePath) {
|
|
if (err) {
|
|
return cb(err);
|
|
}
|
|
|
|
if (!globFile.originalSymlinkPath) {
|
|
// Store the original symlink path before the recursive call
|
|
// to later rewrite it back.
|
|
globFile.originalSymlinkPath = globFile.path;
|
|
}
|
|
globFile.path = filePath;
|
|
|
|
// Recurse to get real file stat
|
|
resolveFile(globFile, enc, cb);
|
|
});
|
|
});
|
|
}
|
|
|
|
return through2.obj(options, resolveFile);
|
|
}
|
|
|
|
module.exports = wrapWithVinylFile;
|