11import { UnityChangeset as UnityChangesetClass } from "./unityChangeset.ts" ;
2+ import { getUnityReleases , UnityReleaseStream } from "./unityGraphQL.ts" ;
23
34export const UnityChangeset = UnityChangesetClass ;
45export type UnityChangeset = UnityChangesetClass ;
56
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-
277/*
288 * Get an Unity changeset from specific Unity version.
299 * @param version The Unity version.
@@ -32,35 +12,13 @@ const UNITY_RELEASE_URLS: { [key: string]: string } = {
3212export async function getUnityChangeset (
3313 version : string ,
3414) : 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 ] ;
5619 }
5720
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.` ) ;
6422}
6523
6624/*
@@ -143,6 +101,9 @@ export function listChangesets(
143101) : Promise < string > {
144102 return searchChangesets ( searchMode )
145103 . then ( ( results ) => filterChangesets ( results , filterOptions ) )
104+ . then ( ( results ) =>
105+ results . sort ( ( a , b ) => b . versionNumber - a . versionNumber )
106+ )
146107 . then ( ( results ) => groupChangesets ( results , groupMode ) )
147108 . then ( ( results ) => {
148109 switch ( outputMode ) {
@@ -174,51 +135,22 @@ export function listChangesets(
174135 } ) ;
175136}
176137
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 (
198139 searchMode : SearchMode ,
199140) : 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-
213141 switch ( searchMode ) {
214142 case SearchMode . All :
215- return allResults ;
143+ return getUnityReleases ( "." , [ ] ) ;
216144 case SearchMode . Default :
217- return allResults
218- . filter ( ( c ) => ! c . preRelease ) ;
145+ return getUnityReleases ( "." , [
146+ UnityReleaseStream . LTS ,
147+ UnityReleaseStream . TECH ,
148+ ] ) ;
219149 case SearchMode . PreRelease :
220- return allResults
221- . filter ( ( c ) => c . preRelease ) ;
150+ return getUnityReleases ( "." , [
151+ UnityReleaseStream . BETA ,
152+ UnityReleaseStream . ALPHA ,
153+ ] ) ;
222154 default :
223155 throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
224156 }
0 commit comments