sfdx-hardis 5.37.0 → 5.37.2-beta202505262257.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/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
  Note: Can be used with `sfdx plugins:install sfdx-hardis@beta` and docker image `hardisgroupcom/sfdx-hardis@beta`
6
6
 
7
+ - New command [hardis:misc:servicenow-report](https://sfdx-hardis.cloudity.com/hardis/misc/servicenow-report/) to generate reports crossing data from a Salesforce object and related entries in ServiceNow
8
+ - Automatically open Excel report files when possible (disable with env var `NO_OPEN=true`)
9
+ - Defer the `sortCrossPlatform` operation for member lists until after all elements for a specific metadata type have been collected. Sorting is now performed only once per type improving the overall performance
10
+
11
+ ## [5.37.1] 2025-05-23
12
+
13
+ - Update PROMPT_DESCRIBE_PACKAGE
14
+ - Update common instructions about prompt reply language
15
+ - Make sure that projectName is compliant with the format of an environment variable
16
+
7
17
  ## [5.37.0] 2025-05-22
8
18
 
9
19
  - Generate and publish multilingual documentation from sfdx-hardis monitoring
@@ -0,0 +1,24 @@
1
+ import { SfCommand } from '@salesforce/sf-plugins-core';
2
+ import { AnyJson } from '@salesforce/ts-types';
3
+ export default class ServiceNowReport extends SfCommand<any> {
4
+ static title: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: any;
8
+ protected static supportsDevhubUsername: boolean;
9
+ static requiresProject: boolean;
10
+ protected configFile: string | undefined;
11
+ protected whereChoice: string | undefined;
12
+ protected outputFile: string;
13
+ protected outputFilesRes: any;
14
+ protected userStories: any[];
15
+ protected results: any[];
16
+ protected userStoriesConfig: any;
17
+ protected serviceNowConfig: any;
18
+ run(): Promise<AnyJson>;
19
+ private getServiceNowConfig;
20
+ private fetchUserStories;
21
+ private initializeConfiguration;
22
+ private buildServiceNowAuthHeaders;
23
+ private buildCsvFile;
24
+ }
@@ -0,0 +1,313 @@
1
+ /* jscpd:ignore-start */
2
+ import { SfCommand, Flags, optionalOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core';
3
+ import { Messages, SfError } from '@salesforce/core';
4
+ import { generateCsvFile, generateReportPath } from '../../../common/utils/filesUtils.js';
5
+ import { soqlQuery } from '../../../common/utils/apiUtils.js';
6
+ import axios from 'axios';
7
+ import c from 'chalk';
8
+ import { uxLog } from '../../../common/utils/index.js';
9
+ import { glob } from 'glob';
10
+ import { GLOB_IGNORE_PATTERNS } from '../../../common/utils/projectUtils.js';
11
+ import { prompts } from '../../../common/utils/prompts.js';
12
+ import fs from 'fs-extra';
13
+ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
14
+ const messages = Messages.loadMessages('sfdx-hardis', 'org');
15
+ /* jscpd:ignore-end */
16
+ export default class ServiceNowReport extends SfCommand {
17
+ static title = 'ServiceNow Report';
18
+ static description = `This command retrieves user stories from Salesforce and enriches them with data from ServiceNow.
19
+
20
+ Define the following environment variables (in CICD variables or locally in a **.env** file):
21
+
22
+ - SERVICENOW_URL: The base URL of the ServiceNow API (ex: https://your-instance.service-now.com/)
23
+ - SERVICENOW_USERNAME: The username for ServiceNow API authentication.
24
+ - SERVICENOW_PASSWORD: The password for ServiceNow API authentication.
25
+
26
+ You also need to define JSON configuration file(e) in folder **config/user-stories/**
27
+
28
+ Example:
29
+
30
+ \`\`\`json
31
+ {
32
+ "userStoriesConfig": {
33
+ "fields": [
34
+ "Id",
35
+ "Name",
36
+ "Ticket_Number__c",
37
+ "copado__User_Story_Title__c",
38
+ "CreatedBy.Name",
39
+ "copado__Release__r.Name",
40
+ "copado__Environment__r.Name"
41
+ ],
42
+ "table": "copado__User_Story__c",
43
+ "where": "copado__Environment__r.Name ='UAT'",
44
+ "whereChoices": {
45
+ "UAT all": "copado__Environment__r.Name ='UAT'",
46
+ "UAT postponed": "copado__Environment__r.Name ='UAT' AND copado__Release__r.Name = 'postponed'",
47
+ "UAT in progress": "copado__Environment__r.Name ='UAT' AND copado__Release__r.Name != 'postponed' AND copado__Release__r.Name != 'cancelled'"
48
+ },
49
+ "orderBy": "Ticket_Number__c ASC",
50
+ "ticketField": "Ticket_Number__c",
51
+ "reportFields": [
52
+ { "key": "US Name", "path": "Name" },
53
+ { "key": "US SN Identifier", "path": "Ticket_Number__c" },
54
+ { "key": "US Title", "path": "copado__User_Story_Title__c" },
55
+ { "key": "US Created By", "path": "CreatedBy.Name" },
56
+ { "key": "US Environment", "path": "copado__Environment__r.Name" },
57
+ { "key": "US Release", "path": "copado__Release__r.Name" },
58
+ { "key": "SN Identifier", "path": "serviceNowInfo.number", "default": "NOT FOUND" },
59
+ { "key": "SN Title", "path": "serviceNowInfo.short_description", "default": "NOT FOUND" },
60
+ { "key": "SN Status", "path": "serviceNowInfo.state", "default": "NOT FOUND" },
61
+ { "key": "SN Created By", "path": "serviceNowInfo.sys_created_by", "default": "NOT FOUND" },
62
+ { "key": "SN URL", "special": "serviceNowTicketUrl" }
63
+ ]
64
+ },
65
+ "serviceNowConfig": {
66
+ "tables": [
67
+ { "tableName": "demand" },
68
+ { "tableName": "incident" }
69
+ ]
70
+ }
71
+ }
72
+ \`\`\`
73
+ `;
74
+ static examples = ['$ sf hardis:misc:servicenow-report'];
75
+ /* jscpd:ignore-start */
76
+ static flags = {
77
+ config: Flags.string({
78
+ char: 'c',
79
+ description: 'Path to JSON config file containing user stories and ServiceNow configuration',
80
+ }),
81
+ 'where-choice': Flags.string({
82
+ char: 'w',
83
+ description: 'Where selection for user stories. If not provided, you will be prompted to select one from the config file.',
84
+ }),
85
+ outputfile: Flags.string({
86
+ char: 'f',
87
+ description: 'Force the path and name of output report file. Must end with .csv',
88
+ }),
89
+ debug: Flags.boolean({
90
+ char: 'd',
91
+ default: false,
92
+ description: messages.getMessage('debugMode'),
93
+ }),
94
+ websocket: Flags.string({
95
+ description: messages.getMessage('websocket'),
96
+ }),
97
+ skipauth: Flags.boolean({
98
+ description: 'Skip authentication check when a default username is required',
99
+ }),
100
+ 'target-org': optionalOrgFlagWithDeprecations,
101
+ };
102
+ /* jscpd:ignore-end */
103
+ static supportsDevhubUsername = false;
104
+ // Set this to true if your command requires a project workspace; 'requiresProject' is false by default
105
+ static requiresProject = true;
106
+ configFile;
107
+ whereChoice;
108
+ outputFile;
109
+ outputFilesRes = {};
110
+ userStories = [];
111
+ results = [];
112
+ userStoriesConfig = {
113
+ fields: [
114
+ 'Id',
115
+ 'Name',
116
+ 'Ticket_Number__c',
117
+ 'copado__User_Story_Title__c',
118
+ 'CreatedBy.Name',
119
+ 'copado__Release__r.Name',
120
+ 'copado__Environment__r.Name',
121
+ ],
122
+ table: 'copado__User_Story__c',
123
+ where: "copado__Environment__r.Name ='UAT'",
124
+ whereChoices: {
125
+ 'UAT all': "copado__Environment__r.Name ='UAT'",
126
+ 'UAT postponed': "copado__Environment__r.Name ='UAT' AND copado__Release__r.Name = 'postponed'",
127
+ 'UAT in progress': "copado__Environment__r.Name ='UAT' AND copado__Release__r.Name != 'postponed' AND copado__Release__r.Name != 'cancelled'"
128
+ },
129
+ orderBy: 'Ticket_Number__c ASC',
130
+ ticketField: 'Ticket_Number__c',
131
+ reportFields: [
132
+ { key: 'US Name', path: 'Name' },
133
+ { key: 'US SN Identifier', path: 'Ticket_Number__c' },
134
+ { key: 'US Title', path: 'copado__User_Story_Title__c' },
135
+ { key: 'US Created By', path: 'CreatedBy.Name' },
136
+ { key: 'US Environment', path: 'copado__Environment__r.Name' },
137
+ { key: 'US Release', path: 'copado__Release__r.Name' },
138
+ { key: 'SN Identifier', path: 'serviceNowInfo.number', default: 'NOT FOUND' },
139
+ { key: 'SN Title', path: 'serviceNowInfo.short_description', default: 'NOT FOUND' },
140
+ { key: 'SN Status', path: 'serviceNowInfo.state', default: 'NOT FOUND' },
141
+ { key: 'SN Created By', path: 'serviceNowInfo.sys_created_by', default: 'NOT FOUND' },
142
+ { key: 'SN URL', special: 'serviceNowTicketUrl' }
143
+ ]
144
+ };
145
+ serviceNowConfig = {
146
+ tables: [
147
+ { tableName: 'demand' },
148
+ { tableName: 'incident' },
149
+ ]
150
+ };
151
+ async run() {
152
+ const { flags } = await this.parse(ServiceNowReport);
153
+ this.configFile = flags.config;
154
+ this.whereChoice = flags['where-choice'];
155
+ this.outputFile = flags.outputfile || null;
156
+ await this.initializeConfiguration();
157
+ const conn = flags['target-org']?.getConnection();
158
+ // List user stories matching with criteria
159
+ const ticketNumbers = await this.fetchUserStories(conn);
160
+ // Get matching demands and incidents from ServiceNow API with axios using ticket numbers
161
+ const { serviceNowUrl, serviceNowApiOptions } = this.getServiceNowConfig();
162
+ // Check each service now table to get the tickets infos
163
+ for (const table of this.serviceNowConfig.tables) {
164
+ const serviceNowApiResource = `/api/now/table/${table.tableName}`;
165
+ const serviceNowApiQuery = `?sysparm_query=numberIN${ticketNumbers.join(',')}&sysparm_display_value=true`;
166
+ const serviceNowApiUrlWithQuery = `${serviceNowUrl}${serviceNowApiResource}${serviceNowApiQuery}`;
167
+ // Make API call to ServiceNow
168
+ uxLog(this, `Fetching Service now using query: ${serviceNowApiUrlWithQuery}`);
169
+ let serviceNowApiRes;
170
+ try {
171
+ serviceNowApiRes = await axios.get(serviceNowApiUrlWithQuery, serviceNowApiOptions);
172
+ }
173
+ catch (error) {
174
+ uxLog(this, c.red(`ServiceNow API call failed: ${error.message}\n${JSON.stringify(error?.response?.data || {})}`));
175
+ continue;
176
+ }
177
+ // Complete user stories with ServiceNow data
178
+ const serviceNowRecords = serviceNowApiRes.data.result;
179
+ uxLog(this, `ServiceNow API call succeeded: ${serviceNowRecords.length} records found`);
180
+ for (const userStory of this.userStories) {
181
+ const ticketNumber = userStory?.[this.userStoriesConfig.ticketField];
182
+ const serviceNowRecord = serviceNowRecords.find((record) => record.number === ticketNumber);
183
+ if (serviceNowRecord) {
184
+ userStory.serviceNowInfo = serviceNowRecord;
185
+ userStory.serviceNowTableName = table.tableName;
186
+ }
187
+ }
188
+ }
189
+ // Build final result
190
+ this.results = this.userStories.map((userStory) => {
191
+ const serviceNowInfo = userStory.serviceNowInfo || {};
192
+ // Build result object dynamically based on config
193
+ const result = {};
194
+ for (const field of this.userStoriesConfig.reportFields) {
195
+ if (field.special === "serviceNowTicketUrl") {
196
+ if (!serviceNowInfo.sys_id) {
197
+ result[field.key] = 'NOT FOUND';
198
+ }
199
+ else {
200
+ result[field.key] = `${process.env.SERVICENOW_URL}/nav_to.do?uri=/${userStory.serviceNowTableName}.do?sys_id=${serviceNowInfo.sys_id}`;
201
+ }
202
+ }
203
+ else if (field.path) {
204
+ // Support nested paths like "CreatedBy.Name" or "serviceNowInfo.number"
205
+ const value = field.path.split('.').reduce((obj, prop) => obj && obj[prop], { ...userStory, serviceNowInfo });
206
+ result[field.key] = value !== undefined && value !== null ? value : (field.default ?? 'NOT FOUND');
207
+ }
208
+ }
209
+ return result;
210
+ });
211
+ uxLog(this, c.grey(JSON.stringify(this.results, null, 2)));
212
+ // Generate CSV file
213
+ await this.buildCsvFile();
214
+ return { results: this.results, outputFilesRes: this.outputFilesRes };
215
+ }
216
+ getServiceNowConfig() {
217
+ const serviceNowUrl = process.env.SERVICENOW_URL;
218
+ if (!serviceNowUrl) {
219
+ throw new SfError('ServiceNow API URL is not set. Please set SERVICENOW_URL environment variable.');
220
+ }
221
+ const serviceNowApiUser = process.env.SERVICENOW_USERNAME || '';
222
+ const serviceNowApiPassword = process.env.SERVICENOW_PASSWORD || '';
223
+ const serviceNowApiHeaders = {
224
+ 'Content-Type': 'application/json',
225
+ Accept: 'application/json',
226
+ };
227
+ const serviceNowApiOptions = this.buildServiceNowAuthHeaders(serviceNowApiHeaders, serviceNowApiUser, serviceNowApiPassword);
228
+ return { serviceNowUrl, serviceNowApiOptions };
229
+ }
230
+ async fetchUserStories(conn) {
231
+ if (this.userStoriesConfig.whereChoices) {
232
+ // If whereChoices is defined, use the provided whereChoice flag or prompt user to select one
233
+ if (this.whereChoice) {
234
+ // If whereChoice is provided, use it directly
235
+ this.userStoriesConfig.where = this.userStoriesConfig.whereChoices[this.whereChoice];
236
+ }
237
+ else {
238
+ // If whereChoice is not provided, prompt user to select one
239
+ uxLog(this, c.yellow('No WHERE choice provided. Please select one from the available choices.'));
240
+ // If whereChoices is defined, prompt user to select one
241
+ const whereChoices = Object.keys(this.userStoriesConfig.whereChoices).map((key) => ({
242
+ title: key,
243
+ description: this.userStoriesConfig.whereChoices[key],
244
+ value: key,
245
+ }));
246
+ const whereChoiceRes = await prompts({
247
+ type: 'select',
248
+ message: 'Select a WHERE condition for user stories:',
249
+ choices: whereChoices,
250
+ });
251
+ this.whereChoice = whereChoiceRes.value;
252
+ this.userStoriesConfig.where = this.userStoriesConfig.whereChoices[this.whereChoice || ''];
253
+ }
254
+ }
255
+ const userStoriesQuery = `SELECT ${this.userStoriesConfig.fields.join(', ')} FROM ${this.userStoriesConfig.table} WHERE ${this.userStoriesConfig.where} ORDER BY ${this.userStoriesConfig.orderBy}`;
256
+ const userStoriesRes = await soqlQuery(userStoriesQuery, conn);
257
+ this.userStories = userStoriesRes.records;
258
+ // Get list of tickets from user stories
259
+ const ticketNumbers = userStoriesRes.records.map((record) => record?.[this.userStoriesConfig.ticketField]);
260
+ return ticketNumbers;
261
+ }
262
+ async initializeConfiguration() {
263
+ if (!this.configFile) {
264
+ // If no config file is provided, prompt users to select a JSON file in all files found in folder config/user-stories/
265
+ const configFiles = await glob('config/user-stories/*.json', { cwd: process.cwd(), ignore: GLOB_IGNORE_PATTERNS });
266
+ if (configFiles.length === 0) {
267
+ uxLog(this, c.yellow('No configuration files found in config/user-stories/ directory. Using default config...'));
268
+ }
269
+ else if (configFiles.length === 1) {
270
+ this.configFile = configFiles[0];
271
+ uxLog(this, `Single config file found: ${this.configFile}`);
272
+ }
273
+ else {
274
+ // If multiple files are found, prompt user to select one
275
+ const configFileRes = await prompts({
276
+ type: 'select',
277
+ message: 'Multiple configuration files found. Please select one:',
278
+ choices: configFiles.map((file) => ({ title: file, value: file })),
279
+ });
280
+ this.configFile = configFileRes.value;
281
+ }
282
+ }
283
+ if (this.configFile) {
284
+ // Load configuration from JSON file
285
+ try {
286
+ const configData = await fs.readJSON(this.configFile);
287
+ this.userStoriesConfig = configData.userStoriesConfig || this.userStoriesConfig;
288
+ this.serviceNowConfig = configData.serviceNowConfig || this.serviceNowConfig;
289
+ uxLog(this, `Configuration loaded from ${this.configFile}`);
290
+ }
291
+ catch (error) {
292
+ throw new SfError(`Failed to load configuration file: ${error.message}`);
293
+ }
294
+ }
295
+ }
296
+ buildServiceNowAuthHeaders(serviceNowApiHeaders, serviceNowApiUser, serviceNowApiPassword) {
297
+ if (!serviceNowApiUser || !serviceNowApiPassword) {
298
+ throw new SfError('ServiceNow API credentials are not set. Please set SERVICENOW_USERNAME and SERVICENOW_PASSWORD environment variables.');
299
+ }
300
+ return {
301
+ headers: serviceNowApiHeaders,
302
+ auth: {
303
+ username: serviceNowApiUser,
304
+ password: serviceNowApiPassword,
305
+ },
306
+ };
307
+ }
308
+ async buildCsvFile() {
309
+ this.outputFile = await generateReportPath('user-story-report' + (this.whereChoice ? `-${this.whereChoice}` : ''), this.outputFile, { withDate: true });
310
+ this.outputFilesRes = await generateCsvFile(this.results, this.outputFile);
311
+ }
312
+ }
313
+ //# sourceMappingURL=servicenow-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servicenow-report.js","sourceRoot":"","sources":["../../../../src/commands/hardis/misc/servicenow-report.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { prompts } from '../../../common/utils/prompts.js';
6
6
  import c from 'chalk';
7
7
  import fs from 'fs-extra';
8
8
  import * as path from 'path';
9
- import { CONSTANTS, getConfig, setConfig } from '../../../config/index.js';
9
+ import { CONSTANTS, getConfig, promptForProjectName, setConfig } from '../../../config/index.js';
10
10
  import { WebSocketClient } from '../../../common/websocketClient.js';
11
11
  import { isSfdxProject } from '../../../common/utils/projectUtils.js';
12
12
  import { PACKAGE_ROOT_DIR } from '../../../settings.js';
@@ -69,14 +69,11 @@ export default class ProjectCreate extends SfCommand {
69
69
  // Project name
70
70
  let config = await getConfig('project');
71
71
  let projectName = config.projectName;
72
+ let setProjectName = false;
72
73
  if (projectName == null) {
73
74
  // User prompts
74
- const projectRes = await prompts({
75
- type: 'text',
76
- name: 'projectName',
77
- message: 'What is the name of your project ? (example: MyClient)',
78
- });
79
- projectName = projectRes.projectName.toLowerCase().replace(' ', '_');
75
+ projectName = await promptForProjectName();
76
+ setProjectName = true;
80
77
  }
81
78
  // Create sfdx project only if not existing
82
79
  if (!isSfdxProject()) {
@@ -95,6 +92,9 @@ export default class ProjectCreate extends SfCommand {
95
92
  // Copy default project files
96
93
  uxLog(this, 'Copying default files...');
97
94
  await fs.copy(path.join(PACKAGE_ROOT_DIR, 'defaults/ci', '.'), process.cwd(), { overwrite: false });
95
+ if (setProjectName) {
96
+ await setConfig('project', { projectName: projectName });
97
+ }
98
98
  config = await getConfig('project');
99
99
  if (config.developmentBranch == null) {
100
100
  // User prompts
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/hardis/project/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/hardis/project/create.ts"],"names":[],"mappings":"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"}
@@ -27,10 +27,10 @@ const template = {
27
27
  - If you found the package's official documentation, summarize its key features and functionalities.
28
28
  - If you can not find the package's official documentation, provide a general overview based on the package attributes and its metadata components (but do not output the list of metadatas, it will be for paragraph 2).
29
29
  - Include any relevant information about the package's intended use cases or target audience.
30
- - If you can find other relevant information about the package, like articles or blog posts, provide them as a list of links
31
- - If you find the AppExchange page, include it in your response.
32
- - If you find the package's GitHub repository, include it in your response.
33
- - If you find the vendor information, include it in your response.
30
+ - If you can find other relevant information about the package, like articles or blog posts, in english or in the prompt reply language, provide them as a list of links
31
+ - If you find the AppExchange page, include it in your response. Otherwise, don't mention it.
32
+ - If you find the package's GitHub repository, include it in your response. Otherwise, don't mention it.
33
+ - If you find the vendor information, include it in your response. Otherwise, don't mention it.
34
34
  - Make sure that hyperlinks are not dead links leading to 404 pages.
35
35
 
36
36
  2. **Package Metadata**:
@@ -56,7 +56,7 @@ const template = {
56
56
 
57
57
  - There are also many open-source packages available on GitHub (github.com)
58
58
 
59
- - Other relevant sources for articles or blog posts about the package may include the vendor's website, community forums, or Salesforce-related blogs, like Salesforce Ben or medium.com.
59
+ - Other relevant sources for articles or blog posts about the package may include the vendor's website, community forums, or Salesforce-related blogs, like Salesforce Ben or medium.com. Do not mention these source if you don't have a direct link to a page explicitly related to package "{{PACKAGE_NAME}}".
60
60
 
61
61
  \nCaution: Redact any sensitive information and replace with \`[REDACTED]\`. Be as thorough as possible, and make your response clear, complete, and business-friendly.
62
62
  `,
@@ -39,7 +39,7 @@ export function buildPromptFromTemplate(template, variables) {
39
39
  }
40
40
  }
41
41
  const promptsLanguage = UtilsAi.getPromptsLanguage();
42
- let prompt = process.env?.[template] || templateData.text?.[promptsLanguage] || (templateData.text?.["en"] + `\nPlease answer using the language corresponding to "${promptsLanguage}"`);
42
+ let prompt = process.env?.[template] || templateData.text?.[promptsLanguage] || (templateData.text?.["en"] + `\n\nIMPORTANT: Please reply in the language corresponding to ISO code "${promptsLanguage}" (for example, in french for "fr", in english for "en", in german for "de", etc.)`);
43
43
  for (const variable in variables) {
44
44
  prompt = prompt.replaceAll(`{{${variable}}}`, variables[variable]);
45
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"promptTemplates.js","sourceRoot":"","sources":["../../../src/common/aiProvider/promptTemplates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"promptTemplates.js","sourceRoot":"","sources":["../../../src/common/aiProvider/promptTemplates.ts"],"names":[],"mappings":"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"}
@@ -887,7 +887,7 @@ export async function buildOrgManifest(targetOrgUsernameAlias, packageXmlOutputF
887
887
  // Add member in existing types
888
888
  const members = matchTypes[0].members || [];
889
889
  members.push(element.fullName);
890
- matchTypes[0].members = sortCrossPlatform(members);
890
+ matchTypes[0].members = members;
891
891
  parsedPackageXml.Package.types = parsedPackageXml.Package.types.map((type) => type.name[0] === matchTypes[0].name ? matchTypes[0] : type);
892
892
  }
893
893
  else {
@@ -899,6 +899,14 @@ export async function buildOrgManifest(targetOrgUsernameAlias, packageXmlOutputF
899
899
  parsedPackageXml.Package.types.push(newType);
900
900
  }
901
901
  }
902
+ // Sort members only for the types that were potentially modified
903
+ for (const mdType of mdTypes) { // mdTypes is [{ type: 'ListView' }, { type: 'CustomLabel' }]
904
+ const typeName = mdType.type;
905
+ const matchedType = parsedPackageXml.Package.types.find(t => t.name[0] === typeName);
906
+ if (matchedType && matchedType.members && Array.isArray(matchedType.members)) {
907
+ matchedType.members = sortCrossPlatform(matchedType.members);
908
+ }
909
+ }
902
910
  // Complete with missing WaveDataflow Ids build from WaveRecipe Ids
903
911
  const waveRecipeTypeList = parsedPackageXml.Package.types.filter((type) => type.name[0] === 'WaveRecipe');
904
912
  if (waveRecipeTypeList.length === 1) {