rflib-plugin 0.5.0 → 0.6.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/lib/commands/rflib/logging/aura/instrument.js +8 -0
- package/lib/commands/rflib/logging/aura/instrument.js.map +1 -1
- package/lib/commands/rflib/logging/lwc/instrument.js +8 -0
- package/lib/commands/rflib/logging/lwc/instrument.js.map +1 -1
- package/messages/rflib.logging.aura.instrument.md +1 -0
- package/messages/rflib.logging.lwc.instrument.md +1 -0
- package/oclif.manifest.json +72 -72
- package/package.json +1 -1
|
@@ -15,6 +15,7 @@ class AuraInstrumentationService {
|
|
|
15
15
|
static TRY_CATCH_BLOCK_REGEX = /try\s*{[\s\S]*?}\s*catch\s*\(([^)]*)\)\s*{/g;
|
|
16
16
|
static IF_STATEMENT_REGEX = /if\s*\((.*?)\)\s*(?:{([^]*?(?:(?<!{){(?:[^]*?)}(?!})[^]*?)*)}|([^{].*?)(?=\s*(?:;|$));)/g;
|
|
17
17
|
static ELSE_REGEX = /}\s*else(?!\s+if\b)\s*(?:{((?:[^{}]|{(?:[^{}]|{[^{}]*})*})*)}|([^{].*?)(?=\n|;|$))/g;
|
|
18
|
+
static CONSOLE_LOG_REGEX = /console\.(log|debug|info|warn|error)\s*\(\s*([^)]+)\s*\)\s*;?/g;
|
|
18
19
|
static PRETTIER_CONFIG = {
|
|
19
20
|
parser: 'babel',
|
|
20
21
|
printWidth: 120,
|
|
@@ -59,6 +60,7 @@ class AuraInstrumentationService {
|
|
|
59
60
|
bodyContent = this.processIfStatements(bodyContent, loggerVar);
|
|
60
61
|
}
|
|
61
62
|
bodyContent = AuraInstrumentationService.processPromiseChains(bodyContent, loggerVar);
|
|
63
|
+
bodyContent = AuraInstrumentationService.processConsoleStatements(bodyContent, loggerVar);
|
|
62
64
|
return `${methodName}: function(${params}) {${bodyContent}}`;
|
|
63
65
|
});
|
|
64
66
|
}
|
|
@@ -119,6 +121,12 @@ class AuraInstrumentationService {
|
|
|
119
121
|
});
|
|
120
122
|
return modified;
|
|
121
123
|
}
|
|
124
|
+
static processConsoleStatements(methodBody, loggerName) {
|
|
125
|
+
return methodBody.replace(this.CONSOLE_LOG_REGEX, (match, logType, argument) => {
|
|
126
|
+
const logLevel = logType === 'info' || logType === 'warn' || logType === 'error' ? logType : 'debug';
|
|
127
|
+
return `${loggerName}.${logLevel}(${argument});`;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
122
130
|
}
|
|
123
131
|
export default class RflibLoggingAuraInstrument extends SfCommand {
|
|
124
132
|
static summary = messages.getMessage('summary');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../../../../src/commands/rflib/logging/aura/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 IfCondition {\n readonly condition: string;\n readonly position: number;\n}\n\ninterface InstrumentationOptions {\n readonly prettier: boolean;\n readonly noIf: boolean;\n readonly skipInstrumented: boolean;\n}\n\nexport interface RflibLoggingAuraInstrumentResult {\n processedFiles: number;\n modifiedFiles: number;\n formattedFiles: number;\n}\n\nMessages.importMessagesDirectoryFromMetaUrl(import.meta.url);\nconst messages = Messages.loadMessages('rflib-plugin', 'rflib.logging.aura.instrument');\n\nclass AuraInstrumentationService {\n public static readonly ATTRIBUTE_REGEX = /<aura:attribute[^>]*>/g;\n public static readonly LOGGER_COMPONENT_REGEX = /<c:rflibLoggerCmp\\s+aura:id=\"([^\"]+)\"\\s+name=\"([^\"]+)\"\\s+appendComponentId=\"([^\"]+)\"\\s*\\/>/;\n\n private static readonly LOGGER_VAR_REGEX = /var\\s+(\\w+)\\s*=\\s*\\w+\\.find\\(['\"](\\w+)['\"]\\);/;\n private static readonly METHOD_REGEX = /(\\b\\w+)\\s*:\\s*function\\s*\\((.*?)\\)\\s*{((?:[^{}]|{(?:[^{}]|{(?:[^{}]|{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})*})*})*?)}/g;\n private static readonly PROMISE_CHAIN_REGEX = /\\.(then|catch|finally)\\s*\\(\\s*function\\s*\\(([^)]*)\\)\\s*{([\\s\\S]*?)}/g;\n private static readonly TRY_CATCH_BLOCK_REGEX = /try\\s*{[\\s\\S]*?}\\s*catch\\s*\\(([^)]*)\\)\\s*{/g;\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\n private static readonly PRETTIER_CONFIG: prettier.Options = {\n parser: 'babel',\n printWidth: 120,\n tabWidth: 4,\n useTabs: false,\n singleQuote: true,\n trailingComma: 'none'\n };\n\n public static isInstrumented(content: string, loggerId: string): boolean {\n return new RegExp(`\\\\.find\\\\(['\"]${loggerId}['\"]\\\\)`, 'g').test(content);\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 processMethodLogging(\n content: string,\n loggerId: string,\n isHelper: boolean,\n noIf: boolean\n ): string {\n return content.replace(\n this.METHOD_REGEX,\n (match: string, methodName: string, params: string, body: string) => {\n const paramList = params.split(',').map((p) => p.trim()).filter(Boolean);\n let loggerVar = 'logger';\n let bodyContent = body;\n\n const paramsToLog = isHelper ? paramList : paramList.slice(1, 2);\n const placeholders = paramsToLog.map((_, i) => `{${i}}`).join(', ');\n const logParams = paramsToLog.length > 0 ? `, [${paramsToLog.join(', ')}]` : '';\n\n const loggerMatch = body.match(this.LOGGER_VAR_REGEX);\n if (loggerMatch && loggerMatch[2] === loggerId) {\n loggerVar = loggerMatch[1];\n const loggerIndex = body.indexOf(loggerMatch[0]) + loggerMatch[0].length;\n bodyContent = `${body.slice(0, loggerIndex)}\\n ${loggerVar}.info('${methodName}(${placeholders})'${logParams});${body.slice(loggerIndex)}`;\n } else {\n const loggerInit = `var ${loggerVar} = ${paramList[0]}.find('${loggerId}');\\n`;\n bodyContent = `\\n ${loggerInit} ${loggerVar}.info('${methodName}(${placeholders})'${logParams});${body}`;\n }\n\n if (!noIf) {\n bodyContent = this.processIfStatements(bodyContent, loggerVar);\n }\n\n bodyContent = AuraInstrumentationService.processPromiseChains(bodyContent, loggerVar);\n\n return `${methodName}: function(${params}) {${bodyContent}}`;\n }\n );\n }\n\n public static processPromiseChains(content: string, loggerVar: string): string {\n return content.replace(\n this.PROMISE_CHAIN_REGEX,\n (match: string, type: string, param: string, blockBody: string) => {\n const logStatement = this.processPromiseType(type, param?.trim() || '', loggerVar);\n\n return match.replace(blockBody, `\\n ${logStatement}\\n ${blockBody}`);\n }\n );\n }\n\n public static processTryCatchBlocks(content: string): string {\n return content.replace(\n this.TRY_CATCH_BLOCK_REGEX,\n (match: string, exceptionVar: string) => {\n const errorVar = exceptionVar.trim().split(' ')[0] || 'error';\n return match.replace(\n /catch\\s*\\(([^)]*)\\)\\s*{/,\n `catch(${exceptionVar}) {\n logger.error('An error occurred', ${errorVar});`\n );\n }\n );\n }\n\n private static processPromiseType(type: string, paramName: string, loggerVar: string): string {\n switch (type) {\n case 'then':\n return `${loggerVar}.info('Promise resolved. Result={0}', ${paramName});`;\n case 'catch':\n return `${loggerVar}.error('An error occurred', ${paramName});`;\n case 'finally':\n return `${loggerVar}.info('Promise chain completed');`;\n default:\n throw new Error(`Unsupported promise type: ${type}`);\n }\n }\n\n private 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)\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\nexport default class RflibLoggingAuraInstrument extends SfCommand<RflibLoggingAuraInstrumentResult> {\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: RflibLoggingAuraInstrumentResult = {\n processedFiles: 0,\n modifiedFiles: 0,\n formattedFiles: 0\n };\n\n public async run(): Promise<RflibLoggingAuraInstrumentResult> {\n this.logger = await Logger.child(this.ctor.name);\n const { flags } = await this.parse(RflibLoggingAuraInstrument);\n\n const instrumentationOpts: InstrumentationOptions = {\n prettier: flags.prettier,\n noIf: flags['no-if'],\n skipInstrumented: flags['skip-instrumented']\n };\n\n this.log(`Starting Aura component instrumentation in ${flags.sourcepath}`);\n this.logger.debug(`Dry run mode: ${flags.dryrun}`);\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 this.logger.debug(`Processing directory: ${dirPath}`);\n\n const dirName = path.basename(dirPath);\n const parentDir = path.basename(path.dirname(dirPath));\n\n if (parentDir === 'aura') {\n this.logger.info(`Processing single component: ${dirName}`);\n await this.processAuraComponent(dirPath, dirName, isDryRun, instrumentationOpts);\n return;\n }\n\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n if (entry.name === 'aura') {\n await this.processAuraComponents(fullPath, isDryRun, instrumentationOpts);\n } else {\n await this.processDirectory(fullPath, isDryRun, instrumentationOpts);\n }\n }\n }\n }\n\n private async processAuraComponents(\n auraPath: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n if (path.basename(auraPath) !== 'aura') {\n this.logger.warn(`Not an aura directory: ${auraPath}`);\n return;\n }\n\n const entries = await fs.promises.readdir(auraPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const componentPath = path.join(auraPath, entry.name);\n await this.processAuraComponent(componentPath, entry.name, isDryRun, instrumentationOpts);\n }\n }\n }\n\n private async processAuraComponent(\n componentPath: string,\n componentName: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n this.logger.info(`Processing Aura component: ${componentName}`);\n\n const cmpPath = path.join(componentPath, `${componentName}.cmp`);\n const controllerPath = path.join(componentPath, `${componentName}Controller.js`);\n const helperPath = path.join(componentPath, `${componentName}Helper.js`);\n const rendererPath = path.join(componentPath, `${componentName}Renderer.js`);\n\n try {\n const loggerId = await this.instrumentCmpFile(cmpPath, componentName, isDryRun);\n this.logger.debug(`Using logger ID: ${loggerId}`);\n\n await this.instrumentJsFile(controllerPath, loggerId, isDryRun, instrumentationOpts);\n await this.instrumentJsFile(helperPath, loggerId, isDryRun, instrumentationOpts);\n await this.instrumentJsFile(rendererPath, loggerId, isDryRun, instrumentationOpts);\n } catch (error) {\n this.logger.error(`Error processing Aura component ${componentName}`, error);\n throw error;\n }\n }\n\n private async instrumentCmpFile(\n filePath: string,\n componentName: string,\n isDryRun: boolean\n ): Promise<string> {\n if (!fs.existsSync(filePath)) {\n this.logger.warn(`Component file not found: ${filePath}`);\n return 'logger';\n }\n\n this.logger.debug(`Instrumenting component file: ${filePath}`);\n this.stats.processedFiles++;\n\n let content = await fs.promises.readFile(filePath, 'utf8');\n const originalContent = content;\n\n const loggerMatch = content.match(AuraInstrumentationService.LOGGER_COMPONENT_REGEX);\n if (loggerMatch) {\n return loggerMatch[1];\n }\n\n const lastAttributeMatch = [...content.matchAll(AuraInstrumentationService.ATTRIBUTE_REGEX)].pop();\n if (lastAttributeMatch) {\n const insertPosition = lastAttributeMatch.index + lastAttributeMatch[0].length;\n const loggerComponent = `\\n <c:rflibLoggerCmp aura:id=\"logger\" name=\"${componentName}\" appendComponentId=\"false\" />`;\n content = content.slice(0, insertPosition) + loggerComponent + content.slice(insertPosition);\n }\n\n if (content !== originalContent) {\n this.stats.modifiedFiles++;\n if (!isDryRun) {\n await fs.promises.writeFile(filePath, content, 'utf8');\n this.logger.info(`Modified component file: ${filePath}`);\n } else {\n this.logger.info(`Would modify component file: ${filePath}`);\n }\n }\n\n return 'logger';\n }\n\n private async instrumentJsFile(\n filePath: string,\n loggerId: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n if (!fs.existsSync(filePath)) {\n this.logger.debug(`JavaScript file not found: ${filePath}`);\n return;\n }\n\n this.logger.debug(`Instrumenting JavaScript file: ${filePath}`);\n this.stats.processedFiles++;\n\n let content = await fs.promises.readFile(filePath, 'utf8');\n\n if (instrumentationOpts.skipInstrumented && AuraInstrumentationService.isInstrumented(content, loggerId)) {\n this.logger.info(`Skipping instrumented file: ${filePath}`);\n return;\n }\n\n const originalContent = content;\n const isHelper = filePath.endsWith('Helper.js');\n\n // Process methods and other patterns\n content = AuraInstrumentationService.processMethodLogging(\n content,\n loggerId,\n isHelper,\n instrumentationOpts.noIf\n );\n content = AuraInstrumentationService.processTryCatchBlocks(content);\n\n if (content !== originalContent) {\n this.stats.modifiedFiles++;\n if (!isDryRun) {\n try {\n const finalContent = instrumentationOpts.prettier\n ? await AuraInstrumentationService.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 }\n}"]}
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../../../../src/commands/rflib/logging/aura/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 IfCondition {\n readonly condition: string;\n readonly position: number;\n}\n\ninterface InstrumentationOptions {\n readonly prettier: boolean;\n readonly noIf: boolean;\n readonly skipInstrumented: boolean;\n}\n\nexport interface RflibLoggingAuraInstrumentResult {\n processedFiles: number;\n modifiedFiles: number;\n formattedFiles: number;\n}\n\nMessages.importMessagesDirectoryFromMetaUrl(import.meta.url);\nconst messages = Messages.loadMessages('rflib-plugin', 'rflib.logging.aura.instrument');\n\nclass AuraInstrumentationService {\n public static readonly ATTRIBUTE_REGEX = /<aura:attribute[^>]*>/g;\n public static readonly LOGGER_COMPONENT_REGEX = /<c:rflibLoggerCmp\\s+aura:id=\"([^\"]+)\"\\s+name=\"([^\"]+)\"\\s+appendComponentId=\"([^\"]+)\"\\s*\\/>/;\n\n private static readonly LOGGER_VAR_REGEX = /var\\s+(\\w+)\\s*=\\s*\\w+\\.find\\(['\"](\\w+)['\"]\\);/;\n private static readonly METHOD_REGEX = /(\\b\\w+)\\s*:\\s*function\\s*\\((.*?)\\)\\s*{((?:[^{}]|{(?:[^{}]|{(?:[^{}]|{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})*})*})*?)}/g;\n private static readonly PROMISE_CHAIN_REGEX = /\\.(then|catch|finally)\\s*\\(\\s*function\\s*\\(([^)]*)\\)\\s*{([\\s\\S]*?)}/g;\n private static readonly TRY_CATCH_BLOCK_REGEX = /try\\s*{[\\s\\S]*?}\\s*catch\\s*\\(([^)]*)\\)\\s*{/g;\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 CONSOLE_LOG_REGEX = /console\\.(log|debug|info|warn|error)\\s*\\(\\s*([^)]+)\\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 trailingComma: 'none'\n };\n\n public static isInstrumented(content: string, loggerId: string): boolean {\n return new RegExp(`\\\\.find\\\\(['\"]${loggerId}['\"]\\\\)`, 'g').test(content);\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 processMethodLogging(\n content: string,\n loggerId: string,\n isHelper: boolean,\n noIf: boolean\n ): string {\n return content.replace(\n this.METHOD_REGEX,\n (match: string, methodName: string, params: string, body: string) => {\n const paramList = params.split(',').map((p) => p.trim()).filter(Boolean);\n let loggerVar = 'logger';\n let bodyContent = body;\n\n const paramsToLog = isHelper ? paramList : paramList.slice(1, 2);\n const placeholders = paramsToLog.map((_, i) => `{${i}}`).join(', ');\n const logParams = paramsToLog.length > 0 ? `, [${paramsToLog.join(', ')}]` : '';\n\n const loggerMatch = body.match(this.LOGGER_VAR_REGEX);\n if (loggerMatch && loggerMatch[2] === loggerId) {\n loggerVar = loggerMatch[1];\n const loggerIndex = body.indexOf(loggerMatch[0]) + loggerMatch[0].length;\n bodyContent = `${body.slice(0, loggerIndex)}\\n ${loggerVar}.info('${methodName}(${placeholders})'${logParams});${body.slice(loggerIndex)}`;\n } else {\n const loggerInit = `var ${loggerVar} = ${paramList[0]}.find('${loggerId}');\\n`;\n bodyContent = `\\n ${loggerInit} ${loggerVar}.info('${methodName}(${placeholders})'${logParams});${body}`;\n }\n\n if (!noIf) {\n bodyContent = this.processIfStatements(bodyContent, loggerVar);\n }\n\n bodyContent = AuraInstrumentationService.processPromiseChains(bodyContent, loggerVar);\n bodyContent = AuraInstrumentationService.processConsoleStatements(bodyContent, loggerVar);\n\n return `${methodName}: function(${params}) {${bodyContent}}`;\n }\n );\n }\n\n public static processPromiseChains(content: string, loggerVar: string): string {\n return content.replace(\n this.PROMISE_CHAIN_REGEX,\n (match: string, type: string, param: string, blockBody: string) => {\n const logStatement = this.processPromiseType(type, param?.trim() || '', loggerVar);\n\n return match.replace(blockBody, `\\n ${logStatement}\\n ${blockBody}`);\n }\n );\n }\n\n public static processTryCatchBlocks(content: string): string {\n return content.replace(\n this.TRY_CATCH_BLOCK_REGEX,\n (match: string, exceptionVar: string) => {\n const errorVar = exceptionVar.trim().split(' ')[0] || 'error';\n return match.replace(\n /catch\\s*\\(([^)]*)\\)\\s*{/,\n `catch(${exceptionVar}) {\n logger.error('An error occurred', ${errorVar});`\n );\n }\n );\n }\n\n private static processPromiseType(type: string, paramName: string, loggerVar: string): string {\n switch (type) {\n case 'then':\n return `${loggerVar}.info('Promise resolved. Result={0}', ${paramName});`;\n case 'catch':\n return `${loggerVar}.error('An error occurred', ${paramName});`;\n case 'finally':\n return `${loggerVar}.info('Promise chain completed');`;\n default:\n throw new Error(`Unsupported promise type: ${type}`);\n }\n }\n\n private 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)\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 private static processConsoleStatements(methodBody: string, loggerName: string): string {\n return methodBody.replace(this.CONSOLE_LOG_REGEX, (match: string, logType: string, argument: string) => {\n const logLevel = logType === 'info' || logType === 'warn' || logType === 'error' ? logType : 'debug';\n return `${loggerName}.${logLevel}(${argument});`;\n });\n }\n}\n\nexport default class RflibLoggingAuraInstrument extends SfCommand<RflibLoggingAuraInstrumentResult> {\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: RflibLoggingAuraInstrumentResult = {\n processedFiles: 0,\n modifiedFiles: 0,\n formattedFiles: 0\n };\n\n public async run(): Promise<RflibLoggingAuraInstrumentResult> {\n this.logger = await Logger.child(this.ctor.name);\n const { flags } = await this.parse(RflibLoggingAuraInstrument);\n\n const instrumentationOpts: InstrumentationOptions = {\n prettier: flags.prettier,\n noIf: flags['no-if'],\n skipInstrumented: flags['skip-instrumented']\n };\n\n this.log(`Starting Aura component instrumentation in ${flags.sourcepath}`);\n this.logger.debug(`Dry run mode: ${flags.dryrun}`);\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 this.logger.debug(`Processing directory: ${dirPath}`);\n\n const dirName = path.basename(dirPath);\n const parentDir = path.basename(path.dirname(dirPath));\n\n if (parentDir === 'aura') {\n this.logger.info(`Processing single component: ${dirName}`);\n await this.processAuraComponent(dirPath, dirName, isDryRun, instrumentationOpts);\n return;\n }\n\n const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n if (entry.name === 'aura') {\n await this.processAuraComponents(fullPath, isDryRun, instrumentationOpts);\n } else {\n await this.processDirectory(fullPath, isDryRun, instrumentationOpts);\n }\n }\n }\n }\n\n private async processAuraComponents(\n auraPath: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n if (path.basename(auraPath) !== 'aura') {\n this.logger.warn(`Not an aura directory: ${auraPath}`);\n return;\n }\n\n const entries = await fs.promises.readdir(auraPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const componentPath = path.join(auraPath, entry.name);\n await this.processAuraComponent(componentPath, entry.name, isDryRun, instrumentationOpts);\n }\n }\n }\n\n private async processAuraComponent(\n componentPath: string,\n componentName: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n this.logger.info(`Processing Aura component: ${componentName}`);\n\n const cmpPath = path.join(componentPath, `${componentName}.cmp`);\n const controllerPath = path.join(componentPath, `${componentName}Controller.js`);\n const helperPath = path.join(componentPath, `${componentName}Helper.js`);\n const rendererPath = path.join(componentPath, `${componentName}Renderer.js`);\n\n try {\n const loggerId = await this.instrumentCmpFile(cmpPath, componentName, isDryRun);\n this.logger.debug(`Using logger ID: ${loggerId}`);\n\n await this.instrumentJsFile(controllerPath, loggerId, isDryRun, instrumentationOpts);\n await this.instrumentJsFile(helperPath, loggerId, isDryRun, instrumentationOpts);\n await this.instrumentJsFile(rendererPath, loggerId, isDryRun, instrumentationOpts);\n } catch (error) {\n this.logger.error(`Error processing Aura component ${componentName}`, error);\n throw error;\n }\n }\n\n private async instrumentCmpFile(\n filePath: string,\n componentName: string,\n isDryRun: boolean\n ): Promise<string> {\n if (!fs.existsSync(filePath)) {\n this.logger.warn(`Component file not found: ${filePath}`);\n return 'logger';\n }\n\n this.logger.debug(`Instrumenting component file: ${filePath}`);\n this.stats.processedFiles++;\n\n let content = await fs.promises.readFile(filePath, 'utf8');\n const originalContent = content;\n\n const loggerMatch = content.match(AuraInstrumentationService.LOGGER_COMPONENT_REGEX);\n if (loggerMatch) {\n return loggerMatch[1];\n }\n\n const lastAttributeMatch = [...content.matchAll(AuraInstrumentationService.ATTRIBUTE_REGEX)].pop();\n if (lastAttributeMatch) {\n const insertPosition = lastAttributeMatch.index + lastAttributeMatch[0].length;\n const loggerComponent = `\\n <c:rflibLoggerCmp aura:id=\"logger\" name=\"${componentName}\" appendComponentId=\"false\" />`;\n content = content.slice(0, insertPosition) + loggerComponent + content.slice(insertPosition);\n }\n\n if (content !== originalContent) {\n this.stats.modifiedFiles++;\n if (!isDryRun) {\n await fs.promises.writeFile(filePath, content, 'utf8');\n this.logger.info(`Modified component file: ${filePath}`);\n } else {\n this.logger.info(`Would modify component file: ${filePath}`);\n }\n }\n\n return 'logger';\n }\n\n private async instrumentJsFile(\n filePath: string,\n loggerId: string,\n isDryRun: boolean,\n instrumentationOpts: InstrumentationOptions\n ): Promise<void> {\n if (!fs.existsSync(filePath)) {\n this.logger.debug(`JavaScript file not found: ${filePath}`);\n return;\n }\n\n this.logger.debug(`Instrumenting JavaScript file: ${filePath}`);\n this.stats.processedFiles++;\n\n let content = await fs.promises.readFile(filePath, 'utf8');\n\n if (instrumentationOpts.skipInstrumented && AuraInstrumentationService.isInstrumented(content, loggerId)) {\n this.logger.info(`Skipping instrumented file: ${filePath}`);\n return;\n }\n\n const originalContent = content;\n const isHelper = filePath.endsWith('Helper.js');\n\n // Process methods and other patterns\n content = AuraInstrumentationService.processMethodLogging(\n content,\n loggerId,\n isHelper,\n instrumentationOpts.noIf\n );\n content = AuraInstrumentationService.processTryCatchBlocks(content);\n\n if (content !== originalContent) {\n this.stats.modifiedFiles++;\n if (!isDryRun) {\n try {\n const finalContent = instrumentationOpts.prettier\n ? await AuraInstrumentationService.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 }\n}"]}
|
|
@@ -15,6 +15,7 @@ class LwcInstrumentationService {
|
|
|
15
15
|
static ELSE_REGEX = /}\s*else(?!\s+if\b)\s*(?:{((?:[^{}]|{(?:[^{}]|{[^{}]*})*})*)}|([^{].*?)(?=\n|;|$))/g;
|
|
16
16
|
static PROMISE_CHAIN_REGEX = /\.(then|catch|finally)\s*\(\s*(?:async\s+)?(?:\(?([^)]*)\)?)?\s*=>\s*(?:\{((?:[^{}]|`[^`]*`)*?)\}|([^{;]*?(?:\.[^{;]*?)*(?:\([^)]*\))?)(?=\s*(?:\)\)|\.|\))))/g;
|
|
17
17
|
static TRY_CATCH_BLOCK_REGEX = /try\s*{[\s\S]*?}\s*catch\s*\(([^)]*)\)\s*{/g;
|
|
18
|
+
static CONSOLE_LOG_REGEX = /console\.(log|debug|info|warn|error)\s*\(\s*([^)]+)\s*\)\s*;?/g;
|
|
18
19
|
static PRETTIER_CONFIG = {
|
|
19
20
|
parser: 'babel',
|
|
20
21
|
printWidth: 120,
|
|
@@ -147,6 +148,12 @@ class LwcInstrumentationService {
|
|
|
147
148
|
return match;
|
|
148
149
|
});
|
|
149
150
|
}
|
|
151
|
+
static processConsoleStatements(methodBody, loggerName) {
|
|
152
|
+
return methodBody.replace(this.CONSOLE_LOG_REGEX, (match, logType, argument) => {
|
|
153
|
+
const logLevel = logType === 'info' || logType === 'warn' || logType === 'error' ? logType : 'debug';
|
|
154
|
+
return `${loggerName}.${logLevel}(${argument});`;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
150
157
|
static findEnclosingMethod(content, position) {
|
|
151
158
|
const beforeCatch = content.substring(0, position);
|
|
152
159
|
const methods = [...beforeCatch.matchAll(this.METHOD_REGEX)].reverse();
|
|
@@ -243,6 +250,7 @@ export default class RflibLoggingLwcInstrument extends SfCommand {
|
|
|
243
250
|
content = LwcInstrumentationService.processMethodLogging(content, variableName, instrumentationOpts);
|
|
244
251
|
content = LwcInstrumentationService.processTryCatchBlocks(content, variableName);
|
|
245
252
|
content = LwcInstrumentationService.processPromiseChains(content, variableName);
|
|
253
|
+
content = LwcInstrumentationService.processConsoleStatements(content, variableName);
|
|
246
254
|
if (content !== originalContent) {
|
|
247
255
|
this.stats.modifiedFiles++;
|
|
248
256
|
if (!isDryRun) {
|
|
@@ -1 +1 @@
|
|
|
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}"]}
|
|
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 private static readonly CONSOLE_LOG_REGEX = /console\\.(log|debug|info|warn|error)\\s*\\(\\s*([^)]+)\\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 public static processConsoleStatements(methodBody: string, loggerName: string): string {\n return methodBody.replace(this.CONSOLE_LOG_REGEX, (match: string, logType: string, argument: string) => {\n const logLevel = logType === 'info' || logType === 'warn' || logType === 'error' ? logType : 'debug';\n return `${loggerName}.${logLevel}(${argument});`;\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 content = LwcInstrumentationService.processConsoleStatements(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}"]}
|
|
@@ -9,6 +9,7 @@ Analyzes Aura Component files and adds RFLIB logging statements for:
|
|
|
9
9
|
- Error logging in try-catch blocks
|
|
10
10
|
- Error logging in Promise catch handlers
|
|
11
11
|
- Adds rflibLoggerCmp component if not present
|
|
12
|
+
- Replaces console.log and similar method invocations
|
|
12
13
|
- Formats modified files using Prettier (optional)
|
|
13
14
|
|
|
14
15
|
The command processes:
|
|
@@ -11,6 +11,7 @@ Analyzes Lightning Web Component JavaScript files and adds RFLIB logging stateme
|
|
|
11
11
|
- Condition logging in if/else blocks
|
|
12
12
|
- Adds logger import if not present
|
|
13
13
|
- Adds logger initialization if not present
|
|
14
|
+
- Replaces console.log and similar method invocations
|
|
14
15
|
- Formats modified files using Prettier (optional)
|
|
15
16
|
|
|
16
17
|
# flags.sourcepath.summary
|
package/oclif.manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"commands": {
|
|
3
|
-
"rflib:logging:
|
|
3
|
+
"rflib:logging:aura:instrument": {
|
|
4
4
|
"aliases": [],
|
|
5
5
|
"args": {},
|
|
6
|
-
"description": "Analyzes
|
|
6
|
+
"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",
|
|
7
7
|
"examples": [
|
|
8
|
-
"- Add logging
|
|
8
|
+
"- 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"
|
|
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 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()",
|
|
29
29
|
"name": "sourcepath",
|
|
30
30
|
"required": true,
|
|
31
|
-
"summary": "Directory containing
|
|
31
|
+
"summary": "Directory containing Aura components 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. Shows:\n- Files that would be modified\n- Number of processed files\n- Number of modified files\n- Number of formatted files",
|
|
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 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",
|
|
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 Aura component that contains the `` component.",
|
|
61
61
|
"name": "skip-instrumented",
|
|
62
62
|
"summary": "Skips any files where a logger is already present.",
|
|
63
63
|
"allowNo": false,
|
|
@@ -66,12 +66,12 @@
|
|
|
66
66
|
},
|
|
67
67
|
"hasDynamicHelp": false,
|
|
68
68
|
"hiddenAliases": [],
|
|
69
|
-
"id": "rflib:logging:
|
|
69
|
+
"id": "rflib:logging:aura:instrument",
|
|
70
70
|
"pluginAlias": "rflib-plugin",
|
|
71
71
|
"pluginName": "rflib-plugin",
|
|
72
72
|
"pluginType": "core",
|
|
73
73
|
"strict": true,
|
|
74
|
-
"summary": "Instrument
|
|
74
|
+
"summary": "Instrument Aura Components with RFLIB logging statements automatically.",
|
|
75
75
|
"enableJsonFlag": true,
|
|
76
76
|
"isESM": true,
|
|
77
77
|
"relativePath": [
|
|
@@ -79,43 +79,43 @@
|
|
|
79
79
|
"commands",
|
|
80
80
|
"rflib",
|
|
81
81
|
"logging",
|
|
82
|
-
"
|
|
82
|
+
"aura",
|
|
83
83
|
"instrument.js"
|
|
84
84
|
],
|
|
85
85
|
"aliasPermutations": [],
|
|
86
86
|
"permutations": [
|
|
87
|
-
"rflib:logging:
|
|
88
|
-
"logging:rflib:
|
|
89
|
-
"logging:
|
|
90
|
-
"logging:
|
|
91
|
-
"rflib:
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"rflib:
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"rflib:logging:instrument:
|
|
100
|
-
"logging:rflib:instrument:
|
|
101
|
-
"logging:instrument:rflib:
|
|
102
|
-
"logging:instrument:
|
|
103
|
-
"rflib:instrument:logging:
|
|
104
|
-
"instrument:rflib:logging:
|
|
105
|
-
"instrument:logging:rflib:
|
|
106
|
-
"instrument:logging:
|
|
107
|
-
"rflib:instrument:
|
|
108
|
-
"instrument:rflib:
|
|
109
|
-
"instrument:
|
|
110
|
-
"instrument:
|
|
87
|
+
"rflib:logging:aura:instrument",
|
|
88
|
+
"logging:rflib:aura:instrument",
|
|
89
|
+
"logging:aura:rflib:instrument",
|
|
90
|
+
"logging:aura:instrument:rflib",
|
|
91
|
+
"rflib:aura:logging:instrument",
|
|
92
|
+
"aura:rflib:logging:instrument",
|
|
93
|
+
"aura:logging:rflib:instrument",
|
|
94
|
+
"aura:logging:instrument:rflib",
|
|
95
|
+
"rflib:aura:instrument:logging",
|
|
96
|
+
"aura:rflib:instrument:logging",
|
|
97
|
+
"aura:instrument:rflib:logging",
|
|
98
|
+
"aura:instrument:logging:rflib",
|
|
99
|
+
"rflib:logging:instrument:aura",
|
|
100
|
+
"logging:rflib:instrument:aura",
|
|
101
|
+
"logging:instrument:rflib:aura",
|
|
102
|
+
"logging:instrument:aura:rflib",
|
|
103
|
+
"rflib:instrument:logging:aura",
|
|
104
|
+
"instrument:rflib:logging:aura",
|
|
105
|
+
"instrument:logging:rflib:aura",
|
|
106
|
+
"instrument:logging:aura:rflib",
|
|
107
|
+
"rflib:instrument:aura:logging",
|
|
108
|
+
"instrument:rflib:aura:logging",
|
|
109
|
+
"instrument:aura:rflib:logging",
|
|
110
|
+
"instrument:aura:logging:rflib"
|
|
111
111
|
]
|
|
112
112
|
},
|
|
113
|
-
"rflib:logging:
|
|
113
|
+
"rflib:logging:apex:instrument": {
|
|
114
114
|
"aliases": [],
|
|
115
115
|
"args": {},
|
|
116
|
-
"description": "Analyzes
|
|
116
|
+
"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.",
|
|
117
117
|
"examples": [
|
|
118
|
-
"- Add logging to all
|
|
118
|
+
"- 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"
|
|
119
119
|
],
|
|
120
120
|
"flags": {
|
|
121
121
|
"json": {
|
|
@@ -135,17 +135,17 @@
|
|
|
135
135
|
},
|
|
136
136
|
"sourcepath": {
|
|
137
137
|
"char": "s",
|
|
138
|
-
"description": "Path to the source directory containing
|
|
138
|
+
"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.",
|
|
139
139
|
"name": "sourcepath",
|
|
140
140
|
"required": true,
|
|
141
|
-
"summary": "Directory containing
|
|
141
|
+
"summary": "Directory containing Apex classes to instrument with logging.",
|
|
142
142
|
"hasDynamicHelp": false,
|
|
143
143
|
"multiple": false,
|
|
144
144
|
"type": "option"
|
|
145
145
|
},
|
|
146
146
|
"dryrun": {
|
|
147
147
|
"char": "d",
|
|
148
|
-
"description": "When enabled, shows which files would be modified without making actual changes. Useful for reviewing the impact before applying changes.
|
|
148
|
+
"description": "When enabled, shows which files would be modified without making actual changes. Useful for reviewing the impact before applying changes.",
|
|
149
149
|
"name": "dryrun",
|
|
150
150
|
"summary": "Preview changes without modifying files.",
|
|
151
151
|
"allowNo": false,
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
},
|
|
154
154
|
"prettier": {
|
|
155
155
|
"char": "p",
|
|
156
|
-
"description": "When enabled, formats the modified
|
|
156
|
+
"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",
|
|
157
157
|
"name": "prettier",
|
|
158
158
|
"summary": "Format modified files using Prettier.",
|
|
159
159
|
"allowNo": false,
|
|
@@ -167,7 +167,7 @@
|
|
|
167
167
|
"type": "boolean"
|
|
168
168
|
},
|
|
169
169
|
"skip-instrumented": {
|
|
170
|
-
"description": "When provided, the command will not add log statements to any
|
|
170
|
+
"description": "When provided, the command will not add log statements to any Apex class that contains the `rflib_Logger` reference.",
|
|
171
171
|
"name": "skip-instrumented",
|
|
172
172
|
"summary": "Skips any files where a logger is already present.",
|
|
173
173
|
"allowNo": false,
|
|
@@ -176,12 +176,12 @@
|
|
|
176
176
|
},
|
|
177
177
|
"hasDynamicHelp": false,
|
|
178
178
|
"hiddenAliases": [],
|
|
179
|
-
"id": "rflib:logging:
|
|
179
|
+
"id": "rflib:logging:apex:instrument",
|
|
180
180
|
"pluginAlias": "rflib-plugin",
|
|
181
181
|
"pluginName": "rflib-plugin",
|
|
182
182
|
"pluginType": "core",
|
|
183
183
|
"strict": true,
|
|
184
|
-
"summary": "Instrument
|
|
184
|
+
"summary": "Instrument Apex classes with RFLIB logging statements automatically.",
|
|
185
185
|
"enableJsonFlag": true,
|
|
186
186
|
"isESM": true,
|
|
187
187
|
"relativePath": [
|
|
@@ -189,41 +189,41 @@
|
|
|
189
189
|
"commands",
|
|
190
190
|
"rflib",
|
|
191
191
|
"logging",
|
|
192
|
-
"
|
|
192
|
+
"apex",
|
|
193
193
|
"instrument.js"
|
|
194
194
|
],
|
|
195
195
|
"aliasPermutations": [],
|
|
196
196
|
"permutations": [
|
|
197
|
-
"rflib:logging:
|
|
198
|
-
"logging:rflib:
|
|
199
|
-
"logging:
|
|
200
|
-
"logging:
|
|
201
|
-
"rflib:
|
|
202
|
-
"
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"rflib:
|
|
206
|
-
"
|
|
207
|
-
"
|
|
208
|
-
"
|
|
209
|
-
"rflib:logging:instrument:
|
|
210
|
-
"logging:rflib:instrument:
|
|
211
|
-
"logging:instrument:rflib:
|
|
212
|
-
"logging:instrument:
|
|
213
|
-
"rflib:instrument:logging:
|
|
214
|
-
"instrument:rflib:logging:
|
|
215
|
-
"instrument:logging:rflib:
|
|
216
|
-
"instrument:logging:
|
|
217
|
-
"rflib:instrument:
|
|
218
|
-
"instrument:rflib:
|
|
219
|
-
"instrument:
|
|
220
|
-
"instrument:
|
|
197
|
+
"rflib:logging:apex:instrument",
|
|
198
|
+
"logging:rflib:apex:instrument",
|
|
199
|
+
"logging:apex:rflib:instrument",
|
|
200
|
+
"logging:apex:instrument:rflib",
|
|
201
|
+
"rflib:apex:logging:instrument",
|
|
202
|
+
"apex:rflib:logging:instrument",
|
|
203
|
+
"apex:logging:rflib:instrument",
|
|
204
|
+
"apex:logging:instrument:rflib",
|
|
205
|
+
"rflib:apex:instrument:logging",
|
|
206
|
+
"apex:rflib:instrument:logging",
|
|
207
|
+
"apex:instrument:rflib:logging",
|
|
208
|
+
"apex:instrument:logging:rflib",
|
|
209
|
+
"rflib:logging:instrument:apex",
|
|
210
|
+
"logging:rflib:instrument:apex",
|
|
211
|
+
"logging:instrument:rflib:apex",
|
|
212
|
+
"logging:instrument:apex:rflib",
|
|
213
|
+
"rflib:instrument:logging:apex",
|
|
214
|
+
"instrument:rflib:logging:apex",
|
|
215
|
+
"instrument:logging:rflib:apex",
|
|
216
|
+
"instrument:logging:apex:rflib",
|
|
217
|
+
"rflib:instrument:apex:logging",
|
|
218
|
+
"instrument:rflib:apex:logging",
|
|
219
|
+
"instrument:apex:rflib:logging",
|
|
220
|
+
"instrument:apex:logging:rflib"
|
|
221
221
|
]
|
|
222
222
|
},
|
|
223
223
|
"rflib:logging:lwc:instrument": {
|
|
224
224
|
"aliases": [],
|
|
225
225
|
"args": {},
|
|
226
|
-
"description": "Analyzes Lightning Web Component JavaScript files and adds RFLIB logging statements for:\n- Method entry logging with parameter values\n- Error logging in try-catch blocks\n- Error logging in Promise catch handlers\n- Condition logging in if/else blocks\n- Adds logger import if not present\n- Adds logger initialization if not present\n- Formats modified files using Prettier (optional)",
|
|
226
|
+
"description": "Analyzes Lightning Web Component JavaScript files and adds RFLIB logging statements for:\n- Method entry logging with parameter values\n- Error logging in try-catch blocks\n- Error logging in Promise catch handlers\n- Condition logging in if/else blocks\n- Adds logger import if not present\n- Adds logger initialization if not present\n- Replaces console.log and similar method invocations\n- Formats modified files using Prettier (optional)",
|
|
227
227
|
"examples": [
|
|
228
228
|
"- Add logging to all LWC files:\n$ sf rflib logging lwc instrument --sourcepath force-app/main/default/lwc\n\n- Preview changes:\n$ sf rflib logging lwc instrument --sourcepath force-app/main/default/lwc --dryrun\n\n- Add logging and format code:\n$ sf rflib logging lwc instrument --sourcepath force-app/main/default/lwc --prettier\n\n- Process specific component:\n$ sf rflib logging lwc instrument --sourcepath force-app/main/default/lwc/myComponent"
|
|
229
229
|
],
|
|
@@ -331,5 +331,5 @@
|
|
|
331
331
|
]
|
|
332
332
|
}
|
|
333
333
|
},
|
|
334
|
-
"version": "0.
|
|
334
|
+
"version": "0.6.0"
|
|
335
335
|
}
|
package/package.json
CHANGED