@salesforce/plugin-data 3.1.11 → 3.2.1

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 (68) hide show
  1. package/README.md +3 -903
  2. package/lib/BulkBaseCommand.js +68 -94
  3. package/lib/BulkBaseCommand.js.map +1 -1
  4. package/lib/api/data/tree/exportApi.js +0 -1
  5. package/lib/api/data/tree/exportApi.js.map +1 -1
  6. package/lib/api/data/tree/importApi.js +2 -13
  7. package/lib/api/data/tree/importApi.js.map +1 -1
  8. package/lib/api/data/tree/importPlan.js.map +1 -1
  9. package/lib/batcher.js +3 -26
  10. package/lib/batcher.js.map +1 -1
  11. package/lib/bulkOperationCommand.js +125 -118
  12. package/lib/bulkOperationCommand.js.map +1 -1
  13. package/lib/bulkUtils.js +13 -24
  14. package/lib/bulkUtils.js.map +1 -1
  15. package/lib/commands/data/create/record.js.map +1 -1
  16. package/lib/commands/data/delete/bulk.js +14 -11
  17. package/lib/commands/data/delete/bulk.js.map +1 -1
  18. package/lib/commands/data/delete/record.js.map +1 -1
  19. package/lib/commands/data/delete/resume.js +1 -4
  20. package/lib/commands/data/delete/resume.js.map +1 -1
  21. package/lib/commands/data/get/record.js.map +1 -1
  22. package/lib/commands/data/import/tree.js +1 -1
  23. package/lib/commands/data/import/tree.js.map +1 -1
  24. package/lib/commands/data/query/resume.js +21 -10
  25. package/lib/commands/data/query/resume.js.map +1 -1
  26. package/lib/commands/data/query.js +38 -12
  27. package/lib/commands/data/query.js.map +1 -1
  28. package/lib/commands/data/resume.js +9 -15
  29. package/lib/commands/data/resume.js.map +1 -1
  30. package/lib/commands/data/update/record.js.map +1 -1
  31. package/lib/commands/data/upsert/bulk.js +16 -13
  32. package/lib/commands/data/upsert/bulk.js.map +1 -1
  33. package/lib/commands/data/upsert/resume.js +1 -4
  34. package/lib/commands/data/upsert/resume.js.map +1 -1
  35. package/lib/commands/force/data/bulk/delete.js +5 -4
  36. package/lib/commands/force/data/bulk/delete.js.map +1 -1
  37. package/lib/commands/force/data/bulk/status.js +1 -1
  38. package/lib/commands/force/data/bulk/status.js.map +1 -1
  39. package/lib/commands/force/data/bulk/upsert.js +6 -6
  40. package/lib/commands/force/data/bulk/upsert.js.map +1 -1
  41. package/lib/dataCommand.js.map +1 -1
  42. package/lib/dataSoqlQueryTypes.js.map +1 -1
  43. package/lib/export.js +1 -1
  44. package/lib/export.js.map +1 -1
  45. package/lib/flags.js +4 -3
  46. package/lib/flags.js.map +1 -1
  47. package/lib/queryUtils.js +3 -1
  48. package/lib/queryUtils.js.map +1 -1
  49. package/lib/reporters/csvReporter.js +78 -0
  50. package/lib/reporters/csvReporter.js.map +1 -0
  51. package/lib/reporters/humanReporter.js +120 -0
  52. package/lib/reporters/humanReporter.js.map +1 -0
  53. package/lib/reporters/reporters.js +69 -0
  54. package/lib/reporters/reporters.js.map +1 -0
  55. package/lib/resumeBulkCommand.js +28 -14
  56. package/lib/resumeBulkCommand.js.map +1 -1
  57. package/messages/batcher.md +3 -3
  58. package/messages/bulk.base.command.md +4 -4
  59. package/messages/bulk.resume.command.md +0 -4
  60. package/messages/importApi.md +2 -2
  61. package/messages/reporter.md +1 -1
  62. package/messages/soql.query.md +0 -4
  63. package/npm-shrinkwrap.json +497 -961
  64. package/oclif.lock +1178 -1545
  65. package/oclif.manifest.json +165 -42
  66. package/package.json +8 -10
  67. package/lib/reporters.js +0 -335
  68. package/lib/reporters.js.map +0 -1
@@ -0,0 +1,78 @@
1
+ /*
2
+ * Copyright (c) 2023, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import { EOL } from 'node:os';
8
+ import { ux } from '@oclif/core';
9
+ import { get, getNumber, isString } from '@salesforce/ts-types';
10
+ import { getAggregateAliasOrName, maybeMassageAggregates } from './reporters.js';
11
+ import { QueryReporter, logFields, isSubquery, isAggregate } from './reporters.js';
12
+ export class CsvReporter extends QueryReporter {
13
+ constructor(data, columns) {
14
+ super(data, columns);
15
+ }
16
+ display() {
17
+ const fields = logFields(this.logger)(this.data.query)(this.columns);
18
+ const aggregates = fields.filter(isAggregate);
19
+ const preppedData = this.data.result.records.map(maybeMassageAggregates(aggregates));
20
+ const attributeNames = getColumns(preppedData)(fields);
21
+ [
22
+ // header row
23
+ attributeNames.map(escape).join(SEPARATOR),
24
+ // data
25
+ ...preppedData.map((row) => attributeNames.map(getFieldValue(row)).join(SEPARATOR)),
26
+ ].map((line) => ux.log(line));
27
+ }
28
+ }
29
+ const getFieldValue = (row) => (fieldName) => {
30
+ // try get(row, name) first, then if it fails, default to row[name]. The default will happen in bulk cases.
31
+ // the standard case returns {field:{nested: 'value'}}, while the bulk will return {field.nested: 'value'}
32
+ const value = get(row, fieldName, row[fieldName]);
33
+ if (isString(value)) {
34
+ return escape(value);
35
+ // if value is null, then typeof value === 'object' so check before typeof to avoid illegal csv
36
+ }
37
+ else if (value === null) {
38
+ return;
39
+ }
40
+ else if (typeof value === 'object') {
41
+ return escape(JSON.stringify(value));
42
+ }
43
+ return value;
44
+ };
45
+ export const getMaxRecord = (allRecords) => (fieldName) => allRecords.reduce((max, record) => Math.max(max, getNumber(get(record, fieldName), 'totalSize', 0)), 0);
46
+ export const getColumns = (records) => (fields) => {
47
+ // If there are subqueries, we need to get the max child length for each subquery.
48
+ // For function fields, like avg(total).
49
+ const maxRecordsPerField = new Map(fields.filter(isSubquery).map((field) => [field.name, getMaxRecord(records)(field.name)]));
50
+ return [...maxRecordsPerField.values()].some((n) => n > 0)
51
+ ? fields.flatMap(csvAttributeNamesFromField(maxRecordsPerField)) // flatten nested objects from the query down to a flat file
52
+ : fields.map((field) => field.name); // simple case, no aggregates or subqueries
53
+ };
54
+ /**
55
+ * Escape a value to be placed in a CSV row. We follow rfc 4180
56
+ * https://tools.ietf.org/html/rfc4180#section-2 and will not surround the
57
+ * value in quotes if it doesn't contain the separator, double quote, or EOL.
58
+ *
59
+ * @param value The escaped value
60
+ */
61
+ export const escape = (value) => {
62
+ if (value && SHOULD_QUOTE_REGEXP.test(value)) {
63
+ return `"${value.replace(/"/gi, '""')}"`;
64
+ }
65
+ return value;
66
+ };
67
+ const SEPARATOR = ',';
68
+ const DOUBLE_QUOTE = '"';
69
+ const SHOULD_QUOTE_REGEXP = new RegExp(`[${SEPARATOR}${DOUBLE_QUOTE}${EOL}]`);
70
+ const csvAttributeNamesFromField = (typeLengths) => (field) => typeLengths.has(field.name)
71
+ ? subQueryAttributeNames(typeLengths.get(field.name) ?? 0)(field)
72
+ : [getAggregateAliasOrName(field)];
73
+ // to flatten nested objects from the query down to a flat file, we need to construct column names
74
+ const subQueryAttributeNames = (length) => (field) => Array.from({ length }).flatMap((v, index) => [
75
+ `${field.name}.totalSize`,
76
+ ...(field.fields ?? []).map((subfield) => `${field.name}.records.${index}.${subfield.name}`),
77
+ ]);
78
+ //# sourceMappingURL=csvReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csvReporter.js","sourceRoot":"","sources":["../../src/reporters/csvReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /*
2
+ * Copyright (c) 2023, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import { ux } from '@oclif/core';
8
+ import chalk from 'chalk';
9
+ import { get, getArray, isPlainObject, isString } from '@salesforce/ts-types';
10
+ import { Messages } from '@salesforce/core';
11
+ import { FieldType } from '../dataSoqlQueryTypes.js';
12
+ import { QueryReporter, logFields, isSubquery, isAggregate, getAggregateAliasOrName } from './reporters.js';
13
+ import { maybeMassageAggregates } from './reporters.js';
14
+ export const nullString = chalk.bold('null');
15
+ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
16
+ export const messages = Messages.loadMessages('@salesforce/plugin-data', 'soql.query');
17
+ export class HumanReporter extends QueryReporter {
18
+ constructor(data, columns) {
19
+ super(data, columns);
20
+ }
21
+ display() {
22
+ logFields(this.logger)(this.data.query)(this.columns);
23
+ const { attributeNames: columnNames, children, aggregates } = parseFields(this.columns);
24
+ const fieldMap = mapFieldsByName(this.columns);
25
+ // in case of count() there are no records, but there is a totalSize
26
+ const totalCount = this.data.result.records.length ? this.data.result.records.length : this.data.result.totalSize;
27
+ const preppedData = this.data.result.records
28
+ .map(removeAttributesFromObject)
29
+ .map(maybeMassageAggregates(aggregates))
30
+ .flatMap(maybeMassageSubqueries(children))
31
+ .map(massageJson(fieldMap));
32
+ printTable(preppedData, columnNames, totalCount);
33
+ }
34
+ }
35
+ export const parseFields = (fields) => ({
36
+ attributeNames: fields.flatMap(humanNamesFromField),
37
+ children: fields.filter(isSubquery).map((field) => field.name),
38
+ aggregates: fields.filter(isAggregate),
39
+ });
40
+ export const prepColumns = (columns) => {
41
+ const formattedColumns = {};
42
+ columns.filter(isString).map((field) => (formattedColumns[field] = {
43
+ header: field.toUpperCase(),
44
+ get: (row) => {
45
+ // first test if key exists, if so, return value
46
+ if (Reflect.has(row, field)) {
47
+ return Reflect.get(row, field) ?? '';
48
+ }
49
+ else {
50
+ // if not, try to find it query
51
+ return get(row, field) ?? '';
52
+ }
53
+ },
54
+ }));
55
+ return formattedColumns;
56
+ };
57
+ /** find null/undefined and replace it with a styled string */
58
+ export const prepNullValues = (record) => isPlainObject(record)
59
+ ? Object.fromEntries(Object.entries(record).map(([key, value]) => [key, maybeReplaceNulls(maybeRecurseNestedObjects(value))]))
60
+ : record;
61
+ const maybeReplaceNulls = (value) => value ?? nullString;
62
+ const maybeRecurseNestedObjects = (value) => (isPlainObject(value) ? prepNullValues(value) : value);
63
+ const printTable = (records, columns, totalCount) => {
64
+ ux.table(records.map(prepNullValues), prepColumns(columns));
65
+ ux.log(chalk.bold(messages.getMessage('displayQueryRecordsRetrieved', [totalCount])));
66
+ };
67
+ const humanNamesFromField = (field) => isSubquery(field)
68
+ ? (field.fields ?? [])?.map((subfield) => `${field.name}.${subfield.name}`)
69
+ : [getAggregateAliasOrName(field)];
70
+ /**
71
+ * some fields will return a JSON object that isn't accessible via the query (SELECT Metadata FROM RemoteProxy)
72
+ * some will return a JSON that IS accessible via the query (SELECT owner.Profile.Name FROM Lead)
73
+ * querying (SELECT Metadata.isActive FROM RemoteProxy) throws a SOQL validation error, so we have to display the entire Metadata object
74
+ */
75
+ export const massageJson = (fieldMap) => (queryRow) => Object.fromEntries(Object.entries(queryRow).flatMap(([k, v]) => maybeReplaceJson(fieldMap.get(k))([k, v])));
76
+ const maybeReplaceJson = (field) => ([key, value]) => {
77
+ if (isPlainObject(value) && field?.fieldType === FieldType.field) {
78
+ return [[key, JSON.stringify(value, null, 2)]];
79
+ }
80
+ if (isPlainObject(value) && field?.fields?.length && value) {
81
+ return field.fields.map((subfield) => [`${key}.${subfield.name}`, get(value, `records[0].${subfield.name}`)]);
82
+ }
83
+ return [[key, value]];
84
+ };
85
+ export const mapFieldsByName = (fields) => new Map(fields.map((field) => [field.name, field]));
86
+ export const maybeMassageSubqueries = (children) => (queryRow) => children.length ? massageSubqueries(children)(queryRow) : [queryRow];
87
+ const prependWithDot = (parent) => ([k, v]) => [`${parent}.${k}`, v];
88
+ const replaceNullValue = ([k, v]) => [k, maybeReplaceNulls(v)];
89
+ const massageSubqueries = (children) => (queryRow) => {
90
+ const childrenRows = children.map(getChildRecords(queryRow));
91
+ const childrenSet = new Set(children);
92
+ // the first (0-index) child's keys are renamed and transferred onto the parent
93
+ const childEntriesForParent = childrenRows
94
+ .flatMap(([childFieldName, childRecords]) => Object.entries(childRecords[0] ?? {})
95
+ .map(prependWithDot(childFieldName))
96
+ .flatMap(resolveObjects)
97
+ .map(replaceNullValue))
98
+ .filter(removeAttributesfromEntry);
99
+ // all other children, if any, are added to a new array of Objects
100
+ const subResults = childrenRows.flatMap(([childFieldName, childRecords]) => childRecords
101
+ .slice(1)
102
+ .map((r) => Object.entries(r).map(prependWithDot(childFieldName)).flatMap(resolveObjects).map(replaceNullValue))
103
+ .map((entries) => Object.fromEntries(entries))
104
+ .filter(removeEmptyObjects));
105
+ const parentEntries = Object.entries(queryRow)
106
+ // remove known children from the original object
107
+ .filter(([key]) => !childrenSet.has(key))
108
+ .concat(childEntriesForParent);
109
+ return [Object.fromEntries(parentEntries), ...subResults];
110
+ };
111
+ /** query has subQueries that result in arrays of records */
112
+ const getChildRecords = (queryRow) => (child) => [child, getArray(get(queryRow, child), 'records', []).map(removeAttributesFromObject)];
113
+ /** Query has foo.bar.baz (upward references to parents). This recursively flattens those object fields to match the query columns */
114
+ const resolveObjects = ([k, v]) => isPlainObject(v)
115
+ ? Object.entries(v).filter(removeAttributesfromEntry).map(prependWithDot(k)).flatMap(resolveObjects)
116
+ : [[k, v]];
117
+ const removeAttributesfromEntry = ([k]) => k !== 'attributes';
118
+ const removeAttributesFromObject = (record) => Object.fromEntries(Object.entries(record).filter(removeAttributesfromEntry));
119
+ const removeEmptyObjects = (record) => Object.keys(record).length > 0;
120
+ //# sourceMappingURL=humanReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanReporter.js","sourceRoot":"","sources":["../../src/reporters/humanReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /*
2
+ * Copyright (c) 2020, salesforce.com, inc.
3
+ * All rights reserved.
4
+ * Licensed under the BSD 3-Clause license.
5
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
+ */
7
+ import { Logger, Messages } from '@salesforce/core';
8
+ import { ux } from '@oclif/core';
9
+ import { capitalCase } from 'change-case';
10
+ import { FieldType } from '../dataSoqlQueryTypes.js';
11
+ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
12
+ const reporterMessages = Messages.loadMessages('@salesforce/plugin-data', 'reporter');
13
+ export class QueryReporter {
14
+ logger;
15
+ columns = [];
16
+ data;
17
+ constructor(data, columns) {
18
+ this.logger = Logger.childFromRoot('reporter');
19
+ this.columns = columns;
20
+ this.data = data;
21
+ }
22
+ }
23
+ export class JsonReporter extends QueryReporter {
24
+ constructor(data, columns) {
25
+ super(data, columns);
26
+ }
27
+ display() {
28
+ ux.styledJSON({ status: 0, result: this.data.result });
29
+ }
30
+ }
31
+ export const formatTypes = ['human', 'csv', 'json'];
32
+ export const getResultMessage = (jobInfo) => reporterMessages.getMessage('bulkV2Result', [
33
+ jobInfo.id,
34
+ capitalCase(jobInfo.state),
35
+ jobInfo.numberRecordsProcessed,
36
+ jobInfo.numberRecordsFailed,
37
+ ]);
38
+ export const isAggregate = (field) => field.fieldType === FieldType.functionField;
39
+ export const isSubquery = (field) => field.fieldType === FieldType.subqueryField;
40
+ const getAggregateFieldName = (field) => field.alias ?? field.name;
41
+ export const getAggregateAliasOrName = (field) => isAggregate(field) ? getAggregateFieldName(field) : field.name;
42
+ /** if there are fields, log them by type/name; otherwise, log that there are no fields for the query */
43
+ export const logFields = (logger) => (query) => (fields) => {
44
+ if (fields?.length) {
45
+ logger?.info(`Found fields ${JSON.stringify(fields.map((field) => `${typeof field}.${field.name}`))}`);
46
+ }
47
+ else {
48
+ logger?.info(`No fields found for query "${query}"`);
49
+ }
50
+ return fields ?? [];
51
+ };
52
+ export const maybeMassageAggregates = (aggregates) => (queryRow) => aggregates.length ? renameAggregates(aggregates)(queryRow) : queryRow;
53
+ /**
54
+ * replace ex: expr0 with the alias (if there is one) or name
55
+ *
56
+ * Aggregates are soql functions that aggregate data, like "SELECT avg(total)" and
57
+ * are returned in the data as exprX. Aggregates can have aliases, like "avg(total) totalAverage"
58
+ * and are returned in the data as the alias.
59
+ *
60
+ */
61
+ export const renameAggregates = (aggregates) => (queryRow) => Object.fromEntries(Object.entries(queryRow).map(([k, v]) => {
62
+ const index = typeof k === 'string' ? k.match(/expr(\d+)/)?.[1] : undefined;
63
+ if (typeof index === 'string') {
64
+ const matchingAgg = aggregates.at(parseInt(index, 10));
65
+ return matchingAgg ? [getAggregateAliasOrName(matchingAgg), v] : [k, v];
66
+ }
67
+ return [k, v];
68
+ }));
69
+ //# sourceMappingURL=reporters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporters.js","sourceRoot":"","sources":["../../src/reporters/reporters.ts"],"names":[],"mappings":"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"}
@@ -4,15 +4,17 @@
4
4
  * Licensed under the BSD 3-Clause license.
5
5
  * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6
6
  */
7
- import { Flags, loglevel, optionalOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core';
7
+ import { Flags, SfCommand, loglevel, optionalOrgFlagWithDeprecations } from '@salesforce/sf-plugins-core';
8
8
  import { Messages } from '@salesforce/core';
9
- import { isBulkV2RequestDone, transformResults, waitOrTimeout } from './bulkUtils.js';
10
- import { BulkBaseCommand } from './BulkBaseCommand.js';
9
+ import { BulkV2 } from '@jsforce/jsforce-node/lib/api/bulk2.js';
10
+ import { POLL_FREQUENCY_MS, isBulkV2RequestDone, remainingTime, transformResults } from './bulkUtils.js';
11
+ import { displayBulkV2Result, getRemainingTimeStatus, setupLifecycleListeners } from './BulkBaseCommand.js';
11
12
  Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
12
13
  const messages = Messages.loadMessages('@salesforce/plugin-data', 'bulk.resume.command');
13
- export class ResumeBulkCommand extends BulkBaseCommand {
14
+ export class ResumeBulkCommand extends SfCommand {
14
15
  static baseFlags = {
15
- 'target-org': { ...optionalOrgFlagWithDeprecations, summary: messages.getMessage('flags.targetOrg.summary') },
16
+ ...SfCommand.baseFlags,
17
+ 'target-org': optionalOrgFlagWithDeprecations,
16
18
  'job-id': Flags.salesforceId({
17
19
  length: 18,
18
20
  char: 'i',
@@ -23,6 +25,7 @@ export class ResumeBulkCommand extends BulkBaseCommand {
23
25
  }),
24
26
  'use-most-recent': Flags.boolean({
25
27
  summary: messages.getMessage('flags.useMostRecent.summary'),
28
+ // don't use `exactlyOne` because this defaults to true
26
29
  default: true,
27
30
  exclusive: ['job-id'],
28
31
  }),
@@ -36,22 +39,33 @@ export class ResumeBulkCommand extends BulkBaseCommand {
36
39
  loglevel,
37
40
  };
38
41
  async resume(resumeOptions, wait) {
42
+ const endWaitTime = Date.now() + wait.milliseconds;
39
43
  this.spinner.start('Getting status');
40
44
  const conn = resumeOptions.options.connection;
41
- this.job = conn.bulk2.job({ id: resumeOptions.jobInfo.id });
42
- this.wait = wait.milliseconds;
43
- this.endWaitTime = Date.now() + wait.milliseconds;
44
- this.spinner.status = this.getRemainingTimeStatus();
45
- this.setupLifecycleListeners();
46
- await waitOrTimeout(this.job, wait.milliseconds);
47
- const jobInfo = await this.job.check();
45
+ const isAsync = wait.milliseconds === 0;
46
+ // @ts-expect-error jsforce 2 vs 3 differences.
47
+ const bulk2 = new BulkV2(conn);
48
+ const job = bulk2.job('ingest', { id: resumeOptions.jobInfo.id });
49
+ this.spinner.status = getRemainingTimeStatus({ isAsync, endWaitTime });
50
+ setupLifecycleListeners({
51
+ job,
52
+ cmd: this,
53
+ isAsync,
54
+ apiVersion: conn.getApiVersion(),
55
+ username: conn.getUsername(),
56
+ endWaitTime,
57
+ });
58
+ if (Date.now() < endWaitTime) {
59
+ await job.poll(POLL_FREQUENCY_MS, remainingTime(Date.now())(endWaitTime));
60
+ }
61
+ const jobInfo = await job.check();
48
62
  this.spinner.stop();
49
- this.displayBulkV2Result(jobInfo);
63
+ displayBulkV2Result({ jobInfo, username: conn.getUsername(), isAsync, cmd: this });
50
64
  const result = { jobInfo };
51
65
  if (!isBulkV2RequestDone(jobInfo) || !this.jsonEnabled()) {
52
66
  return result;
53
67
  }
54
- result.records = transformResults(await this.job.getAllResults());
68
+ result.records = transformResults(await job.getAllResults());
55
69
  return result;
56
70
  }
57
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resumeBulkCommand.js","sourceRoot":"","sources":["../src/resumeBulkCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resumeBulkCommand.js","sourceRoot":"","sources":["../src/resumeBulkCommand.ts"],"names":[],"mappings":"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"}
@@ -18,7 +18,7 @@ Batch Status
18
18
 
19
19
  Will poll the batch statuses every %s seconds.
20
20
  To fetch the status on your own, press CTRL+C and use the command:
21
- %s force%sdata%sbulk%sstatus -i %s -b [<batchId>]
21
+ sf force data bulk status -i %s -b [<batchId>]
22
22
 
23
23
  # ExternalIdRequired
24
24
 
@@ -27,12 +27,12 @@ An External ID is required on %s to perform an upsert.
27
27
  # TimeOut
28
28
 
29
29
  The operation timed out. Check the status with command:
30
- %s force%sdata%sbulk%sstatus -i %s -b %s
30
+ sf force data bulk status -i %s -b %s
31
31
 
32
32
  # CheckStatusCommand
33
33
 
34
34
  Check batch #%s’s status with the command:
35
- %s force%sdata%sbulk%sstatus -i %s -b %s
35
+ sf force data bulk status -i %s -b %s
36
36
 
37
37
  # BatchQueued
38
38
 
@@ -4,20 +4,20 @@ Bulk %s request %s started successfully
4
4
 
5
5
  # checkStatus
6
6
 
7
- Run command %s data %s resume -i %s -o %s to check status.
7
+ Run command sf data %s resume -i %s -o %s to check status.
8
8
 
9
9
  # checkJobViaUi
10
10
 
11
11
  To review the details of this job, run:
12
- %s org open --target-org %s --path "/lightning/setup/AsyncApiJobStatus/page?address=%2F%s"
12
+ sf org open --target-org %s --path "/lightning/setup/AsyncApiJobStatus/page?address=%2F%s"
13
13
 
14
14
  # remainingTimeStatus
15
15
 
16
- Remaining time: %d minutes.
16
+ Remaining time: %d minutes
17
17
 
18
18
  # remainingRecordsStatus
19
19
 
20
- %d/%d/%d records successful/failed/processed.
20
+ Processed %d | Success %d | Fail %d
21
21
 
22
22
  # bulkJobFailed
23
23
 
@@ -6,10 +6,6 @@ ID of the job you want to resume.
6
6
 
7
7
  Use the ID of the most recently-run bulk job.
8
8
 
9
- # flags.targetOrg.summary
10
-
11
- Org alias or username to use for the target org.
12
-
13
9
  # flags.wait.summary
14
10
 
15
11
  Number of minutes to wait for the command to complete before displaying the results.
@@ -40,11 +40,11 @@ Data plan file %s did not validate against the schema. Errors: %s.
40
40
 
41
41
  # dataPlanValidationErrorActions
42
42
 
43
- - Did you run the "%s data%sexport%stree" command with the --plan flag?
43
+ - Did you run the "sf data export tree" command with the --plan flag?
44
44
 
45
45
  - Make sure you're importing a plan definition file.
46
46
 
47
- - Get help with the import plan schema by running "%s data%simport%stree --config-help".
47
+ - Get help with the import plan schema by running "sf data import tree --config-help".
48
48
 
49
49
  # FlsError
50
50
 
@@ -1,3 +1,3 @@
1
1
  # bulkV2Result
2
2
 
3
- Job %s Status %s Records processed %d. Records failed %d.
3
+ Job %s | Status %s | Records processed %d | Records failed %d
@@ -56,10 +56,6 @@ Include deleted records. By default, deleted records are not returned.
56
56
 
57
57
  Time to wait for the command to finish, in minutes.
58
58
 
59
- # flags.targetOrg.summary
60
-
61
- Org alias or username to use for the target org.
62
-
63
59
  # displayQueryRecordsRetrieved
64
60
 
65
61
  Total number of records retrieved: %s.