Skip to content

Commit 6e91712

Browse files
authored
chore: type responses to avoid bugs with any (#47)
1 parent d0b34d5 commit 6e91712

4 files changed

Lines changed: 62 additions & 17 deletions

File tree

mclib/src/finder/LocalSolutionFinder.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ describe('SolutionFinder', () => {
279279
loader: ModLoader.FABRIC
280280
});
281281
expect(result.mods).toHaveLength(1);
282-
expect(result.mods[0].modMetadata.id).toBe('ice-and-fire-dragons');
282+
expect(result.mods[0].modMetadata!.id).toBe('ice-and-fire-dragons');
283283
expect(result.mods[0].modVersion).toBe('2.0.0');
284284
});
285285

mclib/src/repos/CurseForgeRepository.ts

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,19 @@ export class CurseForgeRepository implements IRepository {
2121
}
2222

2323
async getModReleases(modId: string): Promise<ModReleases> {
24+
type Data = {
25+
data: {
26+
displayName: string;
27+
gameVersions: string[];
28+
downloadUrl: string;
29+
}[];
30+
};
31+
2432
const filesResp = await this.fetchClient(`${CurseForgeRepository.BASE_URL}/mods/${modId}/files`);
2533
if (!filesResp.ok) throw new Error("Could not fetch files from CurseForge");
26-
const filesData = (await filesResp.json()).data;
34+
const jsonResp: Data = await filesResp.json();
2735

28-
const releases: ModRepoRelease[] = filesData.map((file: any) => {
36+
const releases: ModRepoRelease[] = jsonResp.data.map(file => {
2937
const mcVersions: Set<MCVersion> = new Set();
3038
const loaders: Set<ModLoader> = new Set();
3139
for (let gameVersion of file.gameVersions || []) {
@@ -50,6 +58,20 @@ export class CurseForgeRepository implements IRepository {
5058
}
5159

5260
async searchMods(query: string, maxResults: number): Promise<ModRepoMetadata[]> {
61+
type Data = {
62+
data: {
63+
id: number;
64+
name: string;
65+
links: {
66+
websiteUrl: string;
67+
};
68+
logo: {
69+
url: string;
70+
};
71+
downloadCount: number;
72+
}[];
73+
};
74+
5375
const resp = await this.fetchClient(`${CurseForgeRepository.BASE_URL}/mods/search?` + new URLSearchParams({
5476
// params from PrismLancher
5577
gameId: "432", // Minecraft game ID
@@ -61,8 +83,9 @@ export class CurseForgeRepository implements IRepository {
6183
searchFilter: query
6284
}));
6385
if (!resp.ok) throw new Error("Failed to fetch search results from CurseForge");
64-
const data = (await resp.json()).data;
65-
return data.map((mod: any) => ({
86+
const jsonResp: Data = (await resp.json());
87+
88+
return jsonResp.data.map(mod => ({
6689
id: mod.id.toString(),
6790
repository: ModRepositoryName.CURSEFORGE,
6891
name: mod.name,

mclib/src/repos/ModrinthRepository.ts

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,49 @@ export class ModrinthRepository implements IRepository {
1818
}
1919

2020
async getModReleases(modId: string): Promise<ModReleases> {
21+
type Data = Array<{
22+
game_versions: string[];
23+
version_number: string;
24+
loaders: string[];
25+
files: {
26+
url: string;
27+
}[];
28+
}>;
29+
2130
const versionsResp = await this.fetchClient(`https://api.modrinth.com/v2/project/${modId}/version`);
2231
if (!versionsResp.ok) throw new Error("Could not fetch versions from Modrinth");
23-
const versionsData = await versionsResp.json();
32+
const jsonResp: Data = await versionsResp.json();
2433

25-
const releases: ModRepoRelease[] = versionsData.map((v: any) => ({
26-
mcVersions: new Set(v.game_versions),
27-
modVersion: v.version_number,
28-
repository: ModRepositoryName.MODRINTH,
29-
loaders: new Set(v.loaders.map(ModLoaderUtil.from)),
30-
downloadUrl: v.files?.[0]?.url || '',
31-
}));
34+
const releases: ModRepoRelease[] = jsonResp.map(file => {
35+
const mcVersions = new Set(file.game_versions);
36+
const loaders = new Set(file.loaders.map(ModLoaderUtil.from));
37+
return {
38+
mcVersions,
39+
modVersion: file.version_number,
40+
repository: ModRepositoryName.MODRINTH,
41+
loaders,
42+
downloadUrl: file.files?.[0]?.url || '',
43+
};
44+
});
3245

3346
return releases;
3447
}
3548

3649
async searchMods(query: string, maxResults: number): Promise<ModRepoMetadata[]> {
37-
const resp = await this.fetchClient(`https://api.modrinth.com/v2/search?facets=[["project_type:mod"]]&query=${encodeURIComponent(query)}&limit=${maxResults}`);
50+
type Data = {
51+
hits: Array<{
52+
slug: string;
53+
title: string;
54+
icon_url?: string;
55+
downloads?: number;
56+
}>;
57+
};
58+
59+
const resp = await this.fetchClient(`https://api.modrinth.com/v2/search?facets=[[\"project_type:mod\"]]&query=${encodeURIComponent(query)}&limit=${maxResults}`);
3860
if (!resp.ok) throw new Error("Failed to fetch search results from Modrinth");
39-
const data = await resp.json();
61+
const jsonResp: Data = await resp.json();
4062

41-
return data.hits.map((hit: any) => ({
63+
return jsonResp.hits.map(hit => ({
4264
id: hit.slug,
4365
repository: ModRepositoryName.MODRINTH,
4466
name: hit.title,

mclib/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export type ModRepoRelease = {
5555
/** Download URL for the mod release */
5656
downloadUrl: string;
5757

58-
modMetadata: ModRepoMetadata;
58+
modMetadata?: ModRepoMetadata;
5959
};
6060

6161
export type ModMetadata = ModRepoMetadata[];

0 commit comments

Comments
 (0)