From 7ac8c170cfc99c98c49f2a803ff3b0c1ea68eafb Mon Sep 17 00:00:00 2001 From: Heng Lu <79895375+ms-henglu@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:33:03 +0800 Subject: [PATCH 1/2] support paste json as azapi config (#43) --- build/downloader.ts | 42 +++++++++----------- package-lock.json | 16 ++++---- package.json | 4 +- src/extension.ts | 51 +++++++++++++++++++++++++ src/test/integration/completion.test.ts | 2 +- 5 files changed, 81 insertions(+), 34 deletions(-) diff --git a/build/downloader.ts b/build/downloader.ts index 86da501..2933309 100644 --- a/build/downloader.ts +++ b/build/downloader.ts @@ -13,7 +13,6 @@ interface Release { assets: Build[]; } - function getPlatform(platform: string) { if (platform === 'win32') { return 'windows'; @@ -44,26 +43,24 @@ function getArch(arch: string) { return arch; } - async function getRelease(): Promise { - const response = await axios.get('https://api.github.com/repos/Azure/azapi-lsp/releases', { - headers: { - }, - }); - if (response.status == 200 && response.data.length != 0) { - const assets: Build[] = []; - for (const i in response.data[0].assets) { - assets.push({ - name: response.data[0].assets[i].name, - downloadUrl: response.data[0].assets[i].browser_download_url, - }); - } - return { - version: response.data[0].name, - assets: assets, - }; + const response = await axios.get('https://api.github.com/repos/Azure/azapi-lsp/releases', { + headers: {}, + }); + if (response.status == 200 && response.data.length != 0) { + const assets: Build[] = []; + for (const i in response.data[0].assets) { + assets.push({ + name: response.data[0].assets[i].name, + downloadUrl: response.data[0].assets[i].browser_download_url, + }); } - throw new Error("no valid release") + return { + version: response.data[0].name, + assets: assets, + }; + } + throw new Error('no valid release'); } async function run(platform: string, architecture: string) { @@ -79,7 +76,7 @@ async function run(platform: string, architecture: string) { fs.mkdirSync(installPath); - const release = await getRelease() + const release = await getRelease(); const os = getPlatform(platform); const arch = getArch(architecture); @@ -95,8 +92,7 @@ async function run(platform: string, architecture: string) { throw new Error(`Install error: no matching azapi-lsp binary for ${os}/${arch}`); } - console.log(build) - + console.log(build); // download zip const zipfile = path.resolve(installPath, `azapi-lsp_${release.version}.zip`); @@ -110,7 +106,7 @@ async function run(platform: string, architecture: string) { }); // unzip - const fileExtension = os === "windows" ? ".exe" : ""; + const fileExtension = os === 'windows' ? '.exe' : ''; const binaryName = path.resolve(installPath, `azapi-lsp${fileExtension}`); const fileReadStream = fs.createReadStream(zipfile); const unzipPipe = unzip.Extract({ path: installPath }); diff --git a/package-lock.json b/package-lock.json index d7e3d12..9510861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "@types/openpgp": "^4.4.15", "@types/semver": "^7.3.4", "@types/unzip-stream": "^0.3.1", - "@types/vscode": "^1.61.1", + "@types/vscode": "^1.82.0", "@types/which": "^2.0.1", "@types/yauzl": "^2.9.1", "@typescript-eslint/eslint-plugin": "^3.9.0", @@ -54,7 +54,7 @@ "engines": { "node": "~16.X", "npm": "~8.X", - "vscode": "^1.61.0" + "vscode": "^1.82.0" } }, "node_modules/@babel/code-frame": { @@ -1295,9 +1295,9 @@ } }, "node_modules/@types/vscode": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.63.0.tgz", - "integrity": "sha512-iePu1axOi5WSThV6l2TYcciBIpAlMarjBC8H0y8L8ocsZLxh7MttzwFU3pjoItF5fRVGxHS0Hsvje9jO3yJsfw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.90.0.tgz", + "integrity": "sha512-oT+ZJL7qHS9Z8bs0+WKf/kQ27qWYR3trsXpq46YDjFqBsMLG4ygGGjPaJ2tyrH0wJzjOEmDyg9PDJBBhWg9pkQ==", "dev": true }, "node_modules/@types/which": { @@ -8691,9 +8691,9 @@ } }, "@types/vscode": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.63.0.tgz", - "integrity": "sha512-iePu1axOi5WSThV6l2TYcciBIpAlMarjBC8H0y8L8ocsZLxh7MttzwFU3pjoItF5fRVGxHS0Hsvje9jO3yJsfw==", + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.90.0.tgz", + "integrity": "sha512-oT+ZJL7qHS9Z8bs0+WKf/kQ27qWYR3trsXpq46YDjFqBsMLG4ygGGjPaJ2tyrH0wJzjOEmDyg9PDJBBhWg9pkQ==", "dev": true }, "@types/which": { diff --git a/package.json b/package.json index 8b24098..47d0f79 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "engines": { "npm": "~8.X", "node": "~16.X", - "vscode": "^1.61.0" + "vscode": "^1.82.0" }, "langServer": { "version": "0.25.2" @@ -166,7 +166,7 @@ "@types/openpgp": "^4.4.15", "@types/semver": "^7.3.4", "@types/unzip-stream": "^0.3.1", - "@types/vscode": "^1.61.1", + "@types/vscode": "^1.82.0", "@types/which": "^2.0.1", "@types/yauzl": "^2.9.1", "@typescript-eslint/eslint-plugin": "^3.9.0", diff --git a/src/extension.ts b/src/extension.ts index 4a00e12..b4e31b4 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -44,6 +44,53 @@ export async function activate(context: vscode.ExtensionContext): Promise } stopLanguageServer(); }), + vscode.workspace.onDidChangeTextDocument(async (event: vscode.TextDocumentChangeEvent) => { + if (event.document.languageId !== 'terraform') { + return; + } + + let lsClient = clientHandler.getClient(); + if (!lsClient) { + return; + } + + const editor = vscode.window.activeTextEditor; + if ( + event.reason !== vscode.TextDocumentChangeReason.Redo && + event.reason !== vscode.TextDocumentChangeReason.Undo && + event.document === editor?.document && + event.contentChanges.length === 1 + ) { + const contentChange = event.contentChanges[0]; + + // Ignore deletions and trivial changes + if (contentChange.text.length < 2 || isEmptyOrWhitespace(contentChange.text)) { + return; + } + + const clipboardText = await vscode.env.clipboard.readText(); + + if (contentChange.text !== clipboardText) { + return; + } + + try { + const result: any = await lsClient.client.sendRequest('workspace/executeCommand', { + command: 'azapi.convertJsonToAzapi', + arguments: [`jsonContent=${clipboardText}`], + }); + + await editor.edit((editBuilder) => { + const startPoint = contentChange.range.start; + const endPoint = editor.selection.active; + const replaceRange = new vscode.Range(startPoint, endPoint); + editBuilder.replace(replaceRange, result.hclcontent); + }); + } catch (error) { + outputChannel.appendLine(`Error converting JSON to AzApi: ${error}`); + } + } + }), vscode.workspace.onDidChangeConfiguration(async (event: vscode.ConfigurationChangeEvent) => { if (event.affectsConfiguration('terraform') || event.affectsConfiguration('azapi-lsp')) { const reloadMsg = 'Reload VSCode window to apply language server changes'; @@ -99,3 +146,7 @@ async function stopLanguageServer() { function enabled(): boolean { return config('azapi').get('languageServer.external', false); } + +function isEmptyOrWhitespace(s: string): boolean { + return /^\s*$/.test(s); +} diff --git a/src/test/integration/completion.test.ts b/src/test/integration/completion.test.ts index c50034a..637ebd1 100644 --- a/src/test/integration/completion.test.ts +++ b/src/test/integration/completion.test.ts @@ -22,7 +22,7 @@ suite('completion', () => { const docUri = getDocUri('main.tf'); await open(docUri); - await new Promise(r => setTimeout(r, 1000 * 40)); + await new Promise((r) => setTimeout(r, 1000 * 40)); const list = await vscode.commands.executeCommand( 'vscode.executeCompletionItemProvider', docUri, From a5cf7c156fe17c96f1e6a6834a0513e658cd15be Mon Sep 17 00:00:00 2001 From: Heng Lu Date: Fri, 16 Aug 2024 15:04:17 +0800 Subject: [PATCH 2/2] fix lint --- src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index b4e31b4..264b203 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -49,7 +49,7 @@ export async function activate(context: vscode.ExtensionContext): Promise return; } - let lsClient = clientHandler.getClient(); + const lsClient = clientHandler.getClient(); if (!lsClient) { return; }