@@ -14,6 +14,8 @@ interface GitHubReleaseResponse {
1414 name : string | null
1515 published_at : string | null
1616 tag_name : string
17+ draft ?: boolean
18+ prerelease ?: boolean
1719}
1820
1921export interface GitHubUpdateVersions {
@@ -23,27 +25,64 @@ export interface GitHubUpdateVersions {
2325 systemRelease : GitHubReleaseDetails
2426}
2527
28+ const MONOREPO = 'mx-space/core'
29+ const ADMIN_PREFIX = 'admin-v'
30+ const SYSTEM_PREFIX = 'v'
31+
2632export async function checkUpdateFromGitHub ( ) : Promise < GitHubUpdateVersions > {
2733 const [ systemRelease , dashboardRelease ] = await Promise . all ( [
28- fetchRelease ( 'mx-server' , 'latest ') ,
29- fetchRelease ( 'mx-admin' , 'latest ') ,
34+ fetchLatestRelease ( 'mx-server' ) ,
35+ fetchLatestRelease ( 'mx-admin' ) ,
3036 ] )
3137
3238 return {
33- dashboard : normalizeVersion ( dashboardRelease . tagName ) ,
39+ dashboard : stripPrefix ( dashboardRelease . tagName , 'mx-admin' ) ,
3440 dashboardRelease,
35- system : normalizeVersion ( systemRelease . tagName ) ,
41+ system : stripPrefix ( systemRelease . tagName , 'mx-server' ) ,
3642 systemRelease,
3743 }
3844}
3945
4046export function getReleaseDetails ( repo : UpdateRepo , version : string ) {
41- return fetchRelease ( repo , `tags/v${ normalizeVersion ( version ) } ` )
47+ const tag =
48+ repo === 'mx-admin'
49+ ? `${ ADMIN_PREFIX } ${ normalizeVersion ( version ) } `
50+ : `${ SYSTEM_PREFIX } ${ normalizeVersion ( version ) } `
51+ return fetchReleaseByTag ( tag )
4252}
4353
44- async function fetchRelease ( repo : UpdateRepo , release : 'latest' | string ) {
54+ async function fetchLatestRelease (
55+ repo : UpdateRepo ,
56+ ) : Promise < GitHubReleaseDetails > {
4557 const response = await fetch (
46- `https://api.github.com/repos/mx-space/${ repo } /releases/${ release } ` ,
58+ `https://api.github.com/repos/${ MONOREPO } /releases?per_page=50` ,
59+ {
60+ headers : {
61+ accept : 'application/vnd.github+json' ,
62+ } ,
63+ } ,
64+ )
65+
66+ if ( ! response . ok ) {
67+ throw new Error ( `GitHub release request failed: ${ response . status } ` )
68+ }
69+
70+ const releases = ( await response . json ( ) ) as GitHubReleaseResponse [ ]
71+ const match = releases . find (
72+ ( release ) =>
73+ ! release . draft &&
74+ ! release . prerelease &&
75+ matchesRepo ( release . tag_name , repo ) ,
76+ )
77+ if ( ! match ) {
78+ throw new Error ( `No ${ repo } release found in ${ MONOREPO } ` )
79+ }
80+ return mapRelease ( match )
81+ }
82+
83+ async function fetchReleaseByTag ( tag : string ) : Promise < GitHubReleaseDetails > {
84+ const response = await fetch (
85+ `https://api.github.com/repos/${ MONOREPO } /releases/tags/${ tag } ` ,
4786 {
4887 headers : {
4988 accept : 'application/vnd.github+json' ,
@@ -58,6 +97,16 @@ async function fetchRelease(repo: UpdateRepo, release: 'latest' | string) {
5897 return mapRelease ( ( await response . json ( ) ) as GitHubReleaseResponse )
5998}
6099
100+ function matchesRepo ( tagName : string , repo : UpdateRepo ) {
101+ if ( repo === 'mx-admin' ) return tagName . startsWith ( ADMIN_PREFIX )
102+ return tagName . startsWith ( SYSTEM_PREFIX ) && ! tagName . startsWith ( ADMIN_PREFIX )
103+ }
104+
105+ function stripPrefix ( tagName : string , repo : UpdateRepo ) {
106+ const prefix = repo === 'mx-admin' ? ADMIN_PREFIX : SYSTEM_PREFIX
107+ return tagName . startsWith ( prefix ) ? tagName . slice ( prefix . length ) : tagName
108+ }
109+
61110function mapRelease ( release : GitHubReleaseResponse ) : GitHubReleaseDetails {
62111 return {
63112 body : release . body ,
0 commit comments