From 6a1591e6a552f33d40ccdf1b00a9d035806fcd05 Mon Sep 17 00:00:00 2001 From: Oksamies Date: Fri, 3 Oct 2025 17:09:22 +0300 Subject: [PATCH] Add fetchPackageVersionDependencies function to thunderstore-api And the related object schemas Additionally the existing PackageDependency type needs to be renamed to be more accurate. As it's a package dependency returned with the package listing --- .../ListingDependency/ListingDependency.tsx | 4 +-- packages/dapper/src/types/package.ts | 4 +-- .../src/__tests__/defaultConfig.ts | 1 + .../packageVersionDependencies.test.ts | 24 +++++++++++++ .../src/get/packageVersionDependencies.ts | 35 +++++++++++++++++++ packages/thunderstore-api/src/index.ts | 1 + .../src/schemas/objectSchemas.ts | 22 ++++++++++-- .../src/schemas/requestSchemas.ts | 18 ++++++++++ .../src/schemas/responseSchemas.ts | 12 +++++++ 9 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 packages/thunderstore-api/src/get/__tests__/packageVersionDependencies.test.ts create mode 100644 packages/thunderstore-api/src/get/packageVersionDependencies.ts diff --git a/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.tsx b/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.tsx index 84fa8299e..376e4fefd 100644 --- a/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.tsx +++ b/apps/cyberstorm-remix/app/commonComponents/ListingDependency/ListingDependency.tsx @@ -1,9 +1,9 @@ -import type { packageDependencySchema } from "@thunderstore/thunderstore-api"; +import type { packageListingDependencySchema } from "@thunderstore/thunderstore-api"; import "./ListingDependency.css"; import { formatToDisplayName, Image, NewLink } from "@thunderstore/cyberstorm"; export interface ListingDependencyProps { - dependency: typeof packageDependencySchema._type; + dependency: typeof packageListingDependencySchema._type; // TODO: Remove when package versiond detail is available domain: string; } diff --git a/packages/dapper/src/types/package.ts b/packages/dapper/src/types/package.ts index ed099bda1..abe87a283 100644 --- a/packages/dapper/src/types/package.ts +++ b/packages/dapper/src/types/package.ts @@ -23,7 +23,7 @@ export interface PackageListingDetails extends PackageListing { community_name: string; datetime_created: string; dependant_count: number; - dependencies: PackageDependency[]; + dependencies: PackageListingDependency[]; dependency_count: number; download_url: string; full_version_name: string; @@ -34,7 +34,7 @@ export interface PackageListingDetails extends PackageListing { website_url: string | null; } -export interface PackageDependency { +export interface PackageListingDependency { community_identifier: string; description: string; icon_url: string | null; diff --git a/packages/thunderstore-api/src/__tests__/defaultConfig.ts b/packages/thunderstore-api/src/__tests__/defaultConfig.ts index cdeeb086a..9f665916c 100644 --- a/packages/thunderstore-api/src/__tests__/defaultConfig.ts +++ b/packages/thunderstore-api/src/__tests__/defaultConfig.ts @@ -12,4 +12,5 @@ export const testData = { communityId: "test-community-1", namespaceId: "Test_Team_0", packageName: "Test_Package_0", + versionNumber: "1.0.0", }; diff --git a/packages/thunderstore-api/src/get/__tests__/packageVersionDependencies.test.ts b/packages/thunderstore-api/src/get/__tests__/packageVersionDependencies.test.ts new file mode 100644 index 000000000..fd243ab38 --- /dev/null +++ b/packages/thunderstore-api/src/get/__tests__/packageVersionDependencies.test.ts @@ -0,0 +1,24 @@ +import { expect, it } from "vitest"; +import { config, testData } from "../../__tests__/defaultConfig"; +import { fetchPackageVersionDependencies } from "../packageVersionDependencies"; +import { packageVersionDependenciesResponseDataSchema } from "../.."; + +it("ensures package version dependencies can be fetched", async () => { + const { namespaceId, packageName, versionNumber } = testData; + const response = await fetchPackageVersionDependencies({ + config, + params: { + namespace_id: namespaceId, + package_name: packageName, + version_number: versionNumber, + }, + data: {}, + queryParams: [{ key: "page", value: 1, impotent: 1 }], + }); + + expect(response.count).toBe(3); + expect(response.results.length).toBe(3); + expect(packageVersionDependenciesResponseDataSchema.parse(response)).toEqual( + response + ); +}); diff --git a/packages/thunderstore-api/src/get/packageVersionDependencies.ts b/packages/thunderstore-api/src/get/packageVersionDependencies.ts new file mode 100644 index 000000000..2cd913d9c --- /dev/null +++ b/packages/thunderstore-api/src/get/packageVersionDependencies.ts @@ -0,0 +1,35 @@ +import { + ApiEndpointProps, + packageVersionDependenciesRequestQueryParamsSchema, + PackageVersionDependenciesRequestQueryParams, + PackageVersionDependenciesRequestParams, + packageVersionDependenciesResponseDataSchema, + PackageVersionDependenciesResponseData, +} from "../index"; +import { apiFetch } from "../apiFetch"; + +export async function fetchPackageVersionDependencies( + props: ApiEndpointProps< + PackageVersionDependenciesRequestParams, + PackageVersionDependenciesRequestQueryParams, + object + > +): Promise { + const { + config, + params, + queryParams = [{ key: "page", value: 1, impotent: 1 }], + } = props; + const path = `api/cyberstorm/package/${params.namespace_id}/${params.package_name}/v/${params.version_number}/dependencies/`; + + return await apiFetch({ + args: { + config, + path, + queryParams, + }, + requestSchema: undefined, + queryParamsSchema: packageVersionDependenciesRequestQueryParamsSchema, + responseSchema: packageVersionDependenciesResponseDataSchema, + }); +} diff --git a/packages/thunderstore-api/src/index.ts b/packages/thunderstore-api/src/index.ts index 4e3c60f8f..8cb201afd 100644 --- a/packages/thunderstore-api/src/index.ts +++ b/packages/thunderstore-api/src/index.ts @@ -33,6 +33,7 @@ export * from "./get/packageDependantsListings"; export * from "./get/packageListingDetails"; export * from "./get/packageReadme"; export * from "./get/packageSubmission"; +export * from "./get/packageVersionDependencies"; export * from "./get/packageVersions"; export * from "./get/packageWiki"; export * from "./get/ratedPackages"; diff --git a/packages/thunderstore-api/src/schemas/objectSchemas.ts b/packages/thunderstore-api/src/schemas/objectSchemas.ts index fb20d2ebf..37b5c3fb0 100644 --- a/packages/thunderstore-api/src/schemas/objectSchemas.ts +++ b/packages/thunderstore-api/src/schemas/objectSchemas.ts @@ -142,7 +142,7 @@ const packageTeamSchema = z.object({ export type PackageTeam = z.infer; -export const packageDependencySchema = z.object({ +export const packageListingDependencySchema = z.object({ community_identifier: z.string().min(1), description: z.string(), icon_url: z.string().nullable(), @@ -152,13 +152,15 @@ export const packageDependencySchema = z.object({ version_number: z.string().min(1), }); -export type PackageDependency = z.infer; +export type PackageListingDependency = z.infer< + typeof packageListingDependencySchema +>; export const packageListingDetailsSchema = packageListingSchema.extend({ community_name: z.string().min(1), datetime_created: z.string().datetime(), dependant_count: z.number().int(), - dependencies: z.array(packageDependencySchema), + dependencies: z.array(packageListingDependencySchema), dependency_count: z.number().int(), download_url: z.string(), full_version_name: z.string().min(1), @@ -225,6 +227,20 @@ export const packageVersionExperimentalSchema = z.object({ is_active: z.boolean(), }); +export const packageVersionDependencySchema = z.object({ + description: z.string(), + icon_url: z.string(), + is_active: z.boolean(), + name: z.string().min(1), + namespace: z.string().min(1), + version_number: z.string().min(1), + is_removed: z.boolean(), +}); + +export type PackageVersionDependency = z.infer< + typeof packageVersionDependencySchema +>; + export type PackageVersionExperimental = z.infer< typeof packageVersionExperimentalSchema >; diff --git a/packages/thunderstore-api/src/schemas/requestSchemas.ts b/packages/thunderstore-api/src/schemas/requestSchemas.ts index 178136062..9928a1460 100644 --- a/packages/thunderstore-api/src/schemas/requestSchemas.ts +++ b/packages/thunderstore-api/src/schemas/requestSchemas.ts @@ -188,6 +188,24 @@ export type PackageVersionsRequestParams = z.infer< typeof packageVersionsRequestParamsSchema >; +// PackageVersionDependenciesRequest +export const packageVersionDependenciesRequestParamsSchema = z.object({ + namespace_id: z.string(), + package_name: z.string(), + version_number: z.string(), +}); + +export type PackageVersionDependenciesRequestParams = z.infer< + typeof packageVersionDependenciesRequestParamsSchema +>; + +export const packageVersionDependenciesRequestQueryParamsSchema = + z.array(pageQueryParam); + +export type PackageVersionDependenciesRequestQueryParams = z.infer< + typeof packageVersionDependenciesRequestQueryParamsSchema +>; + // PackageWikiRequest export const packageWikiRequestParamsSchema = z.object({ namespace_id: z.string(), diff --git a/packages/thunderstore-api/src/schemas/responseSchemas.ts b/packages/thunderstore-api/src/schemas/responseSchemas.ts index c4bab93b9..2a2ea39cc 100644 --- a/packages/thunderstore-api/src/schemas/responseSchemas.ts +++ b/packages/thunderstore-api/src/schemas/responseSchemas.ts @@ -17,6 +17,7 @@ import { markdownRenderSchema, packageWikiPageSchema, packagePermissionsSchema, + packageVersionDependencySchema, } from "../schemas/objectSchemas"; import { paginatedResults } from "../schemas/objectSchemas"; @@ -131,6 +132,17 @@ export type PackageVersionsResponseData = z.infer< typeof packageVersionsResponseDataSchema >; +export const packageVersionDependenciesResponseDataSchema = z.object({ + count: z.number(), + next: z.string().url().nullable(), + previous: z.string().url().nullable(), + results: z.array(packageVersionDependencySchema), +}); + +export type PackageVersionDependenciesResponseData = z.infer< + typeof packageVersionDependenciesResponseDataSchema +>; + // PackageWikiResponse export const packageWikiResponseDataSchema = z.object({ id: z.string().min(1),