UNPKG

dop-stick

Version:

Source control tooling for versionable-upgradeable smart contracts

224 lines 10.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FinalSummaryAdapter = void 0; const terminal_1 = require("../core/terminal"); const box_1 = require("../core/box"); const diamond_1 = require("../../../types/diamond"); class FinalSummaryAdapter { constructor(mode) { this.mode = mode; this.moduleMap = null; } displayFinalSummary(finalCuts) { this.moduleMap = this.prepareSummaryData(finalCuts); // Display the summary this.displayHeader(); this.displayModuleSummaries(this.moduleMap); this.displayTotals(this.moduleMap); } // Public method to access module details later if needed displayModuleDetailsById(moduleIndex) { if (!this.moduleMap) { terminal_1.Terminal.write('No summary data available'); return false; } const moduleSummary = Array.from(this.moduleMap.values())[moduleIndex - 1]; if (!moduleSummary) { terminal_1.Terminal.write('Invalid module number'); return false; } this.displayModuleDetails(moduleSummary); return true; } // Public method to list available modules listAvailableModules() { if (!this.moduleMap) { terminal_1.Terminal.write('No summary data available'); return; } terminal_1.Terminal.write('\nAvailable modules:'); Array.from(this.moduleMap.entries()).forEach(([_, summary], index) => { terminal_1.Terminal.write(`${index + 1}. ${summary.moduleName}`); }); } prepareSummaryData(finalCuts) { const moduleMap = new Map(); finalCuts.forEach(cut => { var _a, _b; let moduleSummary = moduleMap.get(cut.moduleName); if (!moduleSummary) { moduleSummary = { moduleName: cut.moduleName, totalFunctions: 0, discardedFunctions: [], functionsByAction: new Map() }; moduleMap.set(cut.moduleName, moduleSummary); } // Handle discarded functions if present if ((_a = cut.removedFunctions) === null || _a === void 0 ? void 0 : _a.length) { moduleSummary.discardedFunctions.push(...cut.removedFunctions); return; // Skip processing this cut as it's just for tracking discarded functions } // Create a unique key for this action group const groupKey = cut.changed ? `${cut.action}-changed-${cut.originalAction}` : `${cut.action}-unchanged`; // Get or create action group let actionGroup = moduleSummary.functionsByAction.get(groupKey); if (!actionGroup) { actionGroup = { signatures: [], selectors: [], changed: cut.changed || false, originalAction: cut.originalAction }; moduleSummary.functionsByAction.set(groupKey, actionGroup); } // Add function to group (_b = cut.functionSignatures) === null || _b === void 0 ? void 0 : _b.forEach((signature, index) => { actionGroup.signatures.push(signature); actionGroup.selectors.push(cut.functionSelectors[index]); }); // Update total functions count moduleSummary.totalFunctions = Array.from(moduleSummary.functionsByAction.values()) .reduce((total, group) => total + group.signatures.length, 0); }); return moduleMap; } displayHeader() { terminal_1.Terminal.writeLine('\n✨ FINAL SUMMARY'); terminal_1.Terminal.writeLine('────────────'); } displayModuleSummaries(moduleMap) { let moduleIndex = 1; moduleMap.forEach(summary => { terminal_1.Terminal.writeLine(''); terminal_1.Terminal.writeLine(`[${moduleIndex}/${moduleMap.size}] ${summary.moduleName}`); terminal_1.Terminal.writeLine(`\x1b[2m• ${summary.totalFunctions} functions processed\x1b[0m`); // Show normal action groups (ADD/REPLACE/REMOVE) const actionGroups = Array.from(summary.functionsByAction.entries()) .sort((a, b) => { const [aAction] = a[0].split('-'); const [bAction] = b[0].split('-'); return Number(aAction) - Number(bAction); }); actionGroups.forEach(([key, group]) => { const [action] = key.split('-'); const count = group.signatures.length; const actionName = this.getActionName(Number(action)); const actionText = `${actionName} ${count === 1 ? 'action' : 'actions'}`; if (group.changed) { const originalActionName = this.getActionName(group.originalAction); terminal_1.Terminal.writeLine(` → ${count} ${actionText} \x1b[32m(changed from ${originalActionName.toUpperCase()})\x1b[0m`); } else { terminal_1.Terminal.writeLine(` → ${count} ${actionText} (unchanged)`); } }); // Show discarded functions count if any (in red) if (summary.discardedFunctions.length > 0) { terminal_1.Terminal.writeLine(` \x1b[31m• ${summary.discardedFunctions.length} functions discarded\x1b[0m`); } terminal_1.Terminal.writeLine(`Use 'show ${moduleIndex}' for details`); moduleIndex++; }); } displayTotals(moduleMap) { let totalFunctions = 0; let totalDiscarded = 0; let totalChanged = 0; let totalUnchanged = 0; moduleMap.forEach(summary => { totalFunctions += summary.totalFunctions; totalDiscarded += summary.discardedFunctions.length; summary.functionsByAction.forEach(data => { if (data.changed) totalChanged += data.signatures.length; else totalUnchanged += data.signatures.length; }); }); terminal_1.Terminal.writeLine(''); terminal_1.Terminal.writeLine(''); terminal_1.Terminal.writeLine('TOTAL CHANGES'); terminal_1.Terminal.writeLine('────────────'); terminal_1.Terminal.writeLine(`• ${totalFunctions} functions across ${moduleMap.size} modules`); terminal_1.Terminal.writeLine(`• ${totalDiscarded} functions discarded from upgrade`); terminal_1.Terminal.writeLine(`• ${totalChanged} actions changed`); terminal_1.Terminal.writeLine(`• ${totalUnchanged} actions unchanged`); terminal_1.Terminal.writeLine(''); } displayModuleDetails(summary) { new box_1.Box(`${summary.moduleName} Details`, { style: 'double', color: 'muted', padding: 1, margin: 0, align: 'left' }).render(); // Show module overview terminal_1.Terminal.writeLine(`\x1b[2m• ${summary.totalFunctions} functions processed\x1b[0m`); terminal_1.Terminal.writeLine(''); // Group and sort actions for consistent display const actionGroups = Array.from(summary.functionsByAction.entries()) .sort((a, b) => { const [aAction] = a[0].split('-'); const [bAction] = b[0].split('-'); return Number(aAction) - Number(bAction); }); // Display actions by type with their functions actionGroups.forEach(([key, group]) => { const [action] = key.split('-'); const actionName = this.getActionName(Number(action)); const count = group.signatures.length; // Header for action group if (group.changed) { const originalActionName = this.getActionName(group.originalAction); terminal_1.Terminal.writeLine(`\x1b[1m${actionName} ACTIONS (${count}) \x1b[32m(changed from ${originalActionName})\x1b[0m`); } else { terminal_1.Terminal.writeLine(`\x1b[1m${actionName} ACTIONS (${count}) (unchanged)\x1b[0m`); } // Display functions in this group group.signatures.forEach((signature, index) => { terminal_1.Terminal.writeLine(` • ${signature}`); terminal_1.Terminal.writeLine(` \x1b[2m→ Selector: ${group.selectors[index]}\x1b[0m`); }); terminal_1.Terminal.writeLine(''); }); // Show discarded functions if any if (summary.discardedFunctions.length > 0) { terminal_1.Terminal.writeLine(`\x1b[31m🔴 DISCARDED FUNCTIONS (${summary.discardedFunctions.length})\x1b[0m`); // Group discarded functions by reason const groupedDiscarded = summary.discardedFunctions.reduce((acc, fn) => { if (!acc[fn.reason]) acc[fn.reason] = []; acc[fn.reason].push(fn.signature); return acc; }, {}); // Display grouped discarded functions Object.entries(groupedDiscarded).forEach(([reason, signatures]) => { terminal_1.Terminal.writeLine(`\n Reason: ${reason.toUpperCase()}`); signatures.forEach(signature => { terminal_1.Terminal.writeLine(` • ${signature}`); }); }); } terminal_1.Terminal.writeLine(''); } getActionName(action) { switch (action) { case diamond_1.DiamondCutAction.Add: return 'ADD'; case diamond_1.DiamondCutAction.Replace: return 'REPLACE'; case diamond_1.DiamondCutAction.Remove: return 'REMOVE'; default: return 'UNKNOWN'; } } } exports.FinalSummaryAdapter = FinalSummaryAdapter; //# sourceMappingURL=finalSummaryAdapter.js.map