rflib-plugin 0.3.3 → 0.4.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 +12 -0
- package/lib/commands/rflib/logging/apex/instrument.d.ts +4 -13
- package/lib/commands/rflib/logging/apex/instrument.js +161 -150
- package/lib/commands/rflib/logging/apex/instrument.js.map +1 -1
- package/lib/commands/rflib/logging/aura/instrument.d.ts +4 -10
- package/lib/commands/rflib/logging/aura/instrument.js +138 -143
- package/lib/commands/rflib/logging/aura/instrument.js.map +1 -1
- package/lib/commands/rflib/logging/lwc/instrument.d.ts +4 -14
- package/lib/commands/rflib/logging/lwc/instrument.js +129 -117
- package/lib/commands/rflib/logging/lwc/instrument.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/messages/rflib.logging.apex.instrument.md +10 -2
- package/messages/rflib.logging.aura.instrument.md +9 -1
- package/messages/rflib.logging.lwc.instrument.md +8 -0
- package/oclif.lock +134 -11
- package/oclif.manifest.json +25 -1
- package/package.json +11 -5
|
@@ -1,100 +1,67 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
|
|
2
1
|
/* eslint-disable no-await-in-loop */
|
|
3
|
-
/* eslint-disable @typescript-eslint/quotes */
|
|
4
|
-
/* eslint-disable sf-plugin/no-missing-messages */
|
|
5
2
|
import * as fs from 'node:fs';
|
|
6
3
|
import * as path from 'node:path';
|
|
7
4
|
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
8
5
|
import { Messages, Logger } from '@salesforce/core';
|
|
9
|
-
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
10
6
|
import * as prettier from 'prettier';
|
|
11
7
|
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
12
8
|
const messages = Messages.loadMessages('rflib-plugin', 'rflib.logging.lwc.instrument');
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
static
|
|
23
|
-
static description = messages.getMessage('description');
|
|
24
|
-
static examples = messages.getMessages('examples');
|
|
25
|
-
static flags = {
|
|
26
|
-
sourcepath: Flags.string({
|
|
27
|
-
char: 's',
|
|
28
|
-
required: true,
|
|
29
|
-
summary: messages.getMessage('flags.sourcepath.summary'),
|
|
30
|
-
description: messages.getMessage('flags.sourcepath.description'),
|
|
31
|
-
}),
|
|
32
|
-
dryrun: Flags.boolean({
|
|
33
|
-
char: 'd',
|
|
34
|
-
default: false,
|
|
35
|
-
summary: messages.getMessage('flags.dryrun.summary'),
|
|
36
|
-
description: messages.getMessage('flags.dryrun.description'),
|
|
37
|
-
}),
|
|
38
|
-
prettier: Flags.boolean({
|
|
39
|
-
char: 'p',
|
|
40
|
-
default: false,
|
|
41
|
-
summary: messages.getMessage('flags.prettier.summary'),
|
|
42
|
-
description: messages.getMessage('flags.prettier.description'),
|
|
43
|
-
}),
|
|
44
|
-
'no-if': Flags.boolean({
|
|
45
|
-
summary: messages.getMessage('flags.no-if.summary'),
|
|
46
|
-
}),
|
|
47
|
-
};
|
|
48
|
-
logger;
|
|
49
|
-
processedFiles = 0;
|
|
50
|
-
modifiedFiles = 0;
|
|
51
|
-
formattedFiles = 0;
|
|
52
|
-
prettierConfig = {
|
|
9
|
+
class LwcInstrumentationService {
|
|
10
|
+
static IMPORT_REGEX = /import\s*{\s*createLogger\s*}\s*from\s*['"]c\/rflibLogger['"]/;
|
|
11
|
+
static LOGGER_REGEX = /const\s+(\w+)\s*=\s*createLogger\s*\(['"]([\w-]+)['"]\)/;
|
|
12
|
+
static METHOD_REGEX = /(?:async\s+)?(?!(?:if|switch|case|while|for|catch)\b)(\b\w+)\s*\((.*?)\)\s*{/g;
|
|
13
|
+
static EXPORT_DEFAULT_REGEX = /export\s+default\s+class\s+(\w+)/;
|
|
14
|
+
static IF_STATEMENT_REGEX = /if\s*\((.*?)\)\s*(?:{([^]*?(?:(?<!{){(?:[^]*?)}(?!})[^]*?)*)}|([^{].*?)(?=\s*(?:;|$));)/g;
|
|
15
|
+
static ELSE_REGEX = /}\s*else(?!\s+if\b)\s*(?:{((?:[^{}]|{(?:[^{}]|{[^{}]*})*})*)}|([^{].*?)(?=\n|;|$))/g;
|
|
16
|
+
static PROMISE_CHAIN_REGEX = /\.(then|catch|finally)\s*\(\s*(?:async\s+)?(?:\(?([^)]*)\)?)?\s*=>\s*(?:\{((?:[^{}]|`[^`]*`)*?)\}|([^{;]*?(?:\.[^{;]*?)*(?:\([^)]*\))?)(?=\s*(?:\)\)|\.|\))))/g;
|
|
17
|
+
static TRY_CATCH_BLOCK_REGEX = /try\s*{[\s\S]*?}\s*catch\s*\(([^)]*)\)\s*{/g;
|
|
18
|
+
static PRETTIER_CONFIG = {
|
|
53
19
|
parser: 'babel',
|
|
54
20
|
printWidth: 120,
|
|
55
21
|
tabWidth: 4,
|
|
56
22
|
useTabs: false,
|
|
57
23
|
singleQuote: true,
|
|
58
24
|
};
|
|
59
|
-
static
|
|
60
|
-
|
|
25
|
+
static async formatContent(content) {
|
|
26
|
+
try {
|
|
27
|
+
return await prettier.format(content, this.PRETTIER_CONFIG);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof Error) {
|
|
31
|
+
throw new Error(`Formatting failed: ${error.message}`);
|
|
32
|
+
}
|
|
33
|
+
throw new Error('Formatting failed with unknown error');
|
|
34
|
+
}
|
|
61
35
|
}
|
|
62
|
-
static
|
|
63
|
-
|
|
36
|
+
static isInstrumented(content) {
|
|
37
|
+
return this.IMPORT_REGEX.test(content);
|
|
38
|
+
}
|
|
39
|
+
static detectLogger(content) {
|
|
40
|
+
const match = content.match(this.LOGGER_REGEX);
|
|
64
41
|
return {
|
|
65
42
|
exists: match !== null,
|
|
66
|
-
|
|
43
|
+
variableName: match ? match[1] : 'logger',
|
|
67
44
|
};
|
|
68
45
|
}
|
|
69
46
|
static addImportAndLogger(content, componentName) {
|
|
70
47
|
let modified = content;
|
|
71
|
-
if (!this.
|
|
48
|
+
if (!this.IMPORT_REGEX.test(content)) {
|
|
72
49
|
modified = `import { createLogger } from 'c/rflibLogger';\n${modified}`;
|
|
73
50
|
}
|
|
74
|
-
const { exists,
|
|
51
|
+
const { exists, variableName } = this.detectLogger(content);
|
|
75
52
|
if (!exists) {
|
|
76
|
-
const exportMatch = content.match(
|
|
53
|
+
const exportMatch = content.match(this.EXPORT_DEFAULT_REGEX);
|
|
77
54
|
const className = exportMatch ? exportMatch[1] : componentName;
|
|
78
|
-
const loggerDeclaration = `\nconst ${
|
|
79
|
-
modified = modified.replace(
|
|
55
|
+
const loggerDeclaration = `\nconst ${variableName} = createLogger('${className}');\n`;
|
|
56
|
+
modified = modified.replace(this.EXPORT_DEFAULT_REGEX, `${loggerDeclaration}$&`);
|
|
80
57
|
}
|
|
81
58
|
return modified;
|
|
82
59
|
}
|
|
83
|
-
static findEnclosingMethod(content, position) {
|
|
84
|
-
const beforeCatch = content.substring(0, position);
|
|
85
|
-
const methods = [...beforeCatch.matchAll(methodRegex)].reverse();
|
|
86
|
-
const closestMethod = methods[0];
|
|
87
|
-
return closestMethod ? closestMethod[1] : 'unknown';
|
|
88
|
-
}
|
|
89
60
|
static processIfStatements(content, loggerName) {
|
|
90
61
|
const conditions = [];
|
|
91
|
-
|
|
92
|
-
let modified = content.replace(ifStatementRegex, (match, condition, blockBody, singleLineBody, offset) => {
|
|
62
|
+
let modified = content.replace(this.IF_STATEMENT_REGEX, (match, condition, blockBody, singleLineBody, offset) => {
|
|
93
63
|
const cleanedUpCondition = condition.trim().replaceAll("'", "\\'");
|
|
94
|
-
conditions.push({
|
|
95
|
-
condition: cleanedUpCondition,
|
|
96
|
-
position: offset,
|
|
97
|
-
});
|
|
64
|
+
conditions.push({ condition: cleanedUpCondition, position: offset });
|
|
98
65
|
const logStatement = `${loggerName}.debug('if (${cleanedUpCondition})');\n `;
|
|
99
66
|
if (blockBody) {
|
|
100
67
|
return `if (${condition}) {\n ${logStatement}${blockBody}}`;
|
|
@@ -105,11 +72,9 @@ export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
|
105
72
|
}
|
|
106
73
|
return match;
|
|
107
74
|
});
|
|
108
|
-
|
|
109
|
-
modified = modified.replace(elseRegex, (match, blockBody, singleLineBody, offset) => {
|
|
110
|
-
// Find last if statement before this else
|
|
75
|
+
modified = modified.replace(this.ELSE_REGEX, (match, blockBody, singleLineBody, offset) => {
|
|
111
76
|
const nearestIf = conditions
|
|
112
|
-
.filter((c) => c.position <= offset)
|
|
77
|
+
.filter((c) => c.position <= (offset ?? 0))
|
|
113
78
|
.reduce((prev, curr) => (!prev || curr.position > prev.position ? curr : prev));
|
|
114
79
|
const logStatement = nearestIf
|
|
115
80
|
? `${loggerName}.debug('else for if (${nearestIf.condition})');\n `
|
|
@@ -124,9 +89,8 @@ export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
|
124
89
|
});
|
|
125
90
|
return modified;
|
|
126
91
|
}
|
|
127
|
-
static processMethodLogging(content, loggerName,
|
|
128
|
-
|
|
129
|
-
let modified = content.replace(methodRegex, (match, methodName, args) => {
|
|
92
|
+
static processMethodLogging(content, loggerName, options) {
|
|
93
|
+
let modified = content.replace(this.METHOD_REGEX, (match, methodName, args) => {
|
|
130
94
|
const parameters = args
|
|
131
95
|
.split(',')
|
|
132
96
|
.map((p) => p.trim())
|
|
@@ -135,17 +99,24 @@ export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
|
135
99
|
const logArgs = parameters.length > 0 ? `, ${parameters.join(', ')}` : '';
|
|
136
100
|
return `${match}\n ${loggerName}.info('${methodName}(${placeholders})'${logArgs});`;
|
|
137
101
|
});
|
|
138
|
-
|
|
139
|
-
if (!flags.noIf) {
|
|
102
|
+
if (!options.noIf) {
|
|
140
103
|
modified = this.processIfStatements(modified, loggerName);
|
|
141
104
|
}
|
|
142
105
|
return modified;
|
|
143
106
|
}
|
|
107
|
+
static processTryCatchBlocks(content, loggerName) {
|
|
108
|
+
return content.replace(this.TRY_CATCH_BLOCK_REGEX, (match, exceptionVar, offset) => {
|
|
109
|
+
const methodName = this.findEnclosingMethod(content, offset);
|
|
110
|
+
const errorVar = exceptionVar.trim().split(' ')[0] || 'error';
|
|
111
|
+
return match.replace(/catch\s*\(([^)]*)\)\s*{/, `catch(${exceptionVar}) {
|
|
112
|
+
${loggerName}.error('An error occurred in function ${methodName}()', ${errorVar});`);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
144
115
|
static processPromiseChains(content, loggerName) {
|
|
145
|
-
return content.replace(
|
|
116
|
+
return content.replace(this.PROMISE_CHAIN_REGEX, (match, type, param, blockBody, singleLineBody, offset) => {
|
|
146
117
|
const methodName = this.findEnclosingMethod(content, offset);
|
|
147
118
|
const paramName = typeof param === 'string' ? param.trim() : type === 'then' ? 'result' : 'error';
|
|
148
|
-
const indentation = match.match(/\n\s*/)?.[0]
|
|
119
|
+
const indentation = match.match(/\n\s*/)?.[0] ?? '\n ';
|
|
149
120
|
let logStatement;
|
|
150
121
|
switch (type) {
|
|
151
122
|
case 'then':
|
|
@@ -161,14 +132,14 @@ export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
|
161
132
|
logStatement = '';
|
|
162
133
|
}
|
|
163
134
|
if (singleLineBody) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
135
|
+
const trimmedBody = singleLineBody.trim();
|
|
136
|
+
const adjustedBody = trimmedBody.split(')').length > trimmedBody.split('(').length
|
|
137
|
+
? trimmedBody.slice(0, -1)
|
|
138
|
+
: trimmedBody;
|
|
168
139
|
return `.${type}((${paramName}) => {
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
140
|
+
${logStatement}
|
|
141
|
+
return ${adjustedBody};
|
|
142
|
+
}`;
|
|
172
143
|
}
|
|
173
144
|
if (blockBody) {
|
|
174
145
|
return `.${type}((${paramName}) => {${indentation}${logStatement}${indentation}${blockBody}}`;
|
|
@@ -176,71 +147,112 @@ export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
|
176
147
|
return match;
|
|
177
148
|
});
|
|
178
149
|
}
|
|
179
|
-
static
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
${loggerName}.error('An error occurred in function ${methodName}()', ${errorVar});`);
|
|
185
|
-
});
|
|
150
|
+
static findEnclosingMethod(content, position) {
|
|
151
|
+
const beforeCatch = content.substring(0, position);
|
|
152
|
+
const methods = [...beforeCatch.matchAll(this.METHOD_REGEX)].reverse();
|
|
153
|
+
const closestMethod = methods[0];
|
|
154
|
+
return closestMethod ? closestMethod[1] : 'unknown';
|
|
186
155
|
}
|
|
156
|
+
}
|
|
157
|
+
export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
158
|
+
static summary = messages.getMessage('summary');
|
|
159
|
+
static description = messages.getMessage('description');
|
|
160
|
+
static examples = messages.getMessages('examples');
|
|
161
|
+
static flags = {
|
|
162
|
+
sourcepath: Flags.string({
|
|
163
|
+
char: 's',
|
|
164
|
+
required: true,
|
|
165
|
+
summary: messages.getMessage('flags.sourcepath.summary'),
|
|
166
|
+
description: messages.getMessage('flags.sourcepath.description'),
|
|
167
|
+
}),
|
|
168
|
+
dryrun: Flags.boolean({
|
|
169
|
+
char: 'd',
|
|
170
|
+
default: false,
|
|
171
|
+
summary: messages.getMessage('flags.dryrun.summary'),
|
|
172
|
+
description: messages.getMessage('flags.dryrun.description'),
|
|
173
|
+
}),
|
|
174
|
+
prettier: Flags.boolean({
|
|
175
|
+
char: 'p',
|
|
176
|
+
default: false,
|
|
177
|
+
summary: messages.getMessage('flags.prettier.summary'),
|
|
178
|
+
description: messages.getMessage('flags.prettier.description'),
|
|
179
|
+
}),
|
|
180
|
+
'no-if': Flags.boolean({
|
|
181
|
+
summary: messages.getMessage('flags.no-if.summary'),
|
|
182
|
+
description: messages.getMessage('flags.no-if.description'),
|
|
183
|
+
default: false,
|
|
184
|
+
}),
|
|
185
|
+
'skip-instrumented': Flags.boolean({
|
|
186
|
+
summary: messages.getMessage('flags.skip-instrumented.summary'),
|
|
187
|
+
description: messages.getMessage('flags.skip-instrumented.description'),
|
|
188
|
+
default: false,
|
|
189
|
+
}),
|
|
190
|
+
};
|
|
191
|
+
logger;
|
|
192
|
+
stats = {
|
|
193
|
+
processedFiles: 0,
|
|
194
|
+
modifiedFiles: 0,
|
|
195
|
+
formattedFiles: 0,
|
|
196
|
+
};
|
|
187
197
|
async run() {
|
|
188
198
|
this.logger = await Logger.child(this.ctor.name);
|
|
189
199
|
const { flags } = await this.parse(RflibLoggingLwcInstrument);
|
|
190
|
-
const
|
|
200
|
+
const instrumentationOpts = {
|
|
191
201
|
prettier: flags.prettier,
|
|
192
202
|
noIf: flags['no-if'],
|
|
203
|
+
skipInstrumented: flags['skip-instrumented'],
|
|
193
204
|
};
|
|
194
205
|
this.log(`Scanning LWC components in ${flags.sourcepath}...`);
|
|
195
206
|
this.spinner.start('Running...');
|
|
196
|
-
await this.processDirectory(flags.sourcepath, flags.dryrun,
|
|
207
|
+
await this.processDirectory(flags.sourcepath, flags.dryrun, instrumentationOpts);
|
|
197
208
|
this.spinner.stop();
|
|
198
|
-
this.log(
|
|
199
|
-
this.log(`Processed files: ${this.processedFiles}`);
|
|
200
|
-
this.log(`Modified files: ${this.modifiedFiles}`);
|
|
201
|
-
this.log(`Formatted files: ${this.formattedFiles}`);
|
|
202
|
-
return {
|
|
203
|
-
processedFiles: this.processedFiles,
|
|
204
|
-
modifiedFiles: this.modifiedFiles,
|
|
205
|
-
formattedFiles: this.formattedFiles,
|
|
206
|
-
};
|
|
209
|
+
this.log('\nInstrumentation complete.');
|
|
210
|
+
this.log(`Processed files: ${this.stats.processedFiles}`);
|
|
211
|
+
this.log(`Modified files: ${this.stats.modifiedFiles}`);
|
|
212
|
+
this.log(`Formatted files: ${this.stats.formattedFiles}`);
|
|
213
|
+
return { ...this.stats };
|
|
207
214
|
}
|
|
208
|
-
async processDirectory(dirPath, isDryRun,
|
|
215
|
+
async processDirectory(dirPath, isDryRun, instrumentationOpts) {
|
|
209
216
|
const files = await fs.promises.readdir(dirPath);
|
|
210
217
|
for (const file of files) {
|
|
211
218
|
const filePath = path.join(dirPath, file);
|
|
212
219
|
const stat = await fs.promises.stat(filePath);
|
|
213
220
|
if (stat.isDirectory()) {
|
|
214
|
-
await this.processDirectory(filePath, isDryRun,
|
|
221
|
+
await this.processDirectory(filePath, isDryRun, instrumentationOpts);
|
|
215
222
|
}
|
|
216
223
|
else if (file.endsWith('.js') &&
|
|
217
224
|
!path.dirname(filePath).includes('aura') &&
|
|
218
225
|
!path.dirname(filePath).includes('__tests__')) {
|
|
219
|
-
await this.instrumentLwcFile(filePath, isDryRun,
|
|
226
|
+
await this.instrumentLwcFile(filePath, isDryRun, instrumentationOpts);
|
|
220
227
|
}
|
|
221
228
|
}
|
|
222
229
|
}
|
|
223
|
-
async instrumentLwcFile(filePath, isDryRun,
|
|
230
|
+
async instrumentLwcFile(filePath, isDryRun, instrumentationOpts) {
|
|
224
231
|
const componentName = path.basename(path.dirname(filePath));
|
|
225
232
|
this.logger.debug(`Processing LWC: ${componentName}`);
|
|
226
|
-
const usePrettier = flags.prettier;
|
|
227
233
|
try {
|
|
228
|
-
this.processedFiles++;
|
|
234
|
+
this.stats.processedFiles++;
|
|
229
235
|
let content = await fs.promises.readFile(filePath, 'utf8');
|
|
230
236
|
const originalContent = content;
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
237
|
+
if (instrumentationOpts.skipInstrumented && LwcInstrumentationService.isInstrumented(content)) {
|
|
238
|
+
this.logger.info(`Skipping instrumented component: ${componentName}`);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const { variableName } = LwcInstrumentationService.detectLogger(content);
|
|
242
|
+
content = LwcInstrumentationService.addImportAndLogger(content, componentName);
|
|
243
|
+
content = LwcInstrumentationService.processMethodLogging(content, variableName, instrumentationOpts);
|
|
244
|
+
content = LwcInstrumentationService.processTryCatchBlocks(content, variableName);
|
|
245
|
+
content = LwcInstrumentationService.processPromiseChains(content, variableName);
|
|
236
246
|
if (content !== originalContent) {
|
|
237
|
-
this.modifiedFiles++;
|
|
247
|
+
this.stats.modifiedFiles++;
|
|
238
248
|
if (!isDryRun) {
|
|
239
249
|
try {
|
|
240
|
-
const finalContent =
|
|
250
|
+
const finalContent = instrumentationOpts.prettier
|
|
251
|
+
? await LwcInstrumentationService.formatContent(content)
|
|
252
|
+
: content;
|
|
241
253
|
await fs.promises.writeFile(filePath, finalContent);
|
|
242
|
-
if (
|
|
243
|
-
this.formattedFiles++;
|
|
254
|
+
if (instrumentationOpts.prettier) {
|
|
255
|
+
this.stats.formattedFiles++;
|
|
244
256
|
this.logger.info(`Modified and formatted: ${filePath}`);
|
|
245
257
|
}
|
|
246
258
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../../../../src/commands/rflib/logging/lwc/instrument.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../../../../src/commands/rflib/logging/lwc/instrument.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-await-in-loop */\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { SfCommand, Flags } from '@salesforce/sf-plugins-core';\nimport { Messages, Logger } from '@salesforce/core';\nimport * as prettier from 'prettier';\n\ninterface InstrumentationOptions {\n readonly prettier: boolean;\n readonly noIf: boolean;\n readonly skipInstrumented: boolean;\n}\n\ninterface LoggerInfo {\n readonly exists: boolean;\n readonly variableName: string;\n}\n\ninterface IfCondition {\n readonly condition: string;\n readonly position: number;\n}\n\nexport interface RflibLoggingLwcInstrumentResult {\n processedFiles: number;\n modifiedFiles: number;\n formattedFiles: number;\n}\n\nMessages.importMessagesDirectoryFromMetaUrl(import.meta.url);\nconst messages = Messages.loadMessages('rflib-plugin', 'rflib.logging.lwc.instrument');\n\nclass LwcInstrumentationService {\n private static readonly IMPORT_REGEX = /import\\s*{\\s*createLogger\\s*}\\s*from\\s*['\"]c\\/rflibLogger['\"]/;\n private static readonly LOGGER_REGEX = /const\\s+(\\w+)\\s*=\\s*createLogger\\s*\\(['\"]([\\w-]+)['\"]\\)/;\n private static readonly METHOD_REGEX = /(?:async\\s+)?(?!(?:if|switch|case|while|for|catch)\\b)(\\b\\w+)\\s*\\((.*?)\\)\\s*{/g;\n private static readonly EXPORT_DEFAULT_REGEX = /export\\s+default\\s+class\\s+(\\w+)/;\n private static readonly IF_STATEMENT_REGEX = /if\\s*\\((.*?)\\)\\s*(?:{([^]*?(?:(?<!{){(?:[^]*?)}(?!})[^]*?)*)}|([^{].*?)(?=\\s*(?:;|$));)/g;\n private static readonly ELSE_REGEX = /}\\s*else(?!\\s+if\\b)\\s*(?:{((?:[^{}]|{(?:[^{}]|{[^{}]*})*})*)}|([^{].*?)(?=\\n|;|$))/g;\n private static readonly PROMISE_CHAIN_REGEX = /\\.(then|catch|finally)\\s*\\(\\s*(?:async\\s+)?(?:\\(?([^)]*)\\)?)?\\s*=>\\s*(?:\\{((?:[^{}]|`[^`]*`)*?)\\}|([^{;]*?(?:\\.[^{;]*?)*(?:\\([^)]*\\))?)(?=\\s*(?:\\)\\)|\\.|\\))))/g;\n private static readonly TRY_CATCH_BLOCK_REGEX = /try\\s*{[\\s\\S]*?}\\s*catch\\s*\\(([^)]*)\\)\\s*{/g;\n\n private static readonly PRETTIER_CONFIG: prettier.Options = {\n parser: 'babel',\n printWidth: 120,\n tabWidth: 4,\n useTabs: false,\n singleQuote: true,\n };\n\n public static async formatContent(content: string): Promise<string> {\n try {\n return await prettier.format(content, this.PRETTIER_CONFIG);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Formatting failed: ${error.message}`);\n }\n throw new Error('Formatting failed with unknown error');\n }\n }\n\n public static isInstrumented(content: string): boolean {\n return this.IMPORT_REGEX.test(content);\n }\n\n public static detectLogger(content: string): LoggerInfo {\n const match = content.match(this.LOGGER_REGEX);\n return {\n exists: match !== null,\n variableName: match ? match[1] : 'logger',\n };\n }\n\n public static addImportAndLogger(content: string, componentName: string): string {\n let modified = content;\n\n if (!this.IMPORT_REGEX.test(content)) {\n modified = `import { createLogger } from 'c/rflibLogger';\\n${modified}`;\n }\n\n const { exists, variableName } = this.detectLogger(content);\n if (!exists) {\n const exportMatch = content.match(this.EXPORT_DEFAULT_REGEX);\n const className = exportMatch ? exportMatch[1] : componentName;\n const loggerDeclaration = `\\nconst ${variableName} = createLogger('${className}');\\n`;\n modified = modified.replace(this.EXPORT_DEFAULT_REGEX, `${loggerDeclaration}$&`);\n }\n\n return modified;\n }\n\n public static processIfStatements(content: string, loggerName: string): string {\n const conditions: IfCondition[] = [];\n\n let modified = content.replace(\n this.IF_STATEMENT_REGEX,\n (match: string, condition: string, blockBody: string, singleLineBody: string, offset: number) => {\n const cleanedUpCondition = condition.trim().replaceAll(\"'\", \"\\\\'\");\n conditions.push({ condition: cleanedUpCondition, position: offset });\n\n const logStatement = `${loggerName}.debug('if (${cleanedUpCondition})');\\n `;\n\n if (blockBody) {\n return `if (${condition}) {\\n ${logStatement}${blockBody}}`;\n } else if (singleLineBody) {\n const cleanBody = singleLineBody.replace(/;$/, '').trim();\n return `if (${condition}) {\\n ${logStatement}${cleanBody};\\n }`;\n }\n return match;\n }\n );\n\n modified = modified.replace(\n this.ELSE_REGEX,\n (match: string, blockBody: string, singleLineBody: string, offset: number) => {\n const nearestIf = conditions\n .filter((c) => c.position <= (offset ?? 0))\n .reduce((prev, curr) => (!prev || curr.position > prev.position ? curr : prev));\n\n const logStatement = nearestIf\n ? `${loggerName}.debug('else for if (${nearestIf.condition})');\\n `\n : `${loggerName}.debug('else statement');\\n `;\n\n if (blockBody) {\n return `} else {\\n ${logStatement}${blockBody}}`;\n } else if (singleLineBody) {\n return `} else {\\n ${logStatement}${singleLineBody};\\n }`;\n }\n return match;\n }\n );\n\n return modified;\n }\n\n public static processMethodLogging(content: string, loggerName: string, options: InstrumentationOptions): string {\n let modified = content.replace(\n this.METHOD_REGEX,\n (match: string, methodName: string, args: string) => {\n const parameters = args\n .split(',')\n .map((p) => p.trim())\n .filter((p) => p);\n const placeholders = parameters.map((_, i) => `{${i}}`).join(', ');\n const logArgs = parameters.length > 0 ? `, ${parameters.join(', ')}` : '';\n\n return `${match}\\n ${loggerName}.info('${methodName}(${placeholders})'${logArgs});`;\n }\n );\n\n if (!options.noIf) {\n modified = this.processIfStatements(modified, loggerName);\n }\n\n return modified;\n }\n\n public static processTryCatchBlocks(content: string, loggerName: string): string {\n return content.replace(\n this.TRY_CATCH_BLOCK_REGEX,\n (match: string, exceptionVar: string, offset: number) => {\n const methodName = this.findEnclosingMethod(content, offset);\n const errorVar = exceptionVar.trim().split(' ')[0] || 'error';\n\n return match.replace(\n /catch\\s*\\(([^)]*)\\)\\s*{/,\n `catch(${exceptionVar}) {\n ${loggerName}.error('An error occurred in function ${methodName}()', ${errorVar});`\n );\n }\n );\n }\n\n public static processPromiseChains(content: string, loggerName: string): string {\n return content.replace(\n this.PROMISE_CHAIN_REGEX,\n (match, type, param, blockBody, singleLineBody, offset: number) => {\n const methodName = this.findEnclosingMethod(content, offset);\n const paramName = typeof param === 'string' ? param.trim() : type === 'then' ? 'result' : 'error';\n const indentation = match.match(/\\n\\s*/)?.[0] ?? '\\n ';\n\n let logStatement: string;\n switch (type) {\n case 'then':\n logStatement = `${loggerName}.info('${methodName}() promise resolved. Result={0}', ${paramName});`;\n break;\n case 'catch':\n logStatement = `${loggerName}.error('An error occurred in function ${methodName}()', ${paramName});`;\n break;\n case 'finally':\n logStatement = `${loggerName}.info('${methodName}() promise chain completed');`;\n break;\n default:\n logStatement = '';\n }\n\n if (singleLineBody) {\n const trimmedBody = (singleLineBody as string).trim();\n const adjustedBody = trimmedBody.split(')').length > trimmedBody.split('(').length\n ? trimmedBody.slice(0, -1)\n : trimmedBody;\n\n return `.${type}((${paramName}) => {\n ${logStatement}\n return ${adjustedBody};\n }`;\n }\n\n if (blockBody) {\n return `.${type}((${paramName}) => {${indentation}${logStatement}${indentation}${blockBody}}`;\n }\n\n return match;\n }\n );\n }\n\n private static findEnclosingMethod(content: string, position: number): string {\n const beforeCatch = content.substring(0, position);\n const methods = [...beforeCatch.matchAll(this.METHOD_REGEX)].reverse();\n const closestMethod = methods[0];\n return closestMethod ? closestMethod[1] : 'unknown';\n }\n}\n\nexport default class RflibLoggingLwcInstrument extends SfCommand<RflibLoggingLwcInstrumentResult> {\n public static readonly summary = messages.getMessage('summary');\n public static readonly description = messages.getMessage('description');\n public static readonly examples = messages.getMessages('examples');\n\n public static readonly flags = {\n sourcepath: Flags.string({\n char: 's',\n required: true,\n summary: messages.getMessage('flags.sourcepath.summary'),\n description: messages.getMessage('flags.sourcepath.description'),\n }),\n dryrun: Flags.boolean({\n char: 'd',\n default: false,\n summary: messages.getMessage('flags.dryrun.summary'),\n description: messages.getMessage('flags.dryrun.description'),\n }),\n prettier: Flags.boolean({\n char: 'p',\n default: false,\n summary: messages.getMessage('flags.prettier.summary'),\n description: messages.getMessage('flags.prettier.description'),\n }),\n 'no-if': Flags.boolean({\n summary: messages.getMessage('flags.no-if.summary'),\n description: messages.getMessage('flags.no-if.description'),\n default: false,\n }),\n 'skip-instrumented': Flags.boolean({\n summary: messages.getMessage('flags.skip-instrumented.summary'),\n description: messages.getMessage('flags.skip-instrumented.description'),\n default: false,\n }),\n };\n\n private logger!: Logger;\n private readonly stats: RflibLoggingLwcInstrumentResult = {\n processedFiles: 0,\n modifiedFiles: 0,\n formattedFiles: 0,\n };\n\n public async run(): Promise<RflibLoggingLwcInstrumentResult> {\n this.logger = await Logger.child(this.ctor.name);\n const { flags } = await this.parse(RflibLoggingLwcInstrument);\n\n const instrumentationOpts: InstrumentationOptions = {\n prettier: flags.prettier,\n noIf: flags['no-if'],\n skipInstrumented: flags['skip-instrumented'],\n };\n\n this.log(`Scanning LWC components in ${flags.sourcepath}...`);\n\n this.spinner.start('Running...');\n await this.processDirectory(flags.sourcepath, flags.dryrun, instrumentationOpts);\n this.spinner.stop();\n\n this.log('\\nInstrumentation complete.');\n this.log(`Processed files: ${this.stats.processedFiles}`);\n this.log(`Modified files: ${this.stats.modifiedFiles}`);\n this.log(`Formatted files: ${this.stats.formattedFiles}`);\n\n return { ...this.stats };\n }\n\n private async processDirectory(\n dirPath: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n const files = await fs.promises.readdir(dirPath);\n\n for (const file of files) {\n const filePath = path.join(dirPath, file);\n const stat = await fs.promises.stat(filePath);\n\n if (stat.isDirectory()) {\n await this.processDirectory(filePath, isDryRun, instrumentationOpts);\n } else if (\n file.endsWith('.js') &&\n !path.dirname(filePath).includes('aura') &&\n !path.dirname(filePath).includes('__tests__')\n ) {\n await this.instrumentLwcFile(filePath, isDryRun, instrumentationOpts);\n }\n }\n }\n\n private async instrumentLwcFile(\n filePath: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n const componentName = path.basename(path.dirname(filePath));\n this.logger.debug(`Processing LWC: ${componentName}`);\n\n try {\n this.stats.processedFiles++;\n let content = await fs.promises.readFile(filePath, 'utf8');\n const originalContent = content;\n\n if (instrumentationOpts.skipInstrumented && LwcInstrumentationService.isInstrumented(content)) {\n this.logger.info(`Skipping instrumented component: ${componentName}`);\n return;\n }\n\n const { variableName } = LwcInstrumentationService.detectLogger(content);\n content = LwcInstrumentationService.addImportAndLogger(content, componentName);\n content = LwcInstrumentationService.processMethodLogging(content, variableName, instrumentationOpts);\n content = LwcInstrumentationService.processTryCatchBlocks(content, variableName);\n content = LwcInstrumentationService.processPromiseChains(content, variableName);\n\n if (content !== originalContent) {\n this.stats.modifiedFiles++;\n if (!isDryRun) {\n try {\n const finalContent = instrumentationOpts.prettier\n ? await LwcInstrumentationService.formatContent(content)\n : content;\n\n await fs.promises.writeFile(filePath, finalContent);\n\n if (instrumentationOpts.prettier) {\n this.stats.formattedFiles++;\n this.logger.info(`Modified and formatted: ${filePath}`);\n } else {\n this.logger.info(`Modified: ${filePath}`);\n }\n } catch (error) {\n this.logger.warn(`Failed to format ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n await fs.promises.writeFile(filePath, content);\n this.logger.info(`Modified without formatting: ${filePath}`);\n }\n } else {\n this.logger.info(`Would modify: ${filePath}`);\n }\n }\n } catch (error) {\n this.logger.error(`Error processing LWC ${componentName}`, error);\n throw error;\n }\n }\n}"]}
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe,EAAE,CAAC","sourcesContent":["export default {};\n"]}
|
|
@@ -44,6 +44,15 @@ Exclude the instrumentation of if-else statements.
|
|
|
44
44
|
|
|
45
45
|
When provided, the command will not add log statements inside of `if` and `else` blocks.
|
|
46
46
|
|
|
47
|
+
|
|
48
|
+
# flags.skip-instrumented.summary
|
|
49
|
+
|
|
50
|
+
Skips any files where a logger is already present.
|
|
51
|
+
|
|
52
|
+
# flags.skip-instrumented.description
|
|
53
|
+
|
|
54
|
+
When provided, the command will not add log statements to any Apex class that contains the `rflib_Logger` reference.
|
|
55
|
+
|
|
47
56
|
# examples
|
|
48
57
|
|
|
49
58
|
- Add logging statements to all Apex classes in a directory:
|
|
@@ -56,5 +65,4 @@ $ sf rflib logging apex instrument --sourcepath force-app/main/default/classes -
|
|
|
56
65
|
|
|
57
66
|
- Add logging statements and format code:
|
|
58
67
|
|
|
59
|
-
$ sf rflib logging apex instrument --sourcepath force-app/main/default/classes --prettier
|
|
60
|
-
|
|
68
|
+
$ sf rflib logging apex instrument --sourcepath force-app/main/default/classes --prettier
|
|
@@ -63,6 +63,14 @@ Exclude the instrumentation of if-else statements.
|
|
|
63
63
|
|
|
64
64
|
When provided, the command will not add log statements inside of `if` and `else` blocks.
|
|
65
65
|
|
|
66
|
+
# flags.skip-instrumented.summary
|
|
67
|
+
|
|
68
|
+
Skips any files where a logger is already present.
|
|
69
|
+
|
|
70
|
+
# flags.skip-instrumented.description
|
|
71
|
+
|
|
72
|
+
When provided, the command will not add log statements to any Aura component that contains the `` component.
|
|
73
|
+
|
|
66
74
|
# examples
|
|
67
75
|
|
|
68
76
|
- Add logging to all aura files:
|
|
@@ -75,4 +83,4 @@ $ sf rflib logging aura instrument --sourcepath force-app --dryrun
|
|
|
75
83
|
$ sf rflib logging aura instrument --sourcepath force-app --prettier
|
|
76
84
|
|
|
77
85
|
- Process specific component:
|
|
78
|
-
$ sf rflib logging aura instrument --sourcepath force-app/main/default/aura/myComponent
|
|
86
|
+
$ sf rflib logging aura instrument --sourcepath force-app/main/default/aura/myComponent
|
|
@@ -57,6 +57,14 @@ Exclude the instrumentation of if-else statements.
|
|
|
57
57
|
|
|
58
58
|
When provided, the command will not add log statements inside of `if` and `else` blocks.
|
|
59
59
|
|
|
60
|
+
# flags.skip-instrumented.summary
|
|
61
|
+
|
|
62
|
+
Skips any files where a logger is already present.
|
|
63
|
+
|
|
64
|
+
# flags.skip-instrumented.description
|
|
65
|
+
|
|
66
|
+
When provided, the command will not add log statements to any Apex class that contains the `rflib` import statement.
|
|
67
|
+
|
|
60
68
|
# examples
|
|
61
69
|
|
|
62
70
|
- Add logging to all LWC files:
|