@@ -4,15 +4,12 @@ export const UnityChangeset = UnityChangesetClass;
4
4
export type UnityChangeset = UnityChangesetClass ;
5
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 UNITY_ARCHIVE_URL = "https://unity.com/releases/editor/archive" ;
8
- const UNITY_RSS_URL = "https://unity.com/releases/editor/releases.xml" ;
9
- const UNITY_BETA_RSS_URL = "https://unity.com/releases/editor/beta/latest.xml" ;
10
- const UNITY_LTS_RSS_URL = "https://unity.com/releases/editor/lts-releases.xml" ;
11
7
12
8
/*
13
9
Unity release URLs for each lifecycle.
14
10
*/
15
11
const UNITY_RELEASE_URLS : { [ key : string ] : string } = {
12
+ "p" : "https://unity.com/releases/editor/whats-new/" ,
16
13
"f" : "https://unity.com/releases/editor/whats-new/" ,
17
14
"a" : "https://unity.com/releases/editor/alpha/" ,
18
15
"b" : "https://unity.com/releases/editor/beta/" ,
@@ -24,70 +21,50 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
24
21
* @returns An Unity changeset.
25
22
*/
26
23
export async function getUnityChangeset (
24
+ db : string ,
27
25
version : string ,
28
26
) : Promise < UnityChangeset > {
29
- const match = version . match ( / ^ ( \d { 4 } \. \d + \. \d + ) ( a | b | f ) \d + $ / ) ;
27
+ let results = await loadDb ( db , version ) ;
28
+ if ( 0 < results . length ) {
29
+ return results [ 0 ] ;
30
+ }
31
+
32
+ const match = version . match ( / ^ ( \d \. \d + \. \d + ) ( a | b | f | p ) \d + $ / ) ;
30
33
const lifecycle = match ?. [ 2 ] as string ;
31
34
const releaseUrl = UNITY_RELEASE_URLS [ lifecycle ] ;
32
-
33
- let results = [ ] ;
34
35
if ( lifecycle == "f" ) {
35
36
const shortVersion = match ?. [ 1 ] as string ;
36
37
results = ( await getUnityChangesetsFromUrl ( releaseUrl + shortVersion ) )
37
38
. filter ( ( c ) => c . version === version ) ;
38
- if ( 0 < results . length ) return results [ 0 ] ;
39
-
40
- results = ( await scrapeArchivedChangesets ( ) )
41
- . filter ( ( c ) => c . version === version ) ;
42
- if ( 0 < results . length ) return results [ 0 ] ;
43
39
} else {
44
40
results = ( await getUnityChangesetsFromUrl ( releaseUrl + version ) )
45
41
. filter ( ( c ) => c . version === version ) ;
46
- if ( 0 < results . length ) return results [ 0 ] ;
47
42
}
48
-
49
- throw new Error ( `No changeset found for '${ version } '` ) ;
50
- }
51
43
52
- /*
53
- * Scrape the archived Unity changesets from Unity archives.
54
- * @returns The Unity changesets.
55
- */
56
- export function scrapeArchivedChangesets ( ) : Promise < UnityChangeset [ ] > {
57
- return Promise . all ( [
58
- getUnityChangesetsFromUrl ( UNITY_ARCHIVE_URL ) ,
59
- getUnityChangesetsFromUrl ( UNITY_RSS_URL ) ,
60
- getUnityChangesetsFromUrl ( UNITY_LTS_RSS_URL ) ,
61
- ] )
62
- . then ( ( results ) => {
63
- const changesets = results [ 0 ] . concat ( results [ 1 ] ) ;
64
- const ltsVersons = groupChangesets ( results [ 2 ] , GroupMode . LatestPatch )
65
- . map ( ( c ) => c . minor ) ;
66
- const unique = new Set ( ) ;
44
+ if ( 0 < results . length ) {
45
+ return results [ 0 ] ;
46
+ }
67
47
68
- return changesets
69
- . filter ( ( c ) => {
70
- const duplicated = unique . has ( c . versionNumber ) ;
71
- unique . add ( c . versionNumber ) ;
72
- return ! duplicated ;
73
- } )
74
- . map ( ( c ) => {
75
- c . lts = ltsVersons . includes ( c . minor ) ;
76
- return c ;
77
- } )
78
- . sort ( ( a , b ) => b . versionNumber - a . versionNumber ) ;
79
- } ) ;
48
+ throw new Error ( `No changeset found for '${ version } '` ) ;
80
49
}
81
50
82
- /*
83
- * Scrape the alpha/beta Unity changesets from Unity RSS feed.
84
- * @returns The Unity changesets (alpha/beta).
85
- */
86
- export function scrapeBetaChangesets ( ) : Promise < UnityChangeset [ ] > {
87
- return getUnityChangesetsFromUrl ( UNITY_BETA_RSS_URL )
88
- . then ( ( results ) =>
89
- results . sort ( ( a , b ) => b . versionNumber - a . versionNumber )
90
- ) ;
51
+ export async function loadDb (
52
+ db : string ,
53
+ version ?: string ,
54
+ ) : Promise < UnityChangeset [ ] > {
55
+ const response = await fetch ( db ) ;
56
+ const text = await response . text ( ) ;
57
+ const lines = text . split ( "\n" ) ;
58
+
59
+ if ( version ) {
60
+ const startsWith = version + "\t" ;
61
+ return lines
62
+ . filter ( ( line ) => line . startsWith ( startsWith ) )
63
+ . map ( ( line ) => UnityChangeset . createFromDb ( line ) ) ;
64
+ } else {
65
+ return lines
66
+ . map ( ( line ) => UnityChangeset . createFromDb ( line ) ) ;
67
+ }
91
68
}
92
69
93
70
function getUnityChangesetsFromUrl (
@@ -110,13 +87,13 @@ function getUnityChangesetsFromUrl(
110
87
/*
111
88
* Search mode.
112
89
*
113
- * All: All the changesets.
114
- * Archived : Only the archived changesets.
115
- * PreRelease: Only the alpha/beta changesets.
90
+ * All: All changesets.
91
+ * Default : Only non pre-release changesets.
92
+ * PreRelease: Only pre-release ( alpha/beta) changesets.
116
93
*/
117
94
export enum SearchMode {
118
95
All = 0 ,
119
- Archived = 2 ,
96
+ Default = 2 ,
120
97
PreRelease = 3 ,
121
98
}
122
99
@@ -179,13 +156,14 @@ export enum FormatMode {
179
156
}
180
157
181
158
export function listChangesets (
159
+ db : string ,
182
160
searchMode : SearchMode ,
183
161
filterOptions : FilterOptions ,
184
162
groupMode : GroupMode ,
185
163
outputMode : OutputMode ,
186
164
formatMode : FormatMode ,
187
165
) : Promise < string > {
188
- return searchChangesets ( searchMode )
166
+ return searchChangesets ( db , searchMode )
189
167
. then ( ( results ) => filterChangesets ( results , filterOptions ) )
190
168
. then ( ( results ) => groupChangesets ( results , groupMode ) )
191
169
. then ( ( results ) => {
@@ -218,20 +196,20 @@ export function listChangesets(
218
196
} ) ;
219
197
}
220
198
221
- export function searchChangesets (
199
+ export async function searchChangesets (
200
+ db : string ,
222
201
searchMode : SearchMode ,
223
202
) : Promise < UnityChangeset [ ] > {
203
+ const results = await loadDb ( db ) ;
224
204
switch ( searchMode ) {
225
205
case SearchMode . All :
226
- return Promise . all ( [
227
- scrapeArchivedChangesets ( ) ,
228
- scrapeBetaChangesets ( ) ,
229
- ] )
230
- . then ( ( r ) => r . flat ( ) ) ;
231
- case SearchMode . Archived :
232
- return scrapeArchivedChangesets ( ) ;
206
+ return results ;
207
+ case SearchMode . Default :
208
+ return results
209
+ . filter ( ( c ) => ! c . preRelease ) ;
233
210
case SearchMode . PreRelease :
234
- return scrapeBetaChangesets ( ) ;
211
+ return results
212
+ . filter ( ( c ) => c . preRelease ) ;
235
213
default :
236
214
throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
237
215
}
0 commit comments