Skip to content

Commit a5d021e

Browse files
committed
chore(docs): add versioned documentation with auto-detection
Close #675
1 parent 287dedb commit a5d021e

File tree

5 files changed

+487
-10
lines changed

5 files changed

+487
-10
lines changed

.github/scripts/merge-versions.mjs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#!/usr/bin/env node
2+
3+
/**
4+
* Merge versions.json for documentation deployment
5+
*
6+
* This script merges existing versions from S3 with newly deployed versions,
7+
* ensuring the version selector shows all available documentation versions.
8+
*/
9+
10+
import { readFileSync, writeFileSync } from 'fs';
11+
12+
const VERSIONS_ORDER = {
13+
latest: 0,
14+
preview: 1
15+
};
16+
17+
/**
18+
* Parse version number for sorting (e.g., "v2" -> 2)
19+
*/
20+
function parseVersionNumber(version) {
21+
const match = version.match(/^v(\d+)/);
22+
return match ? parseInt(match[1], 10) : 999;
23+
}
24+
25+
/**
26+
* Sort versions in the correct order:
27+
* 1. latest
28+
* 2. preview
29+
* 3. v2, v1 (descending)
30+
*/
31+
function sortVersions(versions) {
32+
return versions.sort((a, b) => {
33+
const orderA = VERSIONS_ORDER[a.version] ?? 1000 + parseVersionNumber(a.version);
34+
const orderB = VERSIONS_ORDER[b.version] ?? 1000 + parseVersionNumber(b.version);
35+
36+
// For version numbers, sort descending (higher versions first)
37+
if (orderA >= 1000 && orderB >= 1000) {
38+
return orderB - orderA;
39+
}
40+
41+
return orderA - orderB;
42+
});
43+
}
44+
45+
/**
46+
* Merge existing and new versions, removing duplicates
47+
*/
48+
function mergeVersions(existingVersions, newVersions) {
49+
const versionMap = new Map();
50+
51+
// Add existing versions
52+
for (const version of existingVersions) {
53+
versionMap.set(version.version, version);
54+
}
55+
56+
// Add/update with new versions
57+
for (const version of newVersions) {
58+
versionMap.set(version.version, version);
59+
}
60+
61+
const merged = Array.from(versionMap.values());
62+
return sortVersions(merged);
63+
}
64+
65+
/**
66+
* Main execution
67+
*/
68+
function main() {
69+
const args = process.argv.slice(2);
70+
71+
if (args.length !== 3) {
72+
console.error(
73+
'Usage: merge-versions.mjs <existing-versions-file> <new-versions-file> <output-file>'
74+
);
75+
process.exit(1);
76+
}
77+
78+
const [existingFile, newFile, outputFile] = args;
79+
80+
// Read existing versions
81+
let existingVersions = [];
82+
try {
83+
const content = readFileSync(existingFile, 'utf-8');
84+
existingVersions = JSON.parse(content);
85+
console.log(`Loaded ${existingVersions.length} existing versions`);
86+
} catch (error) {
87+
if (error.code === 'ENOENT') {
88+
console.log('No existing versions file found, starting fresh');
89+
} else {
90+
console.error('Error reading existing versions:', error.message);
91+
process.exit(1);
92+
}
93+
}
94+
95+
// Read new versions
96+
let newVersions = [];
97+
try {
98+
const content = readFileSync(newFile, 'utf-8');
99+
newVersions = JSON.parse(content);
100+
console.log(`Loaded ${newVersions.length} new versions to deploy`);
101+
} catch (error) {
102+
console.error('Error reading new versions:', error.message);
103+
process.exit(1);
104+
}
105+
106+
// Merge and sort
107+
const mergedVersions = mergeVersions(existingVersions, newVersions);
108+
console.log(`Merged result: ${mergedVersions.length} total versions`);
109+
console.log('Version order:', mergedVersions.map(v => v.version).join(', '));
110+
111+
// Write output
112+
try {
113+
writeFileSync(outputFile, JSON.stringify(mergedVersions, null, 2));
114+
console.log(`Successfully wrote merged versions to ${outputFile}`);
115+
} catch (error) {
116+
console.error('Error writing output:', error.message);
117+
process.exit(1);
118+
}
119+
}
120+
121+
main();

0 commit comments

Comments
 (0)