12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const asyncLib = require("async");
- class CachePlugin {
- constructor(cache) {
- this.cache = cache || {};
- this.FS_ACCURENCY = 2000;
- }
- apply(compiler) {
- if(Array.isArray(compiler.compilers)) {
- compiler.compilers.forEach((c, idx) => {
- c.apply(new CachePlugin(this.cache[idx] = this.cache[idx] || {}));
- });
- } else {
- compiler.plugin("compilation", compilation => {
- if(!compilation.notCacheable) {
- compilation.cache = this.cache;
- } else if(this.watching) {
- compilation.warnings.push(
- new Error(`CachePlugin - Cache cannot be used because of: ${compilation.notCacheable}`)
- );
- }
- });
- compiler.plugin("watch-run", (compiler, callback) => {
- this.watching = true;
- callback();
- });
- compiler.plugin("run", (compiler, callback) => {
- if(!compiler._lastCompilationFileDependencies) return callback();
- const fs = compiler.inputFileSystem;
- const fileTs = compiler.fileTimestamps = {};
- asyncLib.forEach(compiler._lastCompilationFileDependencies, (file, callback) => {
- fs.stat(file, (err, stat) => {
- if(err) {
- if(err.code === "ENOENT") return callback();
- return callback(err);
- }
- if(stat.mtime)
- this.applyMtime(+stat.mtime);
- fileTs[file] = +stat.mtime || Infinity;
- callback();
- });
- }, err => {
- if(err) return callback(err);
- Object.keys(fileTs).forEach(key => {
- fileTs[key] += this.FS_ACCURENCY;
- });
- callback();
- });
- });
- compiler.plugin("after-compile", function(compilation, callback) {
- compilation.compiler._lastCompilationFileDependencies = compilation.fileDependencies;
- compilation.compiler._lastCompilationContextDependencies = compilation.contextDependencies;
- callback();
- });
- }
- }
- /* istanbul ignore next */
- applyMtime(mtime) {
- if(this.FS_ACCURENCY > 1 && mtime % 2 !== 0)
- this.FS_ACCURENCY = 1;
- else if(this.FS_ACCURENCY > 10 && mtime % 20 !== 0)
- this.FS_ACCURENCY = 10;
- else if(this.FS_ACCURENCY > 100 && mtime % 200 !== 0)
- this.FS_ACCURENCY = 100;
- else if(this.FS_ACCURENCY > 1000 && mtime % 2000 !== 0)
- this.FS_ACCURENCY = 1000;
- }
- }
- module.exports = CachePlugin;
|