From 5ea78f9abfcfe1b313ff8fa5dd30dc7fae53d06e Mon Sep 17 00:00:00 2001 From: BChoudhury-ms Date: Mon, 28 Jul 2025 22:52:23 +0530 Subject: [PATCH] Add VCore MongoDB support for VS Code extension integration (#2181) * support for vCore mongodb support for vscode extension * added comment for future referance on the double encoded connection string --- src/Explorer/Explorer.tsx | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Explorer/Explorer.tsx b/src/Explorer/Explorer.tsx index b4b5e0c54..91ad1b20b 100644 --- a/src/Explorer/Explorer.tsx +++ b/src/Explorer/Explorer.tsx @@ -289,14 +289,40 @@ export default class Explorer { } } - public openInVsCode(): void { + /** + * Generates a VS Code DocumentDB connection URL using the current user's MongoDB connection parameters. + * Double-encodes the updated connection string for safe usage in VS Code URLs. + * + * The DocumentDB VS Code extension requires double encoding for connection strings. + * See: https://microsoft.github.io/vscode-documentdb/manual/how-to-construct-url.html#double-encoding + * + * @returns {string} The encoded VS Code DocumentDB connection URL. + */ + private getDocumentDbUrl() { + const { adminLogin: adminLoginuserName = "", connectionString = "" } = userContext.vcoreMongoConnectionParams; + const updatedConnectionString = connectionString.replace(/<(user|username)>:/i, adminLoginuserName); + const encodedUpdatedConnectionString = encodeURIComponent(encodeURIComponent(updatedConnectionString)); + const documentDbUrl = `vscode://ms-azuretools.vscode-documentdb?connectionString=${encodedUpdatedConnectionString}`; + return documentDbUrl; + } + + private getCosmosDbUrl() { const activeTab = useTabs.getState().activeTab; const resourceId = encodeURIComponent(userContext.databaseAccount.id); const database = encodeURIComponent(activeTab?.collection?.databaseId); const container = encodeURIComponent(activeTab?.collection?.id()); const baseUrl = `vscode://ms-azuretools.vscode-cosmosdb?resourceId=${resourceId}`; const vscodeUrl = activeTab ? `${baseUrl}&database=${database}&container=${container}` : baseUrl; + return vscodeUrl; + } + private getVSCodeUrl(): string { + const isvCore = (userContext.apiType || userContext.databaseAccount.kind) === "VCoreMongo"; + return isvCore ? this.getDocumentDbUrl() : this.getCosmosDbUrl(); + } + + public openInVsCode(): void { + const vscodeUrl = this.getVSCodeUrl(); const openVSCodeDialogProps: DialogProps = { linkProps: { linkText: "Download Visual Studio Code",