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.
78 lines
1.6 KiB
78 lines
1.6 KiB
var fs = require('fs'); |
|
var path = require('path'); |
|
var pify = require('pify'); |
|
|
|
var stat = pify(fs.stat); |
|
var readFile = pify(fs.readFile); |
|
var resolve = path.resolve; |
|
|
|
var cache = Object.create(null); |
|
|
|
function convert(content, encoding) { |
|
if (Buffer.isEncoding(encoding)) { |
|
return content.toString(encoding); |
|
} |
|
return content; |
|
} |
|
|
|
module.exports = function (path, encoding) { |
|
path = resolve(path); |
|
|
|
return stat(path).then(function (stats) { |
|
var item = cache[path]; |
|
|
|
if (item && item.mtime.getTime() === stats.mtime.getTime()) { |
|
return convert(item.content, encoding); |
|
} |
|
|
|
return readFile(path).then(function (data) { |
|
cache[path] = { |
|
mtime: stats.mtime, |
|
content: data |
|
}; |
|
|
|
return convert(data, encoding); |
|
}); |
|
}).catch(function (err) { |
|
cache[path] = null; |
|
return Promise.reject(err); |
|
}); |
|
}; |
|
|
|
module.exports.sync = function (path, encoding) { |
|
path = resolve(path); |
|
|
|
try { |
|
var stats = fs.statSync(path); |
|
var item = cache[path]; |
|
|
|
if (item && item.mtime.getTime() === stats.mtime.getTime()) { |
|
return convert(item.content, encoding); |
|
} |
|
|
|
var data = fs.readFileSync(path); |
|
|
|
cache[path] = { |
|
mtime: stats.mtime, |
|
content: data |
|
}; |
|
|
|
return convert(data, encoding); |
|
} catch (err) { |
|
cache[path] = null; |
|
throw err; |
|
} |
|
|
|
}; |
|
|
|
module.exports.get = function (path, encoding) { |
|
path = resolve(path); |
|
if (cache[path]) { |
|
return convert(cache[path].content, encoding); |
|
} |
|
return null; |
|
}; |
|
|
|
module.exports.clear = function () { |
|
cache = Object.create(null); |
|
};
|
|
|