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.
@@ -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 queryResult = await conn.bulk2.query(objConfig.query);
5
- const records = await queryResult.toArray();
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
- const columns = recordKeys.map((key) => ({
14
- name: key,
15
- sfType: fieldMap.get(key) ?? 'string',
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
- db.insertRecords(tableName, recordKeys, cleanRecords);
26
- return { object: objConfig.object, table: tableName, recordCount: records.length, success: true };
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":"AAkBA,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAgB,EAChB,EAAoB,EACpB,SAA+B;IAE/B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,KAAM,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACvF,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAA4B,CAAC;QAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC;QAE9E,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE7E,MAAM,OAAO,GAAgB,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ;SACtC,CAAC,CAAC,CAAC;QAEJ,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEnC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,OAAO,GAA4B,EAAE,CAAC;YAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,GAAI,GAA+B,CAAC,GAAG,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAEtD,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACxG,CAAC;AACH,CAAC"}
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"
@@ -312,5 +312,5 @@
312
312
  ]
313
313
  }
314
314
  },
315
- "version": "1.2.0"
315
+ "version": "1.2.1"
316
316
  }
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.0",
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": {