-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.js
63 lines (55 loc) · 2.4 KB
/
build.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { readFileSync, readdirSync, writeFileSync, existsSync, mkdirSync } from 'fs';
import { JSDOM } from 'jsdom';
import { compareVersions, compare } from 'compare-versions';
function getCompatibility(feature, version) {
const isMet = compare(version, feature.added, '>=');
const isRemoved = feature.removed && compare(version, feature.removed, '>=');
const isDeprecated = feature.deprecated && compare(version, feature.deprecated, '>=');
if (!isMet) {
return false;
}
if (isDeprecated) {
return 'deprecated';
}
return !isRemoved;
}
function orderByVersion(a, b) {
if (a.added === b.added) {
if (a.removed === b.removed) {
return a.title.localeCompare(b.title);
}
return compareVersions(b.removed ?? '99.99', a.removed ?? '99.99');
}
return compareVersions(b.added, a.added);
}
const moodleVersions = ["3.11", "4.0", "4.1", "4.2", "4.3", "4.4", "4.5"];
const featureFiles = readdirSync('./features/').filter((file) => file.endsWith('.json')).map((file) => `./features/${file}`);
const features = featureFiles.reduce((carry, file) => {
const feature = JSON.parse(readFileSync(file).toString());
const compatibility = moodleVersions.reduce((carry, version) => {
carry[version] = getCompatibility(feature, version);
return carry;
}, {});
const available_in = Object.entries(compatibility).filter(([version, compat]) => compat === true).map(([version]) => version);
const deprecated_in = Object.entries(compatibility).filter(([version, compat]) => compat === 'deprecated').map(([version]) => version);
const unavailable_in = Object.entries(compatibility).filter(([version, compat]) => compat === false).map(([version]) => version);
carry.push({
...feature,
id: file.replace('.json', '').replace('./features/', ''),
description_html: (feature.description ?? '').replace(/`([^`]+)`/g, '<code>$1</code>'),
notes_html: (feature.notes ?? '').replace(/`([^`]+)`/g, '<code>$1</code>'),
compatibility,
available_in,
deprecated_in,
unavailable_in,
});
return carry;
}, []).sort(orderByVersion);
const dom = await JSDOM.fromFile('src/index.html');
const document = dom.window.document;
document.getElementById('features-json').innerHTML = JSON.stringify(features);
document.getElementById('versions-json').innerHTML = JSON.stringify(moodleVersions);
if (!existsSync('./dist')) {
mkdirSync('./dist');
}
writeFileSync('./dist/index.html', dom.serialize());