1
1
import { UnityChangeset as UnityChangesetClass } from "./unityChangeset.ts" ;
2
+ import { getUnityReleases , UnityReleaseStream } from "./unityGraphQL.ts" ;
2
3
3
4
export const UnityChangeset = UnityChangesetClass ;
4
5
export type UnityChangeset = UnityChangesetClass ;
5
6
6
- const REGEXP_HUB_LINKS = / u n i t y h u b : \/ \/ \d { 4 } \. \d + \. \d + ( a | b | f ) \d + \/ \w { 12 } / g;
7
- const REGEXP_UNITY_VERSION = / \d { 4 } \. \d + \. \d + ( a | b | f ) \d + / g;
8
- const UNITY_CHANGESETS_DB_URL =
9
- "https://mob-sakai.github.io/unity-changeset/db" ;
10
- const UNITY_RSS_URLS : string [ ] = [
11
- "https://unity.com/releases/editor/lts-releases.xml" ,
12
- "https://unity.com/releases/editor/tech-and-preview-releases.xml" ,
13
- "https://unity.com/releases/editor/beta-releases.xml" ,
14
- "https://unity.com/releases/editor/alpha-releases.xml" ,
15
- ] ;
16
-
17
- /*
18
- Unity release URLs for each lifecycle.
19
- */
20
- const UNITY_RELEASE_URLS : { [ key : string ] : string } = {
21
- "p" : "https://unity.com/releases/editor/whats-new/" ,
22
- "f" : "https://unity.com/releases/editor/whats-new/" ,
23
- "a" : "https://unity.com/releases/editor/alpha/" ,
24
- "b" : "https://unity.com/releases/editor/beta/" ,
25
- } ;
26
-
27
7
/*
28
8
* Get an Unity changeset from specific Unity version.
29
9
* @param version The Unity version.
@@ -32,35 +12,13 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
32
12
export async function getUnityChangeset (
33
13
version : string ,
34
14
) : Promise < UnityChangeset > {
35
- const db = await loadDb ( ) ;
36
- const results = db . filter ( ( c ) => c . version === version ) ;
37
- return results . length > 0
38
- ? results [ 0 ]
39
- : getUnityChangesetFromReleasePage ( version ) ;
40
- }
41
-
42
- async function getUnityChangesetFromReleasePage (
43
- version : string ,
44
- ) : Promise < UnityChangeset > {
45
- const match = version . match ( / ^ ( \d + \. \d + \. \d + ) ( a | b | f | p ) \d + $ / ) ;
46
- const lifecycle = match ?. [ 2 ] as string ;
47
- const releaseUrl = UNITY_RELEASE_URLS [ lifecycle ] ;
48
- const shortVersion = match ?. [ 1 ] as string ;
49
- const releasePageUrl = releaseUrl +
50
- ( lifecycle == "f" ? shortVersion : version ) ;
51
- const response = await fetch ( releasePageUrl ) ;
52
- const text = await response . text ( ) ;
53
- const matchLink = text . match ( REGEXP_HUB_LINKS ) ;
54
- if ( ! matchLink ) {
55
- throw new Error ( `No changeset found at '${ releasePageUrl } '` ) ;
15
+ const changesets = ( await getUnityReleases ( version , [ ] ) )
16
+ . filter ( ( c ) => c . version === version ) ;
17
+ if ( 0 < changesets . length ) {
18
+ return changesets [ 0 ] ;
56
19
}
57
20
58
- const changeset = UnityChangeset . createFromHref ( matchLink [ 0 ] ) ;
59
- if ( changeset . version !== version ) {
60
- throw new Error ( `No changeset found at '${ releasePageUrl } '` ) ;
61
- }
62
-
63
- return changeset ;
21
+ throw Error ( `The given version '${ version } ' was not found.` ) ;
64
22
}
65
23
66
24
/*
@@ -143,6 +101,9 @@ export function listChangesets(
143
101
) : Promise < string > {
144
102
return searchChangesets ( searchMode )
145
103
. then ( ( results ) => filterChangesets ( results , filterOptions ) )
104
+ . then ( ( results ) =>
105
+ results . sort ( ( a , b ) => b . versionNumber - a . versionNumber )
106
+ )
146
107
. then ( ( results ) => groupChangesets ( results , groupMode ) )
147
108
. then ( ( results ) => {
148
109
switch ( outputMode ) {
@@ -174,51 +135,22 @@ export function listChangesets(
174
135
} ) ;
175
136
}
176
137
177
- async function loadDb ( ) : Promise < UnityChangeset [ ] > {
178
- const response = await fetch ( UNITY_CHANGESETS_DB_URL ) ;
179
- const text = await response . text ( ) ;
180
- const lines = text . split ( "\n" ) ;
181
- return lines
182
- . map ( ( line ) => UnityChangeset . createFromDb ( line ) ) ;
183
- }
184
-
185
- async function findVersions ( url : string ) : Promise < string [ ] > {
186
- const response = await fetch ( url ) ;
187
- const text = await response . text ( ) ;
188
- const lines = text . split ( "\n" ) ;
189
-
190
- const versions = lines
191
- . map ( ( l ) => l . match ( REGEXP_UNITY_VERSION ) )
192
- . filter ( ( m ) => m )
193
- . map ( ( m ) => m ?. [ 0 ] as string ) ;
194
- return Array . from ( new Set < string > ( versions ) ) ;
195
- }
196
-
197
- export async function searchChangesets (
138
+ export function searchChangesets (
198
139
searchMode : SearchMode ,
199
140
) : Promise < UnityChangeset [ ] > {
200
- const results = await loadDb ( ) ;
201
- const versions = await Promise . all ( UNITY_RSS_URLS
202
- . map ( ( url ) => findVersions ( url ) ) ) ;
203
- const appendResults = await Promise . all (
204
- versions
205
- . flat ( )
206
- . filter ( ( v ) => ! results . some ( ( r ) => r . version === v ) )
207
- . map ( ( v ) => getUnityChangesetFromReleasePage ( v ) ) ,
208
- ) ;
209
- const allResults = results
210
- . concat ( appendResults )
211
- . sort ( ( a , b ) => b . versionNumber - a . versionNumber ) ;
212
-
213
141
switch ( searchMode ) {
214
142
case SearchMode . All :
215
- return allResults ;
143
+ return getUnityReleases ( "." , [ ] ) ;
216
144
case SearchMode . Default :
217
- return allResults
218
- . filter ( ( c ) => ! c . preRelease ) ;
145
+ return getUnityReleases ( "." , [
146
+ UnityReleaseStream . LTS ,
147
+ UnityReleaseStream . TECH ,
148
+ ] ) ;
219
149
case SearchMode . PreRelease :
220
- return allResults
221
- . filter ( ( c ) => c . preRelease ) ;
150
+ return getUnityReleases ( "." , [
151
+ UnityReleaseStream . BETA ,
152
+ UnityReleaseStream . ALPHA ,
153
+ ] ) ;
222
154
default :
223
155
throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
224
156
}
0 commit comments