2013-05-31 18:22:40 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
2017-02-21 22:13:09 +08:00
|
|
|
"use strict";
|
2015-04-04 08:09:49 +08:00
|
|
|
|
2017-04-05 21:38:15 +08:00
|
|
|
const identifierUtils = require("./util/identifier");
|
2017-03-23 18:41:17 +08:00
|
|
|
|
2017-04-03 19:13:18 +08:00
|
|
|
class RecordIdsPlugin {
|
2017-12-01 16:49:07 +08:00
|
|
|
constructor(options) {
|
|
|
|
this.options = options || {};
|
|
|
|
}
|
2017-03-23 18:41:17 +08:00
|
|
|
|
2017-02-21 22:13:09 +08:00
|
|
|
apply(compiler) {
|
2017-12-01 16:49:07 +08:00
|
|
|
const portableIds = this.options.portableIds;
|
2017-12-06 22:01:25 +08:00
|
|
|
compiler.hooks.compilation.tap("RecordIdsPlugin", (compilation) => {
|
|
|
|
compilation.hooks.recordModules.tap("RecordIdsPlugin", (modules, records) => {
|
2017-02-21 22:13:09 +08:00
|
|
|
if(!records.modules) records.modules = {};
|
|
|
|
if(!records.modules.byIdentifier) records.modules.byIdentifier = {};
|
|
|
|
if(!records.modules.usedIds) records.modules.usedIds = {};
|
2018-01-22 20:52:43 +08:00
|
|
|
for(const module of modules) {
|
2017-12-01 16:49:07 +08:00
|
|
|
const identifier = portableIds ? identifierUtils.makePathsRelative(compiler.context, module.identifier(), compilation.cache) : module.identifier();
|
2017-02-21 22:13:09 +08:00
|
|
|
records.modules.byIdentifier[identifier] = module.id;
|
|
|
|
records.modules.usedIds[module.id] = module.id;
|
2018-01-22 20:52:43 +08:00
|
|
|
}
|
2017-02-21 22:13:09 +08:00
|
|
|
});
|
2017-12-06 22:01:25 +08:00
|
|
|
compilation.hooks.reviveModules.tap("RecordIdsPlugin", (modules, records) => {
|
2017-02-21 22:13:09 +08:00
|
|
|
if(!records.modules) return;
|
|
|
|
if(records.modules.byIdentifier) {
|
2018-01-05 14:41:09 +08:00
|
|
|
const usedIds = new Set();
|
2018-01-22 20:52:43 +08:00
|
|
|
for(const module of modules) {
|
|
|
|
if(module.id !== null) continue;
|
2017-12-01 16:49:07 +08:00
|
|
|
const identifier = portableIds ? identifierUtils.makePathsRelative(compiler.context, module.identifier(), compilation.cache) : module.identifier();
|
2017-02-21 22:13:09 +08:00
|
|
|
const id = records.modules.byIdentifier[identifier];
|
2018-01-22 20:52:43 +08:00
|
|
|
if(id === undefined) continue;
|
|
|
|
if(usedIds.has(id)) continue;
|
2018-01-05 14:41:09 +08:00
|
|
|
usedIds.add(id);
|
2017-02-21 22:13:09 +08:00
|
|
|
module.id = id;
|
2018-01-22 20:52:43 +08:00
|
|
|
}
|
2017-02-21 22:13:09 +08:00
|
|
|
}
|
2018-01-20 00:06:59 +08:00
|
|
|
if(Array.isArray(records.modules.usedIds))
|
|
|
|
compilation.usedModuleIds = new Set(records.modules.usedIds);
|
2017-02-21 22:13:09 +08:00
|
|
|
});
|
2015-04-24 05:55:50 +08:00
|
|
|
|
2018-01-20 00:06:59 +08:00
|
|
|
const getModuleIdentifier = module => {
|
|
|
|
if(portableIds)
|
|
|
|
return identifierUtils.makePathsRelative(compiler.context, module.identifier(), compilation.cache);
|
|
|
|
return module.identifier();
|
|
|
|
};
|
|
|
|
|
|
|
|
const getChunkSources = chunk => {
|
|
|
|
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)}`);
|
|
|
|
}
|
|
|
|
}
|
2017-02-21 22:13:09 +08:00
|
|
|
}
|
2018-01-20 00:06:59 +08:00
|
|
|
return sources;
|
2017-11-08 18:32:05 +08:00
|
|
|
};
|
|
|
|
|
2017-12-06 22:01:25 +08:00
|
|
|
compilation.hooks.recordChunks.tap("RecordIdsPlugin", (chunks, records) => {
|
2017-02-21 22:13:09 +08:00
|
|
|
if(!records.chunks) records.chunks = {};
|
|
|
|
if(!records.chunks.byName) records.chunks.byName = {};
|
2018-01-20 00:06:59 +08:00
|
|
|
if(!records.chunks.bySource) records.chunks.bySource = {};
|
|
|
|
const usedIds = new Set();
|
2018-01-22 20:52:43 +08:00
|
|
|
for(const chunk of chunks) {
|
2017-02-21 22:13:09 +08:00
|
|
|
const name = chunk.name;
|
|
|
|
if(name) records.chunks.byName[name] = chunk.id;
|
2018-01-20 00:06:59 +08:00
|
|
|
const sources = getChunkSources(chunk);
|
|
|
|
for(const source of sources) {
|
|
|
|
records.chunks.bySource[source] = chunk.id;
|
|
|
|
}
|
|
|
|
usedIds.add(chunk.id);
|
2018-01-22 20:52:43 +08:00
|
|
|
}
|
2018-01-20 00:06:59 +08:00
|
|
|
records.chunks.usedIds = Array.from(usedIds);
|
2013-05-31 18:22:40 +08:00
|
|
|
});
|
2017-12-06 22:01:25 +08:00
|
|
|
compilation.hooks.reviveChunks.tap("RecordIdsPlugin", (chunks, records) => {
|
2017-02-21 22:13:09 +08:00
|
|
|
if(!records.chunks) return;
|
2018-01-05 14:41:09 +08:00
|
|
|
const usedIds = new Set();
|
2017-02-21 22:13:09 +08:00
|
|
|
if(records.chunks.byName) {
|
2018-01-22 20:52:43 +08:00
|
|
|
for(const chunk of chunks) {
|
|
|
|
if(chunk.id !== null) continue;
|
|
|
|
if(!chunk.name) continue;
|
2017-02-21 22:13:09 +08:00
|
|
|
const id = records.chunks.byName[chunk.name];
|
2018-01-22 20:52:43 +08:00
|
|
|
if(id === undefined) continue;
|
|
|
|
if(usedIds.has(id)) continue;
|
2018-01-05 14:41:09 +08:00
|
|
|
usedIds.add(id);
|
2017-02-21 22:13:09 +08:00
|
|
|
chunk.id = id;
|
2018-01-22 20:52:43 +08:00
|
|
|
}
|
2017-02-21 22:13:09 +08:00
|
|
|
}
|
2018-01-20 00:06:59 +08:00
|
|
|
if(records.chunks.bySource) {
|
2018-01-22 20:52:43 +08:00
|
|
|
for(const chunk of chunks) {
|
2018-01-20 00:06:59 +08:00
|
|
|
const sources = getChunkSources(chunk);
|
|
|
|
for(const source of sources) {
|
|
|
|
const id = records.chunks.bySource[source];
|
|
|
|
if(id === undefined) continue;
|
|
|
|
if(usedIds[id]) continue;
|
|
|
|
usedIds[id] = true;
|
|
|
|
chunk.id = id;
|
|
|
|
break;
|
|
|
|
}
|
2018-01-22 20:52:43 +08:00
|
|
|
}
|
2017-02-21 22:13:09 +08:00
|
|
|
}
|
2018-01-20 00:06:59 +08:00
|
|
|
if(Array.isArray(records.chunks.usedIds))
|
|
|
|
compilation.usedChunkIds = new Set(records.chunks.usedIds);
|
2017-02-21 22:13:09 +08:00
|
|
|
});
|
2013-05-31 18:22:40 +08:00
|
|
|
});
|
2017-02-21 22:13:09 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = RecordIdsPlugin;
|