Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions packages/dapper/src/types/package.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions packages/thunderstore-api/src/__tests__/defaultConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ export const testData = {
communityId: "test-community-1",
namespaceId: "Test_Team_0",
packageName: "Test_Package_0",
versionNumber: "1.0.0",
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { expect, test } from "vitest";
import { config, testData } from "../../__tests__/defaultConfig";
import { fetchPackageVersionDependencies } from "../packageVersionDependencies";
import { packageVersionDependenciesResponseDataSchema } from "../..";

// TODO: Disabled temporarily until we decide on a testing strategy/policy regarding e2e tests
test.skip("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
);
});
35 changes: 35 additions & 0 deletions packages/thunderstore-api/src/get/packageVersionDependencies.ts
Original file line number Diff line number Diff line change
@@ -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<PackageVersionDependenciesResponseData> {
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,
});
}
1 change: 1 addition & 0 deletions packages/thunderstore-api/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
22 changes: 19 additions & 3 deletions packages/thunderstore-api/src/schemas/objectSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ const packageTeamSchema = z.object({

export type PackageTeam = z.infer<typeof packageTeamSchema>;

export const packageDependencySchema = z.object({
export const packageListingDependencySchema = z.object({
community_identifier: z.string().min(1),
description: z.string(),
icon_url: z.string().nullable(),
Expand All @@ -152,13 +152,15 @@ export const packageDependencySchema = z.object({
version_number: z.string().min(1),
});

export type PackageDependency = z.infer<typeof packageDependencySchema>;
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),
Expand Down Expand Up @@ -244,6 +246,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
>;
Expand Down
18 changes: 18 additions & 0 deletions packages/thunderstore-api/src/schemas/requestSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
12 changes: 12 additions & 0 deletions packages/thunderstore-api/src/schemas/responseSchemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
packageWikiPageSchema,
packagePermissionsSchema,
packageSourceSchema,
packageVersionDependencySchema,
} from "../schemas/objectSchemas";
import { paginatedResults } from "../schemas/objectSchemas";

Expand Down Expand Up @@ -139,6 +140,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
>;
Comment on lines +143 to +152
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Use paginatedResults helper for consistency.

This schema manually defines the pagination structure, but other paginated responses in this file use the paginatedResults helper (e.g., line 50-51). Using the helper maintains consistency and reduces duplication.

Apply this diff:

-export const packageVersionDependenciesResponseDataSchema = z.object({
-  count: z.number(),
-  next: z.string().url().nullable(),
-  previous: z.string().url().nullable(),
-  results: z.array(packageVersionDependencySchema),
-});
+export const packageVersionDependenciesResponseDataSchema = paginatedResults(
+  packageVersionDependencySchema
+);

Note: The helper uses z.string().nullable() without .url() validation. If URL validation is required, consider updating the helper itself to benefit all paginated schemas.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
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
>;
export const packageVersionDependenciesResponseDataSchema = paginatedResults(
packageVersionDependencySchema
);
export type PackageVersionDependenciesResponseData = z.infer<
typeof packageVersionDependenciesResponseDataSchema
>;
🤖 Prompt for AI Agents
In packages/thunderstore-api/src/schemas/responseSchemas.ts around lines 143 to
152, replace the manually defined packageVersionDependenciesResponseDataSchema
with the existing paginatedResults helper so the schema becomes
paginatedResults(packageVersionDependencySchema) and update the exported type to
infer from that helper; ensure paginatedResults is imported from its module at
the top of the file (or add the import) and, if URL validation is required for
next/previous, update the paginatedResults helper itself to use
z.string().url().nullable().


// PackageWikiResponse
export const packageWikiResponseDataSchema = z.object({
id: z.string().min(1),
Expand Down
Loading