rflib-plugin 0.14.0 → 0.16.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 +4 -0
- package/lib/commands/rflib/logging/apex/instrument.d.ts +2 -0
- package/lib/commands/rflib/logging/apex/instrument.js +23 -5
- package/lib/commands/rflib/logging/apex/instrument.js.map +1 -1
- package/lib/commands/rflib/logging/aura/instrument.d.ts +2 -0
- package/lib/commands/rflib/logging/aura/instrument.js +35 -10
- package/lib/commands/rflib/logging/aura/instrument.js.map +1 -1
- package/lib/commands/rflib/logging/flow/instrument.d.ts +2 -0
- package/lib/commands/rflib/logging/flow/instrument.js +23 -5
- package/lib/commands/rflib/logging/flow/instrument.js.map +1 -1
- package/lib/commands/rflib/logging/lwc/instrument.d.ts +2 -0
- package/lib/commands/rflib/logging/lwc/instrument.js +23 -5
- package/lib/commands/rflib/logging/lwc/instrument.js.map +1 -1
- package/lib/shared/concurrency.d.ts +1 -0
- package/lib/shared/concurrency.js +16 -0
- package/lib/shared/concurrency.js.map +1 -0
- package/messages/rflib.logging.apex.instrument.md +16 -0
- package/messages/rflib.logging.aura.instrument.md +16 -0
- package/messages/rflib.logging.flow.instrument.md +16 -0
- package/messages/rflib.logging.lwc.instrument.md +16 -0
- package/oclif.lock +132 -131
- package/oclif.manifest.json +147 -71
- package/package.json +3 -1
package/oclif.manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"commands": {
|
|
3
|
-
"rflib:logging:
|
|
3
|
+
"rflib:logging:apex:instrument": {
|
|
4
4
|
"aliases": [],
|
|
5
5
|
"args": {},
|
|
6
|
-
"description": "Analyzes
|
|
6
|
+
"description": "Analyzes Apex classes and adds RFLIB logging statements for method entry and error handling. Adds class-level logger initialization if not already present. \nFor Apex Test classes, the `@TestSetup` method will be updated to include `rflib_TestUtil.prepareLoggerForUnitTests();` to avoid test failures caused by the logging framework.",
|
|
7
7
|
"examples": [
|
|
8
|
-
"- Add logging to all
|
|
8
|
+
"- Add logging statements to all Apex classes in a directory:\n\n$ sf rflib logging apex instrument --sourcepath force-app/main/default/classes\n\n- Preview changes without modifying files:\n\n$ sf rflib logging apex instrument --sourcepath force-app/main/default/classes --dryrun\n\n- Add logging statements and format code:\n\n$ sf rflib logging apex instrument --sourcepath force-app/main/default/classes --prettier"
|
|
9
9
|
],
|
|
10
10
|
"flags": {
|
|
11
11
|
"json": {
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
},
|
|
26
26
|
"sourcepath": {
|
|
27
27
|
"char": "s",
|
|
28
|
-
"description": "Path to the source directory containing
|
|
28
|
+
"description": "Path to the source directory containing Apex classes that should be instrumented with RFLIB logging statements. Test classes (ending with 'Test.cls') are automatically excluded.",
|
|
29
29
|
"name": "sourcepath",
|
|
30
30
|
"required": true,
|
|
31
|
-
"summary": "Directory containing
|
|
31
|
+
"summary": "Directory containing Apex classes to instrument with logging.",
|
|
32
32
|
"hasDynamicHelp": false,
|
|
33
33
|
"multiple": false,
|
|
34
34
|
"type": "option"
|
|
35
35
|
},
|
|
36
36
|
"dryrun": {
|
|
37
37
|
"char": "d",
|
|
38
|
-
"description": "When enabled, shows which files would be modified without making actual changes. Useful for reviewing the impact before applying changes.
|
|
38
|
+
"description": "When enabled, shows which files would be modified without making actual changes. Useful for reviewing the impact before applying changes.",
|
|
39
39
|
"name": "dryrun",
|
|
40
40
|
"summary": "Preview changes without modifying files.",
|
|
41
41
|
"allowNo": false,
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
},
|
|
44
44
|
"prettier": {
|
|
45
45
|
"char": "p",
|
|
46
|
-
"description": "When enabled, formats the modified
|
|
46
|
+
"description": "When enabled, formats the modified Apex files using prettier-plugin-apex after adding logging statements. Maintains consistent code style with:\n\n- 120 character line width\n- 4 space indentation\n- Single quotes for strings\n- No tabs",
|
|
47
47
|
"name": "prettier",
|
|
48
48
|
"summary": "Format modified files using Prettier.",
|
|
49
49
|
"allowNo": false,
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"type": "boolean"
|
|
58
58
|
},
|
|
59
59
|
"skip-instrumented": {
|
|
60
|
-
"description": "When provided, the command will not add log statements to any
|
|
60
|
+
"description": "When provided, the command will not add log statements to any Apex class that contains the `rflib_Logger` reference.",
|
|
61
61
|
"name": "skip-instrumented",
|
|
62
62
|
"summary": "Skips any files where a logger is already present.",
|
|
63
63
|
"allowNo": false,
|
|
@@ -70,16 +70,35 @@
|
|
|
70
70
|
"summary": "Enable verbose output.",
|
|
71
71
|
"allowNo": false,
|
|
72
72
|
"type": "boolean"
|
|
73
|
+
},
|
|
74
|
+
"exclude": {
|
|
75
|
+
"char": "e",
|
|
76
|
+
"description": "Exclude specific files or directories that match the provided glob pattern. For example, use --exclude \"**/Generated_*.cls\" to skip auto-generated classes.",
|
|
77
|
+
"name": "exclude",
|
|
78
|
+
"summary": "Exclude files or directories from instrumentation based on a glob pattern.",
|
|
79
|
+
"hasDynamicHelp": false,
|
|
80
|
+
"multiple": false,
|
|
81
|
+
"type": "option"
|
|
82
|
+
},
|
|
83
|
+
"concurrency": {
|
|
84
|
+
"char": "c",
|
|
85
|
+
"description": "Controls the maximum number of files to process at the same time. This is useful in very large codebases to prevent excessive memory usage or file descriptor exhaustion. Defaults to 10.",
|
|
86
|
+
"name": "concurrency",
|
|
87
|
+
"summary": "Limits the number of files processed concurrently.",
|
|
88
|
+
"default": 10,
|
|
89
|
+
"hasDynamicHelp": false,
|
|
90
|
+
"multiple": false,
|
|
91
|
+
"type": "option"
|
|
73
92
|
}
|
|
74
93
|
},
|
|
75
94
|
"hasDynamicHelp": false,
|
|
76
95
|
"hiddenAliases": [],
|
|
77
|
-
"id": "rflib:logging:
|
|
96
|
+
"id": "rflib:logging:apex:instrument",
|
|
78
97
|
"pluginAlias": "rflib-plugin",
|
|
79
98
|
"pluginName": "rflib-plugin",
|
|
80
99
|
"pluginType": "core",
|
|
81
100
|
"strict": true,
|
|
82
|
-
"summary": "Instrument
|
|
101
|
+
"summary": "Instrument Apex classes with RFLIB logging statements automatically.",
|
|
83
102
|
"enableJsonFlag": true,
|
|
84
103
|
"isESM": true,
|
|
85
104
|
"relativePath": [
|
|
@@ -87,43 +106,43 @@
|
|
|
87
106
|
"commands",
|
|
88
107
|
"rflib",
|
|
89
108
|
"logging",
|
|
90
|
-
"
|
|
109
|
+
"apex",
|
|
91
110
|
"instrument.js"
|
|
92
111
|
],
|
|
93
112
|
"aliasPermutations": [],
|
|
94
113
|
"permutations": [
|
|
95
|
-
"rflib:logging:
|
|
96
|
-
"logging:rflib:
|
|
97
|
-
"logging:
|
|
98
|
-
"logging:
|
|
99
|
-
"rflib:
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"rflib:
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"rflib:logging:instrument:
|
|
108
|
-
"logging:rflib:instrument:
|
|
109
|
-
"logging:instrument:rflib:
|
|
110
|
-
"logging:instrument:
|
|
111
|
-
"rflib:instrument:logging:
|
|
112
|
-
"instrument:rflib:logging:
|
|
113
|
-
"instrument:logging:rflib:
|
|
114
|
-
"instrument:logging:
|
|
115
|
-
"rflib:instrument:
|
|
116
|
-
"instrument:rflib:
|
|
117
|
-
"instrument:
|
|
118
|
-
"instrument:
|
|
114
|
+
"rflib:logging:apex:instrument",
|
|
115
|
+
"logging:rflib:apex:instrument",
|
|
116
|
+
"logging:apex:rflib:instrument",
|
|
117
|
+
"logging:apex:instrument:rflib",
|
|
118
|
+
"rflib:apex:logging:instrument",
|
|
119
|
+
"apex:rflib:logging:instrument",
|
|
120
|
+
"apex:logging:rflib:instrument",
|
|
121
|
+
"apex:logging:instrument:rflib",
|
|
122
|
+
"rflib:apex:instrument:logging",
|
|
123
|
+
"apex:rflib:instrument:logging",
|
|
124
|
+
"apex:instrument:rflib:logging",
|
|
125
|
+
"apex:instrument:logging:rflib",
|
|
126
|
+
"rflib:logging:instrument:apex",
|
|
127
|
+
"logging:rflib:instrument:apex",
|
|
128
|
+
"logging:instrument:rflib:apex",
|
|
129
|
+
"logging:instrument:apex:rflib",
|
|
130
|
+
"rflib:instrument:logging:apex",
|
|
131
|
+
"instrument:rflib:logging:apex",
|
|
132
|
+
"instrument:logging:rflib:apex",
|
|
133
|
+
"instrument:logging:apex:rflib",
|
|
134
|
+
"rflib:instrument:apex:logging",
|
|
135
|
+
"instrument:rflib:apex:logging",
|
|
136
|
+
"instrument:apex:rflib:logging",
|
|
137
|
+
"instrument:apex:logging:rflib"
|
|
119
138
|
]
|
|
120
139
|
},
|
|
121
|
-
"rflib:logging:
|
|
140
|
+
"rflib:logging:aura:instrument": {
|
|
122
141
|
"aliases": [],
|
|
123
142
|
"args": {},
|
|
124
|
-
"description": "Analyzes
|
|
143
|
+
"description": "Analyzes Aura Component files and adds RFLIB logging statements for:\n- Method entry logging with parameter values in Controller, Helper, and Renderer files\n- Error logging in try-catch blocks\n- Error logging in Promise catch handlers\n- Adds rflibLoggerCmp component if not present\n- Replaces console.log and similar method invocations\n- Formats modified files using Prettier (optional)\n\nThe command processes:\n- Component (.cmp) files to add the logger component\n- Controller (.js) files for method instrumentation\n- Helper (.js) files for method instrumentation\n- Renderer (.js) files for method instrumentation",
|
|
125
144
|
"examples": [
|
|
126
|
-
"- Add logging
|
|
145
|
+
"- Add logging to all aura files:\n$ sf rflib logging aura instrument --sourcepath force-app\n\n- Preview changes:\n$ sf rflib logging aura instrument --sourcepath force-app --dryrun\n\n- Add logging and format code:\n$ sf rflib logging aura instrument --sourcepath force-app --prettier\n\n- Process specific component:\n$ sf rflib logging aura instrument --sourcepath force-app/main/default/aura/myComponent"
|
|
127
146
|
],
|
|
128
147
|
"flags": {
|
|
129
148
|
"json": {
|
|
@@ -143,17 +162,17 @@
|
|
|
143
162
|
},
|
|
144
163
|
"sourcepath": {
|
|
145
164
|
"char": "s",
|
|
146
|
-
"description": "Path to the source directory containing
|
|
165
|
+
"description": "Path to the source directory containing Aura components that should be instrumented with RFLIB logging statements. The command will:\n- Scan for 'aura' directories recursively\n- Process all Aura components found\n- Add <c:rflibLoggerCmp> to component files\n- Add logging statements to JavaScript files\n- Initialize logger in methods using component.find()",
|
|
147
166
|
"name": "sourcepath",
|
|
148
167
|
"required": true,
|
|
149
|
-
"summary": "Directory containing
|
|
168
|
+
"summary": "Directory containing Aura components to instrument with logging.",
|
|
150
169
|
"hasDynamicHelp": false,
|
|
151
170
|
"multiple": false,
|
|
152
171
|
"type": "option"
|
|
153
172
|
},
|
|
154
173
|
"dryrun": {
|
|
155
174
|
"char": "d",
|
|
156
|
-
"description": "When enabled, shows which files would be modified without making actual changes. Useful for reviewing the impact before applying changes.",
|
|
175
|
+
"description": "When enabled, shows which files would be modified without making actual changes. Useful for reviewing the impact before applying changes. Shows:\n- Files that would be modified\n- Number of processed files\n- Number of modified files\n- Number of formatted files",
|
|
157
176
|
"name": "dryrun",
|
|
158
177
|
"summary": "Preview changes without modifying files.",
|
|
159
178
|
"allowNo": false,
|
|
@@ -161,7 +180,7 @@
|
|
|
161
180
|
},
|
|
162
181
|
"prettier": {
|
|
163
182
|
"char": "p",
|
|
164
|
-
"description": "When enabled, formats the modified
|
|
183
|
+
"description": "When enabled, formats the modified JavaScript files using Prettier after adding logging statements. Maintains consistent code style with:\n- 120 character line width\n- 4 space indentation\n- Single quotes for strings\n- No tabs\n- No trailing commas",
|
|
165
184
|
"name": "prettier",
|
|
166
185
|
"summary": "Format modified files using Prettier.",
|
|
167
186
|
"allowNo": false,
|
|
@@ -175,7 +194,7 @@
|
|
|
175
194
|
"type": "boolean"
|
|
176
195
|
},
|
|
177
196
|
"skip-instrumented": {
|
|
178
|
-
"description": "When provided, the command will not add log statements to any
|
|
197
|
+
"description": "When provided, the command will not add log statements to any Aura component that contains the `` component.",
|
|
179
198
|
"name": "skip-instrumented",
|
|
180
199
|
"summary": "Skips any files where a logger is already present.",
|
|
181
200
|
"allowNo": false,
|
|
@@ -188,16 +207,35 @@
|
|
|
188
207
|
"summary": "Enable verbose output.",
|
|
189
208
|
"allowNo": false,
|
|
190
209
|
"type": "boolean"
|
|
210
|
+
},
|
|
211
|
+
"exclude": {
|
|
212
|
+
"char": "e",
|
|
213
|
+
"description": "Exclude specific files or directories that match the provided glob pattern. For example, use --exclude \"**/Generated_*.cmp\" to skip auto-generated components.",
|
|
214
|
+
"name": "exclude",
|
|
215
|
+
"summary": "Exclude files or directories from instrumentation based on a glob pattern.",
|
|
216
|
+
"hasDynamicHelp": false,
|
|
217
|
+
"multiple": false,
|
|
218
|
+
"type": "option"
|
|
219
|
+
},
|
|
220
|
+
"concurrency": {
|
|
221
|
+
"char": "c",
|
|
222
|
+
"description": "Controls the maximum number of files to process at the same time. This is useful in very large codebases to prevent excessive memory usage or file descriptor exhaustion. Defaults to 10.",
|
|
223
|
+
"name": "concurrency",
|
|
224
|
+
"summary": "Limits the number of files processed concurrently.",
|
|
225
|
+
"default": 10,
|
|
226
|
+
"hasDynamicHelp": false,
|
|
227
|
+
"multiple": false,
|
|
228
|
+
"type": "option"
|
|
191
229
|
}
|
|
192
230
|
},
|
|
193
231
|
"hasDynamicHelp": false,
|
|
194
232
|
"hiddenAliases": [],
|
|
195
|
-
"id": "rflib:logging:
|
|
233
|
+
"id": "rflib:logging:aura:instrument",
|
|
196
234
|
"pluginAlias": "rflib-plugin",
|
|
197
235
|
"pluginName": "rflib-plugin",
|
|
198
236
|
"pluginType": "core",
|
|
199
237
|
"strict": true,
|
|
200
|
-
"summary": "Instrument
|
|
238
|
+
"summary": "Instrument Aura Components with RFLIB logging statements automatically.",
|
|
201
239
|
"enableJsonFlag": true,
|
|
202
240
|
"isESM": true,
|
|
203
241
|
"relativePath": [
|
|
@@ -205,35 +243,35 @@
|
|
|
205
243
|
"commands",
|
|
206
244
|
"rflib",
|
|
207
245
|
"logging",
|
|
208
|
-
"
|
|
246
|
+
"aura",
|
|
209
247
|
"instrument.js"
|
|
210
248
|
],
|
|
211
249
|
"aliasPermutations": [],
|
|
212
250
|
"permutations": [
|
|
213
|
-
"rflib:logging:
|
|
214
|
-
"logging:rflib:
|
|
215
|
-
"logging:
|
|
216
|
-
"logging:
|
|
217
|
-
"rflib:
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"
|
|
221
|
-
"rflib:
|
|
222
|
-
"
|
|
223
|
-
"
|
|
224
|
-
"
|
|
225
|
-
"rflib:logging:instrument:
|
|
226
|
-
"logging:rflib:instrument:
|
|
227
|
-
"logging:instrument:rflib:
|
|
228
|
-
"logging:instrument:
|
|
229
|
-
"rflib:instrument:logging:
|
|
230
|
-
"instrument:rflib:logging:
|
|
231
|
-
"instrument:logging:rflib:
|
|
232
|
-
"instrument:logging:
|
|
233
|
-
"rflib:instrument:
|
|
234
|
-
"instrument:rflib:
|
|
235
|
-
"instrument:
|
|
236
|
-
"instrument:
|
|
251
|
+
"rflib:logging:aura:instrument",
|
|
252
|
+
"logging:rflib:aura:instrument",
|
|
253
|
+
"logging:aura:rflib:instrument",
|
|
254
|
+
"logging:aura:instrument:rflib",
|
|
255
|
+
"rflib:aura:logging:instrument",
|
|
256
|
+
"aura:rflib:logging:instrument",
|
|
257
|
+
"aura:logging:rflib:instrument",
|
|
258
|
+
"aura:logging:instrument:rflib",
|
|
259
|
+
"rflib:aura:instrument:logging",
|
|
260
|
+
"aura:rflib:instrument:logging",
|
|
261
|
+
"aura:instrument:rflib:logging",
|
|
262
|
+
"aura:instrument:logging:rflib",
|
|
263
|
+
"rflib:logging:instrument:aura",
|
|
264
|
+
"logging:rflib:instrument:aura",
|
|
265
|
+
"logging:instrument:rflib:aura",
|
|
266
|
+
"logging:instrument:aura:rflib",
|
|
267
|
+
"rflib:instrument:logging:aura",
|
|
268
|
+
"instrument:rflib:logging:aura",
|
|
269
|
+
"instrument:logging:rflib:aura",
|
|
270
|
+
"instrument:logging:aura:rflib",
|
|
271
|
+
"rflib:instrument:aura:logging",
|
|
272
|
+
"instrument:rflib:aura:logging",
|
|
273
|
+
"instrument:aura:rflib:logging",
|
|
274
|
+
"instrument:aura:logging:rflib"
|
|
237
275
|
]
|
|
238
276
|
},
|
|
239
277
|
"rflib:logging:flow:instrument": {
|
|
@@ -293,6 +331,25 @@
|
|
|
293
331
|
"summary": "Enable verbose output.",
|
|
294
332
|
"allowNo": false,
|
|
295
333
|
"type": "boolean"
|
|
334
|
+
},
|
|
335
|
+
"exclude": {
|
|
336
|
+
"char": "e",
|
|
337
|
+
"description": "Exclude specific files or directories that match the provided glob pattern. For example, use --exclude \"**/Test_*.flow-meta.xml\" to skip certain flows.",
|
|
338
|
+
"name": "exclude",
|
|
339
|
+
"summary": "Exclude files or directories from instrumentation based on a glob pattern.",
|
|
340
|
+
"hasDynamicHelp": false,
|
|
341
|
+
"multiple": false,
|
|
342
|
+
"type": "option"
|
|
343
|
+
},
|
|
344
|
+
"concurrency": {
|
|
345
|
+
"char": "c",
|
|
346
|
+
"description": "Controls the maximum number of files to process at the same time. This is useful in very large codebases to prevent excessive memory usage or file descriptor exhaustion. Defaults to 10.",
|
|
347
|
+
"name": "concurrency",
|
|
348
|
+
"summary": "Limits the number of files processed concurrently.",
|
|
349
|
+
"default": 10,
|
|
350
|
+
"hasDynamicHelp": false,
|
|
351
|
+
"multiple": false,
|
|
352
|
+
"type": "option"
|
|
296
353
|
}
|
|
297
354
|
},
|
|
298
355
|
"hasDynamicHelp": false,
|
|
@@ -411,6 +468,25 @@
|
|
|
411
468
|
"summary": "Enable verbose output.",
|
|
412
469
|
"allowNo": false,
|
|
413
470
|
"type": "boolean"
|
|
471
|
+
},
|
|
472
|
+
"exclude": {
|
|
473
|
+
"char": "e",
|
|
474
|
+
"description": "Exclude specific files or directories that match the provided glob pattern. For example, use --exclude \"**/Generated_*.js\" to skip auto-generated components.",
|
|
475
|
+
"name": "exclude",
|
|
476
|
+
"summary": "Exclude files or directories from instrumentation based on a glob pattern.",
|
|
477
|
+
"hasDynamicHelp": false,
|
|
478
|
+
"multiple": false,
|
|
479
|
+
"type": "option"
|
|
480
|
+
},
|
|
481
|
+
"concurrency": {
|
|
482
|
+
"char": "c",
|
|
483
|
+
"description": "Controls the maximum number of files to process at the same time. This is useful in very large codebases to prevent excessive memory usage or file descriptor exhaustion. Defaults to 10.",
|
|
484
|
+
"name": "concurrency",
|
|
485
|
+
"summary": "Limits the number of files processed concurrently.",
|
|
486
|
+
"default": 10,
|
|
487
|
+
"hasDynamicHelp": false,
|
|
488
|
+
"multiple": false,
|
|
489
|
+
"type": "option"
|
|
414
490
|
}
|
|
415
491
|
},
|
|
416
492
|
"hasDynamicHelp": false,
|
|
@@ -460,5 +536,5 @@
|
|
|
460
536
|
]
|
|
461
537
|
}
|
|
462
538
|
},
|
|
463
|
-
"version": "0.
|
|
539
|
+
"version": "0.16.0"
|
|
464
540
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rflib-plugin",
|
|
3
3
|
"description": "Utility commands to help with the adoption of the RFLIB open-source library for Salesforce.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.16.0",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@oclif/core": "^4.8.0",
|
|
7
7
|
"@salesforce/core": "^8.26.2",
|
|
8
8
|
"@salesforce/sf-plugins-core": "^12.2.6",
|
|
9
9
|
"@types/xml2js": "^0.4.14",
|
|
10
|
+
"minimatch": "^10.2.2",
|
|
10
11
|
"prettier": "^3.8.1",
|
|
11
12
|
"prettier-plugin-apex": "^2.2.6",
|
|
12
13
|
"wireit": "^0.14.12",
|
|
@@ -20,6 +21,7 @@
|
|
|
20
21
|
"@oclif/plugin-command-snapshot": "^5.3.9",
|
|
21
22
|
"@salesforce/cli-plugins-testkit": "^5.3.41",
|
|
22
23
|
"@salesforce/dev-scripts": "^11.0.4",
|
|
24
|
+
"@types/minimatch": "^5.1.2",
|
|
23
25
|
"c8": "^10.1.3",
|
|
24
26
|
"eslint": "^8.57.1",
|
|
25
27
|
"eslint-plugin-sf-plugin": "^1.20.33",
|