/** @typedef {import("webpack/lib/Compilation.js")} WebpackCompilation */ /** @typedef {{timestamp: number, fileDependencies: string[]}} Snapshot */ 'use strict'; /** * * @param {{fileDependencies: string[], contextDependencies: string[], missingDependencies: string[]}} fileDependencies * @param {WebpackCompilation} compilation * @param {number} startTime */ function createSnapshot (fileDependencies, compilation, startTime) { const flatDependencies = []; Object.keys(fileDependencies).forEach((depencyTypes) => { fileDependencies[depencyTypes].forEach(fileDependency => { flatDependencies.push(fileDependency); }); }); return { fileDependencies: flatDependencies, timestamp: startTime }; } /** * Returns true if the files inside this snapshot * have not been changed * * @param {Snapshot} snapshot * @param {WebpackCompilation} compilation * @returns {Promise} */ function isSnapShotValid (snapshot, compilation) { // Check if any dependent file was changed after the last compilation const fileTimestamps = compilation.fileTimestamps; const isCacheOutOfDate = snapshot.fileDependencies.some((fileDependency) => { const timestamp = fileTimestamps.get(fileDependency); // If the timestamp is not known the file is new // If the timestamp is larger then the file has changed // Otherwise the file is still the same return !timestamp || timestamp > snapshot.timestamp; }); return Promise.resolve(!isCacheOutOfDate); } /** * Ensure that the files keep watched for changes * and will trigger a recompile * * @param {WebpackCompilation} mainCompilation * @param {{fileDependencies: string[], contextDependencies: string[], missingDependencies: string[]}} fileDependencies */ function watchFiles (mainCompilation, fileDependencies) { Object.keys(fileDependencies).forEach((depencyTypes) => { fileDependencies[depencyTypes].forEach(fileDependency => { mainCompilation.compilationDependencies.add(fileDependency); }); }); } module.exports = { createSnapshot, isSnapShotValid, watchFiles };