Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 68 additions & 15 deletions src/commands/data/import/tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
*/

import { Messages } from '@salesforce/core';
import { Messages, SfError } from '@salesforce/core';
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
import { ensureString, isObject } from '@salesforce/ts-types';
import { importFromPlan } from '../../../api/data/tree/importPlan.js';
import { importFromFiles } from '../../../api/data/tree/importFiles.js';
import { orgFlags } from '../../../flags.js';
import type { ImportResult } from '../../../api/data/tree/importTypes.js';
import type { ImportResult, TreeResponse } from '../../../api/data/tree/importTypes.js';

Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
const messages = Messages.loadMessages('@salesforce/plugin-data', 'tree.import');
Expand Down Expand Up @@ -49,19 +50,71 @@ export default class Import extends SfCommand<ImportResult[]> {
const { flags } = await this.parse(Import);

const conn = flags['target-org'].getConnection(flags['api-version']);
const results = flags.plan
? await importFromPlan(conn, flags.plan)
: await importFromFiles(conn, flags.files ?? []);

this.table({
data: results,
columns: [
{ key: 'refId', name: 'Reference ID' },
{ key: 'type', name: 'Type' },
{ key: 'id', name: 'ID' },
],
title: 'Import Results',
});
return results;
try {
const results = flags.plan
? await importFromPlan(conn, flags.plan)
: await importFromFiles(conn, flags.files ?? []);

this.table({
data: results,
columns: [
{ key: 'refId', name: 'Reference ID' },
{ key: 'type', name: 'Type' },
{ key: 'id', name: 'ID' },
],
title: 'Import Results',
});
return results;
} catch (err) {
const error = err as Error;
if (
error.cause &&
error.cause instanceof Error &&
'data' in error.cause &&
isObject(error.cause.data) &&
'message' in error.cause.data
) {
const getTreeResponse = (payload: string): TreeResponse => {
try {
return JSON.parse(payload) as TreeResponse;
} catch (parseErr) {
// throw original error on invalid JSON payload
if (parseErr instanceof Error && parseErr.name === 'SyntaxError') {
throw error;
}
throw parseErr;
}
};
const errorData = getTreeResponse(ensureString(error.cause.data.message));

if (errorData.hasErrors) {
const errorResults = errorData.results
.map((result) =>
result.errors.map((errors) => ({
referenceId: result.referenceId,
StatusCode: errors.statusCode,
Message: errors.message,
fields: errors.fields.join(', ') || 'N/A',
}))
)
.flat();
this.table({
data: errorResults,
columns: [
{ key: 'referenceId', name: 'Reference ID' },
{ key: 'StatusCode', name: 'Status Code' },
{ key: 'Message', name: 'Error Message' },
{ key: 'fields', name: 'Fields' },
],
title: 'Tree import errors',
});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since we manually report the errors in the table we need to manually set the exit code to 1 here:
https://github.com/salesforcecli/plugin-deploy-retrieve/blob/a45867d06f7f511e973a955d4bab164d6486863d/src/commands/project/delete/source.ts#L306

const errors = new SfError('Data Import failed');
errors.setData(errorResults);
throw errors;
}
}
throw error;
}
}
}
Loading