UNPKG

@xmcl/modrinth

Version:

An implementation of modrinth API (https://docs.modrinth.com/api-spec)

8 lines (7 loc) 29.5 kB
{ "version": 3, "sources": ["../index.ts"], "sourcesContent": ["/* eslint-disable n/no-unsupported-features/node-builtins */\n/**\n * @module @xmcl/modrinth\n */\n\nimport { Category, Collection, GameVersion, License, Loader, Project, ProjectVersion, TeamMember, User } from './types'\n\nexport * from './types'\n\n/* eslint-disable camelcase */\nexport interface SearchResultHit {\n /**\n * The slug of project, e.g. \"my_project\"\n */\n slug: string\n /**\n * The id of the project; prefixed with local-\n */\n project_id: string\n /**\n * The project type of the project.\n * @enum \"mod\" \"modpack\"\n * */\n project_type: string\n /**\n * The username of the author of the project\n */\n author: string\n /**\n * The name of the project.\n */\n title: string\n /**\n * A short description of the project\n */\n description: string\n /**\n * A list of the categories the project is in.\n */\n categories: Array<string>\n /**\n * A list of the minecraft versions supported by the project.\n */\n versions: Array<string>\n /**\n * The total number of downloads for the project\n */\n downloads: number\n\n follows: number\n /**\n * A link to the project's main page; */\n page_url: string\n /**\n * The url of the project's icon */\n icon_url: string\n /**\n * The url of the project's author */\n author_url: string\n /**\n * The date that the project was originally created\n */\n date_created: string\n /**\n * The date that the project was last modified\n */\n date_modified: string\n /**\n * The latest version of minecraft that this project supports */\n latest_version: string\n /**\n * The id of the license this project follows */\n license: string\n /**\n * The side type id that this project is on the client */\n client_side: string\n /**\n * The side type id that this project is on the server */\n server_side: string\n /**\n * The host that this project is from, always modrinth */\n host: string\n\n gallery: string[]\n\n featured_gallery: string\n\n monetization_status: string\n}\n\nexport interface SearchProjectOptions {\n /**\n * The query to search\n */\n query?: string\n /**\n * The recommended way of filtering search results. [Learn more about using facets](https://docs.modrinth.com/docs/tutorials/search).\n *\n * @enum \"categories\" \"versions\" \"license\" \"project_type\"\n * @example [[\"categories:forge\"],[\"versions:1.17.1\"],[\"project_type:mod\"]]\n */\n facets?: string\n /**\n * A list of filters relating to the properties of a project. Use filters when there isn't an available facet for your needs. [More information](https://docs.meilisearch.com/reference/features/filtering.html)\n *\n * @example filter=categories=\"fabric\" AND (categories=\"technology\" OR categories=\"utility\")\n */\n filter?: string\n /**\n * What the results are sorted by\n *\n * @enum \"relevance\" \"downloads\" \"follows\" \"newest\" \"updated\"\n * @example \"downloads\"\n * @default relevance\n */\n index?: string\n /**\n * The offset into the search; skips this number of results\n * @default 0\n */\n offset?: number\n /**\n * The number of mods returned by the search\n * @default 10\n */\n limit?: number\n}\n\nexport interface SearchResult {\n /**\n * The list of results\n */\n hits: Array<SearchResultHit>\n /**\n * The number of results that were skipped by the query\n */\n offset: number\n /**\n * The number of mods returned by the query\n */\n limit: number\n /**\n * The total number of mods that the query found\n */\n total_hits: number\n}\n\nexport interface GetProjectVersionsOptions {\n id: string\n loaders?: Array<string>\n /**\n * Minecraft version filtering\n */\n game_versions?: Array<string>\n featured?: boolean\n}\n\nexport class ModerinthApiError extends Error {\n constructor(readonly url: string, readonly status: number, readonly body: string) {\n super(`Fail to fetch modrinth api ${url}. Status=${status}. ${body}`)\n this.name = 'ModerinthApiError'\n }\n}\n\nexport interface ModrinthClientOptions {\n baseUrl?: string\n /**\n * The extra headers\n */\n headers?: Record<string, string>\n /**\n * The fetch function to use\n */\n fetch?: typeof fetch\n}\n\n/**\n * @see https://docs.modrinth.com/api-spec\n */\nexport class ModrinthV2Client {\n private baseUrl: string\n private fetch: typeof fetch\n headers: Record<string, string>\n\n constructor(options?: ModrinthClientOptions) {\n this.baseUrl = options?.baseUrl ?? 'https://api.modrinth.com'\n this.headers = options?.headers || {}\n this.fetch = options?.fetch || ((...args) => fetch(...args))\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/projects/operation/searchProjects\n */\n async searchProjects(options: SearchProjectOptions, signal?: AbortSignal): Promise<SearchResult> {\n const url = new URL(this.baseUrl + '/v2/search')\n url.searchParams.append('query', options.query || '')\n url.searchParams.append('filter', options.filter || '')\n url.searchParams.append('index', options.index || (options.query ? 'relevance' : 'downloads'))\n url.searchParams.append('offset', options.offset?.toString() ?? '0')\n url.searchParams.append('limit', options.limit?.toString() ?? '10')\n if (options.facets) { url.searchParams.append('facets', options.facets) }\n const response = await this.fetch(url, {\n signal,\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as SearchResult\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/projects/operation/getProject\n */\n async getProject(projectId: string, signal?: AbortSignal): Promise<Project> {\n if (projectId.startsWith('local-')) { projectId = projectId.slice('local-'.length) }\n const url = new URL(this.baseUrl + `/v2/project/${projectId}`)\n const response = await this.fetch(url, {\n signal,\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const project = await response.json() as Project\n return project\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/projects/operation/getProject\n */\n async getProjects(projectIds: string[], signal?: AbortSignal): Promise<Project[]> {\n const url = new URL(this.baseUrl + '/v2/projects')\n url.searchParams.append('ids', JSON.stringify(projectIds))\n const response = await this.fetch(url, {\n signal,\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const project = await response.json() as Project[]\n return project\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/versions/operation/getProjectVersions\n */\n async getProjectVersions(projectId: string, { loaders, gameVersions, featured }: { loaders?: string[]; gameVersions?: string[]; featured?: boolean } = {}, signal?: AbortSignal): Promise<ProjectVersion[]> {\n const url = new URL(this.baseUrl + `/v2/project/${projectId}/version`)\n if (loaders) { url.searchParams.append('loaders', JSON.stringify(loaders)) }\n if (gameVersions) { url.searchParams.append('game_versions', JSON.stringify(gameVersions)) }\n if (featured !== undefined) { url.searchParams.append('featured', featured ? 'true' : 'false') }\n const response = await this.fetch(url, {\n signal,\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const versions = await response.json() as ProjectVersion[]\n return versions\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/versions/operation/getVersion\n */\n async getProjectVersion(versionId: string, signal?: AbortSignal): Promise<ProjectVersion> {\n const url = new URL(this.baseUrl + `/v2/version/${versionId}`)\n const response = await this.fetch(url, {\n signal,\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const version = await response.json() as ProjectVersion\n return version\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/versions/operation/getVersions\n */\n async getProjectVersionsById(ids: string[], signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/versions')\n url.searchParams.append('ids', JSON.stringify(ids))\n const response = await this.fetch(url, {\n signal,\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const versions = await response.json() as ProjectVersion[]\n return versions\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/version-files/operation/versionsFromHashes\n */\n async getProjectVersionsByHash(hashes: string[], algorithm = 'sha1', signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/version_files')\n const response = await this.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n hashes,\n algorithm,\n }),\n headers: {\n ...this.headers,\n 'content-type': 'application/json',\n },\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const versions = await response.json() as Record<string, ProjectVersion>\n return versions\n }\n\n /**\n * @see https://docs.modrinth.com/api-spec#tag/version-files/operation/getLatestVersionsFromHashes\n */\n async getLatestVersionsFromHashes(hashes: string[], { algorithm, loaders = [], gameVersions = [] }: { algorithm?: string; loaders?: string[]; gameVersions?: string[] } = {}, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/version_files/update')\n const response = await this.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n hashes,\n algorithm,\n loaders,\n game_versions: gameVersions,\n }),\n headers: { ...this.headers, 'content-type': 'application/json' },\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const versions = await response.json() as Record<string, ProjectVersion>\n return versions\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/version-files/operation/getLatestVersionFromHash\n */\n async getLatestProjectVersion(sha1: string, { algorithm, loaders = [], gameVersions = [] }: { algorithm?: string; loaders?: string[]; gameVersions?: string[] } = {}, signal?: AbortSignal): Promise<ProjectVersion> {\n const url = new URL(this.baseUrl + `/v2/version_file/${sha1}/update`)\n url.searchParams.append('algorithm', algorithm ?? 'sha1')\n const response = await this.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n loaders,\n game_versions: gameVersions,\n }),\n headers: { ...this.headers, 'content-type': 'application/json' },\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const version = await response.json() as ProjectVersion\n return version\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/tags/operation/licenseList\n */\n async getLicenseTags(signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/tag/license')\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as License[]\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/tags/operation/categoryList\n */\n async getCategoryTags(signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/tag/category')\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as Category[]\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/tags/operation/versionList\n */\n async getGameVersionTags(signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/tag/game_version')\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as GameVersion[]\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/tags/operation/loaderList\n */\n async getLoaderTags(signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/tag/loader')\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as Loader[]\n return result\n }\n\n async getCollections(userId: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v3/user/${userId}/collections`)\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as Collection[]\n return result\n }\n\n async uppdateCollectionIcon(collectionId: string, iconData: ArrayBuffer, mimeType: string, signal?: AbortSignal) {\n const ext = mimeType.split('/')[1]\n const url = new URL(this.baseUrl + `/v3/collection/${collectionId}/icon?ext=${ext}`)\n const response = await this.fetch(url, {\n method: 'PATCH',\n headers: {\n ...this.headers,\n 'content-type': mimeType,\n },\n body: iconData,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n }\n\n async createCollection(name: string, description: string, projectIds: string[], signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v3/collection')\n const body = JSON.stringify({\n name,\n description,\n projects: projectIds,\n }, (key, value) => !value ? undefined : value)\n const response = await this.fetch(url, {\n method: 'POST',\n headers: {\n ...this.headers,\n 'content-type': 'application/json',\n },\n body,\n signal,\n })\n if (!response.ok) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as Collection\n return result\n }\n\n async updateCollection(collectionId: string, projectIds: string[], signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v3/collection/${collectionId}`)\n const response = await this.fetch(url, {\n method: 'PATCH',\n headers: {\n ...this.headers,\n 'content-type': 'application/json',\n },\n body: JSON.stringify({ new_projects: projectIds }),\n signal,\n })\n if (!response.ok) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n }\n\n async getAuthenticatedUser(signal?: AbortSignal) {\n const url = new URL(this.baseUrl + '/v2/user')\n const response = await this.fetch(url, {\n headers: this.headers,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as User\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/api/operations/followproject/#_top\n */\n async followProject(id: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v2/project/${id}/follow`)\n const response = await this.fetch(url, {\n method: 'POST',\n headers: this.headers,\n signal,\n })\n if (!response.ok) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n }\n\n /**\n * @see https://docs.modrinth.com/api/operations/unfollowproject/\n */\n async unfollowProject(id: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v2/project/${id}/follow`)\n const response = await this.fetch(url, {\n method: 'DELETE',\n headers: this.headers,\n signal,\n })\n if (!response.ok) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n }\n\n /**\n * @see https://docs.modrinth.com/api/operations/getfollowedprojects/#_top\n */\n async getUserFollowedProjects(userId: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v2/user/${userId}/follows`)\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as Project[]\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/teams/operation/getProjectTeamMembers\n */\n async getProjectTeamMembers(projectId: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v2/project/${projectId}/members`)\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as TeamMember[]\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/users/operation/getUser\n */\n async getUser(id: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v2/user/${id}`)\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as User\n return result\n }\n\n /**\n * @see https://docs.modrinth.com/#tag/users/operation/getUserProjects\n */\n async getUserProjects(id: string, signal?: AbortSignal) {\n const url = new URL(this.baseUrl + `/v2/user/${id}/projects`)\n const response = await this.fetch(url, {\n headers: this.headers,\n signal,\n })\n if (response.status !== 200) {\n throw new ModerinthApiError(url.toString(), response.status, await response.text())\n }\n const result = await response.json() as Project[]\n return result\n }\n}\n"], "mappings": "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", "names": [] }