Skip to content

Commit b767317

Browse files
authored
Merge pull request #29 from zeroedin/fix/update-v-script-handling
feat: update version script handling
2 parents 188067f + 946dbb6 commit b767317

File tree

12 files changed

+1432
-31
lines changed

12 files changed

+1432
-31
lines changed

.changeset/eight-hands-rhyme.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"z-changeset-practice": minor
3+
---
4+
5+
console update to 0.4.0

.gitignore

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,7 @@ node_modules
88
.cache
99

1010
# Build artifacts
11-
src/*.js
12-
src/*.js.map
11+
**/*.js
12+
**/*.js.map
13+
**/*.d.ts
14+
**/*.d.ts.map

docs/index.html

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,24 @@
66
<title>Learning to release versioned documentation</title>
77
</head>
88
<body>
9-
<h1>Hello World</h1>
10-
<p>Current version: {{ pkg.version }}</p>
9+
<h1>Hello World</h1>
10+
<p>Current version: {{ pkg.version }}</p>
1111

12-
<img src="images/kraken.png" alt="Kraken">
12+
<img src="images/kraken.png" alt="Kraken">
1313

14-
<p>Past versions:</p>
15-
<ul>
16-
<li><a href="/v0.3.0/">v0.3.0 🦑</a></li>
17-
<li><a href="/v0.2.3/">v0.2.3</a></li>
18-
<li><a href="/v0.2.2/">v0.2.2</a></li>
19-
<li><a href="/v0.2.1/">v0.2.1</a></li>
20-
<li><a href="/v0.2.0/">v0.2.0</a></li>
21-
<li><a href="/v0.1.2/">v0.1.2</a></li>
22-
<li><a href="/v0.1.1/">v0.1.1</a></li>
23-
</ul>
14+
<div id="version-list">
15+
<h2>Past versions:</h2>
16+
</div>
17+
18+
<!-- Load from an absolute path in production, so as to always get the latest version -->
19+
<script type="module">
20+
{% if env == "dev" %}
21+
import { loadVersions } from '/scripts/version-loader.js';
22+
loadVersions('/releases.json','version-list');
23+
{% else %}
24+
import { loadVersions } from 'https://z-changeset-practice.netlify.app/scripts/version-loader.js';
25+
loadVersions('https://z-changeset-practice.netlify.app/releases.json','version-list');
26+
{% endif %}
27+
</script>
2428
</body>
2529
</html>

docs/releases.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"releases": [
3+
{
4+
"version": "v0.0.2",
5+
"url": "https://z-changeset-practice.netlify.app/v0.0.2/"
6+
},
7+
{
8+
"version": "v0.1.0",
9+
"url": "https://z-changeset-practice.netlify.app/v0.1.0/"
10+
},
11+
{
12+
"version": "v0.1.1",
13+
"url": "https://z-changeset-practice.netlify.app/v0.1.1/"
14+
},
15+
{
16+
"version": "v0.1.2",
17+
"url": "https://z-changeset-practice.netlify.app/v0.1.2/"
18+
},
19+
{
20+
"version": "v0.2.0",
21+
"url": "https://z-changeset-practice.netlify.app/v0.2.0/"
22+
},
23+
{
24+
"version": "v0.2.1",
25+
"url": "https://z-changeset-practice.netlify.app/v0.2.1/"
26+
},
27+
{
28+
"version": "v0.2.2",
29+
"url": "https://z-changeset-practice.netlify.app/v0.2.2/"
30+
},
31+
{
32+
"version": "v0.2.3",
33+
"url": "https://z-changeset-practice.netlify.app/v0.2.3/"
34+
},
35+
{
36+
"version": "v0.3.0",
37+
"url": "https://z-changeset-practice.netlify.app/v0.3.0/"
38+
}
39+
],
40+
"generatedAt": "2025-09-19T14:37:11.839Z"
41+
}

docs/scripts/version-loader.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
interface Release {
2+
version: string;
3+
url: string;
4+
}
5+
6+
interface ReleasesData {
7+
releases: Release[];
8+
generatedAt: string;
9+
}
10+
11+
// Semantic version comparison function
12+
function compareSemver(a: string, b: string): number {
13+
const aParts = a.split('.').map(Number);
14+
const bParts = b.split('.').map(Number);
15+
16+
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
17+
const aPart = aParts[i] || 0;
18+
const bPart = bParts[i] || 0;
19+
20+
if (aPart < bPart) return -1;
21+
if (aPart > bPart) return 1;
22+
}
23+
24+
return 0;
25+
}
26+
27+
// Check if version is >= minimum version
28+
function isVersionAtLeast(version: string, minimumVersion: string): boolean {
29+
return compareSemver(version, minimumVersion) >= 0;
30+
}
31+
32+
export async function loadVersions(releasesJsonUrl: string, targetId: string): Promise<void> {
33+
const response = await fetch(releasesJsonUrl);
34+
if (!response.ok) {
35+
console.error(`HTTP error! status: ${response.status}`);
36+
return;
37+
}
38+
const data: ReleasesData = await response.json();
39+
40+
const versionList = document.getElementById(targetId);
41+
if (!versionList) {
42+
console.error(`Version list element not found with id: ${targetId}`);
43+
return;
44+
}
45+
46+
const ul = document.createElement('ul');
47+
versionList.append(ul);
48+
49+
// Filter releases to only include versions >= 0.4.0
50+
const filteredReleases = data.releases.filter(release => {
51+
const version = release.version.replace('v', '');
52+
return isVersionAtLeast(version, '0.4.0');
53+
});
54+
55+
// Sort releases in descending order (newest first) using semantic versioning
56+
const sortedReleases = filteredReleases.sort((a, b) => {
57+
const aVersion = a.version.replace('v', '');
58+
const bVersion = b.version.replace('v', '');
59+
return compareSemver(bVersion, aVersion); // Reverse order for descending
60+
});
61+
62+
sortedReleases.forEach(release => {
63+
const li = document.createElement('li');
64+
const link = document.createElement('a');
65+
link.href = release.url;
66+
link.textContent = release.version;
67+
68+
li.appendChild(link);
69+
ul.appendChild(li);
70+
});
71+
}

eleventy.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ export default async function(eleventyConfig) {
44
eleventyConfig.setInputDirectory("docs");
55
eleventyConfig.setOutputDirectory("_site");
66
eleventyConfig.addPassthroughCopy("docs/images/*");
7+
eleventyConfig.addPassthroughCopy("docs/scripts/**/*.js");
8+
eleventyConfig.addPassthroughCopy("docs/releases.json");
79

810
const options = {
911
jsTruthy: true,
@@ -13,5 +15,6 @@ export default async function(eleventyConfig) {
1315
root: ["./docs"],
1416
};
1517

18+
eleventyConfig.addGlobalData("env", process.env.ELEVENTY_ENV);
1619
eleventyConfig.setLibrary("liquid", new Liquid(options));
1720
};

0 commit comments

Comments
 (0)