@marsson/ciutils 0.0.14 ā 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -171
- package/lib/commands/create/file.js +1 -1
- package/lib/commands/create/file.js.map +1 -1
- package/lib/commands/reporton/deployment.js +1 -0
- package/lib/commands/reporton/deployment.js.map +1 -1
- package/lib/commands/validate/repository/metadata.js +372 -0
- package/lib/commands/validate/repository/metadata.js.map +1 -0
- package/messages/validate.repository.metadata.md +24 -0
- package/oclif.lock +3657 -2172
- package/oclif.manifest.json +90 -2
- package/package.json +21 -11
- package/lib/commands/create/file.d.ts +0 -16
- package/lib/commands/remove/assignments.d.ts +0 -20
- package/lib/commands/reporton/deployment.d.ts +0 -27
- package/lib/index.d.ts +0 -2
- package/lib/utils/Utils.d.ts +0 -61
- package/lib/utils/fileToContentVersion.d.ts +0 -10
@@ -0,0 +1,372 @@
|
|
1
|
+
/* eslint-disable */
|
2
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
3
|
+
import { ux } from '@oclif/core';
|
4
|
+
import { Messages } from '@salesforce/core';
|
5
|
+
import { promises as fsPromises, statSync } from 'fs';
|
6
|
+
import * as fs from 'fs';
|
7
|
+
import * as path from 'path';
|
8
|
+
//import JSZip from 'jszip';
|
9
|
+
import { MetadataResolver, ComponentSet } from '@salesforce/source-deploy-retrieve';
|
10
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
11
|
+
const messages = Messages.loadMessages('@marsson/ciutils', 'validate.repository.metadata');
|
12
|
+
export default class ValidateRepositoryMetadata extends SfCommand {
|
13
|
+
static summary = messages.getMessage('summary');
|
14
|
+
static description = messages.getMessage('description');
|
15
|
+
static examples = messages.getMessages('examples');
|
16
|
+
static flags = {
|
17
|
+
name: Flags.string({
|
18
|
+
summary: messages.getMessage('flags.name.summary'),
|
19
|
+
description: messages.getMessage('flags.name.description'),
|
20
|
+
char: 'n',
|
21
|
+
required: false,
|
22
|
+
}),
|
23
|
+
'target-org': Flags.requiredOrg(),
|
24
|
+
folder: Flags.directory({
|
25
|
+
summary: messages.getMessage('flags.folder.summary'),
|
26
|
+
char: 'f',
|
27
|
+
required: true,
|
28
|
+
exists: true,
|
29
|
+
}),
|
30
|
+
debug: Flags.boolean({
|
31
|
+
summary: 'Show debug logs',
|
32
|
+
char: 'd',
|
33
|
+
required: false,
|
34
|
+
default: false,
|
35
|
+
}),
|
36
|
+
};
|
37
|
+
connection;
|
38
|
+
debugMode = false;
|
39
|
+
// Helper method for conditional debug logging
|
40
|
+
debugLog(message) {
|
41
|
+
if (this.debugMode) {
|
42
|
+
this.log(`[DEBUG] ${message}`);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
// Helper method for standardized error handling
|
46
|
+
handleError(context, error, throwError = true) {
|
47
|
+
const errorMessage = `Error in ${context}: ${error.message}`;
|
48
|
+
this.debugLog(errorMessage);
|
49
|
+
this.debugLog(`Error stack: ${error.stack}`);
|
50
|
+
const formattedError = new Error(errorMessage);
|
51
|
+
if (throwError) {
|
52
|
+
throw formattedError;
|
53
|
+
}
|
54
|
+
return formattedError;
|
55
|
+
}
|
56
|
+
getMetadataTypesFromFolder(directory) {
|
57
|
+
this.debugLog(`Starting getMetadataTypesFromDirectory for directory: ${directory}`);
|
58
|
+
const metadataTypes = {};
|
59
|
+
try {
|
60
|
+
const resolver = new MetadataResolver();
|
61
|
+
const components = resolver.getComponentsFromPath(directory);
|
62
|
+
if (components.length > 0) {
|
63
|
+
this.debugLog(`Processing ${components.length} components`);
|
64
|
+
for (const component of components) {
|
65
|
+
const allComponents = [component, ...component.getChildren()];
|
66
|
+
for (const subComponent of allComponents) {
|
67
|
+
const typeName = subComponent.type.name;
|
68
|
+
const fullName = subComponent.fullName;
|
69
|
+
const contentPath = subComponent.content ?? subComponent.xml;
|
70
|
+
const absolutePath = contentPath ? path.resolve(contentPath) : null;
|
71
|
+
const metadataItem = {
|
72
|
+
metadataName: fullName,
|
73
|
+
path: absolutePath,
|
74
|
+
};
|
75
|
+
if (!metadataTypes[typeName]) {
|
76
|
+
metadataTypes[typeName] = {};
|
77
|
+
}
|
78
|
+
if (!metadataTypes[typeName][fullName]) {
|
79
|
+
metadataTypes[typeName][fullName] = metadataItem;
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
this.debugLog(`[DUPLICATE] Skipping duplicate: ${typeName} - ${fullName}`);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
}
|
87
|
+
else {
|
88
|
+
this.debugLog(`No metadata components found in: ${directory}`);
|
89
|
+
}
|
90
|
+
this.debugLog(`Completed scan. Found ${Object.keys(metadataTypes).length} metadata types.`);
|
91
|
+
return metadataTypes;
|
92
|
+
}
|
93
|
+
catch (error) {
|
94
|
+
this.handleError('getMetadataTypesFromDirectory', error);
|
95
|
+
return metadataTypes;
|
96
|
+
}
|
97
|
+
}
|
98
|
+
// Compare retrieved metadata with local files
|
99
|
+
async compareMetadata(downloadedMetadataTypes, metadataTypes) {
|
100
|
+
const result = {
|
101
|
+
status: 0,
|
102
|
+
unchanged: [],
|
103
|
+
changed: [],
|
104
|
+
deleted: [],
|
105
|
+
error: []
|
106
|
+
};
|
107
|
+
this.debugLog(`Starting metadata comparison between local and retrieved metadata`);
|
108
|
+
for (const metadataType in metadataTypes) {
|
109
|
+
this.debugLog(`Processing metadata type: ${metadataType}`);
|
110
|
+
const localComponents = metadataTypes[metadataType];
|
111
|
+
if (!downloadedMetadataTypes[metadataType]) {
|
112
|
+
this.debugLog(`Metadata type ${metadataType} not found in retrieved metadata - all components deleted`);
|
113
|
+
for (const componentName in localComponents) {
|
114
|
+
const component = localComponents[componentName];
|
115
|
+
result.deleted.push({
|
116
|
+
changed: false,
|
117
|
+
componentType: metadataType,
|
118
|
+
created: false,
|
119
|
+
createdDate: new Date().toISOString(),
|
120
|
+
deleted: true,
|
121
|
+
fileName: component.path || '',
|
122
|
+
fullName: component.metadataName,
|
123
|
+
success: true,
|
124
|
+
metadataTypeOrigin: metadataType
|
125
|
+
});
|
126
|
+
}
|
127
|
+
continue;
|
128
|
+
}
|
129
|
+
const retrievedComponents = downloadedMetadataTypes[metadataType];
|
130
|
+
for (const componentName in localComponents) {
|
131
|
+
const localComponent = localComponents[componentName];
|
132
|
+
const retrievedComponent = retrievedComponents[componentName];
|
133
|
+
this.debugLog(`š Comparing ${metadataType}.${componentName}`);
|
134
|
+
if (!retrievedComponent) {
|
135
|
+
this.debugLog(`Component ${componentName} of type ${metadataType} not found in retrieved metadata - deleted`);
|
136
|
+
result.deleted.push({
|
137
|
+
changed: false,
|
138
|
+
componentType: metadataType,
|
139
|
+
created: false,
|
140
|
+
createdDate: new Date().toISOString(),
|
141
|
+
deleted: true,
|
142
|
+
fileName: localComponent.path || '',
|
143
|
+
fullName: localComponent.metadataName,
|
144
|
+
success: true,
|
145
|
+
metadataTypeOrigin: metadataType
|
146
|
+
});
|
147
|
+
continue;
|
148
|
+
}
|
149
|
+
const areEqual = this.areComponentsEqual(localComponent, retrievedComponent);
|
150
|
+
if (localComponent.path &&
|
151
|
+
retrievedComponent.path &&
|
152
|
+
areEqual === true) {
|
153
|
+
this.debugLog(`ā
Component ${componentName} of type ${metadataType} is unchanged`);
|
154
|
+
}
|
155
|
+
else if (areEqual === false) {
|
156
|
+
this.debugLog(`ā ļø Component ${componentName} of type ${metadataType} has changed`);
|
157
|
+
result.changed.push({
|
158
|
+
changed: true,
|
159
|
+
componentType: metadataType,
|
160
|
+
created: false,
|
161
|
+
createdDate: new Date().toISOString(),
|
162
|
+
deleted: false,
|
163
|
+
fileName: localComponent.path || '',
|
164
|
+
fullName: localComponent.metadataName,
|
165
|
+
success: true,
|
166
|
+
metadataTypeOrigin: metadataType
|
167
|
+
});
|
168
|
+
}
|
169
|
+
else {
|
170
|
+
this.debugLog(`āļø Skipping ${componentName} of type ${metadataType} ā possibly a directory or unreadable file.`);
|
171
|
+
// Optional: add to result.error if needed
|
172
|
+
}
|
173
|
+
}
|
174
|
+
}
|
175
|
+
if (result.error.length > 0) {
|
176
|
+
result.status = 3;
|
177
|
+
}
|
178
|
+
else if (result.changed.length > 0 || result.deleted.length > 0) {
|
179
|
+
result.status = 1;
|
180
|
+
}
|
181
|
+
else {
|
182
|
+
result.status = 0;
|
183
|
+
}
|
184
|
+
this.debugLog(`Metadata comparison completed with status: ${result.status}`);
|
185
|
+
this.debugLog(`Unchanged: ${result.unchanged.length}, Changed: ${result.changed.length}, Deleted: ${result.deleted.length}, Error: ${result.error.length}`);
|
186
|
+
return result;
|
187
|
+
}
|
188
|
+
// Helper method to compare two components
|
189
|
+
areComponentsEqual(localComponent, retrievedComponent) {
|
190
|
+
try {
|
191
|
+
const normalize = (content) => {
|
192
|
+
return content
|
193
|
+
.replace(/\r\n/g, '\n')
|
194
|
+
.replace(/<!--[\s\S]*?-->/g, '') // Remove XML comments
|
195
|
+
.replace(/^\s+|\s+$/gm, '') // Trim each line
|
196
|
+
.replace(/\s+/g, ' ') // Normalize whitespace
|
197
|
+
.trim();
|
198
|
+
};
|
199
|
+
if (!localComponent.path || !retrievedComponent.path) {
|
200
|
+
return false;
|
201
|
+
}
|
202
|
+
const isFile = (p) => {
|
203
|
+
try {
|
204
|
+
return statSync(p).isFile();
|
205
|
+
}
|
206
|
+
catch {
|
207
|
+
return false;
|
208
|
+
}
|
209
|
+
};
|
210
|
+
if (!isFile(localComponent.path) || !isFile(retrievedComponent.path)) {
|
211
|
+
this.debugLog(`[SKIP] One of the components is a directory. Skipping comparison for ${localComponent.metadataName}`);
|
212
|
+
return null;
|
213
|
+
}
|
214
|
+
const localContent = fs.readFileSync(localComponent.path, 'utf8');
|
215
|
+
const retrievedContent = fs.readFileSync(retrievedComponent.path, 'utf8');
|
216
|
+
const normalizedLocal = normalize(localContent);
|
217
|
+
const normalizedRetrieved = normalize(retrievedContent);
|
218
|
+
if (normalizedLocal === normalizedRetrieved) {
|
219
|
+
//this.log(`${localComponent.metadataName} EQUAL`);
|
220
|
+
return true;
|
221
|
+
}
|
222
|
+
//this.log(`${localComponent.metadataName} DIFFERENT`);
|
223
|
+
return false;
|
224
|
+
}
|
225
|
+
catch (error) {
|
226
|
+
//this.log(`${localComponent.metadataName} ERROR`);
|
227
|
+
if (error instanceof Error && 'errno' in error) {
|
228
|
+
this.debugLog(`Error comparing files: ${error.errno}`);
|
229
|
+
if (error.errno === -21) {
|
230
|
+
return null;
|
231
|
+
}
|
232
|
+
}
|
233
|
+
return false;
|
234
|
+
}
|
235
|
+
}
|
236
|
+
// Cache for MetadataResolver instances to improve performance
|
237
|
+
/*
|
238
|
+
private resolverCache = new Map<string, any[]>();
|
239
|
+
*/
|
240
|
+
getComponentSetFromFolder(path) {
|
241
|
+
const resolver = new MetadataResolver();
|
242
|
+
const components = resolver.getComponentsFromPath(path);
|
243
|
+
return new ComponentSet(components);
|
244
|
+
}
|
245
|
+
async retrieveComponents(componentSet, conn) {
|
246
|
+
ux.action.start('Retrieving metadata from org'); // š Starts the spinner
|
247
|
+
try {
|
248
|
+
const outputPath = path.join(process.cwd(), '.output');
|
249
|
+
await fsPromises.rm(outputPath, { recursive: true, force: true });
|
250
|
+
const retrieve = await componentSet.retrieve({
|
251
|
+
usernameOrConnection: conn,
|
252
|
+
output: outputPath,
|
253
|
+
merge: false, // Optional: if true, will merge into local project
|
254
|
+
});
|
255
|
+
// Optionally wait for the result:
|
256
|
+
const result = await retrieve.pollStatus(5000, 300000);
|
257
|
+
if (result.response.status === 'Succeeded') {
|
258
|
+
ux.action.stop('āļø Retrieve complete'); // š Spinner stops with success message
|
259
|
+
}
|
260
|
+
else {
|
261
|
+
ux.action.stop(`ā Failed: ${result.response.status}`);
|
262
|
+
}
|
263
|
+
// ā
Return the actual folder path
|
264
|
+
const entries = fs.readdirSync(outputPath, { withFileTypes: true });
|
265
|
+
const firstFolder = entries.find(entry => entry.isDirectory());
|
266
|
+
return firstFolder ? path.join(outputPath, firstFolder.name) : undefined;
|
267
|
+
}
|
268
|
+
catch (error) {
|
269
|
+
ux.action.stop('ā Error during retrieve');
|
270
|
+
throw error;
|
271
|
+
}
|
272
|
+
}
|
273
|
+
async run() {
|
274
|
+
const { flags } = await this.parse(ValidateRepositoryMetadata);
|
275
|
+
// Set debug mode based on flag
|
276
|
+
this.debugMode = flags.debug;
|
277
|
+
this.debugLog(`Starting ValidateRepositoryMetadata.run()`);
|
278
|
+
this.debugLog(`Parsing command flags`);
|
279
|
+
const folder = flags.folder;
|
280
|
+
this.debugLog(`Using folder: ${folder}`);
|
281
|
+
this.debugLog(`Getting connection from target org: ${flags['target-org'].getUsername()}`);
|
282
|
+
this.connection = flags['target-org'].getConnection();
|
283
|
+
this.debugLog(`Connection established to org: ${this.connection.getUsername()}`);
|
284
|
+
try {
|
285
|
+
// Get metadata types from the directory
|
286
|
+
this.debugLog(`Step 1: Getting componentSet from directory: ${folder}`);
|
287
|
+
//this.log('Getting componentSet...');
|
288
|
+
const componentSet = this.getComponentSetFromFolder(folder);
|
289
|
+
// Retrieve metadata from the org
|
290
|
+
this.debugLog(`Step 2: Retrieving metadata from org`);
|
291
|
+
this.log('Retrieving metadata from org...');
|
292
|
+
const resultFolder = await this.retrieveComponents(componentSet, this.connection);
|
293
|
+
this.debugLog(`Successfully retrieved metadata from org`);
|
294
|
+
const originalMetadata = this.getMetadataTypesFromFolder(folder);
|
295
|
+
const retrievedMetadata = this.getMetadataTypesFromFolder(resultFolder);
|
296
|
+
// Compare retrieved metadata with local files
|
297
|
+
this.debugLog(`Step 3: Comparing retrieved metadata with local files`);
|
298
|
+
this.log('Comparing metadata with local files...');
|
299
|
+
const comparisonResult = await this.compareMetadata(retrievedMetadata, originalMetadata);
|
300
|
+
this.debugLog(`Comparison completed with status: ${comparisonResult.status}`);
|
301
|
+
// Display the results
|
302
|
+
this.debugLog(`Step 4: Displaying results`);
|
303
|
+
this.createTable(comparisonResult);
|
304
|
+
this.debugLog(`Results displayed to user`);
|
305
|
+
this.debugLog(`ValidateRepositoryMetadata.run() completed successfully`);
|
306
|
+
// return comparisonResult;
|
307
|
+
this.debugLog(`ValidateRepositoryMetadata.run() completed successfully`);
|
308
|
+
return comparisonResult;
|
309
|
+
}
|
310
|
+
catch (error) {
|
311
|
+
// Log the error but don't throw it since we're in the main run method
|
312
|
+
const formattedError = this.handleError('ValidateRepositoryMetadata.run', error, false);
|
313
|
+
this.error(`Error: ${formattedError.message}`);
|
314
|
+
// Return a default error result
|
315
|
+
this.debugLog(`Returning default error result`);
|
316
|
+
return {
|
317
|
+
status: 3,
|
318
|
+
unchanged: [],
|
319
|
+
changed: [],
|
320
|
+
deleted: [],
|
321
|
+
error: []
|
322
|
+
};
|
323
|
+
}
|
324
|
+
}
|
325
|
+
createTable(result) {
|
326
|
+
this.debugLog(`Creating result table with status: ${result.status}`);
|
327
|
+
switch (result.status) {
|
328
|
+
case 0:
|
329
|
+
this.log('\nā
Result Status: Repo in sync');
|
330
|
+
return;
|
331
|
+
case 1:
|
332
|
+
this.log('\nš Result Status: Components Altered in ORG:');
|
333
|
+
break;
|
334
|
+
case 3:
|
335
|
+
this.log('\nā Result Status: Error on component validation to ORG:');
|
336
|
+
}
|
337
|
+
// Helper function to create component data for tables
|
338
|
+
const createComponentData = (components) => {
|
339
|
+
return components.map((component) => ({
|
340
|
+
'Component Name': component.fullName,
|
341
|
+
'Type': component.componentType,
|
342
|
+
'Metadata Type Origin': component.metadataTypeOrigin || 'Unknown'
|
343
|
+
}));
|
344
|
+
};
|
345
|
+
if (result.changed.length > 0) {
|
346
|
+
this.log('\nš Altered components:');
|
347
|
+
this.table({
|
348
|
+
data: createComponentData(result.changed)
|
349
|
+
});
|
350
|
+
}
|
351
|
+
else {
|
352
|
+
this.debugLog(`No altered components to display`);
|
353
|
+
}
|
354
|
+
if (result.deleted.length > 0) {
|
355
|
+
this.log('\nš§½ Removed components:');
|
356
|
+
this.table({
|
357
|
+
data: createComponentData(result.deleted)
|
358
|
+
});
|
359
|
+
}
|
360
|
+
if (result.error.length > 0) {
|
361
|
+
this.log('\nā Errored out Components:');
|
362
|
+
this.table({
|
363
|
+
data: createComponentData(result.error)
|
364
|
+
});
|
365
|
+
}
|
366
|
+
else {
|
367
|
+
this.debugLog(`No components with errors to display`);
|
368
|
+
}
|
369
|
+
this.debugLog(`Result table creation completed`);
|
370
|
+
}
|
371
|
+
}
|
372
|
+
//# sourceMappingURL=metadata.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../../src/commands/validate/repository/metadata.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# summary
|
2
|
+
|
3
|
+
Summary of a command.
|
4
|
+
|
5
|
+
# description
|
6
|
+
|
7
|
+
More information about a command. Don't repeat the summary.
|
8
|
+
|
9
|
+
# flags.name.summary
|
10
|
+
|
11
|
+
Description of a flag.
|
12
|
+
|
13
|
+
# flags.name.description
|
14
|
+
|
15
|
+
More information about a flag. Don't repeat the summary.
|
16
|
+
|
17
|
+
# examples
|
18
|
+
|
19
|
+
- <%= config.bin %> <%= command.id %>
|
20
|
+
|
21
|
+
|
22
|
+
# flags.folder.summary
|
23
|
+
|
24
|
+
The path to the deployment folder (ex. force-app/main/default/obects).
|