diff --git a/package.json b/package.json index 472dcb1f..ba08746b 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "multimatch": "5.0.0", "opencollective-postinstall": "2.0.3", "process": "0.11.10", + "progress": "^2.0.3", "reflect-metadata": "0.1.13", "source-map-support": "0.5.21", "string-template": "1.0.0", @@ -61,6 +62,7 @@ "@types/mocha": "10.0.1", "@types/multimatch": "4.0.0", "@types/node": "18.13.0", + "@types/progress": "^2.0.7", "@types/rimraf": "3.0.2", "@types/sinon": "10.0.13", "@types/string-template": "1.0.2", diff --git a/src/node-transformers/NodeTransformersRunner.ts b/src/node-transformers/NodeTransformersRunner.ts index 8e423bae..59d2acc6 100644 --- a/src/node-transformers/NodeTransformersRunner.ts +++ b/src/node-transformers/NodeTransformersRunner.ts @@ -23,6 +23,8 @@ import { VisitorDirection } from '../enums/node-transformers/VisitorDirection'; import { NodeGuards } from '../node/NodeGuards'; import { NodeMetadata } from '../node/NodeMetadata'; +import ProgressBar from 'progress'; + @injectable() export class NodeTransformersRunner implements INodeTransformersRunner { /** @@ -74,8 +76,9 @@ export class NodeTransformersRunner implements INodeTransformersRunner { this.buildNormalizedNodeTransformers(nodeTransformerNames, nodeTransformationStage); const nodeTransformerNamesGroups: NodeTransformer[][] = this.nodeTransformerNamesGroupsBuilder.build(normalizedNodeTransformers); + const nodeTransformerEntries = nodeTransformerNamesGroups.entries(); - for (const nodeTransformerNamesGroup of nodeTransformerNamesGroups) { + for (const [i, nodeTransformerNamesGroup] of nodeTransformerEntries) { const enterVisitors: IVisitor[] = []; const leaveVisitors: IVisitor[] = []; @@ -100,10 +103,37 @@ export class NodeTransformersRunner implements INodeTransformersRunner { continue; } + let totalNodes = 0; + estraverse.traverse(astTree, {enter: () => totalNodes++}); + const nodeBar = new ProgressBar( + `Node Progress ${i + 1}/${nodeTransformerNamesGroups.length} [:bar] :current/:total (:percent) :etas`, + { + total: totalNodes, + width: 40, + clear: true + } + ); + estraverse.replace(astTree, { - enter: this.mergeVisitorsForDirection(enterVisitors, VisitorDirection.Enter), - leave: this.mergeVisitorsForDirection(leaveVisitors, VisitorDirection.Leave) + enter: (node, parentNode) => { + // Ensure that the progress bar is not at 100% after the last node + if (nodeBar.curr >= totalNodes) { + totalNodes++; + nodeBar.total = totalNodes; + nodeBar.complete = false; + nodeBar.update(nodeBar.curr / nodeBar.total); + } else { + nodeBar.tick(); + } + + return this.mergeVisitorsForDirection(enterVisitors, VisitorDirection.Enter)(node, parentNode); + }, + leave: (node, parentNode) => this.mergeVisitorsForDirection(leaveVisitors, VisitorDirection.Leave)(node, parentNode) }); + + // Ensure that the progress bar is at 100% after the last node + nodeBar.update(1); + nodeBar.terminate(); } return astTree;