@git.zone/cli 1.16.5 → 1.16.6
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/assets/overrides.json +1 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/mod_format/classes.changecache.d.ts +1 -0
- package/dist_ts/mod_format/classes.changecache.js +80 -11
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/mod_format/classes.changecache.ts +82 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.16.
|
|
6
|
+
version: '1.16.6',
|
|
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
|
|
@@ -10,19 +10,65 @@ export class ChangeCache {
|
|
|
10
10
|
await plugins.smartfile.fs.ensureDir(this.cacheDir);
|
|
11
11
|
}
|
|
12
12
|
async getManifest() {
|
|
13
|
+
const defaultManifest = {
|
|
14
|
+
version: this.cacheVersion,
|
|
15
|
+
lastFormat: 0,
|
|
16
|
+
files: []
|
|
17
|
+
};
|
|
13
18
|
const exists = await plugins.smartfile.fs.fileExists(this.manifestPath);
|
|
14
19
|
if (!exists) {
|
|
15
|
-
return
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
return defaultManifest;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const content = plugins.smartfile.fs.toStringSync(this.manifestPath);
|
|
24
|
+
const manifest = JSON.parse(content);
|
|
25
|
+
// Validate the manifest structure
|
|
26
|
+
if (this.isValidManifest(manifest)) {
|
|
27
|
+
return manifest;
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.warn('Invalid manifest structure, returning default manifest');
|
|
31
|
+
return defaultManifest;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.warn(`Failed to read cache manifest: ${error.message}, returning default manifest`);
|
|
36
|
+
// Try to delete the corrupted file
|
|
37
|
+
try {
|
|
38
|
+
await plugins.smartfile.fs.remove(this.manifestPath);
|
|
39
|
+
}
|
|
40
|
+
catch (removeError) {
|
|
41
|
+
// Ignore removal errors
|
|
42
|
+
}
|
|
43
|
+
return defaultManifest;
|
|
44
|
+
}
|
|
23
45
|
}
|
|
24
46
|
async saveManifest(manifest) {
|
|
25
|
-
|
|
47
|
+
// Validate before saving
|
|
48
|
+
if (!this.isValidManifest(manifest)) {
|
|
49
|
+
throw new Error('Invalid manifest structure, cannot save');
|
|
50
|
+
}
|
|
51
|
+
// Use atomic write: write to temp file, then move it
|
|
52
|
+
const tempPath = `${this.manifestPath}.tmp`;
|
|
53
|
+
try {
|
|
54
|
+
// Write to temporary file
|
|
55
|
+
const jsonContent = JSON.stringify(manifest, null, 2);
|
|
56
|
+
await plugins.smartfile.memory.toFs(jsonContent, tempPath);
|
|
57
|
+
// Move temp file to actual manifest (atomic-like operation)
|
|
58
|
+
// Since smartfile doesn't have rename, we copy and delete
|
|
59
|
+
await plugins.smartfile.fs.copy(tempPath, this.manifestPath);
|
|
60
|
+
await plugins.smartfile.fs.remove(tempPath);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
// Clean up temp file if it exists
|
|
64
|
+
try {
|
|
65
|
+
await plugins.smartfile.fs.remove(tempPath);
|
|
66
|
+
}
|
|
67
|
+
catch (removeError) {
|
|
68
|
+
// Ignore removal errors
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
26
72
|
}
|
|
27
73
|
async hasFileChanged(filePath) {
|
|
28
74
|
const absolutePath = plugins.path.isAbsolute(filePath)
|
|
@@ -62,7 +108,7 @@ export class ChangeCache {
|
|
|
62
108
|
if (stats.isDirectory()) {
|
|
63
109
|
return; // Don't cache directories
|
|
64
110
|
}
|
|
65
|
-
const content =
|
|
111
|
+
const content = plugins.smartfile.fs.toStringSync(absolutePath);
|
|
66
112
|
const checksum = this.calculateChecksum(content);
|
|
67
113
|
// Update manifest
|
|
68
114
|
const manifest = await this.getManifest();
|
|
@@ -109,5 +155,28 @@ export class ChangeCache {
|
|
|
109
155
|
calculateChecksum(content) {
|
|
110
156
|
return plugins.crypto.createHash('sha256').update(content).digest('hex');
|
|
111
157
|
}
|
|
158
|
+
isValidManifest(manifest) {
|
|
159
|
+
// Check if manifest has the required structure
|
|
160
|
+
if (!manifest || typeof manifest !== 'object') {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
// Check required fields
|
|
164
|
+
if (typeof manifest.version !== 'string' ||
|
|
165
|
+
typeof manifest.lastFormat !== 'number' ||
|
|
166
|
+
!Array.isArray(manifest.files)) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
// Check each file entry
|
|
170
|
+
for (const file of manifest.files) {
|
|
171
|
+
if (!file || typeof file !== 'object' ||
|
|
172
|
+
typeof file.path !== 'string' ||
|
|
173
|
+
typeof file.checksum !== 'string' ||
|
|
174
|
+
typeof file.modified !== 'number' ||
|
|
175
|
+
typeof file.size !== 'number') {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
112
181
|
}
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jaGFuZ2VjYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9mb3JtYXQvY2xhc3Nlcy5jaGFuZ2VjYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBZXJDLE1BQU0sT0FBTyxXQUFXO0lBS3RCO1FBRlEsaUJBQVksR0FBRyxPQUFPLENBQUM7UUFHN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sZUFBZSxHQUFtQjtZQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDMUIsVUFBVSxFQUFFLENBQUM7WUFDYixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxlQUFlLENBQUM7UUFDekIsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFT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
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@git.zone/cli",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.16.
|
|
4
|
+
"version": "1.16.6",
|
|
5
5
|
"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.",
|
|
6
6
|
"main": "dist_ts/index.ts",
|
|
7
7
|
"typings": "dist_ts/index.d.ts",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@git.zone/cli',
|
|
6
|
-
version: '1.16.
|
|
6
|
+
version: '1.16.6',
|
|
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
|
}
|
|
@@ -29,21 +29,67 @@ export class ChangeCache {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
async getManifest(): Promise<ICacheManifest> {
|
|
32
|
+
const defaultManifest: ICacheManifest = {
|
|
33
|
+
version: this.cacheVersion,
|
|
34
|
+
lastFormat: 0,
|
|
35
|
+
files: []
|
|
36
|
+
};
|
|
37
|
+
|
|
32
38
|
const exists = await plugins.smartfile.fs.fileExists(this.manifestPath);
|
|
33
39
|
if (!exists) {
|
|
34
|
-
return
|
|
35
|
-
version: this.cacheVersion,
|
|
36
|
-
lastFormat: 0,
|
|
37
|
-
files: []
|
|
38
|
-
};
|
|
40
|
+
return defaultManifest;
|
|
39
41
|
}
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
try {
|
|
44
|
+
const content = plugins.smartfile.fs.toStringSync(this.manifestPath);
|
|
45
|
+
const manifest = JSON.parse(content);
|
|
46
|
+
|
|
47
|
+
// Validate the manifest structure
|
|
48
|
+
if (this.isValidManifest(manifest)) {
|
|
49
|
+
return manifest;
|
|
50
|
+
} else {
|
|
51
|
+
console.warn('Invalid manifest structure, returning default manifest');
|
|
52
|
+
return defaultManifest;
|
|
53
|
+
}
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.warn(`Failed to read cache manifest: ${error.message}, returning default manifest`);
|
|
56
|
+
// Try to delete the corrupted file
|
|
57
|
+
try {
|
|
58
|
+
await plugins.smartfile.fs.remove(this.manifestPath);
|
|
59
|
+
} catch (removeError) {
|
|
60
|
+
// Ignore removal errors
|
|
61
|
+
}
|
|
62
|
+
return defaultManifest;
|
|
63
|
+
}
|
|
43
64
|
}
|
|
44
65
|
|
|
45
66
|
async saveManifest(manifest: ICacheManifest): Promise<void> {
|
|
46
|
-
|
|
67
|
+
// Validate before saving
|
|
68
|
+
if (!this.isValidManifest(manifest)) {
|
|
69
|
+
throw new Error('Invalid manifest structure, cannot save');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Use atomic write: write to temp file, then move it
|
|
73
|
+
const tempPath = `${this.manifestPath}.tmp`;
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
// Write to temporary file
|
|
77
|
+
const jsonContent = JSON.stringify(manifest, null, 2);
|
|
78
|
+
await plugins.smartfile.memory.toFs(jsonContent, tempPath);
|
|
79
|
+
|
|
80
|
+
// Move temp file to actual manifest (atomic-like operation)
|
|
81
|
+
// Since smartfile doesn't have rename, we copy and delete
|
|
82
|
+
await plugins.smartfile.fs.copy(tempPath, this.manifestPath);
|
|
83
|
+
await plugins.smartfile.fs.remove(tempPath);
|
|
84
|
+
} catch (error) {
|
|
85
|
+
// Clean up temp file if it exists
|
|
86
|
+
try {
|
|
87
|
+
await plugins.smartfile.fs.remove(tempPath);
|
|
88
|
+
} catch (removeError) {
|
|
89
|
+
// Ignore removal errors
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
47
93
|
}
|
|
48
94
|
|
|
49
95
|
async hasFileChanged(filePath: string): Promise<boolean> {
|
|
@@ -95,7 +141,7 @@ export class ChangeCache {
|
|
|
95
141
|
return; // Don't cache directories
|
|
96
142
|
}
|
|
97
143
|
|
|
98
|
-
const content =
|
|
144
|
+
const content = plugins.smartfile.fs.toStringSync(absolutePath);
|
|
99
145
|
const checksum = this.calculateChecksum(content);
|
|
100
146
|
|
|
101
147
|
// Update manifest
|
|
@@ -153,4 +199,31 @@ export class ChangeCache {
|
|
|
153
199
|
private calculateChecksum(content: string | Buffer): string {
|
|
154
200
|
return plugins.crypto.createHash('sha256').update(content).digest('hex');
|
|
155
201
|
}
|
|
202
|
+
|
|
203
|
+
private isValidManifest(manifest: any): manifest is ICacheManifest {
|
|
204
|
+
// Check if manifest has the required structure
|
|
205
|
+
if (!manifest || typeof manifest !== 'object') {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Check required fields
|
|
210
|
+
if (typeof manifest.version !== 'string' ||
|
|
211
|
+
typeof manifest.lastFormat !== 'number' ||
|
|
212
|
+
!Array.isArray(manifest.files)) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Check each file entry
|
|
217
|
+
for (const file of manifest.files) {
|
|
218
|
+
if (!file || typeof file !== 'object' ||
|
|
219
|
+
typeof file.path !== 'string' ||
|
|
220
|
+
typeof file.checksum !== 'string' ||
|
|
221
|
+
typeof file.modified !== 'number' ||
|
|
222
|
+
typeof file.size !== 'number') {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
156
229
|
}
|