diff --git a/README.md b/README.md index ef8c1c5..0a0338d 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Use the Command Palette (`Ctrl+Shift+P` or `Cmd+Shift+P`) to access the followin | Command | Title | Description | | :------------------------------- | :-------------------------------- | :------------------------------------------------------------------------------------------------------- | | `vscode-modernized.applyStyles` | VS Code Modernized: Apply Styles | Applies the custom styles to VS Code. | -| `vscode-modernized.removeStyles` | VS Code Modernized: Remove Styles | Removes the custom styles from VS Code, reverting to default. (Does not automatically revert the theme). | +| `vscode-modernized.removeStyles` | VS Code Modernized: Remove Styles | Removes the custom styles from VS Code, reverting to default. (Does not automatically revert the theme). | ### Reverting Changes @@ -101,6 +101,8 @@ This extension modifies VS Code's files (mainly `workbench.html`) to apply/injec ## Troubleshooting / FAQ +- **Q: How can I view the extension logs?** + - A: The extension exposes a logger in the output channel. Review and Share the output of the log file when reporting issues/asking for support. - **Q: VS Code says my installation is corrupt!** - A: This is expected. See the **Important Note** section above. You can safely ignore it. - **Q: Styles didn't apply after running the command.** @@ -120,6 +122,7 @@ Contributions, feedback, and bug reports are welcome! Please feel free to open a - Your Operating System. - Steps to reproduce the issue. - Relevant error messages or screenshots. + - The logfile of the extensions output channel. - For feature requests, describe the desired functionality and its use case. ### Development diff --git a/out/extension.js b/out/extension.js index 4df64c4..a65bbc6 100644 --- a/out/extension.js +++ b/out/extension.js @@ -32,13 +32,20 @@ var __importStar = (this && this.__importStar) || (function () { return result; }; })(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", { value: true }); exports.activate = activate; exports.deactivate = deactivate; const vscode = __importStar(require("vscode")); const sudo = __importStar(require("@vscode/sudo-prompt")); +const promises_1 = __importDefault(require("fs/promises")); /** Unique identifier for the extension. */ const EXTENSION_ID = 'vscode-modernized'; +/** VS Code Output Channel for logging extension messages. */ +const LOGGER = vscode.window.createOutputChannel(`${EXTENSION_ID}`, { log: true }); +LOGGER.info(`Logger Initialized @ ${LOGGER.logLevel} level...`); /** Start marker for injected content in workbench.html. */ const INJECTION_MARKER_START = ``; /** End marker for injected content in workbench.html. */ @@ -62,22 +69,40 @@ let extensionContext; */ async function findWorkbenchPath() { const vscodeRoot = vscode.Uri.file(vscode.env.appRoot); + // Editor root is typically located in the following directories: + // Windows: %AppData%/Local/Programs/{Editor Name}/resources/app/out/vs/code/... + // Linux: ... + // Mac: ... + LOGGER.debug(`Editor Root Directory Identified: ${vscodeRoot.fsPath}`); const possiblePaths = [ 'out/vs/code/electron-sandbox/workbench/workbench.html', 'out/vs/code/electron-sandbox/workbench/workbench.esm.html', // Another possible path + 'out/vs/code/electron-browser/workbench/workbench.html' // Possible Path for Vscode Insiders ]; for (const p of possiblePaths) { const uri = vscode.Uri.joinPath(vscodeRoot, p); try { await vscode.workspace.fs.stat(uri); // Check if the file exists - console.log(`Found workbench.html at: ${uri.fsPath}`); + LOGGER.info(`Found workbench.html at: ${uri.fsPath}`); return uri; } catch { // File not found at this path, continue searching + LOGGER.warn(`Could not find workbench.html at: ${uri.fsPath}`); } } - console.error('Could not find workbench.html path.'); + try { + const debugReport = await generateDebugReport(vscodeRoot, possiblePaths); + LOGGER.error(`Failed to locate workbench.html\n\nPlease include this information when reporting an issue:\n${debugReport}`); + } + catch (e) { + LOGGER.error(`Failed to locate workbench.html: +OS: ${process.platform} (${process.arch}) +Editor Version: ${vscode.version} +Root Path: ${vscodeRoot.fsPath} +Error: ${e?.message || e} +`); + } return undefined; } /** @@ -100,11 +125,11 @@ async function writeFileWithPermissions(targetUri, content) { try { // Attempt direct write first await vscode.workspace.fs.writeFile(targetUri, Buffer.from(content, 'utf8')); - console.log(`Successfully wrote to ${targetUri.fsPath}`); + LOGGER.info(`Successfully wrote to ${targetUri.fsPath}`); return true; } catch (error) { - console.warn(`Direct write failed (likely permissions): ${error.message}`); + LOGGER.warn(`Direct write failed (likely permissions): ${error.message}`); // Fallback to using sudo-prompt const tempDirUri = extensionContext.globalStorageUri; // Use extension's global storage for temp file await vscode.workspace.fs.createDirectory(tempDirUri); // Ensure temp directory exists @@ -112,17 +137,17 @@ async function writeFileWithPermissions(targetUri, content) { try { // Write content to a temporary file await vscode.workspace.fs.writeFile(tempFileUri, Buffer.from(content, 'utf8')); - console.log(`Wrote temporary file to ${tempFileUri.fsPath}`); + LOGGER.info(`Wrote temporary file to ${tempFileUri.fsPath}`); // Determine the correct move command based on the OS const moveCommand = process.platform === 'win32' ? 'move' : 'mv'; // Construct the command to move the temp file to the target location const command = `${moveCommand} "${tempFileUri.fsPath}" "${targetUri.fsPath}"`; - console.log(`Executing sudo command: ${command}`); + LOGGER.info(`Executing sudo command: ${command}`); // Execute the move command with elevated privileges using sudo-prompt return await new Promise((resolve) => { sudo.exec(command, { name: 'VS Code Modernized Extension' }, async (sudoError) => { if (sudoError) { - console.error(`Sudo command failed: ${sudoError}`); + LOGGER.error(`Sudo command failed: ${sudoError}`); // Attempt to clean up the temporary file even if sudo failed try { await vscode.workspace.fs.delete(tempFileUri); @@ -151,7 +176,7 @@ async function writeFileWithPermissions(targetUri, content) { }); } catch (tempWriteError) { - console.error(`Failed to write temporary file: ${tempWriteError.message}`); + LOGGER.error(`Failed to write temporary file: ${tempWriteError.message}`); vscode.window.showErrorMessage(`Failed to write temporary file: ${tempWriteError.message}`); return false; // Indicate failure } @@ -244,7 +269,7 @@ ${INJECTION_MARKER_END} // htmlContent = htmlContent.replace(//s, ''); // Inject the new content just before the closing tag htmlContent = htmlContent.replace(/\n*?<\/html>/, `\n${injectionContent}\n`); - // --- Theme Handling --- + // --- Theme Handling --- const config = vscode.workspace.getConfiguration(CONFIG_SECTION); const autoApplyTheme = config.get('autoApplyTheme', true); const currentTheme = vscode.workspace.getConfiguration('workbench').get('colorTheme'); @@ -358,6 +383,97 @@ async function removeStyles() { // Leave APPLIED_STATE_KEY as true as the removal likely failed before writing the file. } } +// -- Utility Functions -- +/** + * Aggregates Debug Information for the current environment. + * @param {vscode.Uri} vscodeRoot The root URI of the VS Code installation. + * @param {string[]} possiblePaths Array of possible paths where workbench.html might be located + * @returns {Promise} A formatted string containing device, filesystem, and installation details. + */ +async function generateDebugReport(vscodeRoot, possiblePaths) { + let fileStructure = []; + let readAccess = "Unknown"; + let writeAccess = "Unknown"; + // Check each directory level and aggregate contents + const outDir = vscode.Uri.joinPath(vscodeRoot, 'out'); + const vsDir = vscode.Uri.joinPath(outDir, 'vs'); + const codeDir = vscode.Uri.joinPath(vsDir, 'code'); + // -- Analysis of File System Permissions -- + try { + const stats = await promises_1.default.stat(vscodeRoot.fsPath); + const mode = stats.mode; + readAccess = !!(mode & 0o444) ? "True" : "False"; + writeAccess = !!(mode & 0o222) ? "True" : "False"; + } + catch (e) { + readAccess = "Unknown"; + writeAccess = "Unknown"; + } + // -- End Analysis of File System Permissions -- + // -- Validate Target Paths -- + // Identify target paths of the root directory & subdirectories + // Note: Can be helpful to easily identify missing directories, or unexpected workbench.html locations + try { + // Read '{AppRoot}/out/' directory + const outFiles = await vscode.workspace.fs.readDirectory(outDir); + let vsFound = false; + // Validate out/vs/ directory exists + vsFound = outFiles.some(([name]) => name === 'vs'); + if (!vsFound) { + // Report all contents of out/ if vs/ not found + fileStructure.push('out/', ...outFiles.map(([name, type]) => ` ${name}${type === vscode.FileType.Directory ? '/' : ''}`)); + } + else { + // Report `vs/` directory found + fileStructure.push('out/', ' vs/ directory present'); + try { + // Read 'out/vs/' directory + const vsFiles = await vscode.workspace.fs.readDirectory(vsDir); + let codeFound = false; + // Validate `vs/code/` directory exists + codeFound = vsFiles.some(([name]) => name === 'code'); + if (!codeFound) { + // Report all `vs/` contents if code/ not found + fileStructure.push('vs/', ...vsFiles.map(([name, type]) => ` ${name}${type === vscode.FileType.Directory ? '/' : ''}`)); + } + else { + fileStructure.push('vs/', ' code/ directory present'); + // Always report `vs/code`/ contents + // Note: We report all directories in the code/ dir in case the electron directory containing workbench.html is different + // example: vscode targets `code/electron-sandbox/` and Vscode Insiders target `code/electron-browser/` + try { + const codeFiles = await vscode.workspace.fs.readDirectory(codeDir); + fileStructure.push('code/', ...codeFiles.map(([name, type]) => ` ${name}${type === vscode.FileType.Directory ? '/' : ''}`)); + } + catch { } + } + } + catch { } + } + } + catch { } + // -- End Validation of target paths -- + // Construct the Complete Debug Report + return `SYSTEM INFORMATION + OS: ${process.platform} (${process.arch}) + Shell: ${process.env.SHELL || process.env.COMSPEC} + Editor Version: ${vscode.version} + Editor Name: ${vscode.env.appName} + Environment: ${vscode.env.appHost} + Remote: ${vscode.env.remoteName || 'none'} + +INSTALLATION DETAILS + Root Path: ${vscodeRoot.fsPath} + AppRoot Directory Permissions: + Read: ${readAccess} + Write: ${writeAccess} + + Searched Paths: +${possiblePaths.map(p => ` ${p}`).join('\n')} + +Root Directory Result +${fileStructure.map(line => ` ${line}`).join('\n')}`; +} /** * VS Code Extension activation function. * Called when the extension is first activated (e.g., on startup or command execution). @@ -384,7 +500,7 @@ async function activate(context) { console.log('No pending theme changes to apply on activation'); } // --- End Pending Theme Application --- - console.log(`Activating ${EXTENSION_ID}...`); + LOGGER.info(`Activating ${EXTENSION_ID}...`); extensionContext = context; // Store context for use in other functions // --- Find Workbench Path --- workbenchHtmlPath = await findWorkbenchPath(); @@ -393,6 +509,9 @@ async function activate(context) { // Continue activation, but commands will show error if path is missing } // --- End Find Workbench Path --- + // --- Register Output Channel --- + context.subscriptions.push(LOGGER); + // --- End Register Output Channel --- // --- Register Commands --- context.subscriptions.push(vscode.commands.registerCommand(`${CONFIG_SECTION}.applyStyles`, applyStyles), vscode.commands.registerCommand(`${CONFIG_SECTION}.removeStyles`, removeStyles)); // --- End Register Commands --- diff --git a/out/extension.js.map b/out/extension.js.map index a4d3f96..91f1d61 100644 --- a/out/extension.js.map +++ b/out/extension.js.map @@ -1 +1 @@ -{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 10a62b5..4857bea 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,8 +1,14 @@ import * as vscode from 'vscode'; import * as sudo from '@vscode/sudo-prompt'; +import fs from 'fs/promises'; /** Unique identifier for the extension. */ const EXTENSION_ID = 'vscode-modernized'; + +/** VS Code Output Channel for logging extension messages. */ +const LOGGER = vscode.window.createOutputChannel(`${EXTENSION_ID}`, { log: true }); +LOGGER.info(`Logger Initialized @ ${LOGGER.logLevel} level...`); + /** Start marker for injected content in workbench.html. */ const INJECTION_MARKER_START = ``; /** End marker for injected content in workbench.html. */ @@ -28,22 +34,40 @@ let extensionContext: vscode.ExtensionContext; */ async function findWorkbenchPath(): Promise { const vscodeRoot = vscode.Uri.file(vscode.env.appRoot); + // Editor root is typically located in the following directories: + // Windows: %AppData%/Local/Programs/{Editor Name}/resources/app/out/vs/code/... + // Linux: ... + // Mac: ... + LOGGER.debug(`Editor Root Directory Identified: ${vscodeRoot.fsPath}`); const possiblePaths = [ 'out/vs/code/electron-sandbox/workbench/workbench.html', 'out/vs/code/electron-sandbox/workbench/workbench.esm.html', // Another possible path + 'out/vs/code/electron-browser/workbench/workbench.html' // Possible Path for Vscode Insiders ]; for (const p of possiblePaths) { const uri = vscode.Uri.joinPath(vscodeRoot, p); try { await vscode.workspace.fs.stat(uri); // Check if the file exists - console.log(`Found workbench.html at: ${uri.fsPath}`); + LOGGER.info(`Found workbench.html at: ${uri.fsPath}`); return uri; } catch { // File not found at this path, continue searching + LOGGER.warn(`Could not find workbench.html at: ${uri.fsPath}`); } } - console.error('Could not find workbench.html path.'); + + try { + const debugReport = await generateDebugReport(vscodeRoot, possiblePaths); + LOGGER.error(`Failed to locate workbench.html\n\nPlease include this information when reporting an issue:\n${debugReport}`); + } catch (e: any) { + LOGGER.error(`Failed to locate workbench.html: +OS: ${process.platform} (${process.arch}) +Editor Version: ${vscode.version} +Root Path: ${vscodeRoot.fsPath} +Error: ${e?.message || e} +`); + } return undefined; } @@ -68,10 +92,10 @@ async function writeFileWithPermissions(targetUri: vscode.Uri, content: string): try { // Attempt direct write first await vscode.workspace.fs.writeFile(targetUri, Buffer.from(content, 'utf8')); - console.log(`Successfully wrote to ${targetUri.fsPath}`); + LOGGER.info(`Successfully wrote to ${targetUri.fsPath}`); return true; } catch (error: any) { - console.warn(`Direct write failed (likely permissions): ${error.message}`); + LOGGER.warn(`Direct write failed (likely permissions): ${error.message}`); // Fallback to using sudo-prompt const tempDirUri = extensionContext.globalStorageUri; // Use extension's global storage for temp file @@ -81,19 +105,19 @@ async function writeFileWithPermissions(targetUri: vscode.Uri, content: string): try { // Write content to a temporary file await vscode.workspace.fs.writeFile(tempFileUri, Buffer.from(content, 'utf8')); - console.log(`Wrote temporary file to ${tempFileUri.fsPath}`); + LOGGER.info(`Wrote temporary file to ${tempFileUri.fsPath}`); // Determine the correct move command based on the OS const moveCommand = process.platform === 'win32' ? 'move' : 'mv'; // Construct the command to move the temp file to the target location const command = `${moveCommand} "${tempFileUri.fsPath}" "${targetUri.fsPath}"`; - console.log(`Executing sudo command: ${command}`); + LOGGER.info(`Executing sudo command: ${command}`); // Execute the move command with elevated privileges using sudo-prompt return await new Promise((resolve) => { sudo.exec(command, { name: 'VS Code Modernized Extension' }, async (sudoError?: Error | string) => { if (sudoError) { - console.error(`Sudo command failed: ${sudoError}`); + LOGGER.error(`Sudo command failed: ${sudoError}`); // Attempt to clean up the temporary file even if sudo failed try { await vscode.workspace.fs.delete(tempFileUri); @@ -120,7 +144,7 @@ async function writeFileWithPermissions(targetUri: vscode.Uri, content: string): }); }); } catch (tempWriteError: any) { - console.error(`Failed to write temporary file: ${tempWriteError.message}`); + LOGGER.error(`Failed to write temporary file: ${tempWriteError.message}`); vscode.window.showErrorMessage(`Failed to write temporary file: ${tempWriteError.message}`); return false; // Indicate failure } @@ -228,7 +252,7 @@ ${INJECTION_MARKER_END} // Inject the new content just before the closing tag htmlContent = htmlContent.replace(/\n*?<\/html>/, `\n${injectionContent}\n`); - // --- Theme Handling --- + // --- Theme Handling --- const config = vscode.workspace.getConfiguration(CONFIG_SECTION); const autoApplyTheme = config.get('autoApplyTheme', true); const currentTheme = vscode.workspace.getConfiguration('workbench').get('colorTheme'); @@ -355,6 +379,109 @@ async function removeStyles() { } } +// -- Utility Functions -- + +/** + * Aggregates Debug Information for the current environment. + * @param {vscode.Uri} vscodeRoot The root URI of the VS Code installation. + * @param {string[]} possiblePaths Array of possible paths where workbench.html might be located + * @returns {Promise} A formatted string containing device, filesystem, and installation details. + */ +async function generateDebugReport(vscodeRoot: vscode.Uri, possiblePaths: string[]): Promise { + let fileStructure = []; + let readAccess = "Unknown"; + let writeAccess = "Unknown"; + + // Check each directory level and aggregate contents + const outDir = vscode.Uri.joinPath(vscodeRoot, 'out'); + const vsDir = vscode.Uri.joinPath(outDir, 'vs'); + const codeDir = vscode.Uri.joinPath(vsDir, 'code'); + + // -- Analysis of File System Permissions -- + try { + const stats = await fs.stat(vscodeRoot.fsPath); + const mode = stats.mode; + readAccess = !!(mode & 0o444) ? "True" : "False"; + writeAccess = !!(mode & 0o222) ? "True" : "False"; + } catch (e) { + readAccess = "Unknown"; + writeAccess = "Unknown"; + } + // -- End Analysis of File System Permissions -- + + // -- Validate Target Paths -- + // Identify target paths of the root directory & subdirectories + // Note: Can be helpful to easily identify missing directories, or unexpected workbench.html locations + try { + // Read '{AppRoot}/out/' directory + const outFiles = await vscode.workspace.fs.readDirectory(outDir); + let vsFound = false; + + // Validate out/vs/ directory exists + vsFound = outFiles.some(([name]) => name === 'vs'); + + if (!vsFound) { + // Report all contents of out/ if vs/ not found + fileStructure.push('out/', + ...outFiles.map(([name, type]) => + ` ${name}${type === vscode.FileType.Directory ? '/' : ''}`)); + } else { + // Report `vs/` directory found + fileStructure.push('out/', ' vs/ directory present'); + + try { + // Read 'out/vs/' directory + const vsFiles = await vscode.workspace.fs.readDirectory(vsDir); + let codeFound = false; + + // Validate `vs/code/` directory exists + codeFound = vsFiles.some(([name]) => name === 'code'); + + if (!codeFound) { + // Report all `vs/` contents if code/ not found + fileStructure.push('vs/', + ...vsFiles.map(([name, type]) => + ` ${name}${type === vscode.FileType.Directory ? '/' : ''}`)); + } else { + fileStructure.push('vs/', ' code/ directory present'); + + // Always report `vs/code`/ contents + // Note: We report all directories in the code/ dir in case the electron directory containing workbench.html is different + // example: vscode targets `code/electron-sandbox/` and Vscode Insiders target `code/electron-browser/` + try { + const codeFiles = await vscode.workspace.fs.readDirectory(codeDir); + fileStructure.push('code/', + ...codeFiles.map(([name, type]) => + ` ${name}${type === vscode.FileType.Directory ? '/' : ''}`)); + } catch { } + } + } catch { } + } + } catch { } + // -- End Validation of target paths -- + + // Construct the Complete Debug Report + return `SYSTEM INFORMATION + OS: ${process.platform} (${process.arch}) + Shell: ${process.env.SHELL || process.env.COMSPEC} + Editor Version: ${vscode.version} + Editor Name: ${vscode.env.appName} + Environment: ${vscode.env.appHost} + Remote: ${vscode.env.remoteName || 'none'} + +INSTALLATION DETAILS + Root Path: ${vscodeRoot.fsPath} + AppRoot Directory Permissions: + Read: ${readAccess} + Write: ${writeAccess} + + Searched Paths: +${possiblePaths.map(p => ` ${p}`).join('\n')} + +Root Directory Result +${fileStructure.map(line => ` ${line}`).join('\n')}`; +} + /** * VS Code Extension activation function. * Called when the extension is first activated (e.g., on startup or command execution). @@ -381,7 +508,7 @@ export async function activate(context: vscode.ExtensionContext) { } // --- End Pending Theme Application --- - console.log(`Activating ${EXTENSION_ID}...`); + LOGGER.info(`Activating ${EXTENSION_ID}...`); extensionContext = context; // Store context for use in other functions // --- Find Workbench Path --- @@ -394,6 +521,12 @@ export async function activate(context: vscode.ExtensionContext) { } // --- End Find Workbench Path --- + // --- Register Output Channel --- + context.subscriptions.push( + LOGGER + ); + // --- End Register Output Channel --- + // --- Register Commands --- context.subscriptions.push( vscode.commands.registerCommand(`${CONFIG_SECTION}.applyStyles`, applyStyles),