@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.
- package/README.md +3 -903
- package/lib/BulkBaseCommand.js +68 -94
- package/lib/BulkBaseCommand.js.map +1 -1
- package/lib/api/data/tree/exportApi.js +0 -1
- package/lib/api/data/tree/exportApi.js.map +1 -1
- package/lib/api/data/tree/importApi.js +2 -13
- package/lib/api/data/tree/importApi.js.map +1 -1
- package/lib/api/data/tree/importPlan.js.map +1 -1
- package/lib/batcher.js +3 -26
- package/lib/batcher.js.map +1 -1
- package/lib/bulkOperationCommand.js +125 -118
- package/lib/bulkOperationCommand.js.map +1 -1
- package/lib/bulkUtils.js +13 -24
- package/lib/bulkUtils.js.map +1 -1
- package/lib/commands/data/create/record.js.map +1 -1
- package/lib/commands/data/delete/bulk.js +14 -11
- package/lib/commands/data/delete/bulk.js.map +1 -1
- package/lib/commands/data/delete/record.js.map +1 -1
- package/lib/commands/data/delete/resume.js +1 -4
- package/lib/commands/data/delete/resume.js.map +1 -1
- package/lib/commands/data/get/record.js.map +1 -1
- package/lib/commands/data/import/tree.js +1 -1
- package/lib/commands/data/import/tree.js.map +1 -1
- package/lib/commands/data/query/resume.js +21 -10
- package/lib/commands/data/query/resume.js.map +1 -1
- package/lib/commands/data/query.js +38 -12
- package/lib/commands/data/query.js.map +1 -1
- package/lib/commands/data/resume.js +9 -15
- package/lib/commands/data/resume.js.map +1 -1
- package/lib/commands/data/update/record.js.map +1 -1
- package/lib/commands/data/upsert/bulk.js +16 -13
- package/lib/commands/data/upsert/bulk.js.map +1 -1
- package/lib/commands/data/upsert/resume.js +1 -4
- package/lib/commands/data/upsert/resume.js.map +1 -1
- package/lib/commands/force/data/bulk/delete.js +5 -4
- package/lib/commands/force/data/bulk/delete.js.map +1 -1
- package/lib/commands/force/data/bulk/status.js +1 -1
- package/lib/commands/force/data/bulk/status.js.map +1 -1
- package/lib/commands/force/data/bulk/upsert.js +6 -6
- package/lib/commands/force/data/bulk/upsert.js.map +1 -1
- package/lib/dataCommand.js.map +1 -1
- package/lib/dataSoqlQueryTypes.js.map +1 -1
- package/lib/export.js +1 -1
- package/lib/export.js.map +1 -1
- package/lib/flags.js +4 -3
- package/lib/flags.js.map +1 -1
- package/lib/queryUtils.js +3 -1
- package/lib/queryUtils.js.map +1 -1
- package/lib/reporters/csvReporter.js +78 -0
- package/lib/reporters/csvReporter.js.map +1 -0
- package/lib/reporters/humanReporter.js +120 -0
- package/lib/reporters/humanReporter.js.map +1 -0
- package/lib/reporters/reporters.js +69 -0
- package/lib/reporters/reporters.js.map +1 -0
- package/lib/resumeBulkCommand.js +28 -14
- package/lib/resumeBulkCommand.js.map +1 -1
- package/messages/batcher.md +3 -3
- package/messages/bulk.base.command.md +4 -4
- package/messages/bulk.resume.command.md +0 -4
- package/messages/importApi.md +2 -2
- package/messages/reporter.md +1 -1
- package/messages/soql.query.md +0 -4
- package/npm-shrinkwrap.json +497 -961
- package/oclif.lock +1178 -1545
- package/oclif.manifest.json +165 -42
- package/package.json +8 -10
- package/lib/reporters.js +0 -335
- package/lib/reporters.js.map +0 -1
package/lib/reporters.js
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
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 { EOL } from 'node:os';
|
|
8
|
-
import { Logger, Messages } from '@salesforce/core';
|
|
9
|
-
import { ux } from '@oclif/core';
|
|
10
|
-
import chalk from 'chalk';
|
|
11
|
-
import { get, getArray, getNumber, isString } from '@salesforce/ts-types';
|
|
12
|
-
import { capitalCase } from 'change-case';
|
|
13
|
-
import { FieldType } from './dataSoqlQueryTypes.js';
|
|
14
|
-
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
15
|
-
const messages = Messages.loadMessages('@salesforce/plugin-data', 'soql.query');
|
|
16
|
-
const reporterMessages = Messages.loadMessages('@salesforce/plugin-data', 'reporter');
|
|
17
|
-
class Reporter {
|
|
18
|
-
logger;
|
|
19
|
-
constructor() {
|
|
20
|
-
this.logger = Logger.childFromRoot('reporter');
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
class QueryReporter extends Reporter {
|
|
24
|
-
columns = [];
|
|
25
|
-
data;
|
|
26
|
-
constructor(data, columns) {
|
|
27
|
-
super();
|
|
28
|
-
this.columns = columns;
|
|
29
|
-
this.data = data;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
export class HumanReporter extends QueryReporter {
|
|
33
|
-
constructor(data, columns) {
|
|
34
|
-
super(data, columns);
|
|
35
|
-
}
|
|
36
|
-
display() {
|
|
37
|
-
const { attributeNames, children, aggregates } = this.parseFields();
|
|
38
|
-
// in case of count() there are no records, but there is a totalSize
|
|
39
|
-
const totalCount = this.data.result.records.length ? this.data.result.records.length : this.data.result.totalSize;
|
|
40
|
-
this.soqlQuery(attributeNames, this.massageRows(this.data.result.records, children, aggregates), totalCount);
|
|
41
|
-
}
|
|
42
|
-
parseFields() {
|
|
43
|
-
const fields = this.columns;
|
|
44
|
-
// Field names
|
|
45
|
-
const attributeNames = [];
|
|
46
|
-
// For subqueries. Display the children under the parents
|
|
47
|
-
const children = [];
|
|
48
|
-
// For function fields, like avg(total).
|
|
49
|
-
const aggregates = [];
|
|
50
|
-
if (fields) {
|
|
51
|
-
this.logger.info(`Found fields ${JSON.stringify(fields.map((field) => `${typeof field}.${field.name}`))}`);
|
|
52
|
-
fields.forEach((field) => {
|
|
53
|
-
if (field.fieldType === FieldType.subqueryField) {
|
|
54
|
-
children.push(field.name);
|
|
55
|
-
(field.fields ?? []).forEach((subfield) => attributeNames.push(`${field.name}.${subfield.name}`));
|
|
56
|
-
}
|
|
57
|
-
else if (field.fieldType === FieldType.functionField) {
|
|
58
|
-
if (field.alias) {
|
|
59
|
-
attributeNames.push(field.alias);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
attributeNames.push(field.name);
|
|
63
|
-
}
|
|
64
|
-
aggregates.push(field);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
attributeNames.push(field.name);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
this.logger.info(`No fields found for query "${this.data.query}"`);
|
|
73
|
-
}
|
|
74
|
-
return { attributeNames, children, aggregates };
|
|
75
|
-
}
|
|
76
|
-
soqlQuery(columns, records, totalCount) {
|
|
77
|
-
this.prepNullValues(records);
|
|
78
|
-
ux.table(records, prepColumns(columns));
|
|
79
|
-
ux.log(chalk.bold(messages.getMessage('displayQueryRecordsRetrieved', [totalCount])));
|
|
80
|
-
}
|
|
81
|
-
prepNullValues(records) {
|
|
82
|
-
records
|
|
83
|
-
.filter((record) => record)
|
|
84
|
-
.forEach((record) => {
|
|
85
|
-
if (record) {
|
|
86
|
-
const recordAsObject = record;
|
|
87
|
-
Reflect.ownKeys(recordAsObject).forEach((propertyKey) => {
|
|
88
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
89
|
-
const value = Reflect.get(recordAsObject, propertyKey);
|
|
90
|
-
if (value === null) {
|
|
91
|
-
Reflect.set(recordAsObject, propertyKey, chalk.bold('null'));
|
|
92
|
-
}
|
|
93
|
-
else if (typeof value === 'object') {
|
|
94
|
-
this.prepNullValues([value]);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
// public massageRows(queryResults: BasicRecord[], children: string[], aggregates: Field[]): BasicRecord[] {
|
|
101
|
-
massageRows(queryResults, children, aggregates) {
|
|
102
|
-
// some fields will return a JSON object that isn't accessible via the query (SELECT Metadata FROM RemoteProxy)
|
|
103
|
-
// some will return a JSON that IS accessible via the query (SELECT owner.Profile.Name FROM Lead)
|
|
104
|
-
// querying (SELECT Metadata.isActive FROM RemoteProxy) throws a SOQL validation error, so we have to display the entire Metadata object
|
|
105
|
-
queryResults.forEach((qr) => {
|
|
106
|
-
const result = qr;
|
|
107
|
-
this.data.columns.forEach((col) => {
|
|
108
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
109
|
-
const entry = Reflect.get(result, col.name);
|
|
110
|
-
if (typeof entry === 'object' && col.fieldType === FieldType.field) {
|
|
111
|
-
Reflect.set(result, col.name, JSON.stringify(entry, null, 2));
|
|
112
|
-
}
|
|
113
|
-
else if (typeof entry === 'object' && col.fields?.length && entry) {
|
|
114
|
-
col.fields.forEach((field) => {
|
|
115
|
-
Reflect.set(result, `${col.name}.${field.name}`, get(result, `${col.name}.records[0].${field.name}`));
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
// There are subqueries or aggregates. Massage the data.
|
|
121
|
-
if (children.length > 0 || aggregates.length > 0) {
|
|
122
|
-
const qr = queryResults.reduce((newResults, result) => {
|
|
123
|
-
// Aggregates are soql functions that aggregate data, like "SELECT avg(total)" and
|
|
124
|
-
// are returned in the data as exprX. Aggregates can have aliases, like "avg(total) totalAverage"
|
|
125
|
-
// and are returned in the data as the alias.
|
|
126
|
-
if (aggregates.length > 0) {
|
|
127
|
-
for (let i = 0; i < aggregates.length; i++) {
|
|
128
|
-
const aggregate = aggregates[i];
|
|
129
|
-
if (!aggregate.alias) {
|
|
130
|
-
Reflect.set(result, aggregate.name, Reflect.get(result, `expr${i}`));
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
const subResults = [];
|
|
135
|
-
if (children.length > 0) {
|
|
136
|
-
const childrenRows = {};
|
|
137
|
-
children.forEach((child) => {
|
|
138
|
-
const aChild = get(result, child);
|
|
139
|
-
Reflect.set(childrenRows, child, aChild);
|
|
140
|
-
Reflect.deleteProperty(result, child);
|
|
141
|
-
});
|
|
142
|
-
Reflect.ownKeys(childrenRows).forEach((child) => {
|
|
143
|
-
const childO = get(childrenRows, child);
|
|
144
|
-
if (childO) {
|
|
145
|
-
const childRecords = getArray(childO, 'records', []);
|
|
146
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
147
|
-
childRecords.forEach((record, index) => {
|
|
148
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
149
|
-
const newResult = {};
|
|
150
|
-
Object.entries(record).forEach(([key, value]) => {
|
|
151
|
-
if (!index) {
|
|
152
|
-
Reflect.defineProperty(result, `${child.toString()}.${key}`, {
|
|
153
|
-
value: value ?? chalk.bold('null'),
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
Reflect.defineProperty(newResult, `${child.toString()}.${key}`, {
|
|
158
|
-
value: value ?? chalk.bold('null'),
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
if (index) {
|
|
163
|
-
subResults.push(newResult);
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
newResults.push(result, ...subResults);
|
|
170
|
-
return newResults;
|
|
171
|
-
}, []);
|
|
172
|
-
return qr;
|
|
173
|
-
}
|
|
174
|
-
return queryResults;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
const SEPARATOR = ',';
|
|
178
|
-
const DOUBLE_QUOTE = '"';
|
|
179
|
-
const SHOULD_QUOTE_REGEXP = new RegExp(`[${SEPARATOR}${DOUBLE_QUOTE}${EOL}]`);
|
|
180
|
-
export class CsvReporter extends QueryReporter {
|
|
181
|
-
constructor(data, columns) {
|
|
182
|
-
super(data, columns);
|
|
183
|
-
}
|
|
184
|
-
display() {
|
|
185
|
-
const attributeNames = this.massageRows();
|
|
186
|
-
// begin output
|
|
187
|
-
ux.log(attributeNames.map((name) => escape(name)).join(SEPARATOR));
|
|
188
|
-
// explained why we need this below - foreach does not allow types
|
|
189
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
190
|
-
// @ts-ignore
|
|
191
|
-
this.data.result.records.forEach((row) => {
|
|
192
|
-
const values = attributeNames.map((name) => {
|
|
193
|
-
// try get(row, name) first, then if it fails, default to row[name]. The default will happen in bulk cases.
|
|
194
|
-
// the standard case returns {field:{nested: 'value'}}, while the bulk will return {field.nested: 'value'}
|
|
195
|
-
const value = get(row, name, row[name]);
|
|
196
|
-
if (isString(value)) {
|
|
197
|
-
return escape(value);
|
|
198
|
-
// if value is null, then typeof value === 'object' so check before typeof to avoid illegal csv
|
|
199
|
-
}
|
|
200
|
-
else if (value === null) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
else if (typeof value === 'object') {
|
|
204
|
-
return escape(JSON.stringify(value));
|
|
205
|
-
}
|
|
206
|
-
return value;
|
|
207
|
-
});
|
|
208
|
-
ux.log(values.join(SEPARATOR));
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
massageRows() {
|
|
212
|
-
const fields = this.columns;
|
|
213
|
-
const hasSubqueries = fields.some((field) => field.fieldType === FieldType.subqueryField);
|
|
214
|
-
const hasFunctions = fields.some((field) => field.fieldType === FieldType.functionField);
|
|
215
|
-
const attributeNames = [];
|
|
216
|
-
if (fields) {
|
|
217
|
-
this.logger.info(`Found fields ${JSON.stringify(fields.map((field) => `${typeof field}.${field.name}`))}`);
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
this.logger.info(`No fields found for query "${this.data.query}"`);
|
|
221
|
-
}
|
|
222
|
-
if (hasSubqueries || hasFunctions) {
|
|
223
|
-
// If there are subqueries, we need to get the max child length for each subquery.
|
|
224
|
-
const typeLengths = new Map();
|
|
225
|
-
// For function fields, like avg(total).
|
|
226
|
-
const aggregates = [];
|
|
227
|
-
fields.forEach((field) => {
|
|
228
|
-
if (field.fieldType === FieldType.subqueryField) {
|
|
229
|
-
typeLengths.set(field.name, 0);
|
|
230
|
-
}
|
|
231
|
-
if (field.fieldType === FieldType.functionField) {
|
|
232
|
-
aggregates.push(field);
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
// Get max lengths by iterating over the records once
|
|
236
|
-
this.data.result.records.forEach((result) => {
|
|
237
|
-
[...typeLengths.keys()].forEach((key) => {
|
|
238
|
-
const record = get(result, key);
|
|
239
|
-
const totalSize = getNumber(record, 'totalSize');
|
|
240
|
-
if (!!totalSize && totalSize > (typeLengths.get(key) ?? 0)) {
|
|
241
|
-
typeLengths.set(key, totalSize);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
// Aggregates are soql functions that aggregate data, like "SELECT avg(total)" and
|
|
245
|
-
// are returned in the data as exprX. Aggregates can have aliases, like "avg(total) totalAverage"
|
|
246
|
-
// and are returned in the data as the alias.
|
|
247
|
-
if (aggregates.length > 0) {
|
|
248
|
-
for (let i = 0; i < aggregates.length; i++) {
|
|
249
|
-
const aggregate = aggregates[i];
|
|
250
|
-
if (!aggregate.alias) {
|
|
251
|
-
Reflect.set(result, aggregate.name, Reflect.get(result, `expr${i}`));
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
fields.forEach((field) => {
|
|
257
|
-
if (typeLengths.get(field.name)) {
|
|
258
|
-
for (let i = 0; i < (typeLengths.get(field.name) ?? 0); i++) {
|
|
259
|
-
attributeNames.push(`${field.name}.totalSize`);
|
|
260
|
-
(field.fields ?? []).forEach((subfield) => {
|
|
261
|
-
attributeNames.push(`${field.name}.records.${i}.${subfield.name}`);
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
else if (field.fieldType === FieldType.functionField) {
|
|
266
|
-
if (field.alias) {
|
|
267
|
-
attributeNames.push(field.alias);
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
attributeNames.push(field.name);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
attributeNames.push(field.name);
|
|
275
|
-
}
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
attributeNames.push(...fields.map((field) => field.name));
|
|
280
|
-
}
|
|
281
|
-
return attributeNames;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
export class JsonReporter extends QueryReporter {
|
|
285
|
-
constructor(data, columns) {
|
|
286
|
-
super(data, columns);
|
|
287
|
-
}
|
|
288
|
-
// eslint-disable-next-line class-methods-use-this
|
|
289
|
-
log() {
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
display() {
|
|
293
|
-
ux.styledJSON({ status: 0, result: this.data.result });
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
const prepColumns = (columns) => {
|
|
297
|
-
const formattedColumns = {};
|
|
298
|
-
columns
|
|
299
|
-
.map((field) => field)
|
|
300
|
-
.filter(isString)
|
|
301
|
-
.map((field) => (formattedColumns[field] = {
|
|
302
|
-
header: field.toUpperCase(),
|
|
303
|
-
get: (row) => {
|
|
304
|
-
// first test if key exists, if so, return value
|
|
305
|
-
if (Reflect.has(row, field)) {
|
|
306
|
-
return Reflect.get(row, field) ?? '';
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
// if not, try to find it query
|
|
310
|
-
return get(row, field) ?? '';
|
|
311
|
-
}
|
|
312
|
-
},
|
|
313
|
-
}));
|
|
314
|
-
return formattedColumns;
|
|
315
|
-
};
|
|
316
|
-
/**
|
|
317
|
-
* Escape a value to be placed in a CSV row. We follow rfc 4180
|
|
318
|
-
* https://tools.ietf.org/html/rfc4180#section-2 and will not surround the
|
|
319
|
-
* value in quotes if it doesn't contain the separator, double quote, or EOL.
|
|
320
|
-
*
|
|
321
|
-
* @param value The escaped value
|
|
322
|
-
*/
|
|
323
|
-
export const escape = (value) => {
|
|
324
|
-
if (value && SHOULD_QUOTE_REGEXP.test(value)) {
|
|
325
|
-
return `"${value.replace(/"/gi, '""')}"`;
|
|
326
|
-
}
|
|
327
|
-
return value;
|
|
328
|
-
};
|
|
329
|
-
export const getResultMessage = (jobInfo) => reporterMessages.getMessage('bulkV2Result', [
|
|
330
|
-
jobInfo.id,
|
|
331
|
-
capitalCase(jobInfo.state),
|
|
332
|
-
jobInfo.numberRecordsProcessed,
|
|
333
|
-
jobInfo.numberRecordsFailed,
|
|
334
|
-
]);
|
|
335
|
-
//# sourceMappingURL=reporters.js.map
|
package/lib/reporters.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporters.js","sourceRoot":"","sources":["../src/reporters.ts"],"names":[],"mappings":"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"}
|