Github - Open with VSCode

Adds "Open with VSCode" button

Від 28.10.2023. Дивіться остання версія.

// ==UserScript==
// @name         Github - Open with VSCode
// @namespace    V@no
// @description  Adds "Open with VSCode" button
// @match        https://github.com/*
// @version      23.10.28-123217
// @license      MIT
// @run-at       document-end
// @grant        none
// ==/UserScript==

(() =>
{
	"use strict";
	const icon_vscode = "https://raw.githubusercontent.com/vanowm/userscript_github-open_with_vscode/master/media/vscode.svg";
	const icon_vstudio = "https://raw.githubusercontent.com/vanowm/userscript_github-open_with_vscode/master/media/vstudio.svg";
	const fixLink = () =>
	{
		const elADownloadZip = document.querySelector(`[data-open-app="link"]`);
		if (!elADownloadZip)
			return true;

		const elLiDownloadZip = elADownloadZip.parentNode;
		const elAVStudio = document.querySelector('[data-open-app="visual-studio"]');
		let elLiVSCode;
		let elAVSCode;
		if (elAVStudio)
		{
			const elLiVStudio = elAVStudio.parentNode;
			elLiVSCode = elLiVStudio.cloneNode(true);
			elAVSCode = elLiVSCode.querySelector("a");
			elAVStudio.innerHTML = icon_vstudio + elAVStudio.innerHTML;
		}
		else
		{
			elLiVSCode = elLiDownloadZip.cloneNode(true);
			elAVSCode = elLiVSCode.querySelector("a");
			elAVSCode.dataset.action = "click:get-repo#showDownloadMessage";
		}
		try
		{
			const hydroClick = JSON.parse(elAVSCode.dataset.hydroClick);
			hydroClick.payload.feature_clicked = "OPEN_WITH_VSCODE";
			elAVSCode.dataset.hydroClick = JSON.stringify(hydroClick);
		}
		catch{}
		elAVSCode.innerHTML = icon_vscode + "Open with VSCode";
		// display "Launching Visual Studio Code..." message
		elAVSCode.dataset.openApp = "vscode";
		const cloneURL = (document.querySelector(".input-group > .form-control") || {}).value;

		if (cloneURL)
			elAVSCode.href = "vscode://vscode.git/clone?url=" + encodeURI(cloneURL);
		else
			elAVSCode.href = elAVSCode.href.replace("git-client://", "vscode://vscode.git/");

		elLiDownloadZip.parentNode.insertBefore(elLiVSCode, elLiDownloadZip);
		//we don't need keep observing DOM changes anymore
		observer.disconnect();
	};

	const observer = new MutationObserver(fixLink);
	if (fixLink())
		observer.observe(document, {childList: true, subtree: true});
})();