From 8932661dd9e8144632ed819378a78e69bb255a00 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 11 Jul 2024 13:48:11 -0400 Subject: [PATCH 1/3] fix: fixes workspace loading when vscode does not have a folder open --- vscode/microsoft-kiota/src/extension.ts | 4 +- .../src/workspaceTreeProvider.ts | 65 +++++++++---------- 2 files changed, 32 insertions(+), 37 deletions(-) diff --git a/vscode/microsoft-kiota/src/extension.ts b/vscode/microsoft-kiota/src/extension.ts index f9ce7debbc..7c9d628288 100644 --- a/vscode/microsoft-kiota/src/extension.ts +++ b/vscode/microsoft-kiota/src/extension.ts @@ -26,7 +26,7 @@ import { getLanguageInformation, getLanguageInformationForDescription } from "./ import { DependenciesViewProvider } from "./dependenciesViewProvider"; import { updateClients } from "./updateClients"; import { ExtensionSettings, getExtensionSettings } from "./extensionSettings"; -import { KiotaWorkspace } from "./workspaceTreeProvider"; +import { loadTreeView } from "./workspaceTreeProvider"; import { generatePlugin } from "./generatePlugin"; import { CodeLensProvider } from "./codelensProvider"; import { CLIENT, CLIENTS, KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE, PLUGIN, PLUGINS, dependenciesInfo, extensionId, statusBarCommandId, treeViewFocusCommand, treeViewId } from "./constants"; @@ -52,7 +52,7 @@ export async function activate( context.extensionUri ); const reporter = new TelemetryReporter(context.extension.packageJSON.telemetryInstrumentationKey); - new KiotaWorkspace(context); + await loadTreeView(context); let codeLensProvider = new CodeLensProvider(); context.subscriptions.push( vscode.window.registerUriHandler({ diff --git a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts index ab590f4535..d214e059e6 100644 --- a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts +++ b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts @@ -3,13 +3,13 @@ import * as path from 'path'; import * as fs from 'fs'; import { KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE } from './constants'; -const workspaceJsonPath = path.join(vscode.workspace.workspaceFolders?.map(folder => folder.uri.fsPath).join('') || '', KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE); +const workspaceJsonPath = path.join(vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0 ? + vscode.workspace.workspaceFolders[0].uri.fsPath : + '~/', + KIOTA_DIRECTORY, + KIOTA_WORKSPACE_FILE); export class WorkspaceTreeProvider implements vscode.TreeDataProvider { - - constructor(private context: vscode.ExtensionContext) { - void this.ensureKiotaDirectory(); - } async getChildren(element?: vscode.TreeItem): Promise { if (!element) { return [new vscode.TreeItem(KIOTA_WORKSPACE_FILE, vscode.TreeItemCollapsibleState.None)]; @@ -24,38 +24,33 @@ export class WorkspaceTreeProvider implements vscode.TreeDataProvider { - if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { - await vscode.window.showErrorMessage( - vscode.l10n.t("No workspace folder found, open a folder first") - ); - return; - } - const kiotaDir = path.dirname(workspaceJsonPath); - try { - await fs.promises.access(kiotaDir); - } catch (error) { - await vscode.window.showErrorMessage( - vscode.l10n.t("Kiota directory not found") - ); - } +async function openResource(resource: vscode.Uri): Promise { + try{ + await vscode.window.showTextDocument(resource); + } catch (error) { + await fs.promises.writeFile(workspaceJsonPath, Buffer.from('{}')); + await vscode.window.showTextDocument(resource); } } - -export class KiotaWorkspace { - constructor(context: vscode.ExtensionContext) { - const treeDataProvider = new WorkspaceTreeProvider(context); - context.subscriptions.push(vscode.window.createTreeView('kiota.workspace', { treeDataProvider })); - vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', async (resource) => await this.openResource(resource)); +async function ensureKiotaDirectory(): Promise { + if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { + return; } - private async openResource(resource: vscode.Uri): Promise { - try{ - await vscode.window.showTextDocument(resource); - } catch (error) { - await fs.promises.writeFile(workspaceJsonPath, Buffer.from('{}')); - await vscode.window.showTextDocument(resource); - } - + const kiotaDir = path.dirname(workspaceJsonPath); + try { + await fs.promises.access(kiotaDir); + } catch (error) { + await vscode.window.showErrorMessage( + vscode.l10n.t("Kiota directory not found") + ); } -} \ No newline at end of file +} + +export async function loadTreeView(context: vscode.ExtensionContext): Promise { + await ensureKiotaDirectory(); + const treeDataProvider = new WorkspaceTreeProvider(); + context.subscriptions.push(vscode.window.createTreeView('kiota.workspace', { treeDataProvider })); + context.subscriptions.push(vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', async (resource) => await openResource(resource))); +} From c47f6229d61351b2c91cda8ebdd8c9ef9a8fa366 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 11 Jul 2024 14:49:52 -0400 Subject: [PATCH 2/3] fix: additional workspace location fixes --- .../src/workspaceTreeProvider.ts | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts index d214e059e6..477184da91 100644 --- a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts +++ b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts @@ -3,13 +3,17 @@ import * as path from 'path'; import * as fs from 'fs'; import { KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE } from './constants'; -const workspaceJsonPath = path.join(vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0 ? +export function getWorkspaceJsonPath(): string { + return path.join(vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0 ? vscode.workspace.workspaceFolders[0].uri.fsPath : - '~/', + process.env.HOME ?? process.env.USERPROFILE ?? process.cwd(), KIOTA_DIRECTORY, KIOTA_WORKSPACE_FILE); +}; export class WorkspaceTreeProvider implements vscode.TreeDataProvider { + constructor(public isWSPresent: boolean) { + } async getChildren(element?: vscode.TreeItem): Promise { if (!element) { return [new vscode.TreeItem(KIOTA_WORKSPACE_FILE, vscode.TreeItemCollapsibleState.None)]; @@ -19,7 +23,7 @@ export class WorkspaceTreeProvider implements vscode.TreeDataProvider { + const workspaceJsonPath = getWorkspaceJsonPath(); try{ await vscode.window.showTextDocument(resource); } catch (error) { + const dirPath = path.dirname(workspaceJsonPath); + await fs.promises.mkdir(dirPath, { recursive: true }); await fs.promises.writeFile(workspaceJsonPath, Buffer.from('{}')); await vscode.window.showTextDocument(resource); } } -async function ensureKiotaDirectory(): Promise { - if (!vscode.workspace.workspaceFolders || vscode.workspace.workspaceFolders.length === 0) { - return; - } - const kiotaDir = path.dirname(workspaceJsonPath); +async function isKiotaWorkspaceFilePresent(): Promise { + const workspaceFileDir = path.resolve(getWorkspaceJsonPath()); try { - await fs.promises.access(kiotaDir); + await fs.promises.access(workspaceFileDir); } catch (error) { - await vscode.window.showErrorMessage( - vscode.l10n.t("Kiota directory not found") - ); + return false; } + return true; } export async function loadTreeView(context: vscode.ExtensionContext): Promise { - await ensureKiotaDirectory(); - const treeDataProvider = new WorkspaceTreeProvider(); + const treeDataProvider = new WorkspaceTreeProvider(await isKiotaWorkspaceFilePresent()); + vscode.workspace.onDidChangeWorkspaceFolders(async () => { + treeDataProvider.isWSPresent = await isKiotaWorkspaceFilePresent(); + }); context.subscriptions.push(vscode.window.createTreeView('kiota.workspace', { treeDataProvider })); - context.subscriptions.push(vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', async (resource) => await openResource(resource))); + context.subscriptions.push(vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', openResource)); } From f9cb934a3ebc201f1847b4ec81b357828072fbcf Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 11 Jul 2024 14:52:23 -0400 Subject: [PATCH 3/3] chore: code linting --- vscode/microsoft-kiota/src/workspaceTreeProvider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts index 477184da91..2b2238f32e 100644 --- a/vscode/microsoft-kiota/src/workspaceTreeProvider.ts +++ b/vscode/microsoft-kiota/src/workspaceTreeProvider.ts @@ -53,9 +53,9 @@ async function isKiotaWorkspaceFilePresent(): Promise { export async function loadTreeView(context: vscode.ExtensionContext): Promise { const treeDataProvider = new WorkspaceTreeProvider(await isKiotaWorkspaceFilePresent()); - vscode.workspace.onDidChangeWorkspaceFolders(async () => { + context.subscriptions.push(vscode.workspace.onDidChangeWorkspaceFolders(async () => { treeDataProvider.isWSPresent = await isKiotaWorkspaceFilePresent(); - }); + })); context.subscriptions.push(vscode.window.createTreeView('kiota.workspace', { treeDataProvider })); context.subscriptions.push(vscode.commands.registerCommand('kiota.workspace.openWorkspaceFile', openResource)); }