diff --git a/background.js b/background.js new file mode 100644 index 0000000..ee30ec8 --- /dev/null +++ b/background.js @@ -0,0 +1,12 @@ +chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { + if ( + changeInfo.status === "complete" && + tab.url.indexOf("https://github.com/") > -1 + ) { + console.log(`updated: ${tab.url}`); + chrome.scripting.executeScript({ + target: { tabId: tab.id, allFrames: true }, + files: ["./script.js"], + }); + } +}); diff --git a/images/128.png b/images/128.png new file mode 100644 index 0000000..cdef028 Binary files /dev/null and b/images/128.png differ diff --git a/images/48.png b/images/48.png new file mode 100644 index 0000000..451e6e1 Binary files /dev/null and b/images/48.png differ diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..bd62d87 --- /dev/null +++ b/manifest.json @@ -0,0 +1,21 @@ +{ + "manifest_version": 3, + "name": "GitHub Release Tag Version Bumper", + "version": "0.0.1", + "description": "One click to bump version and generate release note", + "content_scripts": [ + { + "matches": ["https://github.com/*"], + "js": ["script.js"] + } + ], + "background": { + "service_worker": "background.js" + }, + "permissions": ["tabs", "scripting"], + "host_permissions": ["*://github.com/*"], + "icons": { + "48": "images/48.png", + "128": "images/128.png" + } +} diff --git a/script.js b/script.js new file mode 100644 index 0000000..6f15918 --- /dev/null +++ b/script.js @@ -0,0 +1,127 @@ +function getButtonClassName() { + return "version-bumper-buttons"; +} + +function getDescription() { + return document.createTextNode("Or use Version Bumper. Latest version is "); +} + +function getVersionElement(version) { + let elem = document.createElement("code"); + elem.textContent = version; + elem.id = "description-version"; + return elem; +} + +var newDiv = document.createElement("div"); +var latestVersion = "v0.0.0"; +var buttonDescription = document.createElement("p"); +var buttonContainer = document.createElement("div"); +var buttonMajor = document.createElement("span"); +buttonMajor.onclick = function () { + onBumpButtonClick("major"); +}; +var buttonMinor = document.createElement("span"); +buttonMinor.onclick = function () { + onBumpButtonClick("minor"); +}; +var buttonPatch = document.createElement("span"); +buttonPatch.onclick = function () { + onBumpButtonClick("patch"); +}; + +function onBumpButtonClick(target) { + // Parse version + var parseResult = latestVersion.match( + /(^.*)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(.*$)/ + ); + if (parseResult == null) { + [prefix, major, minor, patch] = ["v", "0", "0", "0"]; + } else { + var [_, prefix, major, minor, patch, suffix] = parseResult; + } + + // Bump version + if (target == "major") { + major++; + minor = 0; + patch = 0; + } else if (target == "minor") { + minor++; + patch = 0; + } else if (target == "patch") { + patch++; + } + var newVersion = [prefix, major, ".", minor, ".", patch, suffix].join(""); + + // Input new version + document + .querySelector( + "input[name='release[tag_name]'][id='release_tag_name__refname_']" + ) + .setAttribute("value", newVersion); + document + .querySelector("[id^=tag-select-menu]") + .querySelector("span[data-menu-button]").textContent = newVersion; + var completeTextElement = document.createElement("h4"); + completeTextElement.textContent = "Version bumped! 🚀"; + var releaseTagTextContainer = document + .querySelector("div[class*='js-release-tag']") + .querySelector("div[aria-live='polite'"); + releaseTagTextContainer.innerHTML = ""; + releaseTagTextContainer.appendChild(completeTextElement); + + // Enable generate release note button + document + .querySelector("button[id='generate-notes-btn']") + .setAttribute("aria-disabled", "false"); +} + +function main() { + // Return if not on new release screen + if (location.href.indexOf("/releases/new") == -1) return; + + // Create buttons if not exist + if (document.getElementById(getButtonClassName()) == null) { + newDiv.className = getButtonClassName(); + newDiv.id = getButtonClassName(); + buttonDescription.appendChild(getDescription()); + buttonDescription.appendChild(getVersionElement()); + newDiv.appendChild(buttonDescription); + + // Prepare Buttons + buttonMajor.className = "btn"; + buttonMajor.textContent = "major"; + buttonMajor.style.marginRight = "4px"; + buttonMinor.className = "btn"; + buttonMinor.textContent = "minor"; + buttonMinor.style.marginRight = "4px"; + buttonPatch.className = "btn"; + buttonPatch.textContent = "patch"; + buttonContainer.append(buttonMajor, buttonMinor, buttonPatch); + + newDiv.appendChild(buttonContainer); + document + .getElementsByClassName("js-release-tag")[0] + .appendChild(newDiv); + } + + // Trigger fetching letest version + var tagSelectMenu = document.querySelector("[id^=tag-select-menu]"); + if (tagSelectMenu instanceof HTMLElement) { + tagSelectMenu.dispatchEvent(new Event("mouseover")); + } else return; + + var tagItems = tagSelectMenu.getElementsByClassName("SelectMenu-item"); + if (tagItems.length > 0) { + var latestItem = + tagItems[0].getElementsByTagName("span")[0].textContent; + } else return; + if (latestItem !== null) { + latestVersion = latestItem; + document.getElementById("description-version").textContent = + latestVersion; + } +} + +main();