bulkyard 1.2.0 → 1.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/lib/core/extractor.js +82 -20
- package/lib/core/extractor.js.map +1 -1
- package/oclif.lock +8 -28
- package/oclif.manifest.json +1 -1
- package/package.json +2 -1
package/lib/core/extractor.js
CHANGED
|
@@ -1,29 +1,91 @@
|
|
|
1
|
+
import { parse } from 'csv-parse/sync';
|
|
2
|
+
const BATCH_SIZE = 1000;
|
|
3
|
+
const POLL_INTERVAL_MS = 2000;
|
|
4
|
+
const POLL_TIMEOUT_MS = 600_000;
|
|
5
|
+
// Recursive rather than looping to satisfy no-constant-condition and no-await-in-loop.
|
|
6
|
+
async function waitForJobCompletion(conn, jobId, deadline) {
|
|
7
|
+
if (Date.now() > deadline) {
|
|
8
|
+
throw new Error(`Bulk query job timed out after ${POLL_TIMEOUT_MS / 1000}s`);
|
|
9
|
+
}
|
|
10
|
+
const jobUrl = `${conn.instanceUrl}/services/data/v${conn.getApiVersion()}/jobs/query/${jobId}`;
|
|
11
|
+
const info = await conn.requestGet(jobUrl);
|
|
12
|
+
if (info.state === 'JobComplete')
|
|
13
|
+
return;
|
|
14
|
+
if (info.state === 'Failed' || info.state === 'Aborted') {
|
|
15
|
+
const detail = info.errorMessage ? `: ${info.errorMessage}` : '';
|
|
16
|
+
throw new Error(`Bulk query job ${info.state}${detail}`);
|
|
17
|
+
}
|
|
18
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
19
|
+
return waitForJobCompletion(conn, jobId, deadline);
|
|
20
|
+
}
|
|
21
|
+
function parseCsvPage(csvText) {
|
|
22
|
+
// csv-parse uses snake_case option names
|
|
23
|
+
// eslint-disable-next-line camelcase
|
|
24
|
+
return parse(csvText, { columns: true, skip_empty_lines: true, cast: (v) => (v === '' ? null : v) });
|
|
25
|
+
}
|
|
1
26
|
export async function extractObject(conn, db, objConfig) {
|
|
2
27
|
const tableName = objConfig.table ?? objConfig.object;
|
|
3
28
|
try {
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
if (records.length === 0) {
|
|
7
|
-
return { object: objConfig.object, table: tableName, recordCount: 0, success: true };
|
|
8
|
-
}
|
|
9
|
-
const firstRecord = records[0];
|
|
10
|
-
const recordKeys = Object.keys(firstRecord).filter((k) => k !== 'attributes');
|
|
29
|
+
const apiVersion = conn.getApiVersion();
|
|
30
|
+
const jobsUrl = `${conn.instanceUrl}/services/data/v${apiVersion}/jobs/query`;
|
|
11
31
|
const describeResult = await conn.describe(objConfig.object);
|
|
12
32
|
const fieldMap = new Map(describeResult.fields.map((f) => [f.name, f.type]));
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
db.createTable(tableName, columns);
|
|
18
|
-
const cleanRecords = records.map((rec) => {
|
|
19
|
-
const cleaned = {};
|
|
20
|
-
for (const key of recordKeys) {
|
|
21
|
-
cleaned[key] = rec[key];
|
|
22
|
-
}
|
|
23
|
-
return cleaned;
|
|
33
|
+
// Create the bulk query job
|
|
34
|
+
const jobInfo = await conn.requestPost(jobsUrl, {
|
|
35
|
+
operation: 'query',
|
|
36
|
+
query: objConfig.query,
|
|
24
37
|
});
|
|
25
|
-
|
|
26
|
-
|
|
38
|
+
// Poll until the job is complete
|
|
39
|
+
await waitForJobCompletion(conn, jobInfo.id, Date.now() + POLL_TIMEOUT_MS);
|
|
40
|
+
// Fetch result pages one at a time using the Sforce-Locator header.
|
|
41
|
+
// Using fetch directly (rather than conn.bulk2.query's streaming abstraction) because
|
|
42
|
+
// jsforce's QueryJobV2.result() pipes multiple locator pages to the same stream with
|
|
43
|
+
// {end: true}, closing it after the first page and silently dropping subsequent pages.
|
|
44
|
+
const resultsBaseUrl = `${jobsUrl}/${jobInfo.id}/results`;
|
|
45
|
+
const authHeaders = {
|
|
46
|
+
Authorization: `Bearer ${conn.accessToken}`,
|
|
47
|
+
Accept: 'text/csv',
|
|
48
|
+
};
|
|
49
|
+
let locator = null;
|
|
50
|
+
let recordKeys = null;
|
|
51
|
+
let buffer = [];
|
|
52
|
+
let totalCount = 0;
|
|
53
|
+
do {
|
|
54
|
+
const url = locator ? `${resultsBaseUrl}?locator=${encodeURIComponent(locator)}` : resultsBaseUrl;
|
|
55
|
+
// eslint-disable-next-line no-await-in-loop
|
|
56
|
+
const response = await fetch(url, { headers: authHeaders });
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
// eslint-disable-next-line no-await-in-loop
|
|
59
|
+
const body = await response.text();
|
|
60
|
+
throw new Error(`Failed to fetch results page (${response.status}): ${body}`);
|
|
61
|
+
}
|
|
62
|
+
locator = response.headers.get('sforce-locator');
|
|
63
|
+
// eslint-disable-next-line no-await-in-loop
|
|
64
|
+
const csvText = await response.text();
|
|
65
|
+
if (!csvText.trim())
|
|
66
|
+
continue;
|
|
67
|
+
const rows = parseCsvPage(csvText);
|
|
68
|
+
for (const row of rows) {
|
|
69
|
+
if (recordKeys === null) {
|
|
70
|
+
recordKeys = Object.keys(row);
|
|
71
|
+
const columns = recordKeys.map((key) => ({
|
|
72
|
+
name: key,
|
|
73
|
+
sfType: fieldMap.get(key) ?? 'string',
|
|
74
|
+
}));
|
|
75
|
+
db.createTable(tableName, columns);
|
|
76
|
+
}
|
|
77
|
+
buffer.push(row);
|
|
78
|
+
totalCount++;
|
|
79
|
+
if (buffer.length >= BATCH_SIZE) {
|
|
80
|
+
db.insertRecords(tableName, recordKeys, buffer);
|
|
81
|
+
buffer = [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
} while (locator && locator !== 'null');
|
|
85
|
+
if (buffer.length > 0 && recordKeys !== null) {
|
|
86
|
+
db.insertRecords(tableName, recordKeys, buffer);
|
|
87
|
+
}
|
|
88
|
+
return { object: objConfig.object, table: tableName, recordCount: totalCount, success: true };
|
|
27
89
|
}
|
|
28
90
|
catch (err) {
|
|
29
91
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/core/extractor.ts"],"names":[],"mappings":"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"}
|
package/oclif.lock
CHANGED
|
@@ -3234,6 +3234,11 @@ csstype@^3.0.2:
|
|
|
3234
3234
|
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
|
|
3235
3235
|
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
|
3236
3236
|
|
|
3237
|
+
csv-parse@^5:
|
|
3238
|
+
version "5.6.0"
|
|
3239
|
+
resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.6.0.tgz#219beace2a3e9f28929999d2aa417d3fb3071c7f"
|
|
3240
|
+
integrity sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q==
|
|
3241
|
+
|
|
3237
3242
|
csv-parse@^5.5.2:
|
|
3238
3243
|
version "5.5.5"
|
|
3239
3244
|
resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-5.5.5.tgz"
|
|
@@ -6951,16 +6956,7 @@ stack-utils@^2.0.6:
|
|
|
6951
6956
|
dependencies:
|
|
6952
6957
|
escape-string-regexp "^2.0.0"
|
|
6953
6958
|
|
|
6954
|
-
"string-width-cjs@npm:string-width@^4.2.0":
|
|
6955
|
-
version "4.2.3"
|
|
6956
|
-
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
|
|
6957
|
-
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
|
6958
|
-
dependencies:
|
|
6959
|
-
emoji-regex "^8.0.0"
|
|
6960
|
-
is-fullwidth-code-point "^3.0.0"
|
|
6961
|
-
strip-ansi "^6.0.1"
|
|
6962
|
-
|
|
6963
|
-
string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
|
6959
|
+
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
|
6964
6960
|
version "4.2.3"
|
|
6965
6961
|
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
|
|
6966
6962
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
|
@@ -7028,14 +7024,7 @@ string_decoder@~1.1.1:
|
|
|
7028
7024
|
dependencies:
|
|
7029
7025
|
safe-buffer "~5.1.0"
|
|
7030
7026
|
|
|
7031
|
-
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
|
7032
|
-
version "6.0.1"
|
|
7033
|
-
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
|
|
7034
|
-
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
|
7035
|
-
dependencies:
|
|
7036
|
-
ansi-regex "^5.0.1"
|
|
7037
|
-
|
|
7038
|
-
strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
|
7027
|
+
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
|
7039
7028
|
version "6.0.1"
|
|
7040
7029
|
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
|
|
7041
7030
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
|
@@ -7626,7 +7615,7 @@ workerpool@6.2.1:
|
|
|
7626
7615
|
resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz"
|
|
7627
7616
|
integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
|
|
7628
7617
|
|
|
7629
|
-
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
|
7618
|
+
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
|
7630
7619
|
version "7.0.0"
|
|
7631
7620
|
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
|
|
7632
7621
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
|
@@ -7644,15 +7633,6 @@ wrap-ansi@^6.2.0:
|
|
|
7644
7633
|
string-width "^4.1.0"
|
|
7645
7634
|
strip-ansi "^6.0.0"
|
|
7646
7635
|
|
|
7647
|
-
wrap-ansi@^7.0.0:
|
|
7648
|
-
version "7.0.0"
|
|
7649
|
-
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
|
|
7650
|
-
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
|
7651
|
-
dependencies:
|
|
7652
|
-
ansi-styles "^4.0.0"
|
|
7653
|
-
string-width "^4.1.0"
|
|
7654
|
-
strip-ansi "^6.0.0"
|
|
7655
|
-
|
|
7656
7636
|
wrap-ansi@^8.1.0:
|
|
7657
7637
|
version "8.1.0"
|
|
7658
7638
|
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bulkyard",
|
|
3
3
|
"description": "A Salesforce CLI plugin for bulk data extraction and loading via local SQLite3 databases.",
|
|
4
|
-
"version": "1.2.
|
|
4
|
+
"version": "1.2.1",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "^4",
|
|
7
7
|
"@salesforce/core": "^8",
|
|
8
8
|
"@salesforce/sf-plugins-core": "^12",
|
|
9
9
|
"better-sqlite3": "^9",
|
|
10
|
+
"csv-parse": "^5",
|
|
10
11
|
"js-yaml": "^4.1.1"
|
|
11
12
|
},
|
|
12
13
|
"devDependencies": {
|