diff --git a/lite/assets/frontmatter-teal-128x128.png b/lite/assets/frontmatter-teal-128x128.png new file mode 100644 index 00000000..e7d58d57 Binary files /dev/null and b/lite/assets/frontmatter-teal-128x128.png differ diff --git a/lite/src/DashboardProvider.ts b/lite/src/DashboardProvider.ts index 090e9224..4a6c68c7 100644 --- a/lite/src/DashboardProvider.ts +++ b/lite/src/DashboardProvider.ts @@ -3,8 +3,14 @@ import * as vscode from 'vscode'; export class DashboardProvider implements vscode.WebviewViewProvider { public static readonly viewType = 'frontMatterLite.dashboard'; private _view?: vscode.WebviewView; + private _outputChannel: vscode.OutputChannel; - constructor(private readonly _extensionUri: vscode.Uri) {} + constructor( + private readonly _extensionUri: vscode.Uri, + outputChannel: vscode.OutputChannel + ) { + this._outputChannel = outputChannel; + } public resolveWebviewView( webviewView: vscode.WebviewView, @@ -38,9 +44,13 @@ export class DashboardProvider implements vscode.WebviewViewProvider { break; } case 'openFile': { - const uri = vscode.Uri.parse(data.uri); - const doc = await vscode.workspace.openTextDocument(uri); - await vscode.window.showTextDocument(doc); + try { + const uri = vscode.Uri.parse(data.uri); + const doc = await vscode.workspace.openTextDocument(uri); + await vscode.window.showTextDocument(doc); + } catch (error) { + vscode.window.showErrorMessage(`Failed to open file: ${error instanceof Error ? error.message : 'Unknown error'}`); + } break; } } @@ -68,6 +78,7 @@ export class DashboardProvider implements vscode.WebviewViewProvider { const folderUri = vscode.Uri.joinPath(workspaceFolders[0].uri, folder.path); const pattern = new vscode.RelativePattern(folderUri, '**/*.{md,mdx,markdown}'); + // Note: Limited to 100 files per folder to prevent performance issues in large repositories const files = await vscode.workspace.findFiles(pattern, '**/node_modules/**', 100); for (const file of files) { @@ -80,7 +91,8 @@ export class DashboardProvider implements vscode.WebviewViewProvider { }); } } catch (error) { - console.error(`Error scanning folder ${folder.path}:`, error); + const errorMsg = `Error scanning folder ${folder.path}: ${error instanceof Error ? error.message : 'Unknown error'}`; + this._outputChannel.appendLine(errorMsg); } } diff --git a/lite/src/extension.ts b/lite/src/extension.ts index 3121b952..94a6af0a 100644 --- a/lite/src/extension.ts +++ b/lite/src/extension.ts @@ -1,5 +1,6 @@ import * as vscode from 'vscode'; import { DashboardProvider } from './DashboardProvider'; +import { isVirtualWorkspace } from './utils'; /** * Lite version of Front Matter CMS for virtual workspaces @@ -14,7 +15,7 @@ export function activate(context: vscode.ExtensionContext) { outputChannel.appendLine('Front Matter Lite activated for virtual workspace'); // Register Dashboard Webview Provider - const dashboardProvider = new DashboardProvider(context.extensionUri); + const dashboardProvider = new DashboardProvider(context.extensionUri, outputChannel); context.subscriptions.push( vscode.window.registerWebviewViewProvider( DashboardProvider.viewType, @@ -157,7 +158,13 @@ export function activate(context: vscode.ExtensionContext) { await vscode.workspace.fs.stat(fileUri); vscode.window.showErrorMessage(`File "${fileName}.md" already exists`); return; - } catch { + } catch (error) { + // Only proceed if the error is FileNotFound + if (error instanceof vscode.FileSystemError && error.code !== 'FileNotFound') { + vscode.window.showErrorMessage(`Error checking file: ${error.message}`); + outputChannel.appendLine(`Error checking file: ${error}`); + return; + } // File doesn't exist, continue } @@ -192,24 +199,18 @@ Your content here... ); // Check if running in virtual workspace - if (vscode.workspace.workspaceFolders) { - const isVirtual = vscode.workspace.workspaceFolders.some( - folder => folder.uri.scheme !== 'file' - ); - - if (isVirtual) { - outputChannel.appendLine('Running in virtual workspace mode'); - vscode.window.showInformationMessage( - 'Front Matter Lite is running in virtual workspace mode. Some features may be limited.', - 'Learn More' - ).then(selection => { - if (selection === 'Learn More') { - vscode.env.openExternal( - vscode.Uri.parse('https://frontmatter.codes/docs/virtual-workspaces') - ); - } - }); - } + if (isVirtualWorkspace()) { + outputChannel.appendLine('Running in virtual workspace mode'); + vscode.window.showInformationMessage( + 'Front Matter Lite is running in virtual workspace mode. Some features may be limited.', + 'Learn More' + ).then(selection => { + if (selection === 'Learn More') { + vscode.env.openExternal( + vscode.Uri.parse('https://frontmatter.codes/docs/virtual-workspaces') + ); + } + }); } outputChannel.appendLine('Front Matter Lite: All commands registered'); diff --git a/lite/src/utils.ts b/lite/src/utils.ts new file mode 100644 index 00000000..fc857078 --- /dev/null +++ b/lite/src/utils.ts @@ -0,0 +1,15 @@ +import * as vscode from 'vscode'; + +/** + * Check if the current workspace is a virtual workspace + * Virtual workspaces use schemes other than 'file' (e.g., 'vscode-vfs', 'github') + */ +export function isVirtualWorkspace(): boolean { + if (!vscode.workspace.workspaceFolders) { + return false; + } + + return vscode.workspace.workspaceFolders.some( + folder => folder.uri.scheme !== 'file' + ); +}