Skip to content

Commit f028a61

Browse files
Merge branch 'prerelease/alpha' into prerelease/alpha
2 parents 5ffbeb0 + da77663 commit f028a61

File tree

19 files changed

+702
-444
lines changed

19 files changed

+702
-444
lines changed

messages/assess.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,13 @@
102102
"operationCancelled": "Operation cancelled.",
103103
"invalidYesNoResponse": "Invalid response. Please answer y or n.",
104104
"notSfdxProjectFolderPath": "Provided folder is not a valid Salesforce DX project. Please select a folder containing sfdx-project.json",
105-
"enableVerboseOutput": "Enable verbose output"
105+
"enableVerboseOutput": "Enable verbose output",
106+
"apexFileChangesIdentifiedNotApplied": "Changes identified for Apex class {0} but not applied (assessment mode)",
107+
"apexFileHasMultipleInterfaces": "File {0} has multiple interfaces including Callable, standardizing to System.Callable only",
108+
"apexFileImplementsVlocityOpenInterface2": "File {0} implements VlocityOpenInterface2, replacing with System.Callable",
109+
"errorParsingHtmlTemplate": "Error while parsing template",
110+
"errorParsingData": "Error while parsing data for template",
111+
"errorGeneratingHTML": "Error while generating HTML from template for {} with properties {}",
112+
"unexpectedError": "Unexpected Assessment error",
113+
"errorEvaluatingExpression": "Error evaluating expression: {0}, {1}",
106114
}

messages/migrate.json

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@
8383
"cardAuthorNameChangeMessage": "Card author name has been modified to fit naming rules: {0}",
8484
"cardNameChangeMessage": "Card name has been modified to fit naming rules: {0}",
8585
"duplicateCardNameMessage": "Potential duplicate: Another card has the same name {0} after name cleaning. This may cause conflicts during migration",
86-
"angularOmniscriptWarningMessage": " Angular OmniScript will not be migrated, please convert this to LWC based Omniscript"
86+
"angularOmniscriptWarningMessage": " Angular OmniScript will not be migrated, please convert this to LWC based Omniscript",
87+
"apexFileChangesApplied": "Applied changes to Apex class {0}",
88+
"generatingComponentReports": "Generating report for components",
89+
"generatingRelatedObjectReports": "Generating report for related objects",
90+
"generatingMigrationReportDashboard": "Generating migration report dashboard",
91+
"errorParsingHtmlTemplate": "Error while parsing template",
92+
"errorParsingData": "Error while parsing data for template",
93+
"errorGeneratingHTML": "Error while generating HTML from template for {} with properties {}",
94+
"errorEvaluatingExpression": "Error evaluating expression: {0}, {1}"
8795
}
88-

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@salesforce/plugin-omnistudio-migration-tool",
33
"description": "This SFDX plugin migrates FlexCard, OmniScript, DataRaptor, and Integration Procedure custom objects to standard objects.",
4-
"version": "2.0.0-beta.3",
4+
"version": "2.0.0-beta.4",
55
"author": "Salesforce",
66
"bugs": "https://github.com/forcedotcom/cli/issues",
77
"dependencies": {
@@ -38,6 +38,8 @@
3838
"@typescript-eslint/eslint-plugin": "^4.2.0",
3939
"@typescript-eslint/parser": "^4.2.0",
4040
"chai": "^4.4.1",
41+
"cli-progress": "^3.12.0",
42+
"diff": "^5.1.0",
4143
"eslint": "^7.27.0",
4244
"eslint-config-oclif": "^3.1",
4345
"eslint-config-prettier": "^8",

src/commands/omnistudio/migration/assess.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,25 @@ export default class Assess extends OmniStudioBaseCommand {
7272

7373
// eslint-disable-next-line @typescript-eslint/no-explicit-any
7474
public async run(): Promise<any> {
75+
Logger.initialiseLogger(this.ux, this.logger, 'assess', this.flags.verbose);
76+
try {
77+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
78+
return await this.runAssess();
79+
} catch (error) {
80+
Logger.error('Error running assess');
81+
Logger.error(error);
82+
process.exit(1);
83+
}
84+
}
85+
86+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
87+
public async runAssess(): Promise<any> {
7588
DebugTimer.getInstance().start();
7689
let apiVersion = this.flags.apiversion as string;
7790
const allVersions = (this.flags.allversions || false) as boolean;
7891
const assessOnly = (this.flags.only || '') as string;
7992
const relatedObjects = (this.flags.relatedobjects || '') as string;
8093
const conn = this.org.getConnection();
81-
Logger.initialiseLogger(this.ux, this.logger, 'assess', this.flags.verbose);
8294

8395
if (apiVersion) {
8496
conn.setApiVersion(apiVersion);
@@ -236,7 +248,7 @@ export default class Assess extends OmniStudioBaseCommand {
236248
Logger.log((error as Error).message);
237249
Logger.log((error as Error).stack);
238250
}
239-
await AssessmentReporter.generate(assesmentInfo, conn.instanceUrl, orgs, assessOnly, objectsToProcess);
251+
await AssessmentReporter.generate(assesmentInfo, conn.instanceUrl, orgs, assessOnly, objectsToProcess, messages);
240252
return assesmentInfo;
241253
}
242254

src/commands/omnistudio/migration/info.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,16 @@ export default class Org extends SfdxCommand {
5151
protected static requiresProject = false;
5252

5353
public async run(): Promise<AnyJson> {
54+
try {
55+
return await this.runInfo();
56+
} catch (error) {
57+
Logger.error('Error running info');
58+
Logger.error(error);
59+
process.exit(1);
60+
}
61+
}
62+
63+
public async runInfo(): Promise<AnyJson> {
5464
const name = (this.flags.name || 'world') as string;
5565
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
5666
const allVersions = this.flags.allversions || false;

src/commands/omnistudio/migration/migrate.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,25 @@ export default class Migrate extends OmniStudioBaseCommand {
6565

6666
// eslint-disable-next-line @typescript-eslint/no-explicit-any
6767
public async run(): Promise<any> {
68+
Logger.initialiseLogger(this.ux, this.logger, 'migrate', this.flags.verbose);
69+
try {
70+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
71+
return await this.runMigration();
72+
} catch (e) {
73+
const error = e as Error;
74+
Logger.error(`Error running migrate ${error.message}`);
75+
Logger.error(error);
76+
process.exit(1);
77+
}
78+
}
79+
80+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
81+
public async runMigration(): Promise<any> {
6882
let apiVersion = this.flags.apiversion as string;
6983
const migrateOnly = (this.flags.only || '') as string;
7084
const allVersions = this.flags.allversions || (false as boolean);
7185
const relatedObjects = (this.flags.relatedobjects || '') as string;
7286

73-
Logger.initialiseLogger(this.ux, this.logger, 'migrate', this.flags.verbose);
74-
7587
// this.org is guaranteed because requiresUsername=true, as opposed to supportsUsername
7688
const conn = this.org.getConnection();
7789
if (apiVersion) {
@@ -167,7 +179,13 @@ export default class Migrate extends OmniStudioBaseCommand {
167179
relatedObjectMigrationResult.lwcAssessmentInfos
168180
);
169181

170-
await ResultsBuilder.generateReport(objectMigrationResults, relatedObjectMigrationResult, conn.instanceUrl, orgs);
182+
await ResultsBuilder.generateReport(
183+
objectMigrationResults,
184+
relatedObjectMigrationResult,
185+
conn.instanceUrl,
186+
orgs,
187+
messages
188+
);
171189

172190
// save timer to debug logger
173191
Logger.logVerbose(timer.toString());

src/migration/dataraptor.ts

Lines changed: 89 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -239,72 +239,103 @@ export class DataRaptorMigrationTool extends BaseMigrationTool implements Migrat
239239
// Now process each OmniScript and its elements
240240
for (const dataRaptor of dataRaptors) {
241241
if (dataRaptor[this.namespacePrefix + 'Type__c'] === 'Migration') continue;
242-
const drName = dataRaptor['Name'];
243-
// Await here since processOSComponents is now async
244-
Logger.info(this.messages.getMessage('processingDataRaptor', [drName]));
245-
const warnings: string[] = [];
246-
const existingDRNameVal = new StringVal(drName, 'name');
247-
248-
if (!existingDRNameVal.isNameCleaned()) {
249-
warnings.push(
250-
this.messages.getMessage('changeMessage', [
251-
existingDRNameVal.type,
252-
existingDRNameVal.val,
253-
existingDRNameVal.cleanName(),
254-
])
242+
try {
243+
const dataRaptorAssessmentInfo = await this.processDataMappers(
244+
dataRaptor,
245+
existingDataRaptorNames,
246+
dataRaptorItemsMap,
247+
functionDefinitionMetadata
255248
);
249+
dataRaptorAssessmentInfos.push(dataRaptorAssessmentInfo);
250+
} catch (e) {
251+
dataRaptorAssessmentInfos.push({
252+
oldName: dataRaptor['Name'],
253+
name: '',
254+
id: dataRaptor['Id'],
255+
type: dataRaptor[this.namespacePrefix + 'Type__c'] || '',
256+
formulaChanges: [],
257+
infos: [],
258+
warnings: [this.messages.getMessage('unexpectedError')],
259+
apexDependencies: [],
260+
});
261+
const error = e as Error;
262+
Logger.error(JSON.stringify(error));
263+
Logger.error(error.stack);
256264
}
257-
if (existingDataRaptorNames.has(existingDRNameVal.cleanName())) {
258-
warnings.push(this.messages.getMessage('duplicatedName') + ' ' + existingDRNameVal.cleanName());
259-
} else {
260-
existingDataRaptorNames.add(existingDRNameVal.cleanName());
261-
}
262-
const apexDependencies = [];
263-
if (dataRaptor[this.namespacePrefix + 'CustomInputClass__c']) {
264-
apexDependencies.push(dataRaptor[this.namespacePrefix + 'CustomInputClass__c']);
265-
}
266-
if (dataRaptor[this.namespacePrefix + 'CustomOutputClass__c']) {
267-
apexDependencies.push(dataRaptor[this.namespacePrefix + 'CustomOutputClass__c']);
268-
}
265+
progressBar.update(++progressCounter);
266+
}
267+
progressBar.stop();
268+
return dataRaptorAssessmentInfos;
269+
}
269270

270-
const formulaChanges: oldNew[] = [];
271-
const drItems = dataRaptorItemsMap.get(drName);
272-
if (drItems) {
273-
for (const drItem of drItems) {
274-
// Logger.log(dataRaptor[this.namespacePrefix + 'Formula__c']);
275-
const formula = drItem[this.namespacePrefix + 'Formula__c'];
276-
if (formula) {
277-
try {
278-
const newFormula = getReplacedString(this.namespacePrefix, formula, functionDefinitionMetadata);
279-
if (newFormula !== formula) {
280-
formulaChanges.push({
281-
old: formula,
282-
new: newFormula,
283-
});
284-
}
285-
} catch (ex) {
286-
Logger.error(JSON.stringify(ex));
287-
Logger.error(ex.stack);
288-
Logger.logVerbose(this.messages.getMessage('formulaSyntaxError', [formula]));
271+
private async processDataMappers(
272+
dataRaptor: AnyJson,
273+
existingDataRaptorNames: Set<string>,
274+
dataRaptorItemsMap: Map<string, AnyJson[]>,
275+
functionDefinitionMetadata: AnyJson[]
276+
): Promise<DataRaptorAssessmentInfo> {
277+
const drName = dataRaptor['Name'];
278+
// Await here since processOSComponents is now async
279+
Logger.info(this.messages.getMessage('processingDataRaptor', [drName]));
280+
const warnings: string[] = [];
281+
const existingDRNameVal = new StringVal(drName, 'name');
282+
283+
if (!existingDRNameVal.isNameCleaned()) {
284+
warnings.push(
285+
this.messages.getMessage('changeMessage', [
286+
existingDRNameVal.type,
287+
existingDRNameVal.val,
288+
existingDRNameVal.cleanName(),
289+
])
290+
);
291+
}
292+
if (existingDataRaptorNames.has(existingDRNameVal.cleanName())) {
293+
warnings.push(this.messages.getMessage('duplicatedName') + ' ' + existingDRNameVal.cleanName());
294+
} else {
295+
existingDataRaptorNames.add(existingDRNameVal.cleanName());
296+
}
297+
const apexDependencies = [];
298+
if (dataRaptor[this.namespacePrefix + 'CustomInputClass__c']) {
299+
apexDependencies.push(dataRaptor[this.namespacePrefix + 'CustomInputClass__c']);
300+
}
301+
if (dataRaptor[this.namespacePrefix + 'CustomOutputClass__c']) {
302+
apexDependencies.push(dataRaptor[this.namespacePrefix + 'CustomOutputClass__c']);
303+
}
304+
305+
const formulaChanges: oldNew[] = [];
306+
const drItems = dataRaptorItemsMap.get(drName);
307+
if (drItems) {
308+
for (const drItem of drItems) {
309+
// Logger.log(dataRaptor[this.namespacePrefix + 'Formula__c']);
310+
const formula = drItem[this.namespacePrefix + 'Formula__c'];
311+
if (formula) {
312+
try {
313+
const newFormula = getReplacedString(this.namespacePrefix, formula, functionDefinitionMetadata);
314+
if (newFormula !== formula) {
315+
formulaChanges.push({
316+
old: formula,
317+
new: newFormula,
318+
});
289319
}
320+
} catch (ex) {
321+
Logger.error(JSON.stringify(ex));
322+
Logger.error(ex.stack);
323+
Logger.logVerbose(this.messages.getMessage('formulaSyntaxError', [formula]));
290324
}
291325
}
292326
}
293-
const dataRaptorAssessmentInfo: DataRaptorAssessmentInfo = {
294-
oldName: existingDRNameVal.val,
295-
name: existingDRNameVal.cleanName(),
296-
id: dataRaptor['Id'],
297-
type: dataRaptor[this.namespacePrefix + 'Type__c'] || '',
298-
formulaChanges: formulaChanges,
299-
infos: [],
300-
apexDependencies: apexDependencies,
301-
warnings: warnings,
302-
};
303-
dataRaptorAssessmentInfos.push(dataRaptorAssessmentInfo);
304-
progressBar.update(++progressCounter);
305327
}
306-
progressBar.stop();
307-
return dataRaptorAssessmentInfos;
328+
const dataRaptorAssessmentInfo: DataRaptorAssessmentInfo = {
329+
oldName: existingDRNameVal.val,
330+
name: existingDRNameVal.cleanName(),
331+
id: dataRaptor['Id'],
332+
type: dataRaptor[this.namespacePrefix + 'Type__c'] || '',
333+
formulaChanges: formulaChanges,
334+
infos: [],
335+
apexDependencies: apexDependencies,
336+
warnings: warnings,
337+
};
338+
return dataRaptorAssessmentInfo;
308339
}
309340

310341
// Get All DRBundle__c records

0 commit comments

Comments
 (0)