dop-stick
Version:
Source control tooling for versionable-upgradeable smart contracts
224 lines • 10.2 kB
JavaScript
;
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