forked from FWS/TEMPLATE-Web-site-one-page
fix(dl): fallback tags quand releases absentes
This commit is contained in:
+105
-80
@@ -1,13 +1,15 @@
|
|||||||
(() => {
|
(() => {
|
||||||
const OWNER = "You-re-like-Windows-a-bitch";
|
const OWNER = "You-re-like-Windows-a-bitch";
|
||||||
const REPO = "ISO";
|
const REPO = "ISO";
|
||||||
const API_URL = `https://api.github.com/repos/${OWNER}/${REPO}/releases?per_page=6`;
|
const RELEASES_URL = `https://api.github.com/repos/${OWNER}/${REPO}/releases?per_page=6`;
|
||||||
|
const TAGS_URL = `https://api.github.com/repos/${OWNER}/${REPO}/tags?per_page=6`;
|
||||||
const REPO_URL = `https://github.com/${OWNER}/${REPO}`;
|
const REPO_URL = `https://github.com/${OWNER}/${REPO}`;
|
||||||
|
|
||||||
const currentVersionNode = document.querySelector("[data-current-version]");
|
const currentVersionNode = document.querySelector("[data-current-version]");
|
||||||
const currentVersionDateNode = document.querySelector("[data-current-version-date]");
|
const currentVersionDateNode = document.querySelector("[data-current-version-date]");
|
||||||
const currentReleaseNoteNode = document.querySelector("[data-current-release-note]");
|
const currentReleaseNoteNode = document.querySelector("[data-current-release-note]");
|
||||||
const latestDownloadNode = document.querySelector("[data-latest-download]");
|
const latestDownloadNode = document.querySelector("[data-latest-download]");
|
||||||
|
const viewMoreNode = document.querySelector("[data-view-more]");
|
||||||
const versionsListNode = document.querySelector("[data-versions-list]");
|
const versionsListNode = document.querySelector("[data-versions-list]");
|
||||||
|
|
||||||
function formatDate(value) {
|
function formatDate(value) {
|
||||||
@@ -21,48 +23,71 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDirectDownloadUrl(release) {
|
function getReleaseLabel(entry) {
|
||||||
if (release?.assets?.length) {
|
return entry?.name || entry?.tag_name || entry?.ref || "Sans nom";
|
||||||
return release.assets[0].browser_download_url || release.assets[0].url || release.html_url || "#";
|
}
|
||||||
|
|
||||||
|
function pickDirectDownloadUrl(release) {
|
||||||
|
const assets = Array.isArray(release?.assets) ? release.assets : [];
|
||||||
|
const isoAsset = assets.find((asset) => /\.iso$/i.test(asset?.name || ""));
|
||||||
|
const directAsset = isoAsset || assets[0];
|
||||||
|
|
||||||
|
if (directAsset) {
|
||||||
|
return directAsset.browser_download_url || directAsset.url || release.html_url || REPO_URL;
|
||||||
}
|
}
|
||||||
return release?.html_url || "#";
|
|
||||||
|
return release?.zipball_url || release?.html_url || REPO_URL;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getReleaseLabel(release) {
|
function renderEmptyState(title, message) {
|
||||||
return release.name || release.tag_name || "Sans nom";
|
if (!versionsListNode) return;
|
||||||
|
versionsListNode.innerHTML = `
|
||||||
|
<li class="version-item version-item-empty">
|
||||||
|
<div class="version-main">
|
||||||
|
<strong>${title}</strong>
|
||||||
|
<span>${message}</span>
|
||||||
|
</div>
|
||||||
|
<div class="version-side">
|
||||||
|
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderReleaseList(releases) {
|
function renderList(items, mode) {
|
||||||
if (!versionsListNode) return;
|
if (!versionsListNode) return;
|
||||||
versionsListNode.innerHTML = "";
|
versionsListNode.innerHTML = "";
|
||||||
|
|
||||||
if (!releases.length) {
|
const visibleItems = items.slice(1, 6);
|
||||||
versionsListNode.innerHTML = `
|
|
||||||
<li class="version-item version-item-empty">
|
if (!visibleItems.length) {
|
||||||
<div class="version-main">
|
if (items.length === 0) {
|
||||||
<strong>Aucune release trouvée</strong>
|
renderEmptyState("Aucune release trouvée", "Le dépôt n'expose pas encore de release ou les releases ne sont pas accessibles.");
|
||||||
<span>Le dépôt n'a pas encore publié de version.</span>
|
} else {
|
||||||
</div>
|
renderEmptyState(
|
||||||
<div class="version-side">
|
mode === "releases" ? "Aucune release précédente trouvée" : "Aucun tag précédent trouvé",
|
||||||
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a>
|
mode === "releases"
|
||||||
</div>
|
? "Il n'y a qu'une seule release publiée pour le moment."
|
||||||
</li>
|
: "Il n'y a qu'un seul tag disponible pour le moment."
|
||||||
`;
|
);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
releases.slice(1, 6).forEach((release) => {
|
visibleItems.forEach((entry) => {
|
||||||
const li = document.createElement("li");
|
const li = document.createElement("li");
|
||||||
li.className = "version-item";
|
li.className = "version-item";
|
||||||
|
|
||||||
const versionLabel = getReleaseLabel(release);
|
const label = getReleaseLabel(entry);
|
||||||
const downloadUrl = getDirectDownloadUrl(release);
|
const downloadUrl = mode === "releases"
|
||||||
const published = formatDate(release.published_at);
|
? pickDirectDownloadUrl(entry)
|
||||||
|
: `https://github.com/${OWNER}/${REPO}/archive/refs/tags/${encodeURIComponent(entry.name)}.zip`;
|
||||||
|
const published = formatDate(entry.published_at || entry.commit?.committer?.date);
|
||||||
|
|
||||||
li.innerHTML = `
|
li.innerHTML = `
|
||||||
<div class="version-main">
|
<div class="version-main">
|
||||||
<strong>${versionLabel}</strong>
|
<strong>${label}</strong>
|
||||||
<span>${published ? `Publié le ${published}` : "Date inconnue"}</span>
|
<span>${published ? `Publié le ${published}` : mode === "releases" ? "Date inconnue" : "Tag GitHub"}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="version-side">
|
<div class="version-side">
|
||||||
<a class="button button-secondary" href="${downloadUrl}" target="_blank" rel="noreferrer">Télécharger</a>
|
<a class="button button-secondary" href="${downloadUrl}" target="_blank" rel="noreferrer">Télécharger</a>
|
||||||
@@ -71,80 +96,80 @@
|
|||||||
|
|
||||||
versionsListNode.appendChild(li);
|
versionsListNode.appendChild(li);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (releases.length === 1) {
|
async function fetchJson(url) {
|
||||||
const li = document.createElement("li");
|
const response = await fetch(url, {
|
||||||
li.className = "version-item version-item-empty";
|
headers: { Accept: "application/vnd.github+json" },
|
||||||
li.innerHTML = `
|
});
|
||||||
<div class="version-main">
|
|
||||||
<strong>Aucune release précédente trouvée</strong>
|
if (!response.ok) {
|
||||||
<span>La liste s'affiche ici quand il y en a au moins 2.</span>
|
throw new Error(`GitHub API ${response.status}`);
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
versionsListNode.appendChild(li);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return response.json();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadReleases() {
|
async function loadReleases() {
|
||||||
if (currentVersionNode) currentVersionNode.textContent = "Chargement...";
|
if (currentVersionNode) currentVersionNode.textContent = "Chargement...";
|
||||||
|
if (currentVersionDateNode) currentVersionDateNode.textContent = "";
|
||||||
|
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = "";
|
||||||
|
if (latestDownloadNode) latestDownloadNode.href = REPO_URL;
|
||||||
|
if (viewMoreNode) viewMoreNode.href = `${REPO_URL}/releases`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(API_URL, {
|
const releases = await fetchJson(RELEASES_URL);
|
||||||
headers: {
|
|
||||||
Accept: "application/vnd.github+json",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
if (Array.isArray(releases) && releases.length > 0) {
|
||||||
throw new Error(`GitHub API ${response.status}`);
|
const latest = releases[0];
|
||||||
|
const latestLabel = getReleaseLabel(latest);
|
||||||
|
const latestDownloadUrl = pickDirectDownloadUrl(latest);
|
||||||
|
const latestDate = formatDate(latest.published_at);
|
||||||
|
|
||||||
|
if (currentVersionNode) currentVersionNode.textContent = latestLabel;
|
||||||
|
if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : "";
|
||||||
|
if (currentReleaseNoteNode) {
|
||||||
|
currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente.";
|
||||||
|
}
|
||||||
|
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
|
||||||
|
|
||||||
|
renderList(releases, "releases");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
// On tente le fallback tags ci-dessous.
|
||||||
|
}
|
||||||
|
|
||||||
const releases = await response.json();
|
try {
|
||||||
if (!Array.isArray(releases)) {
|
const tags = await fetchJson(TAGS_URL);
|
||||||
throw new Error("Réponse GitHub invalide");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (releases.length === 0) {
|
if (Array.isArray(tags) && tags.length > 0) {
|
||||||
if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée";
|
const latestTag = tags[0];
|
||||||
|
const latestLabel = getReleaseLabel(latestTag);
|
||||||
|
const latestDownloadUrl = `https://github.com/${OWNER}/${REPO}/archive/refs/tags/${encodeURIComponent(latestTag.name)}.zip`;
|
||||||
|
|
||||||
|
if (currentVersionNode) currentVersionNode.textContent = `${latestLabel} (tag)`;
|
||||||
if (currentVersionDateNode) currentVersionDateNode.textContent = "";
|
if (currentVersionDateNode) currentVersionDateNode.textContent = "";
|
||||||
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = "Le dépôt n'a pas encore publié de release GitHub.";
|
if (currentReleaseNoteNode) {
|
||||||
if (latestDownloadNode) latestDownloadNode.href = REPO_URL;
|
currentReleaseNoteNode.textContent = "Aucune release GitHub publiée pour le moment, affichage des tags du dépôt.";
|
||||||
renderReleaseList([]);
|
}
|
||||||
|
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
|
||||||
|
|
||||||
|
renderList(tags, "tags");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const latest = releases[0];
|
if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée";
|
||||||
const latestLabel = getReleaseLabel(latest);
|
if (currentReleaseNoteNode) {
|
||||||
const latestDownloadUrl = getDirectDownloadUrl(latest);
|
currentReleaseNoteNode.textContent = "Le dépôt ne renvoie ni release ni tag public.";
|
||||||
const latestDate = formatDate(latest.published_at);
|
}
|
||||||
|
renderEmptyState("Aucune release trouvée", "Le dépôt ne renvoie ni release ni tag public.");
|
||||||
if (currentVersionNode) currentVersionNode.textContent = latestLabel;
|
|
||||||
if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : "";
|
|
||||||
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente.";
|
|
||||||
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
|
|
||||||
|
|
||||||
renderReleaseList(releases);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (currentVersionNode) currentVersionNode.textContent = "Impossible de charger les releases";
|
if (currentVersionNode) currentVersionNode.textContent = "Impossible de charger les releases";
|
||||||
if (currentReleaseNoteNode) {
|
if (currentReleaseNoteNode) {
|
||||||
currentReleaseNoteNode.textContent = `Erreur: ${error.message}. Vérifie que le repo GitHub est public et qu'il expose des releases.`;
|
currentReleaseNoteNode.textContent = `Erreur: ${error.message}. Vérifie que le repo GitHub est public et qu'il expose des releases ou des tags.`;
|
||||||
}
|
|
||||||
if (latestDownloadNode) {
|
|
||||||
latestDownloadNode.href = REPO_URL;
|
|
||||||
}
|
|
||||||
if (versionsListNode) {
|
|
||||||
versionsListNode.innerHTML = `
|
|
||||||
<li class="version-item version-item-empty">
|
|
||||||
<div class="version-main">
|
|
||||||
<strong>Impossible de charger les anciennes versions</strong>
|
|
||||||
<span>Ouvre le repo GitHub pour voir les releases.</span>
|
|
||||||
</div>
|
|
||||||
<div class="version-side">
|
|
||||||
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
`;
|
|
||||||
}
|
}
|
||||||
|
renderEmptyState("Impossible de charger les releases", "Ouvre le repo GitHub pour vérifier les releases ou les tags.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user