diff options
Diffstat (limited to 'node_modules/caching-transform/index.js')
-rw-r--r-- | node_modules/caching-transform/index.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/node_modules/caching-transform/index.js b/node_modules/caching-transform/index.js new file mode 100644 index 000000000..a66a6741d --- /dev/null +++ b/node_modules/caching-transform/index.js @@ -0,0 +1,67 @@ +'use strict'; + +var mkdirp = require('mkdirp'); +var md5Hex = require('md5-hex'); +var fs = require('fs'); +var path = require('path'); +var writeFileAtomic = require('write-file-atomic'); + +function defaultHash(input, additionalData, salt) { + return md5Hex([input, salt || '']); +} + +function wrap(opts) { + if (!(opts.factory || opts.transform) || (opts.factory && opts.transform)) { + throw new Error('specify factory or transform but not both'); + } + if (typeof opts.cacheDir !== 'string' && !opts.disableCache) { + throw new Error('cacheDir must be a string'); + } + + var transformFn = opts.transform; + var factory = opts.factory; + var cacheDir = opts.cacheDir; + var cacheDirCreated = opts.createCacheDir === false; + var created = transformFn && cacheDirCreated; + var ext = opts.ext || ''; + var salt = opts.salt || ''; + var shouldTransform = opts.shouldTransform; + var disableCache = opts.disableCache; + var hashFn = opts.hash || defaultHash; + var encoding = opts.encoding === 'buffer' ? undefined : opts.encoding || 'utf8'; + + function transform(input, metadata, hash) { + if (!created) { + if (!cacheDirCreated && !disableCache) { + mkdirp.sync(cacheDir); + } + if (!transformFn) { + transformFn = factory(cacheDir); + } + created = true; + } + return transformFn(input, metadata, hash); + } + + return function (input, metadata) { + if (shouldTransform && !shouldTransform(input, metadata)) { + return input; + } + if (disableCache) { + return transform(input, metadata); + } + + var hash = hashFn(input, metadata, salt); + var cachedPath = path.join(cacheDir, hash + ext); + + try { + return fs.readFileSync(cachedPath, encoding); + } catch (e) { + var result = transform(input, metadata, hash); + writeFileAtomic.sync(cachedPath, result, encoding); + return result; + } + }; +} + +module.exports = wrap; |