Skip to content

Commit 3b654a7

Browse files
committed
feat: add --db [url] global option to use cached database instead of GraphQL
1 parent 7055038 commit 3b654a7

File tree

4 files changed

+58
-22
lines changed

4 files changed

+58
-22
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ deno install -A -f -n unity-changeset https://deno.land/x/unity_changeset/src/cl
113113
114114
-h, --help - Show this help.
115115
-V, --version - Show the version number for this program.
116+
--db [url] - Use cached database instead of GraphQL API. If `url` is not specified, use the default database.
116117
```
117118

118119
```

src/cli.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ new Command()
3030
.description("Find Unity changesets.")
3131
.example("unity-changeset 2018.4.36f1", "Get changeset of Unity 2018.4.36f1 ('6cd387d23174' will be output).")
3232
.arguments("<version>")
33-
.action((_, version) => {
34-
getUnityChangeset(version)
33+
.option("--db [url]", "Use cached database instead of GraphQL API. If `url` is not specified, use the default database.")
34+
.action((options, version) => {
35+
getUnityChangeset(version, options.db)
3536
.then((c) => console.log(c.changeset))
3637
.catch(() => {
3738
console.error("The given version was not found.");
@@ -74,6 +75,9 @@ new Command()
7475
.option("--minor-version-only, --minor-versions", "Outputs only the minor version (no changesets)", { conflicts: ["version-only"] })
7576
.option("--json", "Output in json format")
7677
.option("--pretty-json", "Output in pretty json format")
78+
// Database options.
79+
.group("Database options")
80+
.option("--db [url]", "Use cached database instead of GraphQL API. If `url` is not specified, use the default database.")
7781
.action((options) => {
7882
// Search mode.
7983
const searchMode = options.all
@@ -118,7 +122,7 @@ new Command()
118122
? FormatMode.PrettyJson
119123
: FormatMode.None;
120124

121-
listChangesets(searchMode, filterOptions, groupMode, outputMode, formatMode)
125+
listChangesets(searchMode, filterOptions, groupMode, outputMode, formatMode, options.db)
122126
.then((result) => console.log(result));
123127
}),
124128
)

src/index.ts

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,34 @@ export { UnityReleaseEntitlement, UnityReleaseStream };
2020
/**
2121
* Retrieves the Unity changeset for a specific version.
2222
* @param version - The Unity version string (e.g., "2020.1.14f1").
23+
* @param db - Optional database URL or true to use the default database.
2324
* @returns A Promise that resolves to the UnityChangeset object.
2425
* @throws Error if the version is not found.
2526
*/
2627
export async function getUnityChangeset(
2728
version: string,
29+
db?: string | true,
2830
): Promise<UnityChangeset> {
2931
const sanitizedVersion = sanitizeVersion(version);
3032

3133
let changesets: UnityChangeset[];
32-
try {
33-
changesets = await getUnityReleases(
34-
sanitizedVersion,
35-
searchModeToStreams(SearchMode.All),
36-
[UnityReleaseEntitlement.XLTS],
37-
);
38-
} catch {
39-
changesets = await getAllChangesetsFromDb();
34+
35+
// Database mode.
36+
if (db) {
37+
const dbUrl = db === true ? UNITY_CHANGESETS_DB_URL : db;
38+
changesets = await getAllChangesetsFromDb(dbUrl);
39+
} else {
40+
// GraphQL mode.
41+
try {
42+
changesets = await getUnityReleases(
43+
sanitizedVersion,
44+
searchModeToStreams(SearchMode.All),
45+
[UnityReleaseEntitlement.XLTS],
46+
);
47+
} catch {
48+
// Fallback to default database mode.
49+
changesets = await getAllChangesetsFromDb(UNITY_CHANGESETS_DB_URL);
50+
}
4051
}
4152

4253
if (!changesets || !Array.isArray(changesets)) {
@@ -133,6 +144,7 @@ export enum FormatMode {
133144
* @param groupMode - The group mode to use.
134145
* @param outputMode - The output mode for the results.
135146
* @param formatMode - The format mode for the output.
147+
* @param db - Optional database URL or true to use the default database.
136148
* @returns A Promise that resolves to a formatted string of the results.
137149
*/
138150
export function listChangesets(
@@ -141,8 +153,9 @@ export function listChangesets(
141153
groupMode: GroupMode,
142154
outputMode: OutputMode,
143155
formatMode: FormatMode,
156+
db?: string | true,
144157
): Promise<string> {
145-
return searchChangesets(searchMode)
158+
return searchChangesets(searchMode, db)
146159
.then((results) => filterChangesets(results, filterOptions))
147160
.then((results) =>
148161
results.sort((a, b) => b.versionNumber - a.versionNumber)
@@ -181,17 +194,28 @@ export function listChangesets(
181194
/**
182195
* Searches for Unity changesets based on the specified search mode.
183196
* @param searchMode - The search mode to use.
197+
* @param db - Optional database URL or true to use the default database.
184198
* @returns A Promise that resolves to an array of UnityChangeset objects.
185199
* @throws Error if the search mode is not supported.
186200
*/
187201
export async function searchChangesets(
188202
searchMode: SearchMode,
203+
db?: string | true,
189204
): Promise<UnityChangeset[]> {
190205
const streams = searchModeToStreams(searchMode);
206+
207+
// Database mode.
208+
if (db) {
209+
const dbUrl = db === true ? UNITY_CHANGESETS_DB_URL : db;
210+
return searchChangesetsFromDb(streams, dbUrl);
211+
}
212+
191213
try {
214+
// GraphQL mode.
192215
return await getUnityReleases(".", streams, [UnityReleaseEntitlement.XLTS]);
193216
} catch {
194-
return await searchChangesetsFromDb(streams);
217+
// Fallback to default database mode.
218+
return await searchChangesetsFromDb(streams, UNITY_CHANGESETS_DB_URL);
195219
}
196220
}
197221

@@ -271,37 +295,42 @@ export function groupChangesets(
271295

272296
/**
273297
* Retrieves all Unity changesets from the database.
298+
* @param db - Database URL. If not specified, use the default database.
274299
* @returns A Promise that resolves to an array of all UnityChangeset objects from the database.
275300
* @throws Error if the database cannot be fetched or is invalid.
276301
*/
277-
export function getAllChangesetsFromDb(): Promise<UnityChangeset[]> {
278-
return fetch(UNITY_CHANGESETS_DB_URL)
302+
export function getAllChangesetsFromDb(
303+
db: string = UNITY_CHANGESETS_DB_URL,
304+
): Promise<UnityChangeset[]> {
305+
return fetch(db)
279306
.then((res) => {
280307
if (!res.ok) {
281308
throw Error(
282309
`The Unity changeset database could not be fetched: ${res.status} ${res.statusText}`,
283310
);
284311
}
285312

286-
return res.json() as Promise<UnityChangeset[]>;
313+
return res.json() as Promise<any[]>;
287314
})
288315
.then((data) => {
289316
if (!Array.isArray(data)) {
290317
throw new Error("Invalid changeset database format: expected array");
291318
}
292-
return data;
319+
return data.map((item) => new UnityChangeset(item.version, item.changeset, item.stream, item.entitlements));
293320
});
294321
}
295322

296323
/**
297324
* Searches for Unity changesets from the database based on the specified search mode.
298325
* @param streams - The array of release streams to filter by.
326+
* @param db - Database URL. If not specified, use the default database.
299327
* @returns A Promise that resolves to an array of UnityChangeset objects from the database.
300328
*/
301329
export function searchChangesetsFromDb(
302330
streams: UnityReleaseStream[],
331+
db: string = UNITY_CHANGESETS_DB_URL,
303332
): Promise<UnityChangeset[]> {
304-
return getAllChangesetsFromDb()
333+
return getAllChangesetsFromDb(db)
305334
.then((changesets: UnityChangeset[]) => {
306335
if (!changesets || !Array.isArray(changesets)) return [];
307336
if (changesets.length == 0) return [];

src/unityChangeset.test.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ Deno.test("UnityChangeset.toString", () => {
7070
[
7171
{ version: "2018.3.0f1", expected: "f023c421e164" },
7272
{ version: "2018.3.0f2", expected: "6e9a27477296" },
73-
{ version: "2018.3.0f3", expected: undefined },
74-
{ version: "2019.1.0a9", expected: "0acd256790e8" },
75-
{ version: "2019.1.0b1", expected: "83b3ba1f99df" },
76-
{ version: "6000.1.0f1", expected: "9ea152932a88" },
73+
{ version: "2018.3.0f3", expected: undefined }, // Not existing version
74+
{ version: "2019.1.0a9", expected: "0acd256790e8" }, // Alpha
75+
{ version: "2019.1.0b1", expected: "83b3ba1f99df" }, // Beta
76+
{ version: "6000.1.0f1", expected: "9ea152932a88" }, // Supported
77+
{ version: "2022.3.67f2", expected: "6bedba8691df" }, // XLTS
7778
].forEach((testcase) => {
7879
Deno.test(`getUnityChangeset (${testcase.version})`, async () => {
7980
if (testcase.expected) {
@@ -111,6 +112,7 @@ Deno.test("scrapeUnity6000Supported", async () => {
111112
{ searchMode: SearchMode.Default },
112113
{ searchMode: SearchMode.PreRelease },
113114
{ searchMode: SearchMode.Supported },
115+
{ searchMode: SearchMode.LTS },
114116
].forEach((testcase) => {
115117
Deno.test(`filterChangesets(${JSON.stringify(testcase.searchMode)})`, async () => {
116118
const changesets = await searchChangesets(testcase.searchMode);

0 commit comments

Comments
 (0)