Skip to content
Merged

Dev #25

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions api/release.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
const https = require("https");

const fallbackRelease = {
tagName: "v1.1.0",
url: "https://github.com/blackdragoon26/Do-It/releases/tag/v1.1.0",
};

function fetchLatestRelease() {
return new Promise((resolve, reject) => {
const request = https.get(
{
hostname: "api.github.com",
path: "/repos/blackdragoon26/Do-It/releases/latest",
headers: {
Accept: "application/vnd.github+json",
"User-Agent": "Do-It-website",
},
},
(response) => {
let body = "";

response.setEncoding("utf8");
response.on("data", (chunk) => {
body += chunk;
});
response.on("end", () => {
if (response.statusCode < 200 || response.statusCode >= 300) {
reject(new Error(`GitHub returned ${response.statusCode}`));
return;
}

try {
resolve(JSON.parse(body));
} catch (error) {
reject(error);
}
});
},
);

request.setTimeout(3000, () => {
request.destroy(new Error("GitHub release lookup timed out"));
});
request.on("error", reject);
});
}

module.exports = async function handler(request, response) {
if (request.method !== "GET" && request.method !== "HEAD") {
response.setHeader("Allow", "GET, HEAD");
response.statusCode = 405;
response.end();
return;
}

try {
const release = await fetchLatestRelease();
const payload = {
tagName: release.tag_name || fallbackRelease.tagName,
url: release.html_url || fallbackRelease.url,
};

response.setHeader("Cache-Control", "s-maxage=3600, stale-while-revalidate=86400");
response.setHeader("Content-Type", "application/json; charset=utf-8");
response.end(JSON.stringify(payload));
} catch {
response.setHeader("Cache-Control", "s-maxage=300, stale-while-revalidate=3600");
response.setHeader("Content-Type", "application/json; charset=utf-8");
response.end(JSON.stringify(fallbackRelease));
}
};
1 change: 1 addition & 0 deletions vercel.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"installCommand": null,
"buildCommand": null,
"outputDirectory": "website",
"ignoreCommand": "[ \"$VERCEL_GIT_COMMIT_REF\" != \"main\" ]",
"git": {
"deploymentEnabled": {
"dev": false
Expand Down
20 changes: 19 additions & 1 deletion website/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ <h1 id="hero-title">Do-It</h1>
<a class="button primary" href="#install">Install</a>
<a class="button" href="https://github.com/blackdragoon26/Do-It" rel="noopener noreferrer">Source</a>
</div>
<p class="release-note">Latest release <a href="https://github.com/blackdragoon26/Do-It/releases/tag/v1.0.0" rel="noopener noreferrer">v1.0.0</a></p>
<p class="release-note">Latest release <a id="latest-release" href="https://github.com/blackdragoon26/Do-It/releases/tag/v1.1.0" rel="noopener noreferrer">v1.1.0</a></p>
</div>

<figure class="product-frame">
Expand Down Expand Up @@ -64,6 +64,24 @@ <h2 id="install-title">Run it anywhere you keep online.</h2>
<a href="https://github.com/blackdragoon26/Do-It" rel="noopener noreferrer">github.com/blackdragoon26/Do-It</a>
</footer>
<script>
const releaseLink = document.getElementById("latest-release");
if (releaseLink) {
fetch("/api/release", { headers: { Accept: "application/json" } })
.then((response) => {
if (!response.ok) {
throw new Error("release lookup failed");
}
return response.json();
})
.then((release) => {
if (release.tagName && release.url) {
releaseLink.textContent = release.tagName;
releaseLink.href = release.url;
}
})
.catch(() => {});
}

document.querySelectorAll("[data-copy]").forEach((button) => {
const originalLabel = button.textContent;
let revertTimer;
Expand Down
Loading