aboutsummaryrefslogtreecommitdiff
path: root/node_modules/read-cache/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/read-cache/index.js')
-rw-r--r--node_modules/read-cache/index.js78
1 files changed, 78 insertions, 0 deletions
diff --git a/node_modules/read-cache/index.js b/node_modules/read-cache/index.js
new file mode 100644
index 0000000..b5263e6
--- /dev/null
+++ b/node_modules/read-cache/index.js
@@ -0,0 +1,78 @@
+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);
+};