modrinth-api-types
Version:
Full typings for the Modrinth REST API
639 lines (544 loc) • 16.6 kB
text/typescript
import {
ImageExtension,
NumberRange,
RequireAtLeastOne
} from "../../globals";
import {
APIProject,
APIProjectDonationURL,
APIVersion,
ProjectClientSide,
ProjectRequestedStatus,
ProjectServerSide,
ProjectStatus,
ProjectType
} from "../../payloads/v2";
// TYPES
export type APIProjectResolvable =
| APIProject
| string;
export type APIProjectSearchParameters = {
/**
* The query to search for.
*/
query?: string;
/**
* Facets are an essential concept for understanding how to filter our results.
*
* In order to use facets, you need a value to filter by, as well as an operation to perform on this value.
* Join together a `type`, `operation` and `value` and you have your string.
*
* **Examples:**
* - `categories` `=` `adventure`
* - `versions` `!=` `1.20.1`
*
* You then join these strings together in arrays to signal `AND` and `OR` operators.
*
* -----
* **OR:**
*
* All elements in a single array are considered to be joined by OR statements. For example:
*
* `[["versions=1.16.5","versions=1.17.1"]]` translates to Projects that support 1.16.5 `OR` 1.17.1.
*
* **AND:**
*
* Separate arrays are considered to be joined by AND statements. For example:
*
* `[["versions=1.16.5"],["project_type=modpack"]]` translates to Projects that support 1.16.5 `AND` are modpacks.
*/
facets?: string;
/**
* The sorting method used for sorting search results.
*
* The default is `relevance`.
*/
index?: ProjectSearchParametersIndex;
/**
* The offset into the search. Skips this number of results.
*/
offset?: number;
/**
* The number of results returned by the search.
*
* The default is `10`.
*/
limit?: NumberRange<1, 101>;
};
export type APIProjectAddGalleryImageParameters = {
/**
* Image extension.
*/
ext: ImageExtension;
/**
* Whether an image is featured.
*/
featured: boolean;
/**
* Title of the image.
*/
title?: string;
/**
* Description of the image.
*/
description?: string;
/**
* Ordering of the image.
*/
ordering?: number;
};
export type APIProjectEditGalleryImageParameters = {
/**
* URL link of the image to edit.
*/
url: string;
} & RequireAtLeastOne<{
/**
* Whether an image is featured.
*/
featured: boolean;
/**
* Title of the image.
*/
title: string;
/**
* Description of the image.
*/
description: string;
/**
* Ordering of the image.
*/
ordering: number;
}>;
export type APIProjectDeleteGalleryImageParameters = {
/**
* URL link of the gallery image to delete.
*/
url: string;
};
export type APIProjectGalleryImageParameters =
| APIProjectAddGalleryImageParameters
| APIProjectDeleteGalleryImageParameters
| APIProjectEditGalleryImageParameters;
export type APIProjectEditBody = RequireAtLeastOne<{
/**
* The slug of a project, used for vanity URLs.
*
* Uses Regular Expression:
* ```
* /^[\w!@$()`.+,"\-']{3,64}$/
* ```
*/
slug?: string;
/**
* The title or name of the project.
*/
title?: string;
/**
* A short description of the project.
*/
description?: string;
/**
* A list of the categories that the project has.
*/
categories?: string[];
/**
* The client side support of the project.
*/
client_side?: ProjectClientSide;
/**
* The server side support of the project.
*/
server_side?: ProjectServerSide;
/**
* A long form description of the project.
*/
body?: string;
/**
* The status of the project.
*/
status?: ProjectStatus;
/**
* The requested status when submitting for review or scheduling the project for release.
*/
requested_status?: ProjectRequestedStatus | null;
/**
* A list of categories which are searchable but non-primary.
*/
additional_categories?: string[];
/**
* An optional link to where to submit bugs or issues with the project.
*/
issues_url?: string | null;
/**
* An optional link to the source code of the project.
*/
source_url?: string | null;
/**
* An optional link to the project’s wiki page or other relevant information.
*/
wiki_url?: string | null;
/**
* An optional invite link to the project’s Discord server.
*/
discord_url?: string | null;
/**
* A list of donation links for the project.
*/
donation_urls?: APIProjectDonationURL[];
/**
* The SPDX license ID for the project.
*/
license_id?: string;
/**
* The URL to this license.
*/
license_url?: string | null;
/**
* The title of the moderator's message for the project.
*/
moderation_message?: string | null;
/**
* The body of the moderator's message for the project.
*/
moderation_message_body?: string | null;
}>;
export type APIProjectsEditBody = RequireAtLeastOne<{
/**
* Set all of the categories to the categories specified here.
*/
categories?: string[];
/**
* Add all of the categories specified here.
*/
add_categories?: string[];
/**
* Remove all of the categories specified here.
*/
remove_categories?: string[];
/**
* Set all of the additional categories to the categories specified here.
*/
additional_categories?: string[];
/**
* Add all of the additional categories specified here.
*/
add_additional_categories?: string[];
/**
* Remove all of the additional categories specified here.
*/
remove_additional_categories?: string[];
/**
* Set all of the donation links to the donation links specified here.
*/
donation_urls?: APIProjectDonationURL[];
/**
* Add all of the donation links specified here.
*/
add_donation_urls?: APIProjectDonationURL[];
/**
* Remove all of the donation links specified here.
*/
remove_donation_urls?: APIProjectDonationURL[];
/**
* An optional link to where to submit bugs or issues with the project.
*/
issues_url?: string | null;
/**
* An optional link to the source code of the project.
*/
source_url?: string | null;
/**
* An optional link to the project’s wiki page or other relevant information.
*/
wiki_url?: string | null;
/**
* An optional invite link to the project’s Discord server.
*/
discord_url?: string | null;
}>;
export type APIProjectCreateBody = {
/**
* The slug of a project, used for vanity URLs.
*
* Uses Regular Expression:
* ```
* /^[\w!@$()`.+,"\-']{3,64}$/
* ```
*/
slug?: string;
/**
* The title or name of the project.
*/
title?: string;
/**
* A short description of the project.
*/
description?: string;
/**
* A list of the categories that the project has.
*/
categories?: string[];
/**
* The client side support of the project.
*/
client_side?: ProjectClientSide;
/**
* The server side support of the project.
*/
server_side?: ProjectServerSide;
/**
* A long form description of the project.
*/
body?: string;
/**
* The status of the project.
*/
status?: ProjectStatus;
/**
* The requested status when submitting for review or scheduling the project for release.
*/
requested_status?: ProjectRequestedStatus | null;
/**
* A list of categories which are searchable but non-primary.
*/
additional_categories?: string[];
/**
* An optional link to where to submit bugs or issues with the project.
*/
issues_url?: string | null;
/**
* An optional link to the source code of the project.
*/
source_url?: string | null;
/**
* An optional link to the project’s wiki page or other relevant information.
*/
wiki_url?: string | null;
/**
* An optional invite link to the project’s Discord server.
*/
discord_url?: string | null;
/**
* A list of donation links for the project.
*/
donation_urls?: APIProjectDonationURL[];
/**
* The SPDX license ID for the project.
*/
license_id?: string;
/**
* The URL to this license.
*/
license_url?: string | null;
/**
* The project type of the project.
*/
project_type: ProjectType;
/**
* A list of initial versions to upload with the created project.
* @deprecated Please upload version files after initial upload.
*/
initial_versions: APIVersion[];
/**
* Whether the project should be saved as a draft instead of being sent to moderation for review.
* @deprecated This is required to always be `true`.
*/
is_draft: true;
/**
* Gallery images to be uploaded with the created project.
* @deprecated Please upload gallery images after initial upload.
*/
gallery_items: APIProjectAddGalleryImageParameters;
};
export type APIProjectEditIconBody = string;
export type APIProjectAddGalleryImageBody = string;
export type APIProjectScheduleBody = {
/**
* The date and time to schedule the project.
*/
time: Date;
/**
* The requested status when scheduling the project for release.
*/
requested_status: ProjectRequestedStatus;
};
// ENUMS
export enum ProjectSearchParametersIndex {
Relevance = "relevance",
Downloads = "downloads",
Follows = "follows",
Newest = "newest",
Updated = "updated"
};
// ROUTES
/**
* Route for the following:
* - GET `/search`
* @param options Options to filter the search.
*/
export function searchProjects(options: APIProjectSearchParameters): `/search?${string}`;
export function searchProjects(): `/search`;
export function searchProjects(options: string): `/search?query=${string}`;
export function searchProjects(options?: APIProjectSearchParameters | string) {
// If no options provided
if (!options) {
return `/search`;
}
// If options is a string (query only search)
else if (typeof options == "string") {
return `/search?query=${options}`;
}
// Else parse options object
else {
let params = new URLSearchParams();
// Add query if available
if (options.query) {
params.append("query", options.query);
};
// Add facets if available
if (options.facets) {
params.append("facets", options.facets);
};
// Add index if available
if (options.index) {
params.append("index", options.index);
};
// Add offset if available
if (options.offset) {
params.append("offset", options.offset.toString());
};
// Add limit if available
if (options.limit) {
params.append("limit", options.limit.toString());
};
return `/search?${params}`;
};
};
/**
* Route for the following:
* - DELETE `/project/${project}`
* - GET `/project/${project}`
* - PATCH `/project/${project}`
* @param project The ID or slug of the project.
*/
export function project(project: APIProjectResolvable): `/project/${string}` {
if (typeof project == "string") {
return `/project/${project}`;
} else {
return `/project/${project.id}`;
};
};
/**
* Route for the following:
* - GET `/projects`
* - PATCH `/projects`
* @param projects The IDs or slugs of the projects.
*/
export function projects(projects: APIProjectResolvable[]): `/projects?ids=[${string}]` {
return `/projects?ids=[${projects.map(p => typeof p == "string" ? `"${p}"` : `"${p.id}"`).join(",")}]`;
};
/**
* Route for the following:
* - GET `/projects_random`
* @param count Amount of random projects between 1 and 100.
*/
export function randomProjects(count: number): `/projects_random?count=${number}` {
return `/projects_random?count=${count}`;
};
/**
* Route for the following:
* - POST `/project`
*/
export function projectCreate(): `/project` {
return `/project`;
};
/**
* Route for the following:
* - DELETE `/project/${project}/icon`
* - PATCH `/project/${project}/icon`
* @param project The ID or slug of the project.
*/
export function projectIcon(project: APIProjectResolvable): `/project/${string}/icon` {
if (typeof project == "string") {
return `/project/${project}/icon`;
} else {
return `/project/${project.id}/icon`;
};
};
/**
* Route for the following:
* - GET `/project/${project}/check`
* @param project The ID or slug of the project.
*/
export function projectValidity(project: APIProjectResolvable): `/project/${string}/check` {
if (typeof project == "string") {
return `/project/${project}/check`;
} else {
return `/project/${project.id}/check`;
};
};
/**
* Route for the following:
* - DELETE `/project/${project}/gallery`
* - PATCH `/project/${project}/gallery`
* - POST `/project/${project}/gallery`
* @param project The ID or slug of the project.
*/
export function projectGallery(project: APIProjectResolvable, options: APIProjectAddGalleryImageParameters): `/project/${string}/gallery?${string}`;
export function projectGallery(project: APIProjectResolvable, options: APIProjectEditGalleryImageParameters): `/project/${string}/gallery?${string}`;
export function projectGallery(project: APIProjectResolvable, options: APIProjectDeleteGalleryImageParameters): `/project/${string}/gallery?url=${string}`;
export function projectGallery(project: APIProjectResolvable, options: APIProjectGalleryImageParameters) {
let projectId = typeof project == "string" ? project : project.id;
let params = new URLSearchParams();
Object.entries(options).forEach(([k, v]) => params.append(k, v.toString()));
// Add gallery image
if ("featured" in options && "url" in options == false) {
return `/project/${projectId}/gallery?${params}`;
}
// Delete gallery image
else if ("url" in options && !("featured" in options || "title" in options || "description" in options || "ordering" in options)) {
return `/project/${projectId}/gallery?${params}`;
}
// Edit gallery image
else {
return `/project/${projectId}/gallery?${params}`;
};
};
/**
* Route for the following:
* - GET `/project/${project}/dependencies`
* @param project The ID or slug of the project.
*/
export function projectDependencies(project: APIProjectResolvable): `/project/${string}/dependencies` {
if (typeof project == "string") {
return `/project/${project}/dependencies`;
} else {
return `/project/${project.id}/dependencies`;
};
};
/**
* Route for the following:
* - DELETE `/project/${project}/follow`
* - POST `/project/${project}/follow`
* @param project The ID or slug of the project.
*/
export function projectFollow(project: APIProjectResolvable): `/project/${string}/follow` {
if (typeof project == "string") {
return `/project/${project}/follow`;
} else {
return `/project/${project.id}/follow`;
};
};
/**
* Route for the following:
* - POST `/project/${project}/schedule`
* @param project The ID or slug of the project.
*/
export function projectSchedule(project: APIProjectResolvable): `/project/${string}/schedule` {
if (typeof project == "string") {
return `/project/${project}/schedule`;
} else {
return `/project/${project.id}/schedule`;
};
};