@git.zone/cli 2.13.10 → 2.13.12
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/templates/{npmextra/npmextra.json → smartconfig/_smartconfig.json} +3 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.gitzoneconfig.js +4 -4
- package/dist_ts/gitzone.cli.js +1 -15
- package/dist_ts/mod_commit/index.js +4 -4
- package/dist_ts/mod_config/classes.commitconfig.d.ts +3 -3
- package/dist_ts/mod_config/classes.commitconfig.js +20 -20
- package/dist_ts/mod_config/classes.releaseconfig.d.ts +3 -3
- package/dist_ts/mod_config/classes.releaseconfig.js +21 -21
- package/dist_ts/mod_config/index.js +12 -12
- package/dist_ts/mod_format/classes.baseformatter.d.ts +2 -9
- package/dist_ts/mod_format/classes.baseformatter.js +13 -26
- package/dist_ts/mod_format/classes.formatplanner.d.ts +1 -3
- package/dist_ts/mod_format/classes.formatplanner.js +11 -39
- package/dist_ts/mod_format/classes.formatstats.d.ts +0 -5
- package/dist_ts/mod_format/classes.formatstats.js +3 -35
- package/dist_ts/mod_format/formatters/cleanup.formatter.js +1 -2
- package/dist_ts/mod_format/formatters/copy.formatter.js +5 -8
- package/dist_ts/mod_format/formatters/gitignore.formatter.d.ts +5 -0
- package/dist_ts/mod_format/formatters/gitignore.formatter.js +23 -29
- package/dist_ts/mod_format/formatters/packagejson.formatter.js +5 -5
- package/dist_ts/mod_format/formatters/prettier.formatter.js +4 -12
- package/dist_ts/mod_format/formatters/{npmextra.formatter.d.ts → smartconfig.formatter.d.ts} +6 -1
- package/dist_ts/mod_format/formatters/smartconfig.formatter.js +180 -0
- package/dist_ts/mod_format/formatters/templates.formatter.d.ts +4 -0
- package/dist_ts/mod_format/formatters/templates.formatter.js +50 -43
- package/dist_ts/mod_format/formatters/tsconfig.formatter.js +6 -4
- package/dist_ts/mod_format/index.d.ts +0 -4
- package/dist_ts/mod_format/index.js +27 -78
- package/dist_ts/mod_format/interfaces.format.d.ts +1 -18
- package/dist_ts/mod_format/interfaces.format.js +16 -2
- package/dist_ts/mod_format/mod.plugins.d.ts +3 -7
- package/dist_ts/mod_format/mod.plugins.js +4 -8
- package/dist_ts/mod_services/classes.globalregistry.js +2 -2
- package/dist_ts/mod_services/classes.servicemanager.d.ts +2 -2
- package/dist_ts/mod_services/classes.servicemanager.js +21 -21
- package/dist_ts/plugins.d.ts +2 -2
- package/dist_ts/plugins.js +3 -3
- package/package.json +5 -11
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitzoneconfig.ts +3 -3
- package/ts/gitzone.cli.ts +0 -17
- package/ts/mod_commit/index.ts +3 -3
- package/ts/mod_config/classes.commitconfig.ts +19 -19
- package/ts/mod_config/classes.releaseconfig.ts +20 -20
- package/ts/mod_config/index.ts +11 -11
- package/ts/mod_format/classes.baseformatter.ts +14 -25
- package/ts/mod_format/classes.formatplanner.ts +10 -39
- package/ts/mod_format/classes.formatstats.ts +2 -42
- package/ts/mod_format/formatters/cleanup.formatter.ts +0 -1
- package/ts/mod_format/formatters/copy.formatter.ts +4 -8
- package/ts/mod_format/formatters/gitignore.formatter.ts +25 -29
- package/ts/mod_format/formatters/packagejson.formatter.ts +4 -4
- package/ts/mod_format/formatters/prettier.formatter.ts +3 -13
- package/ts/mod_format/formatters/smartconfig.formatter.ts +213 -0
- package/ts/mod_format/formatters/templates.formatter.ts +55 -43
- package/ts/mod_format/formatters/tsconfig.formatter.ts +6 -3
- package/ts/mod_format/index.ts +35 -98
- package/ts/mod_format/interfaces.format.ts +16 -19
- package/ts/mod_format/mod.plugins.ts +4 -12
- package/ts/mod_services/classes.globalregistry.ts +2 -2
- package/ts/mod_services/classes.servicemanager.ts +20 -20
- package/ts/plugins.ts +2 -2
- package/dist_ts/mod_format/classes.changecache.d.ts +0 -26
- package/dist_ts/mod_format/classes.changecache.js +0 -181
- package/dist_ts/mod_format/classes.dependency-analyzer.d.ts +0 -13
- package/dist_ts/mod_format/classes.dependency-analyzer.js +0 -93
- package/dist_ts/mod_format/classes.rollbackmanager.d.ts +0 -22
- package/dist_ts/mod_format/classes.rollbackmanager.js +0 -259
- package/dist_ts/mod_format/format.cleanup.d.ts +0 -2
- package/dist_ts/mod_format/format.cleanup.js +0 -25
- package/dist_ts/mod_format/format.copy.d.ts +0 -24
- package/dist_ts/mod_format/format.copy.js +0 -77
- package/dist_ts/mod_format/format.gitignore.d.ts +0 -2
- package/dist_ts/mod_format/format.gitignore.js +0 -48
- package/dist_ts/mod_format/format.license.d.ts +0 -2
- package/dist_ts/mod_format/format.license.js +0 -26
- package/dist_ts/mod_format/format.npmextra.d.ts +0 -5
- package/dist_ts/mod_format/format.npmextra.js +0 -125
- package/dist_ts/mod_format/format.packagejson.d.ts +0 -2
- package/dist_ts/mod_format/format.packagejson.js +0 -145
- package/dist_ts/mod_format/format.prettier.d.ts +0 -2
- package/dist_ts/mod_format/format.prettier.js +0 -56
- package/dist_ts/mod_format/format.readme.d.ts +0 -1
- package/dist_ts/mod_format/format.readme.js +0 -29
- package/dist_ts/mod_format/format.templates.d.ts +0 -5
- package/dist_ts/mod_format/format.templates.js +0 -68
- package/dist_ts/mod_format/format.tsconfig.d.ts +0 -2
- package/dist_ts/mod_format/format.tsconfig.js +0 -28
- package/dist_ts/mod_format/formatters/npmextra.formatter.js +0 -142
- package/ts/mod_format/classes.changecache.ts +0 -235
- package/ts/mod_format/classes.dependency-analyzer.ts +0 -117
- package/ts/mod_format/classes.rollbackmanager.ts +0 -340
- package/ts/mod_format/format.cleanup.ts +0 -26
- package/ts/mod_format/format.copy.ts +0 -93
- package/ts/mod_format/format.gitignore.ts +0 -54
- package/ts/mod_format/format.license.ts +0 -32
- package/ts/mod_format/format.npmextra.ts +0 -151
- package/ts/mod_format/format.packagejson.ts +0 -196
- package/ts/mod_format/format.prettier.ts +0 -66
- package/ts/mod_format/format.readme.ts +0 -29
- package/ts/mod_format/format.templates.ts +0 -79
- package/ts/mod_format/format.tsconfig.ts +0 -31
- package/ts/mod_format/formatters/npmextra.formatter.ts +0 -174
- /package/{npmextra.json → .smartconfig.json} +0 -0
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
import * as plugins from './mod.plugins.js';
|
|
2
|
-
import * as paths from '../paths.js';
|
|
3
|
-
export class RollbackManager {
|
|
4
|
-
backupDir;
|
|
5
|
-
manifestPath;
|
|
6
|
-
constructor() {
|
|
7
|
-
this.backupDir = plugins.path.join(paths.cwd, '.nogit', 'gitzone-backups');
|
|
8
|
-
this.manifestPath = plugins.path.join(this.backupDir, 'manifest.json');
|
|
9
|
-
}
|
|
10
|
-
async createOperation() {
|
|
11
|
-
await this.ensureBackupDir();
|
|
12
|
-
const operation = {
|
|
13
|
-
id: this.generateOperationId(),
|
|
14
|
-
timestamp: Date.now(),
|
|
15
|
-
files: [],
|
|
16
|
-
status: 'pending',
|
|
17
|
-
};
|
|
18
|
-
await this.updateManifest(operation);
|
|
19
|
-
return operation;
|
|
20
|
-
}
|
|
21
|
-
async backupFile(filepath, operationId) {
|
|
22
|
-
const operation = await this.getOperation(operationId);
|
|
23
|
-
if (!operation) {
|
|
24
|
-
throw new Error(`Operation ${operationId} not found`);
|
|
25
|
-
}
|
|
26
|
-
const absolutePath = plugins.path.isAbsolute(filepath)
|
|
27
|
-
? filepath
|
|
28
|
-
: plugins.path.join(paths.cwd, filepath);
|
|
29
|
-
// Check if file exists
|
|
30
|
-
const exists = await plugins.smartfs.file(absolutePath).exists();
|
|
31
|
-
if (!exists) {
|
|
32
|
-
// File doesn't exist yet (will be created), so we skip backup
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
// Read file content and metadata
|
|
36
|
-
const content = (await plugins.smartfs
|
|
37
|
-
.file(absolutePath)
|
|
38
|
-
.encoding('utf8')
|
|
39
|
-
.read());
|
|
40
|
-
const stats = await plugins.smartfs.file(absolutePath).stat();
|
|
41
|
-
const checksum = this.calculateChecksum(content);
|
|
42
|
-
// Create backup
|
|
43
|
-
const backupPath = this.getBackupPath(operationId, filepath);
|
|
44
|
-
await plugins.smartfs
|
|
45
|
-
.directory(plugins.path.dirname(backupPath))
|
|
46
|
-
.recursive()
|
|
47
|
-
.create();
|
|
48
|
-
await plugins.smartfs.file(backupPath).encoding('utf8').write(content);
|
|
49
|
-
// Update operation
|
|
50
|
-
operation.files.push({
|
|
51
|
-
path: filepath,
|
|
52
|
-
originalContent: content,
|
|
53
|
-
checksum,
|
|
54
|
-
permissions: stats.mode.toString(8),
|
|
55
|
-
});
|
|
56
|
-
await this.updateManifest(operation);
|
|
57
|
-
}
|
|
58
|
-
async rollback(operationId) {
|
|
59
|
-
const operation = await this.getOperation(operationId);
|
|
60
|
-
if (!operation) {
|
|
61
|
-
// Operation doesn't exist, might have already been rolled back or never created
|
|
62
|
-
console.warn(`Operation ${operationId} not found for rollback, skipping`);
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
if (operation.status === 'rolled-back') {
|
|
66
|
-
throw new Error(`Operation ${operationId} has already been rolled back`);
|
|
67
|
-
}
|
|
68
|
-
// Restore files in reverse order
|
|
69
|
-
for (let i = operation.files.length - 1; i >= 0; i--) {
|
|
70
|
-
const file = operation.files[i];
|
|
71
|
-
const absolutePath = plugins.path.isAbsolute(file.path)
|
|
72
|
-
? file.path
|
|
73
|
-
: plugins.path.join(paths.cwd, file.path);
|
|
74
|
-
// Verify backup integrity
|
|
75
|
-
const backupPath = this.getBackupPath(operationId, file.path);
|
|
76
|
-
const backupContent = await plugins.smartfs
|
|
77
|
-
.file(backupPath)
|
|
78
|
-
.encoding('utf8')
|
|
79
|
-
.read();
|
|
80
|
-
const backupChecksum = this.calculateChecksum(backupContent);
|
|
81
|
-
if (backupChecksum !== file.checksum) {
|
|
82
|
-
throw new Error(`Backup integrity check failed for ${file.path}`);
|
|
83
|
-
}
|
|
84
|
-
// Restore file
|
|
85
|
-
await plugins.smartfs
|
|
86
|
-
.file(absolutePath)
|
|
87
|
-
.encoding('utf8')
|
|
88
|
-
.write(file.originalContent);
|
|
89
|
-
// Restore permissions
|
|
90
|
-
const mode = parseInt(file.permissions, 8);
|
|
91
|
-
// Note: Permissions restoration may not work on all platforms
|
|
92
|
-
}
|
|
93
|
-
// Update operation status
|
|
94
|
-
operation.status = 'rolled-back';
|
|
95
|
-
await this.updateManifest(operation);
|
|
96
|
-
}
|
|
97
|
-
async markComplete(operationId) {
|
|
98
|
-
const operation = await this.getOperation(operationId);
|
|
99
|
-
if (!operation) {
|
|
100
|
-
throw new Error(`Operation ${operationId} not found`);
|
|
101
|
-
}
|
|
102
|
-
operation.status = 'completed';
|
|
103
|
-
await this.updateManifest(operation);
|
|
104
|
-
}
|
|
105
|
-
async cleanOldBackups(retentionDays) {
|
|
106
|
-
const manifest = await this.getManifest();
|
|
107
|
-
const cutoffTime = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
|
|
108
|
-
const operationsToDelete = manifest.operations.filter((op) => op.timestamp < cutoffTime && op.status === 'completed');
|
|
109
|
-
for (const operation of operationsToDelete) {
|
|
110
|
-
// Remove backup files
|
|
111
|
-
const operationDir = plugins.path.join(this.backupDir, 'operations', operation.id);
|
|
112
|
-
await plugins.smartfs.directory(operationDir).recursive().delete();
|
|
113
|
-
// Remove from manifest
|
|
114
|
-
manifest.operations = manifest.operations.filter((op) => op.id !== operation.id);
|
|
115
|
-
}
|
|
116
|
-
await this.saveManifest(manifest);
|
|
117
|
-
}
|
|
118
|
-
async verifyBackup(operationId) {
|
|
119
|
-
const operation = await this.getOperation(operationId);
|
|
120
|
-
if (!operation) {
|
|
121
|
-
return false;
|
|
122
|
-
}
|
|
123
|
-
for (const file of operation.files) {
|
|
124
|
-
const backupPath = this.getBackupPath(operationId, file.path);
|
|
125
|
-
const exists = await plugins.smartfs.file(backupPath).exists();
|
|
126
|
-
if (!exists) {
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
const content = await plugins.smartfs
|
|
130
|
-
.file(backupPath)
|
|
131
|
-
.encoding('utf8')
|
|
132
|
-
.read();
|
|
133
|
-
const checksum = this.calculateChecksum(content);
|
|
134
|
-
if (checksum !== file.checksum) {
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
async listBackups() {
|
|
141
|
-
const manifest = await this.getManifest();
|
|
142
|
-
return manifest.operations;
|
|
143
|
-
}
|
|
144
|
-
async ensureBackupDir() {
|
|
145
|
-
await plugins.smartfs.directory(this.backupDir).recursive().create();
|
|
146
|
-
await plugins.smartfs
|
|
147
|
-
.directory(plugins.path.join(this.backupDir, 'operations'))
|
|
148
|
-
.recursive()
|
|
149
|
-
.create();
|
|
150
|
-
}
|
|
151
|
-
generateOperationId() {
|
|
152
|
-
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
153
|
-
const random = Math.random().toString(36).substring(2, 8);
|
|
154
|
-
return `${timestamp}-${random}`;
|
|
155
|
-
}
|
|
156
|
-
getBackupPath(operationId, filepath) {
|
|
157
|
-
const filename = plugins.path.basename(filepath);
|
|
158
|
-
const dir = plugins.path.dirname(filepath);
|
|
159
|
-
const safeDir = dir.replace(/[/\\]/g, '__');
|
|
160
|
-
return plugins.path.join(this.backupDir, 'operations', operationId, 'files', safeDir, `${filename}.backup`);
|
|
161
|
-
}
|
|
162
|
-
calculateChecksum(content) {
|
|
163
|
-
return plugins.crypto.createHash('sha256').update(content).digest('hex');
|
|
164
|
-
}
|
|
165
|
-
async getManifest() {
|
|
166
|
-
const defaultManifest = { operations: [] };
|
|
167
|
-
const exists = await plugins.smartfs.file(this.manifestPath).exists();
|
|
168
|
-
if (!exists) {
|
|
169
|
-
return defaultManifest;
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
const content = (await plugins.smartfs
|
|
173
|
-
.file(this.manifestPath)
|
|
174
|
-
.encoding('utf8')
|
|
175
|
-
.read());
|
|
176
|
-
const manifest = JSON.parse(content);
|
|
177
|
-
// Validate the manifest structure
|
|
178
|
-
if (this.isValidManifest(manifest)) {
|
|
179
|
-
return manifest;
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
console.warn('Invalid rollback manifest structure, returning default manifest');
|
|
183
|
-
return defaultManifest;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
console.warn(`Failed to read rollback manifest: ${error.message}, returning default manifest`);
|
|
188
|
-
// Try to delete the corrupted file
|
|
189
|
-
try {
|
|
190
|
-
await plugins.smartfs.file(this.manifestPath).delete();
|
|
191
|
-
}
|
|
192
|
-
catch (removeError) {
|
|
193
|
-
// Ignore removal errors
|
|
194
|
-
}
|
|
195
|
-
return defaultManifest;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
async saveManifest(manifest) {
|
|
199
|
-
// Validate before saving
|
|
200
|
-
if (!this.isValidManifest(manifest)) {
|
|
201
|
-
throw new Error('Invalid rollback manifest structure, cannot save');
|
|
202
|
-
}
|
|
203
|
-
// Ensure directory exists
|
|
204
|
-
await this.ensureBackupDir();
|
|
205
|
-
// Write directly with proper JSON stringification
|
|
206
|
-
const jsonContent = JSON.stringify(manifest, null, 2);
|
|
207
|
-
await plugins.smartfs
|
|
208
|
-
.file(this.manifestPath)
|
|
209
|
-
.encoding('utf8')
|
|
210
|
-
.write(jsonContent);
|
|
211
|
-
}
|
|
212
|
-
async getOperation(operationId) {
|
|
213
|
-
const manifest = await this.getManifest();
|
|
214
|
-
return manifest.operations.find((op) => op.id === operationId) || null;
|
|
215
|
-
}
|
|
216
|
-
async updateManifest(operation) {
|
|
217
|
-
const manifest = await this.getManifest();
|
|
218
|
-
const existingIndex = manifest.operations.findIndex((op) => op.id === operation.id);
|
|
219
|
-
if (existingIndex !== -1) {
|
|
220
|
-
manifest.operations[existingIndex] = operation;
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
manifest.operations.push(operation);
|
|
224
|
-
}
|
|
225
|
-
await this.saveManifest(manifest);
|
|
226
|
-
}
|
|
227
|
-
isValidManifest(manifest) {
|
|
228
|
-
// Check if manifest has the required structure
|
|
229
|
-
if (!manifest || typeof manifest !== 'object') {
|
|
230
|
-
return false;
|
|
231
|
-
}
|
|
232
|
-
// Check required fields
|
|
233
|
-
if (!Array.isArray(manifest.operations)) {
|
|
234
|
-
return false;
|
|
235
|
-
}
|
|
236
|
-
// Check each operation entry
|
|
237
|
-
for (const operation of manifest.operations) {
|
|
238
|
-
if (!operation ||
|
|
239
|
-
typeof operation !== 'object' ||
|
|
240
|
-
typeof operation.id !== 'string' ||
|
|
241
|
-
typeof operation.timestamp !== 'number' ||
|
|
242
|
-
typeof operation.status !== 'string' ||
|
|
243
|
-
!Array.isArray(operation.files)) {
|
|
244
|
-
return false;
|
|
245
|
-
}
|
|
246
|
-
// Check each file in the operation
|
|
247
|
-
for (const file of operation.files) {
|
|
248
|
-
if (!file ||
|
|
249
|
-
typeof file !== 'object' ||
|
|
250
|
-
typeof file.path !== 'string' ||
|
|
251
|
-
typeof file.checksum !== 'string') {
|
|
252
|
-
return false;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return true;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb2xsYmFja21hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2NsYXNzZXMucm9sbGJhY2ttYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFHckMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLFlBQVksQ0FBUztJQUU3QjtRQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ25CLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTdCLE1BQU0sU0FBUyxHQUFxQjtZQUNsQyxFQUFFLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQztRQUVGLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFnQixFQUFFLFdBQW1CO1FBQ3BELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7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
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import * as plugins from './mod.plugins.js';
|
|
2
|
-
import * as paths from '../paths.js';
|
|
3
|
-
import { logger } from '../gitzone.logging.js';
|
|
4
|
-
import { Project } from '../classes.project.js';
|
|
5
|
-
const filesToDelete = [
|
|
6
|
-
'defaults.yml',
|
|
7
|
-
'yarn.lock',
|
|
8
|
-
'package-lock.json',
|
|
9
|
-
'tslint.json',
|
|
10
|
-
];
|
|
11
|
-
export const run = async (projectArg) => {
|
|
12
|
-
for (const relativeFilePath of filesToDelete) {
|
|
13
|
-
const fileExists = await plugins.smartfs.file(relativeFilePath).exists();
|
|
14
|
-
if (fileExists) {
|
|
15
|
-
logger.log('info', `Found ${relativeFilePath}! Removing it!`);
|
|
16
|
-
await plugins.smartfs
|
|
17
|
-
.file(plugins.path.join(paths.cwd, relativeFilePath))
|
|
18
|
-
.delete();
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
logger.log('info', `Project is free of ${relativeFilePath}`);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmNsZWFudXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2Zvcm1hdC5jbGVhbnVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFFckMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRCxNQUFNLGFBQWEsR0FBRztJQUNwQixjQUFjO0lBQ2QsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixhQUFhO0NBQ2QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsVUFBbUIsRUFBRSxFQUFFO0lBQy9DLEtBQUssTUFBTSxnQkFBZ0IsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDekUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsZ0JBQWdCLGdCQUFnQixDQUFDLENBQUM7WUFDOUQsTUFBTSxPQUFPLENBQUMsT0FBTztpQkFDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztpQkFDcEQsTUFBTSxFQUFFLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHNCQUFzQixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Project } from '../classes.project.js';
|
|
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
|
-
*/
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import * as plugins from './mod.plugins.js';
|
|
2
|
-
import { logger } from '../gitzone.logging.js';
|
|
3
|
-
export const run = async (projectArg) => {
|
|
4
|
-
const gitzoneConfig = await projectArg.gitzoneConfig;
|
|
5
|
-
// Get copy configuration from npmextra.json
|
|
6
|
-
const npmextraConfig = new plugins.npmextra.Smartconfig();
|
|
7
|
-
const copyConfig = npmextraConfig.dataFor('gitzone.format.copy', {
|
|
8
|
-
patterns: [],
|
|
9
|
-
});
|
|
10
|
-
if (!copyConfig.patterns || copyConfig.patterns.length === 0) {
|
|
11
|
-
logger.log('info', 'No copy patterns configured in npmextra.json');
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
for (const pattern of copyConfig.patterns) {
|
|
15
|
-
if (!pattern.from || !pattern.to) {
|
|
16
|
-
logger.log('warn', 'Invalid copy pattern - missing "from" or "to" field');
|
|
17
|
-
continue;
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
// Handle glob patterns
|
|
21
|
-
const entries = await plugins.smartfs
|
|
22
|
-
.directory('.')
|
|
23
|
-
.recursive()
|
|
24
|
-
.filter(pattern.from)
|
|
25
|
-
.list();
|
|
26
|
-
const files = entries.map((entry) => entry.path);
|
|
27
|
-
for (const file of files) {
|
|
28
|
-
const sourcePath = file;
|
|
29
|
-
let destPath = pattern.to;
|
|
30
|
-
// If destination is a directory, preserve filename
|
|
31
|
-
if (pattern.to.endsWith('/')) {
|
|
32
|
-
const filename = plugins.path.basename(file);
|
|
33
|
-
destPath = plugins.path.join(pattern.to, filename);
|
|
34
|
-
}
|
|
35
|
-
// Handle template variables in destination path
|
|
36
|
-
if (pattern.preservePath) {
|
|
37
|
-
const relativePath = plugins.path.relative(plugins.path.dirname(pattern.from.replace(/\*/g, '')), file);
|
|
38
|
-
destPath = plugins.path.join(pattern.to, relativePath);
|
|
39
|
-
}
|
|
40
|
-
// Ensure destination directory exists
|
|
41
|
-
await plugins.smartfs
|
|
42
|
-
.directory(plugins.path.dirname(destPath))
|
|
43
|
-
.recursive()
|
|
44
|
-
.create();
|
|
45
|
-
// Copy file
|
|
46
|
-
await plugins.smartfs.file(sourcePath).copy(destPath);
|
|
47
|
-
logger.log('info', `Copied ${sourcePath} to ${destPath}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
logger.log('error', `Failed to copy pattern ${pattern.from}: ${error.message}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* Example npmextra.json configuration:
|
|
57
|
-
* {
|
|
58
|
-
* "gitzone": {
|
|
59
|
-
* "format": {
|
|
60
|
-
* "copy": {
|
|
61
|
-
* "patterns": [
|
|
62
|
-
* {
|
|
63
|
-
* "from": "src/assets/*",
|
|
64
|
-
* "to": "dist/assets/",
|
|
65
|
-
* "preservePath": true
|
|
66
|
-
* },
|
|
67
|
-
* {
|
|
68
|
-
* "from": "config/*.json",
|
|
69
|
-
* "to": "dist/"
|
|
70
|
-
* }
|
|
71
|
-
* ]
|
|
72
|
-
* }
|
|
73
|
-
* }
|
|
74
|
-
* }
|
|
75
|
-
* }
|
|
76
|
-
*/
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmNvcHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2Zvcm1hdC5jb3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLEVBQUUsVUFBbUIsRUFBRSxFQUFFO0lBQy9DLE1BQU0sYUFBYSxHQUFHLE1BQU0sVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUVyRCw0Q0FBNEM7SUFDNUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQU0scUJBQXFCLEVBQUU7UUFDcEUsUUFBUSxFQUFFLEVBQUU7S0FDYixDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ25FLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUscURBQXFELENBQUMsQ0FBQztZQUMxRSxTQUFTO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHVCQUF1QjtZQUN2QixNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPO2lCQUNsQyxTQUFTLENBQUMsR0FBRyxDQUFDO2lCQUNkLFNBQVMsRUFBRTtpQkFDWCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztpQkFDcEIsSUFBSSxFQUFFLENBQUM7WUFDVixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFakQsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUUxQixtREFBbUQ7Z0JBQ25ELElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO2dCQUVELGdEQUFnRDtnQkFDaEQsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFDckQsSUFBSSxDQUNMLENBQUM7b0JBQ0YsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3pELENBQUM7Z0JBRUQsc0NBQXNDO2dCQUN0QyxNQUFNLE9BQU8sQ0FBQyxPQUFPO3FCQUNsQixTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQ3pDLFNBQVMsRUFBRTtxQkFDWCxNQUFNLEVBQUUsQ0FBQztnQkFFWixZQUFZO2dCQUNaLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLFVBQVUsT0FBTyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxHQUFHLENBQ1IsT0FBTyxFQUNQLDBCQUEwQixPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FDM0QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRyJ9
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import * as plugins from './mod.plugins.js';
|
|
2
|
-
import * as paths from '../paths.js';
|
|
3
|
-
import { Project } from '../classes.project.js';
|
|
4
|
-
import { logger } from '../gitzone.logging.js';
|
|
5
|
-
const gitignorePath = plugins.path.join(paths.cwd, './.gitignore');
|
|
6
|
-
export const run = async (projectArg) => {
|
|
7
|
-
const gitignoreExists = await plugins.smartfs.file(gitignorePath).exists();
|
|
8
|
-
let customContent = '';
|
|
9
|
-
if (gitignoreExists) {
|
|
10
|
-
// lets get the existing gitignore file
|
|
11
|
-
const existingGitIgnoreString = (await plugins.smartfs
|
|
12
|
-
.file(gitignorePath)
|
|
13
|
-
.encoding('utf8')
|
|
14
|
-
.read());
|
|
15
|
-
// Check for different custom section markers
|
|
16
|
-
const customMarkers = ['#------# custom', '# custom'];
|
|
17
|
-
for (const marker of customMarkers) {
|
|
18
|
-
const splitResult = existingGitIgnoreString.split(marker);
|
|
19
|
-
if (splitResult.length > 1) {
|
|
20
|
-
// Get everything after the marker (excluding the marker itself)
|
|
21
|
-
customContent = splitResult[1].trim();
|
|
22
|
-
break;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
// Write the template
|
|
27
|
-
const templateModule = await import('../mod_template/index.js');
|
|
28
|
-
const ciTemplate = await templateModule.getTemplate('gitignore');
|
|
29
|
-
await ciTemplate.writeToDisk(paths.cwd);
|
|
30
|
-
// Append the custom content if it exists
|
|
31
|
-
if (customContent) {
|
|
32
|
-
const newGitignoreContent = (await plugins.smartfs
|
|
33
|
-
.file(gitignorePath)
|
|
34
|
-
.encoding('utf8')
|
|
35
|
-
.read());
|
|
36
|
-
// The template already ends with "#------# custom", so just append the content
|
|
37
|
-
const finalContent = newGitignoreContent.trimEnd() + '\n' + customContent + '\n';
|
|
38
|
-
await plugins.smartfs
|
|
39
|
-
.file(gitignorePath)
|
|
40
|
-
.encoding('utf8')
|
|
41
|
-
.write(finalContent);
|
|
42
|
-
logger.log('info', 'Updated .gitignore while preserving custom section!');
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
logger.log('info', 'Added a .gitignore!');
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmdpdGlnbm9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL21vZF9mb3JtYXQvZm9ybWF0LmdpdGlnbm9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVuRSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLFVBQW1CLEVBQUUsRUFBRTtJQUMvQyxNQUFNLGVBQWUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNFLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUV2QixJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLHVDQUF1QztRQUN2QyxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsT0FBTzthQUNuRCxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ25CLFFBQVEsQ0FBQyxNQUFNLENBQUM7YUFDaEIsSUFBSSxFQUFFLENBQVcsQ0FBQztRQUVyQiw2Q0FBNkM7UUFDN0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN0RCxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLGdFQUFnRTtnQkFDaEUsYUFBYSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEMsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLGNBQWMsR0FBRyxNQUFNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLHlDQUF5QztJQUN6QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxPQUFPO2FBQy9DLElBQUksQ0FBQyxhQUFhLENBQUM7YUFDbkIsUUFBUSxDQUFDLE1BQU0sQ0FBQzthQUNoQixJQUFJLEVBQUUsQ0FBVyxDQUFDO1FBQ3JCLCtFQUErRTtRQUMvRSxNQUFNLFlBQVksR0FDaEIsbUJBQW1CLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDOUQsTUFBTSxPQUFPLENBQUMsT0FBTzthQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ25CLFFBQVEsQ0FBQyxNQUFNLENBQUM7YUFDaEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFEQUFxRCxDQUFDLENBQUM7SUFDNUUsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import * as plugins from './mod.plugins.js';
|
|
2
|
-
import * as paths from '../paths.js';
|
|
3
|
-
import { Project } from '../classes.project.js';
|
|
4
|
-
import { logger } from '../gitzone.logging.js';
|
|
5
|
-
const incompatibleLicenses = ['AGPL', 'GPL', 'SSPL'];
|
|
6
|
-
export const run = async (projectArg) => {
|
|
7
|
-
const nodeModulesInstalled = await plugins.smartfs
|
|
8
|
-
.directory(plugins.path.join(paths.cwd, 'node_modules'))
|
|
9
|
-
.exists();
|
|
10
|
-
if (!nodeModulesInstalled) {
|
|
11
|
-
logger.log('warn', 'No node_modules found. Skipping license check');
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
const licenseChecker = await plugins.smartlegal.createLicenseChecker();
|
|
15
|
-
const licenseCheckResult = await licenseChecker.excludeLicenseWithinPath(paths.cwd, incompatibleLicenses);
|
|
16
|
-
if (licenseCheckResult.failingModules.length === 0) {
|
|
17
|
-
logger.log('info', 'Success -> licenses passed!');
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
logger.log('error', 'Error -> licenses failed. Here is why:');
|
|
21
|
-
for (const failedModule of licenseCheckResult.failingModules) {
|
|
22
|
-
console.log(`${failedModule.name} fails with license ${failedModule.license}`);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmxpY2Vuc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9tb2RfZm9ybWF0L2Zvcm1hdC5saWNlbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxNQUFNLG9CQUFvQixHQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLFVBQW1CLEVBQUUsRUFBRTtJQUMvQyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU87U0FDL0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDdkQsTUFBTSxFQUFFLENBQUM7SUFDWixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO1FBQ3BFLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDdkUsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLGNBQWMsQ0FBQyx3QkFBd0IsQ0FDdEUsS0FBSyxDQUFDLEdBQUcsRUFDVCxvQkFBb0IsQ0FDckIsQ0FBQztJQUNGLElBQUksa0JBQWtCLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsd0NBQXdDLENBQUMsQ0FBQztRQUM5RCxLQUFLLE1BQU0sWUFBWSxJQUFJLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdELE9BQU8sQ0FBQyxHQUFHLENBQ1QsR0FBRyxZQUFZLENBQUMsSUFBSSx1QkFBdUIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUMifQ==
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import * as plugins from './mod.plugins.js';
|
|
2
|
-
import * as paths from '../paths.js';
|
|
3
|
-
import * as gulpFunction from '@push.rocks/gulp-function';
|
|
4
|
-
import { Project } from '../classes.project.js';
|
|
5
|
-
/**
|
|
6
|
-
* Migrates npmextra.json from old namespace keys to new package-scoped keys
|
|
7
|
-
*/
|
|
8
|
-
const migrateNamespaceKeys = (npmextraJson) => {
|
|
9
|
-
let migrated = false;
|
|
10
|
-
const migrations = [
|
|
11
|
-
{ oldKey: 'gitzone', newKey: '@git.zone/cli' },
|
|
12
|
-
{ oldKey: 'tsdoc', newKey: '@git.zone/tsdoc' },
|
|
13
|
-
{ oldKey: 'npmdocker', newKey: '@git.zone/tsdocker' },
|
|
14
|
-
{ oldKey: 'npmci', newKey: '@ship.zone/szci' },
|
|
15
|
-
{ oldKey: 'szci', newKey: '@ship.zone/szci' },
|
|
16
|
-
];
|
|
17
|
-
for (const { oldKey, newKey } of migrations) {
|
|
18
|
-
if (npmextraJson[oldKey]) {
|
|
19
|
-
if (!npmextraJson[newKey]) {
|
|
20
|
-
// New key doesn't exist - simple rename
|
|
21
|
-
npmextraJson[newKey] = npmextraJson[oldKey];
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
// New key exists - merge old into new (old values don't overwrite new)
|
|
25
|
-
npmextraJson[newKey] = {
|
|
26
|
-
...npmextraJson[oldKey],
|
|
27
|
-
...npmextraJson[newKey],
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
delete npmextraJson[oldKey];
|
|
31
|
-
migrated = true;
|
|
32
|
-
console.log(`Migrated npmextra.json: ${oldKey} -> ${newKey}`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
return migrated;
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Migrates npmAccessLevel from @ship.zone/szci to @git.zone/cli.release.accessLevel
|
|
39
|
-
* This is a one-time migration for projects using the old location
|
|
40
|
-
*/
|
|
41
|
-
const migrateAccessLevel = (npmextraJson) => {
|
|
42
|
-
const szciConfig = npmextraJson['@ship.zone/szci'];
|
|
43
|
-
// Check if szci has npmAccessLevel that needs to be migrated
|
|
44
|
-
if (!szciConfig?.npmAccessLevel) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
// Check if we already have the new location
|
|
48
|
-
const gitzoneConfig = npmextraJson['@git.zone/cli'] || {};
|
|
49
|
-
if (gitzoneConfig?.release?.accessLevel) {
|
|
50
|
-
// Already migrated, just remove from szci
|
|
51
|
-
delete szciConfig.npmAccessLevel;
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
// Ensure @git.zone/cli and release exist
|
|
55
|
-
if (!npmextraJson['@git.zone/cli']) {
|
|
56
|
-
npmextraJson['@git.zone/cli'] = {};
|
|
57
|
-
}
|
|
58
|
-
if (!npmextraJson['@git.zone/cli'].release) {
|
|
59
|
-
npmextraJson['@git.zone/cli'].release = {};
|
|
60
|
-
}
|
|
61
|
-
// Migrate the value
|
|
62
|
-
npmextraJson['@git.zone/cli'].release.accessLevel = szciConfig.npmAccessLevel;
|
|
63
|
-
delete szciConfig.npmAccessLevel;
|
|
64
|
-
console.log(`Migrated npmAccessLevel to @git.zone/cli.release.accessLevel`);
|
|
65
|
-
return true;
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* runs the npmextra file checking
|
|
69
|
-
*/
|
|
70
|
-
export const run = async (projectArg) => {
|
|
71
|
-
const formatSmartstream = new plugins.smartstream.StreamWrapper([
|
|
72
|
-
plugins.smartgulp.src([`smartconfig.json`]),
|
|
73
|
-
gulpFunction.forEach(async (fileArg) => {
|
|
74
|
-
const fileString = fileArg.contents.toString();
|
|
75
|
-
const npmextraJson = JSON.parse(fileString);
|
|
76
|
-
// Migrate old namespace keys to new package-scoped keys
|
|
77
|
-
migrateNamespaceKeys(npmextraJson);
|
|
78
|
-
// Migrate npmAccessLevel from szci to @git.zone/cli.release.accessLevel
|
|
79
|
-
migrateAccessLevel(npmextraJson);
|
|
80
|
-
if (!npmextraJson['@git.zone/cli']) {
|
|
81
|
-
npmextraJson['@git.zone/cli'] = {};
|
|
82
|
-
}
|
|
83
|
-
const expectedRepoInformation = [
|
|
84
|
-
'projectType',
|
|
85
|
-
'module.githost',
|
|
86
|
-
'module.gitscope',
|
|
87
|
-
'module.gitrepo',
|
|
88
|
-
'module.description',
|
|
89
|
-
'module.npmPackagename',
|
|
90
|
-
'module.license',
|
|
91
|
-
];
|
|
92
|
-
const interactInstance = new plugins.smartinteract.SmartInteract();
|
|
93
|
-
for (const expectedRepoInformationItem of expectedRepoInformation) {
|
|
94
|
-
if (!plugins.smartobject.smartGet(npmextraJson['@git.zone/cli'], expectedRepoInformationItem)) {
|
|
95
|
-
interactInstance.addQuestions([
|
|
96
|
-
{
|
|
97
|
-
message: `What is the value of ${expectedRepoInformationItem}`,
|
|
98
|
-
name: expectedRepoInformationItem,
|
|
99
|
-
type: 'input',
|
|
100
|
-
default: 'undefined variable',
|
|
101
|
-
},
|
|
102
|
-
]);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
const answerbucket = await interactInstance.runQueue();
|
|
106
|
-
for (const expectedRepoInformationItem of expectedRepoInformation) {
|
|
107
|
-
const cliProvidedValue = answerbucket.getAnswerFor(expectedRepoInformationItem);
|
|
108
|
-
if (cliProvidedValue) {
|
|
109
|
-
plugins.smartobject.smartAdd(npmextraJson['@git.zone/cli'], expectedRepoInformationItem, cliProvidedValue);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
// delete obsolete
|
|
113
|
-
// tbd
|
|
114
|
-
if (!npmextraJson['@ship.zone/szci']) {
|
|
115
|
-
npmextraJson['@ship.zone/szci'] = {};
|
|
116
|
-
}
|
|
117
|
-
fileArg.setContentsFromString(JSON.stringify(npmextraJson, null, 2));
|
|
118
|
-
}),
|
|
119
|
-
plugins.smartgulp.replace(),
|
|
120
|
-
]);
|
|
121
|
-
await formatSmartstream.run().catch((error) => {
|
|
122
|
-
console.log(error);
|
|
123
|
-
});
|
|
124
|
-
};
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0Lm5wbWV4dHJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvbW9kX2Zvcm1hdC9mb3JtYXQubnBtZXh0cmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEtBQUssWUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRDs7R0FFRztBQUNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxZQUFpQixFQUFXLEVBQUU7SUFDMUQsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sVUFBVSxHQUFHO1FBQ2pCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFO1FBQzlDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7UUFDOUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsRUFBRTtRQUNyRCxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFO1FBQzlDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7S0FDOUMsQ0FBQztJQUNGLEtBQUssTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM1QyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsd0NBQXdDO2dCQUN4QyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlDLENBQUM7aUJB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
|