@git.zone/cli 1.15.5 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/gitzone.cli.js +26 -2
- package/dist_ts/gitzone.logging.d.ts +3 -0
- package/dist_ts/gitzone.logging.js +20 -2
- package/dist_ts/mod_format/classes.baseformatter.d.ts +21 -0
- package/dist_ts/mod_format/classes.baseformatter.js +73 -0
- package/dist_ts/mod_format/classes.changecache.d.ts +25 -0
- package/dist_ts/mod_format/classes.changecache.js +105 -0
- package/dist_ts/mod_format/classes.dependency-analyzer.d.ts +13 -0
- package/dist_ts/mod_format/classes.dependency-analyzer.js +87 -0
- package/dist_ts/mod_format/classes.diffreporter.d.ts +13 -0
- package/dist_ts/mod_format/classes.diffreporter.js +94 -0
- package/dist_ts/mod_format/classes.formatcontext.d.ts +19 -0
- package/dist_ts/mod_format/classes.formatcontext.js +51 -0
- package/dist_ts/mod_format/classes.formatplanner.d.ts +13 -0
- package/dist_ts/mod_format/classes.formatplanner.js +164 -0
- package/dist_ts/mod_format/classes.formatstats.d.ts +40 -0
- package/dist_ts/mod_format/classes.formatstats.js +161 -0
- package/dist_ts/mod_format/classes.rollbackmanager.d.ts +21 -0
- package/dist_ts/mod_format/classes.rollbackmanager.js +170 -0
- package/dist_ts/mod_format/format.copy.d.ts +22 -0
- package/dist_ts/mod_format/format.copy.js +66 -2
- package/dist_ts/mod_format/format.packagejson.js +48 -2
- package/dist_ts/mod_format/formatters/cleanup.formatter.d.ts +7 -0
- package/dist_ts/mod_format/formatters/cleanup.formatter.js +33 -0
- package/dist_ts/mod_format/formatters/copy.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/copy.formatter.js +8 -0
- package/dist_ts/mod_format/formatters/gitignore.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/gitignore.formatter.js +8 -0
- package/dist_ts/mod_format/formatters/legacy.formatter.d.ts +11 -0
- package/dist_ts/mod_format/formatters/legacy.formatter.js +29 -0
- package/dist_ts/mod_format/formatters/license.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/license.formatter.js +8 -0
- package/dist_ts/mod_format/formatters/npmextra.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/npmextra.formatter.js +8 -0
- package/dist_ts/mod_format/formatters/packagejson.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/packagejson.formatter.js +8 -0
- package/dist_ts/mod_format/formatters/prettier.formatter.d.ts +9 -0
- package/dist_ts/mod_format/formatters/prettier.formatter.js +111 -0
- package/dist_ts/mod_format/formatters/readme.formatter.d.ts +7 -0
- package/dist_ts/mod_format/formatters/readme.formatter.js +19 -0
- package/dist_ts/mod_format/formatters/templates.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/templates.formatter.js +8 -0
- package/dist_ts/mod_format/formatters/tsconfig.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/tsconfig.formatter.js +8 -0
- package/dist_ts/mod_format/index.d.ts +14 -1
- package/dist_ts/mod_format/index.js +202 -28
- package/dist_ts/mod_format/interfaces.format.d.ts +43 -0
- package/dist_ts/mod_format/interfaces.format.js +2 -0
- package/dist_ts/mod_format/mod.plugins.d.ts +5 -1
- package/dist_ts/mod_format/mod.plugins.js +6 -2
- package/package.json +2 -1
- package/readme.hints.md +187 -0
- package/readme.plan.md +170 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/gitzone.cli.ts +29 -1
- package/ts/gitzone.logging.ts +23 -1
- package/ts/mod_format/classes.baseformatter.ts +93 -0
- package/ts/mod_format/classes.changecache.ts +144 -0
- package/ts/mod_format/classes.dependency-analyzer.ts +107 -0
- package/ts/mod_format/classes.diffreporter.ts +108 -0
- package/ts/mod_format/classes.formatcontext.ts +65 -0
- package/ts/mod_format/classes.formatplanner.ts +184 -0
- package/ts/mod_format/classes.formatstats.ts +209 -0
- package/ts/mod_format/classes.rollbackmanager.ts +218 -0
- package/ts/mod_format/format.copy.ts +77 -1
- package/ts/mod_format/format.packagejson.ts +50 -1
- package/ts/mod_format/formatters/cleanup.formatter.ts +39 -0
- package/ts/mod_format/formatters/copy.formatter.ts +8 -0
- package/ts/mod_format/formatters/gitignore.formatter.ts +8 -0
- package/ts/mod_format/formatters/legacy.formatter.ts +36 -0
- package/ts/mod_format/formatters/license.formatter.ts +8 -0
- package/ts/mod_format/formatters/npmextra.formatter.ts +8 -0
- package/ts/mod_format/formatters/packagejson.formatter.ts +8 -0
- package/ts/mod_format/formatters/prettier.formatter.ts +125 -0
- package/ts/mod_format/formatters/readme.formatter.ts +22 -0
- package/ts/mod_format/formatters/templates.formatter.ts +8 -0
- package/ts/mod_format/formatters/tsconfig.formatter.ts +8 -0
- package/ts/mod_format/index.ts +241 -33
- package/ts/mod_format/interfaces.format.ts +45 -0
- package/ts/mod_format/mod.plugins.ts +8 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FormatContext } from './classes.formatcontext.js';
|
|
2
|
+
import { BaseFormatter } from './classes.baseformatter.js';
|
|
3
|
+
import type { IFormatPlan } from './interfaces.format.js';
|
|
4
|
+
export declare class FormatPlanner {
|
|
5
|
+
private plannedChanges;
|
|
6
|
+
private dependencyAnalyzer;
|
|
7
|
+
private diffReporter;
|
|
8
|
+
planFormat(modules: BaseFormatter[]): Promise<IFormatPlan>;
|
|
9
|
+
executePlan(plan: IFormatPlan, modules: BaseFormatter[], context: FormatContext, parallel?: boolean): Promise<void>;
|
|
10
|
+
displayPlan(plan: IFormatPlan, detailed?: boolean): Promise<void>;
|
|
11
|
+
private getModuleIcon;
|
|
12
|
+
private getChangeIcon;
|
|
13
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import { FormatContext } from './classes.formatcontext.js';
|
|
3
|
+
import { BaseFormatter } from './classes.baseformatter.js';
|
|
4
|
+
import { logger } from '../gitzone.logging.js';
|
|
5
|
+
import { DependencyAnalyzer } from './classes.dependency-analyzer.js';
|
|
6
|
+
import { DiffReporter } from './classes.diffreporter.js';
|
|
7
|
+
export class FormatPlanner {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.plannedChanges = new Map();
|
|
10
|
+
this.dependencyAnalyzer = new DependencyAnalyzer();
|
|
11
|
+
this.diffReporter = new DiffReporter();
|
|
12
|
+
}
|
|
13
|
+
async planFormat(modules) {
|
|
14
|
+
const plan = {
|
|
15
|
+
summary: {
|
|
16
|
+
totalFiles: 0,
|
|
17
|
+
filesAdded: 0,
|
|
18
|
+
filesModified: 0,
|
|
19
|
+
filesRemoved: 0,
|
|
20
|
+
estimatedTime: 0
|
|
21
|
+
},
|
|
22
|
+
changes: [],
|
|
23
|
+
warnings: []
|
|
24
|
+
};
|
|
25
|
+
for (const module of modules) {
|
|
26
|
+
try {
|
|
27
|
+
const changes = await module.analyze();
|
|
28
|
+
this.plannedChanges.set(module.name, changes);
|
|
29
|
+
for (const change of changes) {
|
|
30
|
+
plan.changes.push(change);
|
|
31
|
+
// Update summary
|
|
32
|
+
switch (change.type) {
|
|
33
|
+
case 'create':
|
|
34
|
+
plan.summary.filesAdded++;
|
|
35
|
+
break;
|
|
36
|
+
case 'modify':
|
|
37
|
+
plan.summary.filesModified++;
|
|
38
|
+
break;
|
|
39
|
+
case 'delete':
|
|
40
|
+
plan.summary.filesRemoved++;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
plan.warnings.push({
|
|
47
|
+
level: 'error',
|
|
48
|
+
message: `Failed to analyze module ${module.name}: ${error.message}`,
|
|
49
|
+
module: module.name
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
plan.summary.totalFiles = plan.summary.filesAdded + plan.summary.filesModified + plan.summary.filesRemoved;
|
|
54
|
+
plan.summary.estimatedTime = plan.summary.totalFiles * 100; // 100ms per file estimate
|
|
55
|
+
return plan;
|
|
56
|
+
}
|
|
57
|
+
async executePlan(plan, modules, context, parallel = true) {
|
|
58
|
+
await context.beginOperation();
|
|
59
|
+
const startTime = Date.now();
|
|
60
|
+
try {
|
|
61
|
+
if (parallel) {
|
|
62
|
+
// Get execution groups based on dependencies
|
|
63
|
+
const executionGroups = this.dependencyAnalyzer.getExecutionGroups(modules);
|
|
64
|
+
logger.log('info', `Executing formatters in ${executionGroups.length} groups...`);
|
|
65
|
+
for (let i = 0; i < executionGroups.length; i++) {
|
|
66
|
+
const group = executionGroups[i];
|
|
67
|
+
logger.log('info', `Executing group ${i + 1}: ${group.map(m => m.name).join(', ')}`);
|
|
68
|
+
// Execute modules in this group in parallel
|
|
69
|
+
const promises = group.map(async (module) => {
|
|
70
|
+
const changes = this.plannedChanges.get(module.name) || [];
|
|
71
|
+
if (changes.length > 0) {
|
|
72
|
+
logger.log('info', `Executing ${module.name} formatter...`);
|
|
73
|
+
await module.execute(changes);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
await Promise.all(promises);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Sequential execution (original implementation)
|
|
81
|
+
for (const module of modules) {
|
|
82
|
+
const changes = this.plannedChanges.get(module.name) || [];
|
|
83
|
+
if (changes.length > 0) {
|
|
84
|
+
logger.log('info', `Executing ${module.name} formatter...`);
|
|
85
|
+
await module.execute(changes);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const endTime = Date.now();
|
|
90
|
+
const duration = endTime - startTime;
|
|
91
|
+
logger.log('info', `Format operations completed in ${duration}ms`);
|
|
92
|
+
await context.commitOperation();
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
await context.rollbackOperation();
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async displayPlan(plan, detailed = false) {
|
|
100
|
+
console.log('\nFormat Plan:');
|
|
101
|
+
console.log('━'.repeat(50));
|
|
102
|
+
console.log(`Summary: ${plan.summary.totalFiles} files will be changed`);
|
|
103
|
+
console.log(` • ${plan.summary.filesAdded} new files`);
|
|
104
|
+
console.log(` • ${plan.summary.filesModified} modified files`);
|
|
105
|
+
console.log(` • ${plan.summary.filesRemoved} deleted files`);
|
|
106
|
+
console.log('');
|
|
107
|
+
console.log('Changes by module:');
|
|
108
|
+
// Group changes by module
|
|
109
|
+
const changesByModule = new Map();
|
|
110
|
+
for (const change of plan.changes) {
|
|
111
|
+
const moduleChanges = changesByModule.get(change.module) || [];
|
|
112
|
+
moduleChanges.push(change);
|
|
113
|
+
changesByModule.set(change.module, moduleChanges);
|
|
114
|
+
}
|
|
115
|
+
for (const [module, changes] of changesByModule) {
|
|
116
|
+
console.log(`\n${this.getModuleIcon(module)} ${module} (${changes.length} ${changes.length === 1 ? 'file' : 'files'})`);
|
|
117
|
+
for (const change of changes) {
|
|
118
|
+
const icon = this.getChangeIcon(change.type);
|
|
119
|
+
console.log(` ${icon} ${change.path} - ${change.description}`);
|
|
120
|
+
// Show diff for modified files if detailed view is requested
|
|
121
|
+
if (detailed && change.type === 'modify') {
|
|
122
|
+
const diff = await this.diffReporter.generateDiffForChange(change);
|
|
123
|
+
if (diff) {
|
|
124
|
+
this.diffReporter.displayDiff(change.path, diff);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (plan.warnings.length > 0) {
|
|
130
|
+
console.log('\nWarnings:');
|
|
131
|
+
for (const warning of plan.warnings) {
|
|
132
|
+
const icon = warning.level === 'error' ? '❌' : '⚠️';
|
|
133
|
+
console.log(` ${icon} ${warning.message}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
console.log('\n' + '━'.repeat(50));
|
|
137
|
+
}
|
|
138
|
+
getModuleIcon(module) {
|
|
139
|
+
const icons = {
|
|
140
|
+
'packagejson': '📦',
|
|
141
|
+
'license': '📝',
|
|
142
|
+
'tsconfig': '🔧',
|
|
143
|
+
'cleanup': '🚮',
|
|
144
|
+
'gitignore': '🔒',
|
|
145
|
+
'prettier': '✨',
|
|
146
|
+
'readme': '📖',
|
|
147
|
+
'templates': '📄',
|
|
148
|
+
'npmextra': '⚙️',
|
|
149
|
+
'copy': '📋'
|
|
150
|
+
};
|
|
151
|
+
return icons[module] || '📁';
|
|
152
|
+
}
|
|
153
|
+
getChangeIcon(type) {
|
|
154
|
+
switch (type) {
|
|
155
|
+
case 'create':
|
|
156
|
+
return '✅';
|
|
157
|
+
case 'modify':
|
|
158
|
+
return '✏️';
|
|
159
|
+
case 'delete':
|
|
160
|
+
return '❌';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mb3JtYXRwbGFubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9jbGFzc2VzLmZvcm1hdHBsYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsTUFBTSxPQUFPLGFBQWE7SUFBMUI7UUFDVSxtQkFBYyxHQUFrQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzFELHVCQUFrQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUM5QyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUE0SzVDLENBQUM7SUExS0MsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUF3QjtRQUN2QyxNQUFNLElBQUksR0FBZ0I7WUFDeEIsT0FBTyxFQUFFO2dCQUNQLFVBQVUsRUFBRSxDQUFDO2dCQUNiLFVBQVUsRUFBRSxDQUFDO2dCQUNiLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixZQUFZLEVBQUUsQ0FBQztnQkFDZixhQUFhLEVBQUUsQ0FBQzthQUNqQjtZQUNELE9BQU8sRUFBRSxFQUFFO1lBQ1gsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDO1FBRUYsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElB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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export interface IModuleStats {
|
|
2
|
+
name: string;
|
|
3
|
+
filesProcessed: number;
|
|
4
|
+
executionTime: number;
|
|
5
|
+
errors: number;
|
|
6
|
+
successes: number;
|
|
7
|
+
filesCreated: number;
|
|
8
|
+
filesModified: number;
|
|
9
|
+
filesDeleted: number;
|
|
10
|
+
}
|
|
11
|
+
export interface IFormatStats {
|
|
12
|
+
totalExecutionTime: number;
|
|
13
|
+
startTime: number;
|
|
14
|
+
endTime: number;
|
|
15
|
+
moduleStats: Map<string, IModuleStats>;
|
|
16
|
+
overallStats: {
|
|
17
|
+
totalFiles: number;
|
|
18
|
+
totalCreated: number;
|
|
19
|
+
totalModified: number;
|
|
20
|
+
totalDeleted: number;
|
|
21
|
+
totalErrors: number;
|
|
22
|
+
cacheHits: number;
|
|
23
|
+
cacheMisses: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export declare class FormatStats {
|
|
27
|
+
private stats;
|
|
28
|
+
constructor();
|
|
29
|
+
startModule(moduleName: string): void;
|
|
30
|
+
moduleStartTime(moduleName: string): number;
|
|
31
|
+
endModule(moduleName: string, startTime: number): void;
|
|
32
|
+
recordFileOperation(moduleName: string, operation: 'create' | 'modify' | 'delete', success?: boolean): void;
|
|
33
|
+
recordCacheHit(): void;
|
|
34
|
+
recordCacheMiss(): void;
|
|
35
|
+
finish(): void;
|
|
36
|
+
displayStats(): void;
|
|
37
|
+
saveReport(outputPath: string): Promise<void>;
|
|
38
|
+
private formatDuration;
|
|
39
|
+
private getModuleIcon;
|
|
40
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import { logger } from '../gitzone.logging.js';
|
|
3
|
+
export class FormatStats {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.stats = {
|
|
6
|
+
totalExecutionTime: 0,
|
|
7
|
+
startTime: Date.now(),
|
|
8
|
+
endTime: 0,
|
|
9
|
+
moduleStats: new Map(),
|
|
10
|
+
overallStats: {
|
|
11
|
+
totalFiles: 0,
|
|
12
|
+
totalCreated: 0,
|
|
13
|
+
totalModified: 0,
|
|
14
|
+
totalDeleted: 0,
|
|
15
|
+
totalErrors: 0,
|
|
16
|
+
cacheHits: 0,
|
|
17
|
+
cacheMisses: 0
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
startModule(moduleName) {
|
|
22
|
+
this.stats.moduleStats.set(moduleName, {
|
|
23
|
+
name: moduleName,
|
|
24
|
+
filesProcessed: 0,
|
|
25
|
+
executionTime: 0,
|
|
26
|
+
errors: 0,
|
|
27
|
+
successes: 0,
|
|
28
|
+
filesCreated: 0,
|
|
29
|
+
filesModified: 0,
|
|
30
|
+
filesDeleted: 0
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
moduleStartTime(moduleName) {
|
|
34
|
+
return Date.now();
|
|
35
|
+
}
|
|
36
|
+
endModule(moduleName, startTime) {
|
|
37
|
+
const moduleStats = this.stats.moduleStats.get(moduleName);
|
|
38
|
+
if (moduleStats) {
|
|
39
|
+
moduleStats.executionTime = Date.now() - startTime;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
recordFileOperation(moduleName, operation, success = true) {
|
|
43
|
+
const moduleStats = this.stats.moduleStats.get(moduleName);
|
|
44
|
+
if (!moduleStats)
|
|
45
|
+
return;
|
|
46
|
+
moduleStats.filesProcessed++;
|
|
47
|
+
if (success) {
|
|
48
|
+
moduleStats.successes++;
|
|
49
|
+
this.stats.overallStats.totalFiles++;
|
|
50
|
+
switch (operation) {
|
|
51
|
+
case 'create':
|
|
52
|
+
moduleStats.filesCreated++;
|
|
53
|
+
this.stats.overallStats.totalCreated++;
|
|
54
|
+
break;
|
|
55
|
+
case 'modify':
|
|
56
|
+
moduleStats.filesModified++;
|
|
57
|
+
this.stats.overallStats.totalModified++;
|
|
58
|
+
break;
|
|
59
|
+
case 'delete':
|
|
60
|
+
moduleStats.filesDeleted++;
|
|
61
|
+
this.stats.overallStats.totalDeleted++;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
moduleStats.errors++;
|
|
67
|
+
this.stats.overallStats.totalErrors++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
recordCacheHit() {
|
|
71
|
+
this.stats.overallStats.cacheHits++;
|
|
72
|
+
}
|
|
73
|
+
recordCacheMiss() {
|
|
74
|
+
this.stats.overallStats.cacheMisses++;
|
|
75
|
+
}
|
|
76
|
+
finish() {
|
|
77
|
+
this.stats.endTime = Date.now();
|
|
78
|
+
this.stats.totalExecutionTime = this.stats.endTime - this.stats.startTime;
|
|
79
|
+
}
|
|
80
|
+
displayStats() {
|
|
81
|
+
console.log('\n📊 Format Operation Statistics:');
|
|
82
|
+
console.log('═'.repeat(50));
|
|
83
|
+
// Overall stats
|
|
84
|
+
console.log('\nOverall Summary:');
|
|
85
|
+
console.log(` Total Execution Time: ${this.formatDuration(this.stats.totalExecutionTime)}`);
|
|
86
|
+
console.log(` Files Processed: ${this.stats.overallStats.totalFiles}`);
|
|
87
|
+
console.log(` • Created: ${this.stats.overallStats.totalCreated}`);
|
|
88
|
+
console.log(` • Modified: ${this.stats.overallStats.totalModified}`);
|
|
89
|
+
console.log(` • Deleted: ${this.stats.overallStats.totalDeleted}`);
|
|
90
|
+
console.log(` Errors: ${this.stats.overallStats.totalErrors}`);
|
|
91
|
+
if (this.stats.overallStats.cacheHits > 0 || this.stats.overallStats.cacheMisses > 0) {
|
|
92
|
+
const cacheHitRate = this.stats.overallStats.cacheHits /
|
|
93
|
+
(this.stats.overallStats.cacheHits + this.stats.overallStats.cacheMisses) * 100;
|
|
94
|
+
console.log(` Cache Hit Rate: ${cacheHitRate.toFixed(1)}%`);
|
|
95
|
+
console.log(` • Hits: ${this.stats.overallStats.cacheHits}`);
|
|
96
|
+
console.log(` • Misses: ${this.stats.overallStats.cacheMisses}`);
|
|
97
|
+
}
|
|
98
|
+
// Module stats
|
|
99
|
+
console.log('\nModule Breakdown:');
|
|
100
|
+
console.log('─'.repeat(50));
|
|
101
|
+
const sortedModules = Array.from(this.stats.moduleStats.values())
|
|
102
|
+
.sort((a, b) => b.filesProcessed - a.filesProcessed);
|
|
103
|
+
for (const moduleStats of sortedModules) {
|
|
104
|
+
console.log(`\n${this.getModuleIcon(moduleStats.name)} ${moduleStats.name}:`);
|
|
105
|
+
console.log(` Execution Time: ${this.formatDuration(moduleStats.executionTime)}`);
|
|
106
|
+
console.log(` Files Processed: ${moduleStats.filesProcessed}`);
|
|
107
|
+
if (moduleStats.filesCreated > 0) {
|
|
108
|
+
console.log(` • Created: ${moduleStats.filesCreated}`);
|
|
109
|
+
}
|
|
110
|
+
if (moduleStats.filesModified > 0) {
|
|
111
|
+
console.log(` • Modified: ${moduleStats.filesModified}`);
|
|
112
|
+
}
|
|
113
|
+
if (moduleStats.filesDeleted > 0) {
|
|
114
|
+
console.log(` • Deleted: ${moduleStats.filesDeleted}`);
|
|
115
|
+
}
|
|
116
|
+
if (moduleStats.errors > 0) {
|
|
117
|
+
console.log(` ❌ Errors: ${moduleStats.errors}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
console.log('\n' + '═'.repeat(50));
|
|
121
|
+
}
|
|
122
|
+
async saveReport(outputPath) {
|
|
123
|
+
const report = {
|
|
124
|
+
timestamp: new Date().toISOString(),
|
|
125
|
+
executionTime: this.stats.totalExecutionTime,
|
|
126
|
+
overallStats: this.stats.overallStats,
|
|
127
|
+
moduleStats: Array.from(this.stats.moduleStats.values())
|
|
128
|
+
};
|
|
129
|
+
await plugins.smartfile.memory.toFs(JSON.stringify(report, null, 2), outputPath);
|
|
130
|
+
logger.log('info', `Statistics report saved to ${outputPath}`);
|
|
131
|
+
}
|
|
132
|
+
formatDuration(ms) {
|
|
133
|
+
if (ms < 1000) {
|
|
134
|
+
return `${ms}ms`;
|
|
135
|
+
}
|
|
136
|
+
else if (ms < 60000) {
|
|
137
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const minutes = Math.floor(ms / 60000);
|
|
141
|
+
const seconds = Math.floor((ms % 60000) / 1000);
|
|
142
|
+
return `${minutes}m ${seconds}s`;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
getModuleIcon(module) {
|
|
146
|
+
const icons = {
|
|
147
|
+
'packagejson': '📦',
|
|
148
|
+
'license': '📝',
|
|
149
|
+
'tsconfig': '🔧',
|
|
150
|
+
'cleanup': '🚮',
|
|
151
|
+
'gitignore': '🔒',
|
|
152
|
+
'prettier': '✨',
|
|
153
|
+
'readme': '📖',
|
|
154
|
+
'templates': '📄',
|
|
155
|
+
'npmextra': '⚙️',
|
|
156
|
+
'copy': '📋'
|
|
157
|
+
};
|
|
158
|
+
return icons[module] || '📁';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mb3JtYXRzdGF0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9mb3JtYXQvY2xhc3Nlcy5mb3JtYXRzdGF0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQTZCL0MsTUFBTSxPQUFPLFdBQVc7SUFHdEI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHO1lBQ1gsa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixPQUFPLEVBQUUsQ0FBQztZQUNWLFdBQVcsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUN0QixZQUFZLEVBQUU7Z0JBQ1osVUFBVSxFQUFFLENBQUM7Z0JBQ2IsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLFlBQVksRUFBRSxDQUFDO2dCQUNmLFdBQVcsRUFBRSxDQUFDO2dCQUNkLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFdBQVcsRUFBRSxDQUFDO2FBQ2Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVcsQ0FBQyxVQUFrQjtRQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3JDLElBQUksRUFBRSxVQUFVO1lBQ2hCLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsQ0FBQztZQUNmLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxVQUFrQixFQUFFLFNBQWlCO1FBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQWtCLEVBQUUsU0FBeUMsRUFBRSxVQUFtQixJQUFJO1FBQ3hHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFFekIsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRTdCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFckMsUUFBUSxTQUFTLEVBQUUsQ0FBQztnQkFDbEIsS0FBSyxRQUFRO29CQUNYLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3ZDLE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3hDLE1BQU07Z0JBQ1IsS0FBSyxRQUFRO29CQUNYLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3ZDLE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQzVFLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVCLGdCQUFnQjtRQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDeEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN0RSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFTO2dCQUNwRCxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDbEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsZUFBZTtRQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzlELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXZELEtBQUssTUFBTSxXQUFXLElBQUksYUFBYSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQzlFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUVoRSxJQUFJLFdBQVcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxJQUFJLFdBQVcsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxJQUFJLFdBQVcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFFRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUNqQyxNQUFNLE1BQU0sR0FBRztZQUNiLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0I7WUFDNUMsWUFBWSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWTtZQUNyQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUN6RCxDQUFDO1FBRUYsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDhCQUE4QixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFTyxjQUFjLENBQUMsRUFBVTtRQUMvQixJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUNkLE9BQU8sR0FBRyxFQUFFLElBQUksQ0FBQztRQUNuQixDQUFDO2FBQU0sSUFBSSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDdEIsT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUNoRCxPQUFPLEdBQUcsT0FBTyxLQUFLLE9BQU8sR0FBRyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQWM7UUFDbEMsTUFBTSxLQUFLLEdBQTJCO1lBQ3BDLGFBQWEsRUFBRSxJQUFJO1lBQ25CLFNBQVMsRUFBRSxJQUFJO1lBQ2YsVUFBVSxFQUFFLElBQUk7WUFDaEIsU0FBUyxFQUFFLElBQUk7WUFDZixXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsR0FBRztZQUNmLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsVUFBVSxFQUFFLElBQUk7WUFDaEIsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDO1FBQ0YsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDO0lBQy9CLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IFormatOperation } from './interfaces.format.js';
|
|
2
|
+
export declare class RollbackManager {
|
|
3
|
+
private backupDir;
|
|
4
|
+
private manifestPath;
|
|
5
|
+
constructor();
|
|
6
|
+
createOperation(): Promise<IFormatOperation>;
|
|
7
|
+
backupFile(filepath: string, operationId: string): Promise<void>;
|
|
8
|
+
rollback(operationId: string): Promise<void>;
|
|
9
|
+
markComplete(operationId: string): Promise<void>;
|
|
10
|
+
cleanOldBackups(retentionDays: number): Promise<void>;
|
|
11
|
+
verifyBackup(operationId: string): Promise<boolean>;
|
|
12
|
+
listBackups(): Promise<IFormatOperation[]>;
|
|
13
|
+
private ensureBackupDir;
|
|
14
|
+
private generateOperationId;
|
|
15
|
+
private getBackupPath;
|
|
16
|
+
private calculateChecksum;
|
|
17
|
+
private getManifest;
|
|
18
|
+
private saveManifest;
|
|
19
|
+
private getOperation;
|
|
20
|
+
private updateManifest;
|
|
21
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import * as paths from '../paths.js';
|
|
3
|
+
export class RollbackManager {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.backupDir = plugins.path.join(paths.cwd, '.nogit', 'gitzone-backups');
|
|
6
|
+
this.manifestPath = plugins.path.join(this.backupDir, 'manifest.json');
|
|
7
|
+
}
|
|
8
|
+
async createOperation() {
|
|
9
|
+
await this.ensureBackupDir();
|
|
10
|
+
const operation = {
|
|
11
|
+
id: this.generateOperationId(),
|
|
12
|
+
timestamp: Date.now(),
|
|
13
|
+
files: [],
|
|
14
|
+
status: 'pending'
|
|
15
|
+
};
|
|
16
|
+
await this.updateManifest(operation);
|
|
17
|
+
return operation;
|
|
18
|
+
}
|
|
19
|
+
async backupFile(filepath, operationId) {
|
|
20
|
+
const operation = await this.getOperation(operationId);
|
|
21
|
+
if (!operation) {
|
|
22
|
+
throw new Error(`Operation ${operationId} not found`);
|
|
23
|
+
}
|
|
24
|
+
const absolutePath = plugins.path.isAbsolute(filepath)
|
|
25
|
+
? filepath
|
|
26
|
+
: plugins.path.join(paths.cwd, filepath);
|
|
27
|
+
// Check if file exists
|
|
28
|
+
const exists = await plugins.smartfile.fs.fileExists(absolutePath);
|
|
29
|
+
if (!exists) {
|
|
30
|
+
// File doesn't exist yet (will be created), so we skip backup
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
// Read file content and metadata
|
|
34
|
+
const content = await plugins.smartfile.fs.toStringSync(absolutePath);
|
|
35
|
+
const stats = await plugins.smartfile.fs.stat(absolutePath);
|
|
36
|
+
const checksum = this.calculateChecksum(content);
|
|
37
|
+
// Create backup
|
|
38
|
+
const backupPath = this.getBackupPath(operationId, filepath);
|
|
39
|
+
await plugins.smartfile.fs.ensureDir(plugins.path.dirname(backupPath));
|
|
40
|
+
await plugins.smartfile.memory.toFs(content, backupPath);
|
|
41
|
+
// Update operation
|
|
42
|
+
operation.files.push({
|
|
43
|
+
path: filepath,
|
|
44
|
+
originalContent: content,
|
|
45
|
+
checksum,
|
|
46
|
+
permissions: stats.mode.toString(8)
|
|
47
|
+
});
|
|
48
|
+
await this.updateManifest(operation);
|
|
49
|
+
}
|
|
50
|
+
async rollback(operationId) {
|
|
51
|
+
const operation = await this.getOperation(operationId);
|
|
52
|
+
if (!operation) {
|
|
53
|
+
throw new Error(`Operation ${operationId} not found`);
|
|
54
|
+
}
|
|
55
|
+
if (operation.status === 'rolled-back') {
|
|
56
|
+
throw new Error(`Operation ${operationId} has already been rolled back`);
|
|
57
|
+
}
|
|
58
|
+
// Restore files in reverse order
|
|
59
|
+
for (let i = operation.files.length - 1; i >= 0; i--) {
|
|
60
|
+
const file = operation.files[i];
|
|
61
|
+
const absolutePath = plugins.path.isAbsolute(file.path)
|
|
62
|
+
? file.path
|
|
63
|
+
: plugins.path.join(paths.cwd, file.path);
|
|
64
|
+
// Verify backup integrity
|
|
65
|
+
const backupPath = this.getBackupPath(operationId, file.path);
|
|
66
|
+
const backupContent = await plugins.smartfile.fs.toStringSync(backupPath);
|
|
67
|
+
const backupChecksum = this.calculateChecksum(backupContent);
|
|
68
|
+
if (backupChecksum !== file.checksum) {
|
|
69
|
+
throw new Error(`Backup integrity check failed for ${file.path}`);
|
|
70
|
+
}
|
|
71
|
+
// Restore file
|
|
72
|
+
await plugins.smartfile.memory.toFs(file.originalContent, absolutePath);
|
|
73
|
+
// Restore permissions
|
|
74
|
+
const mode = parseInt(file.permissions, 8);
|
|
75
|
+
// Note: Permissions restoration may not work on all platforms
|
|
76
|
+
}
|
|
77
|
+
// Update operation status
|
|
78
|
+
operation.status = 'rolled-back';
|
|
79
|
+
await this.updateManifest(operation);
|
|
80
|
+
}
|
|
81
|
+
async markComplete(operationId) {
|
|
82
|
+
const operation = await this.getOperation(operationId);
|
|
83
|
+
if (!operation) {
|
|
84
|
+
throw new Error(`Operation ${operationId} not found`);
|
|
85
|
+
}
|
|
86
|
+
operation.status = 'completed';
|
|
87
|
+
await this.updateManifest(operation);
|
|
88
|
+
}
|
|
89
|
+
async cleanOldBackups(retentionDays) {
|
|
90
|
+
const manifest = await this.getManifest();
|
|
91
|
+
const cutoffTime = Date.now() - (retentionDays * 24 * 60 * 60 * 1000);
|
|
92
|
+
const operationsToDelete = manifest.operations.filter(op => op.timestamp < cutoffTime && op.status === 'completed');
|
|
93
|
+
for (const operation of operationsToDelete) {
|
|
94
|
+
// Remove backup files
|
|
95
|
+
const operationDir = plugins.path.join(this.backupDir, 'operations', operation.id);
|
|
96
|
+
await plugins.smartfile.fs.remove(operationDir);
|
|
97
|
+
// Remove from manifest
|
|
98
|
+
manifest.operations = manifest.operations.filter(op => op.id !== operation.id);
|
|
99
|
+
}
|
|
100
|
+
await this.saveManifest(manifest);
|
|
101
|
+
}
|
|
102
|
+
async verifyBackup(operationId) {
|
|
103
|
+
const operation = await this.getOperation(operationId);
|
|
104
|
+
if (!operation) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
for (const file of operation.files) {
|
|
108
|
+
const backupPath = this.getBackupPath(operationId, file.path);
|
|
109
|
+
const exists = await plugins.smartfile.fs.fileExists(backupPath);
|
|
110
|
+
if (!exists) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const content = await plugins.smartfile.fs.toStringSync(backupPath);
|
|
114
|
+
const checksum = this.calculateChecksum(content);
|
|
115
|
+
if (checksum !== file.checksum) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
async listBackups() {
|
|
122
|
+
const manifest = await this.getManifest();
|
|
123
|
+
return manifest.operations;
|
|
124
|
+
}
|
|
125
|
+
async ensureBackupDir() {
|
|
126
|
+
await plugins.smartfile.fs.ensureDir(this.backupDir);
|
|
127
|
+
await plugins.smartfile.fs.ensureDir(plugins.path.join(this.backupDir, 'operations'));
|
|
128
|
+
}
|
|
129
|
+
generateOperationId() {
|
|
130
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
131
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
132
|
+
return `${timestamp}-${random}`;
|
|
133
|
+
}
|
|
134
|
+
getBackupPath(operationId, filepath) {
|
|
135
|
+
const filename = plugins.path.basename(filepath);
|
|
136
|
+
const dir = plugins.path.dirname(filepath);
|
|
137
|
+
const safeDir = dir.replace(/[/\\]/g, '__');
|
|
138
|
+
return plugins.path.join(this.backupDir, 'operations', operationId, 'files', safeDir, `${filename}.backup`);
|
|
139
|
+
}
|
|
140
|
+
calculateChecksum(content) {
|
|
141
|
+
return plugins.crypto.createHash('sha256').update(content).digest('hex');
|
|
142
|
+
}
|
|
143
|
+
async getManifest() {
|
|
144
|
+
const exists = await plugins.smartfile.fs.fileExists(this.manifestPath);
|
|
145
|
+
if (!exists) {
|
|
146
|
+
return { operations: [] };
|
|
147
|
+
}
|
|
148
|
+
const content = await plugins.smartfile.fs.toStringSync(this.manifestPath);
|
|
149
|
+
return JSON.parse(content);
|
|
150
|
+
}
|
|
151
|
+
async saveManifest(manifest) {
|
|
152
|
+
await plugins.smartfile.memory.toFs(JSON.stringify(manifest, null, 2), this.manifestPath);
|
|
153
|
+
}
|
|
154
|
+
async getOperation(operationId) {
|
|
155
|
+
const manifest = await this.getManifest();
|
|
156
|
+
return manifest.operations.find(op => op.id === operationId) || null;
|
|
157
|
+
}
|
|
158
|
+
async updateManifest(operation) {
|
|
159
|
+
const manifest = await this.getManifest();
|
|
160
|
+
const existingIndex = manifest.operations.findIndex(op => op.id === operation.id);
|
|
161
|
+
if (existingIndex !== -1) {
|
|
162
|
+
manifest.operations[existingIndex] = operation;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
manifest.operations.push(operation);
|
|
166
|
+
}
|
|
167
|
+
await this.saveManifest(manifest);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb2xsYmFja21hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2NsYXNzZXMucm9sbGJhY2ttYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFHckMsTUFBTSxPQUFPLGVBQWU7SUFJMUI7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUU3QixNQUFNLFNBQVMsR0FBcUI7WUFDbEMsRUFBRSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM5QixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBZ0IsRUFBRSxXQUFtQjtRQUNwRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLFdB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
|
|
@@ -1,2 +1,24 @@
|
|
|
1
1
|
import type { Project } from '../classes.project.js';
|
|
2
2
|
export declare const run: (projectArg: Project) => Promise<void>;
|
|
3
|
+
/**
|
|
4
|
+
* Example npmextra.json configuration:
|
|
5
|
+
* {
|
|
6
|
+
* "gitzone": {
|
|
7
|
+
* "format": {
|
|
8
|
+
* "copy": {
|
|
9
|
+
* "patterns": [
|
|
10
|
+
* {
|
|
11
|
+
* "from": "src/assets/*",
|
|
12
|
+
* "to": "dist/assets/",
|
|
13
|
+
* "preservePath": true
|
|
14
|
+
* },
|
|
15
|
+
* {
|
|
16
|
+
* "from": "config/*.json",
|
|
17
|
+
* "to": "dist/"
|
|
18
|
+
* }
|
|
19
|
+
* ]
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
*/
|