From bbff7403fbf46f9ad92240ac213df8d30ef31b64 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 20 Sep 2018 02:56:13 +0200 Subject: update packages --- node_modules/webpack/lib/RecordIdsPlugin.js | 347 ++++++++++++++++++---------- 1 file changed, 230 insertions(+), 117 deletions(-) (limited to 'node_modules/webpack/lib/RecordIdsPlugin.js') diff --git a/node_modules/webpack/lib/RecordIdsPlugin.js b/node_modules/webpack/lib/RecordIdsPlugin.js index a4d53085b..88c6a9a3c 100644 --- a/node_modules/webpack/lib/RecordIdsPlugin.js +++ b/node_modules/webpack/lib/RecordIdsPlugin.js @@ -1,117 +1,230 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const identifierUtils = require("./util/identifier"); - -class RecordIdsPlugin { - - apply(compiler) { - compiler.plugin("compilation", compilation => { - compilation.plugin("record-modules", (modules, records) => { - if(!records.modules) records.modules = {}; - if(!records.modules.byIdentifier) records.modules.byIdentifier = {}; - if(!records.modules.usedIds) records.modules.usedIds = {}; - modules.forEach(function(module) { - if(!module.portableId) module.portableId = identifierUtils.makePathsRelative(compiler.context, module.identifier()); - const identifier = module.portableId; - records.modules.byIdentifier[identifier] = module.id; - records.modules.usedIds[module.id] = module.id; - }); - }); - compilation.plugin("revive-modules", (modules, records) => { - if(!records.modules) return; - if(records.modules.byIdentifier) { - const usedIds = {}; - modules.forEach(function(module) { - if(module.id !== null) return; - if(!module.portableId) module.portableId = identifierUtils.makePathsRelative(compiler.context, module.identifier()); - const identifier = module.portableId; - const id = records.modules.byIdentifier[identifier]; - if(id === undefined) return; - if(usedIds[id]) return; - usedIds[id] = true; - module.id = id; - }); - } - compilation.usedModuleIds = records.modules.usedIds; - }); - - function getDepBlockIdent(chunk, block) { - const ident = []; - if(block.chunks.length > 1) - ident.push(block.chunks.indexOf(chunk)); - while(block.parent) { - const p = block.parent; - const idx = p.blocks.indexOf(block); - const l = p.blocks.length - 1; - ident.push(`${idx}/${l}`); - block = block.parent; - } - if(!block.identifier) return null; - ident.push(identifierUtils.makePathsRelative(compiler.context, block.identifier())); - return ident.reverse().join(":"); - } - compilation.plugin("record-chunks", (chunks, records) => { - records.nextFreeChunkId = compilation.nextFreeChunkId; - if(!records.chunks) records.chunks = {}; - if(!records.chunks.byName) records.chunks.byName = {}; - if(!records.chunks.byBlocks) records.chunks.byBlocks = {}; - records.chunks.usedIds = {}; - chunks.forEach(chunk => { - const name = chunk.name; - const blockIdents = chunk.blocks.map(getDepBlockIdent.bind(null, chunk)).filter(Boolean); - if(name) records.chunks.byName[name] = chunk.id; - blockIdents.forEach((blockIdent) => { - records.chunks.byBlocks[blockIdent] = chunk.id; - }); - records.chunks.usedIds[chunk.id] = chunk.id; - }); - }); - compilation.plugin("revive-chunks", (chunks, records) => { - if(!records.chunks) return; - const usedIds = {}; - if(records.chunks.byName) { - chunks.forEach(function(chunk) { - if(chunk.id !== null) return; - if(!chunk.name) return; - const id = records.chunks.byName[chunk.name]; - if(id === undefined) return; - if(usedIds[id]) return; - usedIds[id] = true; - chunk.id = id; - }); - } - if(records.chunks.byBlocks) { - const argumentedChunks = chunks.filter(chunk => chunk.id === null).map(chunk => ({ - chunk, - blockIdents: chunk.blocks.map(getDepBlockIdent.bind(null, chunk)).filter(Boolean) - })).filter(arg => arg.blockIdents.length > 0); - let blockIdentsCount = {}; - argumentedChunks.forEach((arg, idx) => { - arg.blockIdents.forEach(blockIdent => { - const id = records.chunks.byBlocks[blockIdent]; - if(typeof id !== "number") return; - const accessor = `${id}:${idx}`; - blockIdentsCount[accessor] = (blockIdentsCount[accessor] || 0) + 1; - }); - }); - blockIdentsCount = Object.keys(blockIdentsCount).map(accessor => [blockIdentsCount[accessor]].concat(accessor.split(":").map(Number))).sort((a, b) => b[0] - a[0]); - blockIdentsCount.forEach(function(arg) { - const id = arg[1]; - if(usedIds[id]) return; - const idx = arg[2]; - const chunk = argumentedChunks[idx].chunk; - if(chunk.id !== null) return; - usedIds[id] = true; - chunk.id = id; - }); - } - compilation.usedChunkIds = records.chunks.usedIds; - }); - }); - } -} -module.exports = RecordIdsPlugin; +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +"use strict"; + +const identifierUtils = require("./util/identifier"); + +/** @typedef {import("./Compiler")} Compiler */ +/** @typedef {import("./Chunk")} Chunk */ +/** @typedef {import("./Module")} Module */ + +/** + * @typedef {Object} RecordsChunks + * @property {Record=} byName + * @property {Record=} bySource + * @property {number[]=} usedIds + */ + +/** + * @typedef {Object} RecordsModules + * @property {Record=} byIdentifier + * @property {Record=} bySource + * @property {Record=} usedIds + */ + +/** + * @typedef {Object} Records + * @property {RecordsChunks=} chunks + * @property {RecordsModules=} modules + */ + +class RecordIdsPlugin { + /** + * @param {Object} options Options object + * @param {boolean=} options.portableIds true, when ids need to be portable + */ + constructor(options) { + this.options = options || {}; + } + + /** + * @param {Compiler} compiler the Compiler + * @returns {void} + */ + apply(compiler) { + const portableIds = this.options.portableIds; + compiler.hooks.compilation.tap("RecordIdsPlugin", compilation => { + compilation.hooks.recordModules.tap( + "RecordIdsPlugin", + /** + * @param {Module[]} modules the modules array + * @param {Records} records the records object + * @returns {void} + */ + (modules, records) => { + if (!records.modules) records.modules = {}; + if (!records.modules.byIdentifier) records.modules.byIdentifier = {}; + if (!records.modules.usedIds) records.modules.usedIds = {}; + for (const module of modules) { + if (typeof module.id !== "number") continue; + const identifier = portableIds + ? identifierUtils.makePathsRelative( + compiler.context, + module.identifier(), + compilation.cache + ) + : module.identifier(); + records.modules.byIdentifier[identifier] = module.id; + records.modules.usedIds[module.id] = module.id; + } + } + ); + compilation.hooks.reviveModules.tap( + "RecordIdsPlugin", + /** + * @param {Module[]} modules the modules array + * @param {Records} records the records object + * @returns {void} + */ + (modules, records) => { + if (!records.modules) return; + if (records.modules.byIdentifier) { + /** @type {Set} */ + const usedIds = new Set(); + for (const module of modules) { + if (module.id !== null) continue; + const identifier = portableIds + ? identifierUtils.makePathsRelative( + compiler.context, + module.identifier(), + compilation.cache + ) + : module.identifier(); + const id = records.modules.byIdentifier[identifier]; + if (id === undefined) continue; + if (usedIds.has(id)) continue; + usedIds.add(id); + module.id = id; + } + } + if (Array.isArray(records.modules.usedIds)) { + compilation.usedModuleIds = new Set(records.modules.usedIds); + } + } + ); + + /** + * @param {Module} module the module + * @returns {string} the (portable) identifier + */ + const getModuleIdentifier = module => { + if (portableIds) { + return identifierUtils.makePathsRelative( + compiler.context, + module.identifier(), + compilation.cache + ); + } + return module.identifier(); + }; + + /** + * @param {Chunk} chunk the chunk + * @returns {string[]} sources of the chunk + */ + const getChunkSources = chunk => { + /** @type {string[]} */ + const sources = []; + for (const chunkGroup of chunk.groupsIterable) { + const index = chunkGroup.chunks.indexOf(chunk); + for (const origin of chunkGroup.origins) { + if (origin.module) { + if (origin.request) { + sources.push( + `${index} ${getModuleIdentifier(origin.module)} ${ + origin.request + }` + ); + } else if (typeof origin.loc === "string") { + sources.push( + `${index} ${getModuleIdentifier(origin.module)} ${origin.loc}` + ); + } else if ( + origin.loc && + typeof origin.loc === "object" && + origin.loc.start + ) { + sources.push( + `${index} ${getModuleIdentifier( + origin.module + )} ${JSON.stringify(origin.loc.start)}` + ); + } + } + } + } + return sources; + }; + + compilation.hooks.recordChunks.tap( + "RecordIdsPlugin", + /** + * @param {Chunk[]} chunks the chunks array + * @param {Records} records the records object + * @returns {void} + */ + (chunks, records) => { + if (!records.chunks) records.chunks = {}; + if (!records.chunks.byName) records.chunks.byName = {}; + if (!records.chunks.bySource) records.chunks.bySource = {}; + /** @type {Set} */ + const usedIds = new Set(); + for (const chunk of chunks) { + if (typeof chunk.id !== "number") continue; + const name = chunk.name; + if (name) records.chunks.byName[name] = chunk.id; + const sources = getChunkSources(chunk); + for (const source of sources) { + records.chunks.bySource[source] = chunk.id; + } + usedIds.add(chunk.id); + } + records.chunks.usedIds = Array.from(usedIds).sort(); + } + ); + compilation.hooks.reviveChunks.tap( + "RecordIdsPlugin", + /** + * @param {Chunk[]} chunks the chunks array + * @param {Records} records the records object + * @returns {void} + */ + (chunks, records) => { + if (!records.chunks) return; + /** @type {Set} */ + const usedIds = new Set(); + if (records.chunks.byName) { + for (const chunk of chunks) { + if (chunk.id !== null) continue; + if (!chunk.name) continue; + const id = records.chunks.byName[chunk.name]; + if (id === undefined) continue; + if (usedIds.has(id)) continue; + usedIds.add(id); + chunk.id = id; + } + } + if (records.chunks.bySource) { + for (const chunk of chunks) { + const sources = getChunkSources(chunk); + for (const source of sources) { + const id = records.chunks.bySource[source]; + if (id === undefined) continue; + if (usedIds.has(id)) continue; + usedIds.add(id); + chunk.id = id; + break; + } + } + } + if (Array.isArray(records.chunks.usedIds)) { + compilation.usedChunkIds = new Set(records.chunks.usedIds); + } + } + ); + }); + } +} +module.exports = RecordIdsPlugin; -- cgit v1.2.3