const fs = require('graceful-fs'); const path = require('path'); const logMessages = require('./log-messages'); exports.cachePrefix = cachePrefix; const NS = fs.realpathSync(path.dirname(__dirname)); const cachePrefixNS = `${NS}/cachePrefix`; function cachePrefix(compilation) { if (typeof compilation[cachePrefixNS] === 'undefined') { let prefix = ''; let nextCompilation = compilation; while (nextCompilation.compiler.parentCompilation) { const parentCompilation = nextCompilation.compiler.parentCompilation; if (!nextCompilation.cache) { logMessages.childCompilerWithoutCache(compilation); prefix = null; break; } const cache = nextCompilation.cache; let parentCache = parentCompilation.cache; if (cache === parentCache) { nextCompilation = parentCompilation; continue; } let cacheKey; for (var key in parentCache) { if (key && parentCache[key] === cache) { cacheKey = key; break; } } // webpack 3 adds the children member containing compiler names paired // with arrays of compilation caches, one for each compilation sharing the // same name. if (!cacheKey && parentCache.children) { parentCache = parentCache.children; for (var key in parentCache) { if (key && parentCache[key]) { for (const index in parentCache[key]) { if (parentCache[key][index] === cache) { cacheKey = `${key}.${index}`; break; } if ( parentCache[key][index] && typeof parentCache[key][index] === 'object' ) { for (const subkey in parentCache[key][index]) { if (parentCache[key][index][subkey] === cache) { cacheKey = `${key}.${index}.${subkey}`; break; } } } } } } } if (!cacheKey) { logMessages.childCompilerUnnamedCache(compilation); prefix = null; break; } else { prefix = cacheKey + prefix; } nextCompilation = parentCompilation; } compilation[cachePrefixNS] = prefix !== null ? require('crypto') .createHash('md5') .update(prefix) .digest('base64') : null; } return compilation[cachePrefixNS]; }