@simplysf/simply-apex 1.1.18 → 1.2.0
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
CHANGED
|
@@ -31,7 +31,7 @@ Execute anonymous Apex code.
|
|
|
31
31
|
|
|
32
32
|
```
|
|
33
33
|
USAGE
|
|
34
|
-
$ sf simply apex execute -
|
|
34
|
+
$ sf simply apex execute -o <value> -f <value> [--json] [--flags-dir <value>] [--api-version <value>]
|
|
35
35
|
|
|
36
36
|
FLAGS
|
|
37
37
|
-f, --file=<value> (required) Path to Apex file
|
|
@@ -58,7 +58,7 @@ FLAG DESCRIPTIONS
|
|
|
58
58
|
The path to the local .apex file containing the anonymous Apex code to execute.
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
-
_See code: [lib/commands/simply/apex/execute.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.
|
|
61
|
+
_See code: [lib/commands/simply/apex/execute.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.18/packages/simply-apex/lib/commands/simply/apex/execute.js)_
|
|
62
62
|
|
|
63
63
|
## `sf simply apex logs purge`
|
|
64
64
|
|
|
@@ -66,13 +66,16 @@ Purge Apex debug logs.
|
|
|
66
66
|
|
|
67
67
|
```
|
|
68
68
|
USAGE
|
|
69
|
-
$ sf simply apex logs purge -o <value> [--json] [--flags-dir <value>] [--api-version <value>] [-w <value>]
|
|
69
|
+
$ sf simply apex logs purge -o <value> [--json] [--flags-dir <value>] [--api-version <value>] [-w <value>] [-b] [--wait
|
|
70
|
+
<value>]
|
|
70
71
|
|
|
71
72
|
FLAGS
|
|
73
|
+
-b, --use-bulk-api Use Bulk API v2 to query and delete the logs.
|
|
72
74
|
-o, --target-org=<value> (required) Username or alias of the target org. Not required if the `target-org`
|
|
73
75
|
configuration variable is already set.
|
|
74
76
|
-w, --where=<value> SOQL WHERE clause
|
|
75
77
|
--api-version=<value> Override the api version used for api requests made by this command
|
|
78
|
+
--wait=<value> Number of minutes to wait for the Bulk API jobs to finish.
|
|
76
79
|
|
|
77
80
|
GLOBAL FLAGS
|
|
78
81
|
--flags-dir=<value> Import flag values from a directory.
|
|
@@ -89,13 +92,29 @@ EXAMPLES
|
|
|
89
92
|
|
|
90
93
|
$ sf simply apex logs purge --target-org myOrg --where "Status = 'Success'"
|
|
91
94
|
|
|
95
|
+
$ sf simply apex logs purge --target-org myOrg --use-bulk-api
|
|
96
|
+
|
|
97
|
+
$ sf simply apex logs purge --target-org myOrg --use-bulk-api --wait 60
|
|
98
|
+
|
|
92
99
|
FLAG DESCRIPTIONS
|
|
100
|
+
-b, --use-bulk-api Use Bulk API v2 to query and delete the logs.
|
|
101
|
+
|
|
102
|
+
Runs the whole purge as two Bulk API v2 jobs instead of a Tooling API query followed by chunked REST deletes. Bulk
|
|
103
|
+
API processes the deletion asynchronously and does not consume the org's REST API request limit, which suits purges
|
|
104
|
+
of tens of thousands of logs. For small purges the default REST path is faster, since it avoids the overhead of
|
|
105
|
+
creating, uploading, and polling a job.
|
|
106
|
+
|
|
93
107
|
-w, --where=<value> SOQL WHERE clause
|
|
94
108
|
|
|
95
109
|
A WHERE clause used to filter which ApexLog records are purged (e.g. "Status = 'Success'").
|
|
110
|
+
|
|
111
|
+
--wait=<value> Number of minutes to wait for the Bulk API jobs to finish.
|
|
112
|
+
|
|
113
|
+
Only applies with --use-bulk-api. The command polls the query and delete jobs until they complete or this timeout
|
|
114
|
+
elapses, then throws.
|
|
96
115
|
```
|
|
97
116
|
|
|
98
|
-
_See code: [lib/commands/simply/apex/logs/purge.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.
|
|
117
|
+
_See code: [lib/commands/simply/apex/logs/purge.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.18/packages/simply-apex/lib/commands/simply/apex/logs/purge.js)_
|
|
99
118
|
|
|
100
119
|
## `sf simply apex trace setup`
|
|
101
120
|
|
|
@@ -124,7 +143,7 @@ EXAMPLES
|
|
|
124
143
|
$ sf simply apex trace setup --target-org myOrg
|
|
125
144
|
```
|
|
126
145
|
|
|
127
|
-
_See code: [lib/commands/simply/apex/trace/setup.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.
|
|
146
|
+
_See code: [lib/commands/simply/apex/trace/setup.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.18/packages/simply-apex/lib/commands/simply/apex/trace/setup.js)_
|
|
128
147
|
|
|
129
148
|
## `sf simply apex trace silence`
|
|
130
149
|
|
|
@@ -168,21 +187,5 @@ FLAG DESCRIPTIONS
|
|
|
168
187
|
silence.
|
|
169
188
|
```
|
|
170
189
|
|
|
171
|
-
_See code: [lib/commands/simply/apex/trace/silence.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.
|
|
190
|
+
_See code: [lib/commands/simply/apex/trace/silence.js](https://github.com/SimplySF/simply-node/blob/@simplysf/simply-apex@1.1.18/packages/simply-apex/lib/commands/simply/apex/trace/silence.js)_
|
|
172
191
|
<!-- commandsstop -->
|
|
173
|
-
|
|
174
|
-
## Configuration Files
|
|
175
|
-
|
|
176
|
-
### `sf simply apex trace silence --classes-file`
|
|
177
|
-
|
|
178
|
-
The `--classes-file` flag on `sf simply apex trace silence` takes the path to a JSON file listing which Apex classes to silence:
|
|
179
|
-
|
|
180
|
-
```json
|
|
181
|
-
{
|
|
182
|
-
"classes": ["AccountTriggerHandler", "NoisyBatchClass"]
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
| Field | Type | Required | Description |
|
|
187
|
-
| --------- | ---------- | -------- | -------------------------------------------------------------------------- |
|
|
188
|
-
| `classes` | `string[]` | Yes | One or more Apex class API names to silence. Must have at least one entry. |
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Duration } from '@salesforce/kit';
|
|
1
2
|
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
3
|
/** Outcome of deleting a single `ApexLog` record. */
|
|
3
4
|
export type ApexLogsPurgeResult = {
|
|
@@ -15,6 +16,8 @@ export default class ApexLogsPurge extends SfCommand<ApexLogsPurgeResult[]> {
|
|
|
15
16
|
static readonly examples: string[];
|
|
16
17
|
static readonly flags: {
|
|
17
18
|
where: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
19
|
+
'use-bulk-api': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
20
|
+
wait: import("@oclif/core/interfaces").OptionFlag<Duration, import("@oclif/core/interfaces").CustomOptions>;
|
|
18
21
|
'api-version': import("@oclif/core/interfaces").OptionFlag<string | undefined>;
|
|
19
22
|
'target-org': import("@oclif/core/interfaces").OptionFlag<import("@salesforce/core").Org>;
|
|
20
23
|
'flags-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
@@ -24,4 +27,12 @@ export default class ApexLogsPurge extends SfCommand<ApexLogsPurgeResult[]> {
|
|
|
24
27
|
* filter.
|
|
25
28
|
*/
|
|
26
29
|
run(): Promise<ApexLogsPurgeResult[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Deletes through the core connection's SObject Collections resource, 200 records per call.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately not `.tooling`: `ApexLog` is exposed on both APIs, but only core REST implements
|
|
34
|
+
* the Collections resource a bulk delete needs. `/tooling/composite/sobjects` does not exist and
|
|
35
|
+
* answers 404 "The requested resource does not exist".
|
|
36
|
+
*/
|
|
37
|
+
private deleteViaCollections;
|
|
27
38
|
}
|
|
@@ -14,12 +14,16 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
import { Messages } from '@salesforce/core';
|
|
17
|
+
import { Duration } from '@salesforce/kit';
|
|
17
18
|
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
18
19
|
import { requireConnection, targetOrgFlags } from '@simplysf/simply-plugin-kit';
|
|
19
20
|
import { chunk } from '@simplysf/simply-core';
|
|
20
21
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
21
22
|
const messages = Messages.loadMessages('@simplysf/simply-apex', 'simply.apex.logs.purge');
|
|
22
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* Maximum number of `ApexLog` records to delete per SObject Collections call, which is the API's
|
|
25
|
+
* own ceiling and matches jsforce's `MAX_DML_COUNT`.
|
|
26
|
+
*/
|
|
23
27
|
const CHUNK_SIZE = 200;
|
|
24
28
|
/**
|
|
25
29
|
* Deletes `ApexLog` records from the target org. By default all logs are purged; use `--where`
|
|
@@ -37,6 +41,19 @@ export default class ApexLogsPurge extends SfCommand {
|
|
|
37
41
|
description: messages.getMessage('flags.where.description'),
|
|
38
42
|
char: 'w',
|
|
39
43
|
}),
|
|
44
|
+
'use-bulk-api': Flags.boolean({
|
|
45
|
+
summary: messages.getMessage('flags.use-bulk-api.summary'),
|
|
46
|
+
description: messages.getMessage('flags.use-bulk-api.description'),
|
|
47
|
+
char: 'b',
|
|
48
|
+
default: false,
|
|
49
|
+
}),
|
|
50
|
+
wait: Flags.duration({
|
|
51
|
+
unit: 'minutes',
|
|
52
|
+
summary: messages.getMessage('flags.wait.summary'),
|
|
53
|
+
description: messages.getMessage('flags.wait.description'),
|
|
54
|
+
// jsforce defaults bulk polling to 30 seconds, which no real purge finishes within.
|
|
55
|
+
default: Duration.minutes(30),
|
|
56
|
+
}),
|
|
40
57
|
};
|
|
41
58
|
/**
|
|
42
59
|
* @returns The delete outcome for every `ApexLog` record matched by the (optional) `--where`
|
|
@@ -45,35 +62,25 @@ export default class ApexLogsPurge extends SfCommand {
|
|
|
45
62
|
async run() {
|
|
46
63
|
const { flags } = await this.parse(ApexLogsPurge);
|
|
47
64
|
const targetOrgConnection = requireConnection(flags);
|
|
65
|
+
const useBulkApi = flags['use-bulk-api'];
|
|
66
|
+
const pollTimeout = flags.wait.milliseconds;
|
|
48
67
|
let query = 'SELECT Id FROM ApexLog';
|
|
49
68
|
if (flags.where) {
|
|
50
69
|
query += ` WHERE ${flags.where}`;
|
|
51
70
|
}
|
|
52
71
|
this.spinner.start(messages.getMessage('info.queryingLogs'));
|
|
53
|
-
const
|
|
72
|
+
const logIds = useBulkApi
|
|
73
|
+
? await queryLogIdsViaBulkApi(targetOrgConnection, query, pollTimeout)
|
|
74
|
+
: await queryLogIdsViaRest(targetOrgConnection, query);
|
|
54
75
|
this.spinner.stop();
|
|
55
|
-
if (
|
|
76
|
+
if (logIds.length === 0) {
|
|
56
77
|
this.info(messages.getMessage('info.noLogsToPurge'));
|
|
57
78
|
return [];
|
|
58
79
|
}
|
|
59
|
-
const logIds = queryResult.records.map((record) => record.Id);
|
|
60
|
-
const results = [];
|
|
61
80
|
this.spinner.start(messages.getMessage('info.purgingLogs', [logIds.length]));
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
this.spinner.status = `${purged}/${logIds.length}`;
|
|
66
|
-
// eslint-disable-next-line no-await-in-loop
|
|
67
|
-
const deleteResults = await targetOrgConnection.tooling.delete('ApexLog', idChunk);
|
|
68
|
-
const deleteResultsArray = Array.isArray(deleteResults) ? deleteResults : [deleteResults];
|
|
69
|
-
deleteResultsArray.forEach((deleteResult) => {
|
|
70
|
-
results.push({
|
|
71
|
-
Id: deleteResult.id ?? 'unknown',
|
|
72
|
-
Success: deleteResult.success,
|
|
73
|
-
Error: deleteResult.success ? undefined : deleteResult.errors.map((e) => e.message).join(', '),
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
}
|
|
81
|
+
const results = useBulkApi
|
|
82
|
+
? await deleteViaBulkApi(targetOrgConnection, logIds, pollTimeout)
|
|
83
|
+
: await this.deleteViaCollections(targetOrgConnection, logIds);
|
|
77
84
|
this.spinner.stop();
|
|
78
85
|
const successCount = results.filter((result) => result.Success).length;
|
|
79
86
|
const failureCount = results.length - successCount;
|
|
@@ -93,5 +100,76 @@ export default class ApexLogsPurge extends SfCommand {
|
|
|
93
100
|
});
|
|
94
101
|
return results;
|
|
95
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Deletes through the core connection's SObject Collections resource, 200 records per call.
|
|
105
|
+
*
|
|
106
|
+
* Deliberately not `.tooling`: `ApexLog` is exposed on both APIs, but only core REST implements
|
|
107
|
+
* the Collections resource a bulk delete needs. `/tooling/composite/sobjects` does not exist and
|
|
108
|
+
* answers 404 "The requested resource does not exist".
|
|
109
|
+
*/
|
|
110
|
+
async deleteViaCollections(connection, logIds) {
|
|
111
|
+
const results = [];
|
|
112
|
+
let purged = 0;
|
|
113
|
+
for (const idChunk of chunk(logIds, CHUNK_SIZE)) {
|
|
114
|
+
purged += idChunk.length;
|
|
115
|
+
this.spinner.status = `${purged}/${logIds.length}`;
|
|
116
|
+
// eslint-disable-next-line no-await-in-loop -- batches are sequential so the spinner tracks real progress
|
|
117
|
+
const deleteResults = await connection.delete('ApexLog', idChunk);
|
|
118
|
+
const deleteResultsArray = Array.isArray(deleteResults) ? deleteResults : [deleteResults];
|
|
119
|
+
deleteResultsArray.forEach((deleteResult, index) => {
|
|
120
|
+
results.push({
|
|
121
|
+
Id: deleteResult.id ?? idChunk[index] ?? 'unknown',
|
|
122
|
+
Success: deleteResult.success,
|
|
123
|
+
Error: deleteResult.success ? undefined : deleteResult.errors.map((e) => e.message).join(', '),
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Collects matching log IDs through the Tooling API, which returns them in a single response. */
|
|
131
|
+
async function queryLogIdsViaRest(connection, query) {
|
|
132
|
+
const queryResult = await connection.tooling.query(query);
|
|
133
|
+
return queryResult.records.map((record) => record.Id);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Collects matching log IDs through a Bulk API v2 query job. The job streams CSV back, so the IDs
|
|
137
|
+
* are gathered from the record stream rather than a single response body.
|
|
138
|
+
*/
|
|
139
|
+
async function queryLogIdsViaBulkApi(connection, query, pollTimeout) {
|
|
140
|
+
const recordStream = await connection.bulk2.query(query, { pollTimeout });
|
|
141
|
+
const logIds = [];
|
|
142
|
+
for await (const record of recordStream) {
|
|
143
|
+
const { Id: id } = record;
|
|
144
|
+
if (id) {
|
|
145
|
+
logIds.push(id);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return logIds;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Deletes through a Bulk API v2 ingest job. The whole set goes up as one job rather than in
|
|
152
|
+
* 200-record chunks, and the org processes it asynchronously without spending REST request limit.
|
|
153
|
+
*/
|
|
154
|
+
async function deleteViaBulkApi(connection, logIds, pollTimeout) {
|
|
155
|
+
const { successfulResults, failedResults } = await connection.bulk2.loadAndWaitForResults({
|
|
156
|
+
object: 'ApexLog',
|
|
157
|
+
operation: 'delete',
|
|
158
|
+
input: logIds.map((Id) => ({ Id })),
|
|
159
|
+
pollTimeout,
|
|
160
|
+
});
|
|
161
|
+
return [
|
|
162
|
+
...successfulResults.map((result) => ({ Id: result.sf__Id, Success: true })),
|
|
163
|
+
...failedResults.map((result) => {
|
|
164
|
+
// A failed row reports an empty (not absent) `sf__Id`; the submitted `Id` column is echoed
|
|
165
|
+
// back alongside it, so prefer that to keep every failure traceable to a specific log.
|
|
166
|
+
const submittedId = result.Id;
|
|
167
|
+
return {
|
|
168
|
+
Id: result.sf__Id.length > 0 ? result.sf__Id : (submittedId ?? 'unknown'),
|
|
169
|
+
Success: false,
|
|
170
|
+
Error: result.sf__Error,
|
|
171
|
+
};
|
|
172
|
+
}),
|
|
173
|
+
];
|
|
96
174
|
}
|
|
97
175
|
//# sourceMappingURL=purge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"purge.js","sourceRoot":"","sources":["../../../../../src/commands/simply/apex/logs/purge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"purge.js","sourceRoot":"","sources":["../../../../../src/commands/simply/apex/logs/purge.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,12 +14,32 @@ SOQL WHERE clause
|
|
|
14
14
|
|
|
15
15
|
A WHERE clause used to filter which ApexLog records are purged (e.g. "Status = 'Success'").
|
|
16
16
|
|
|
17
|
+
# flags.use-bulk-api.summary
|
|
18
|
+
|
|
19
|
+
Use Bulk API v2 to query and delete the logs.
|
|
20
|
+
|
|
21
|
+
# flags.use-bulk-api.description
|
|
22
|
+
|
|
23
|
+
Runs the whole purge as two Bulk API v2 jobs instead of a Tooling API query followed by chunked REST deletes. Bulk API processes the deletion asynchronously and does not consume the org's REST API request limit, which suits purges of tens of thousands of logs. For small purges the default REST path is faster, since it avoids the overhead of creating, uploading, and polling a job.
|
|
24
|
+
|
|
25
|
+
# flags.wait.summary
|
|
26
|
+
|
|
27
|
+
Number of minutes to wait for the Bulk API jobs to finish.
|
|
28
|
+
|
|
29
|
+
# flags.wait.description
|
|
30
|
+
|
|
31
|
+
Only applies with --use-bulk-api. The command polls the query and delete jobs until they complete or this timeout elapses, then throws.
|
|
32
|
+
|
|
17
33
|
# examples
|
|
18
34
|
|
|
19
35
|
- <%= config.bin %> <%= command.id %> --target-org myOrg
|
|
20
36
|
|
|
21
37
|
- <%= config.bin %> <%= command.id %> --target-org myOrg --where "Status = 'Success'"
|
|
22
38
|
|
|
39
|
+
- <%= config.bin %> <%= command.id %> --target-org myOrg --use-bulk-api
|
|
40
|
+
|
|
41
|
+
- <%= config.bin %> <%= command.id %> --target-org myOrg --use-bulk-api --wait 60
|
|
42
|
+
|
|
23
43
|
# info.queryingLogs
|
|
24
44
|
|
|
25
45
|
Querying Apex logs...
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysf/simply-apex",
|
|
3
3
|
"description": "Utilities for working with Apex",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"author": "@ClayChipps",
|
|
6
6
|
"homepage": "https://github.com/SimplySF/simply-node",
|
|
7
7
|
"bugs": "https://github.com/SimplySF/simply-node/issues",
|
|
@@ -217,5 +217,5 @@
|
|
|
217
217
|
"output": []
|
|
218
218
|
}
|
|
219
219
|
},
|
|
220
|
-
"gitHead": "
|
|
220
|
+
"gitHead": "fb8e9c1bdde7948f51b8d46fd0727a140bcf5470"
|
|
221
221
|
}
|