1- import { UnityChangeset as UnityChangesetClass } from "./unityChangeset .ts" ;
1+ import { getUnityReleases , getUnityReleasesInLTS } from "./unityGraphQL .ts" ;
22import {
3- getUnityReleases ,
4- getUnityReleasesInLTS ,
3+ UnityChangeset as UnityChangesetClass ,
54 UnityReleaseEntitlement ,
65 UnityReleaseStream ,
7- } from "./unityGraphQL .ts" ;
6+ } from "./unityChangeset .ts" ;
87
8+ const UNITY_CHANGESETS_DB_URL =
9+ "https://mob-sakai.github.io/unity-changeset/dbV3" ;
910export const UnityChangeset = UnityChangesetClass ;
1011export type UnityChangeset = UnityChangesetClass ;
1112
@@ -17,7 +18,14 @@ export type UnityChangeset = UnityChangesetClass;
1718export async function getUnityChangeset (
1819 version : string ,
1920) : Promise < UnityChangeset > {
20- const changesets = ( await getUnityReleases ( version , [ ] ) ) . filter (
21+ let changesets : UnityChangeset [ ] ;
22+ try {
23+ changesets = await getUnityReleases ( version , [ ] ) ;
24+ } catch {
25+ changesets = await getAllChangesetsFromDb ( ) ;
26+ }
27+
28+ changesets = changesets . filter (
2129 ( c ) => c . version === version ,
2230 ) ;
2331 if ( 0 < changesets . length ) {
@@ -144,37 +152,25 @@ export function listChangesets(
144152 } ) ;
145153}
146154
147- export function searchChangesets (
155+ export async function searchChangesets (
148156 searchMode : SearchMode ,
149157) : Promise < UnityChangeset [ ] > {
150- switch ( searchMode ) {
151- case SearchMode . All :
152- return getUnityReleases ( "." , [
153- UnityReleaseStream . LTS ,
154- UnityReleaseStream . SUPPORTED ,
155- UnityReleaseStream . TECH ,
156- UnityReleaseStream . BETA ,
157- UnityReleaseStream . ALPHA ,
158- ] ) ;
159- case SearchMode . Default :
160- return getUnityReleases ( "." , [
161- UnityReleaseStream . LTS ,
162- UnityReleaseStream . SUPPORTED ,
163- UnityReleaseStream . TECH ,
164- ] ) ;
165- case SearchMode . PreRelease :
166- return getUnityReleases ( "." , [
167- UnityReleaseStream . BETA ,
168- UnityReleaseStream . ALPHA ,
169- ] ) ;
170- case SearchMode . LTS :
171- return getUnityReleasesInLTS ( ) ;
172- case SearchMode . XLTS :
173- return getUnityReleasesInLTS ( [ UnityReleaseEntitlement . XLTS ] ) ;
174- case SearchMode . SUPPORTED :
175- return getUnityReleases ( "." , [ UnityReleaseStream . SUPPORTED ] ) ;
176- default :
177- throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
158+ try {
159+ switch ( searchMode ) {
160+ case SearchMode . All :
161+ case SearchMode . Default :
162+ case SearchMode . PreRelease :
163+ case SearchMode . SUPPORTED :
164+ return await getUnityReleases ( "." , searchModeToStreams ( searchMode ) ) ;
165+ case SearchMode . LTS :
166+ return await getUnityReleasesInLTS ( ) ;
167+ case SearchMode . XLTS :
168+ return await getUnityReleasesInLTS ( [ UnityReleaseEntitlement . XLTS ] ) ;
169+ default :
170+ throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
171+ }
172+ } catch {
173+ return await searchChangesetsFromDb ( searchMode ) ;
178174 }
179175}
180176
@@ -240,3 +236,67 @@ const groupBy = <T, K extends string>(arr: T[], key: (i: T) => K) =>
240236 ( groups [ key ( item ) ] ||= [ ] ) . push ( item ) ;
241237 return groups ;
242238 } , { } as Record < K , T [ ] > ) ;
239+
240+ function searchModeToStreams (
241+ searchMode : SearchMode ,
242+ ) : UnityReleaseStream [ ] {
243+ switch ( searchMode ) {
244+ case SearchMode . All :
245+ return [
246+ UnityReleaseStream . LTS ,
247+ UnityReleaseStream . SUPPORTED ,
248+ UnityReleaseStream . TECH ,
249+ UnityReleaseStream . BETA ,
250+ UnityReleaseStream . ALPHA ,
251+ ] ;
252+ case SearchMode . Default :
253+ return [
254+ UnityReleaseStream . LTS ,
255+ UnityReleaseStream . SUPPORTED ,
256+ UnityReleaseStream . TECH ,
257+ ] ;
258+ case SearchMode . PreRelease :
259+ return [
260+ UnityReleaseStream . ALPHA ,
261+ UnityReleaseStream . BETA ,
262+ ] ;
263+ case SearchMode . LTS :
264+ case SearchMode . XLTS :
265+ return [
266+ UnityReleaseStream . LTS ,
267+ ] ;
268+ case SearchMode . SUPPORTED :
269+ return [
270+ UnityReleaseStream . SUPPORTED ,
271+ ] ;
272+ default :
273+ throw Error ( `The given search mode '${ searchMode } ' was not supported` ) ;
274+ }
275+ }
276+
277+ export function getAllChangesetsFromDb ( ) : Promise < UnityChangeset [ ] > {
278+ return fetch ( UNITY_CHANGESETS_DB_URL )
279+ . then ( ( res ) => {
280+ if ( ! res . ok ) {
281+ throw Error (
282+ `The Unity changeset database could not be fetched: ${ res . status } ${ res . statusText } ` ,
283+ ) ;
284+ }
285+
286+ return res . json ( ) as Promise < UnityChangeset [ ] > ;
287+ } ) ;
288+ }
289+
290+ export function searchChangesetsFromDb (
291+ searchMode : SearchMode ,
292+ ) : Promise < UnityChangeset [ ] > {
293+ return getAllChangesetsFromDb ( )
294+ . then ( ( changesets : UnityChangeset [ ] ) => {
295+ if ( ! changesets || changesets . length == 0 ) return [ ] ;
296+
297+ const streams = searchModeToStreams ( searchMode ) ;
298+ return searchMode === SearchMode . XLTS
299+ ? changesets . filter ( ( c ) => streams . includes ( c . stream ) )
300+ : changesets . filter ( ( c ) => streams . includes ( c . stream ) && ! c . xlts ) ;
301+ } ) ;
302+ }
0 commit comments