@salesforce/plugin-omnistudio-migration-tool 2.0.0-preview.29 → 2.0.0-preview.31

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.
Files changed (35) hide show
  1. package/README.md +89 -0
  2. package/lib/commands/omnistudio/migration/clean.d.ts +13 -0
  3. package/lib/commands/omnistudio/migration/clean.js +160 -0
  4. package/lib/commands/omnistudio/migration/clean.js.map +1 -0
  5. package/lib/commands/omnistudio/migration/migrate.js +11 -1
  6. package/lib/commands/omnistudio/migration/migrate.js.map +1 -1
  7. package/lib/migration/postMigrate.js +2 -0
  8. package/lib/migration/postMigrate.js.map +1 -1
  9. package/lib/migration/premigrate.d.ts +2 -0
  10. package/lib/migration/premigrate.js +53 -7
  11. package/lib/migration/premigrate.js.map +1 -1
  12. package/lib/utils/config/ExistingRecordCleanupService.d.ts +30 -0
  13. package/lib/utils/config/ExistingRecordCleanupService.js +266 -0
  14. package/lib/utils/config/ExistingRecordCleanupService.js.map +1 -0
  15. package/lib/utils/config/OmniStudioMetadataCleanupService.js +9 -8
  16. package/lib/utils/config/OmniStudioMetadataCleanupService.js.map +1 -1
  17. package/lib/utils/config/SpecialCharacterRecordCleanupService.d.ts +17 -0
  18. package/lib/utils/config/SpecialCharacterRecordCleanupService.js +186 -0
  19. package/lib/utils/config/SpecialCharacterRecordCleanupService.js.map +1 -0
  20. package/lib/utils/constants/stringContants.d.ts +17 -0
  21. package/lib/utils/constants/stringContants.js +20 -1
  22. package/lib/utils/constants/stringContants.js.map +1 -1
  23. package/lib/utils/generatePackageXml.d.ts +2 -0
  24. package/lib/utils/generatePackageXml.js +40 -4
  25. package/lib/utils/generatePackageXml.js.map +1 -1
  26. package/lib/utils/resultsbuilder/index.d.ts +11 -2
  27. package/lib/utils/resultsbuilder/index.js +100 -86
  28. package/lib/utils/resultsbuilder/index.js.map +1 -1
  29. package/lib/utils/sfcli/project/sfProject.d.ts +1 -0
  30. package/lib/utils/sfcli/project/sfProject.js +4 -0
  31. package/lib/utils/sfcli/project/sfProject.js.map +1 -1
  32. package/messages/clean.json +40 -0
  33. package/messages/migrate.json +6 -0
  34. package/oclif.manifest.json +1 -1
  35. package/package.json +3 -3
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Constants = void 0;
3
+ exports.Status = exports.Constants = void 0;
4
4
  exports.Constants = {
5
5
  // short form of the omni components
6
6
  Omniscript: 'os',
@@ -67,5 +67,24 @@ exports.Constants = {
67
67
  // Generic Constants
68
68
  On: 'on',
69
69
  Off: 'off',
70
+ // SObject API names
71
+ OmniProcessObjectName: 'OmniProcess',
72
+ OmniUiCardObjectName: 'OmniUiCard',
73
+ OmniDataTransformObjectName: 'OmniDataTransform',
74
+ // Config table names
75
+ OmniScriptConfigTable: 'OmniScriptConfig',
76
+ OmniIntegrationProcConfigTable: 'OmniIntegrationProcConfig',
77
+ OmniDataTransformConfigTable: 'OmniDataTransformConfig',
78
+ OmniUiCardConfigTable: 'OmniUiCardConfig',
79
+ };
80
+ exports.Status = {
81
+ SuccessfullyMigrated: 'Successfully migrated',
82
+ Failed: 'Failed',
83
+ Skipped: 'Skipped',
84
+ Complete: 'Complete',
85
+ ReadyForMigration: 'Ready for migration',
86
+ NeedsManualIntervention: 'Needs manual intervention',
87
+ ManualDeploymentNeeded: 'Manual deployment needed',
88
+ SuccessfullyCompleted: 'Successfully Completed',
70
89
  };
71
90
  //# sourceMappingURL=stringContants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stringContants.js","sourceRoot":"","sources":["../../../src/utils/constants/stringContants.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG;IACvB,oCAAoC;IACpC,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,oBAAoB,EAAE,IAAI;IAC1B,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAAE,YAAY;IAC9B,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IAEpB,mCAAmC;IACnC,uBAAuB,EAAE,YAAY;IACrC,oBAAoB,EAAE,aAAa;IACnC,qBAAqB,EAAE,UAAU;IACjC,kBAAkB,EAAE,WAAW;IAC/B,iCAAiC,EAAE,sBAAsB;IACzD,8BAA8B,EAAE,uBAAuB;IACvD,uBAAuB,EAAE,YAAY;IACrC,oBAAoB,EAAE,aAAa;IACnC,6BAA6B,EAAE,yBAAyB;IACxD,0BAA0B,EAAE,mBAAmB;IAC/C,uBAAuB,EAAE,YAAY;IACrC,gBAAgB,EAAE,yBAAyB;IAC3C,iBAAiB,EAAE,cAAc;IACjC,wBAAwB,EAAE,cAAc;IACxC,qBAAqB,EAAE,eAAe;IACtC,eAAe,EAAE,QAAQ;IACzB,iBAAiB,EAAE,UAAU;IAC7B,uBAAuB,EAAE,aAAa;IACtC,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IAExB,2CAA2C;IAC3C,0BAA0B,EAAE,8BAA8B;IAC1D,qBAAqB,EAAE,yBAAyB;IAChD,yBAAyB,EAAE,6BAA6B;IACxD,oBAAoB,EAAE,wBAAwB;IAC9C,uBAAuB,EAAE,2BAA2B;IACpD,sBAAsB,EAAE,0BAA0B;IAClD,uBAAuB,EAAE,2BAA2B;IACpD,oBAAoB,EAAE,eAAe;IACrC,mBAAmB,EAAE,oBAAoB;IACzC,UAAU,EAAE,aAAa;IACzB,SAAS,EAAE,YAAY;IACvB,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,MAAM;IACnB,2BAA2B,EAAE,gCAAgC;IAE7D,qCAAqC;IACrC,2BAA2B,EAAE,oBAAoB;IACjD,0BAA0B,EAAE,kBAAkB;IAE9C,0CAA0C;IAC1C,0BAA0B,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;IAClD,sBAAsB,EAAE,OAAO;IAC/B,0BAA0B,EAAE,WAAW;IACvC,2BAA2B,EAAE,YAAY;IAEzC,oBAAoB;IACpB,qBAAqB,EAAE,YAAY;IAEnC,oBAAoB;IACpB,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;CACX,CAAC"}
1
+ {"version":3,"file":"stringContants.js","sourceRoot":"","sources":["../../../src/utils/constants/stringContants.ts"],"names":[],"mappings":";;;AAAa,QAAA,SAAS,GAAG;IACvB,oCAAoC;IACpC,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,oBAAoB,EAAE,IAAI;IAC1B,UAAU,EAAE,IAAI;IAChB,gBAAgB,EAAE,YAAY;IAC9B,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IAEpB,mCAAmC;IACnC,uBAAuB,EAAE,YAAY;IACrC,oBAAoB,EAAE,aAAa;IACnC,qBAAqB,EAAE,UAAU;IACjC,kBAAkB,EAAE,WAAW;IAC/B,iCAAiC,EAAE,sBAAsB;IACzD,8BAA8B,EAAE,uBAAuB;IACvD,uBAAuB,EAAE,YAAY;IACrC,oBAAoB,EAAE,aAAa;IACnC,6BAA6B,EAAE,yBAAyB;IACxD,0BAA0B,EAAE,mBAAmB;IAC/C,uBAAuB,EAAE,YAAY;IACrC,gBAAgB,EAAE,yBAAyB;IAC3C,iBAAiB,EAAE,cAAc;IACjC,wBAAwB,EAAE,cAAc;IACxC,qBAAqB,EAAE,eAAe;IACtC,eAAe,EAAE,QAAQ;IACzB,iBAAiB,EAAE,UAAU;IAC7B,uBAAuB,EAAE,aAAa;IACtC,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,kBAAkB;IACpC,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IAExB,2CAA2C;IAC3C,0BAA0B,EAAE,8BAA8B;IAC1D,qBAAqB,EAAE,yBAAyB;IAChD,yBAAyB,EAAE,6BAA6B;IACxD,oBAAoB,EAAE,wBAAwB;IAC9C,uBAAuB,EAAE,2BAA2B;IACpD,sBAAsB,EAAE,0BAA0B;IAClD,uBAAuB,EAAE,2BAA2B;IACpD,oBAAoB,EAAE,eAAe;IACrC,mBAAmB,EAAE,oBAAoB;IACzC,UAAU,EAAE,aAAa;IACzB,SAAS,EAAE,YAAY;IACvB,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,MAAM;IACnB,2BAA2B,EAAE,gCAAgC;IAE7D,qCAAqC;IACrC,2BAA2B,EAAE,oBAAoB;IACjD,0BAA0B,EAAE,kBAAkB;IAE9C,0CAA0C;IAC1C,0BAA0B,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;IAClD,sBAAsB,EAAE,OAAO;IAC/B,0BAA0B,EAAE,WAAW;IACvC,2BAA2B,EAAE,YAAY;IAEzC,oBAAoB;IACpB,qBAAqB,EAAE,YAAY;IAEnC,oBAAoB;IACpB,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IAEV,oBAAoB;IACpB,qBAAqB,EAAE,aAAa;IACpC,oBAAoB,EAAE,YAAY;IAClC,2BAA2B,EAAE,mBAAmB;IAEhD,qBAAqB;IACrB,qBAAqB,EAAE,kBAAkB;IACzC,8BAA8B,EAAE,2BAA2B;IAC3D,4BAA4B,EAAE,yBAAyB;IACvD,qBAAqB,EAAE,kBAAkB;CAC1C,CAAC;AAEW,QAAA,MAAM,GAAG;IACpB,oBAAoB,EAAE,uBAAuB;IAC7C,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,UAAU;IACpB,iBAAiB,EAAE,qBAAqB;IACxC,uBAAuB,EAAE,2BAA2B;IACpD,sBAAsB,EAAE,0BAA0B;IAClD,qBAAqB,EAAE,wBAAwB;CAChD,CAAC"}
@@ -2,7 +2,9 @@ import { Messages } from '@salesforce/core';
2
2
  import { ApexAssessmentInfo, ExperienceSiteAssessmentInfo, FlexiPageAssessmentInfo, LWCAssessmentInfo } from './interfaces';
3
3
  export declare class generatePackageXml {
4
4
  static createChangeList(apexAssementInfos: ApexAssessmentInfo[], lwcAssessmentInfos: LWCAssessmentInfo[], experienceSiteAssessmentInfo: ExperienceSiteAssessmentInfo[], flexipageAssessmentInfos: FlexiPageAssessmentInfo[], version: string, messages: Messages<string>): void;
5
+ static createOmnistudioDeploymentXml(apexAssementInfos: ApexAssessmentInfo[], lwcAssessmentInfos: LWCAssessmentInfo[], experienceSiteAssessmentInfo: ExperienceSiteAssessmentInfo[], flexipageAssessmentInfos: FlexiPageAssessmentInfo[], version: string): void;
5
6
  static backupChangeList(apexClasses: string[], lwcComponents: string[]): void;
7
+ private static getRelatedObjectsXml;
6
8
  private static getXmlElementforMembers;
7
9
  private static getExperienceSiteXml;
8
10
  private static getFlexipageXml;
@@ -41,10 +41,7 @@ class generatePackageXml {
41
41
  // Method to generate package.xml with additional types
42
42
  static createChangeList(apexAssementInfos, lwcAssessmentInfos, experienceSiteAssessmentInfo, flexipageAssessmentInfos, version, messages) {
43
43
  fs.rmSync(path.join(process.cwd(), 'package.xml'), { force: true });
44
- const apexXml = generatePackageXml.getXmlElementforMembers(this.getApexclasses(apexAssementInfos), 'ApexClass');
45
- const lwcXml = generatePackageXml.getXmlElementforMembers(this.getLwcs(lwcAssessmentInfos), 'LightningComponentBundle');
46
- const expsiteXml = generatePackageXml.getXmlElementforMembers(this.getExperienceSiteXml(experienceSiteAssessmentInfo), 'ExperienceBundle');
47
- const flexipageXml = generatePackageXml.getXmlElementforMembers(this.getFlexipageXml(flexipageAssessmentInfos), 'FlexiPage');
44
+ const { apexXml, lwcXml, expsiteXml, flexipageXml } = generatePackageXml.getRelatedObjectsXml(apexAssementInfos, lwcAssessmentInfos, experienceSiteAssessmentInfo, flexipageAssessmentInfos);
48
45
  if (!apexXml && !lwcXml && !expsiteXml && !flexipageXml) {
49
46
  logger_1.Logger.warn(messages.getMessage('noMetadataToDeploy'));
50
47
  return;
@@ -62,6 +59,37 @@ class generatePackageXml {
62
59
  const filePath = path.join(process.cwd(), 'package.xml');
63
60
  fs.writeFileSync(filePath, packageXmlContent.trim());
64
61
  }
62
+ // Generates OmnistudioDeployment.xml containing OmniStudio components and related objects
63
+ static createOmnistudioDeploymentXml(apexAssementInfos, lwcAssessmentInfos, experienceSiteAssessmentInfo, flexipageAssessmentInfos, version) {
64
+ fs.rmSync(path.join(process.cwd(), 'OmnistudioDeployment.xml'), { force: true });
65
+ // Related objects XML
66
+ const { apexXml, lwcXml, expsiteXml, flexipageXml } = generatePackageXml.getRelatedObjectsXml(apexAssementInfos, lwcAssessmentInfos, experienceSiteAssessmentInfo, flexipageAssessmentInfos);
67
+ // OmniStudio components XML (always included)
68
+ const omniScriptXml = generatePackageXml.getXmlElementforMembers(['*'], 'OmniScript');
69
+ const omniUiCardXml = generatePackageXml.getXmlElementforMembers(['*'], 'OmniUiCard');
70
+ const omniDataTransformXml = generatePackageXml.getXmlElementforMembers(['*'], 'OmniDataTransform');
71
+ const omniIntegrationProcedureXml = generatePackageXml.getXmlElementforMembers(['*'], 'OmniIntegrationProcedure');
72
+ const customLabelsXml = generatePackageXml.getXmlElementforMembers(['*'], 'CustomLabels');
73
+ // Build array of non-empty XML sections to avoid blank lines and ensure proper spacing
74
+ const xmlSections = [
75
+ apexXml,
76
+ lwcXml,
77
+ expsiteXml,
78
+ flexipageXml,
79
+ omniScriptXml,
80
+ omniUiCardXml,
81
+ omniDataTransformXml,
82
+ omniIntegrationProcedureXml,
83
+ customLabelsXml,
84
+ ].filter((xml) => xml && xml.trim().length > 0);
85
+ const packageXmlContent = `<?xml version="1.0" encoding="UTF-8"?>
86
+ <Package xmlns="http://soap.sforce.com/2006/04/metadata">
87
+ ${xmlSections.join('\n ')}
88
+ <version>${version}</version>
89
+ </Package>`;
90
+ const filePath = path.join(process.cwd(), 'OmnistudioDeployment.xml');
91
+ fs.writeFileSync(filePath, packageXmlContent.trim());
92
+ }
65
93
  // Backup method without additional types
66
94
  static backupChangeList(apexClasses, lwcComponents) {
67
95
  const apexXml = generatePackageXml.getXmlElementforMembers(apexClasses, 'ApexClass');
@@ -77,6 +105,14 @@ class generatePackageXml {
77
105
  const filePath = path.join(__dirname, 'backup-package.xml');
78
106
  fs.writeFileSync(filePath, packageXmlContent.trim());
79
107
  }
108
+ // Helper method to generate XML for related objects
109
+ static getRelatedObjectsXml(apexAssementInfos, lwcAssessmentInfos, experienceSiteAssessmentInfo, flexipageAssessmentInfos) {
110
+ const apexXml = generatePackageXml.getXmlElementforMembers(this.getApexclasses(apexAssementInfos), 'ApexClass');
111
+ const lwcXml = generatePackageXml.getXmlElementforMembers(this.getLwcs(lwcAssessmentInfos), 'LightningComponentBundle');
112
+ const expsiteXml = generatePackageXml.getXmlElementforMembers(this.getExperienceSiteXml(experienceSiteAssessmentInfo), 'ExperienceBundle');
113
+ const flexipageXml = generatePackageXml.getXmlElementforMembers(this.getFlexipageXml(flexipageAssessmentInfos), 'FlexiPage');
114
+ return { apexXml, lwcXml, expsiteXml, flexipageXml };
115
+ }
80
116
  static getXmlElementforMembers(members, type) {
81
117
  if (!members || members.length === 0)
82
118
  return '';
@@ -1 +1 @@
1
- {"version":3,"file":"generatePackageXml.js","sourceRoot":"","sources":["../../src/utils/generatePackageXml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generatePackageXml.js","sourceRoot":"","sources":["../../src/utils/generatePackageXml.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,9 @@ export declare class ResultsBuilder {
8
8
  private static flexiPageFileSuffix;
9
9
  private static successStatus;
10
10
  private static errorStatus;
11
- static generateReport(results: MigratedObject[], relatedObjectMigrationResult: RelatedObjectAssesmentInfo, instanceUrl: string, orgDetails: OmnistudioOrgDetails, messages: Messages<string>, actionItems: string[], objectsToProcess: string[], migrateOnly: string): Promise<void>;
11
+ /** Set at report generation start; used to show "Manual deployment needed" when deployment failed */
12
+ private static deploymentFailed;
13
+ static generateReport(results: MigratedObject[], relatedObjectMigrationResult: RelatedObjectAssesmentInfo, instanceUrl: string, orgDetails: OmnistudioOrgDetails, messages: Messages<string>, actionItems: string[], objectsToProcess: string[], migrateOnly: string, deploymentFailed?: boolean): Promise<void>;
12
14
  private static generateReportForResult;
13
15
  private static getHeaderGroupsForReport;
14
16
  private static getNameHeaders;
@@ -29,12 +31,19 @@ export declare class ResultsBuilder {
29
31
  private static getDifferentStatusDataForResult;
30
32
  private static getCustomLabelStatusData;
31
33
  private static getDifferentStatusDataForApex;
34
+ private static buildStatusSummary;
35
+ private static countStatusesFromItems;
32
36
  private static getDifferentStatusDataForFlexipage;
33
37
  private static getDifferentStatusDataForLwc;
34
38
  private static getDifferentStatusDataForExperienceSites;
35
39
  private static getStatusFilterGroup;
36
40
  private static getStatusFromErrors;
37
- private static getStatusCssClass;
41
+ /** True when deployment failed but the component was successfully processed locally. */
42
+ private static isManualDeploymentNeeded;
43
+ /** Returns display status — "Manual deployment needed" when deployment failed, original status otherwise. */
44
+ private static resolveDisplayStatus;
45
+ /** Returns CSS class — error for manual deployment needed, success/error otherwise. */
46
+ private static resolveStatusClass;
38
47
  private static getRowsForExperienceSites;
39
48
  private static getRowDataForExperienceSites;
40
49
  }
@@ -32,7 +32,8 @@ const apexFileName = 'apex.html';
32
32
  const experienceSiteFileName = 'experienceSite.html';
33
33
  const lwcFileName = 'lwc.html';
34
34
  class ResultsBuilder {
35
- static async generateReport(results, relatedObjectMigrationResult, instanceUrl, orgDetails, messages, actionItems, objectsToProcess, migrateOnly) {
35
+ static async generateReport(results, relatedObjectMigrationResult, instanceUrl, orgDetails, messages, actionItems, objectsToProcess, migrateOnly, deploymentFailed = false) {
36
+ ResultsBuilder.deploymentFailed = deploymentFailed;
36
37
  fs_1.default.mkdirSync(resultsDir, { recursive: true });
37
38
  logger_1.Logger.info(messages.getMessage('generatingComponentReports'));
38
39
  for (const result of results) {
@@ -107,8 +108,8 @@ class ResultsBuilder {
107
108
  (0, reportUtil_1.createRowDataParam)('migratedId', item.migratedId, false, 1, 1, true, `${instanceUrl}/${item.migratedId}`),
108
109
  ]),
109
110
  (0, reportUtil_1.createRowDataParam)('migratedName', item.migratedName, false, 1, 1, false),
110
- (0, reportUtil_1.createRowDataParam)('status', item.status, false, 1, 1, false, undefined, undefined, item.status === 'Successfully migrated' ? 'text-success' : 'text-error'),
111
- (0, reportUtil_1.createRowDataParam)('errors', item.errors ? 'Failed' : 'Has No Errors', false, 1, 1, false, undefined, item.errors || []),
111
+ (0, reportUtil_1.createRowDataParam)('status', item.status, false, 1, 1, false, undefined, undefined, item.status === stringContants_1.Status.SuccessfullyMigrated ? 'text-success' : 'text-error'),
112
+ (0, reportUtil_1.createRowDataParam)('errors', item.errors ? stringContants_1.Status.Failed : 'Has No Errors', false, 1, 1, false, undefined, item.errors || []),
112
113
  (0, reportUtil_1.createRowDataParam)('summary', item.warnings ? 'Warnings' : 'Has No Warnings', false, 1, 1, false, undefined, item.warnings || []),
113
114
  ],
114
115
  })),
@@ -165,11 +166,11 @@ class ResultsBuilder {
165
166
  result.data.forEach((record) => {
166
167
  // Handle both old and new data formats
167
168
  const labelName = record.name || record.labelName;
168
- const cloneStatus = record.status === 'Complete'
169
+ const cloneStatus = record.status === stringContants_1.Status.Complete
169
170
  ? 'created'
170
171
  : record.status === 'Error'
171
172
  ? 'error'
172
- : record.status === 'Skipped'
173
+ : record.status === stringContants_1.Status.Skipped
173
174
  ? 'duplicate'
174
175
  : record.status || 'duplicate';
175
176
  const message = record.message || '';
@@ -233,7 +234,7 @@ class ResultsBuilder {
233
234
  assessmentDate: new Date().toLocaleString(),
234
235
  total: result.length,
235
236
  filterGroups: [
236
- ...this.getStatusFilterGroup(result.flatMap((item) => item.experienceSiteAssessmentPageInfos.map((page) => page.status))),
237
+ ...this.getStatusFilterGroup(result.flatMap((item) => item.experienceSiteAssessmentPageInfos.map((page) => this.resolveDisplayStatus(page.status, messages)))),
237
238
  ],
238
239
  headerGroups: [
239
240
  {
@@ -271,7 +272,7 @@ class ResultsBuilder {
271
272
  ],
272
273
  },
273
274
  ],
274
- rows: this.getRowsForExperienceSites(result),
275
+ rows: this.getRowsForExperienceSites(result, messages),
275
276
  props: JSON.stringify({
276
277
  recordName: 'Pages',
277
278
  rowBased: true,
@@ -296,7 +297,9 @@ class ResultsBuilder {
296
297
  },
297
298
  assessmentDate: new Date().toLocaleString(),
298
299
  total: result.length,
299
- filterGroups: [...this.getStatusFilterGroup(result.map((item) => item.status))],
300
+ filterGroups: [
301
+ ...this.getStatusFilterGroup(result.map((item) => this.resolveDisplayStatus(item.status, messages))),
302
+ ],
300
303
  headerGroups: [
301
304
  {
302
305
  header: [
@@ -333,7 +336,7 @@ class ResultsBuilder {
333
336
  data: [
334
337
  (0, reportUtil_1.createRowDataParam)('name', item.name.substring(0, item.name.length - this.flexiPageFileSuffix.length), true, 1, 1, false),
335
338
  (0, reportUtil_1.createRowDataParam)('path', item.name, false, 1, 1, true, item.path),
336
- (0, reportUtil_1.createRowDataParam)('status', item.status, false, 1, 1, false, undefined, undefined, item.status === 'Successfully migrated' ? 'text-success' : 'text-error'),
339
+ (0, reportUtil_1.createRowDataParam)('status', this.resolveDisplayStatus(item.status, messages), false, 1, 1, false, undefined, undefined, this.resolveStatusClass(item.status)),
337
340
  (0, reportUtil_1.createRowDataParam)('diff', '', false, 1, 1, false, undefined, FileDiffUtil_1.FileDiffUtil.getDiffHTML(item.diff, item.name), 'diff-cell'),
338
341
  (0, reportUtil_1.createRowDataParam)('error', 'error', false, 1, 1, false, undefined, item.errors),
339
342
  ],
@@ -356,7 +359,9 @@ class ResultsBuilder {
356
359
  },
357
360
  assessmentDate: new Date().toLocaleString(),
358
361
  total: result.length,
359
- filterGroups: [(0, reportUtil_1.createFilterGroupParam)('Filter by Errors', 'warnings', ['Failed', 'Successfully Completed'])],
362
+ filterGroups: [
363
+ (0, reportUtil_1.createFilterGroupParam)('Filter by Errors', 'warnings', [stringContants_1.Status.Failed, stringContants_1.Status.SuccessfullyCompleted]),
364
+ ],
360
365
  headerGroups: [
361
366
  {
362
367
  header: [
@@ -408,7 +413,7 @@ class ResultsBuilder {
408
413
  ...item.infos,
409
414
  ...item.warnings,
410
415
  ]),
411
- (0, reportUtil_1.createRowDataParam)('warnings', item.errors.length > 0 ? 'Failed' : 'Successfully Completed', false, 1, 1, false, undefined, item.errors),
416
+ (0, reportUtil_1.createRowDataParam)('warnings', item.errors.length > 0 ? stringContants_1.Status.Failed : stringContants_1.Status.SuccessfullyCompleted, false, 1, 1, false, undefined, item.errors),
412
417
  ],
413
418
  })),
414
419
  };
@@ -430,7 +435,9 @@ class ResultsBuilder {
430
435
  },
431
436
  assessmentDate: new Date().toLocaleString(),
432
437
  total: result.length,
433
- filterGroups: [...this.getStatusFilterGroup(result.flatMap((item) => this.getStatusFromErrors(item.errors)))],
438
+ filterGroups: [
439
+ ...this.getStatusFilterGroup(result.flatMap((item) => this.resolveDisplayStatus(this.getStatusFromErrors(item.errors), messages))),
440
+ ],
434
441
  headerGroups: [
435
442
  {
436
443
  header: [
@@ -467,18 +474,21 @@ class ResultsBuilder {
467
474
  ],
468
475
  },
469
476
  ],
470
- rows: this.getLwcRowsForReport(result),
477
+ rows: this.getLwcRowsForReport(result, messages),
471
478
  };
472
479
  const reportTemplate = fs_1.default.readFileSync(reportTemplateFilePath, 'utf8');
473
480
  const html = generate_1.TemplateParser.generate(reportTemplate, data, messages);
474
481
  fs_1.default.writeFileSync(path_1.default.join(resultsDir, lwcFileName), html);
475
482
  }
476
- static getLwcRowsForReport(lwcAssessmentInfos) {
483
+ static getLwcRowsForReport(lwcAssessmentInfos, messages) {
477
484
  const rows = [];
478
485
  for (const lwcAssessmentInfo of lwcAssessmentInfos) {
479
486
  let showCommon = true;
480
487
  const rid = `${this.rowClass}${this.rowId++}`;
481
488
  const commonRowSpan = Math.max(1, lwcAssessmentInfo.changeInfos.length);
489
+ const actualStatus = this.getStatusFromErrors(lwcAssessmentInfo.errors);
490
+ const displayStatus = this.resolveDisplayStatus(actualStatus, messages);
491
+ const statusClass = this.resolveStatusClass(actualStatus);
482
492
  for (const fileChangeInfo of lwcAssessmentInfo.changeInfos) {
483
493
  rows.push({
484
494
  rowId: rid,
@@ -486,7 +496,7 @@ class ResultsBuilder {
486
496
  ...(showCommon
487
497
  ? [
488
498
  (0, reportUtil_1.createRowDataParam)('name', lwcAssessmentInfo.name, true, commonRowSpan, 1, false),
489
- (0, reportUtil_1.createRowDataParam)('status', this.getStatusFromErrors(lwcAssessmentInfo.errors), false, commonRowSpan, 1, false, undefined, undefined, this.getStatusCssClass(lwcAssessmentInfo.errors)),
499
+ (0, reportUtil_1.createRowDataParam)('status', displayStatus, false, commonRowSpan, 1, false, undefined, undefined, statusClass),
490
500
  ]
491
501
  : []),
492
502
  (0, reportUtil_1.createRowDataParam)('fileReference', fileChangeInfo.name, false, 1, 1, true, fileChangeInfo.path, fileChangeInfo.name, 'normal-td-padding'),
@@ -494,8 +504,8 @@ class ResultsBuilder {
494
504
  ...(showCommon
495
505
  ? [
496
506
  (0, reportUtil_1.createRowDataParam)('comments', lwcAssessmentInfo.warnings && lwcAssessmentInfo.warnings.length > 0
497
- ? 'Failed'
498
- : 'Successfully Completed', false, commonRowSpan, 1, false, undefined, lwcAssessmentInfo.warnings || []),
507
+ ? stringContants_1.Status.Failed
508
+ : stringContants_1.Status.SuccessfullyCompleted, false, commonRowSpan, 1, false, undefined, lwcAssessmentInfo.warnings || []),
499
509
  (0, reportUtil_1.createRowDataParam)('errors', lwcAssessmentInfo.errors ? lwcAssessmentInfo.errors.join(', ') : '', false, commonRowSpan, 1, false, undefined, lwcAssessmentInfo.errors || []),
500
510
  ]
501
511
  : []),
@@ -647,17 +657,17 @@ class ResultsBuilder {
647
657
  let error = 0;
648
658
  let skip = 0;
649
659
  data.forEach((item) => {
650
- if (item.status === 'Successfully migrated')
660
+ if (item.status === stringContants_1.Status.SuccessfullyMigrated)
651
661
  complete++;
652
- if (item.status === 'Failed')
662
+ if (item.status === stringContants_1.Status.Failed)
653
663
  error++;
654
- if (item.status === 'Skipped')
664
+ if (item.status === stringContants_1.Status.Skipped)
655
665
  skip++;
656
666
  });
657
667
  return [
658
- { name: 'Successfully migrated', count: complete, cssClass: 'text-success' },
659
- { name: 'Skipped', count: skip, cssClass: 'text-error' },
660
- { name: 'Failed', count: error, cssClass: 'text-error' },
668
+ { name: stringContants_1.Status.SuccessfullyMigrated, count: complete, cssClass: 'text-success' },
669
+ { name: stringContants_1.Status.Skipped, count: skip, cssClass: 'text-error' },
670
+ { name: stringContants_1.Status.Failed, count: error, cssClass: 'text-error' },
661
671
  ];
662
672
  }
663
673
  static getCustomLabelStatusData(data, totalCount) {
@@ -669,18 +679,18 @@ class ResultsBuilder {
669
679
  data.forEach((item) => {
670
680
  // Handle both old and new status formats
671
681
  const status = item.status || item.cloneStatus;
672
- if (status === 'error' || status === 'Error' || status === 'Failed')
682
+ if (status === 'error' || status === 'Error' || status === stringContants_1.Status.Failed)
673
683
  error++;
674
- else if (status === 'duplicate' || status === 'Skipped')
684
+ else if (status === 'duplicate' || status === stringContants_1.Status.Skipped)
675
685
  duplicate++;
676
686
  });
677
687
  // Use totalCount if provided, otherwise fall back to data length
678
688
  const actualTotal = totalCount || data.length;
679
689
  const successfullyMigrated = Math.max(0, actualTotal - error - duplicate);
680
690
  return [
681
- { name: 'Successfully migrated', count: successfullyMigrated, cssClass: 'text-success' },
682
- { name: 'Failed', count: error, cssClass: 'text-error' },
683
- { name: 'Skipped', count: duplicate, cssClass: 'text-warning' },
691
+ { name: stringContants_1.Status.SuccessfullyMigrated, count: successfullyMigrated, cssClass: 'text-success' },
692
+ { name: stringContants_1.Status.Failed, count: error, cssClass: 'text-error' },
693
+ { name: stringContants_1.Status.Skipped, count: duplicate, cssClass: 'text-warning' },
684
694
  ];
685
695
  }
686
696
  static getDifferentStatusDataForApex(data) {
@@ -693,63 +703,56 @@ class ResultsBuilder {
693
703
  error++;
694
704
  });
695
705
  return [
696
- { name: 'Successfully migrated', count: complete, cssClass: 'text-success' },
697
- { name: 'Skipped', count: 0, cssClass: 'text-error' },
698
- { name: 'Failed', count: error, cssClass: 'text-error' },
706
+ { name: stringContants_1.Status.SuccessfullyMigrated, count: complete, cssClass: 'text-success' },
707
+ { name: stringContants_1.Status.Skipped, count: 0, cssClass: 'text-error' },
708
+ { name: stringContants_1.Status.Failed, count: error, cssClass: 'text-error' },
699
709
  ];
700
710
  }
701
- static getDifferentStatusDataForFlexipage(data) {
711
+ static buildStatusSummary(counts) {
712
+ const result = [
713
+ { name: stringContants_1.Status.SuccessfullyMigrated, count: counts.completed, cssClass: 'text-success' },
714
+ ];
715
+ if (counts.manualDeploymentNeeded > 0) {
716
+ result.push({
717
+ name: stringContants_1.Status.ManualDeploymentNeeded,
718
+ count: counts.manualDeploymentNeeded,
719
+ cssClass: 'text-error',
720
+ });
721
+ }
722
+ result.push({ name: stringContants_1.Status.Skipped, count: counts.skipped, cssClass: 'text-error' });
723
+ result.push({ name: stringContants_1.Status.Failed, count: counts.failed, cssClass: 'text-error' });
724
+ return result;
725
+ }
726
+ static countStatusesFromItems(statuses) {
702
727
  let completed = 0;
728
+ let manualDeploymentNeeded = 0;
703
729
  let skipped = 0;
704
730
  let failed = 0;
705
- data.forEach((item) => {
706
- if (item.status === 'Successfully migrated')
731
+ for (const status of statuses) {
732
+ if (this.isManualDeploymentNeeded(status)) {
733
+ manualDeploymentNeeded++;
734
+ }
735
+ else if (status === stringContants_1.Status.SuccessfullyMigrated) {
707
736
  completed++;
708
- else if (item.status === 'Skipped')
737
+ }
738
+ else if (status === stringContants_1.Status.Skipped) {
709
739
  skipped++;
710
- else
740
+ }
741
+ else {
711
742
  failed++;
712
- });
713
- return [
714
- { name: 'Successfully migrated', count: completed, cssClass: 'text-success' },
715
- { name: 'Skipped', count: skipped, cssClass: 'text-error' },
716
- { name: 'Failed', count: failed, cssClass: 'text-error' },
717
- ];
743
+ }
744
+ }
745
+ return { completed, manualDeploymentNeeded, skipped, failed };
746
+ }
747
+ static getDifferentStatusDataForFlexipage(data) {
748
+ return this.buildStatusSummary(this.countStatusesFromItems(data.map((item) => item.status)));
718
749
  }
719
750
  static getDifferentStatusDataForLwc(data) {
720
- let completed = 0;
721
- let failed = 0;
722
- data.forEach((item) => {
723
- if (this.getStatusFromErrors(item.errors) === 'Successfully migrated')
724
- completed++;
725
- else
726
- failed++;
727
- });
728
- return [
729
- { name: 'Successfully migrated', count: completed, cssClass: 'text-success' },
730
- { name: 'Skipped', count: 0, cssClass: 'text-error' },
731
- { name: 'Failed', count: failed, cssClass: 'text-error' },
732
- ];
751
+ return this.buildStatusSummary(this.countStatusesFromItems(data.map((item) => this.getStatusFromErrors(item.errors))));
733
752
  }
734
753
  static getDifferentStatusDataForExperienceSites(data) {
735
- let completed = 0;
736
- let skipped = 0;
737
- let failed = 0;
738
- data
739
- .flatMap((item) => item.experienceSiteAssessmentPageInfos)
740
- .forEach((item) => {
741
- if (item.status === 'Successfully migrated')
742
- completed++;
743
- else if (item.status === 'Skipped')
744
- skipped++;
745
- else
746
- failed++;
747
- });
748
- return [
749
- { name: 'Successfully migrated', count: completed, cssClass: 'text-success' },
750
- { name: 'Skipped', count: skipped, cssClass: 'text-error' },
751
- { name: 'Failed', count: failed, cssClass: 'text-error' },
752
- ];
754
+ const statuses = data.flatMap((item) => item.experienceSiteAssessmentPageInfos.map((page) => page.status));
755
+ return this.buildStatusSummary(this.countStatusesFromItems(statuses));
753
756
  }
754
757
  static getStatusFilterGroup(statuses) {
755
758
  const statusSet = new Set(statuses);
@@ -759,17 +762,24 @@ class ResultsBuilder {
759
762
  }
760
763
  static getStatusFromErrors(errors) {
761
764
  if (errors && errors.length > 0)
762
- return 'Failed';
763
- return 'Successfully migrated';
765
+ return stringContants_1.Status.Failed;
766
+ return stringContants_1.Status.SuccessfullyMigrated;
764
767
  }
765
- static getStatusCssClass(errors, neutralSuccess = false) {
766
- if (errors && errors.length > 0)
768
+ /** True when deployment failed but the component was successfully processed locally. */
769
+ static isManualDeploymentNeeded(status) {
770
+ return this.deploymentFailed && status === stringContants_1.Status.SuccessfullyMigrated;
771
+ }
772
+ /** Returns display status — "Manual deployment needed" when deployment failed, original status otherwise. */
773
+ static resolveDisplayStatus(status, messages) {
774
+ return this.isManualDeploymentNeeded(status) ? messages.getMessage('manualDeploymentNeeded') : status;
775
+ }
776
+ /** Returns CSS class — error for manual deployment needed, success/error otherwise. */
777
+ static resolveStatusClass(status) {
778
+ if (this.isManualDeploymentNeeded(status))
767
779
  return 'text-error';
768
- if (neutralSuccess)
769
- return '';
770
- return 'text-success';
780
+ return status === stringContants_1.Status.SuccessfullyMigrated ? 'text-success' : 'text-error';
771
781
  }
772
- static getRowsForExperienceSites(result) {
782
+ static getRowsForExperienceSites(result, messages) {
773
783
  const rows = [];
774
784
  result.forEach((item) => {
775
785
  const rId = `${this.rowClass}${this.rowId++}`;
@@ -777,19 +787,21 @@ class ResultsBuilder {
777
787
  item.experienceSiteAssessmentPageInfos.forEach((page) => {
778
788
  rows.push({
779
789
  rowId: rId,
780
- data: this.getRowDataForExperienceSites(page, item, showBundleName),
790
+ data: this.getRowDataForExperienceSites(page, item, showBundleName, messages),
781
791
  });
782
792
  showBundleName = false;
783
793
  });
784
794
  });
785
795
  return rows;
786
796
  }
787
- static getRowDataForExperienceSites(page, item, showBundleName) {
797
+ static getRowDataForExperienceSites(page, item, showBundleName, messages) {
798
+ const displayStatus = this.resolveDisplayStatus(page.status, messages);
799
+ const statusClass = this.resolveStatusClass(page.status);
788
800
  return [
789
801
  (0, reportUtil_1.createRowDataParam)('name', item.experienceBundleName, true, item.experienceSiteAssessmentPageInfos.length, 1, false, undefined, undefined, showBundleName ? '' : 'no-display'),
790
802
  (0, reportUtil_1.createRowDataParam)('pageName', page.name, false, 1, 1, false, undefined, undefined),
791
803
  (0, reportUtil_1.createRowDataParam)('path', page.name + this.experienceSiteFileSuffix, false, 1, 1, true, page.path),
792
- (0, reportUtil_1.createRowDataParam)('status', page.status, false, 1, 1, false, undefined, undefined, page.status === 'Successfully migrated' ? 'text-success' : 'text-error'),
804
+ (0, reportUtil_1.createRowDataParam)('status', displayStatus, false, 1, 1, false, undefined, undefined, statusClass),
793
805
  (0, reportUtil_1.createRowDataParam)('diff', page.name + 'diff', false, 1, 1, false, undefined, FileDiffUtil_1.FileDiffUtil.getDiffHTML(page.diff, page.name), 'diff-cell'),
794
806
  (0, reportUtil_1.createRowDataParam)('errors', page.errors ? page.errors.join(', ') : '', false, 1, 1, false, undefined, [
795
807
  ...(page.errors || []),
@@ -803,6 +815,8 @@ ResultsBuilder.rowClass = 'data-row-';
803
815
  ResultsBuilder.rowId = 0;
804
816
  ResultsBuilder.experienceSiteFileSuffix = '.json';
805
817
  ResultsBuilder.flexiPageFileSuffix = '.flexipage-meta.xml';
806
- ResultsBuilder.successStatus = ['Ready for migration', 'Complete', 'Successfully migrated'];
807
- ResultsBuilder.errorStatus = ['Failed', 'Needs manual intervention'];
818
+ ResultsBuilder.successStatus = [stringContants_1.Status.ReadyForMigration, stringContants_1.Status.Complete, stringContants_1.Status.SuccessfullyMigrated];
819
+ ResultsBuilder.errorStatus = [stringContants_1.Status.Failed, stringContants_1.Status.NeedsManualIntervention];
820
+ /** Set at report generation start; used to show "Manual deployment needed" when deployment failed */
821
+ ResultsBuilder.deploymentFailed = false;
808
822
  //# sourceMappingURL=index.js.map