Skip to content

Commit

Permalink
use flags to show different parts of the progress message
Browse files Browse the repository at this point in the history
refactor activeModules to Set for performance reasons
  • Loading branch information
sokra committed Nov 4, 2018
1 parent 8c5e74f commit 64e3826
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 41 deletions.
12 changes: 12 additions & 0 deletions declarations/plugins/ProgressPlugin.d.ts
Expand Up @@ -15,10 +15,22 @@ export type HandlerFunction = ((
) => void);

export interface ProgressPluginOptions {
/**
* Show active modules count and one active module in progress message
*/
activeModules?: boolean;
/**
* Show entries count in progress message
*/
entries?: boolean;
/**
* Function that executes for every progress step
*/
handler?: HandlerFunction;
/**
* Show modules count in progress message
*/
modules?: boolean;
/**
* Minimum modules count to start with. Only for mode=modules. Default: 500
*/
Expand Down
3 changes: 0 additions & 3 deletions lib/Compilation.js
Expand Up @@ -226,8 +226,6 @@ class Compilation extends Tapable {

/** @type {SyncHook<Dependency, string>} */
addEntry: new SyncHook(["entry", "name"]),
/** @type {SyncHook<Dependency, string>} */
buildEntry: new SyncHook(["entry", "name"]),
/** @type {SyncHook<Dependency, string, Error>} */
failedEntry: new SyncHook(["entry", "name", "error"]),
/** @type {SyncHook<Dependency, string, Module>} */
Expand Down Expand Up @@ -1075,7 +1073,6 @@ class Compilation extends Tapable {
context,
entry,
module => {
this.hooks.buildEntry.call(entry, name);
this.entries.push(module);
},
(err, module) => {
Expand Down
92 changes: 54 additions & 38 deletions lib/ProgressPlugin.js
Expand Up @@ -89,11 +89,17 @@ class ProgressPlugin {
this.profile = options.profile;
this.handler = options.handler;
this.modulesCount = options.modulesCount;
this.showEntries = options.entries;
this.showModules = options.modules;
this.showActiveModules = options.activeModules;
}

apply(compiler) {
const { modulesCount } = this;
const handler = this.handler || createDefaultHandler(this.profile);
const showEntries = this.showEntries;
const showModules = this.showModules;
const showActiveModules = this.showActiveModules;
if (compiler.compilers) {
const states = new Array(compiler.compilers.length);
compiler.compilers.forEach((compiler, idx) => {
Expand All @@ -112,62 +118,71 @@ class ProgressPlugin {
let lastModulesCount = 0;
let lastEntriesCount = 0;
let moduleCount = modulesCount;
let entriesCount = 0;
let entriesCount = 1;
let doneModules = 0;
let doneEntries = 0;
const activeModules = [];
const activeEntries = [];
const activeModules = new Set();
let lastActiveModule = "";

const update = () => {
const percentByModules =
doneModules / Math.max(lastModulesCount, moduleCount);
const percentByEntries =
doneEntries / Math.max(lastEntriesCount, entriesCount);

handler(
0.1 + Math.min(percentByModules, percentByEntries) * 0.6,
"building",
`${doneEntries}/${entriesCount} entries`,
`${doneModules}/${moduleCount} modules`,
`${activeModules.length} active`,
activeModules[activeModules.length - 1]
);
const items = [
0.1 + Math.max(percentByModules, percentByEntries) * 0.6,
"building"
];
if (showEntries) {
items.push(`${doneEntries}/${entriesCount} entries`);
}
if (showModules) {
items.push(`${doneModules}/${moduleCount} modules`);
}
if (showActiveModules) {
items.push(`${activeModules.size} active`);
items.push(lastActiveModule);
}
handler(...items);
};

const moduleAdd = () => {
const moduleAdd = module => {
moduleCount++;
update();
};
const entryAdd = () => {
entriesCount++;
update();
};

const moduleBuild = module => {
const ident = module.identifier();
if (ident) {
activeModules.push(ident);
if (showActiveModules) {
const ident = module.identifier();
if (ident) {
activeModules.add(ident);
lastActiveModule = ident;
}
}
update();
};
const entryBuild = (entry, name) => {
activeEntries.push(name);

const entryAdd = (entry, name) => {
entriesCount++;
update();
};

const moduleDone = module => {
doneModules++;
const ident = module.identifier();
if (ident) {
const idx = activeModules.indexOf(ident);
if (idx >= 0) activeModules.splice(idx, 1);
if (showActiveModules) {
const ident = module.identifier();
if (ident) {
activeModules.delete(ident);
if (lastActiveModule === ident) {
lastActiveModule = "";
for (const m of activeModules) {
lastActiveModule = m;
}
}
}
}
update();
};

const entryDone = (entry, name) => {
doneEntries++;
const idx = activeEntries.indexOf(name);
if (idx >= 0) activeEntries.splice(idx, 1);
update();
};

Expand All @@ -180,14 +195,11 @@ class ProgressPlugin {
handler(0, "compiling");

compilation.hooks.buildModule.tap("ProgressPlugin", moduleAdd);
compilation.hooks.addEntry.tap("ProgressPlugin", entryAdd);

compilation.hooks.buildModule.tap("ProgressPlugin", moduleBuild);
compilation.hooks.buildEntry.tap("ProgressPlugin", entryBuild);

compilation.hooks.failedModule.tap("ProgressPlugin", moduleDone);
compilation.hooks.failedEntry.tap("ProgressPlugin", entryDone);
compilation.hooks.succeedModule.tap("ProgressPlugin", moduleDone);

compilation.hooks.addEntry.tap("ProgressPlugin", entryAdd);
compilation.hooks.failedEntry.tap("ProgressPlugin", entryDone);
compilation.hooks.succeedEntry.tap("ProgressPlugin", entryDone);

const hooks = {
Expand Down Expand Up @@ -302,7 +314,11 @@ class ProgressPlugin {

ProgressPlugin.defaultOptions = {
profile: false,
modulesCount: 500
modulesCount: 500,
modules: true,
activeModules: true,
// TODO webpack 5 default this to true
entries: false
};

module.exports = ProgressPlugin;
12 changes: 12 additions & 0 deletions schemas/plugins/ProgressPlugin.json
Expand Up @@ -13,6 +13,14 @@
"type": "object",
"additionalProperties": false,
"properties": {
"activeModules": {
"description": "Show active modules count and one active module in progress message",
"type": "boolean"
},
"entries": {
"description": "Show entries count in progress message",
"type": "boolean"
},
"handler": {
"description": "Function that executes for every progress step",
"anyOf": [
Expand All @@ -21,6 +29,10 @@
}
]
},
"modules": {
"description": "Show modules count in progress message",
"type": "boolean"
},
"modulesCount": {
"description": "Minimum modules count to start with. Only for mode=modules. Default: 500",
"type": "number"
Expand Down

0 comments on commit 64e3826

Please sign in to comment.