Skip to content

Commit 97784dd

Browse files
authored
Feat/release notes (ionic-team#1976)
* Build(release notes): Generating json file * feat(): Release Notes page working and styled * remove stencil dep
1 parent 3db84f5 commit 97784dd

File tree

9 files changed

+908
-14082
lines changed

9 files changed

+908
-14082
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
.env.development.local
1515
.env.test.local
1616
.env.production.local
17+
.env
1718

1819
npm-debug.log*
1920
yarn-debug.log*

docs/reference/release-notes.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
---
2-
template: release-notes
2+
title: Release Notes
33
---
44

5-
# Release Notes
5+
import ReleaseNotes from '@site/src/components/ReleaseNotes';
6+
7+
<ReleaseNotes />

package-lock.json

+22-14,076
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"serve": "docusaurus serve",
1616
"clear": "docusaurus clear",
1717
"crowdin:sync": "docusaurus write-translations && crowdin upload && crowdin download",
18-
"generate-markdown": "concurrently \"node scripts/api\" \"node scripts/cli\" \"node scripts/native\""
18+
"generate-markdown": "concurrently \"node scripts/api\" \"node scripts/cli\" \"node scripts/native\" \"node scripts/release-notes\""
1919
},
2020
"dependencies": {
2121
"@crowdin/cli": "^3.6.1",
@@ -54,6 +54,10 @@
5454
"@types/react": "^17.0.11",
5555
"@types/react-helmet": "^6.1.1",
5656
"@types/react-router-dom": "^5.1.7",
57+
"dotenv": "^10.0.0",
58+
"fs-extra": "^9.1.0",
59+
"remark-parse": "^8.0.3",
60+
"semver": "^7.3.5",
5761
"typescript": "^4.3.2"
5862
}
5963
}

scripts/release-notes.js

+283
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,283 @@
1+
const dotenv = require('dotenv');
2+
const { outputJson } = require('fs-extra');
3+
const fetch = require('node-fetch');
4+
const { resolve } = require('path');
5+
const semver = require('semver');
6+
const url = require('url');
7+
8+
const { renderMarkdown } = require('./utils.js');
9+
10+
dotenv.config();
11+
12+
const OUTPUT_PATH = resolve(
13+
__dirname,
14+
'../src/components/ReleaseNotes/release-notes.json'
15+
);
16+
17+
// export default {
18+
// title: 'Build Release Notes data',
19+
// task: async () => outputJson(OUTPUT_PATH, await getReleases(), { spaces: 2 })
20+
// };
21+
22+
// Get the GitHub Releases from Ionic
23+
// This requires an environment GITHUB_TOKEN
24+
// otherwise it may fail silently
25+
const getReleases = async () => {
26+
try {
27+
const request = await fetch(
28+
url.format({
29+
protocol: 'https',
30+
hostname: 'api.github.com',
31+
pathname: 'repos/ionic-team/ionic/releases'
32+
}), {
33+
headers: {
34+
'Authorization': process.env.GITHUB_TOKEN !== undefined ? `token ${process.env.GITHUB_TOKEN}` : ''
35+
}
36+
}
37+
);
38+
39+
const releases = await request.json();
40+
41+
// Check that the response is an array in case it was
42+
// successful but returned an object
43+
if (Array.isArray(releases)) {
44+
return releases.filter(release => {
45+
const releasePattern = /^v(\d+)\.(\d+)\.(\d+)$/;
46+
47+
// All non-prerelease, non-alpha, non-beta, non-rc release
48+
return releasePattern.test(release.tag_name);
49+
}).map(release => {
50+
const body = renderMarkdown(release.body).contents;
51+
const published_at = parseDate(release.published_at);
52+
const version = release.tag_name.replace('v', '');
53+
const type = getVersionType(version);
54+
const symbol = getVersionSymbol(version);
55+
const element = getVersionElement(version);
56+
const { name, tag_name } = release;
57+
58+
return {
59+
body,
60+
element,
61+
name,
62+
published_at,
63+
symbol,
64+
tag_name,
65+
type,
66+
version
67+
};
68+
}).sort((a, b) => {
69+
return -semver.compare(a.tag_name, b.tag_name);
70+
});
71+
} else {
72+
return [];
73+
}
74+
} catch (error) {
75+
return [];
76+
}
77+
};
78+
79+
// Takes the date in format 2019-04-26T18:24:09Z
80+
// and returns it as April 26 2019
81+
function parseDate(datetime) {
82+
const date = new Date(datetime);
83+
return date.toLocaleString('en-us', { month: 'long' }) + ' ' + date.getDate() + ' ' + date.getFullYear();
84+
};
85+
86+
// Given a version, return if it is a
87+
// major, minor, or patch release
88+
function getVersionType(version) {
89+
const releasePattern = /^(\d+)\.(\d+)\.(\d+)$/;
90+
91+
let type = 'patch';
92+
93+
if (!releasePattern.test(version)) {
94+
type = 'prerelease';
95+
} else if (version.endsWith('.0.0')) {
96+
type = 'major';
97+
} else if (version.endsWith('.0')) {
98+
type = 'minor';
99+
}
100+
101+
return type;
102+
};
103+
104+
// Given a version, return its element symbol
105+
function getVersionSymbol(version) {
106+
const filteredVersions = versions.filter(
107+
v => version.startsWith(`${v.minor}.`)
108+
);
109+
filteredVersions.unshift(fallbackVersion);
110+
111+
return filteredVersions[filteredVersions.length - 1].symbol;
112+
};
113+
114+
// Given a version, return its element name
115+
function getVersionElement(version) {
116+
const filteredVersions = versions.filter(
117+
v => version.startsWith(`${v.minor}.`)
118+
);
119+
filteredVersions.unshift(fallbackVersion);
120+
121+
return filteredVersions[filteredVersions.length - 1].element;
122+
};
123+
124+
var versions = [
125+
{
126+
'minor': '4.0',
127+
'symbol': 'N',
128+
'element': 'Neutronium'
129+
},
130+
{
131+
'minor': '4.1',
132+
'symbol': 'H',
133+
'element': 'Hydrogen'
134+
},
135+
{
136+
'minor': '4.2',
137+
'symbol': 'He',
138+
'element': 'Helium'
139+
},
140+
{
141+
'minor': '4.3',
142+
'symbol': 'Li',
143+
'element': 'Lithium'
144+
},
145+
{
146+
'minor': '4.4',
147+
'symbol': 'Be',
148+
'element': 'Beryllium'
149+
},
150+
{
151+
'minor': '4.5',
152+
'symbol': 'B',
153+
'element': 'Boron'
154+
},
155+
{
156+
'minor': '4.6',
157+
'symbol': 'C',
158+
'element': 'Carbon'
159+
},
160+
{
161+
'minor': '4.7',
162+
'symbol': 'N',
163+
'element': 'Nitrogen'
164+
},
165+
{
166+
'minor': '4.8',
167+
'symbol': 'O',
168+
'element': 'Oxygen'
169+
},
170+
{
171+
'minor': '4.9',
172+
'symbol': 'F',
173+
'element': 'Fluorine'
174+
},
175+
{
176+
'minor': '4.10',
177+
'symbol': 'Ne',
178+
'element': 'Neon'
179+
},
180+
{
181+
'minor': '4.11',
182+
'symbol': 'Na',
183+
'element': 'Sodium'
184+
},
185+
{
186+
'minor': '5.0',
187+
'symbol': 'Mg',
188+
'element': 'Magnesium'
189+
},
190+
{
191+
'minor': '5.1',
192+
'symbol': 'Al',
193+
'element': 'Aluminium'
194+
},
195+
{
196+
'minor': '5.2',
197+
'symbol': 'Si',
198+
'element': 'Silicon'
199+
},
200+
{
201+
'minor': '5.3',
202+
'symbol': 'P',
203+
'element': 'Phosphorus'
204+
},
205+
{
206+
'minor': '5.4',
207+
'symbol': 'S',
208+
'element': 'Sulfur'
209+
},
210+
{
211+
'minor': '5.5',
212+
'symbol': 'Cl',
213+
'element': 'Chlorine'
214+
},
215+
{
216+
'minor': '5.6',
217+
'symbol': 'Ar',
218+
'element': 'Argon'
219+
},
220+
{
221+
'minor': '5.7',
222+
'symbol': 'K',
223+
'element': 'Potassium'
224+
},
225+
{
226+
'minor': '5.8',
227+
'symbol': 'Ca',
228+
'element': 'Calcium'
229+
},
230+
{
231+
'minor': '5.9',
232+
'symbol': 'Sc',
233+
'element': 'Scandium'
234+
},
235+
{
236+
'minor': '5.10',
237+
'symbol': 'Ti',
238+
'element': 'Titanium'
239+
},
240+
{
241+
'minor': '5.11',
242+
'symbol': 'V',
243+
'element': 'Vanadium'
244+
},
245+
{
246+
'minor': '5.12',
247+
'symbol': 'Cr',
248+
'element': 'Chromium'
249+
},
250+
{
251+
'minor': '5.13',
252+
'symbol': 'Mn',
253+
'element': 'Manganese'
254+
},
255+
{
256+
'minor': '5.14',
257+
'symbol': 'Fe',
258+
'element': 'Iron'
259+
},
260+
{
261+
'minor': '5.15',
262+
'symbol': 'Co',
263+
'element': 'Cobalt'
264+
},
265+
{
266+
'minor': '5.16',
267+
'symbol': 'Ni',
268+
'element': 'Nickel'
269+
},
270+
{
271+
'minor': '5.17',
272+
'symbol': 'Cu',
273+
'element': 'Copper'
274+
}
275+
];
276+
277+
var fallbackVersion = { 'minor': '9201', 'symbol': 'Uo', 'element': 'Unobtainium' };
278+
279+
async function run() {
280+
outputJson(OUTPUT_PATH, await getReleases(), { spaces: 2 })
281+
};
282+
283+
run();

scripts/utils.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
var unified = require('unified')
2-
var markdown = require('remark-parse')
3-
var html = require('remark-html')
1+
const unified = require('unified')
2+
const markdown = require('remark-parse')
3+
const html = require('remark-html')
44

55
function renderMarkdown(markdownString) {
66
return unified()

0 commit comments

Comments
 (0)