diff --git a/assets/logo.png b/assets/logo.png deleted file mode 100644 index c6943f62..00000000 Binary files a/assets/logo.png and /dev/null differ diff --git a/extensions/vscode/api_history/history.json b/extensions/vscode/api_history/history.json deleted file mode 100644 index 46685e3f..00000000 --- a/extensions/vscode/api_history/history.json +++ /dev/null @@ -1,57 +0,0 @@ -[ - { - "method": "GET", - "name": "https://jsonplaceholder.typicode.com/posts", - "lastUsed": "2024-10-16T16:18:51.817Z" - }, - { - "method": "GET", - "name": "http://localhost:8000/github-webhook", - "lastUsed": "2024-10-16T12:08:14.848Z" - }, - { - "method": "PATCH", - "name": "http://localhost:8000/github-webhook", - "lastUsed": "2024-10-16T12:03:42.401Z" - }, - { - "method": "POST", - "name": "http://localhost:8000/github-webhook", - "lastUsed": "2024-10-16T12:01:18.314Z" - }, - { - "name": "GET https://jsonplaceholder.typicode.com/posts", - "method": "GET", - "url": "https://jsonplaceholder.typicode.com/posts", - "headers": {}, - "body": "" - }, - { - "name": "GET https://jsonplaceholder.typicode.com/posts", - "method": "GET", - "url": "https://jsonplaceholder.typicode.com/posts", - "headers": {}, - "body": "" - }, - { - "name": "GET https://jsonplaceholder.typicode.com/posts", - "method": "GET", - "url": "https://jsonplaceholder.typicode.com/posts", - "headers": {}, - "body": "" - }, - { - "name": "GET https://jsonplaceholder.typicode.com/posts", - "method": "GET", - "url": "https://jsonplaceholder.typicode.com/posts", - "headers": {}, - "body": "" - }, - { - "name": "GET https://jsonplaceholder.typicode.com/posts", - "method": "GET", - "url": "https://jsonplaceholder.typicode.com/posts", - "headers": {}, - "body": "" - } -] \ No newline at end of file diff --git a/extensions/vscode/api_history/history.msgpack b/extensions/vscode/api_history/history.msgpack deleted file mode 100644 index 51f044fb..00000000 --- a/extensions/vscode/api_history/history.msgpack +++ /dev/null @@ -1 +0,0 @@ -™ƒŚmethodŁGET¤nameŮ*https://jsonplaceholder.typicode.com/posts¨lastUsed¸2024-10-16T16:18:51.817ZƒŚmethodŁGET¤nameŮ$http://localhost:8000/github-webhook¨lastUsed¸2024-10-16T12:08:14.848ZƒŚmethodĽPATCH¤nameŮ$http://localhost:8000/github-webhook¨lastUsed¸2024-10-16T12:03:42.401ZƒŚmethod¤POST¤nameŮ$http://localhost:8000/github-webhook¨lastUsed¸2024-10-16T12:01:18.314Z…¤nameŮ.GET https://jsonplaceholder.typicode.com/postsŚmethodŁGETŁurlŮ*https://jsonplaceholder.typicode.com/posts§headers€¤body …¤nameŮ.GET https://jsonplaceholder.typicode.com/postsŚmethodŁGETŁurlŮ*https://jsonplaceholder.typicode.com/posts§headers€¤body …¤nameŮ.GET https://jsonplaceholder.typicode.com/postsŚmethodŁGETŁurlŮ*https://jsonplaceholder.typicode.com/posts§headers€¤body …¤nameŮ.GET https://jsonplaceholder.typicode.com/postsŚmethodŁGETŁurlŮ*https://jsonplaceholder.typicode.com/posts§headers€¤body …¤nameŮ.GET https://jsonplaceholder.typicode.com/postsŚmethodŁGETŁurlŮ*https://jsonplaceholder.typicode.com/posts§headers€¤body  \ No newline at end of file diff --git a/extensions/vscode/src/SidebarProvider.ts b/extensions/vscode/src/SidebarProvider.ts index b44db1cd..21050728 100644 --- a/extensions/vscode/src/SidebarProvider.ts +++ b/extensions/vscode/src/SidebarProvider.ts @@ -1,281 +1,591 @@ +// import * as vscode from 'vscode'; +// import { ApiRequestProvider } from './apiRequest/apiRequestProvider'; +// import { log } from './extension'; +// import { ApiEndpoint } from './types'; +// import { TestManagementProvider } from './testManagement/testManagementProvider'; + +// export class SidebarProvider implements vscode.WebviewViewProvider { +// _view?: vscode.WebviewView; +// _doc?: vscode.TextDocument; +// private apiRequestProvider: ApiRequestProvider; +// private apiHistory: ApiEndpoint[] = []; +// private showHistory: boolean = false; +// private context: vscode.ExtensionContext; +// private testManagementProvider: TestManagementProvider; + + +// constructor(private readonly _extensionUri: vscode.Uri, context: vscode.ExtensionContext) { +// this.apiRequestProvider = new ApiRequestProvider(context); +// this.context = context; +// this.loadApiHistory(); +// this.testManagementProvider = new TestManagementProvider(context); + + + +// // Register command to update API history +// context.subscriptions.push( +// vscode.commands.registerCommand('vscode-api-client.updateApiHistory', (endpoint: ApiEndpoint) => { +// this.updateApiHistory(endpoint); +// }) +// ); +// } +// private loadApiHistory() { +// try { +// const history = this.context.globalState.get('apiHistory', []); +// this.apiHistory = history; +// } catch (error) { +// console.error('Error loading API history:', error); +// this.apiHistory = []; +// } +// } + +// private saveApiHistory() { +// try { +// this.context.globalState.update('apiHistory', this.apiHistory); +// } catch (error) { +// console.error('Error saving API history:', error); +// vscode.window.showErrorMessage('Failed to save API history. Please try again.'); +// } +// } + +// public refresh() { +// if (this._view) { +// console.log('Refreshing webview content'); +// this._view.webview.html = this._getHtmlForWebview(this._view.webview); +// } +// } + +// public resolveWebviewView(webviewView: vscode.WebviewView) { +// this._view = webviewView; +// webviewView.webview.options = { +// enableScripts: true, +// localResourceRoots: [this._extensionUri], +// }; + +// webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); + +// webviewView.webview.onDidReceiveMessage(async (data) => { +// log("Received message on sidebar"); +// switch (data.type) { +// case "onInfo": { +// if (!data.value) { +// return; +// } +// vscode.window.showInformationMessage(data.value); +// break; +// } +// case "onError": { +// if (!data.value) { +// return; +// } +// vscode.window.showErrorMessage(data.value); +// break; +// } +// case "openApiManagement": { +// if (!data.value) { +// return; +// } +// this.openWebview(data.value); +// break; +// } +// case "backButton": { +// this.showHistory = false; +// this.refresh(); +// break; +// } +// case "newRequest": { +// this.openApiRequestView(); +// break; +// } +// case "deleteEndpoint": { +// this.deleteEndpoint(data.name, data.method); +// break; +// } +// } +// }); +// } + +// public revive(panel: vscode.WebviewView) { +// this._view = panel; +// } + +// private _getHtmlForWebview(webview: vscode.Webview) { +// log("HTML Web View Loaded"); + +// const scriptUri = webview.asWebviewUri( +// vscode.Uri.joinPath(this._extensionUri, "out", "sidebar.js") +// ); + +// const styleSidebarUri = webview.asWebviewUri( +// vscode.Uri.joinPath(this._extensionUri, "media", "sidebar.css") +// ); + + +// const nonce = getNonce(); + +// const csp = ` +// default-src 'none'; +// script-src ${webview.cspSource} 'nonce-${nonce}'; +// style-src ${webview.cspSource} 'unsafe-inline'; +// img-src ${webview.cspSource} https:; +// font-src ${webview.cspSource}; +// `; + +// return ` +// +// +// +// +// +// +// +// +// ${this.showHistory +// ? `${this.getHistoryHtml()}` +// : `
+// +// +// +// +// +//
` +// } +// +// +// `; +// } + +// private getHistoryHtml() { +// return ` +// +// `; +// } + +// private async openWebview(webviewType: string) { +// if (webviewType === 'apiManagement') { +// if (this.apiRequestProvider) { +// console.log("Opening API Request View"); +// this.apiRequestProvider.openApiRequestView(); +// this.showHistory = true; +// this.refresh(); +// } else { +// console.error("apiRequestProvider is not initialized"); +// vscode.window.showErrorMessage("API Management is not available"); +// } +// } else if (webviewType === 'testManagement') { +// if (this.testManagementProvider) { +// console.log("Opening Test Management View"); +// await this.testManagementProvider.openTestManagementView(); +// } else { +// console.error("testManagementProvider is not initialized"); +// vscode.window.showErrorMessage("Test Management is not available"); +// } +// } else { +// const panel = vscode.window.createWebviewPanel( +// webviewType, +// this.getWebviewTitle(webviewType), +// vscode.ViewColumn.One, +// { +// enableScripts: true, +// localResourceRoots: [this._extensionUri], +// } +// ); + +// panel.webview.html = await this.getWebviewContent(webviewType); +// } +// } + +// private openApiRequestView() { +// if (this.apiRequestProvider) { +// console.log("Opening API Request View"); +// this.apiRequestProvider.openApiRequestView(); +// } else { +// console.error("apiRequestProvider is not initialized"); +// vscode.window.showErrorMessage("API Request is not available"); +// } +// } + +// private getWebviewTitle(webviewType: string): string { +// switch (webviewType) { +// case 'apiManagement': +// return 'API Management'; +// case 'apiRequest': +// return 'API Request'; +// case 'chatRepo': +// return 'Chat Repo'; +// case 'documentation': +// return 'Documentation'; +// case 'codeReview': +// return 'Code Review'; +// case 'testManagement': +// return 'Test Case'; +// default: +// return 'Webview'; +// } +// } + +// private async getWebviewContent(webviewType: string): Promise { +// const filePath = vscode.Uri.joinPath(this._extensionUri, webviewType, 'index.html'); +// const fileContent = await vscode.workspace.fs.readFile(filePath); +// return fileContent.toString(); +// } +// private updateApiHistory(endpoint: ApiEndpoint) { +// const existingIndex = this.apiHistory.findIndex( +// e => e.name === endpoint.name && e.method === endpoint.method +// ); + +// if (existingIndex !== -1) { +// this.apiHistory[existingIndex].lastUsed = endpoint.lastUsed; +// const [updatedEndpoint] = this.apiHistory.splice(existingIndex, 1); +// this.apiHistory.unshift(updatedEndpoint); +// } else { +// this.apiHistory.unshift(endpoint); +// this.apiHistory = this.apiHistory.slice(0, 10); +// } + +// this.saveApiHistory(); +// this.refresh(); +// } + +// private deleteEndpoint(name: string, method: string) { +// this.apiHistory = this.apiHistory.filter( +// endpoint => !(endpoint.name === name && endpoint.method === method) +// ); +// this.saveApiHistory(); +// this.refresh(); +// } +// } +// function getNonce() { +// let text = ''; +// const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; +// for (let i = 0; i < 32; i++) { +// text += possible.charAt(Math.floor(Math.random() * possible.length)); +// } +// return text; +// } import * as vscode from 'vscode'; import { ApiRequestProvider } from './apiRequest/apiRequestProvider'; import { log } from './extension'; import { ApiEndpoint } from './types'; import { TestManagementProvider } from './testManagement/testManagementProvider'; +import { ChatRepoProvider } from './chatRepo/chatRepoProvider'; // Import ChatRepoProvider +import { DocManagementProvider } from './docManagement/docManagementProvider'; // Import DocManagementProvider export class SidebarProvider implements vscode.WebviewViewProvider { - _view?: vscode.WebviewView; - _doc?: vscode.TextDocument; - private apiRequestProvider: ApiRequestProvider; - private apiHistory: ApiEndpoint[] = []; - private showHistory: boolean = false; - private context: vscode.ExtensionContext; - private testManagementProvider: TestManagementProvider; + _view?: vscode.WebviewView; + _doc?: vscode.TextDocument; + private apiRequestProvider: ApiRequestProvider; + private apiHistory: ApiEndpoint[] = []; + private showHistory: boolean = false; + private context: vscode.ExtensionContext; + private testManagementProvider: TestManagementProvider; + private chatRepoProvider: ChatRepoProvider; // Declare ChatRepoProvider + private docManagementProvider: DocManagementProvider; // Declare DocManagementProvider + constructor(private readonly _extensionUri: vscode.Uri, context: vscode.ExtensionContext) { + this.apiRequestProvider = new ApiRequestProvider(context); + this.context = context; + this.loadApiHistory(); + this.testManagementProvider = new TestManagementProvider(context); + this.chatRepoProvider = new ChatRepoProvider(context); // Initialize ChatRepoProvider + this.docManagementProvider = new DocManagementProvider(context); // Initialize DocManagementProvider - constructor(private readonly _extensionUri: vscode.Uri, context: vscode.ExtensionContext) { - this.apiRequestProvider = new ApiRequestProvider(context); - this.context = context; - this.loadApiHistory(); - this.testManagementProvider = new TestManagementProvider(context); + // Register command to update API history + context.subscriptions.push( + vscode.commands.registerCommand('vscode-api-client.updateApiHistory', (endpoint: ApiEndpoint) => { + this.updateApiHistory(endpoint); + }) + ); + } + private loadApiHistory() { + try { + const history = this.context.globalState.get('apiHistory', []); + this.apiHistory = history; + } catch (error) { + console.error('Error loading API history:', error); + this.apiHistory = []; + } + } + private saveApiHistory() { + try { + this.context.globalState.update('apiHistory', this.apiHistory); + } catch (error) { + console.error('Error saving API history:', error); + vscode.window.showErrorMessage('Failed to save API history. Please try again.'); + } + } - // Register command to update API history - context.subscriptions.push( - vscode.commands.registerCommand('vscode-api-client.updateApiHistory', (endpoint: ApiEndpoint) => { - this.updateApiHistory(endpoint); - }) - ); - } - private loadApiHistory() { - try { - const history = this.context.globalState.get('apiHistory', []); - this.apiHistory = history; - } catch (error) { - console.error('Error loading API history:', error); - this.apiHistory = []; + public refresh() { + if (this._view) { + console.log('Refreshing webview content'); + this._view.webview.html = this._getHtmlForWebview(this._view.webview); + } } - } - private saveApiHistory() { - try { - this.context.globalState.update('apiHistory', this.apiHistory); - } catch (error) { - console.error('Error saving API history:', error); - vscode.window.showErrorMessage('Failed to save API history. Please try again.'); + public resolveWebviewView(webviewView: vscode.WebviewView) { + this._view = webviewView; + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [this._extensionUri], + }; + + webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); + + webviewView.webview.onDidReceiveMessage(async (data) => { + log("Received message on sidebar"); + switch (data.type) { + case "onInfo": { + if (!data.value) { + return; + } + vscode.window.showInformationMessage(data.value); + break; + } + case "onError": { + if (!data.value) { + return; + } + vscode.window.showErrorMessage(data.value); + break; + } + case "openApiManagement": { + if (!data.value) { + return; + } + this.openWebview(data.value); + break; + } + case "backButton": { + this.showHistory = false; + this.refresh(); + break; + } + case "newRequest": { + this.openApiRequestView(); + break; + } + case "deleteEndpoint": { + this.deleteEndpoint(data.name, data.method); + break; + } + case "openChatRepo": { // Handle opening the chat repo view + this.chatRepoProvider.openChatRepoView(); + break; + } + case "openDocManagement": { // Handle opening the doc management view + this.docManagementProvider.openDocManagementView(); + break; + } + } + }); } - } - public refresh() { - if (this._view) { - console.log('Refreshing webview content'); - this._view.webview.html = this._getHtmlForWebview(this._view.webview); + public revive(panel: vscode.WebviewView) { + this._view = panel; } - } - public resolveWebviewView(webviewView: vscode.WebviewView) { - this._view = webviewView; - webviewView.webview.options = { - enableScripts: true, - localResourceRoots: [this._extensionUri], - }; - - webviewView.webview.html = this._getHtmlForWebview(webviewView.webview); - - webviewView.webview.onDidReceiveMessage(async (data) => { - log("Received message on sidebar"); - switch (data.type) { - case "onInfo": { - if (!data.value) { - return; - } - vscode.window.showInformationMessage(data.value); - break; - } - case "onError": { - if (!data.value) { - return; - } - vscode.window.showErrorMessage(data.value); - break; - } - case "openApiManagement": { - if (!data.value) { - return; - } - this.openWebview(data.value); - break; - } - case "backButton": { - this.showHistory = false; - this.refresh(); - break; - } - case "newRequest": { - this.openApiRequestView(); - break; - } - case "deleteEndpoint": { - this.deleteEndpoint(data.name, data.method); - break; - } - } - }); - } + private _getHtmlForWebview(webview: vscode.Webview) { + log("HTML Web View Loaded"); - public revive(panel: vscode.WebviewView) { - this._view = panel; - } + const scriptUri = webview.asWebviewUri( + vscode.Uri.joinPath(this._extensionUri, "out", "sidebar.js") + ); - private _getHtmlForWebview(webview: vscode.Webview) { - log("HTML Web View Loaded"); - - const scriptUri = webview.asWebviewUri( - vscode.Uri.joinPath(this._extensionUri, "out", "sidebar.js") - ); - - const styleSidebarUri = webview.asWebviewUri( - vscode.Uri.joinPath(this._extensionUri, "media", "sidebar.css") - ); - - - const nonce = getNonce(); - - const csp = ` - default-src 'none'; - script-src ${webview.cspSource} 'nonce-${nonce}'; - style-src ${webview.cspSource} 'unsafe-inline'; - img-src ${webview.cspSource} https:; - font-src ${webview.cspSource}; - `; - - return ` - - - - - - - - - ${this.showHistory - ? `${this.getHistoryHtml()}` - : `
- - - - - -
` - } - - - `; - } + const styleSidebarUri = webview.asWebviewUri( + vscode.Uri.joinPath(this._extensionUri, "media", "sidebar.css") + ); + + const nonce = getNonce(); - private getHistoryHtml() { - return ` + const csp = ` + default-src 'none'; + script-src ${webview.cspSource} 'nonce-${nonce}'; + style-src ${webview.cspSource} 'unsafe-inline'; + img-src ${webview.cspSource} https:; + font-src ${webview.cspSource}; + `; + + return ` + + + + + + + + + ${this.showHistory + ? `${this.getHistoryHtml()}` + : `
+ + + + + + +
` + } + + + `; + } + + private getHistoryHtml() { + return ` - `; +
+

API History

+ +
+ +
    + ${this.apiHistory.map(endpoint => ` +
  • + ${endpoint.method} + ${endpoint.name} + ${new Date(endpoint.lastUsed).toLocaleString()} + +
  • + `).join('')} +
+ `; } private async openWebview(webviewType: string) { - if (webviewType === 'apiManagement') { - if (this.apiRequestProvider) { - console.log("Opening API Request View"); - this.apiRequestProvider.openApiRequestView(); - this.showHistory = true; - this.refresh(); - } else { - console.error("apiRequestProvider is not initialized"); - vscode.window.showErrorMessage("API Management is not available"); - } - } else if (webviewType === 'testManagement') { - if (this.testManagementProvider) { - console.log("Opening Test Management View"); - await this.testManagementProvider.openTestManagementView(); + if (webviewType === 'apiManagement') { + if (this.apiRequestProvider) { + console.log("Opening API Request View"); + this.apiRequestProvider.openApiRequestView(); + this.showHistory = true; + this.refresh(); + } else { + console.error("apiRequestProvider is not initialized"); + vscode.window.showErrorMessage("API Management is not available"); + } + } else if (webviewType === 'testManagement') { + if (this.testManagementProvider) { + console.log("Opening Test Management View"); + await this.testManagementProvider.openTestManagementView(); + } else { + console.error("testManagementProvider is not initialized"); + vscode.window.showErrorMessage("Test Management is not available"); + } + } else if (webviewType === 'chatRepo') { // Handle opening chat repo view + if (this.chatRepoProvider) { + console.log("Opening Chat Repo View"); + await this.chatRepoProvider.openChatRepoView(); + } else { + console.error("chatRepoProvider is not initialized"); + vscode.window.showErrorMessage("Chat Repo is not available"); + } + } else if (webviewType === 'documentation') { // Handle opening doc management view + if (this.docManagementProvider) { + console.log("Opening Documentation Management View"); + await this.docManagementProvider.openDocManagementView(); + } else { + console.error("docManagementProvider is not initialized"); + vscode.window.showErrorMessage("Documentation Management is not available"); + } } else { - console.error("testManagementProvider is not initialized"); - vscode.window.showErrorMessage("Test Management is not available"); - } - } else { - const panel = vscode.window.createWebviewPanel( - webviewType, - this.getWebviewTitle(webviewType), - vscode.ViewColumn.One, - { - enableScripts: true, - localResourceRoots: [this._extensionUri], - } - ); + const panel = vscode.window.createWebviewPanel( + webviewType, + this.getWebviewTitle(webviewType), + vscode.ViewColumn.One, + { + enableScripts: true, + localResourceRoots: [this._extensionUri], + } + ); - panel.webview.html = await this.getWebviewContent(webviewType); - } + panel.webview.html = await this.getWebviewContent(webviewType); + } } private openApiRequestView() { - if (this.apiRequestProvider) { - console.log("Opening API Request View"); - this.apiRequestProvider.openApiRequestView(); - } else { - console.error("apiRequestProvider is not initialized"); - vscode.window.showErrorMessage("API Request is not available"); - } + if (this.apiRequestProvider) { + console.log("Opening API Request View"); + this.apiRequestProvider.openApiRequestView(); + } else { + console.error("apiRequestProvider is not initialized"); + vscode.window.showErrorMessage("API Request is not available"); + } } private getWebviewTitle(webviewType: string): string { - switch (webviewType) { - case 'apiManagement': - return 'API Management'; - case 'apiRequest': - return 'API Request'; - case 'chatRepo': - return 'Chat Repo'; - case 'documentation': - return 'Documentation'; - case 'codeReview': - return 'Code Review'; - case 'testManagement': - return 'Test Case'; - default: - return 'Webview'; - } + switch (webviewType) { + case 'apiManagement': + return 'API Management'; + case 'apiRequest': + return 'API Request'; + case 'chatRepo': + return 'Chat Repo'; + case 'documentation': + return 'Documentation'; + case 'codeReview': + return 'Code Review'; + case 'testManagement': + return 'Test Case'; + default: + return 'Webview'; + } } private async getWebviewContent(webviewType: string): Promise { - const filePath = vscode.Uri.joinPath(this._extensionUri, webviewType, 'index.html'); - const fileContent = await vscode.workspace.fs.readFile(filePath); - return fileContent.toString(); + const filePath = vscode.Uri.joinPath(this._extensionUri, webviewType, 'index.html'); + const fileContent = await vscode.workspace.fs.readFile(filePath); + return fileContent.toString(); } + private updateApiHistory(endpoint: ApiEndpoint) { - const existingIndex = this.apiHistory.findIndex( - e => e.name === endpoint.name && e.method === endpoint.method - ); - - if (existingIndex !== -1) { - this.apiHistory[existingIndex].lastUsed = endpoint.lastUsed; - const [updatedEndpoint] = this.apiHistory.splice(existingIndex, 1); - this.apiHistory.unshift(updatedEndpoint); - } else { - this.apiHistory.unshift(endpoint); - this.apiHistory = this.apiHistory.slice(0, 10); - } + const existingIndex = this.apiHistory.findIndex( + e => e.name === endpoint.name && e.method === endpoint.method + ); + + if (existingIndex !== -1) { + this.apiHistory[existingIndex].lastUsed = endpoint.lastUsed; + const [updatedEndpoint] = this.apiHistory.splice(existingIndex, 1); + this.apiHistory.unshift(updatedEndpoint); + } else { + this.apiHistory.unshift(endpoint); + this.apiHistory = this.apiHistory.slice(0, 10); + } - this.saveApiHistory(); - this.refresh(); + this.saveApiHistory(); + this.refresh(); } private deleteEndpoint(name: string, method: string) { - this.apiHistory = this.apiHistory.filter( - endpoint => !(endpoint.name === name && endpoint.method === method) - ); - this.saveApiHistory(); - this.refresh(); + this.apiHistory = this.apiHistory.filter( + endpoint => !(endpoint.name === name && endpoint.method === method) + ); + this.saveApiHistory(); + this.refresh(); } } + function getNonce() { - let text = ''; - const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - for (let i = 0; i < 32; i++) { - text += possible.charAt(Math.floor(Math.random() * possible.length)); - } - return text; + let text = ''; + const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + for (let i = 0; i < 32; i++) { + text += possible.charAt(Math.floor(Math.random() * possible.length)); + } + return text; } \ No newline at end of file diff --git a/extensions/vscode/src/apiManagement/apiManagementProvider.ts b/extensions/vscode/src/apiManagement/apiManagementProvider.ts new file mode 100644 index 00000000..3ba07190 --- /dev/null +++ b/extensions/vscode/src/apiManagement/apiManagementProvider.ts @@ -0,0 +1,34 @@ +import * as vscode from 'vscode'; +import { ApiManagementView } from './apiManagementView'; +import { ApiEndpoint } from '../types'; + +export class ApiManagementProvider { + private context: vscode.ExtensionContext; + private view: ApiManagementView | undefined; + + constructor(context: vscode.ExtensionContext) { + this.context = context; + } + + public openApiManagementView() { + if (!this.view) { + this.view = new ApiManagementView(this.context, this.handleApiManagementAction.bind(this)); + } + this.view.show(); + } + + private async handleApiManagementAction(action: string, endpoint?: ApiEndpoint) { + switch (action) { + case 'addApi': + if (endpoint) { + // Handle the addition of the API (for now, just log it) + console.log(`API Added: ${endpoint.method} - ${endpoint.name}`); + vscode.window.showInformationMessage(`Added API: ${endpoint.method} - ${endpoint.name}`); + } + break; + // You can add more actions here in the future + default: + console.error(`Unknown action: ${action}`); + } + } +} \ No newline at end of file diff --git a/extensions/vscode/src/apiManagement/apiManagementView.ts b/extensions/vscode/src/apiManagement/apiManagementView.ts new file mode 100644 index 00000000..2b9bb794 --- /dev/null +++ b/extensions/vscode/src/apiManagement/apiManagementView.ts @@ -0,0 +1,96 @@ +import * as vscode from 'vscode'; +import { ApiEndpoint } from '../types'; + +type ApiManagementCallback = ( + action: string, + endpoint?: ApiEndpoint // Made optional for addApi action +) => Promise; + +export class ApiManagementView { + private panel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private apiManagementCallback: ApiManagementCallback; + + constructor(context: vscode.ExtensionContext, apiManagementCallback: ApiManagementCallback) { + this.context = context; + this.apiManagementCallback = apiManagementCallback; + } + + public show() { + if (this.panel) { + this.panel.reveal(); + } else { + this.panel = vscode.window.createWebviewPanel( + 'apiManagement', + 'API Management', + vscode.ViewColumn.One, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + + // Load the webview content asynchronously + this.getWebviewContent().then(html => { + this.panel!.webview.html = html; // Use non-null assertion since we just created the panel + }).catch(error => { + console.error("Failed to load webview content:", error); + this.panel!.webview.html = "

Error loading content

"; // Fallback content + }); + + this.panel.webview.onDidReceiveMessage( + message => { + switch (message.command) { + case 'addApi': + this.promptForApiDetails(); + return; + case 'performAction': + this.apiManagementCallback( + message.action, + message.endpoint + ).catch(err => console.error("Error in API management callback:", err)); + return; + } + }, + undefined, + this.context.subscriptions + ); + + this.panel.onDidDispose(() => { + this.panel = undefined; + }); + } + } + + public postMessage(message: any) { + this.panel?.webview.postMessage(message); + } + + private async getWebviewContent(): Promise { + const htmlPath = vscode.Uri.joinPath(this.context.extensionUri, 'webview', 'apiManagement', 'index.html'); + console.log("Loading HTML from:", htmlPath.toString()); + + try { + // Read the HTML file + const htmlContentBuffer = await vscode.workspace.fs.readFile(htmlPath); + + // Convert the buffer to a string using TextDecoder for proper encoding + return new TextDecoder('utf-8').decode(htmlContentBuffer); + } catch (error) { + console.error("Error loading HTML:", error); + throw error; // Re-throw the error to handle it in show() + } + } + + private async promptForApiDetails() { + const method = await vscode.window.showInputBox({ prompt: "Enter API Method (GET, POST, etc.)" }); + const url = await vscode.window.showInputBox({ prompt: "Enter API URL" }); + + if (method && url) { + const endpoint: ApiEndpoint = { method, name: url, lastUsed: new Date().toISOString() }; + this.apiManagementCallback('addApi', endpoint).catch(err => console.error("Error adding API:", err)); + } else { + vscode.window.showErrorMessage("API Method and URL are required."); + } + } +} \ No newline at end of file diff --git a/extensions/vscode/src/chatRepo/chatRepoProvider.ts b/extensions/vscode/src/chatRepo/chatRepoProvider.ts new file mode 100644 index 00000000..08595060 --- /dev/null +++ b/extensions/vscode/src/chatRepo/chatRepoProvider.ts @@ -0,0 +1,38 @@ +import * as vscode from 'vscode'; +import { ChatRepoView } from './chatRepoView'; + +export class ChatRepoProvider { + private context: vscode.ExtensionContext; + private view: ChatRepoView | undefined; + + constructor(context: vscode.ExtensionContext) { + this.context = context; + } + + public openChatRepoView() { + if (!this.view) { + this.view = new ChatRepoView(this.context, this.handleChatMessage.bind(this)); + } + this.view.show(); + } + + private async handleChatMessage(message: string) { + // Here you can implement logic to interact with GitHub API or any other backend service + console.log(`User message: ${message}`); + + // Simulate a response (you can replace this with actual API calls) + const response = await this.getResponseFromRepo(message); + + // Post response back to the webview + this.view?.postMessage({ command: 'receiveChatResponse', response }); + } + + private async getResponseFromRepo(message: string): Promise { + // Simulate a delay for an API call + await new Promise(resolve => setTimeout(resolve, 1000)); + + // Here you would typically make a call to GitHub's API or any other service. + // For demonstration, we return a static response. + return `Response from repo for your message: "${message}"`; + } +} \ No newline at end of file diff --git a/extensions/vscode/src/chatRepo/chatRepoView.ts b/extensions/vscode/src/chatRepo/chatRepoView.ts new file mode 100644 index 00000000..276c2995 --- /dev/null +++ b/extensions/vscode/src/chatRepo/chatRepoView.ts @@ -0,0 +1,74 @@ +import * as vscode from 'vscode'; + +type ChatRepoCallback = (message: string) => Promise; + +export class ChatRepoView { + private panel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private chatRepoCallback: ChatRepoCallback; + + constructor(context: vscode.ExtensionContext, chatRepoCallback: ChatRepoCallback) { + this.context = context; + this.chatRepoCallback = chatRepoCallback; + } + + public show() { + if (this.panel) { + this.panel.reveal(); + } else { + this.panel = vscode.window.createWebviewPanel( + 'chatRepo', + 'Chat with Repo', + vscode.ViewColumn.One, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + + // Load the webview content asynchronously + this.getWebviewContent().then(html => { + this.panel!.webview.html = html; // Use non-null assertion since we just created the panel + }).catch(error => { + console.error("Failed to load webview content:", error); + this.panel!.webview.html = "

Error loading content

"; // Fallback content + }); + + this.panel.webview.onDidReceiveMessage( + message => { + switch (message.command) { + case 'sendChatMessage': + this.chatRepoCallback(message.message).catch(err => console.error("Error in chat repo callback:", err)); + return; + } + }, + undefined, + this.context.subscriptions + ); + + this.panel.onDidDispose(() => { + this.panel = undefined; + }); + } + } + + public postMessage(message: any) { + this.panel?.webview.postMessage(message); + } + + private async getWebviewContent(): Promise { + const htmlPath = vscode.Uri.joinPath(this.context.extensionUri, 'webview', 'chatRepo', 'index.html'); + console.log("Loading HTML from:", htmlPath.toString()); + + try { + // Read the HTML file + const htmlContentBuffer = await vscode.workspace.fs.readFile(htmlPath); + + // Convert the buffer to a string using TextDecoder for proper encoding + return new TextDecoder('utf-8').decode(htmlContentBuffer); + } catch (error) { + console.error("Error loading HTML:", error); + throw error; // Re-throw the error to handle it in show() + } + } +} \ No newline at end of file diff --git a/extensions/vscode/src/docManagement/docManagementProvider.ts b/extensions/vscode/src/docManagement/docManagementProvider.ts new file mode 100644 index 00000000..d8676158 --- /dev/null +++ b/extensions/vscode/src/docManagement/docManagementProvider.ts @@ -0,0 +1,52 @@ +import * as vscode from 'vscode'; +import { DocManagementView } from './docManagementView'; + +export class DocManagementProvider { + private context: vscode.ExtensionContext; + private view: DocManagementView | undefined; + + constructor(context: vscode.ExtensionContext) { + this.context = context; + } + + public openDocManagementView() { + if (!this.view) { + this.view = new DocManagementView(this.context, this.handleDocAction.bind(this)); + } + this.view.show(); + } + + private async handleDocAction(command: string, docName?: string, content?: string) { + try { + switch (command) { + case 'loadDoc': + if (docName) { + const docContent = await this.loadDocument(docName); // Load document content + this.view?.postMessage({ command: 'displayDoc', content: docContent }); + } + break; + case 'saveDoc': + if (docName && content) { + await this.saveDocument(docName, content); // Save document content + vscode.window.showInformationMessage(`Document "${docName}" saved successfully.`); + } + break; + default: + vscode.window.showErrorMessage(`Unknown command: ${command}`); + } + } catch (error) { + vscode.window.showErrorMessage(`Error handling document action: ${error.message}`); + } + } + + private async loadDocument(docName: string): Promise { + // Simulate loading a document (replace with actual logic) + return `Content of ${docName}`; // Placeholder content + } + + private async saveDocument(docName: string, content: string): Promise { + // Simulate saving a document (replace with actual logic) + console.log(`Saving Document "${docName}": ${content}`); + // Here you would typically save to a file or database. + } +} \ No newline at end of file diff --git a/extensions/vscode/src/docManagement/docManagementView.ts b/extensions/vscode/src/docManagement/docManagementView.ts new file mode 100644 index 00000000..f55f7f38 --- /dev/null +++ b/extensions/vscode/src/docManagement/docManagementView.ts @@ -0,0 +1,87 @@ +import * as vscode from 'vscode'; + +type DocManagementCallback = (command: string, docName?: string, content?: string) => Promise; + +interface DocMessage { + command: 'loadDoc' | 'saveDoc'; + docName?: string; + content?: string; +} + +export class DocManagementView { + private panel: vscode.WebviewPanel | undefined; + private context: vscode.ExtensionContext; + private docManagementCallback: DocManagementCallback; + + constructor(context: vscode.ExtensionContext, docManagementCallback: DocManagementCallback) { + this.context = context; + this.docManagementCallback = docManagementCallback; + } + + public show() { + if (this.panel) { + this.panel.reveal(); + } else { + this.panel = vscode.window.createWebviewPanel( + 'docManagement', + 'Documentation Management', + vscode.ViewColumn.One, + { + enableScripts: true, + retainContextWhenHidden: true, + } + ); + + // Load the webview content asynchronously + this.getWebviewContent().then(html => { + this.panel!.webview.html = html; // Use non-null assertion since we just created the panel + }).catch(error => { + console.error("Failed to load webview content:", error); + this.panel!.webview.html = "

Error loading content

"; // Fallback content + }); + + this.panel.webview.onDidReceiveMessage( + (message: DocMessage) => { + switch (message.command) { + case 'loadDoc': + this.docManagementCallback(message.command, message.docName).catch(err => + vscode.window.showErrorMessage(`Error loading document: ${err.message}`) + ); + return; + case 'saveDoc': + this.docManagementCallback(message.command, message.docName, message.content).catch(err => + vscode.window.showErrorMessage(`Error saving document: ${err.message}`) + ); + return; + } + }, + undefined, + this.context.subscriptions + ); + + this.panel.onDidDispose(() => { + this.panel = undefined; // Cleanup if needed + }); + } + } + + public postMessage(message: any) { + this.panel?.webview.postMessage(message); + } + + private async getWebviewContent(): Promise { + const htmlPath = vscode.Uri.joinPath(this.context.extensionUri, 'webview', 'docManagement', 'index.html'); + console.log("Loading HTML from:", htmlPath.toString()); + + try { + // Read the HTML file + const htmlContentBuffer = await vscode.workspace.fs.readFile(htmlPath); + + // Convert the buffer to a string using TextDecoder for proper encoding + return new TextDecoder('utf-8').decode(htmlContentBuffer); + } catch (error) { + console.error("Error loading HTML:", error); + throw error; // Re-throw the error to handle it in show() + } + } +} \ No newline at end of file diff --git a/extensions/vscode/src/extension.ts b/extensions/vscode/src/extension.ts index 519ca1bc..2bbec57d 100644 --- a/extensions/vscode/src/extension.ts +++ b/extensions/vscode/src/extension.ts @@ -1,53 +1,134 @@ // The module 'vscode' contains the VS Code extensibility API // Import the module and reference it with the alias vscode in your code below +// import * as vscode from 'vscode'; +// import { SidebarProvider } from './SidebarProvider'; +// import { ApiRequestProvider } from './apiRequest/apiRequestProvider'; +// import { ApiManagementProvider } from './apiManagement/apiManagementProvider'; +// import { ChatRepoProvider } from './chatRepo/chatRepoProvider'; +// import { DocManagementProvider } from './docManagement/docManagementProvider'; +// import { TestManagementProvider } from './testManagement/testManagementProvider'; + +// let outputChannel: vscode.OutputChannel; + +// export function activate(context: vscode.ExtensionContext) { +// outputChannel = vscode.window.createOutputChannel("Kaizen CloudCode"); + +// outputChannel.appendLine("Kaizen CloudCode extension is activating!!!"); +// console.log("Kaizen CloudCode extension is activating"); + + +// const sidebarProvider = new SidebarProvider(context.extensionUri, context); +// const apiRequestProvider = new ApiRequestProvider(context); +// const testManagementProvider = new TestManagementProvider(context); +// const apiManagementProvider = new ApiManagementProvider(context); + +// context.subscriptions.push( +// vscode.window.registerWebviewViewProvider( +// "kaizen-cloudcode-sidebar", +// sidebarProvider +// ) +// ); + +// context.subscriptions.push( +// vscode.commands.registerCommand('kaizen-cloudcode.openTestManagement', () => { +// testManagementProvider.openTestManagementView(); +// }) +// ); + +// // You might want to add a command to open the API Request view directly +// let disposable = vscode.commands.registerCommand('kaizen-cloudcode.openApiRequest', () => { +// apiRequestProvider.openApiRequestView(); +// }); +// context.subscriptions.push(disposable); + +// context.subscriptions.push( +// vscode.commands.registerCommand('kaizen-cloudcode.openSidebar', () => { +// vscode.commands.executeCommand('workbench.view.extension.kaizen-cloudcode-view'); +// }) +// ); +// } + +// export function log(message: string) { +// if (outputChannel) { +// outputChannel.appendLine(message); +// } +// console.log(message); +// } +// export function deactivate() { } +// The module 'vscode' contains the VS Code extensibility API +// Import the module and reference it with the alias vscode in your code below"" import * as vscode from 'vscode'; -import { ApiRequestProvider } from './apiRequest/apiRequestProvider'; import { SidebarProvider } from './SidebarProvider'; +import { ApiRequestProvider } from './apiRequest/apiRequestProvider'; +import { ApiManagementProvider } from './apiManagement/apiManagementProvider'; +import { ChatRepoProvider } from './chatRepo/chatRepoProvider'; +import { DocManagementProvider } from './docManagement/docManagementProvider'; import { TestManagementProvider } from './testManagement/testManagementProvider'; let outputChannel: vscode.OutputChannel; export function activate(context: vscode.ExtensionContext) { - outputChannel = vscode.window.createOutputChannel("Kaizen CloudCode"); - - outputChannel.appendLine("Kaizen CloudCode extension is activating!!!"); - console.log("Kaizen CloudCode extension is activating"); - - - const sidebarProvider = new SidebarProvider(context.extensionUri, context); - const apiRequestProvider = new ApiRequestProvider(context); - const testManagementProvider = new TestManagementProvider(context); - - context.subscriptions.push( - vscode.window.registerWebviewViewProvider( - "kaizen-cloudcode-sidebar", - sidebarProvider - ) - ); - - context.subscriptions.push( - vscode.commands.registerCommand('kaizen-cloudcode.openTestManagement', () => { - testManagementProvider.openTestManagementView(); - }) - ); - - // You might want to add a command to open the API Request view directly - let disposable = vscode.commands.registerCommand('kaizen-cloudcode.openApiRequest', () => { - apiRequestProvider.openApiRequestView(); - }); - context.subscriptions.push(disposable); - - context.subscriptions.push( - vscode.commands.registerCommand('kaizen-cloudcode.openSidebar', () => { - vscode.commands.executeCommand('workbench.view.extension.kaizen-cloudcode-view'); - }) - ); + outputChannel = vscode.window.createOutputChannel("Kaizen CloudCode"); + + outputChannel.appendLine("Kaizen CloudCode extension is activating!!!"); + console.log("Kaizen CloudCode extension is activating"); + + const sidebarProvider = new SidebarProvider(context.extensionUri, context); + const apiRequestProvider = new ApiRequestProvider(context); + const apiManagementProvider = new ApiManagementProvider(context); + const chatRepoProvider = new ChatRepoProvider(context); + const docManagementProvider = new DocManagementProvider(context); + const testManagementProvider = new TestManagementProvider(context); + + context.subscriptions.push( + vscode.window.registerWebviewViewProvider( + "kaizen-cloudcode-sidebar", + sidebarProvider + ) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('kaizen-cloudcode.openTestManagement', () => { + testManagementProvider.openTestManagementView(); + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('kaizen-cloudcode.openApiRequest', () => { + apiRequestProvider.openApiRequestView(); + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('kaizen-cloudcode.openApiManagement', () => { + apiManagementProvider.openApiManagementView(); + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('kaizen-cloudcode.openChatRepo', () => { + chatRepoProvider.openChatRepoView(); + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('kaizen-cloudcode.openDocManagement', () => { + docManagementProvider.openDocManagementView(); + }) + ); + + context.subscriptions.push( + vscode.commands.registerCommand('kaizen-cloudcode.openSidebar', () => { + vscode.commands.executeCommand('workbench.view.extension.kaizen-cloudcode-view'); + }) + ); } export function log(message: string) { - if (outputChannel) { - outputChannel.appendLine(message); - } - console.log(message); + if (outputChannel) { + outputChannel.appendLine(message); + } + console.log(message); } -export function deactivate() { } \ No newline at end of file + +export function deactivate() {} \ No newline at end of file diff --git a/extensions/vscode/webview/documentation/index.html b/extensions/vscode/webview/docManagement/index.html similarity index 100% rename from extensions/vscode/webview/documentation/index.html rename to extensions/vscode/webview/docManagement/index.html