UNPKG

ctrlshiftleft

Version:

AI-powered toolkit for embedding QA and security testing into development workflows

246 lines (210 loc) 9.79 kB
// This is a minimal VS Code extension for ctrl.shift.left // It provides basic commands without external dependencies // VS Code extension API // @ts-check /** * @param {import('vscode').ExtensionContext} context */ function activate(context) { // Import vscode module const vscode = require('vscode'); console.log('Activating Ctrl+Shift+Left extension'); // Create output channel const outputChannel = vscode.window.createOutputChannel('Ctrl+Shift+Left'); // Initialize security diagnostics collection const securityDiagnostics = vscode.languages.createDiagnosticCollection('ctrlshiftleft-security'); // Register Generate Tests command const generateTestsCmd = vscode.commands.registerCommand('ctrlshiftleft.generateTests', function() { const editor = vscode.window.activeTextEditor; if (!editor) { vscode.window.showErrorMessage('No active editor found'); return; } // Show progress notification vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: "Generating tests...", cancellable: false }, (progress) => { progress.report({ message: "Analyzing code structure" }); // Display sample output in the output channel outputChannel.clear(); outputChannel.show(); outputChannel.appendLine(`Generating tests for: ${editor.document.fileName}`); outputChannel.appendLine('Analysis complete!'); outputChannel.appendLine('Generated 3 test cases.'); // Sample success message vscode.window.showInformationMessage('Successfully generated 3 test cases!'); // This is a Promise that resolves after 2 seconds return new Promise(resolve => { setTimeout(() => { resolve(); }, 2000); }); }); }); // Register Analyze Security command const analyzeSecurityCmd = vscode.commands.registerCommand('ctrlshiftleft.analyzeSecurityRisks', function() { const editor = vscode.window.activeTextEditor; if (!editor) { vscode.window.showErrorMessage('No active editor found'); return; } // Show progress notification vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: "Analyzing security risks...", cancellable: false }, (progress) => { progress.report({ message: "Scanning for vulnerabilities" }); // Clear previous diagnostics securityDiagnostics.clear(); // Display sample output in the output channel outputChannel.clear(); outputChannel.show(); outputChannel.appendLine(`Analyzing security for: ${editor.document.fileName}`); // Sample security issues const docText = editor.document.getText(); const diagnostics = []; // Look for password patterns const passwordRegex = /password/i; for (let i = 0; i < editor.document.lineCount; i++) { const line = editor.document.lineAt(i); if (passwordRegex.test(line.text)) { diagnostics.push( new vscode.Diagnostic( line.range, 'Potential unprotected password field detected', vscode.DiagnosticSeverity.Warning ) ); outputChannel.appendLine(`Line ${i+1}: Potential unprotected password field detected`); } } // Look for XSS vulnerabilities const xssRegex = /innerHTML|dangerouslySetInnerHTML/; for (let i = 0; i < editor.document.lineCount; i++) { const line = editor.document.lineAt(i); if (xssRegex.test(line.text)) { diagnostics.push( new vscode.Diagnostic( line.range, 'Potential XSS vulnerability: Unsafe DOM manipulation', vscode.DiagnosticSeverity.Error ) ); outputChannel.appendLine(`Line ${i+1}: Potential XSS vulnerability detected`); } } // Set diagnostics securityDiagnostics.set(editor.document.uri, diagnostics); // Sample success message if (diagnostics.length > 0) { vscode.window.showWarningMessage(`Found ${diagnostics.length} potential security issues`); } else { vscode.window.showInformationMessage('No security issues found'); } // Return a Promise that resolves after 2 seconds return new Promise(resolve => { setTimeout(() => { resolve(); }, 2000); }); }); }); // Register Generate Checklist command const generateChecklistCmd = vscode.commands.registerCommand('ctrlshiftleft.generateChecklist', function() { const editor = vscode.window.activeTextEditor; if (!editor) { vscode.window.showErrorMessage('No active editor found'); return; } // Show progress notification vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: "Generating QA & Security checklist...", cancellable: false }, (progress) => { progress.report({ message: "Analyzing code quality" }); // Display sample output in the output channel outputChannel.clear(); outputChannel.show(); outputChannel.appendLine(`Generating checklist for: ${editor.document.fileName}`); outputChannel.appendLine('QA & Security Checklist:'); outputChannel.appendLine('-------------------------'); outputChannel.appendLine('✅ Input validation implemented'); outputChannel.appendLine('❌ Error handling incomplete'); outputChannel.appendLine('✅ Form accessibility standards met'); outputChannel.appendLine('❌ Sensitive data needs secure storage'); outputChannel.appendLine('✅ Component has appropriate tests'); // Sample success message vscode.window.showInformationMessage('QA & Security checklist generated!'); // Return a Promise that resolves after 2 seconds return new Promise(resolve => { setTimeout(() => { resolve(); }, 2000); }); }); }); // Register Run Tests command const runTestsCmd = vscode.commands.registerCommand('ctrlshiftleft.runTests', function() { // Show progress notification vscode.window.withProgress({ location: vscode.ProgressLocation.Notification, title: "Running tests...", cancellable: false }, (progress) => { progress.report({ message: "Executing test suite" }); // Display sample output in the output channel outputChannel.clear(); outputChannel.show(); outputChannel.appendLine('Running tests...'); outputChannel.appendLine('Test Results:'); outputChannel.appendLine('-------------------------'); outputChannel.appendLine('✅ validateCreditCardNumber: PASSED'); outputChannel.appendLine('✅ validateExpiryDate: PASSED'); outputChannel.appendLine('✅ validateCVV: PASSED'); outputChannel.appendLine('-------------------------'); outputChannel.appendLine('Total: 3 passed, 0 failed'); // Sample success message vscode.window.showInformationMessage('All tests passed successfully!'); // Return a Promise that resolves after 2 seconds return new Promise(resolve => { setTimeout(() => { resolve(); }, 2000); }); }); }); // Register Toggle Watcher command const toggleWatcherCmd = vscode.commands.registerCommand('ctrlshiftleft.toggleWatcher', function() { const config = vscode.workspace.getConfiguration('ctrlshiftleft'); const isEnabled = config.get('enableWatcher'); // Toggle the setting config.update('enableWatcher', !isEnabled, vscode.ConfigurationTarget.Workspace) .then(() => { if (!isEnabled) { vscode.window.showInformationMessage('Ctrl+Shift+Left watcher is now active'); } else { vscode.window.showInformationMessage('Ctrl+Shift+Left watcher has been disabled'); } }); }); // Add all commands to subscriptions context.subscriptions.push( generateTestsCmd, analyzeSecurityCmd, generateChecklistCmd, runTestsCmd, toggleWatcherCmd, securityDiagnostics ); // Show welcome message vscode.window.showInformationMessage('Ctrl+Shift+Left extension is now active!'); } function deactivate() {} module.exports = { activate, deactivate };