@xrow/docusaurus-changelog 4.159.2 → 4.161.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/index.d.ts +2 -0
- package/index.js +31 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,6 +6,13 @@ Render a GitLab releases Atom feed in Docusaurus MDX.
|
|
|
6
6
|
<Changelog url="https://gitlab.com/group/project/-/releases.atom">Changelog</Changelog>
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
+
Use the GitLab releases API when the page is served from another domain, because
|
|
10
|
+
GitLab enables browser CORS headers for API responses.
|
|
11
|
+
|
|
12
|
+
```mdx
|
|
13
|
+
<Changelog url="https://gitlab.com/api/v4/projects/group%2Fproject/releases?per_page=10">Changelog</Changelog>
|
|
14
|
+
```
|
|
15
|
+
|
|
9
16
|
The CI Tools Docusaurus build image registers the component in Docusaurus
|
|
10
17
|
`MDXComponents` automatically when the site does not provide a custom
|
|
11
18
|
`src/theme/MDXComponents/index.js`.
|
package/index.d.ts
CHANGED
|
@@ -15,4 +15,6 @@ export interface ChangelogProps {
|
|
|
15
15
|
|
|
16
16
|
export function releasesFromAtomDocument(document: Document): ReleaseEntry[];
|
|
17
17
|
|
|
18
|
+
export function releasesFromGitLabApiResponse(releases: unknown[]): ReleaseEntry[];
|
|
19
|
+
|
|
18
20
|
export default function Changelog(props: ChangelogProps): ReactNode;
|
package/index.js
CHANGED
|
@@ -24,6 +24,30 @@ export function releasesFromAtomDocument(document) {
|
|
|
24
24
|
}));
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
function plainSummary(value) {
|
|
28
|
+
return (value ?? '')
|
|
29
|
+
.split('\n')
|
|
30
|
+
.map((line) => line.trim())
|
|
31
|
+
.find(Boolean)
|
|
32
|
+
?.replace(/!\[[^\]]*]\([^)]+\)/g, '')
|
|
33
|
+
.replace(/\[([^\]]+)]\([^)]+\)/g, '$1')
|
|
34
|
+
.replace(/^[#>*\-\s]+/, '')
|
|
35
|
+
.trim() ?? '';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function releasesFromGitLabApiResponse(releases) {
|
|
39
|
+
if (!Array.isArray(releases)) {
|
|
40
|
+
throw new Error('GitLab releases API response must be an array.');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return releases.map((release) => ({
|
|
44
|
+
title: release.name || release.tag_name || 'Untitled release',
|
|
45
|
+
href: release?._links?.self || release?.assets?.links?.[0]?.url || '',
|
|
46
|
+
updated: release.released_at || release.created_at || '',
|
|
47
|
+
summary: plainSummary(release.description),
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
|
|
27
51
|
function parseAtomFeed(text) {
|
|
28
52
|
if (typeof DOMParser === 'undefined') {
|
|
29
53
|
throw new Error('DOMParser is not available in this environment.');
|
|
@@ -80,12 +104,16 @@ export default function Changelog({url, children, limit = 10}) {
|
|
|
80
104
|
if (!response.ok) {
|
|
81
105
|
throw new Error(`Release feed returned HTTP ${response.status}.`);
|
|
82
106
|
}
|
|
83
|
-
|
|
107
|
+
const contentType = response.headers.get('content-type') || '';
|
|
108
|
+
if (contentType.includes('application/json')) {
|
|
109
|
+
return response.json().then(releasesFromGitLabApiResponse);
|
|
110
|
+
}
|
|
111
|
+
return response.text().then(parseAtomFeed);
|
|
84
112
|
})
|
|
85
|
-
.then((
|
|
113
|
+
.then((releases) => {
|
|
86
114
|
setState({
|
|
87
115
|
status: 'ready',
|
|
88
|
-
releases:
|
|
116
|
+
releases: releases.slice(0, limit),
|
|
89
117
|
error: '',
|
|
90
118
|
});
|
|
91
119
|
})
|