@git.zone/cli 1.15.4 → 1.16.0
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 +4 -3
- 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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.16.0',
|
|
7
7
|
description: 'A comprehensive CLI tool for enhancing and managing local development workflows with gitzone utilities, focusing on project setup, version control, code formatting, and template management.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxlQUFlO0lBQ3JCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLFdBQVcsRUFBRSwrTEFBK0w7Q0FDN00sQ0FBQSJ9
|
package/dist_ts/gitzone.cli.js
CHANGED
|
@@ -47,7 +47,31 @@ export let run = async () => {
|
|
|
47
47
|
gitzoneSmartcli.addCommand('format').subscribe(async (argvArg) => {
|
|
48
48
|
const config = GitzoneConfig.fromCwd();
|
|
49
49
|
const modFormat = await import('./mod_format/index.js');
|
|
50
|
-
|
|
50
|
+
// Handle rollback commands
|
|
51
|
+
if (argvArg.rollback) {
|
|
52
|
+
await modFormat.handleRollback(argvArg.rollback);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (argvArg['list-backups']) {
|
|
56
|
+
await modFormat.handleListBackups();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (argvArg['clean-backups']) {
|
|
60
|
+
await modFormat.handleCleanBackups();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Handle format with options
|
|
64
|
+
await modFormat.run({
|
|
65
|
+
dryRun: argvArg['dry-run'],
|
|
66
|
+
yes: argvArg.yes,
|
|
67
|
+
planOnly: argvArg['plan-only'],
|
|
68
|
+
savePlan: argvArg['save-plan'],
|
|
69
|
+
fromPlan: argvArg['from-plan'],
|
|
70
|
+
detailed: argvArg.detailed,
|
|
71
|
+
interactive: argvArg.interactive !== false,
|
|
72
|
+
parallel: argvArg.parallel !== false,
|
|
73
|
+
verbose: argvArg.verbose
|
|
74
|
+
});
|
|
51
75
|
});
|
|
52
76
|
/**
|
|
53
77
|
* run meta commands
|
|
@@ -86,4 +110,4 @@ export let run = async () => {
|
|
|
86
110
|
gitzoneSmartcli.startParse();
|
|
87
111
|
return await done.promise;
|
|
88
112
|
};
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0em9uZS5jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9naXR6b25lLmNsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssS0FBSyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBRXhELE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxLQUFLLElBQUksRUFBRTtJQUMxQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTFDLGtCQUFrQjtJQUNsQixNQUFNLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxRSxvQkFBb0I7SUFDcEIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEUsTUFBTSxtQkFBbUIsQ0FBQyxLQUFLLENBQzdCLFNBQVMsRUFDVCxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFDdkIsaURBQWlELENBQ2xELENBQUM7SUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDN0QsZUFBZSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXBELGdDQUFnQztJQUVoQzs7T0FFRztJQUNILGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQzVELE1BQU0sV0FBVyxHQUFHLE1BQU0sTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFD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
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
export declare const logger: plugins.smartlog.Smartlog;
|
|
3
|
+
export declare const setVerboseMode: (verbose: boolean) => void;
|
|
4
|
+
export declare const isVerboseMode: () => boolean;
|
|
5
|
+
export declare const logVerbose: (message: string) => void;
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import { commitinfo } from '@push.rocks/commitinfo';
|
|
2
2
|
import * as plugins from './plugins.js';
|
|
3
|
+
// Create logger instance
|
|
3
4
|
export const logger = plugins.smartlog.Smartlog.createForCommitinfo(commitinfo);
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
// Add console destination
|
|
6
|
+
const consoleDestination = new plugins.smartlogDestinationLocal.DestinationLocal();
|
|
7
|
+
logger.addLogDestination(consoleDestination);
|
|
8
|
+
// Verbose logging helper
|
|
9
|
+
let verboseMode = false;
|
|
10
|
+
export const setVerboseMode = (verbose) => {
|
|
11
|
+
verboseMode = verbose;
|
|
12
|
+
logger.log('info', `Verbose mode ${verbose ? 'enabled' : 'disabled'}`);
|
|
13
|
+
};
|
|
14
|
+
export const isVerboseMode = () => {
|
|
15
|
+
return verboseMode;
|
|
16
|
+
};
|
|
17
|
+
// Custom log method with verbose support
|
|
18
|
+
export const logVerbose = (message) => {
|
|
19
|
+
if (verboseMode) {
|
|
20
|
+
logger.log('info', `[VERBOSE] ${message}`);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0em9uZS5sb2dnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0em9uZS5sb2dnaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyx5QkFBeUI7QUFDekIsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBRWhGLDBCQUEwQjtBQUMxQixNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxDQUFDLHdCQUF3QixDQUFDLGdCQUFnQixFQUFFLENBQUM7QUFDbkYsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFN0MseUJBQXlCO0FBQ3pCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztBQUV4QixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxPQUFnQixFQUFRLEVBQUU7SUFDdkQsV0FBVyxHQUFHLE9BQU8sQ0FBQztJQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQVksRUFBRTtJQUN6QyxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFRix5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBZSxFQUFRLEVBQUU7SUFDbEQsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztBQUNILENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FormatContext } from './classes.formatcontext.js';
|
|
2
|
+
import type { IPlannedChange } from './interfaces.format.js';
|
|
3
|
+
import { Project } from '../classes.project.js';
|
|
4
|
+
import { ChangeCache } from './classes.changecache.js';
|
|
5
|
+
export declare abstract class BaseFormatter {
|
|
6
|
+
protected context: FormatContext;
|
|
7
|
+
protected project: Project;
|
|
8
|
+
protected cache: ChangeCache;
|
|
9
|
+
protected stats: any;
|
|
10
|
+
constructor(context: FormatContext, project: Project);
|
|
11
|
+
abstract get name(): string;
|
|
12
|
+
abstract analyze(): Promise<IPlannedChange[]>;
|
|
13
|
+
abstract applyChange(change: IPlannedChange): Promise<void>;
|
|
14
|
+
execute(changes: IPlannedChange[]): Promise<void>;
|
|
15
|
+
protected preExecute(): Promise<void>;
|
|
16
|
+
protected postExecute(): Promise<void>;
|
|
17
|
+
protected modifyFile(filepath: string, content: string): Promise<void>;
|
|
18
|
+
protected createFile(filepath: string, content: string): Promise<void>;
|
|
19
|
+
protected deleteFile(filepath: string): Promise<void>;
|
|
20
|
+
protected shouldProcessFile(filepath: string): Promise<boolean>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import { FormatContext } from './classes.formatcontext.js';
|
|
3
|
+
import { Project } from '../classes.project.js';
|
|
4
|
+
import { ChangeCache } from './classes.changecache.js';
|
|
5
|
+
export class BaseFormatter {
|
|
6
|
+
constructor(context, project) {
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.project = project;
|
|
9
|
+
this.cache = context.getChangeCache();
|
|
10
|
+
this.stats = context.getFormatStats();
|
|
11
|
+
}
|
|
12
|
+
async execute(changes) {
|
|
13
|
+
const startTime = this.stats.moduleStartTime(this.name);
|
|
14
|
+
this.stats.startModule(this.name);
|
|
15
|
+
try {
|
|
16
|
+
await this.preExecute();
|
|
17
|
+
for (const change of changes) {
|
|
18
|
+
try {
|
|
19
|
+
await this.applyChange(change);
|
|
20
|
+
this.stats.recordFileOperation(this.name, change.type, true);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
this.stats.recordFileOperation(this.name, change.type, false);
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await this.postExecute();
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
await this.context.rollbackOperation();
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
this.stats.endModule(this.name, startTime);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async preExecute() {
|
|
38
|
+
// Override in subclasses if needed
|
|
39
|
+
}
|
|
40
|
+
async postExecute() {
|
|
41
|
+
// Override in subclasses if needed
|
|
42
|
+
}
|
|
43
|
+
async modifyFile(filepath, content) {
|
|
44
|
+
await this.context.trackFileChange(filepath);
|
|
45
|
+
await plugins.smartfile.memory.toFs(content, filepath);
|
|
46
|
+
await this.cache.updateFileCache(filepath);
|
|
47
|
+
}
|
|
48
|
+
async createFile(filepath, content) {
|
|
49
|
+
await plugins.smartfile.memory.toFs(content, filepath);
|
|
50
|
+
await this.cache.updateFileCache(filepath);
|
|
51
|
+
}
|
|
52
|
+
async deleteFile(filepath) {
|
|
53
|
+
await this.context.trackFileChange(filepath);
|
|
54
|
+
await plugins.smartfile.fs.remove(filepath);
|
|
55
|
+
}
|
|
56
|
+
async shouldProcessFile(filepath) {
|
|
57
|
+
const config = new plugins.npmextra.Npmextra();
|
|
58
|
+
const useCache = config.dataFor('gitzone.format.cache.enabled', true);
|
|
59
|
+
if (!useCache) {
|
|
60
|
+
return true; // Process all files if cache is disabled
|
|
61
|
+
}
|
|
62
|
+
const hasChanged = await this.cache.hasFileChanged(filepath);
|
|
63
|
+
// Record cache statistics
|
|
64
|
+
if (hasChanged) {
|
|
65
|
+
this.stats.recordCacheMiss();
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
this.stats.recordCacheHit();
|
|
69
|
+
}
|
|
70
|
+
return hasChanged;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5iYXNlZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9jbGFzc2VzLmJhc2Vmb3JtYXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxNQUFNLE9BQWdCLGFBQWE7SUFNakMsWUFBWSxPQUFzQixFQUFFLE9BQWdCO1FBQ2xELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFNRCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQXlCO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFeEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFB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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface IFileCache {
|
|
2
|
+
path: string;
|
|
3
|
+
checksum: string;
|
|
4
|
+
modified: number;
|
|
5
|
+
size: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ICacheManifest {
|
|
8
|
+
version: string;
|
|
9
|
+
lastFormat: number;
|
|
10
|
+
files: IFileCache[];
|
|
11
|
+
}
|
|
12
|
+
export declare class ChangeCache {
|
|
13
|
+
private cacheDir;
|
|
14
|
+
private manifestPath;
|
|
15
|
+
private cacheVersion;
|
|
16
|
+
constructor();
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
getManifest(): Promise<ICacheManifest>;
|
|
19
|
+
saveManifest(manifest: ICacheManifest): Promise<void>;
|
|
20
|
+
hasFileChanged(filePath: string): Promise<boolean>;
|
|
21
|
+
updateFileCache(filePath: string): Promise<void>;
|
|
22
|
+
getChangedFiles(filePaths: string[]): Promise<string[]>;
|
|
23
|
+
clean(): Promise<void>;
|
|
24
|
+
private calculateChecksum;
|
|
25
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import * as paths from '../paths.js';
|
|
3
|
+
export class ChangeCache {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.cacheVersion = '1.0.0';
|
|
6
|
+
this.cacheDir = plugins.path.join(paths.cwd, '.nogit', 'gitzone-cache');
|
|
7
|
+
this.manifestPath = plugins.path.join(this.cacheDir, 'manifest.json');
|
|
8
|
+
}
|
|
9
|
+
async initialize() {
|
|
10
|
+
await plugins.smartfile.fs.ensureDir(this.cacheDir);
|
|
11
|
+
}
|
|
12
|
+
async getManifest() {
|
|
13
|
+
const exists = await plugins.smartfile.fs.fileExists(this.manifestPath);
|
|
14
|
+
if (!exists) {
|
|
15
|
+
return {
|
|
16
|
+
version: this.cacheVersion,
|
|
17
|
+
lastFormat: 0,
|
|
18
|
+
files: []
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const content = await plugins.smartfile.fs.toStringSync(this.manifestPath);
|
|
22
|
+
return JSON.parse(content);
|
|
23
|
+
}
|
|
24
|
+
async saveManifest(manifest) {
|
|
25
|
+
await plugins.smartfile.memory.toFs(JSON.stringify(manifest, null, 2), this.manifestPath);
|
|
26
|
+
}
|
|
27
|
+
async hasFileChanged(filePath) {
|
|
28
|
+
const absolutePath = plugins.path.isAbsolute(filePath)
|
|
29
|
+
? filePath
|
|
30
|
+
: plugins.path.join(paths.cwd, filePath);
|
|
31
|
+
// Check if file exists
|
|
32
|
+
const exists = await plugins.smartfile.fs.fileExists(absolutePath);
|
|
33
|
+
if (!exists) {
|
|
34
|
+
return true; // File doesn't exist, so it's "changed" (will be created)
|
|
35
|
+
}
|
|
36
|
+
// Get current file stats
|
|
37
|
+
const stats = await plugins.smartfile.fs.stat(absolutePath);
|
|
38
|
+
const content = await plugins.smartfile.fs.toStringSync(absolutePath);
|
|
39
|
+
const currentChecksum = this.calculateChecksum(content);
|
|
40
|
+
// Get cached info
|
|
41
|
+
const manifest = await this.getManifest();
|
|
42
|
+
const cachedFile = manifest.files.find(f => f.path === filePath);
|
|
43
|
+
if (!cachedFile) {
|
|
44
|
+
return true; // Not in cache, so it's changed
|
|
45
|
+
}
|
|
46
|
+
// Compare checksums
|
|
47
|
+
return cachedFile.checksum !== currentChecksum ||
|
|
48
|
+
cachedFile.size !== stats.size ||
|
|
49
|
+
cachedFile.modified !== stats.mtimeMs;
|
|
50
|
+
}
|
|
51
|
+
async updateFileCache(filePath) {
|
|
52
|
+
const absolutePath = plugins.path.isAbsolute(filePath)
|
|
53
|
+
? filePath
|
|
54
|
+
: plugins.path.join(paths.cwd, filePath);
|
|
55
|
+
// Get current file stats
|
|
56
|
+
const stats = await plugins.smartfile.fs.stat(absolutePath);
|
|
57
|
+
const content = await plugins.smartfile.fs.toStringSync(absolutePath);
|
|
58
|
+
const checksum = this.calculateChecksum(content);
|
|
59
|
+
// Update manifest
|
|
60
|
+
const manifest = await this.getManifest();
|
|
61
|
+
const existingIndex = manifest.files.findIndex(f => f.path === filePath);
|
|
62
|
+
const cacheEntry = {
|
|
63
|
+
path: filePath,
|
|
64
|
+
checksum,
|
|
65
|
+
modified: stats.mtimeMs,
|
|
66
|
+
size: stats.size
|
|
67
|
+
};
|
|
68
|
+
if (existingIndex !== -1) {
|
|
69
|
+
manifest.files[existingIndex] = cacheEntry;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
manifest.files.push(cacheEntry);
|
|
73
|
+
}
|
|
74
|
+
manifest.lastFormat = Date.now();
|
|
75
|
+
await this.saveManifest(manifest);
|
|
76
|
+
}
|
|
77
|
+
async getChangedFiles(filePaths) {
|
|
78
|
+
const changedFiles = [];
|
|
79
|
+
for (const filePath of filePaths) {
|
|
80
|
+
if (await this.hasFileChanged(filePath)) {
|
|
81
|
+
changedFiles.push(filePath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return changedFiles;
|
|
85
|
+
}
|
|
86
|
+
async clean() {
|
|
87
|
+
const manifest = await this.getManifest();
|
|
88
|
+
const validFiles = [];
|
|
89
|
+
// Remove entries for files that no longer exist
|
|
90
|
+
for (const file of manifest.files) {
|
|
91
|
+
const absolutePath = plugins.path.isAbsolute(file.path)
|
|
92
|
+
? file.path
|
|
93
|
+
: plugins.path.join(paths.cwd, file.path);
|
|
94
|
+
if (await plugins.smartfile.fs.fileExists(absolutePath)) {
|
|
95
|
+
validFiles.push(file);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
manifest.files = validFiles;
|
|
99
|
+
await this.saveManifest(manifest);
|
|
100
|
+
}
|
|
101
|
+
calculateChecksum(content) {
|
|
102
|
+
return plugins.crypto.createHash('sha256').update(content).digest('hex');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jaGFuZ2VjYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9mb3JtYXQvY2xhc3Nlcy5jaGFuZ2VjYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBZXJDLE1BQU0sT0FBTyxXQUFXO0lBS3RCO1FBRlEsaUJBQVksR0FBRyxPQUFPLENBQUM7UUFHN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPO2dCQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWTtnQkFDMUIsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLEVBQUU7YUFDVixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBd0I7UUFDekMsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFnQjtRQUNuQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzQyx1QkFBdUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxJQUFJLENBQUMsQ0FBQywwREFBMEQ7UUFDekUsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEQsa0JBQWtCO1FBQ2xCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDL0MsQ0FBQztRQUVELG9CQUFvQjtRQUNwQixPQUFPLFVBQVUsQ0FBQyxRQUFRLEtBQUssZUFBZTtZQUN2QyxVQUFVLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJO1lBQzlCLFVBQVUsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFnQjtRQUNwQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEQsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUzQyx5QkFBeUI7UUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpELGtCQUFrQjtRQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7UUFFekUsTUFBTSxVQUFVLEdBQWU7WUFDN0IsSUFBSSxFQUFFLFFBQVE7WUFDZCxRQUFRO1lBQ1IsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3ZCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtTQUNqQixDQUFDO1FBRUYsSUFBSSxhQUFhLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxRQUFRLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBbUI7UUFDdkMsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1FBRWxDLEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsSUFBSSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFDLE1BQU0sVUFBVSxHQUFpQixFQUFFLENBQUM7UUFFcEMsZ0RBQWdEO1FBQ2hELEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDWCxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFNUMsSUFBSSxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDSCxDQUFDO1FBRUQsUUFBUSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7UUFDNUIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUF3QjtRQUNoRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseFormatter } from './classes.baseformatter.js';
|
|
2
|
+
export interface IModuleDependency {
|
|
3
|
+
module: string;
|
|
4
|
+
dependencies: Set<string>;
|
|
5
|
+
dependents: Set<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare class DependencyAnalyzer {
|
|
8
|
+
private moduleDependencies;
|
|
9
|
+
constructor();
|
|
10
|
+
private initializeDependencies;
|
|
11
|
+
getExecutionGroups(modules: BaseFormatter[]): BaseFormatter[][];
|
|
12
|
+
canRunInParallel(module1: string, module2: string): boolean;
|
|
13
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import { BaseFormatter } from './classes.baseformatter.js';
|
|
3
|
+
export class DependencyAnalyzer {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.moduleDependencies = new Map();
|
|
6
|
+
this.initializeDependencies();
|
|
7
|
+
}
|
|
8
|
+
initializeDependencies() {
|
|
9
|
+
// Define dependencies between format modules
|
|
10
|
+
const dependencies = {
|
|
11
|
+
'cleanup': [], // No dependencies
|
|
12
|
+
'npmextra': [], // No dependencies
|
|
13
|
+
'license': ['npmextra'], // Depends on npmextra for config
|
|
14
|
+
'packagejson': ['npmextra'], // Depends on npmextra for config
|
|
15
|
+
'templates': ['npmextra', 'packagejson'], // Depends on both
|
|
16
|
+
'gitignore': ['templates'], // Depends on templates
|
|
17
|
+
'tsconfig': ['packagejson'], // Depends on package.json
|
|
18
|
+
'prettier': ['cleanup', 'npmextra', 'packagejson', 'templates', 'gitignore', 'tsconfig'], // Runs after most others
|
|
19
|
+
'readme': ['npmextra', 'packagejson'], // Depends on project metadata
|
|
20
|
+
'copy': ['npmextra'], // Depends on config
|
|
21
|
+
};
|
|
22
|
+
// Initialize all modules
|
|
23
|
+
for (const [module, deps] of Object.entries(dependencies)) {
|
|
24
|
+
this.moduleDependencies.set(module, {
|
|
25
|
+
module,
|
|
26
|
+
dependencies: new Set(deps),
|
|
27
|
+
dependents: new Set()
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
// Build reverse dependencies (dependents)
|
|
31
|
+
for (const [module, deps] of Object.entries(dependencies)) {
|
|
32
|
+
for (const dep of deps) {
|
|
33
|
+
const depModule = this.moduleDependencies.get(dep);
|
|
34
|
+
if (depModule) {
|
|
35
|
+
depModule.dependents.add(module);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
getExecutionGroups(modules) {
|
|
41
|
+
const modulesMap = new Map(modules.map(m => [m.name, m]));
|
|
42
|
+
const executed = new Set();
|
|
43
|
+
const groups = [];
|
|
44
|
+
while (executed.size < modules.length) {
|
|
45
|
+
const currentGroup = [];
|
|
46
|
+
for (const module of modules) {
|
|
47
|
+
if (executed.has(module.name))
|
|
48
|
+
continue;
|
|
49
|
+
const dependency = this.moduleDependencies.get(module.name);
|
|
50
|
+
if (!dependency) {
|
|
51
|
+
// Unknown module, execute in isolation
|
|
52
|
+
currentGroup.push(module);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Check if all dependencies have been executed
|
|
56
|
+
const allDepsExecuted = Array.from(dependency.dependencies)
|
|
57
|
+
.every(dep => executed.has(dep) || !modulesMap.has(dep));
|
|
58
|
+
if (allDepsExecuted) {
|
|
59
|
+
currentGroup.push(module);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (currentGroup.length === 0) {
|
|
63
|
+
// Circular dependency or error - execute remaining modules
|
|
64
|
+
for (const module of modules) {
|
|
65
|
+
if (!executed.has(module.name)) {
|
|
66
|
+
currentGroup.push(module);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
currentGroup.forEach(m => executed.add(m.name));
|
|
71
|
+
groups.push(currentGroup);
|
|
72
|
+
}
|
|
73
|
+
return groups;
|
|
74
|
+
}
|
|
75
|
+
canRunInParallel(module1, module2) {
|
|
76
|
+
const dep1 = this.moduleDependencies.get(module1);
|
|
77
|
+
const dep2 = this.moduleDependencies.get(module2);
|
|
78
|
+
if (!dep1 || !dep2)
|
|
79
|
+
return false;
|
|
80
|
+
// Check if module1 depends on module2 or vice versa
|
|
81
|
+
return !dep1.dependencies.has(module2) &&
|
|
82
|
+
!dep2.dependencies.has(module1) &&
|
|
83
|
+
!dep1.dependents.has(module2) &&
|
|
84
|
+
!dep2.dependents.has(module1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kZXBlbmRlbmN5LWFuYWx5emVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9jbGFzc2VzLmRlcGVuZGVuY3ktYW5hbHl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFRM0QsTUFBTSxPQUFPLGtCQUFrQjtJQUc3QjtRQUZRLHVCQUFrQixHQUFtQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR3JFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsNkNBQTZDO1FBQzdDLE1BQU0sWUFBWSxHQUFHO1lBQ25CLFNBQVMsRUFBRSxFQUFFLEVBQUcsa0JBQWtCO1lBQ2xDLFVBQVUsRUFBRSxFQUFFLEVBQUcsa0JBQWtCO1lBQ25DLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFHLGlDQUFpQztZQUMzRCxhQUFhLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRyxpQ0FBaUM7WUFDL0QsV0FBVyxFQUFFLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxFQUFHLGtCQUFrQjtZQUM3RCxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRyx1QkFBdUI7WUFDcEQsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUcsMEJBQTBCO1lBQ3hELFVBQVUsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEVBQUcseUJBQXlCO1lBQ3BILFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsRUFBRyw4QkFBOEI7WUFDdEUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUcsb0JBQW9CO1NBQzVDLENBQUM7UUFFRix5QkFBeUI7UUFD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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IPlannedChange } from './interfaces.format.js';
|
|
2
|
+
export declare class DiffReporter {
|
|
3
|
+
private diffs;
|
|
4
|
+
generateDiff(filePath: string, oldContent: string, newContent: string): Promise<string>;
|
|
5
|
+
generateDiffForChange(change: IPlannedChange): Promise<string | null>;
|
|
6
|
+
displayDiff(filePath: string, diff?: string): void;
|
|
7
|
+
displayAllDiffs(): void;
|
|
8
|
+
private formatDiffHeader;
|
|
9
|
+
private colorDiff;
|
|
10
|
+
saveDiffReport(outputPath: string): Promise<void>;
|
|
11
|
+
hasAnyDiffs(): boolean;
|
|
12
|
+
getDiffCount(): number;
|
|
13
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import { logger } from '../gitzone.logging.js';
|
|
3
|
+
export class DiffReporter {
|
|
4
|
+
constructor() {
|
|
5
|
+
this.diffs = new Map();
|
|
6
|
+
}
|
|
7
|
+
async generateDiff(filePath, oldContent, newContent) {
|
|
8
|
+
const diff = plugins.smartdiff.createDiff(oldContent, newContent);
|
|
9
|
+
this.diffs.set(filePath, diff);
|
|
10
|
+
return diff;
|
|
11
|
+
}
|
|
12
|
+
async generateDiffForChange(change) {
|
|
13
|
+
if (change.type !== 'modify') {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const exists = await plugins.smartfile.fs.fileExists(change.path);
|
|
18
|
+
if (!exists) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const currentContent = await plugins.smartfile.fs.toStringSync(change.path);
|
|
22
|
+
// For planned changes, we need the new content
|
|
23
|
+
if (!change.content) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return await this.generateDiff(change.path, currentContent, change.content);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
logger.log('error', `Failed to generate diff for ${change.path}: ${error.message}`);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
displayDiff(filePath, diff) {
|
|
34
|
+
const diffToShow = diff || this.diffs.get(filePath);
|
|
35
|
+
if (!diffToShow) {
|
|
36
|
+
logger.log('warn', `No diff available for ${filePath}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
console.log(`\n${this.formatDiffHeader(filePath)}`);
|
|
40
|
+
console.log(this.colorDiff(diffToShow));
|
|
41
|
+
console.log('━'.repeat(50));
|
|
42
|
+
}
|
|
43
|
+
displayAllDiffs() {
|
|
44
|
+
if (this.diffs.size === 0) {
|
|
45
|
+
logger.log('info', 'No diffs to display');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
console.log('\nFile Changes:');
|
|
49
|
+
console.log('═'.repeat(50));
|
|
50
|
+
for (const [filePath, diff] of this.diffs) {
|
|
51
|
+
this.displayDiff(filePath, diff);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
formatDiffHeader(filePath) {
|
|
55
|
+
return `📄 ${filePath}`;
|
|
56
|
+
}
|
|
57
|
+
colorDiff(diff) {
|
|
58
|
+
const lines = diff.split('\n');
|
|
59
|
+
const coloredLines = lines.map(line => {
|
|
60
|
+
if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
61
|
+
return `\x1b[32m${line}\x1b[0m`; // Green for additions
|
|
62
|
+
}
|
|
63
|
+
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
64
|
+
return `\x1b[31m${line}\x1b[0m`; // Red for deletions
|
|
65
|
+
}
|
|
66
|
+
else if (line.startsWith('@')) {
|
|
67
|
+
return `\x1b[36m${line}\x1b[0m`; // Cyan for line numbers
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
return line;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
return coloredLines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
async saveDiffReport(outputPath) {
|
|
76
|
+
const report = {
|
|
77
|
+
timestamp: new Date().toISOString(),
|
|
78
|
+
totalFiles: this.diffs.size,
|
|
79
|
+
diffs: Array.from(this.diffs.entries()).map(([path, diff]) => ({
|
|
80
|
+
path,
|
|
81
|
+
diff
|
|
82
|
+
}))
|
|
83
|
+
};
|
|
84
|
+
await plugins.smartfile.memory.toFs(JSON.stringify(report, null, 2), outputPath);
|
|
85
|
+
logger.log('info', `Diff report saved to ${outputPath}`);
|
|
86
|
+
}
|
|
87
|
+
hasAnyDiffs() {
|
|
88
|
+
return this.diffs.size > 0;
|
|
89
|
+
}
|
|
90
|
+
getDiffCount() {
|
|
91
|
+
return this.diffs.size;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5kaWZmcmVwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2NsYXNzZXMuZGlmZnJlcG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE1BQU0sT0FBTyxZQUFZO0lBQXpCO1FBQ1UsVUFBSyxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBc0dqRCxDQUFDO0lBcEdDLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLFVBQWtCO1FBQ3pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQXNCO1FBQ2hELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sY0FBYyxHQUFHLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU1RSwrQ0FBK0M7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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { RollbackManager } from './classes.rollbackmanager.js';
|
|
2
|
+
import { ChangeCache } from './classes.changecache.js';
|
|
3
|
+
import { FormatStats } from './classes.formatstats.js';
|
|
4
|
+
export declare class FormatContext {
|
|
5
|
+
private rollbackManager;
|
|
6
|
+
private currentOperation;
|
|
7
|
+
private changeCache;
|
|
8
|
+
private formatStats;
|
|
9
|
+
constructor();
|
|
10
|
+
beginOperation(): Promise<void>;
|
|
11
|
+
trackFileChange(filepath: string): Promise<void>;
|
|
12
|
+
commitOperation(): Promise<void>;
|
|
13
|
+
rollbackOperation(): Promise<void>;
|
|
14
|
+
rollbackTo(operationId: string): Promise<void>;
|
|
15
|
+
getRollbackManager(): RollbackManager;
|
|
16
|
+
getChangeCache(): ChangeCache;
|
|
17
|
+
initializeCache(): Promise<void>;
|
|
18
|
+
getFormatStats(): FormatStats;
|
|
19
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import * as plugins from './mod.plugins.js';
|
|
2
|
+
import { RollbackManager } from './classes.rollbackmanager.js';
|
|
3
|
+
import { ChangeCache } from './classes.changecache.js';
|
|
4
|
+
import { FormatStats } from './classes.formatstats.js';
|
|
5
|
+
export class FormatContext {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.currentOperation = null;
|
|
8
|
+
this.rollbackManager = new RollbackManager();
|
|
9
|
+
this.changeCache = new ChangeCache();
|
|
10
|
+
this.formatStats = new FormatStats();
|
|
11
|
+
}
|
|
12
|
+
async beginOperation() {
|
|
13
|
+
this.currentOperation = await this.rollbackManager.createOperation();
|
|
14
|
+
}
|
|
15
|
+
async trackFileChange(filepath) {
|
|
16
|
+
if (!this.currentOperation) {
|
|
17
|
+
throw new Error('No operation in progress. Call beginOperation() first.');
|
|
18
|
+
}
|
|
19
|
+
await this.rollbackManager.backupFile(filepath, this.currentOperation.id);
|
|
20
|
+
}
|
|
21
|
+
async commitOperation() {
|
|
22
|
+
if (!this.currentOperation) {
|
|
23
|
+
throw new Error('No operation in progress. Call beginOperation() first.');
|
|
24
|
+
}
|
|
25
|
+
await this.rollbackManager.markComplete(this.currentOperation.id);
|
|
26
|
+
this.currentOperation = null;
|
|
27
|
+
}
|
|
28
|
+
async rollbackOperation() {
|
|
29
|
+
if (!this.currentOperation) {
|
|
30
|
+
throw new Error('No operation in progress. Call beginOperation() first.');
|
|
31
|
+
}
|
|
32
|
+
await this.rollbackManager.rollback(this.currentOperation.id);
|
|
33
|
+
this.currentOperation = null;
|
|
34
|
+
}
|
|
35
|
+
async rollbackTo(operationId) {
|
|
36
|
+
await this.rollbackManager.rollback(operationId);
|
|
37
|
+
}
|
|
38
|
+
getRollbackManager() {
|
|
39
|
+
return this.rollbackManager;
|
|
40
|
+
}
|
|
41
|
+
getChangeCache() {
|
|
42
|
+
return this.changeCache;
|
|
43
|
+
}
|
|
44
|
+
async initializeCache() {
|
|
45
|
+
await this.changeCache.initialize();
|
|
46
|
+
}
|
|
47
|
+
getFormatStats() {
|
|
48
|
+
return this.formatStats;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mb3JtYXRjb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9jbGFzc2VzLmZvcm1hdGNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUd2RCxNQUFNLE9BQU8sYUFBYTtJQU14QjtRQUpRLHFCQUFnQixHQUE0QixJQUFJLENBQUM7UUFLdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBZ0I7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBbUI7UUFDbEMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRiJ9
|