Skip to content

Commit 4826a3a

Browse files
Multiple Omnistudio packages in single org & lint resolve
1 parent 9899a50 commit 4826a3a

File tree

14 files changed

+85
-32
lines changed

14 files changed

+85
-32
lines changed

messages/migrate.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,9 @@
7272
"metadataRetrieved": "Metadata %s retrieved from %s",
7373
"deployingMetadata": "Deploying metadata %s to %s",
7474
"metadataDeployed": "Metadata %s deployed to %s",
75-
"sfProjectCommandError": "Error executing command: %s"
75+
"sfProjectCommandError": "Error executing command: %s",
76+
"multiplePackagesFound": "Multiple OmniStudio packages found. Please select one:",
77+
"packageSelectionPrompt": "Enter the number of the package to use (1-%s):",
78+
"invalidPackageSelection": "Invalid selection. Please enter a number between 1 and %s.",
79+
"selectedPackage": "Selected package: %s (Version: %s)"
7680
}

src/commands/omnistudio/migration/assess.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ export default class Assess extends OmniStudioBaseCommand {
125125
try {
126126
orgs.rollbackFlags = await OrgPreferences.checkRollbackFlags(conn);
127127
} catch (error) {
128-
this.ux.log(error.message);
128+
Logger.log((error as Error).message);
129+
Logger.log((error as Error).stack);
129130
}
130131
await AssessmentReporter.generate(assesmentInfo, conn.instanceUrl, orgs, assessOnly, objectsToProcess);
131132
return assesmentInfo;

src/commands/omnistudio/migration/migrate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ export default class Migrate extends OmniStudioBaseCommand {
101101
await OrgPreferences.enableOmniPreferences(conn);
102102
} catch (error) {
103103
const errMsg = error instanceof Error ? error.message : String(error);
104-
this.ux.log(`Could not enable Omni preferences: ${errMsg}`);
104+
Logger.log(`Could not enable Omni preferences: ${errMsg}`);
105105
}
106106

107107
const namespace = orgs.packageDetails.namespace;

src/migration/base.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ export type ComponentType = 'Data Mapper' | 'Flexcard' | 'Omniscript and Integra
1818
*/
1919
export const createProgressBar = (action: string, componentType: ComponentType): cliProgress.SingleBar => {
2020
return new cliProgress.SingleBar({
21-
format: `${action} ${componentType} |${componentType === 'Omniscript and Integration Procedure' ? '' : '\t\t\t\t'} {bar} | {percentage}% || {value}/{total} Tasks`,
21+
format: `${action} ${componentType} |${
22+
componentType === 'Omniscript and Integration Procedure' ? '' : '\t\t\t\t'
23+
} {bar} | {percentage}% || {value}/{total} Tasks`,
2224
barCompleteChar: '\u2588',
2325
barIncompleteChar: '\u2591',
2426
hideCursor: true,

src/utils/file/fileUtil.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,13 @@ export function pushAssestUtilites(folderName: string, destDir: string): void {
179179
} catch (copyErr) {
180180
Logger.error(`Error copying file ${srcPath} to ${destPath}: ${copyErr}`);
181181
Logger.error(JSON.stringify(copyErr));
182-
Logger.error(copyErr.stack);
182+
Logger.error((copyErr as Error).stack);
183183
}
184184
}
185185
});
186186
} catch (readDirErr) {
187187
Logger.error(`Error reading directory ${sourceDir}: ${readDirErr}`);
188188
Logger.error(JSON.stringify(readDirErr));
189-
Logger.error(readDirErr.stack);
189+
Logger.error((readDirErr as Error).stack);
190190
}
191191
}

src/utils/interfaces.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,5 +162,5 @@ export interface QueryResult {
162162
};
163163
DeveloperName: string;
164164
Value: string;
165-
}>
165+
}>;
166166
}

src/utils/orgPreferences.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ export class OrgPreferences {
7171
throw new Error(`Failed to check rollback flags: ${error instanceof Error ? error.message : String(error)}`);
7272
}
7373
}
74-
}
74+
}

src/utils/orgUtils/index.ts

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
/* eslint-disable */
22

3-
import { Connection } from '@salesforce/core';
3+
import { Connection, Messages } from '@salesforce/core';
44
import { QueryTools } from '../query';
5+
import { Logger } from '../logger';
6+
7+
// Load messages
8+
const messages = Messages.loadMessages('@salesforce/plugin-omnistudio-migration-tool', 'migrate');
59

610
interface InstalledPackage {
711
MajorVersion: number;
@@ -312,18 +316,52 @@ export class OrgUtils {
312316
break;
313317
}
314318
}
315-
319+
const installedOmniPackages = [];
316320
if (packageDetails.namespace === '') {
317321
hasValidNamespace = false;
318322
for (const pkg of allInstalledPackages) {
319323
if ((namespace && namespace === pkg.NamespacePrefix) || this.namespaces.has(pkg.NamespacePrefix)) {
320-
packageDetails.version = `${pkg.MajorVersion}.${pkg.MinorVersion}`;
321-
packageDetails.namespace = pkg.NamespacePrefix;
322-
break; // Exit loop after first match
324+
installedOmniPackages.push(pkg);
323325
}
324326
}
325327
}
326328

329+
// Handle multiple packages by prompting user to select one
330+
if (installedOmniPackages.length > 1) {
331+
Logger.log(messages.getMessage('multiplePackagesFound'));
332+
333+
// Display available packages
334+
for (let i = 0; i < installedOmniPackages.length; i++) {
335+
const pkg = installedOmniPackages[i];
336+
Logger.log(`${i + 1}. ${pkg.NamespacePrefix} - Version ${pkg.MajorVersion}.${pkg.MinorVersion}`);
337+
}
338+
339+
// Prompt user to select a package
340+
let selectedIndex: number;
341+
do {
342+
const selection = await Logger.prompt(messages.getMessage('packageSelectionPrompt', [installedOmniPackages.length.toString()]));
343+
selectedIndex = parseInt(selection, 10) - 1;
344+
345+
if (isNaN(selectedIndex) || selectedIndex < 0 || selectedIndex >= installedOmniPackages.length) {
346+
Logger.warn(messages.getMessage('invalidPackageSelection', [installedOmniPackages.length.toString()]));
347+
}
348+
} while (isNaN(selectedIndex) || selectedIndex < 0 || selectedIndex >= installedOmniPackages.length);
349+
350+
// Set the selected package details
351+
const selectedPackage = installedOmniPackages[selectedIndex];
352+
packageDetails.version = `${selectedPackage.MajorVersion}.${selectedPackage.MinorVersion}`;
353+
packageDetails.namespace = selectedPackage.NamespacePrefix;
354+
hasValidNamespace = true;
355+
356+
Logger.log(messages.getMessage('selectedPackage', [selectedPackage.NamespacePrefix, packageDetails.version]));
357+
} else if (installedOmniPackages.length === 1) {
358+
// Only one package found, use it automatically
359+
const pkg = installedOmniPackages[0];
360+
packageDetails.version = `${pkg.MajorVersion}.${pkg.MinorVersion}`;
361+
packageDetails.namespace = pkg.NamespacePrefix;
362+
hasValidNamespace = true;
363+
}
364+
327365
//Execute apex rest resource to get omnistudio org permission
328366
const omniStudioOrgPermissionEnabled: boolean = await this.isOmniStudioOrgPermissionEnabled(
329367
connection,

src/utils/reportGenerator/reportGenerator.ts

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ export function generateHtmlTable<T>(reportFrameworkParameters: ReportFrameworkP
207207

208208
let rollbackFlagsHtml = '';
209209
if (rollbackFlags && rollbackFlagName) {
210-
const flagNames = rollbackFlagName.split(',').map(flag => flag.trim());
211-
const matchingFlags = flagNames.filter(flag => rollbackFlags.includes(flag));
210+
const flagNames = rollbackFlagName.split(',').map((flag) => flag.trim());
211+
const matchingFlags = flagNames.filter((flag) => rollbackFlags.includes(flag));
212212
if (matchingFlags.length > 0) {
213213
rollbackFlagsHtml = generateRollbackFlagsHtml(rollbackFlags, matchingFlags.join(', '), commandType);
214214
}
@@ -314,26 +314,34 @@ function createIndexedRow<T>(row: T, indexedKey: string, columns: Array<TableCol
314314
}
315315
return rows;
316316
}
317-
export function generateRollbackFlagsHtml(rollbackFlags: string[], flagNames: string, commandType: 'assess' | 'migrate' = 'assess'): string {
318-
const flagNameArray = flagNames.split(',').map(flag => flag.trim());
319-
const matchingFlags = flagNameArray.filter(flag => rollbackFlags.includes(flag));
320-
317+
export function generateRollbackFlagsHtml(
318+
rollbackFlags: string[],
319+
flagNames: string,
320+
commandType: 'assess' | 'migrate' = 'assess'
321+
): string {
322+
const flagNameArray = flagNames.split(',').map((flag) => flag.trim());
323+
const matchingFlags = flagNameArray.filter((flag) => rollbackFlags.includes(flag));
324+
321325
if (matchingFlags.length === 0) {
322326
return '';
323327
}
324-
325-
const actionText = commandType === 'migrate' ? matchingFlags.length > 1 ? 'were' : 'was' : 'will be';
326-
328+
329+
const actionText = commandType === 'migrate' ? (matchingFlags.length > 1 ? 'were' : 'was') : 'will be';
330+
327331
return `
328332
<div class="slds-box" style="background-color: white; margin-top: 20px;">
329333
<div class="slds-text-heading_medium">Rollback Flags Disabled</div>
330334
<div style="margin-block: 15px">
331-
<p>The following rollback flag${matchingFlags.length > 1 ? 's' : ''} ${actionText} disabled during migration:</p>
335+
<p>The following rollback flag${
336+
matchingFlags.length > 1 ? 's' : ''
337+
} ${actionText} disabled during migration:</p>
332338
<ul class="slds-list_dotted">
333-
${matchingFlags.map(flag => `<li class="slds-item slds-text-color_destructive">${flag}</li>`).join('')}
339+
${matchingFlags.map((flag) => `<li class="slds-item slds-text-color_destructive">${flag}</li>`).join('')}
334340
</ul>
335341
<p>
336-
<strong>Note:</strong> ${matchingFlags.length > 1 ? 'These ' : 'This '} flag${matchingFlags.length > 1 ? 's will' : ' will'} no longer be supported after migration. For assistance, please contact support.
342+
<strong>Note:</strong> ${matchingFlags.length > 1 ? 'These ' : 'This '} flag${
343+
matchingFlags.length > 1 ? 's will' : ' will'
344+
} no longer be supported after migration. For assistance, please contact support.
337345
</p>
338346
</div>
339347
</div>`;

src/utils/resultsbuilder/DRAssessmentReporter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export class DRAssessmentReporter {
128128
headerColumns: headerColumn,
129129
columns,
130130
rows: dataRaptorAssessmentInfos,
131-
orgDetails: orgDetails,
131+
orgDetails,
132132
filters,
133133
ctaSummary: [],
134134
reportHeaderLabel: 'Data Mapper Assessment',

0 commit comments

Comments
 (0)