diff --git a/.gitmodules b/.gitmodules index b3e72e9d6..ab5a6af0a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -128,3 +128,8 @@ url = https://github.com/distilled-mirror/spec-mirror-modal.git ignore = dirty shallow = true +[submodule "packages/modrinth/specs/spec-mirror-modrinth"] + path = packages/modrinth/specs/spec-mirror-modrinth + url = https://github.com/distilled-mirror/spec-mirror-modrinth.git + ignore = dirty + shallow = true diff --git a/packages/modrinth/.generated-specs/modrinth.json b/packages/modrinth/.generated-specs/modrinth.json new file mode 100644 index 000000000..d3a05b98c --- /dev/null +++ b/packages/modrinth/.generated-specs/modrinth.json @@ -0,0 +1,10950 @@ +{ + "smithy": "2.0", + "metadata": { + "suppressions": [ + { + "id": "HttpUriConflict", + "namespace": "*" + }, + { + "id": "HttpMethodSemantics", + "namespace": "*" + }, + { + "id": "UnreferencedShape", + "namespace": "*" + } + ] + }, + "shapes": { + "com.modrinth.api#SearchProjectsRequestIndex": { + "type": "enum", + "members": { + "RELEVANCE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "relevance" + } + }, + "DOWNLOADS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "downloads" + } + }, + "FOLLOWS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "follows" + } + }, + "NEWEST": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "newest" + } + }, + "UPDATED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "updated" + } + } + }, + "traits": {} + }, + "com.modrinth.api#SearchProjectsRequest": { + "type": "structure", + "members": { + "query": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "query", + "smithy.api#documentation": "The query to search for" + } + }, + "facets": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "facets", + "smithy.api#documentation": "Facets are an essential concept for understanding how to filter out results.\n\nThese are the most commonly used facet types:\n- `project_type`\n- `all_project_types` (matches against every project type across all of the project's versions, not just the primary/version-specific type)\n- `categories` (loaders are lumped in with categories in search)\n- `versions`\n- `open_source`\n- `environment` (one of the following values)\n - `client_and_server`\n - `client_only`\n - `client_only_server_optional`\n - `singleplayer_only`\n - `server_only`\n - `server_only_client_optional`\n - `dedicated_server_only`\n - `client_or_server`\n - `client_or_server_prefers_both`\n - `unknown`\n- `disclosure_types` (list of any of the following values)\n - `ai_content`\n - `ai_content_code`\n - `ai_content_assets`\n - `ai_content_text`\n - `ai_content_functionality`\n - `advertisements`\n - `epilepsy_triggers`\n - `system_interactions`\n - `telemetry`\n - `telemetry_opt_in`\n - `telemetry_opt_out`\n - `telemetry_always_active`\n - `derivative_work`\n - `paid_features`\n - `archived`\n- `client_side` (deprecated - use `environment` instead)\n- `server_side` (deprecated - use `environment` instead)\n\nSeveral others are also available for use, though these should not be used outside very specific use cases.\n- `title`\n- `author`\n- `follows`\n- `project_id`\n- `license`\n- `downloads`\n- `created_timestamp` (uses Unix timestamp)\n- `modified_timestamp` (uses Unix timestamp)\n\nIn order to then use these facets, you need a value to filter by, as well as an operation to perform on this value.\nThe most common operation is `:` (same as `=`), though you can also use `!=`, `>=`, `>`, `<=`, and `<`.\nJoin together the type, operation, and value, and you've got your string.\n```\n{type} {operation} {value}\n```\n\nExamples:\n```\ncategories = adventure\nversions != 1.20.1\ndownloads <= 100\n```\n\nYou then join these strings together in arrays to signal `AND` and `OR` operators.\n\n##### OR\nAll elements in a single array are considered to be joined by OR statements.\nFor example, the search `[[\"versions:1.16.5\", \"versions:1.17.1\"]]` translates to `Projects that support 1.16.5 OR 1.17.1`.\n\n##### AND\nSeparate arrays are considered to be joined by AND statements.\nFor example, the search `[[\"versions:1.16.5\"], [\"project_type:modpack\"]]` translates to `Projects that support 1.16.5 AND are modpacks`.\n" + } + }, + "index": { + "target": "com.modrinth.api#SearchProjectsRequestIndex", + "traits": { + "smithy.api#httpQuery": "index", + "smithy.api#documentation": "The sorting method used for sorting search results" + } + }, + "offset": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "offset", + "smithy.api#documentation": "The offset into the search. Skips this number of results" + } + }, + "limit": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "limit", + "smithy.api#documentation": "The number of results returned by the search" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#SearchResults": { + "type": "structure", + "members": { + "hits": { + "target": "com.modrinth.api#SearchResultsHitsList", + "traits": { + "smithy.api#documentation": "The list of results", + "smithy.api#required": {} + } + }, + "offset": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of results that were skipped by the query", + "smithy.api#required": {} + } + }, + "limit": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of results that were returned by the query", + "smithy.api#required": {} + } + }, + "total_hits": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The total number of results that match the query", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectResult": { + "type": "structure", + "members": { + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_type": { + "target": "com.modrinth.api#ProjectResultProjectType", + "traits": { + "smithy.api#documentation": "The project type of the project", + "smithy.api#required": {} + } + }, + "all_project_types": { + "target": "com.modrinth.api#ProjectResultAllProjectTypesList", + "traits": { + "smithy.api#documentation": "All project types across every version of the project, unlike `project_type` which only reflects a version-specific type", + "smithy.api#required": {} + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title or name of the project", + "smithy.api#required": {} + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A short sentence summarizing the project, no more than a sentence or two.", + "smithy.api#required": {} + } + }, + "author": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The username of the project's author", + "smithy.api#required": {} + } + }, + "categories": { + "target": "com.modrinth.api#ProjectResultCategoriesList", + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has.", + "smithy.api#required": {} + } + }, + "display_categories": { + "target": "com.modrinth.api#ProjectResultDisplayCategoriesList", + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has. Equivalent to `categories` on the project itself.", + "smithy.api#required": {} + } + }, + "versions": { + "target": "com.modrinth.api#ProjectResultVersionsList", + "traits": { + "smithy.api#documentation": "A list of the minecraft versions supported by the project", + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The total number of downloads of the project", + "smithy.api#required": {} + } + }, + "follows": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The total number of users following the project", + "smithy.api#required": {} + } + }, + "icon_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL of the project's icon", + "smithy.api#required": {} + } + }, + "date_created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date the project was created", + "smithy.api#required": {} + } + }, + "date_modified": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date the latest version of the project was created", + "smithy.api#required": {} + } + }, + "latest_version": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the latest version of the project", + "smithy.api#required": {} + } + }, + "license": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SPDX license ID of a project", + "smithy.api#required": {} + } + }, + "environment": { + "target": "com.modrinth.api#ProjectResultEnvironmentList", + "traits": { + "smithy.api#documentation": "All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system", + "smithy.api#required": {} + } + }, + "disclosure_types": { + "target": "com.modrinth.api#ProjectResultDisclosureTypesList", + "traits": { + "smithy.api#documentation": "Disclosures listed on the project.", + "smithy.api#required": {} + } + }, + "gallery": { + "target": "com.modrinth.api#ProjectResultGalleryList", + "traits": { + "smithy.api#documentation": "A list of images that have been uploaded to the project's gallery", + "smithy.api#required": {} + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The slug of a project, used for vanity URLs. Regex: ```^[\\w!@$()`.+,\"\\-']{3,64}$```", + "com.distilled.openapi#nullable": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project's author", + "com.distilled.openapi#nullable": {} + } + }, + "organization": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the organization that owns this project", + "com.distilled.openapi#nullable": {} + } + }, + "organization_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the organization that owns this project", + "com.distilled.openapi#nullable": {} + } + }, + "featured_gallery": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The featured gallery image of the project", + "com.distilled.openapi#nullable": {} + } + }, + "color": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The RGB color of the project, automatically generated from the project icon", + "com.distilled.openapi#nullable": {} + } + }, + "client_side": { + "target": "com.modrinth.api#ProjectResultClientSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead. The client side support of the project", + "smithy.api#required": {} + } + }, + "server_side": { + "target": "com.modrinth.api#ProjectResultServerSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead. The server side support of the project", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectResultProjectType": { + "type": "enum", + "members": { + "MOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mod" + } + }, + "MODPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "modpack" + } + }, + "RESOURCEPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "resourcepack" + } + }, + "SHADER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "shader" + } + } + }, + "traits": { + "smithy.api#documentation": "The project type of the project" + } + }, + "com.modrinth.api#ProjectResultAllProjectTypesItem": { + "type": "enum", + "members": { + "MOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mod" + } + }, + "RESOURCEPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "resourcepack" + } + }, + "DATAPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "datapack" + } + }, + "SHADER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "shader" + } + }, + "MODPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "modpack" + } + }, + "PLUGIN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "plugin" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectResultAllProjectTypesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectResultAllProjectTypesItem" + }, + "traits": { + "smithy.api#documentation": "All project types across every version of the project, unlike `project_type` which only reflects a version-specific type" + } + }, + "com.modrinth.api#ProjectResultCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has." + } + }, + "com.modrinth.api#ProjectResultDisplayCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has. Equivalent to `categories` on the project itself." + } + }, + "com.modrinth.api#ProjectResultVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the minecraft versions supported by the project" + } + }, + "com.modrinth.api#EnvironmentEnum": { + "type": "enum", + "members": { + "CLIENT_AND_SERVER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_and_server" + } + }, + "CLIENT_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_only" + } + }, + "CLIENT_ONLY_SERVER_OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_only_server_optional" + } + }, + "SINGLEPLAYER_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "singleplayer_only" + } + }, + "SERVER_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "server_only" + } + }, + "SERVER_ONLY_CLIENT_OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "server_only_client_optional" + } + }, + "DEDICATED_SERVER_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "dedicated_server_only" + } + }, + "CLIENT_OR_SERVER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_or_server" + } + }, + "CLIENT_OR_SERVER_PREFERS_BOTH": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_or_server_prefers_both" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The environment a project or version supports. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system" + } + }, + "com.modrinth.api#ProjectResultEnvironmentList": { + "type": "list", + "member": { + "target": "com.modrinth.api#EnvironmentEnum" + }, + "traits": { + "smithy.api#documentation": "All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system" + } + }, + "com.modrinth.api#DisclosureTypeEnum": { + "type": "enum", + "members": { + "AI_CONTENT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ai_content" + } + }, + "AI_CONTENT_CODE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ai_content_code" + } + }, + "AI_CONTENT_ASSETS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ai_content_assets" + } + }, + "AI_CONTENT_TEXT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ai_content_text" + } + }, + "AI_CONTENT_FUNCTIONALITY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "ai_content_functionality" + } + }, + "ADVERTISEMENTS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "advertisements" + } + }, + "EPILEPSY_TRIGGERS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "epilepsy_triggers" + } + }, + "SYSTEM_INTERACTIONS": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "system_interactions" + } + }, + "TELEMETRY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "telemetry" + } + }, + "TELEMETRY_OPT_IN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "telemetry_opt_in" + } + }, + "TELEMETRY_OPT_OUT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "telemetry_opt_out" + } + }, + "TELEMETRY_ALWAYS_ACTIVE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "telemetry_always_active" + } + }, + "DERIVATIVE_WORK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "derivative_work" + } + }, + "PAID_FEATURES": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "paid_features" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectResultDisclosureTypesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#DisclosureTypeEnum" + }, + "traits": { + "smithy.api#documentation": "Disclosures listed on the project." + } + }, + "com.modrinth.api#ProjectResultGalleryList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of images that have been uploaded to the project's gallery" + } + }, + "com.modrinth.api#ProjectResultClientSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead. The client side support of the project" + } + }, + "com.modrinth.api#ProjectResultServerSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead. The server side support of the project" + } + }, + "com.modrinth.api#SearchResultsHitsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectResult" + }, + "traits": { + "smithy.api#documentation": "The list of results" + } + }, + "com.modrinth.api#SearchProjects": { + "type": "operation", + "input": { + "target": "com.modrinth.api#SearchProjectsRequest" + }, + "output": { + "target": "com.modrinth.api#SearchResults" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/search", + "code": 200 + }, + "smithy.api#documentation": "Search projects" + } + }, + "com.modrinth.api#GetProjectRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#Project": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "team": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the team that has ownership of this project", + "smithy.api#required": {} + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title or name of the project", + "smithy.api#required": {} + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A short sentence summarizing the project, no more than a sentence or two.", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A long form description of the project", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#ProjectStatus", + "traits": { + "smithy.api#documentation": "The status of the project", + "smithy.api#required": {} + } + }, + "project_type": { + "target": "com.modrinth.api#ProjectProjectType", + "traits": { + "smithy.api#documentation": "The project type of the project", + "smithy.api#required": {} + } + }, + "categories": { + "target": "com.modrinth.api#ProjectCategoriesList", + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has.", + "smithy.api#required": {} + } + }, + "additional_categories": { + "target": "com.modrinth.api#ProjectAdditionalCategoriesList", + "traits": { + "smithy.api#documentation": "A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again.", + "smithy.api#required": {} + } + }, + "environment": { + "target": "com.modrinth.api#ProjectEnvironmentList", + "traits": { + "smithy.api#documentation": "All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system", + "smithy.api#required": {} + } + }, + "game_versions": { + "target": "com.modrinth.api#ProjectGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of all of the game versions supported by the project", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#ProjectLoadersList", + "traits": { + "smithy.api#documentation": "A list of all of the loaders supported by the project. These vary based on project type.", + "smithy.api#required": {} + } + }, + "versions": { + "target": "com.modrinth.api#ProjectVersionsList", + "traits": { + "smithy.api#documentation": "A list of the version IDs of the project", + "smithy.api#required": {} + } + }, + "license": { + "target": "com.modrinth.api#ProjectLicense", + "traits": { + "smithy.api#required": {} + } + }, + "published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date the project was created", + "smithy.api#required": {} + } + }, + "updated": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date the latest version of the project was created", + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The total number of downloads of the project", + "smithy.api#required": {} + } + }, + "followers": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The total number of users following the project", + "smithy.api#required": {} + } + }, + "gallery": { + "target": "com.modrinth.api#ProjectGalleryList", + "traits": { + "smithy.api#documentation": "A list of images that have been uploaded to the project's gallery", + "smithy.api#required": {} + } + }, + "thread_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the moderation thread associated with this project", + "smithy.api#required": {} + } + }, + "monetization_status": { + "target": "com.modrinth.api#ProjectMonetizationStatus", + "traits": { + "smithy.api#required": {} + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The slug of a project, used for vanity URLs. Regex: ```^[\\w!@$()`.+,\"\\-']{3,64}$```", + "com.distilled.openapi#nullable": {} + } + }, + "organization": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the organization that owns this project", + "com.distilled.openapi#nullable": {} + } + }, + "requested_status": { + "target": "com.modrinth.api#ProjectRequestedStatus", + "traits": { + "smithy.api#documentation": "The requested status when submitting for review or scheduling the project for release. Approved status refers to \"Public\" visibility.", + "com.distilled.openapi#nullable": {} + } + }, + "approved": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date the project was first published", + "com.distilled.openapi#nullable": {} + } + }, + "queued": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date the project's status was submitted to moderators for review", + "com.distilled.openapi#nullable": {} + } + }, + "icon_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL of the project's icon", + "com.distilled.openapi#nullable": {} + } + }, + "raw_icon_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL of the project's icon without CDN transforms applied", + "com.distilled.openapi#nullable": {} + } + }, + "color": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The RGB color of the project, automatically generated from the project icon", + "com.distilled.openapi#nullable": {} + } + }, + "issues_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to where to submit bugs or issues with the project", + "com.distilled.openapi#nullable": {} + } + }, + "source_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the source code of the project", + "com.distilled.openapi#nullable": {} + } + }, + "wiki_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the project's wiki page or other relevant information", + "com.distilled.openapi#nullable": {} + } + }, + "discord_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional invite link to the project's discord.", + "com.distilled.openapi#nullable": {} + } + }, + "donation_urls": { + "target": "com.modrinth.api#ProjectDonationUrlsList", + "traits": { + "smithy.api#documentation": "A list of donation links for the project", + "com.distilled.openapi#nullable": {} + } + }, + "client_side": { + "target": "com.modrinth.api#ProjectClientSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead.", + "smithy.api#required": {} + } + }, + "server_side": { + "target": "com.modrinth.api#ProjectServerSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead.", + "smithy.api#required": {} + } + }, + "body_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "Deprecated - The link to the long description of the project. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "moderator_message": { + "target": "com.modrinth.api#ModeratorMessage", + "traits": { + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The status of the project" + } + }, + "com.modrinth.api#ProjectProjectType": { + "type": "enum", + "members": { + "MOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mod" + } + }, + "MODPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "modpack" + } + }, + "RESOURCEPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "resourcepack" + } + }, + "SHADER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "shader" + } + } + }, + "traits": { + "smithy.api#documentation": "The project type of the project" + } + }, + "com.modrinth.api#ProjectCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has." + } + }, + "com.modrinth.api#ProjectAdditionalCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again." + } + }, + "com.modrinth.api#ProjectEnvironmentList": { + "type": "list", + "member": { + "target": "com.modrinth.api#EnvironmentEnum" + }, + "traits": { + "smithy.api#documentation": "All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system" + } + }, + "com.modrinth.api#ProjectGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of all of the game versions supported by the project" + } + }, + "com.modrinth.api#ProjectLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of all of the loaders supported by the project. These vary based on project type." + } + }, + "com.modrinth.api#ProjectVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the version IDs of the project" + } + }, + "com.modrinth.api#ProjectLicense": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SPDX license ID of a project" + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The long name of a license" + } + }, + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL to this license", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#documentation": "The license of the project" + } + }, + "com.modrinth.api#GalleryImage": { + "type": "structure", + "members": { + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL of the gallery image", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the image is featured in the gallery", + "smithy.api#required": {} + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title of the gallery image", + "com.distilled.openapi#nullable": {} + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The description of the gallery image", + "com.distilled.openapi#nullable": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date and time the gallery image was created", + "smithy.api#required": {} + } + }, + "ordering": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The order of the gallery image. Gallery images are sorted by this field and then alphabetically by title." + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectGalleryList": { + "type": "list", + "member": { + "target": "com.modrinth.api#GalleryImage" + }, + "traits": { + "smithy.api#documentation": "A list of images that have been uploaded to the project's gallery" + } + }, + "com.modrinth.api#ProjectMonetizationStatus": { + "type": "enum", + "members": { + "MONETIZED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "monetized" + } + }, + "DEMONETIZED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "demonetized" + } + }, + "FORCE_DEMONETIZED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "force-demonetized" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectRequestedStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + } + }, + "traits": { + "smithy.api#documentation": "The requested status when submitting for review or scheduling the project for release. Approved status refers to \"Public\" visibility." + } + }, + "com.modrinth.api#ProjectDonationURL": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the donation platform" + } + }, + "platform": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The donation platform this link is to" + } + }, + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL of the donation platform and user" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectDonationUrlsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectDonationURL" + }, + "traits": { + "smithy.api#documentation": "A list of donation links for the project" + } + }, + "com.modrinth.api#ProjectClientSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "com.modrinth.api#ProjectServerSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "com.modrinth.api#ModeratorMessage": { + "type": "structure", + "members": { + "message": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The message that a moderator has left for the project" + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The longer body of the message that a moderator has left for the project", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - A message that a moderator sent regarding the project" + } + }, + "com.modrinth.api#GetProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetProjectRequest" + }, + "output": { + "target": "com.modrinth.api#Project" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/project/{id_slug}", + "code": 200 + }, + "smithy.api#documentation": "Get a project" + } + }, + "com.modrinth.api#ModifyProjectRequestCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has." + } + }, + "com.modrinth.api#ModifyProjectRequestAdditionalCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again." + } + }, + "com.modrinth.api#ModifyProjectRequestStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The status of the project" + } + }, + "com.modrinth.api#ModifyProjectRequestRequestedStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + } + }, + "traits": { + "smithy.api#documentation": "The requested status when submitting for review or scheduling the project for release. Approved status refers to \"Public\" visibility." + } + }, + "com.modrinth.api#ModifyProjectRequestDonationUrlsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectDonationURL" + }, + "traits": { + "smithy.api#documentation": "A list of donation links for the project" + } + }, + "com.modrinth.api#ModifyProjectRequestClientSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "com.modrinth.api#ModifyProjectRequestServerSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "com.modrinth.api#ModifyProjectRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The slug of a project, used for vanity URLs. Regex: ```^[\\w!@$()`.+,\"\\-']{3,64}$```" + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title or name of the project" + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A short sentence summarizing the project, no more than a sentence or two." + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A long form description of the project" + } + }, + "categories": { + "target": "com.modrinth.api#ModifyProjectRequestCategoriesList", + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has." + } + }, + "additional_categories": { + "target": "com.modrinth.api#ModifyProjectRequestAdditionalCategoriesList", + "traits": { + "smithy.api#documentation": "A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again." + } + }, + "status": { + "target": "com.modrinth.api#ModifyProjectRequestStatus", + "traits": { + "smithy.api#documentation": "The status of the project" + } + }, + "requested_status": { + "target": "com.modrinth.api#ModifyProjectRequestRequestedStatus", + "traits": { + "smithy.api#documentation": "The requested status when submitting for review or scheduling the project for release. Approved status refers to \"Public\" visibility.", + "com.distilled.openapi#nullable": {} + } + }, + "issues_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to where to submit bugs or issues with the project", + "com.distilled.openapi#nullable": {} + } + }, + "source_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the source code of the project", + "com.distilled.openapi#nullable": {} + } + }, + "wiki_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the project's wiki page or other relevant information", + "com.distilled.openapi#nullable": {} + } + }, + "discord_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional invite link to the project's discord.", + "com.distilled.openapi#nullable": {} + } + }, + "donation_urls": { + "target": "com.modrinth.api#ModifyProjectRequestDonationUrlsList", + "traits": { + "smithy.api#documentation": "A list of donation links for the project" + } + }, + "client_side": { + "target": "com.modrinth.api#ModifyProjectRequestClientSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "server_side": { + "target": "com.modrinth.api#ModifyProjectRequestServerSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "license_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SPDX license ID of a project" + } + }, + "license_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL to this license", + "com.distilled.openapi#nullable": {} + } + }, + "moderation_message": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title of the moderators' message for the project", + "com.distilled.openapi#nullable": {} + } + }, + "moderation_message_body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The body of the moderators' message for the project", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ModifyProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ModifyProjectRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/project/{id_slug}", + "code": 200 + }, + "smithy.api#documentation": "Modify a project" + } + }, + "com.modrinth.api#DeleteProjectRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteProjectRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/project/{id_slug}", + "code": 200 + }, + "smithy.api#documentation": "Delete a project" + } + }, + "com.modrinth.api#GetProjectsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs and/or slugs of the projects" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetProjectsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Project" + }, + "traits": {} + }, + "com.modrinth.api#GetProjectsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetProjectsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetProjects": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetProjectsRequest" + }, + "output": { + "target": "com.modrinth.api#GetProjectsResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/projects", + "code": 200 + }, + "smithy.api#documentation": "Get multiple projects" + } + }, + "com.modrinth.api#PatchProjectsRequestCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "Set all of the categories to the categories specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestAddCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "Add all of the categories specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestRemoveCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "Remove all of the categories specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestAdditionalCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "Set all of the additional categories to the categories specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestAddAdditionalCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "Add all of the additional categories specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestRemoveAdditionalCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "Remove all of the additional categories specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestDonationUrlsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectDonationURL" + }, + "traits": { + "smithy.api#documentation": "Set all of the donation links to the donation links specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestAddDonationUrlsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectDonationURL" + }, + "traits": { + "smithy.api#documentation": "Add all of the donation links specified here" + } + }, + "com.modrinth.api#PatchProjectsRequestRemoveDonationUrlsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectDonationURL" + }, + "traits": { + "smithy.api#documentation": "Remove all of the donation links specified here" + } + }, + "com.modrinth.api#PatchProjectsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs and/or slugs of the projects" + } + }, + "categories": { + "target": "com.modrinth.api#PatchProjectsRequestCategoriesList", + "traits": { + "smithy.api#documentation": "Set all of the categories to the categories specified here" + } + }, + "add_categories": { + "target": "com.modrinth.api#PatchProjectsRequestAddCategoriesList", + "traits": { + "smithy.api#documentation": "Add all of the categories specified here" + } + }, + "remove_categories": { + "target": "com.modrinth.api#PatchProjectsRequestRemoveCategoriesList", + "traits": { + "smithy.api#documentation": "Remove all of the categories specified here" + } + }, + "additional_categories": { + "target": "com.modrinth.api#PatchProjectsRequestAdditionalCategoriesList", + "traits": { + "smithy.api#documentation": "Set all of the additional categories to the categories specified here" + } + }, + "add_additional_categories": { + "target": "com.modrinth.api#PatchProjectsRequestAddAdditionalCategoriesList", + "traits": { + "smithy.api#documentation": "Add all of the additional categories specified here" + } + }, + "remove_additional_categories": { + "target": "com.modrinth.api#PatchProjectsRequestRemoveAdditionalCategoriesList", + "traits": { + "smithy.api#documentation": "Remove all of the additional categories specified here" + } + }, + "donation_urls": { + "target": "com.modrinth.api#PatchProjectsRequestDonationUrlsList", + "traits": { + "smithy.api#documentation": "Set all of the donation links to the donation links specified here" + } + }, + "add_donation_urls": { + "target": "com.modrinth.api#PatchProjectsRequestAddDonationUrlsList", + "traits": { + "smithy.api#documentation": "Add all of the donation links specified here" + } + }, + "remove_donation_urls": { + "target": "com.modrinth.api#PatchProjectsRequestRemoveDonationUrlsList", + "traits": { + "smithy.api#documentation": "Remove all of the donation links specified here" + } + }, + "issues_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to where to submit bugs or issues with the projects", + "com.distilled.openapi#nullable": {} + } + }, + "source_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the source code of the projects", + "com.distilled.openapi#nullable": {} + } + }, + "wiki_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the projects' wiki page or other relevant information", + "com.distilled.openapi#nullable": {} + } + }, + "discord_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional invite link to the projects' discord", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#PatchProjects": { + "type": "operation", + "input": { + "target": "com.modrinth.api#PatchProjectsRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/projects", + "code": 200 + }, + "smithy.api#documentation": "Bulk-edit multiple projects" + } + }, + "com.modrinth.api#RandomProjectsRequest": { + "type": "structure", + "members": { + "count": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "count", + "smithy.api#required": {}, + "smithy.api#documentation": "The number of random projects to return" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#RandomProjectsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Project" + }, + "traits": {} + }, + "com.modrinth.api#RandomProjectsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#RandomProjectsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#RandomProjects": { + "type": "operation", + "input": { + "target": "com.modrinth.api#RandomProjectsRequest" + }, + "output": { + "target": "com.modrinth.api#RandomProjectsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/projects_random", + "code": 200 + }, + "smithy.api#documentation": "Get a list of random projects" + } + }, + "com.modrinth.api#CreatableProject": { + "type": "structure", + "members": { + "slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The slug of a project, used for vanity URLs. Regex: ```^[\\w!@$()`.+,\"\\-']{3,64}$```", + "smithy.api#required": {} + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title or name of the project", + "smithy.api#required": {} + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A short sentence summarizing the project, no more than a sentence or two.", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A long form description of the project", + "smithy.api#required": {} + } + }, + "categories": { + "target": "com.modrinth.api#CreatableProjectCategoriesList", + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has.", + "smithy.api#required": {} + } + }, + "additional_categories": { + "target": "com.modrinth.api#CreatableProjectAdditionalCategoriesList", + "traits": { + "smithy.api#documentation": "A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again." + } + }, + "status": { + "target": "com.modrinth.api#CreatableProjectStatus", + "traits": { + "smithy.api#documentation": "The status of the project" + } + }, + "requested_status": { + "target": "com.modrinth.api#CreatableProjectRequestedStatus", + "traits": { + "smithy.api#documentation": "The requested status when submitting for review or scheduling the project for release. Approved status refers to \"Public\" visibility.", + "com.distilled.openapi#nullable": {} + } + }, + "issues_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to where to submit bugs or issues with the project", + "com.distilled.openapi#nullable": {} + } + }, + "source_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the source code of the project", + "com.distilled.openapi#nullable": {} + } + }, + "wiki_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional link to the project's wiki page or other relevant information", + "com.distilled.openapi#nullable": {} + } + }, + "discord_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "An optional invite link to the project's discord.", + "com.distilled.openapi#nullable": {} + } + }, + "donation_urls": { + "target": "com.modrinth.api#CreatableProjectDonationUrlsList", + "traits": { + "smithy.api#documentation": "A list of donation links for the project" + } + }, + "client_side": { + "target": "com.modrinth.api#CreatableProjectClientSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead.", + "smithy.api#required": {} + } + }, + "server_side": { + "target": "com.modrinth.api#CreatableProjectServerSide", + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead.", + "smithy.api#required": {} + } + }, + "license_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SPDX license ID of a project", + "smithy.api#required": {} + } + }, + "license_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The URL to this license", + "com.distilled.openapi#nullable": {} + } + }, + "project_type": { + "target": "com.modrinth.api#CreatableProjectProjectType", + "traits": { + "smithy.api#documentation": "The project type of the project", + "smithy.api#required": {} + } + }, + "initial_versions": { + "target": "com.modrinth.api#CreatableProjectInitialVersionsList", + "traits": { + "smithy.api#documentation": "A list of initial versions to upload with the created project. Deprecated - please upload version files after initial upload." + } + }, + "is_draft": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the project should be saved as a draft instead of being sent to moderation for review. Deprecated - please always mark this as true." + } + }, + "gallery_items": { + "target": "com.modrinth.api#CreatableProjectGalleryItemsList", + "traits": { + "smithy.api#documentation": "Gallery images to be uploaded with the created project. Deprecated - please upload gallery images after initial upload." + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreatableProjectCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of the featured categories that the project has." + } + }, + "com.modrinth.api#CreatableProjectAdditionalCategoriesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again." + } + }, + "com.modrinth.api#CreatableProjectStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The status of the project" + } + }, + "com.modrinth.api#CreatableProjectRequestedStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + } + }, + "traits": { + "smithy.api#documentation": "The requested status when submitting for review or scheduling the project for release. Approved status refers to \"Public\" visibility." + } + }, + "com.modrinth.api#CreatableProjectDonationUrlsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ProjectDonationURL" + }, + "traits": { + "smithy.api#documentation": "A list of donation links for the project" + } + }, + "com.modrinth.api#CreatableProjectClientSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "com.modrinth.api#CreatableProjectServerSide": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "UNSUPPORTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unsupported" + } + } + }, + "traits": { + "smithy.api#documentation": "Deprecated - use `environment` instead." + } + }, + "com.modrinth.api#CreatableProjectProjectType": { + "type": "enum", + "members": { + "MOD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "mod" + } + }, + "MODPACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "modpack" + } + } + }, + "traits": { + "smithy.api#documentation": "The project type of the project" + } + }, + "com.modrinth.api#EditableVersion": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version" + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning" + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#EditableVersionDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#EditableVersionGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "version_type": { + "target": "com.modrinth.api#EditableVersionVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "loaders": { + "target": "com.modrinth.api#EditableVersionLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not" + } + }, + "status": { + "target": "com.modrinth.api#EditableVersionStatus" + }, + "requested_status": { + "target": "com.modrinth.api#EditableVersionRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "primary_file": { + "target": "com.modrinth.api#EditableVersionPrimaryFileList", + "traits": { + "smithy.api#documentation": "The hash format and the hash of the new primary file" + } + }, + "file_types": { + "target": "com.modrinth.api#EditableVersionFileTypesList", + "traits": { + "smithy.api#documentation": "A list of file_types to edit" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionDependency": { + "type": "structure", + "members": { + "version_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version that this version depends on", + "com.distilled.openapi#nullable": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project that this version depends on", + "com.distilled.openapi#nullable": {} + } + }, + "file_name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The file name of the dependency, mostly used for showing external dependencies on modpacks", + "com.distilled.openapi#nullable": {} + } + }, + "dependency_type": { + "target": "com.modrinth.api#VersionDependencyDependencyType", + "traits": { + "smithy.api#documentation": "The type of dependency that this version has", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionDependencyDependencyType": { + "type": "enum", + "members": { + "REQUIRED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required" + } + }, + "OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional" + } + }, + "INCOMPATIBLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "incompatible" + } + }, + "EMBEDDED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "embedded" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of dependency that this version has" + } + }, + "com.modrinth.api#EditableVersionDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#EditableVersionGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#EditableVersionVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#EditableVersionLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#EditableVersionStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#EditableVersionRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#EditableVersionPrimaryFileList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The hash format and the hash of the new primary file" + } + }, + "com.modrinth.api#EditableFileType": { + "type": "structure", + "members": { + "algorithm": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The hash algorithm of the hash specified in the hash field", + "smithy.api#required": {} + } + }, + "hash": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The hash of the file you're editing", + "smithy.api#required": {} + } + }, + "file_type": { + "target": "smithy.api#Document", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#EditableVersionFileTypesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#EditableFileType" + }, + "traits": { + "smithy.api#documentation": "A list of file_types to edit" + } + }, + "com.modrinth.api#CreatableProjectInitialVersionsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#EditableVersion" + }, + "traits": { + "smithy.api#documentation": "A list of initial versions to upload with the created project. Deprecated - please upload version files after initial upload." + } + }, + "com.modrinth.api#CreatableProjectGalleryItem": { + "type": "structure", + "members": { + "item": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the multipart item where the gallery media is located" + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the image is featured in the gallery" + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title of the gallery image", + "com.distilled.openapi#nullable": {} + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The description of the gallery image", + "com.distilled.openapi#nullable": {} + } + }, + "ordering": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The order of the gallery image. Gallery images are sorted by this field and then alphabetically by title." + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreatableProjectGalleryItemsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#CreatableProjectGalleryItem" + }, + "traits": { + "smithy.api#documentation": "Gallery images to be uploaded with the created project. Deprecated - please upload gallery images after initial upload." + } + }, + "com.modrinth.api#CreateProjectRequestIcon": { + "type": "enum", + "members": { + "PNG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.png" + } + }, + "JPG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.jpg" + } + }, + "JPEG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.jpeg" + } + }, + "BMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.bmp" + } + }, + "GIF": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.gif" + } + }, + "WEBP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.webp" + } + }, + "SVG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.svg" + } + }, + "SVGZ": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.svgz" + } + }, + "RGB": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "*.rgb" + } + } + }, + "traits": { + "smithy.api#documentation": "Project icon file" + } + }, + "com.modrinth.api#CreateProjectRequest": { + "type": "structure", + "members": { + "data": { + "target": "com.modrinth.api#CreatableProject", + "traits": { + "smithy.api#required": {} + } + }, + "icon": { + "target": "com.modrinth.api#CreateProjectRequestIcon", + "traits": { + "smithy.api#documentation": "Project icon file" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#CreateProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#CreateProjectRequest" + }, + "output": { + "target": "com.modrinth.api#Project" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/project", + "code": 200, + "contentType": "multipart" + }, + "smithy.api#documentation": "Create a project", + "com.distilled.openapi#contentType": "multipart" + } + }, + "com.modrinth.api#ChangeProjectIconRequestExt": { + "type": "enum", + "members": { + "PNG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "png" + } + }, + "JPG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "jpg" + } + }, + "JPEG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "jpeg" + } + }, + "BMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "bmp" + } + }, + "GIF": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "gif" + } + }, + "WEBP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "webp" + } + }, + "SVG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "svg" + } + }, + "SVGZ": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "svgz" + } + }, + "RGB": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rgb" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ChangeProjectIconRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "ext": { + "target": "com.modrinth.api#ChangeProjectIconRequestExt", + "traits": { + "smithy.api#httpQuery": "ext", + "smithy.api#required": {}, + "smithy.api#documentation": "Image extension" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ChangeProjectIcon": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ChangeProjectIconRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/project/{id_slug}/icon", + "code": 200 + }, + "smithy.api#documentation": "Change project's icon\n\nThe new icon may be up to 256KiB in size." + } + }, + "com.modrinth.api#DeleteProjectIconRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteProjectIcon": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteProjectIconRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/project/{id_slug}/icon", + "code": 200 + }, + "smithy.api#documentation": "Delete project's icon" + } + }, + "com.modrinth.api#CheckProjectValidityRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ProjectIdentifier": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String" + } + }, + "traits": {} + }, + "com.modrinth.api#CheckProjectValidity": { + "type": "operation", + "input": { + "target": "com.modrinth.api#CheckProjectValidityRequest" + }, + "output": { + "target": "com.modrinth.api#ProjectIdentifier" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/project/{id_slug}/check", + "code": 200 + }, + "smithy.api#documentation": "Check project slug/ID validity" + } + }, + "com.modrinth.api#AddGalleryImageRequestExt": { + "type": "enum", + "members": { + "PNG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "png" + } + }, + "JPG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "jpg" + } + }, + "JPEG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "jpeg" + } + }, + "BMP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "bmp" + } + }, + "GIF": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "gif" + } + }, + "WEBP": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "webp" + } + }, + "SVG": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "svg" + } + }, + "SVGZ": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "svgz" + } + }, + "RGB": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rgb" + } + } + }, + "traits": {} + }, + "com.modrinth.api#AddGalleryImageRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "ext": { + "target": "com.modrinth.api#AddGalleryImageRequestExt", + "traits": { + "smithy.api#httpQuery": "ext", + "smithy.api#required": {}, + "smithy.api#documentation": "Image extension" + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#httpQuery": "featured", + "smithy.api#required": {}, + "smithy.api#documentation": "Whether an image is featured" + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "title", + "smithy.api#documentation": "Title of the image" + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "description", + "smithy.api#documentation": "Description of the image" + } + }, + "ordering": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "ordering", + "smithy.api#documentation": "Ordering of the image" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#AddGalleryImage": { + "type": "operation", + "input": { + "target": "com.modrinth.api#AddGalleryImageRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + }, + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/project/{id_slug}/gallery", + "code": 200 + }, + "smithy.api#documentation": "Add a gallery image\n\nModrinth allows you to upload files of up to 5MiB to a project's gallery." + } + }, + "com.modrinth.api#ModifyGalleryImageRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "url", + "smithy.api#required": {}, + "smithy.api#documentation": "URL link of the image to modify" + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#httpQuery": "featured", + "smithy.api#documentation": "Whether the image is featured" + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "title", + "smithy.api#documentation": "New title of the image" + } + }, + "description": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "description", + "smithy.api#documentation": "New description of the image" + } + }, + "ordering": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "ordering", + "smithy.api#documentation": "New ordering of the image" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ModifyGalleryImage": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ModifyGalleryImageRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/project/{id_slug}/gallery", + "code": 200 + }, + "smithy.api#documentation": "Modify a gallery image" + } + }, + "com.modrinth.api#DeleteGalleryImageRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "url", + "smithy.api#required": {}, + "smithy.api#documentation": "URL link of the image to delete" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteGalleryImage": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteGalleryImageRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/project/{id_slug}/gallery", + "code": 200 + }, + "smithy.api#documentation": "Delete a gallery image" + } + }, + "com.modrinth.api#GetDependenciesRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ProjectDependencyList": { + "type": "structure", + "members": { + "projects": { + "target": "com.modrinth.api#ProjectDependencyListProjectsList", + "traits": { + "smithy.api#documentation": "Projects that the project depends upon" + } + }, + "versions": { + "target": "com.modrinth.api#ProjectDependencyListVersionsList", + "traits": { + "smithy.api#documentation": "Versions that the project depends upon" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ProjectDependencyListProjectsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Project" + }, + "traits": { + "smithy.api#documentation": "Projects that the project depends upon" + } + }, + "com.modrinth.api#Version": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#VersionDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#VersionGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#VersionVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#VersionLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#VersionStatus" + }, + "requested_status": { + "target": "com.modrinth.api#VersionRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author who published this version", + "smithy.api#required": {} + } + }, + "date_published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of times this version has been downloaded", + "smithy.api#required": {} + } + }, + "changelog_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the changelog for this version. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentEnum", + "traits": { + "smithy.api#required": {} + } + }, + "files": { + "target": "com.modrinth.api#VersionFilesList", + "traits": { + "smithy.api#documentation": "A list of files available for download for this version", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#VersionGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#VersionVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#VersionLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#VersionStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionFile": { + "type": "structure", + "members": { + "hashes": { + "target": "com.modrinth.api#VersionFileHashes", + "traits": { + "smithy.api#required": {} + } + }, + "url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A direct link to the file", + "smithy.api#required": {} + } + }, + "filename": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the file", + "smithy.api#required": {} + } + }, + "primary": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether this file is the primary one for its version. Only a maximum of one file per version will have this set to true. If there are not any primary files, it can be inferred that the first file is the primary one.", + "smithy.api#required": {} + } + }, + "size": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The size of the file in bytes", + "smithy.api#required": {} + } + }, + "file_type": { + "target": "smithy.api#Document" + } + }, + "traits": {} + }, + "com.modrinth.api#VersionFileHashes": { + "type": "structure", + "members": { + "sha512": { + "target": "smithy.api#String" + }, + "sha1": { + "target": "smithy.api#String" + } + }, + "traits": { + "smithy.api#documentation": "A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash." + } + }, + "com.modrinth.api#VersionFilesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionFile" + }, + "traits": { + "smithy.api#documentation": "A list of files available for download for this version" + } + }, + "com.modrinth.api#ProjectDependencyListVersionsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Version" + }, + "traits": { + "smithy.api#documentation": "Versions that the project depends upon" + } + }, + "com.modrinth.api#GetDependencies": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetDependenciesRequest" + }, + "output": { + "target": "com.modrinth.api#ProjectDependencyList" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/project/{id_slug}/dependencies", + "code": 200 + }, + "smithy.api#documentation": "Get all of a project's dependencies" + } + }, + "com.modrinth.api#FollowProjectRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#FollowProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#FollowProjectRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/project/{id_slug}/follow", + "code": 200 + }, + "smithy.api#documentation": "Follow a project" + } + }, + "com.modrinth.api#UnfollowProjectRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#UnfollowProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#UnfollowProjectRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/project/{id_slug}/follow", + "code": 200 + }, + "smithy.api#documentation": "Unfollow a project" + } + }, + "com.modrinth.api#ScheduleProjectRequestRequestedStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + } + }, + "traits": { + "smithy.api#documentation": "The requested status when scheduling the project for release" + } + }, + "com.modrinth.api#ScheduleProjectRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "time": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "requested_status": { + "target": "com.modrinth.api#ScheduleProjectRequestRequestedStatus", + "traits": { + "smithy.api#documentation": "The requested status when scheduling the project for release", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ScheduleProject": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ScheduleProjectRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/project/{id_slug}/schedule", + "code": 200 + }, + "smithy.api#documentation": "Schedule a project" + } + }, + "com.modrinth.api#GetProjectVersionsRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "loaders": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "loaders", + "smithy.api#documentation": "The types of loaders to filter for" + } + }, + "game_versions": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "game_versions", + "smithy.api#documentation": "The game versions to filter for" + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#httpQuery": "featured", + "smithy.api#documentation": "Allows to filter for featured or non-featured versions only" + } + }, + "include_changelog": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#httpQuery": "include_changelog", + "smithy.api#documentation": "Allows you to toggle the inclusion of the changelog field in the response. It is highly recommended to use include_changelog=false in most cases unless you specifically need the changelog for all versions." + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetProjectVersionsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Version" + }, + "traits": {} + }, + "com.modrinth.api#GetProjectVersionsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetProjectVersionsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetProjectVersions": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetProjectVersionsRequest" + }, + "output": { + "target": "com.modrinth.api#GetProjectVersionsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/project/{id_slug}/version", + "code": 200 + }, + "smithy.api#documentation": "List project's versions" + } + }, + "com.modrinth.api#GetVersionRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the version" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetVersionResponseDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#GetVersionResponseGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#GetVersionResponseVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#GetVersionResponseLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#GetVersionResponseStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetVersionResponseRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetVersionResponseFilesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionFile" + }, + "traits": { + "smithy.api#documentation": "A list of files available for download for this version" + } + }, + "com.modrinth.api#GetVersionResponse": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#GetVersionResponseDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#GetVersionResponseGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#GetVersionResponseVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#GetVersionResponseLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#GetVersionResponseStatus" + }, + "requested_status": { + "target": "com.modrinth.api#GetVersionResponseRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author who published this version", + "smithy.api#required": {} + } + }, + "date_published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of times this version has been downloaded", + "smithy.api#required": {} + } + }, + "changelog_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the changelog for this version. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentEnum", + "traits": { + "smithy.api#required": {} + } + }, + "files": { + "target": "com.modrinth.api#GetVersionResponseFilesList", + "traits": { + "smithy.api#documentation": "A list of files available for download for this version", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetVersion": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetVersionRequest" + }, + "output": { + "target": "com.modrinth.api#GetVersionResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/version/{id}", + "code": 200 + }, + "smithy.api#documentation": "Get a version" + } + }, + "com.modrinth.api#ModifyVersionRequestDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#ModifyVersionRequestGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#ModifyVersionRequestVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#ModifyVersionRequestLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#ModifyVersionRequestStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ModifyVersionRequestRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ModifyVersionRequestPrimaryFileList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The hash format and the hash of the new primary file" + } + }, + "com.modrinth.api#ModifyVersionRequestFileTypesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#EditableFileType" + }, + "traits": { + "smithy.api#documentation": "A list of file_types to edit" + } + }, + "com.modrinth.api#ModifyVersionRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the version" + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version" + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning" + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#ModifyVersionRequestDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#ModifyVersionRequestGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "version_type": { + "target": "com.modrinth.api#ModifyVersionRequestVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "loaders": { + "target": "com.modrinth.api#ModifyVersionRequestLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not" + } + }, + "status": { + "target": "com.modrinth.api#ModifyVersionRequestStatus" + }, + "requested_status": { + "target": "com.modrinth.api#ModifyVersionRequestRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "primary_file": { + "target": "com.modrinth.api#ModifyVersionRequestPrimaryFileList", + "traits": { + "smithy.api#documentation": "The hash format and the hash of the new primary file" + } + }, + "file_types": { + "target": "com.modrinth.api#ModifyVersionRequestFileTypesList", + "traits": { + "smithy.api#documentation": "A list of file_types to edit" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ModifyVersion": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ModifyVersionRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/version/{id}", + "code": 200 + }, + "smithy.api#documentation": "Modify a version" + } + }, + "com.modrinth.api#DeleteVersionRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the version" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteVersion": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteVersionRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/version/{id}", + "code": 200 + }, + "smithy.api#documentation": "Delete a version" + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "id_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The version ID or version number" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponseFilesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionFile" + }, + "traits": { + "smithy.api#documentation": "A list of files available for download for this version" + } + }, + "com.modrinth.api#GetVersionFromIdOrNumberResponse": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseStatus" + }, + "requested_status": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author who published this version", + "smithy.api#required": {} + } + }, + "date_published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of times this version has been downloaded", + "smithy.api#required": {} + } + }, + "changelog_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the changelog for this version. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentEnum", + "traits": { + "smithy.api#required": {} + } + }, + "files": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponseFilesList", + "traits": { + "smithy.api#documentation": "A list of files available for download for this version", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetVersionFromIdOrNumber": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberRequest" + }, + "output": { + "target": "com.modrinth.api#GetVersionFromIdOrNumberResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/project/{id_slug}/version/{id_number}", + "code": 200 + }, + "smithy.api#documentation": "Get a version given a version number or ID\n\nPlease note that, if the version number provided matches multiple versions, only the **oldest matching version** will be returned." + } + }, + "com.modrinth.api#CreatableVersion": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#CreatableVersionDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on", + "smithy.api#required": {} + } + }, + "game_versions": { + "target": "com.modrinth.api#CreatableVersionGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#CreatableVersionVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#CreatableVersionLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#CreatableVersionStatus" + }, + "requested_status": { + "target": "com.modrinth.api#CreatableVersionRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "file_parts": { + "target": "com.modrinth.api#CreatableVersionFilePartsList", + "traits": { + "smithy.api#documentation": "An array of the multipart field names of each file that goes with this version", + "smithy.api#required": {} + } + }, + "primary_file": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The multipart field name of the primary file" + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentInputEnum" + }, + "file_types": { + "target": "com.modrinth.api#CreatableVersionFileTypesMap", + "traits": { + "smithy.api#documentation": "A map of file parts to their associated file type, a file type is used for additional files such as sources jars." + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreatableVersionDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#CreatableVersionGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#CreatableVersionVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#CreatableVersionLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#CreatableVersionStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreatableVersionRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreatableVersionFilePartsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "An array of the multipart field names of each file that goes with this version" + } + }, + "com.modrinth.api#EnvironmentInputEnum": { + "type": "enum", + "members": { + "CLIENT_AND_SERVER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_and_server" + } + }, + "CLIENT_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_only" + } + }, + "CLIENT_ONLY_SERVER_OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_only_server_optional" + } + }, + "SINGLEPLAYER_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "singleplayer_only" + } + }, + "SERVER_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "server_only" + } + }, + "SERVER_ONLY_CLIENT_OPTIONAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "server_only_client_optional" + } + }, + "DEDICATED_SERVER_ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "dedicated_server_only" + } + }, + "CLIENT_OR_SERVER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_or_server" + } + }, + "CLIENT_OR_SERVER_PREFERS_BOTH": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "client_or_server_prefers_both" + } + } + }, + "traits": { + "smithy.api#documentation": "The environment a version supports. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system" + } + }, + "com.modrinth.api#FileTypeEnum": { + "type": "enum", + "members": { + "REQUIRED_RESOURCE_PACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "required-resource-pack" + } + }, + "OPTIONAL_RESOURCE_PACK": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "optional-resource-pack" + } + }, + "SOURCES_JAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sources-jar" + } + }, + "DEV_JAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "dev-jar" + } + }, + "JAVADOC_JAR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "javadoc-jar" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + }, + "SIGNATURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "signature" + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreatableVersionFileTypesMap": { + "type": "map", + "key": { + "target": "smithy.api#String" + }, + "value": { + "target": "com.modrinth.api#FileTypeEnum" + }, + "traits": { + "smithy.api#documentation": "A map of file parts to their associated file type, a file type is used for additional files such as sources jars." + } + }, + "com.modrinth.api#CreateVersionRequest": { + "type": "structure", + "members": { + "data": { + "target": "com.modrinth.api#CreatableVersion", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#CreateVersionResponseDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#CreateVersionResponseGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#CreateVersionResponseVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#CreateVersionResponseLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#CreateVersionResponseStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreateVersionResponseRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#CreateVersionResponseFilesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionFile" + }, + "traits": { + "smithy.api#documentation": "A list of files available for download for this version" + } + }, + "com.modrinth.api#CreateVersionResponse": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#CreateVersionResponseDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#CreateVersionResponseGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#CreateVersionResponseVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#CreateVersionResponseLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#CreateVersionResponseStatus" + }, + "requested_status": { + "target": "com.modrinth.api#CreateVersionResponseRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author who published this version", + "smithy.api#required": {} + } + }, + "date_published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of times this version has been downloaded", + "smithy.api#required": {} + } + }, + "changelog_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the changelog for this version. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentEnum", + "traits": { + "smithy.api#required": {} + } + }, + "files": { + "target": "com.modrinth.api#CreateVersionResponseFilesList", + "traits": { + "smithy.api#documentation": "A list of files available for download for this version", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#CreateVersion": { + "type": "operation", + "input": { + "target": "com.modrinth.api#CreateVersionRequest" + }, + "output": { + "target": "com.modrinth.api#CreateVersionResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/version", + "code": 200, + "contentType": "multipart" + }, + "smithy.api#documentation": "Create a version\n\nThis route creates a version on an existing project. There must be at least one file attached to each new version, unless the new version's status is `draft`. `.mrpack`, `.jar`, `.zip`, and `.litemod` files are accepted.\n\nThe request is a [multipart request](https://www.ietf.org/rfc/rfc2388.txt) with at least two form fields: one is `data`, which includes a JSON body with the version metadata as shown below, and at least one field containing an upload file.\n\nYou can name the file parts anything you would like, but you must list each of the parts' names in `file_parts`, and optionally, provide one to use as the primary file in `primary_file`.", + "com.distilled.openapi#contentType": "multipart" + } + }, + "com.modrinth.api#ScheduleVersionRequestRequestedStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + } + }, + "traits": { + "smithy.api#documentation": "The requested status when scheduling the project for release" + } + }, + "com.modrinth.api#ScheduleVersionRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the version" + } + }, + "time": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "requested_status": { + "target": "com.modrinth.api#ScheduleVersionRequestRequestedStatus", + "traits": { + "smithy.api#documentation": "The requested status when scheduling the project for release", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ScheduleVersion": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ScheduleVersionRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/version/{id}/schedule", + "code": 200 + }, + "smithy.api#documentation": "Schedule a version" + } + }, + "com.modrinth.api#GetVersionsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the versions" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetVersionsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Version" + }, + "traits": {} + }, + "com.modrinth.api#GetVersionsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetVersionsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetVersions": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetVersionsRequest" + }, + "output": { + "target": "com.modrinth.api#GetVersionsResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/versions", + "code": 200 + }, + "smithy.api#documentation": "Get multiple versions" + } + }, + "com.modrinth.api#AddFilesToVersionRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the version" + } + }, + "data": { + "target": "smithy.api#Document" + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#AddFilesToVersion": { + "type": "operation", + "input": { + "target": "com.modrinth.api#AddFilesToVersionRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/version/{id}/file", + "code": 200, + "contentType": "multipart" + }, + "smithy.api#documentation": "Add files to version\n\nProject files are attached. `.mrpack` and `.jar` files are accepted.", + "com.distilled.openapi#contentType": "multipart" + } + }, + "com.modrinth.api#VersionFromHashRequestAlgorithm": { + "type": "enum", + "members": { + "SHA1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha1" + } + }, + "SHA512": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha512" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionFromHashRequest": { + "type": "structure", + "members": { + "hash": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The hash of the file, considering its byte content, and encoded in hexadecimal" + } + }, + "algorithm": { + "target": "com.modrinth.api#VersionFromHashRequestAlgorithm", + "traits": { + "smithy.api#httpQuery": "algorithm", + "smithy.api#required": {}, + "smithy.api#documentation": "The algorithm of the hash" + } + }, + "multiple": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#httpQuery": "multiple", + "smithy.api#documentation": "Whether to return multiple results when looking for this hash" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#VersionFromHashResponseDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#VersionFromHashResponseGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#VersionFromHashResponseVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#VersionFromHashResponseLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#VersionFromHashResponseStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionFromHashResponseRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionFromHashResponseFilesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionFile" + }, + "traits": { + "smithy.api#documentation": "A list of files available for download for this version" + } + }, + "com.modrinth.api#VersionFromHashResponse": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#VersionFromHashResponseDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#VersionFromHashResponseGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#VersionFromHashResponseVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#VersionFromHashResponseLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#VersionFromHashResponseStatus" + }, + "requested_status": { + "target": "com.modrinth.api#VersionFromHashResponseRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author who published this version", + "smithy.api#required": {} + } + }, + "date_published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of times this version has been downloaded", + "smithy.api#required": {} + } + }, + "changelog_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the changelog for this version. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentEnum", + "traits": { + "smithy.api#required": {} + } + }, + "files": { + "target": "com.modrinth.api#VersionFromHashResponseFilesList", + "traits": { + "smithy.api#documentation": "A list of files available for download for this version", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#VersionFromHash": { + "type": "operation", + "input": { + "target": "com.modrinth.api#VersionFromHashRequest" + }, + "output": { + "target": "com.modrinth.api#VersionFromHashResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/version_file/{hash}", + "code": 200 + }, + "smithy.api#documentation": "Get version from hash" + } + }, + "com.modrinth.api#DeleteFileFromHashRequestAlgorithm": { + "type": "enum", + "members": { + "SHA1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha1" + } + }, + "SHA512": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha512" + } + } + }, + "traits": {} + }, + "com.modrinth.api#DeleteFileFromHashRequest": { + "type": "structure", + "members": { + "hash": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The hash of the file, considering its byte content, and encoded in hexadecimal" + } + }, + "algorithm": { + "target": "com.modrinth.api#DeleteFileFromHashRequestAlgorithm", + "traits": { + "smithy.api#httpQuery": "algorithm", + "smithy.api#required": {}, + "smithy.api#documentation": "The algorithm of the hash" + } + }, + "version_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "version_id", + "smithy.api#documentation": "Version ID to delete the version from, if multiple files of the same hash exist" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteFileFromHash": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteFileFromHashRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/version_file/{hash}", + "code": 200 + }, + "smithy.api#documentation": "Delete a file from its hash" + } + }, + "com.modrinth.api#GetLatestVersionFromHashRequestAlgorithm": { + "type": "enum", + "members": { + "SHA1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha1" + } + }, + "SHA512": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha512" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionFromHashRequestLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionFromHashRequestGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionFromHashRequestVersionTypes": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionFromHashRequest": { + "type": "structure", + "members": { + "hash": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The hash of the file, considering its byte content, and encoded in hexadecimal" + } + }, + "algorithm": { + "target": "com.modrinth.api#GetLatestVersionFromHashRequestAlgorithm", + "traits": { + "smithy.api#httpQuery": "algorithm", + "smithy.api#required": {}, + "smithy.api#documentation": "The algorithm of the hash" + } + }, + "loaders": { + "target": "com.modrinth.api#GetLatestVersionFromHashRequestLoadersList", + "traits": { + "smithy.api#required": {} + } + }, + "game_versions": { + "target": "com.modrinth.api#GetLatestVersionFromHashRequestGameVersionsList", + "traits": { + "smithy.api#required": {} + } + }, + "version_types": { + "target": "com.modrinth.api#GetLatestVersionFromHashRequestVersionTypes" + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetLatestVersionFromHashResponseDependenciesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionDependency" + }, + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "com.modrinth.api#GetLatestVersionFromHashResponseGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports" + } + }, + "com.modrinth.api#GetLatestVersionFromHashResponseVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + } + }, + "traits": { + "smithy.api#documentation": "The release channel for this version" + } + }, + "com.modrinth.api#GetLatestVersionFromHashResponseLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"" + } + }, + "com.modrinth.api#GetLatestVersionFromHashResponseStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionFromHashResponseRequestedStatus": { + "type": "enum", + "members": { + "LISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "listed" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionFromHashResponseFilesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#VersionFile" + }, + "traits": { + "smithy.api#documentation": "A list of files available for download for this version" + } + }, + "com.modrinth.api#GetLatestVersionFromHashResponse": { + "type": "structure", + "members": { + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of this version", + "smithy.api#required": {} + } + }, + "version_number": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The version number. Ideally will follow semantic versioning", + "smithy.api#required": {} + } + }, + "changelog": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The changelog for this version", + "com.distilled.openapi#nullable": {} + } + }, + "dependencies": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseDependenciesList", + "traits": { + "smithy.api#documentation": "A list of specific versions of projects that this version depends on" + } + }, + "game_versions": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseGameVersionsList", + "traits": { + "smithy.api#documentation": "A list of versions of Minecraft that this version supports", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseVersionType", + "traits": { + "smithy.api#documentation": "The release channel for this version", + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseLoadersList", + "traits": { + "smithy.api#documentation": "The mod loaders that this version supports. In case of resource packs, use \"minecraft\"", + "smithy.api#required": {} + } + }, + "featured": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the version is featured or not", + "smithy.api#required": {} + } + }, + "status": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseStatus" + }, + "requested_status": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseRequestedStatus", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the version, encoded as a base62 string", + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the project this version is for", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author who published this version", + "smithy.api#required": {} + } + }, + "date_published": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + }, + "downloads": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The number of times this version has been downloaded", + "smithy.api#required": {} + } + }, + "changelog_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the changelog for this version. Always null, only kept for legacy compatibility.", + "com.distilled.openapi#nullable": {} + } + }, + "environment": { + "target": "com.modrinth.api#EnvironmentEnum", + "traits": { + "smithy.api#required": {} + } + }, + "files": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponseFilesList", + "traits": { + "smithy.api#documentation": "A list of files available for download for this version", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetLatestVersionFromHash": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetLatestVersionFromHashRequest" + }, + "output": { + "target": "com.modrinth.api#GetLatestVersionFromHashResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + }, + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/version_file/{hash}/update", + "code": 200 + }, + "smithy.api#documentation": "Latest version of a project from a hash, loader(s), and game version(s)" + } + }, + "com.modrinth.api#VersionsFromHashesRequestHashesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#VersionsFromHashesRequestAlgorithm": { + "type": "enum", + "members": { + "SHA1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha1" + } + }, + "SHA512": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha512" + } + } + }, + "traits": {} + }, + "com.modrinth.api#VersionsFromHashesRequest": { + "type": "structure", + "members": { + "hashes": { + "target": "com.modrinth.api#VersionsFromHashesRequestHashesList", + "traits": { + "smithy.api#required": {} + } + }, + "algorithm": { + "target": "com.modrinth.api#VersionsFromHashesRequestAlgorithm", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#HashVersionMap": { + "type": "map", + "key": { + "target": "smithy.api#String" + }, + "value": { + "target": "com.modrinth.api#Version" + }, + "traits": { + "smithy.api#documentation": "A map from hashes to versions" + } + }, + "com.modrinth.api#VersionsFromHashesResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#HashVersionMap", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#VersionsFromHashes": { + "type": "operation", + "input": { + "target": "com.modrinth.api#VersionsFromHashesRequest" + }, + "output": { + "target": "com.modrinth.api#VersionsFromHashesResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/version_files", + "code": 200 + }, + "smithy.api#documentation": "Get versions from hashes\n\nThis is the same as [`/version_file/{hash}`](#operation/versionFromHash) except it accepts multiple hashes." + } + }, + "com.modrinth.api#GetLatestVersionsFromHashesRequestHashesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionsFromHashesRequestAlgorithm": { + "type": "enum", + "members": { + "SHA1": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha1" + } + }, + "SHA512": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "sha512" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionsFromHashesRequestLoadersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionsFromHashesRequestGameVersionsList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionsFromHashesRequestVersionTypes": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetLatestVersionsFromHashesRequest": { + "type": "structure", + "members": { + "hashes": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesRequestHashesList", + "traits": { + "smithy.api#required": {} + } + }, + "algorithm": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesRequestAlgorithm", + "traits": { + "smithy.api#required": {} + } + }, + "loaders": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesRequestLoadersList", + "traits": { + "smithy.api#required": {} + } + }, + "game_versions": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesRequestGameVersionsList", + "traits": { + "smithy.api#required": {} + } + }, + "version_types": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesRequestVersionTypes" + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetLatestVersionsFromHashesResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#HashVersionMap", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetLatestVersionsFromHashes": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesRequest" + }, + "output": { + "target": "com.modrinth.api#GetLatestVersionsFromHashesResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/version_files/update", + "code": 200 + }, + "smithy.api#documentation": "Latest versions of multiple projects from hashes, loader(s), and game version(s)\n\nThis is the same as [`/version_file/{hash}/update`](#operation/getLatestVersionFromHash) except it accepts multiple hashes." + } + }, + "com.modrinth.api#GetUserRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#UserPayoutData": { + "type": "structure", + "members": { + "balance": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The payout balance available for the user to withdraw (note, you cannot modify this in a PATCH request)" + } + }, + "payout_wallet": { + "target": "com.modrinth.api#UserPayoutDataPayoutWallet", + "traits": { + "smithy.api#documentation": "The wallet that the user has selected" + } + }, + "payout_wallet_type": { + "target": "com.modrinth.api#UserPayoutDataPayoutWalletType", + "traits": { + "smithy.api#documentation": "The type of the user's wallet" + } + }, + "payout_address": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's payout address" + } + } + }, + "traits": { + "smithy.api#documentation": "Various data relating to the user's payouts status (you can only see your own)" + } + }, + "com.modrinth.api#UserPayoutDataPayoutWallet": { + "type": "enum", + "members": { + "PAYPAL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "paypal" + } + }, + "VENMO": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "venmo" + } + } + }, + "traits": { + "smithy.api#documentation": "The wallet that the user has selected" + } + }, + "com.modrinth.api#UserPayoutDataPayoutWalletType": { + "type": "enum", + "members": { + "EMAIL": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "email" + } + }, + "PHONE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "phone" + } + }, + "USER_HANDLE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "user_handle" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of the user's wallet" + } + }, + "com.modrinth.api#GetUserResponseRole": { + "type": "enum", + "members": { + "ADMIN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "admin" + } + }, + "MODERATOR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "moderator" + } + }, + "DEVELOPER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "developer" + } + } + }, + "traits": { + "smithy.api#documentation": "The user's role" + } + }, + "com.modrinth.api#GetUserResponseAuthProvidersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of authentication providers you have signed up for (only displayed if requesting your own account)" + } + }, + "com.modrinth.api#GetUserResponse": { + "type": "structure", + "members": { + "username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's username", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's display name", + "com.distilled.openapi#nullable": {} + } + }, + "email": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope.", + "com.distilled.openapi#nullable": {} + } + }, + "bio": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A description of the user" + } + }, + "payout_data": { + "target": "com.modrinth.api#UserPayoutData", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's ID", + "smithy.api#required": {} + } + }, + "avatar_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's avatar url", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the user was created", + "smithy.api#required": {} + } + }, + "role": { + "target": "com.modrinth.api#GetUserResponseRole", + "traits": { + "smithy.api#documentation": "The user's role", + "smithy.api#required": {} + } + }, + "badges": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change\n\nIn order from first to seventh bit, the current bits are:\n- (unused)\n- EARLY_MODPACK_ADOPTER\n- EARLY_RESPACK_ADOPTER\n- EARLY_PLUGIN_ADOPTER\n- ALPHA_TESTER\n- CONTRIBUTOR\n- TRANSLATOR\n" + } + }, + "auth_providers": { + "target": "com.modrinth.api#GetUserResponseAuthProvidersList", + "traits": { + "smithy.api#documentation": "A list of authentication providers you have signed up for (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "email_verified": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether your email is verified (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "has_password": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether you have a password associated with your account (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "has_totp": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "github_id": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Deprecated - this is no longer public for security reasons and is always null", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetUser": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetUserRequest" + }, + "output": { + "target": "com.modrinth.api#GetUserResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/user/{id_username}", + "code": 200 + }, + "smithy.api#documentation": "Get a user" + } + }, + "com.modrinth.api#ModifyUserRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + }, + "username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's username", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's display name", + "com.distilled.openapi#nullable": {} + } + }, + "email": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope.", + "com.distilled.openapi#nullable": {} + } + }, + "bio": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A description of the user" + } + }, + "payout_data": { + "target": "com.modrinth.api#UserPayoutData", + "traits": { + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ModifyUser": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ModifyUserRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/user/{id_username}", + "code": 200 + }, + "smithy.api#documentation": "Modify a user" + } + }, + "com.modrinth.api#GetUserFromAuthResponseRole": { + "type": "enum", + "members": { + "ADMIN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "admin" + } + }, + "MODERATOR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "moderator" + } + }, + "DEVELOPER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "developer" + } + } + }, + "traits": { + "smithy.api#documentation": "The user's role" + } + }, + "com.modrinth.api#GetUserFromAuthResponseAuthProvidersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of authentication providers you have signed up for (only displayed if requesting your own account)" + } + }, + "com.modrinth.api#GetUserFromAuthResponse": { + "type": "structure", + "members": { + "username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's username", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's display name", + "com.distilled.openapi#nullable": {} + } + }, + "email": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope.", + "com.distilled.openapi#nullable": {} + } + }, + "bio": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A description of the user" + } + }, + "payout_data": { + "target": "com.modrinth.api#UserPayoutData", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's ID", + "smithy.api#required": {} + } + }, + "avatar_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's avatar url", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the user was created", + "smithy.api#required": {} + } + }, + "role": { + "target": "com.modrinth.api#GetUserFromAuthResponseRole", + "traits": { + "smithy.api#documentation": "The user's role", + "smithy.api#required": {} + } + }, + "badges": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change\n\nIn order from first to seventh bit, the current bits are:\n- (unused)\n- EARLY_MODPACK_ADOPTER\n- EARLY_RESPACK_ADOPTER\n- EARLY_PLUGIN_ADOPTER\n- ALPHA_TESTER\n- CONTRIBUTOR\n- TRANSLATOR\n" + } + }, + "auth_providers": { + "target": "com.modrinth.api#GetUserFromAuthResponseAuthProvidersList", + "traits": { + "smithy.api#documentation": "A list of authentication providers you have signed up for (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "email_verified": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether your email is verified (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "has_password": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether you have a password associated with your account (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "has_totp": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "github_id": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Deprecated - this is no longer public for security reasons and is always null", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetUserFromAuth": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#GetUserFromAuthResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/user", + "code": 200 + }, + "smithy.api#documentation": "Get user from authorization header" + } + }, + "com.modrinth.api#GetUsersRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the users" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#User": { + "type": "structure", + "members": { + "username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's username", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's display name", + "com.distilled.openapi#nullable": {} + } + }, + "email": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope.", + "com.distilled.openapi#nullable": {} + } + }, + "bio": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A description of the user" + } + }, + "payout_data": { + "target": "com.modrinth.api#UserPayoutData", + "traits": { + "com.distilled.openapi#nullable": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's ID", + "smithy.api#required": {} + } + }, + "avatar_url": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's avatar url", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the user was created", + "smithy.api#required": {} + } + }, + "role": { + "target": "com.modrinth.api#UserRole", + "traits": { + "smithy.api#documentation": "The user's role", + "smithy.api#required": {} + } + }, + "badges": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change\n\nIn order from first to seventh bit, the current bits are:\n- (unused)\n- EARLY_MODPACK_ADOPTER\n- EARLY_RESPACK_ADOPTER\n- EARLY_PLUGIN_ADOPTER\n- ALPHA_TESTER\n- CONTRIBUTOR\n- TRANSLATOR\n" + } + }, + "auth_providers": { + "target": "com.modrinth.api#UserAuthProvidersList", + "traits": { + "smithy.api#documentation": "A list of authentication providers you have signed up for (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "email_verified": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether your email is verified (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "has_password": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether you have a password associated with your account (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "has_totp": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account)", + "com.distilled.openapi#nullable": {} + } + }, + "github_id": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Deprecated - this is no longer public for security reasons and is always null", + "com.distilled.openapi#nullable": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#UserRole": { + "type": "enum", + "members": { + "ADMIN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "admin" + } + }, + "MODERATOR": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "moderator" + } + }, + "DEVELOPER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "developer" + } + } + }, + "traits": { + "smithy.api#documentation": "The user's role" + } + }, + "com.modrinth.api#UserAuthProvidersList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "A list of authentication providers you have signed up for (only displayed if requesting your own account)" + } + }, + "com.modrinth.api#GetUsersResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#User" + }, + "traits": {} + }, + "com.modrinth.api#GetUsersResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetUsersResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetUsers": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetUsersRequest" + }, + "output": { + "target": "com.modrinth.api#GetUsersResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/users", + "code": 200 + }, + "smithy.api#documentation": "Get multiple users" + } + }, + "com.modrinth.api#ChangeUserIconRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ChangeUserIcon": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ChangeUserIconRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + }, + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/user/{id_username}/icon", + "code": 200 + }, + "smithy.api#documentation": "Change user's avatar\n\nThe new avatar may be up to 2MiB in size." + } + }, + "com.modrinth.api#DeleteUserIconRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteUserIcon": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteUserIconRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + }, + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/user/{id_username}/icon", + "code": 200 + }, + "smithy.api#documentation": "Remove user's avatar" + } + }, + "com.modrinth.api#GetUserProjectsRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetUserProjectsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Project" + }, + "traits": {} + }, + "com.modrinth.api#GetUserProjectsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetUserProjectsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetUserProjects": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetUserProjectsRequest" + }, + "output": { + "target": "com.modrinth.api#GetUserProjectsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/user/{id_username}/projects", + "code": 200 + }, + "smithy.api#documentation": "Get user's projects" + } + }, + "com.modrinth.api#GetFollowedProjectsRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetFollowedProjectsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Project" + }, + "traits": {} + }, + "com.modrinth.api#GetFollowedProjectsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetFollowedProjectsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetFollowedProjects": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetFollowedProjectsRequest" + }, + "output": { + "target": "com.modrinth.api#GetFollowedProjectsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/user/{id_username}/follows", + "code": 200 + }, + "smithy.api#documentation": "Get user's followed projects" + } + }, + "com.modrinth.api#GetPayoutHistoryRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#UserPayoutHistory": { + "type": "structure", + "members": { + "all_time": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The all-time balance accrued by this user in USD" + } + }, + "last_month": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The amount in USD made by the user in the previous 30 days" + } + }, + "payouts": { + "target": "com.modrinth.api#UserPayoutHistoryPayoutsList", + "traits": { + "smithy.api#documentation": "A history of all of the user's past transactions" + } + } + }, + "traits": {} + }, + "com.modrinth.api#UserPayoutHistoryEntry": { + "type": "structure", + "members": { + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date of this transaction" + } + }, + "amount": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The amount of this transaction in USD" + } + }, + "status": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The status of this transaction" + } + } + }, + "traits": {} + }, + "com.modrinth.api#UserPayoutHistoryPayoutsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#UserPayoutHistoryEntry" + }, + "traits": { + "smithy.api#documentation": "A history of all of the user's past transactions" + } + }, + "com.modrinth.api#GetPayoutHistory": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetPayoutHistoryRequest" + }, + "output": { + "target": "com.modrinth.api#UserPayoutHistory" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/user/{id_username}/payouts", + "code": 200 + }, + "smithy.api#documentation": "Get user's payout history" + } + }, + "com.modrinth.api#WithdrawPayoutRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + }, + "amount": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "amount", + "smithy.api#required": {}, + "smithy.api#documentation": "Amount to withdraw" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#WithdrawPayout": { + "type": "operation", + "input": { + "target": "com.modrinth.api#WithdrawPayoutRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/user/{id_username}/payouts", + "code": 200 + }, + "smithy.api#documentation": "Withdraw payout balance to PayPal or Venmo\n\nWarning: certain amounts get withheld for fees. Please do not call this API endpoint without first acknowledging the warnings on the corresponding frontend page." + } + }, + "com.modrinth.api#GetUserNotificationsRequest": { + "type": "structure", + "members": { + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#Notification": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The id of the notification", + "smithy.api#required": {} + } + }, + "user_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The id of the user who received the notification", + "smithy.api#required": {} + } + }, + "type": { + "target": "com.modrinth.api#NotificationType", + "traits": { + "smithy.api#documentation": "The type of notification", + "com.distilled.openapi#nullable": {} + } + }, + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The title of the notification", + "smithy.api#required": {} + } + }, + "text": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The body text of the notification", + "smithy.api#required": {} + } + }, + "link": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the related project or version", + "smithy.api#required": {} + } + }, + "read": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the notification has been read or not", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the notification was created", + "smithy.api#required": {} + } + }, + "actions": { + "target": "com.modrinth.api#NotificationActionsList", + "traits": { + "smithy.api#documentation": "A list of actions that can be performed", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#NotificationType": { + "type": "enum", + "members": { + "PROJECT_UPDATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "project_update" + } + }, + "TEAM_INVITE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "team_invite" + } + }, + "STATUS_CHANGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "status_change" + } + }, + "MODERATOR_MESSAGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "moderator_message" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of notification" + } + }, + "com.modrinth.api#NotificationAction": { + "type": "structure", + "members": { + "title": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The friendly name for this action" + } + }, + "action_route": { + "target": "com.modrinth.api#NotificationActionActionRouteList", + "traits": { + "smithy.api#documentation": "The HTTP code and path to request in order to perform this action." + } + } + }, + "traits": { + "smithy.api#documentation": "An action that can be performed on a notification" + } + }, + "com.modrinth.api#NotificationActionActionRouteList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The HTTP code and path to request in order to perform this action." + } + }, + "com.modrinth.api#NotificationActionsList": { + "type": "list", + "member": { + "target": "com.modrinth.api#NotificationAction" + }, + "traits": { + "smithy.api#documentation": "A list of actions that can be performed" + } + }, + "com.modrinth.api#GetUserNotificationsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Notification" + }, + "traits": {} + }, + "com.modrinth.api#GetUserNotificationsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetUserNotificationsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetUserNotifications": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetUserNotificationsRequest" + }, + "output": { + "target": "com.modrinth.api#GetUserNotificationsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/user/{id_username}/notifications", + "code": 200 + }, + "smithy.api#documentation": "Get user's notifications" + } + }, + "com.modrinth.api#GetNotificationRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the notification" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetNotification": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetNotificationRequest" + }, + "output": { + "target": "com.modrinth.api#Notification" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/notification/{id}", + "code": 200 + }, + "smithy.api#documentation": "Get notification from ID" + } + }, + "com.modrinth.api#ReadNotificationRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the notification" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ReadNotification": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ReadNotificationRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/notification/{id}", + "code": 200 + }, + "smithy.api#documentation": "Mark notification as read" + } + }, + "com.modrinth.api#DeleteNotificationRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the notification" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteNotification": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteNotificationRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/notification/{id}", + "code": 200 + }, + "smithy.api#documentation": "Delete notification" + } + }, + "com.modrinth.api#GetNotificationsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the notifications" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetNotificationsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Notification" + }, + "traits": {} + }, + "com.modrinth.api#GetNotificationsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetNotificationsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetNotifications": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetNotificationsRequest" + }, + "output": { + "target": "com.modrinth.api#GetNotificationsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/notifications", + "code": 200 + }, + "smithy.api#documentation": "Get multiple notifications" + } + }, + "com.modrinth.api#ReadNotificationsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the notifications" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ReadNotifications": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ReadNotificationsRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/notifications", + "code": 200 + }, + "smithy.api#documentation": "Mark multiple notifications as read" + } + }, + "com.modrinth.api#DeleteNotificationsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the notifications" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteNotifications": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteNotificationsRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/notifications", + "code": 200 + }, + "smithy.api#documentation": "Delete multiple notifications" + } + }, + "com.modrinth.api#GetOpenReportsRequest": { + "type": "structure", + "members": { + "count": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#httpQuery": "count" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#Report": { + "type": "structure", + "members": { + "report_type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The type of the report being sent", + "smithy.api#required": {} + } + }, + "item_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the item (project, version, or user) being reported", + "smithy.api#required": {} + } + }, + "item_type": { + "target": "com.modrinth.api#ReportItemType", + "traits": { + "smithy.api#documentation": "The type of the item being reported", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The extended explanation of the report", + "smithy.api#required": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the report" + } + }, + "reporter": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the user who reported the item", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the report was created", + "smithy.api#required": {} + } + }, + "closed": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the report is resolved", + "smithy.api#required": {} + } + }, + "thread_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the moderation thread associated with this report", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#ReportItemType": { + "type": "enum", + "members": { + "PROJECT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "project" + } + }, + "USER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "user" + } + }, + "VERSION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "version" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of the item being reported" + } + }, + "com.modrinth.api#GetOpenReportsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Report" + }, + "traits": {} + }, + "com.modrinth.api#GetOpenReportsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetOpenReportsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetOpenReports": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetOpenReportsRequest" + }, + "output": { + "target": "com.modrinth.api#GetOpenReportsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/report", + "code": 200 + }, + "smithy.api#documentation": "Get your open reports" + } + }, + "com.modrinth.api#SubmitReportRequestItemType": { + "type": "enum", + "members": { + "PROJECT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "project" + } + }, + "USER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "user" + } + }, + "VERSION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "version" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of the item being reported" + } + }, + "com.modrinth.api#SubmitReportRequest": { + "type": "structure", + "members": { + "report_type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The type of the report being sent", + "smithy.api#required": {} + } + }, + "item_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the item (project, version, or user) being reported", + "smithy.api#required": {} + } + }, + "item_type": { + "target": "com.modrinth.api#SubmitReportRequestItemType", + "traits": { + "smithy.api#documentation": "The type of the item being reported", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The extended explanation of the report", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#SubmitReportResponseItemType": { + "type": "enum", + "members": { + "PROJECT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "project" + } + }, + "USER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "user" + } + }, + "VERSION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "version" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of the item being reported" + } + }, + "com.modrinth.api#SubmitReportResponse": { + "type": "structure", + "members": { + "report_type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The type of the report being sent", + "smithy.api#required": {} + } + }, + "item_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the item (project, version, or user) being reported", + "smithy.api#required": {} + } + }, + "item_type": { + "target": "com.modrinth.api#SubmitReportResponseItemType", + "traits": { + "smithy.api#documentation": "The type of the item being reported", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The extended explanation of the report", + "smithy.api#required": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the report" + } + }, + "reporter": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the user who reported the item", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the report was created", + "smithy.api#required": {} + } + }, + "closed": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the report is resolved", + "smithy.api#required": {} + } + }, + "thread_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the moderation thread associated with this report", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#SubmitReport": { + "type": "operation", + "input": { + "target": "com.modrinth.api#SubmitReportRequest" + }, + "output": { + "target": "com.modrinth.api#SubmitReportResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/report", + "code": 200 + }, + "smithy.api#documentation": "Report a project, user, or version\n\nBring a project, user, or version to the attention of the moderators by reporting it." + } + }, + "com.modrinth.api#GetReportRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the report" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetReportResponseItemType": { + "type": "enum", + "members": { + "PROJECT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "project" + } + }, + "USER": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "user" + } + }, + "VERSION": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "version" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of the item being reported" + } + }, + "com.modrinth.api#GetReportResponse": { + "type": "structure", + "members": { + "report_type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The type of the report being sent", + "smithy.api#required": {} + } + }, + "item_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the item (project, version, or user) being reported", + "smithy.api#required": {} + } + }, + "item_type": { + "target": "com.modrinth.api#GetReportResponseItemType", + "traits": { + "smithy.api#documentation": "The type of the item being reported", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The extended explanation of the report", + "smithy.api#required": {} + } + }, + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the report" + } + }, + "reporter": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the user who reported the item", + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the report was created", + "smithy.api#required": {} + } + }, + "closed": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the report is resolved", + "smithy.api#required": {} + } + }, + "thread_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the moderation thread associated with this report", + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetReport": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetReportRequest" + }, + "output": { + "target": "com.modrinth.api#GetReportResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/report/{id}", + "code": 200 + }, + "smithy.api#documentation": "Get report from ID" + } + }, + "com.modrinth.api#ModifyReportRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the report" + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The contents of the report" + } + }, + "closed": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the thread should be closed" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ModifyReport": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ModifyReportRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + }, + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/report/{id}", + "code": 200 + }, + "smithy.api#documentation": "Modify a report" + } + }, + "com.modrinth.api#GetReportsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the reports" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetReportsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Report" + }, + "traits": {} + }, + "com.modrinth.api#GetReportsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetReportsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetReports": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetReportsRequest" + }, + "output": { + "target": "com.modrinth.api#GetReportsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/reports", + "code": 200 + }, + "smithy.api#documentation": "Get multiple reports" + } + }, + "com.modrinth.api#GetThreadRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the thread" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#Thread": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the thread", + "smithy.api#required": {} + } + }, + "type": { + "target": "com.modrinth.api#ThreadType", + "traits": { + "smithy.api#required": {} + } + }, + "project_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the associated project if a project thread", + "com.distilled.openapi#nullable": {} + } + }, + "report_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the associated report if a report thread", + "com.distilled.openapi#nullable": {} + } + }, + "messages": { + "target": "com.modrinth.api#ThreadMessagesList", + "traits": { + "smithy.api#required": {} + } + }, + "members": { + "target": "com.modrinth.api#ThreadMembersList", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#ThreadType": { + "type": "enum", + "members": { + "PROJECT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "project" + } + }, + "REPORT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "report" + } + }, + "DIRECT_MESSAGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "direct_message" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ThreadMessage": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the message itself", + "smithy.api#required": {} + } + }, + "author_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the author", + "com.distilled.openapi#nullable": {} + } + }, + "body": { + "target": "com.modrinth.api#ThreadMessageBody", + "traits": { + "smithy.api#required": {} + } + }, + "created": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The time at which the message was created", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#ThreadMessageBody": { + "type": "structure", + "members": { + "type": { + "target": "com.modrinth.api#ThreadMessageBodyType", + "traits": { + "smithy.api#documentation": "The type of message", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The actual message text. **Only present for `text` message type**" + } + }, + "private": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the message is only visible to moderators. **Only present for `text` message type**" + } + }, + "replying_to": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the message being replied to by this message. **Only present for `text` message type**", + "com.distilled.openapi#nullable": {} + } + }, + "old_status": { + "target": "com.modrinth.api#ThreadMessageBodyOldStatus", + "traits": { + "smithy.api#documentation": "The old status of the project. **Only present for `status_change` message type**" + } + }, + "new_status": { + "target": "com.modrinth.api#ThreadMessageBodyNewStatus", + "traits": { + "smithy.api#documentation": "The new status of the project. **Only present for `status_change` message type**" + } + } + }, + "traits": { + "smithy.api#documentation": "The contents of the message. **Fields will vary depending on message type.**" + } + }, + "com.modrinth.api#ThreadMessageBodyType": { + "type": "enum", + "members": { + "STATUS_CHANGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "status_change" + } + }, + "TEXT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "text" + } + }, + "THREAD_CLOSURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "thread_closure" + } + }, + "DELETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "deleted" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of message" + } + }, + "com.modrinth.api#ThreadMessageBodyOldStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The old status of the project. **Only present for `status_change` message type**" + } + }, + "com.modrinth.api#ThreadMessageBodyNewStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The new status of the project. **Only present for `status_change` message type**" + } + }, + "com.modrinth.api#ThreadMessagesList": { + "type": "list", + "member": { + "target": "com.modrinth.api#ThreadMessage" + }, + "traits": {} + }, + "com.modrinth.api#ThreadMembersList": { + "type": "list", + "member": { + "target": "com.modrinth.api#User" + }, + "traits": {} + }, + "com.modrinth.api#GetThread": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetThreadRequest" + }, + "output": { + "target": "com.modrinth.api#Thread" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/thread/{id}", + "code": 200 + }, + "smithy.api#documentation": "Get a thread" + } + }, + "com.modrinth.api#SendThreadMessageRequestType": { + "type": "enum", + "members": { + "STATUS_CHANGE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "status_change" + } + }, + "TEXT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "text" + } + }, + "THREAD_CLOSURE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "thread_closure" + } + }, + "DELETED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "deleted" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of message" + } + }, + "com.modrinth.api#SendThreadMessageRequestOldStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The old status of the project. **Only present for `status_change` message type**" + } + }, + "com.modrinth.api#SendThreadMessageRequestNewStatus": { + "type": "enum", + "members": { + "APPROVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "approved" + } + }, + "ARCHIVED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "archived" + } + }, + "REJECTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "rejected" + } + }, + "DRAFT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "draft" + } + }, + "UNLISTED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unlisted" + } + }, + "PROCESSING": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "processing" + } + }, + "WITHHELD": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "withheld" + } + }, + "SCHEDULED": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "scheduled" + } + }, + "PRIVATE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "private" + } + }, + "UNKNOWN": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "unknown" + } + } + }, + "traits": { + "smithy.api#documentation": "The new status of the project. **Only present for `status_change` message type**" + } + }, + "com.modrinth.api#SendThreadMessageRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the thread" + } + }, + "type": { + "target": "com.modrinth.api#SendThreadMessageRequestType", + "traits": { + "smithy.api#documentation": "The type of message", + "smithy.api#required": {} + } + }, + "body": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The actual message text. **Only present for `text` message type**" + } + }, + "private": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether the message is only visible to moderators. **Only present for `text` message type**" + } + }, + "replying_to": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the message being replied to by this message. **Only present for `text` message type**", + "com.distilled.openapi#nullable": {} + } + }, + "old_status": { + "target": "com.modrinth.api#SendThreadMessageRequestOldStatus", + "traits": { + "smithy.api#documentation": "The old status of the project. **Only present for `status_change` message type**" + } + }, + "new_status": { + "target": "com.modrinth.api#SendThreadMessageRequestNewStatus", + "traits": { + "smithy.api#documentation": "The new status of the project. **Only present for `status_change` message type**" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#SendThreadMessage": { + "type": "operation", + "input": { + "target": "com.modrinth.api#SendThreadMessageRequest" + }, + "output": { + "target": "com.modrinth.api#Thread" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + }, + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/thread/{id}", + "code": 200 + }, + "smithy.api#documentation": "Send a text message to a thread" + } + }, + "com.modrinth.api#GetThreadsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the threads" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetThreadsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#Thread" + }, + "traits": {} + }, + "com.modrinth.api#GetThreadsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetThreadsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetThreads": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetThreadsRequest" + }, + "output": { + "target": "com.modrinth.api#GetThreadsResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/threads", + "code": 200 + }, + "smithy.api#documentation": "Get multiple threads" + } + }, + "com.modrinth.api#DeleteThreadMessageRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the message" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteThreadMessage": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteThreadMessageRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/message/{id}", + "code": 200 + }, + "smithy.api#documentation": "Delete a thread message" + } + }, + "com.modrinth.api#GetProjectTeamMembersRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#TeamMember": { + "type": "structure", + "members": { + "team_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The ID of the team this team member is a member of", + "smithy.api#required": {} + } + }, + "user": { + "target": "com.modrinth.api#User", + "traits": { + "smithy.api#required": {} + } + }, + "role": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The user's role on the team", + "smithy.api#required": {} + } + }, + "permissions": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The user's permissions in bitfield format (requires authorization to view)\n\nIn order from first to tenth bit, the bits are:\n- UPLOAD_VERSION\n- DELETE_VERSION\n- EDIT_DETAILS\n- EDIT_BODY\n- MANAGE_INVITES\n- REMOVE_MEMBER\n- EDIT_MEMBER\n- DELETE_PROJECT\n- VIEW_ANALYTICS\n- VIEW_PAYOUTS\n" + } + }, + "accepted": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether or not the user has accepted to be on the team (requires authorization to view)", + "smithy.api#required": {} + } + }, + "payouts_split": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The split of payouts going to this user. The proportion of payouts they get is their split divided by the sum of the splits of all members." + } + }, + "ordering": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The order of the team member." + } + } + }, + "traits": {} + }, + "com.modrinth.api#GetProjectTeamMembersResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#TeamMember" + }, + "traits": { + "smithy.api#documentation": "An array of team members" + } + }, + "com.modrinth.api#GetProjectTeamMembersResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetProjectTeamMembersResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetProjectTeamMembers": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetProjectTeamMembersRequest" + }, + "output": { + "target": "com.modrinth.api#GetProjectTeamMembersResponse" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/project/{id_slug}/members", + "code": 200 + }, + "smithy.api#documentation": "Get a project's team members" + } + }, + "com.modrinth.api#GetTeamMembersRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the team" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetTeamMembersResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#TeamMember" + }, + "traits": { + "smithy.api#documentation": "An array of team members" + } + }, + "com.modrinth.api#GetTeamMembersResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetTeamMembersResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetTeamMembers": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetTeamMembersRequest" + }, + "output": { + "target": "com.modrinth.api#GetTeamMembersResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/team/{id}/members", + "code": 200 + }, + "smithy.api#documentation": "Get a team's members" + } + }, + "com.modrinth.api#AddTeamMemberRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the team" + } + }, + "user_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#AddTeamMember": { + "type": "operation", + "input": { + "target": "com.modrinth.api#AddTeamMemberRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/team/{id}/members", + "code": 200 + }, + "smithy.api#documentation": "Add a user to a team" + } + }, + "com.modrinth.api#GetTeamsRequest": { + "type": "structure", + "members": { + "ids": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpQuery": "ids", + "smithy.api#required": {}, + "smithy.api#documentation": "The IDs of the teams" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#GetTeamsResponseBodyItemList": { + "type": "list", + "member": { + "target": "com.modrinth.api#TeamMember" + }, + "traits": {} + }, + "com.modrinth.api#GetTeamsResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#GetTeamsResponseBodyItemList" + }, + "traits": {} + }, + "com.modrinth.api#GetTeamsResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#GetTeamsResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#GetTeams": { + "type": "operation", + "input": { + "target": "com.modrinth.api#GetTeamsRequest" + }, + "output": { + "target": "com.modrinth.api#GetTeamsResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/teams", + "code": 200 + }, + "smithy.api#documentation": "Get the members of multiple teams" + } + }, + "com.modrinth.api#JoinTeamRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the team" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#JoinTeam": { + "type": "operation", + "input": { + "target": "com.modrinth.api#JoinTeamRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "POST", + "uri": "/team/{id}/join", + "code": 200 + }, + "smithy.api#documentation": "Join a team" + } + }, + "com.modrinth.api#ModifyTeamMemberRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the team" + } + }, + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + }, + "role": { + "target": "smithy.api#String" + }, + "permissions": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The user's permissions in bitfield format\n\nIn order from first to tenth bit, the bits are:\n- UPLOAD_VERSION\n- DELETE_VERSION\n- EDIT_DETAILS\n- EDIT_BODY\n- MANAGE_INVITES\n- REMOVE_MEMBER\n- EDIT_MEMBER\n- DELETE_PROJECT\n- VIEW_ANALYTICS\n- VIEW_PAYOUTS\n" + } + }, + "payouts_split": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The split of payouts going to this user. The proportion of payouts they get is their split divided by the sum of the splits of all members." + } + }, + "ordering": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "The order of the team member." + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ModifyTeamMember": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ModifyTeamMemberRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/team/{id}/members/{id_username}", + "code": 200 + }, + "smithy.api#documentation": "Modify a team member's information" + } + }, + "com.modrinth.api#DeleteTeamMemberRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the team" + } + }, + "id_username": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or username of the user" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#DeleteTeamMember": { + "type": "operation", + "input": { + "target": "com.modrinth.api#DeleteTeamMemberRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "DELETE", + "uri": "/team/{id}/members/{id_username}", + "code": 200 + }, + "smithy.api#documentation": "Remove a member from a team" + } + }, + "com.modrinth.api#TransferTeamOwnershipRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID of the team" + } + }, + "user_id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#TransferTeamOwnership": { + "type": "operation", + "input": { + "target": "com.modrinth.api#TransferTeamOwnershipRequest" + }, + "output": { + "target": "smithy.api#Unit" + }, + "errors": [ + { + "target": "com.modrinth.api#NotFound" + } + ], + "traits": { + "smithy.api#http": { + "method": "PATCH", + "uri": "/team/{id}/owner", + "code": 200 + }, + "smithy.api#documentation": "Transfer team's ownership to another user" + } + }, + "com.modrinth.api#CategoryTag": { + "type": "structure", + "members": { + "icon": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SVG icon of a category", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the category", + "smithy.api#required": {} + } + }, + "project_type": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The project type this category is applicable to", + "smithy.api#required": {} + } + }, + "header": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The header under which the category should go", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#CategoryListResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#CategoryTag" + }, + "traits": {} + }, + "com.modrinth.api#CategoryListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#CategoryListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#CategoryList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#CategoryListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/category", + "code": 200 + }, + "smithy.api#documentation": "Get a list of categories\n\nGets an array of categories, their icons, and applicable project types" + } + }, + "com.modrinth.api#LoaderTag": { + "type": "structure", + "members": { + "icon": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The SVG icon of a loader", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name of the loader", + "smithy.api#required": {} + } + }, + "supported_project_types": { + "target": "com.modrinth.api#LoaderTagSupportedProjectTypesList", + "traits": { + "smithy.api#documentation": "The project types that this loader is applicable to", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#LoaderTagSupportedProjectTypesList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": { + "smithy.api#documentation": "The project types that this loader is applicable to" + } + }, + "com.modrinth.api#LoaderListResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#LoaderTag" + }, + "traits": {} + }, + "com.modrinth.api#LoaderListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#LoaderListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#LoaderList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#LoaderListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/loader", + "code": 200 + }, + "smithy.api#documentation": "Get a list of loaders\n\nGets an array of loaders, their icons, and supported project types" + } + }, + "com.modrinth.api#GameVersionTag": { + "type": "structure", + "members": { + "version": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The name/number of the game version", + "smithy.api#required": {} + } + }, + "version_type": { + "target": "com.modrinth.api#GameVersionTagVersionType", + "traits": { + "smithy.api#documentation": "The type of the game version", + "smithy.api#required": {} + } + }, + "date": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The date of the game version release", + "smithy.api#required": {} + } + }, + "major": { + "target": "smithy.api#Boolean", + "traits": { + "smithy.api#documentation": "Whether or not this is a major version, used for Featured Versions", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#GameVersionTagVersionType": { + "type": "enum", + "members": { + "RELEASE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "release" + } + }, + "SNAPSHOT": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "snapshot" + } + }, + "ALPHA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "alpha" + } + }, + "BETA": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "beta" + } + } + }, + "traits": { + "smithy.api#documentation": "The type of the game version" + } + }, + "com.modrinth.api#VersionListResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#GameVersionTag" + }, + "traits": {} + }, + "com.modrinth.api#VersionListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#VersionListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#VersionList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#VersionListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/game_version", + "code": 200 + }, + "smithy.api#documentation": "Get a list of game versions\n\nGets an array of game versions and information about them" + } + }, + "com.modrinth.api#LicenseTextRequest": { + "type": "structure", + "members": { + "id": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The license ID to get the text of" + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#License": { + "type": "structure", + "members": { + "title": { + "target": "smithy.api#String" + }, + "body": { + "target": "smithy.api#String" + } + }, + "traits": { + "smithy.api#documentation": "A full license" + } + }, + "com.modrinth.api#LicenseText": { + "type": "operation", + "input": { + "target": "com.modrinth.api#LicenseTextRequest" + }, + "output": { + "target": "com.modrinth.api#License" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/license/{id}", + "code": 200 + }, + "smithy.api#documentation": "Get the text and title of a license" + } + }, + "com.modrinth.api#DonationPlatformTag": { + "type": "structure", + "members": { + "short": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The short identifier of the donation platform", + "smithy.api#required": {} + } + }, + "name": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The full name of the donation platform", + "smithy.api#required": {} + } + } + }, + "traits": {} + }, + "com.modrinth.api#DonationPlatformListResponseBodyList": { + "type": "list", + "member": { + "target": "com.modrinth.api#DonationPlatformTag" + }, + "traits": {} + }, + "com.modrinth.api#DonationPlatformListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#DonationPlatformListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#DonationPlatformList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#DonationPlatformListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/donation_platform", + "code": 200 + }, + "smithy.api#documentation": "Get a list of donation platforms\n\nGets an array of donation platforms and information about them" + } + }, + "com.modrinth.api#ReportTypeListResponseBodyList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#ReportTypeListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#ReportTypeListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#ReportTypeList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#ReportTypeListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/report_type", + "code": 200 + }, + "smithy.api#documentation": "Get a list of report types\n\nGets an array of valid report types" + } + }, + "com.modrinth.api#ProjectTypeListResponseBodyList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#ProjectTypeListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#ProjectTypeListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#ProjectTypeList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#ProjectTypeListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/project_type", + "code": 200 + }, + "smithy.api#documentation": "Get a list of project types\n\nGets an array of valid project types" + } + }, + "com.modrinth.api#SideTypeListResponseBodyList": { + "type": "list", + "member": { + "target": "smithy.api#String" + }, + "traits": {} + }, + "com.modrinth.api#SideTypeListResponse": { + "type": "structure", + "members": { + "body": { + "target": "com.modrinth.api#SideTypeListResponseBodyList", + "traits": { + "com.distilled.openapi#rawResponse": {}, + "smithy.api#required": {} + } + } + }, + "traits": { + "smithy.api#output": {} + } + }, + "com.modrinth.api#SideTypeList": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#SideTypeListResponse" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/tag/side_type", + "code": 200 + }, + "smithy.api#documentation": "Get a list of side types\n\nGets an array of valid side types" + } + }, + "com.modrinth.api#ForgeUpdatesRequestNeoforge": { + "type": "enum", + "members": { + "ONLY": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "only" + } + }, + "INCLUDE": { + "target": "smithy.api#Unit", + "traits": { + "smithy.api#enumValue": "include" + } + } + }, + "traits": {} + }, + "com.modrinth.api#ForgeUpdatesRequest": { + "type": "structure", + "members": { + "id_slug": { + "target": "smithy.api#String", + "traits": { + "smithy.api#httpLabel": {}, + "smithy.api#required": {}, + "smithy.api#documentation": "The ID or slug of the project" + } + }, + "neoforge": { + "target": "com.modrinth.api#ForgeUpdatesRequestNeoforge", + "traits": { + "smithy.api#httpQuery": "neoforge", + "smithy.api#documentation": "Whether to include NeoForge versions. Can be `only` (NeoForge-only versions), `include` (both Forge and NeoForge versions), or omitted (Forge-only versions)." + } + } + }, + "traits": { + "smithy.api#input": {} + } + }, + "com.modrinth.api#ForgeUpdates": { + "type": "structure", + "members": { + "homepage": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "A link to the mod page" + } + }, + "promos": { + "target": "com.modrinth.api#ForgeUpdateCheckerPromos" + } + }, + "traits": { + "smithy.api#documentation": "Mod version information that can be consumed by Forge's update checker" + } + }, + "com.modrinth.api#ForgeUpdateCheckerPromos": { + "type": "structure", + "members": { + "_version__recommended": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The mod version that is recommended for `{version}`. Excludes versions with the `alpha` and `beta` version types.", + "smithy.api#jsonName": "{version}-recommended" + } + }, + "_version__latest": { + "target": "smithy.api#String", + "traits": { + "smithy.api#documentation": "The latest mod version for `{version}`. Shows versions with the `alpha` and `beta` version types.", + "smithy.api#jsonName": "{version}-latest" + } + } + }, + "traits": { + "smithy.api#documentation": "A list of the recommended and latest versions for each Minecraft release" + } + }, + "com.modrinth.api#ForgeUpdates2": { + "type": "operation", + "input": { + "target": "com.modrinth.api#ForgeUpdatesRequest" + }, + "output": { + "target": "com.modrinth.api#ForgeUpdates" + }, + "errors": [ + { + "target": "com.modrinth.api#BadRequest" + } + ], + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/updates/{id_slug}/forge_updates.json", + "code": 200 + }, + "smithy.api#documentation": "Forge Updates JSON file\n\nIf you're a Forge mod developer, your Modrinth mods have an automatically generated `updates.json` using the\n[Forge Update Checker](https://docs.minecraftforge.net/en/latest/misc/updatechecker/).\n\nThe only setup is to insert the URL into the `[[mods]]` section of your `mods.toml` file as such:\n\n```toml\n[[mods]]\n# the other stuff here - ID, version, display name, etc.\nupdateJSONURL = \"https://api.modrinth.com/updates/{slug|ID}/forge_updates.json\"\n```\n\nReplace `{slug|id}` with the slug or ID of your project.\n\nModrinth will handle the rest! When you update your mod, Forge will notify your users that their copy of your mod is out of date.\n\nMake sure that the version format you use for your Modrinth releases is the same as the version format you use in your `mods.toml`.\nIf you use a format such as `1.2.3-forge` or `1.2.3+1.19` with your Modrinth releases but your `mods.toml` only has `1.2.3`,\nthe update checker may not function properly.\n\nIf you're using NeoForge, NeoForge versions will, by default, not appear in the default URL.\nYou will need to add `?neoforge=only` to show your NeoForge-only versions, or `?neoforge=include` for both.\n\n```toml\n[[mods]]\n# the other stuff here - ID, version, display name, etc.\nupdateJSONURL = \"https://api.modrinth.com/updates/{slug|ID}/forge_updates.json?neoforge=only\"\n```" + } + }, + "com.modrinth.api#Statistics": { + "type": "structure", + "members": { + "projects": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Number of projects on Modrinth" + } + }, + "versions": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Number of versions on Modrinth" + } + }, + "files": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Number of version files on Modrinth" + } + }, + "authors": { + "target": "smithy.api#Integer", + "traits": { + "smithy.api#documentation": "Number of authors (users with projects) on Modrinth" + } + } + }, + "traits": {} + }, + "com.modrinth.api#Statistics2": { + "type": "operation", + "input": { + "target": "smithy.api#Unit" + }, + "output": { + "target": "com.modrinth.api#Statistics" + }, + "traits": { + "smithy.api#http": { + "method": "GET", + "uri": "/statistics", + "code": 200 + }, + "smithy.api#documentation": "Various statistics about this Modrinth instance" + } + }, + "com.modrinth.api#BadRequest": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 400, + "com.distilled.openapi#errorMatchers": [ + { + "status": 400 + } + ] + } + }, + "com.modrinth.api#NotFound": { + "type": "structure", + "members": {}, + "traits": { + "smithy.api#error": "client", + "smithy.api#httpError": 404, + "com.distilled.openapi#errorMatchers": [ + { + "status": 404 + } + ] + } + }, + "com.modrinth.api#Modrinth": { + "type": "service", + "version": "v2.7.0/366f528", + "operations": [ + { + "target": "com.modrinth.api#SearchProjects" + }, + { + "target": "com.modrinth.api#GetProject" + }, + { + "target": "com.modrinth.api#ModifyProject" + }, + { + "target": "com.modrinth.api#DeleteProject" + }, + { + "target": "com.modrinth.api#GetProjects" + }, + { + "target": "com.modrinth.api#PatchProjects" + }, + { + "target": "com.modrinth.api#RandomProjects" + }, + { + "target": "com.modrinth.api#CreateProject" + }, + { + "target": "com.modrinth.api#ChangeProjectIcon" + }, + { + "target": "com.modrinth.api#DeleteProjectIcon" + }, + { + "target": "com.modrinth.api#CheckProjectValidity" + }, + { + "target": "com.modrinth.api#AddGalleryImage" + }, + { + "target": "com.modrinth.api#ModifyGalleryImage" + }, + { + "target": "com.modrinth.api#DeleteGalleryImage" + }, + { + "target": "com.modrinth.api#GetDependencies" + }, + { + "target": "com.modrinth.api#FollowProject" + }, + { + "target": "com.modrinth.api#UnfollowProject" + }, + { + "target": "com.modrinth.api#ScheduleProject" + }, + { + "target": "com.modrinth.api#GetProjectVersions" + }, + { + "target": "com.modrinth.api#GetVersion" + }, + { + "target": "com.modrinth.api#ModifyVersion" + }, + { + "target": "com.modrinth.api#DeleteVersion" + }, + { + "target": "com.modrinth.api#GetVersionFromIdOrNumber" + }, + { + "target": "com.modrinth.api#CreateVersion" + }, + { + "target": "com.modrinth.api#ScheduleVersion" + }, + { + "target": "com.modrinth.api#GetVersions" + }, + { + "target": "com.modrinth.api#AddFilesToVersion" + }, + { + "target": "com.modrinth.api#VersionFromHash" + }, + { + "target": "com.modrinth.api#DeleteFileFromHash" + }, + { + "target": "com.modrinth.api#GetLatestVersionFromHash" + }, + { + "target": "com.modrinth.api#VersionsFromHashes" + }, + { + "target": "com.modrinth.api#GetLatestVersionsFromHashes" + }, + { + "target": "com.modrinth.api#GetUser" + }, + { + "target": "com.modrinth.api#ModifyUser" + }, + { + "target": "com.modrinth.api#GetUserFromAuth" + }, + { + "target": "com.modrinth.api#GetUsers" + }, + { + "target": "com.modrinth.api#ChangeUserIcon" + }, + { + "target": "com.modrinth.api#DeleteUserIcon" + }, + { + "target": "com.modrinth.api#GetUserProjects" + }, + { + "target": "com.modrinth.api#GetFollowedProjects" + }, + { + "target": "com.modrinth.api#GetPayoutHistory" + }, + { + "target": "com.modrinth.api#WithdrawPayout" + }, + { + "target": "com.modrinth.api#GetUserNotifications" + }, + { + "target": "com.modrinth.api#GetNotification" + }, + { + "target": "com.modrinth.api#ReadNotification" + }, + { + "target": "com.modrinth.api#DeleteNotification" + }, + { + "target": "com.modrinth.api#GetNotifications" + }, + { + "target": "com.modrinth.api#ReadNotifications" + }, + { + "target": "com.modrinth.api#DeleteNotifications" + }, + { + "target": "com.modrinth.api#GetOpenReports" + }, + { + "target": "com.modrinth.api#SubmitReport" + }, + { + "target": "com.modrinth.api#GetReport" + }, + { + "target": "com.modrinth.api#ModifyReport" + }, + { + "target": "com.modrinth.api#GetReports" + }, + { + "target": "com.modrinth.api#GetThread" + }, + { + "target": "com.modrinth.api#SendThreadMessage" + }, + { + "target": "com.modrinth.api#GetThreads" + }, + { + "target": "com.modrinth.api#DeleteThreadMessage" + }, + { + "target": "com.modrinth.api#GetProjectTeamMembers" + }, + { + "target": "com.modrinth.api#GetTeamMembers" + }, + { + "target": "com.modrinth.api#AddTeamMember" + }, + { + "target": "com.modrinth.api#GetTeams" + }, + { + "target": "com.modrinth.api#JoinTeam" + }, + { + "target": "com.modrinth.api#ModifyTeamMember" + }, + { + "target": "com.modrinth.api#DeleteTeamMember" + }, + { + "target": "com.modrinth.api#TransferTeamOwnership" + }, + { + "target": "com.modrinth.api#CategoryList" + }, + { + "target": "com.modrinth.api#LoaderList" + }, + { + "target": "com.modrinth.api#VersionList" + }, + { + "target": "com.modrinth.api#LicenseText" + }, + { + "target": "com.modrinth.api#DonationPlatformList" + }, + { + "target": "com.modrinth.api#ReportTypeList" + }, + { + "target": "com.modrinth.api#ProjectTypeList" + }, + { + "target": "com.modrinth.api#SideTypeList" + }, + { + "target": "com.modrinth.api#ForgeUpdates2" + }, + { + "target": "com.modrinth.api#Statistics2" + } + ], + "traits": { + "smithy.api#title": "Labrinth", + "smithy.api#documentation": "This documentation doesn't provide a way to test our API. In order to facilitate testing, we recommend the following tools:\n\n- [cURL](https://curl.se/) (recommended, command-line)\n- [ReqBIN](https://reqbin.com/) (recommended, online)\n- [Postman](https://www.postman.com/downloads/)\n- [Insomnia](https://insomnia.rest/)\n- Your web browser, if you don't need to send headers or a request body\n\nOnce you have a working client, you can test that it works by making a `GET` request to `https://staging-api.modrinth.com/`:\n\n```json\n{\n \"about\": \"Welcome traveler!\",\n \"documentation\": \"https://docs.modrinth.com\",\n \"name\": \"modrinth-labrinth\",\n \"version\": \"2.7.0\"\n}\n```\n\nIf you got a response similar to the one above, you can use the Modrinth API!\nWhen you want to go live using the production API, use `api.modrinth.com` instead of `staging-api.modrinth.com`.\n\n## Authentication\nThis API has two options for authentication: personal access tokens and [OAuth2](https://en.wikipedia.org/wiki/OAuth).\nAll tokens are tied to a Modrinth user and use the `Authorization` header of the request.\n\nExample:\n```\nAuthorization: mrp_RNtLRSPmGj2pd1v1ubi52nX7TJJM9sznrmwhAuj511oe4t1jAqAQ3D6Wc8Ic\n```\n\nYou do not need a token for most requests. Generally speaking, only the following types of requests require a token:\n- those which create data (such as version creation)\n- those which modify data (such as editing a project)\n- those which access private data (such as draft projects, notifications, emails, and payout data)\n\nEach request requiring authentication has a certain scope. For example, to view the email of the user being requested, the token must have the `USER_READ_EMAIL` scope.\nYou can find the list of available scopes [on GitHub](https://github.com/modrinth/labrinth/blob/master/src/models/pats.rs#L15). Making a request with an invalid scope will return a 401 error.\n\nPlease note that certain scopes and requests cannot be completed with a personal access token or using OAuth.\nFor example, deleting a user account can only be done through Modrinth's frontend.\n\nA detailed guide on OAuth has been published in [Modrinth's technical documentation](https://docs.modrinth.com/guide/oauth).\n\n### Personal access tokens\nPersonal access tokens (PATs) can be generated in from [the user settings](https://modrinth.com/settings/account).\n\n### GitHub tokens\nFor backwards compatibility purposes, some types of GitHub tokens also work for authenticating a user with Modrinth's API, granting all scopes.\n**We urge any application still using GitHub tokens to start using personal access tokens for security and reliability purposes.**\nGitHub tokens will cease to function to authenticate with Modrinth's API as soon as version 3 of the API is made generally available.\n\n## Cross-Origin Resource Sharing\nThis API features Cross-Origin Resource Sharing (CORS) implemented in compliance with the [W3C spec](https://www.w3.org/TR/cors/).\nThis allows for cross-domain communication from the browser.\nAll responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site.\n\n## Identifiers\nThe majority of items you can interact with in the API have a unique eight-digit base62 ID.\nProjects, versions, users, threads, teams, and reports all use this same way of identifying themselves.\nVersion files use the sha1 or sha512 file hashes as identifiers.\n\nEach project and user has a friendlier way of identifying them; slugs and usernames, respectively.\nWhile unique IDs are constant, slugs and usernames can change at any moment.\nIf you want to store something in the long term, it is recommended to use the unique ID.\n\n## Ratelimits\nThe API has a ratelimit defined per IP. Limits and remaining amounts are given in the response headers.\n- `X-Ratelimit-Limit`: the maximum number of requests that can be made in a minute\n- `X-Ratelimit-Remaining`: the number of requests remaining in the current ratelimit window\n- `X-Ratelimit-Reset`: the time in seconds until the ratelimit window resets\n\nRatelimits are the same no matter whether you use a token or not.\nThe ratelimit is currently 300 requests per minute. If you have a use case requiring a higher limit, please [contact us](mailto:support@modrinth.com).\n\n## User Agents\nTo access the Modrinth API, you **must** use provide a uniquely-identifying `User-Agent` header.\nProviding a user agent that only identifies your HTTP client library (such as \"okhttp/4.9.3\") increases the likelihood that we will block your traffic.\nIt is recommended, but not required, to include contact information in your user agent.\nThis allows us to contact you if we would like a change in your application's behavior without having to block your traffic.\n- Bad: `User-Agent: okhttp/4.9.3`\n- Good: `User-Agent: project_name`\n- Better: `User-Agent: github_username/project_name/1.56.0`\n- Best: `User-Agent: github_username/project_name/1.56.0 (launcher.com)` or `User-Agent: github_username/project_name/1.56.0 (contact@launcher.com)`\n\n## Versioning\nModrinth follows a simple pattern for its API versioning.\nIn the event of a breaking API change, the API version in the URL path is bumped, and migration steps will be published below.\n\nWhen an API is no longer the current one, it will immediately be considered deprecated.\nNo more support will be provided for API versions older than the current one.\nIt will be kept for some time, but this amount of time is not certain.\n\nWe will exercise various tactics to get people to update their implementation of our API.\nOne example is by adding something like `STOP USING THIS API` to various data returned by the API.\n\nOnce an API version is completely deprecated, it will permanently return a 410 error.\nPlease ensure your application handles these 410 errors.\n\n### Migrations\nInside the following spoiler, you will be able to find all changes between versions of the Modrinth API, accompanied by tips and a guide to migrate applications to newer versions.\n\nHere, you can also find changes for [Minotaur](https://github.com/modrinth/minotaur), Modrinth's official Gradle plugin. Major versions of Minotaur directly correspond to major versions of the Modrinth API.\n\n
API v1 to API v2\n\nThese bullet points cover most changes in the v2 API, but please note that fields containing `mod` in most contexts have been shifted to `project`. For example, in the search route, the field `mod_id` was renamed to `project_id`.\n\n- The search route has been moved from `/api/v1/mod` to `/v2/search`\n- New project fields: `project_type` (may be `mod` or `modpack`), `moderation_message` (which has a `message` and `body`), `gallery`\n- New search facet: `project_type`\n- Alphabetical sort removed (it didn't work and is not possible due to limits in MeiliSearch)\n- New search fields: `project_type`, `gallery`\n - The gallery field is an array of URLs to images that are part of the project's gallery\n- The gallery is a new feature which allows the user to upload images showcasing their mod to the CDN which will be displayed on their mod page\n- Internal change: Any project file uploaded to Modrinth is now validated to make sure it's a valid Minecraft mod, Modpack, etc.\n - For example, a Forge 1.17 mod with a JAR not containing a mods.toml will not be allowed to be uploaded to Modrinth\n- In project creation, projects may not upload a mod with no versions to review, however they can be saved as a draft\n - Similarly, for version creation, a version may not be uploaded without any files\n- Donation URLs have been enabled\n- New project status: `archived`. Projects with this status do not appear in search\n- Tags (such as categories, loaders) now have icons (SVGs) and specific project types attached\n- Dependencies have been wiped and replaced with a new system\n- Notifications now have a `type` field, such as `project_update`\n\nAlong with this, project subroutes (such as `/v2/project/{id}/version`) now allow the slug to be used as the ID. This is also the case with user routes.\n\n
Minotaur v1 to Minotaur v2\n\nMinotaur 2.x introduced a few breaking changes to how your buildscript is formatted.\n\nFirst, instead of registering your own `publishModrinth` task, Minotaur now automatically creates a `modrinth` task. As such, you can replace the `task publishModrinth(type: TaskModrinthUpload) {` line with just `modrinth {`.\n\nTo declare supported Minecraft versions and mod loaders, the `gameVersions` and `loaders` arrays must now be used. The syntax for these are pretty self-explanatory.\n\nInstead of using `releaseType`, you must now use `versionType`. This was actually changed in v1.2.0, but very few buildscripts have moved on from v1.1.0.\n\nDependencies have been changed to a special DSL. Create a `dependencies` block within the `modrinth` block, and then use `scope.type(\"project/version\")`. For example, `required.project(\"fabric-api\")` adds a required project dependency on Fabric API.\n\nYou may now use the slug anywhere that a project ID was previously required.\n\n
" + } + } + } +} diff --git a/packages/modrinth/package.json b/packages/modrinth/package.json new file mode 100644 index 000000000..84a47aae6 --- /dev/null +++ b/packages/modrinth/package.json @@ -0,0 +1,85 @@ +{ + "name": "@distilled.cloud/modrinth", + "version": "1.0.0-rc.8", + "repository": { + "type": "git", + "url": "https://github.com/alchemy-run/distilled", + "directory": "packages/modrinth" + }, + "license": "Apache-2.0", + "type": "module", + "sideEffects": false, + "files": [ + "lib", + "src" + ], + "exports": { + ".": { + "types": "./lib/index.d.ts", + "bun": "./src/index.ts", + "worker": "./src/index.ts", + "default": "./lib/index.js" + }, + "./Credentials": { + "types": "./lib/credentials.d.ts", + "bun": "./src/credentials.ts", + "worker": "./src/credentials.ts", + "default": "./lib/credentials.js" + }, + "./Errors": { + "types": "./lib/errors.d.ts", + "bun": "./src/errors.ts", + "worker": "./src/errors.ts", + "default": "./lib/errors.js" + }, + "./Traits": { + "types": "./lib/traits.d.ts", + "bun": "./src/traits.ts", + "worker": "./src/traits.ts", + "default": "./lib/traits.js" + }, + "./Pagination": { + "types": "./lib/pagination.d.ts", + "bun": "./src/pagination.ts", + "worker": "./src/pagination.ts", + "default": "./lib/pagination.js" + }, + "./Protocol": { + "types": "./lib/protocol.d.ts", + "bun": "./src/protocol.ts", + "worker": "./src/protocol.ts", + "default": "./lib/protocol.js" + }, + "./Retry": { + "types": "./lib/retry.d.ts", + "bun": "./src/retry.ts", + "worker": "./src/retry.ts", + "default": "./lib/retry.js" + }, + "./*": { + "types": "./lib/services/*.d.ts", + "bun": "./src/services/*.ts", + "worker": "./src/services/*.ts", + "default": "./lib/services/*.js" + } + }, + "scripts": { + "build": "tsc -b", + "convert": "bun scripts/convert.ts", + "generate": "bun scripts/convert.ts && bun scripts/generate.ts", + "typecheck": "tsc -p tsconfig.json", + "specs:fetch": "git submodule update --force --init --depth=1 specs/spec-mirror-modrinth", + "specs:update": "git submodule update --remote --force --depth=1 specs/spec-mirror-modrinth" + }, + "dependencies": { + "@distilled.cloud/core": "workspace:*" + }, + "devDependencies": { + "@types/bun": "catalog:tooling", + "@types/node": "catalog:tooling", + "@effect/platform-bun": "catalog:effect" + }, + "peerDependencies": { + "effect": "catalog:effect" + } +} diff --git a/packages/modrinth/scripts/convert.ts b/packages/modrinth/scripts/convert.ts new file mode 100644 index 000000000..7466834e6 --- /dev/null +++ b/packages/modrinth/scripts/convert.ts @@ -0,0 +1,29 @@ +#!/usr/bin/env bun +/** + * convert — turn the Modrinth OpenAPI spec into a Smithy 2.0 JSON model. + * + * Input: specs/spec-mirror-modrinth/specs/openapi.json (spec submodule) + * Output: .generated-specs/modrinth.json + * + * The OpenAPI→Smithy converter lives in + * `@distilled.cloud/core/codegen/openapi`; this script is Modrinth's pipeline + * config. `scripts/generate.ts` compiles the model into src/services. + */ +import * as path from "node:path"; +import { runOpenApiConvert } from "@distilled.cloud/core/codegen/openapi-cli"; + +await runOpenApiConvert({ + root: path.resolve(import.meta.dir, ".."), + specs: [ + { + name: "modrinth", + specPath: "specs/spec-mirror-modrinth/specs/openapi.json", + }, + ], + patchesDir: false, + options: { + namespace: "com.modrinth.api", + serviceName: "Modrinth", + skipDeprecated: true, + }, +}); diff --git a/packages/modrinth/scripts/generate.ts b/packages/modrinth/scripts/generate.ts new file mode 100644 index 000000000..9f163be8d --- /dev/null +++ b/packages/modrinth/scripts/generate.ts @@ -0,0 +1,83 @@ +#!/usr/bin/env bun +/** + * generate — turn the Smithy JSON model in .generated-specs into the + * Modrinth Effect SDK. + * + * Input: .generated-specs/modrinth.json (written by scripts/convert.ts) + * Output: src/services/modrinth.ts + src/services/index.ts + * + * The smithy→SDK compiler and CLI pipeline live in + * `@distilled.cloud/core/codegen`; this script is Modrinth's provider spec. + * Modrinth keeps the wire's snake_case member names on the TS surface, so no + * member renaming or wire dictionaries appear here. + */ +import type { SdkSpec } from "@distilled.cloud/core/codegen/generator"; +import { runGeneratorCli } from "@distilled.cloud/core/codegen/cli"; + +const NULLABLE_TRAIT = "com.distilled.openapi#nullable"; +const ERROR_MATCHERS_TRAIT = "com.distilled.openapi#errorMatchers"; +const RAW_RESPONSE_TRAIT = "com.distilled.openapi#rawResponse"; +const SENSITIVE_TRAIT = "smithy.api#sensitive"; + +/** Modrinth's provider spec for the shared smithy→SDK compiler. */ +const modrinthSpec: SdkSpec = { + nullableTrait: NULLABLE_TRAIT, + errorMatchersTrait: ERROR_MATCHERS_TRAIT, + + extraBindings: [ + { + // Sole member of a synthesized wrapper for bare array/scalar response + // bodies; as the response's only member, the response IS the payload. + trait: RAW_RESPONSE_TRAIT, + binding: "rawResponse", + pipe: "T.RawResponse()", + rootPipe: "T.RawResponseRoot()", + }, + ], + + // Sensitive strings (tokens, secrets): the schema member carries + // T.SensitiveValue; the REST protocol delivers Redacted values and accepts + // string | Redacted on input. + memberTraitPipes: { + [SENSITIVE_TRAIT]: "T.SensitiveValue", + }, + memberTsType: (m) => + SENSITIVE_TRAIT in m.traits + ? `string | Redacted.Redacted${m.nullable ? " | null" : ""}` + : undefined, + + // Unions surface as TS type unions over an opaque schema — the REST + // protocol passes union content through verbatim (wire names ARE the TS + // names for Modrinth), so no runtime case discrimination is needed. + union: ({ name, caseTargets, tsRef }) => [ + `export type ${name} = ${caseTargets.map(tsRef).join(" | ") || "unknown"};`, + `export const ${name} = /*@__PURE__*/ S.Unknown as any as S.Schema<${name}>;\n`, + ], + + operationDecl: { + contextType: "ModrinthOpContext", + commonErrorType: "ModrinthOpError", + commonErrorClasses: ["UnknownModrinthError"], + protocol: "ModrinthProtocol", + retry: "Retry.Retry", + }, + + sourceNote: + ".generated-specs (specs/spec-mirror-modrinth/specs/openapi.json)", + + // Sensitive member types reference Redacted; pull the import in when used. + postProcess: (code) => + code.includes("Redacted.Redacted<") + ? code.replace( + `import * as S from "@distilled.cloud/core/schema";\n`, + `import * as S from "@distilled.cloud/core/schema";\nimport * as Redacted from "effect/Redacted";\n`, + ) + : code, +}; + +runGeneratorCli({ + description: "Generate the Modrinth Effect SDK from the Smithy model", + root: `${import.meta.dir}/..`, + patchesDir: false, + spec: () => modrinthSpec, +}); diff --git a/packages/modrinth/src/credentials.ts b/packages/modrinth/src/credentials.ts new file mode 100644 index 000000000..357dbc9cc --- /dev/null +++ b/packages/modrinth/src/credentials.ts @@ -0,0 +1,66 @@ +/** + * Modrinth credentials — hand-written. + * + * The `Credentials` service holds an *effect* that resolves the current + * credentials on every request (the protocol layer resolves it per request + * on the calling fiber). + * + * Most Labrinth endpoints are public. Authenticated calls send the token as + * `Authorization: {token}` (no Bearer prefix) — personal access tokens and + * OAuth access tokens are both accepted. Requests without a uniquely + * identifying User-Agent are rejected. + */ +import * as Context from "effect/Context"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import * as Redacted from "effect/Redacted"; + +export const DEFAULT_API_BASE_URL = "https://api.modrinth.com/v2"; + +/** + * Modrinth requires a uniquely-identifying User-Agent and is more likely + * to block generic HTTP-client defaults. + */ +export const DEFAULT_USER_AGENT = "distilled.cloud-modrinth"; + +export interface Config { + readonly apiKey?: Redacted.Redacted; + readonly apiBaseUrl: string; + readonly userAgent: string; +} + +export class Credentials extends Context.Service< + Credentials, + Effect.Effect +>()("ModrinthCredentials") {} + +/** Layer from an optional API token + optional base URL / User-Agent. */ +export const fromApiKey = (config: { + readonly apiKey?: string; + readonly apiBaseUrl?: string; + readonly userAgent?: string; +}): Layer.Layer => + Layer.succeed( + Credentials, + Effect.succeed({ + apiKey: + config.apiKey !== undefined ? Redacted.make(config.apiKey) : undefined, + apiBaseUrl: config.apiBaseUrl ?? DEFAULT_API_BASE_URL, + userAgent: config.userAgent ?? DEFAULT_USER_AGENT, + }), + ); + +/** + * Reads MODRINTH_API_KEY (optional), MODRINTH_API_BASE_URL (optional), + * and MODRINTH_USER_AGENT (optional). Public endpoints work with no key. + */ +export const CredentialsFromEnv: Layer.Layer = Layer.succeed( + Credentials, + Effect.succeed({ + apiKey: process.env.MODRINTH_API_KEY + ? Redacted.make(process.env.MODRINTH_API_KEY) + : undefined, + apiBaseUrl: process.env.MODRINTH_API_BASE_URL ?? DEFAULT_API_BASE_URL, + userAgent: process.env.MODRINTH_USER_AGENT ?? DEFAULT_USER_AGENT, + }), +); diff --git a/packages/modrinth/src/errors.ts b/packages/modrinth/src/errors.ts new file mode 100644 index 000000000..726075f43 --- /dev/null +++ b/packages/modrinth/src/errors.ts @@ -0,0 +1,50 @@ +/** + * Modrinth-specific error types. + * + * Re-exports the common HTTP errors from core and adds the Modrinth fallback + * errors. Note the generated service module additionally defines its own + * per-status matcher classes (BadRequest/NotFound/…) for the statuses each + * operation declares — those share `_tag`s with the core classes here, so + * `catchTag` works against either. + */ +export { + BadGateway, + BadRequest, + Conflict, + ConfigError, + Forbidden, + GatewayTimeout, + InternalServerError, + Locked, + NotFound, + ServiceUnavailable, + TooManyRequests, + Unauthorized, + UnprocessableEntity, + HTTP_STATUS_MAP, + DEFAULT_ERRORS, + API_ERRORS, +} from "@distilled.cloud/core/errors"; +export type { DefaultErrors } from "@distilled.cloud/core/errors"; + +import * as Schema from "effect/Schema"; +import * as Category from "@distilled.cloud/core/category"; + +/** Unknown Modrinth error — returned when nothing else matches the failure. */ +export class UnknownModrinthError extends Schema.TaggedError()( + "UnknownModrinthError", + { + code: Schema.optional(Schema.String), + message: Schema.optional(Schema.String), + body: Schema.Unknown, + }, +).pipe(Category.withServerError) {} + +/** Schema parse error wrapper. */ +export class ModrinthParseError extends Schema.TaggedError()( + "ModrinthParseError", + { + body: Schema.Unknown, + cause: Schema.Unknown, + }, +).pipe(Category.withParseError) {} diff --git a/packages/modrinth/src/index.ts b/packages/modrinth/src/index.ts new file mode 100644 index 000000000..2f9eecf83 --- /dev/null +++ b/packages/modrinth/src/index.ts @@ -0,0 +1,33 @@ +/** + * @distilled.cloud/modrinth — Modrinth SDK for Effect. + * + * `./services` is generated by `scripts/generate.ts` from the Smithy model + * in `.generated-specs` (written by `scripts/convert.ts` from the OpenAPI + * spec). Everything else in this folder is hand-written. + * + * @example + * ```ts + * import * as Modrinth from "@distilled.cloud/modrinth"; + * + * const results = yield* Modrinth.Services.modrinth.searchProjects({ + * query: "sodium", + * }); + * ``` + */ +export * from "./credentials.ts"; +export * from "./errors.ts"; +export * as T from "./traits.ts"; +export { + ModrinthProtocol, + type ModrinthOpError, + type ModrinthOpContext, +} from "./protocol.ts"; +export { paginateCursor } from "./pagination.ts"; +export * as Retry from "./retry.ts"; +export * as Services from "./services/index.ts"; +// Operations (and their request/response types) are importable straight off +// the package root. The service-local typed error classes shadow the +// same-named shared ones from ./errors.ts — the ops actually raise the +// service-local classes. +export * from "./services/modrinth.ts"; +export { BadRequest, NotFound } from "./services/modrinth.ts"; diff --git a/packages/modrinth/src/pagination.ts b/packages/modrinth/src/pagination.ts new file mode 100644 index 000000000..6c93f95d8 --- /dev/null +++ b/packages/modrinth/src/pagination.ts @@ -0,0 +1,7 @@ +/** + * Modrinth pagination — hand-written. + * + * Search uses `offset`/`limit`/`total_hits` on the wire; those stay plain + * input fields unless a generated operation is stamped `smithy.api#paginated`. + */ +export { paginateCursor } from "@distilled.cloud/core/pagination"; diff --git a/packages/modrinth/src/protocol.ts b/packages/modrinth/src/protocol.ts new file mode 100644 index 000000000..ae29bb5c4 --- /dev/null +++ b/packages/modrinth/src/protocol.ts @@ -0,0 +1,93 @@ +/** + * ModrinthProtocol — hand-written. + * + * Modrinth (Labrinth) speaks plain JSON REST (no response envelope): + * + * request: credentials → optional `Authorization: ` (no Bearer) + * + `User-Agent` + base URL (default + * https://api.modrinth.com/v2), resolved from the calling fiber + * on every request + * + * response: 2xx JSON is the payload (sensitive members delivered as + * `Redacted`); non-2xx `{ error?, description? }` bodies map to + * the operation's typed error classes by status, then the shared + * HTTP-status classes, then {@link UnknownModrinthError}. + */ +import * as Effect from "effect/Effect"; +import type * as Layer from "effect/Layer"; +import * as Redacted from "effect/Redacted"; +import type * as HttpClient from "effect/unstable/http/HttpClient"; +import type * as HttpClientError from "effect/unstable/http/HttpClientError"; +import type * as API from "@distilled.cloud/core/api"; +import { + makeRestProtocol, + type RestErrorEnvelope, +} from "@distilled.cloud/core/protocol-rest"; +import type { API_ERRORS, ConfigError } from "@distilled.cloud/core/errors"; +import { Credentials, type Config } from "./credentials.ts"; +import { UnknownModrinthError } from "./errors.ts"; + +/** + * Error channel shared by every generated Modrinth operation. Generated + * service files annotate operations with `API.OperationMethod` explicitly so the compiler never + * infers these back out of the schema generics. + */ +export type ModrinthOpError = + | InstanceType<(typeof API_ERRORS)[number]> + | UnknownModrinthError + | ConfigError + | HttpClientError.HttpClientError; + +/** Context (requirements) shared by every generated Modrinth operation. */ +export type ModrinthOpContext = Credentials | HttpClient.HttpClient; + +/** + * Labrinth error bodies are typically `{ error, description }`. Fall back + * to `message` when present. + */ +const errorEnvelope = (body: unknown): RestErrorEnvelope | undefined => { + if (body === null || typeof body !== "object") return undefined; + const b = body as Record; + const message = + typeof b.description === "string" + ? b.description + : typeof b.message === "string" + ? b.message + : undefined; + const code = + typeof b.error === "string" + ? b.error + : typeof b.code === "string" || typeof b.code === "number" + ? b.code + : undefined; + if (code === undefined && message === undefined) return undefined; + return { code, message }; +}; + +export const ModrinthProtocol: Layer.Layer = + makeRestProtocol({ + // The Credentials service holds an effect — resolving it here (per + // request, on the calling fiber) picks up context-provided credentials. + credentials: Effect.gen(function* () { + const resolve = yield* Credentials; + return yield* resolve; + }), + baseUrl: (creds) => creds.apiBaseUrl, + headers: (creds) => ({ + "User-Agent": creds.userAgent, + ...(creds.apiKey ? { Authorization: Redacted.value(creds.apiKey) } : {}), + }), + errorEnvelope, + unknownError: ({ code, message, body }) => + new UnknownModrinthError({ + code: + typeof code === "string" + ? code + : code !== undefined + ? String(code) + : undefined, + message, + body, + }), + }); diff --git a/packages/modrinth/src/retry.ts b/packages/modrinth/src/retry.ts new file mode 100644 index 000000000..7c59e6857 --- /dev/null +++ b/packages/modrinth/src/retry.ts @@ -0,0 +1,54 @@ +/** + * Modrinth retry configuration. + * + * Defines the per-SDK `Retry` Context.Service tag that generated operations + * wire into `API.make`. Callers can install a blanket retry policy at the + * layer level and have every Modrinth API call below it pick it up: + * + * @example + * ```ts + * import * as Modrinth from "@distilled.cloud/modrinth"; + * + * myEffect.pipe(Modrinth.Retry.transient); + * Effect.provide(myEffect, Layer.succeed(Modrinth.Retry.Retry, customPolicy)); + * ``` + */ +import * as Context from "effect/Context"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import { + type Policy, + throttlingFactory, + transientFactory, +} from "@distilled.cloud/core/retry"; + +export { + type Options, + type Factory, + type Policy, + makeDefault, + jittered, + capped, + throttlingOptions, + transientOptions, + throttlingFactory, + transientFactory, +} from "@distilled.cloud/core/retry"; + +/** Context tag for configuring retry behavior of Modrinth API calls. */ +export class Retry extends Context.Service()("ModrinthRetry") {} + +/** Provides a custom retry policy to every Modrinth API call below it. */ +export const policy = (optionsOrFactory: Policy) => + Effect.provide(Layer.succeed(Retry, optionsOrFactory)); + +/** Disables all automatic retries. */ +export const none = Effect.provide( + Layer.succeed(Retry, { while: () => false }), +); + +/** Apply the throttling retry policy (retries throttling errors indefinitely). */ +export const throttling = policy(throttlingFactory); + +/** Apply the transient retry policy (retries all transient errors indefinitely). */ +export const transient = policy(transientFactory); diff --git a/packages/modrinth/src/services/index.ts b/packages/modrinth/src/services/index.ts new file mode 100644 index 000000000..4aa664237 --- /dev/null +++ b/packages/modrinth/src/services/index.ts @@ -0,0 +1,2 @@ +// AUTO-GENERATED by scripts/generate.ts. Do not edit. +export * as modrinth from "./modrinth.ts"; diff --git a/packages/modrinth/src/services/modrinth.ts b/packages/modrinth/src/services/modrinth.ts new file mode 100644 index 000000000..0e8e5018e --- /dev/null +++ b/packages/modrinth/src/services/modrinth.ts @@ -0,0 +1,5706 @@ +// AUTO-GENERATED by scripts/generate.ts from .generated-specs (specs/spec-mirror-modrinth/specs/openapi.json). Do not edit. +import * as S from "@distilled.cloud/core/schema"; +import * as API from "@distilled.cloud/core/api"; +import * as C from "@distilled.cloud/core/category"; +import * as T from "../traits.ts"; +import { + ModrinthProtocol, + type ModrinthOpError, + type ModrinthOpContext, +} from "../protocol.ts"; +import { UnknownModrinthError } from "../errors.ts"; +import * as Retry from "../retry.ts"; + +export type { ModrinthOpError, ModrinthOpContext }; + +export class BadRequest + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("BadRequest", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 400 }], + ) {} + +export class NotFound + extends /*@__PURE__*/ T.applyErrorMatchers( + /*@__PURE__*/ S.TaggedError()("NotFound", { + code: S.Number, + message: S.String, + }).pipe(C.withBadRequestError), + [{ status: 404 }], + ) {} + +export interface AddFilesToVersionRequest { + /** The ID of the version */ + id: string; + data?: unknown; +} +export const AddFilesToVersionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + data: S.optional(S.Unknown), + }).pipe( + T.Http({ + method: "POST", + uri: "/version/{id}/file", + code: 200, + contentType: "multipart", + }), + ), +).annotate({ + identifier: "AddFilesToVersionRequest", +}) as any as S.Schema; + +export interface AddFilesToVersionResponse {} +export const AddFilesToVersionResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "AddFilesToVersionResponse", +}) as any as S.Schema; + +export type AddGalleryImageRequestExt = + | "png" + | "jpg" + | "jpeg" + | "bmp" + | "gif" + | "webp" + | "svg" + | "svgz" + | "rgb"; +export const AddGalleryImageRequestExt = /*@__PURE__*/ S.String; + +export interface AddGalleryImageRequest { + /** The ID or slug of the project */ + id_slug: string; + /** Image extension */ + ext: AddGalleryImageRequestExt | (string & {}); + /** 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 const AddGalleryImageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + ext: AddGalleryImageRequestExt.pipe(T.Query()), + featured: S.Boolean.pipe(T.Query()), + title: S.optional(S.String.pipe(T.Query())), + description: S.optional(S.String.pipe(T.Query())), + ordering: S.optional(S.Number.pipe(T.Query())), + }).pipe( + T.Http({ method: "POST", uri: "/project/{id_slug}/gallery", code: 200 }), + ), +).annotate({ + identifier: "AddGalleryImageRequest", +}) as any as S.Schema; + +export interface AddGalleryImageResponse {} +export const AddGalleryImageResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "AddGalleryImageResponse", +}) as any as S.Schema; + +export interface AddTeamMemberRequest { + /** The ID of the team */ + id: string; + user_id: string; +} +export const AddTeamMemberRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + user_id: S.String, + }).pipe(T.Http({ method: "POST", uri: "/team/{id}/members", code: 200 })), +).annotate({ + identifier: "AddTeamMemberRequest", +}) as any as S.Schema; + +export interface AddTeamMemberResponse {} +export const AddTeamMemberResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "AddTeamMemberResponse", +}) as any as S.Schema; + +export interface CategoryListRequest {} +export const CategoryListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe(T.Http({ method: "GET", uri: "/tag/category", code: 200 })), +).annotate({ + identifier: "CategoryListRequest", +}) as any as S.Schema; + +export interface CategoryTag { + /** The SVG icon of a category */ + icon: string; + /** The name of the category */ + name: string; + /** The project type this category is applicable to */ + project_type: string; + /** The header under which the category should go */ + header: string; +} +export const CategoryTag = /*@__PURE__*/ S.suspend(() => + S.Struct({ + icon: S.String, + name: S.String, + project_type: S.String, + header: S.String, + }), +).annotate({ identifier: "CategoryTag" }) as any as S.Schema; + +export type CategoryListResponseBodyList = Array; +export const CategoryListResponseBodyList = /*@__PURE__*/ S.Array( + CategoryTag, +) as any as S.Schema; + +export type CategoryListResponse = CategoryListResponseBodyList; +export const CategoryListResponse = /*@__PURE__*/ S.suspend(() => + CategoryListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "CategoryListResponse", +}) as any as S.Schema; + +export type ChangeProjectIconRequestExt = + | "png" + | "jpg" + | "jpeg" + | "bmp" + | "gif" + | "webp" + | "svg" + | "svgz" + | "rgb"; +export const ChangeProjectIconRequestExt = /*@__PURE__*/ S.String; + +export interface ChangeProjectIconRequest { + /** The ID or slug of the project */ + id_slug: string; + /** Image extension */ + ext: ChangeProjectIconRequestExt | (string & {}); +} +export const ChangeProjectIconRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + ext: ChangeProjectIconRequestExt.pipe(T.Query()), + }).pipe( + T.Http({ method: "PATCH", uri: "/project/{id_slug}/icon", code: 200 }), + ), +).annotate({ + identifier: "ChangeProjectIconRequest", +}) as any as S.Schema; + +export interface ChangeProjectIconResponse {} +export const ChangeProjectIconResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ChangeProjectIconResponse", +}) as any as S.Schema; + +export interface ChangeUserIconRequest { + /** The ID or username of the user */ + id_username: string; +} +export const ChangeUserIconRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "PATCH", uri: "/user/{id_username}/icon", code: 200 }), + ), +).annotate({ + identifier: "ChangeUserIconRequest", +}) as any as S.Schema; + +export interface ChangeUserIconResponse {} +export const ChangeUserIconResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ChangeUserIconResponse", +}) as any as S.Schema; + +export interface CheckProjectValidityRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const CheckProjectValidityRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "GET", uri: "/project/{id_slug}/check", code: 200 }), + ), +).annotate({ + identifier: "CheckProjectValidityRequest", +}) as any as S.Schema; + +export interface ProjectIdentifier { + id?: string; +} +export const ProjectIdentifier = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.optional(S.String), + }), +).annotate({ + identifier: "ProjectIdentifier", +}) as any as S.Schema; + +/** A list of the featured categories that the project has. */ +export type CreatableProjectCategoriesList = Array; +export const CreatableProjectCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again. */ +export type CreatableProjectAdditionalCategoriesList = Array; +export const CreatableProjectAdditionalCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The status of the project */ +export type CreatableProjectStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const CreatableProjectStatus = /*@__PURE__*/ S.String; + +/** The requested status when submitting for review or scheduling the project for release. Approved status refers to "Public" visibility. */ +export type CreatableProjectRequestedStatus = + | "approved" + | "archived" + | "unlisted" + | "private" + | "draft"; +export const CreatableProjectRequestedStatus = /*@__PURE__*/ S.String; + +export interface ProjectDonationURL { + /** The ID of the donation platform */ + id?: string; + /** The donation platform this link is to */ + platform?: string; + /** The URL of the donation platform and user */ + url?: string; +} +export const ProjectDonationURL = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.optional(S.String), + platform: S.optional(S.String), + url: S.optional(S.String), + }), +).annotate({ + identifier: "ProjectDonationURL", +}) as any as S.Schema; + +/** A list of donation links for the project */ +export type CreatableProjectDonationUrlsList = Array; +export const CreatableProjectDonationUrlsList = /*@__PURE__*/ S.Array( + ProjectDonationURL, +) as any as S.Schema; + +/** Deprecated - use `environment` instead. */ +export type CreatableProjectClientSide = + | "required" + | "optional" + | "unsupported"; +export const CreatableProjectClientSide = /*@__PURE__*/ S.String; + +/** Deprecated - use `environment` instead. */ +export type CreatableProjectServerSide = + | "required" + | "optional" + | "unsupported"; +export const CreatableProjectServerSide = /*@__PURE__*/ S.String; + +/** The project type of the project */ +export type CreatableProjectProjectType = "mod" | "modpack"; +export const CreatableProjectProjectType = /*@__PURE__*/ S.String; + +/** The type of dependency that this version has */ +export type VersionDependencyDependencyType = + | "required" + | "optional" + | "incompatible" + | "embedded"; +export const VersionDependencyDependencyType = /*@__PURE__*/ S.String; + +export interface VersionDependency { + /** The ID of the version that this version depends on */ + version_id?: string | null; + /** The ID of the project that this version depends on */ + project_id?: string | null; + /** The file name of the dependency, mostly used for showing external dependencies on modpacks */ + file_name?: string | null; + /** The type of dependency that this version has */ + dependency_type: VersionDependencyDependencyType | (string & {}); +} +export const VersionDependency = /*@__PURE__*/ S.suspend(() => + S.Struct({ + version_id: S.optional(S.NullOr(S.String)), + project_id: S.optional(S.NullOr(S.String)), + file_name: S.optional(S.NullOr(S.String)), + dependency_type: VersionDependencyDependencyType, + }), +).annotate({ + identifier: "VersionDependency", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type EditableVersionDependenciesList = Array; +export const EditableVersionDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type EditableVersionGameVersionsList = Array; +export const EditableVersionGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type EditableVersionVersionType = "release" | "beta" | "alpha"; +export const EditableVersionVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type EditableVersionLoadersList = Array; +export const EditableVersionLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type EditableVersionStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const EditableVersionStatus = /*@__PURE__*/ S.String; + +export type EditableVersionRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const EditableVersionRequestedStatus = /*@__PURE__*/ S.String; + +/** The hash format and the hash of the new primary file */ +export type EditableVersionPrimaryFileList = Array; +export const EditableVersionPrimaryFileList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface EditableFileType { + /** The hash algorithm of the hash specified in the hash field */ + algorithm: string; + /** The hash of the file you're editing */ + hash: string; + file_type: unknown; +} +export const EditableFileType = /*@__PURE__*/ S.suspend(() => + S.Struct({ + algorithm: S.String, + hash: S.String, + file_type: S.Unknown, + }), +).annotate({ + identifier: "EditableFileType", +}) as any as S.Schema; + +/** A list of file_types to edit */ +export type EditableVersionFileTypesList = Array; +export const EditableVersionFileTypesList = /*@__PURE__*/ S.Array( + EditableFileType, +) as any as S.Schema; + +export interface EditableVersion { + /** The name of this version */ + name?: string; + /** The version number. Ideally will follow semantic versioning */ + version_number?: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: EditableVersionDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions?: EditableVersionGameVersionsList; + /** The release channel for this version */ + version_type?: EditableVersionVersionType | (string & {}); + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders?: EditableVersionLoadersList; + /** Whether the version is featured or not */ + featured?: boolean; + status?: EditableVersionStatus | (string & {}); + requested_status?: EditableVersionRequestedStatus | (string & {}) | null; + /** The hash format and the hash of the new primary file */ + primary_file?: EditableVersionPrimaryFileList; + /** A list of file_types to edit */ + file_types?: EditableVersionFileTypesList; +} +export const EditableVersion = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.optional(S.String), + version_number: S.optional(S.String), + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(EditableVersionDependenciesList), + game_versions: S.optional(EditableVersionGameVersionsList), + version_type: S.optional(EditableVersionVersionType), + loaders: S.optional(EditableVersionLoadersList), + featured: S.optional(S.Boolean), + status: S.optional(EditableVersionStatus), + requested_status: S.optional(S.NullOr(EditableVersionRequestedStatus)), + primary_file: S.optional(EditableVersionPrimaryFileList), + file_types: S.optional(EditableVersionFileTypesList), + }), +).annotate({ + identifier: "EditableVersion", +}) as any as S.Schema; + +/** A list of initial versions to upload with the created project. Deprecated - please upload version files after initial upload. */ +export type CreatableProjectInitialVersionsList = Array; +export const CreatableProjectInitialVersionsList = /*@__PURE__*/ S.Array( + EditableVersion, +) as any as S.Schema; + +export interface CreatableProjectGalleryItem { + /** The name of the multipart item where the gallery media is located */ + item?: string; + /** Whether the image is featured in the gallery */ + featured?: boolean; + /** The title of the gallery image */ + title?: string | null; + /** The description of the gallery image */ + description?: string | null; + /** The order of the gallery image. Gallery images are sorted by this field and then alphabetically by title. */ + ordering?: number; +} +export const CreatableProjectGalleryItem = /*@__PURE__*/ S.suspend(() => + S.Struct({ + item: S.optional(S.String), + featured: S.optional(S.Boolean), + title: S.optional(S.NullOr(S.String)), + description: S.optional(S.NullOr(S.String)), + ordering: S.optional(S.Number), + }), +).annotate({ + identifier: "CreatableProjectGalleryItem", +}) as any as S.Schema; + +/** Gallery images to be uploaded with the created project. Deprecated - please upload gallery images after initial upload. */ +export type CreatableProjectGalleryItemsList = + Array; +export const CreatableProjectGalleryItemsList = /*@__PURE__*/ S.Array( + CreatableProjectGalleryItem, +) as any as S.Schema; + +export interface CreatableProject { + /** The slug of a project, used for vanity URLs. Regex: ```^[\w!@$()`.+,"\-']{3,64}$``` */ + slug: string; + /** The title or name of the project */ + title: string; + /** A short sentence summarizing the project, no more than a sentence or two. */ + description: string; + /** A long form description of the project */ + body: string; + /** A list of the featured categories that the project has. */ + categories: CreatableProjectCategoriesList; + /** A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again. */ + additional_categories?: CreatableProjectAdditionalCategoriesList; + /** The status of the project */ + status?: CreatableProjectStatus | (string & {}); + /** The requested status when submitting for review or scheduling the project for release. Approved status refers to "Public" visibility. */ + requested_status?: CreatableProjectRequestedStatus | (string & {}) | null; + /** 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. */ + discord_url?: string | null; + /** A list of donation links for the project */ + donation_urls?: CreatableProjectDonationUrlsList; + /** Deprecated - use `environment` instead. */ + client_side: CreatableProjectClientSide | (string & {}); + /** Deprecated - use `environment` instead. */ + server_side: CreatableProjectServerSide | (string & {}); + /** The SPDX license ID of a project */ + license_id: string; + /** The URL to this license */ + license_url?: string | null; + /** The project type of the project */ + project_type: CreatableProjectProjectType | (string & {}); + /** A list of initial versions to upload with the created project. Deprecated - please upload version files after initial upload. */ + initial_versions?: CreatableProjectInitialVersionsList; + /** Whether the project should be saved as a draft instead of being sent to moderation for review. Deprecated - please always mark this as true. */ + is_draft?: boolean; + /** Gallery images to be uploaded with the created project. Deprecated - please upload gallery images after initial upload. */ + gallery_items?: CreatableProjectGalleryItemsList; +} +export const CreatableProject = /*@__PURE__*/ S.suspend(() => + S.Struct({ + slug: S.String, + title: S.String, + description: S.String, + body: S.String, + categories: CreatableProjectCategoriesList, + additional_categories: S.optional(CreatableProjectAdditionalCategoriesList), + status: S.optional(CreatableProjectStatus), + requested_status: S.optional(S.NullOr(CreatableProjectRequestedStatus)), + issues_url: S.optional(S.NullOr(S.String)), + source_url: S.optional(S.NullOr(S.String)), + wiki_url: S.optional(S.NullOr(S.String)), + discord_url: S.optional(S.NullOr(S.String)), + donation_urls: S.optional(CreatableProjectDonationUrlsList), + client_side: CreatableProjectClientSide, + server_side: CreatableProjectServerSide, + license_id: S.String, + license_url: S.optional(S.NullOr(S.String)), + project_type: CreatableProjectProjectType, + initial_versions: S.optional(CreatableProjectInitialVersionsList), + is_draft: S.optional(S.Boolean), + gallery_items: S.optional(CreatableProjectGalleryItemsList), + }), +).annotate({ + identifier: "CreatableProject", +}) as any as S.Schema; + +/** Project icon file */ +export type CreateProjectRequestIcon = + | "*.png" + | "*.jpg" + | "*.jpeg" + | "*.bmp" + | "*.gif" + | "*.webp" + | "*.svg" + | "*.svgz" + | "*.rgb"; +export const CreateProjectRequestIcon = /*@__PURE__*/ S.String; + +export interface CreateProjectRequest { + data: CreatableProject; + /** Project icon file */ + icon?: CreateProjectRequestIcon | (string & {}); +} +export const CreateProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + data: CreatableProject, + icon: S.optional(CreateProjectRequestIcon), + }).pipe( + T.Http({ + method: "POST", + uri: "/project", + code: 200, + contentType: "multipart", + }), + ), +).annotate({ + identifier: "CreateProjectRequest", +}) as any as S.Schema; + +/** The status of the project */ +export type ProjectStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const ProjectStatus = /*@__PURE__*/ S.String; + +/** The project type of the project */ +export type ProjectProjectType = "mod" | "modpack" | "resourcepack" | "shader"; +export const ProjectProjectType = /*@__PURE__*/ S.String; + +/** A list of the featured categories that the project has. */ +export type ProjectCategoriesList = Array; +export const ProjectCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again. */ +export type ProjectAdditionalCategoriesList = Array; +export const ProjectAdditionalCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The environment a project or version supports. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system */ +export type EnvironmentEnum = + | "client_and_server" + | "client_only" + | "client_only_server_optional" + | "singleplayer_only" + | "server_only" + | "server_only_client_optional" + | "dedicated_server_only" + | "client_or_server" + | "client_or_server_prefers_both" + | "unknown"; +export const EnvironmentEnum = /*@__PURE__*/ S.String; + +/** All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system */ +export type ProjectEnvironmentList = Array; +export const ProjectEnvironmentList = /*@__PURE__*/ S.Array( + EnvironmentEnum, +) as any as S.Schema; + +/** A list of all of the game versions supported by the project */ +export type ProjectGameVersionsList = Array; +export const ProjectGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of all of the loaders supported by the project. These vary based on project type. */ +export type ProjectLoadersList = Array; +export const ProjectLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of the version IDs of the project */ +export type ProjectVersionsList = Array; +export const ProjectVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The license of the project */ +export interface ProjectLicense { + /** The SPDX license ID of a project */ + id?: string; + /** The long name of a license */ + name?: string; + /** The URL to this license */ + url?: string | null; +} +export const ProjectLicense = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.optional(S.String), + name: S.optional(S.String), + url: S.optional(S.NullOr(S.String)), + }), +).annotate({ identifier: "ProjectLicense" }) as any as S.Schema; + +export interface GalleryImage { + /** The URL of the gallery image */ + url: string; + /** Whether the image is featured in the gallery */ + featured: boolean; + /** The title of the gallery image */ + title?: string | null; + /** The description of the gallery image */ + description?: string | null; + /** The date and time the gallery image was created */ + created: string; + /** The order of the gallery image. Gallery images are sorted by this field and then alphabetically by title. */ + ordering?: number; +} +export const GalleryImage = /*@__PURE__*/ S.suspend(() => + S.Struct({ + url: S.String, + featured: S.Boolean, + title: S.optional(S.NullOr(S.String)), + description: S.optional(S.NullOr(S.String)), + created: S.String, + ordering: S.optional(S.Number), + }), +).annotate({ identifier: "GalleryImage" }) as any as S.Schema; + +/** A list of images that have been uploaded to the project's gallery */ +export type ProjectGalleryList = Array; +export const ProjectGalleryList = /*@__PURE__*/ S.Array( + GalleryImage, +) as any as S.Schema; + +export type ProjectMonetizationStatus = + | "monetized" + | "demonetized" + | "force-demonetized"; +export const ProjectMonetizationStatus = /*@__PURE__*/ S.String; + +/** The requested status when submitting for review or scheduling the project for release. Approved status refers to "Public" visibility. */ +export type ProjectRequestedStatus = + | "approved" + | "archived" + | "unlisted" + | "private" + | "draft"; +export const ProjectRequestedStatus = /*@__PURE__*/ S.String; + +/** A list of donation links for the project */ +export type ProjectDonationUrlsList = Array; +export const ProjectDonationUrlsList = /*@__PURE__*/ S.Array( + ProjectDonationURL, +) as any as S.Schema; + +/** Deprecated - use `environment` instead. */ +export type ProjectClientSide = + | "required" + | "optional" + | "unsupported" + | "unknown"; +export const ProjectClientSide = /*@__PURE__*/ S.String; + +/** Deprecated - use `environment` instead. */ +export type ProjectServerSide = + | "required" + | "optional" + | "unsupported" + | "unknown"; +export const ProjectServerSide = /*@__PURE__*/ S.String; + +/** Deprecated - A message that a moderator sent regarding the project */ +export interface ModeratorMessage { + /** The message that a moderator has left for the project */ + message?: string; + /** The longer body of the message that a moderator has left for the project */ + body?: string | null; +} +export const ModeratorMessage = /*@__PURE__*/ S.suspend(() => + S.Struct({ + message: S.optional(S.String), + body: S.optional(S.NullOr(S.String)), + }), +).annotate({ + identifier: "ModeratorMessage", +}) as any as S.Schema; + +export interface Project { + /** The ID of the project, encoded as a base62 string */ + id: string; + /** The ID of the team that has ownership of this project */ + team: string; + /** The title or name of the project */ + title: string; + /** A short sentence summarizing the project, no more than a sentence or two. */ + description: string; + /** A long form description of the project */ + body: string; + /** The status of the project */ + status: ProjectStatus; + /** The project type of the project */ + project_type: ProjectProjectType; + /** A list of the featured categories that the project has. */ + categories: ProjectCategoriesList; + /** A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again. */ + additional_categories: ProjectAdditionalCategoriesList; + /** All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system */ + environment: ProjectEnvironmentList; + /** A list of all of the game versions supported by the project */ + game_versions: ProjectGameVersionsList; + /** A list of all of the loaders supported by the project. These vary based on project type. */ + loaders: ProjectLoadersList; + /** A list of the version IDs of the project */ + versions: ProjectVersionsList; + license: ProjectLicense; + /** The date the project was created */ + published: string; + /** The date the latest version of the project was created */ + updated: string; + /** The total number of downloads of the project */ + downloads: number; + /** The total number of users following the project */ + followers: number; + /** A list of images that have been uploaded to the project's gallery */ + gallery: ProjectGalleryList; + /** The ID of the moderation thread associated with this project */ + thread_id: string; + monetization_status: ProjectMonetizationStatus; + /** The slug of a project, used for vanity URLs. Regex: ```^[\w!@$()`.+,"\-']{3,64}$``` */ + slug?: string | null; + /** The ID of the organization that owns this project */ + organization?: string | null; + /** The requested status when submitting for review or scheduling the project for release. Approved status refers to "Public" visibility. */ + requested_status?: ProjectRequestedStatus | null; + /** The date the project was first published */ + approved?: string | null; + /** The date the project's status was submitted to moderators for review */ + queued?: string | null; + /** The URL of the project's icon */ + icon_url?: string | null; + /** The URL of the project's icon without CDN transforms applied */ + raw_icon_url?: string | null; + /** The RGB color of the project, automatically generated from the project icon */ + color?: number | null; + /** 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. */ + discord_url?: string | null; + /** A list of donation links for the project */ + donation_urls?: ProjectDonationUrlsList | null; + /** Deprecated - use `environment` instead. */ + client_side: ProjectClientSide; + /** Deprecated - use `environment` instead. */ + server_side: ProjectServerSide; + /** Deprecated - The link to the long description of the project. Always null, only kept for legacy compatibility. */ + body_url?: string | null; + moderator_message?: ModeratorMessage | null; +} +export const Project = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + team: S.String, + title: S.String, + description: S.String, + body: S.String, + status: ProjectStatus, + project_type: ProjectProjectType, + categories: ProjectCategoriesList, + additional_categories: ProjectAdditionalCategoriesList, + environment: ProjectEnvironmentList, + game_versions: ProjectGameVersionsList, + loaders: ProjectLoadersList, + versions: ProjectVersionsList, + license: ProjectLicense, + published: S.String, + updated: S.String, + downloads: S.Number, + followers: S.Number, + gallery: ProjectGalleryList, + thread_id: S.String, + monetization_status: ProjectMonetizationStatus, + slug: S.optional(S.NullOr(S.String)), + organization: S.optional(S.NullOr(S.String)), + requested_status: S.optional(S.NullOr(ProjectRequestedStatus)), + approved: S.optional(S.NullOr(S.String)), + queued: S.optional(S.NullOr(S.String)), + icon_url: S.optional(S.NullOr(S.String)), + raw_icon_url: S.optional(S.NullOr(S.String)), + color: S.optional(S.NullOr(S.Number)), + issues_url: S.optional(S.NullOr(S.String)), + source_url: S.optional(S.NullOr(S.String)), + wiki_url: S.optional(S.NullOr(S.String)), + discord_url: S.optional(S.NullOr(S.String)), + donation_urls: S.optional(S.NullOr(ProjectDonationUrlsList)), + client_side: ProjectClientSide, + server_side: ProjectServerSide, + body_url: S.optional(S.NullOr(S.String)), + moderator_message: S.optional(S.NullOr(ModeratorMessage)), + }), +).annotate({ identifier: "Project" }) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type CreatableVersionDependenciesList = Array; +export const CreatableVersionDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type CreatableVersionGameVersionsList = Array; +export const CreatableVersionGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type CreatableVersionVersionType = "release" | "beta" | "alpha"; +export const CreatableVersionVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type CreatableVersionLoadersList = Array; +export const CreatableVersionLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type CreatableVersionStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const CreatableVersionStatus = /*@__PURE__*/ S.String; + +export type CreatableVersionRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const CreatableVersionRequestedStatus = /*@__PURE__*/ S.String; + +/** An array of the multipart field names of each file that goes with this version */ +export type CreatableVersionFilePartsList = Array; +export const CreatableVersionFilePartsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The environment a version supports. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system */ +export type EnvironmentInputEnum = + | "client_and_server" + | "client_only" + | "client_only_server_optional" + | "singleplayer_only" + | "server_only" + | "server_only_client_optional" + | "dedicated_server_only" + | "client_or_server" + | "client_or_server_prefers_both"; +export const EnvironmentInputEnum = /*@__PURE__*/ S.String; + +export type FileTypeEnum = + | "required-resource-pack" + | "optional-resource-pack" + | "sources-jar" + | "dev-jar" + | "javadoc-jar" + | "unknown" + | "signature"; +export const FileTypeEnum = /*@__PURE__*/ S.String; + +/** A map of file parts to their associated file type, a file type is used for additional files such as sources jars. */ +export type CreatableVersionFileTypesMap = { + [key: string]: FileTypeEnum | (string & {}) | undefined; +}; +export const CreatableVersionFileTypesMap = /*@__PURE__*/ S.Record( + S.String, + FileTypeEnum, +) as any as S.Schema; + +export interface CreatableVersion { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies: CreatableVersionDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: CreatableVersionGameVersionsList; + /** The release channel for this version */ + version_type: CreatableVersionVersionType | (string & {}); + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: CreatableVersionLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: CreatableVersionStatus | (string & {}); + requested_status?: CreatableVersionRequestedStatus | (string & {}) | null; + /** The ID of the project this version is for */ + project_id: string; + /** An array of the multipart field names of each file that goes with this version */ + file_parts: CreatableVersionFilePartsList; + /** The multipart field name of the primary file */ + primary_file?: string; + environment?: EnvironmentInputEnum | (string & {}); + /** A map of file parts to their associated file type, a file type is used for additional files such as sources jars. */ + file_types?: CreatableVersionFileTypesMap; +} +export const CreatableVersion = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: CreatableVersionDependenciesList, + game_versions: CreatableVersionGameVersionsList, + version_type: CreatableVersionVersionType, + loaders: CreatableVersionLoadersList, + featured: S.Boolean, + status: S.optional(CreatableVersionStatus), + requested_status: S.optional(S.NullOr(CreatableVersionRequestedStatus)), + project_id: S.String, + file_parts: CreatableVersionFilePartsList, + primary_file: S.optional(S.String), + environment: S.optional(EnvironmentInputEnum), + file_types: S.optional(CreatableVersionFileTypesMap), + }), +).annotate({ + identifier: "CreatableVersion", +}) as any as S.Schema; + +export interface CreateVersionRequest { + data: CreatableVersion; +} +export const CreateVersionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + data: CreatableVersion, + }).pipe( + T.Http({ + method: "POST", + uri: "/version", + code: 200, + contentType: "multipart", + }), + ), +).annotate({ + identifier: "CreateVersionRequest", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type CreateVersionResponseDependenciesList = Array; +export const CreateVersionResponseDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type CreateVersionResponseGameVersionsList = Array; +export const CreateVersionResponseGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type CreateVersionResponseVersionType = "release" | "beta" | "alpha"; +export const CreateVersionResponseVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type CreateVersionResponseLoadersList = Array; +export const CreateVersionResponseLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type CreateVersionResponseStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const CreateVersionResponseStatus = /*@__PURE__*/ S.String; + +export type CreateVersionResponseRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const CreateVersionResponseRequestedStatus = /*@__PURE__*/ S.String; + +/** A map of hashes of the file. The key is the hashing algorithm and the value is the string version of the hash. */ +export interface VersionFileHashes { + sha512?: string; + sha1?: string; +} +export const VersionFileHashes = /*@__PURE__*/ S.suspend(() => + S.Struct({ + sha512: S.optional(S.String), + sha1: S.optional(S.String), + }), +).annotate({ + identifier: "VersionFileHashes", +}) as any as S.Schema; + +export interface VersionFile { + hashes: VersionFileHashes; + /** A direct link to the file */ + url: string; + /** The name of the file */ + filename: string; + /** Whether this file is the primary one for its version. Only a maximum of one file per version will have this set to true. If there are not any primary files, it can be inferred that the first file is the primary one. */ + primary: boolean; + /** The size of the file in bytes */ + size: number; + file_type?: unknown; +} +export const VersionFile = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hashes: VersionFileHashes, + url: S.String, + filename: S.String, + primary: S.Boolean, + size: S.Number, + file_type: S.optional(S.Unknown), + }), +).annotate({ identifier: "VersionFile" }) as any as S.Schema; + +/** A list of files available for download for this version */ +export type CreateVersionResponseFilesList = Array; +export const CreateVersionResponseFilesList = /*@__PURE__*/ S.Array( + VersionFile, +) as any as S.Schema; + +export interface CreateVersionResponse { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: CreateVersionResponseDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: CreateVersionResponseGameVersionsList; + /** The release channel for this version */ + version_type: CreateVersionResponseVersionType; + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: CreateVersionResponseLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: CreateVersionResponseStatus; + requested_status?: CreateVersionResponseRequestedStatus | null; + /** The ID of the version, encoded as a base62 string */ + id: string; + /** The ID of the project this version is for */ + project_id: string; + /** The ID of the author who published this version */ + author_id: string; + date_published: string; + /** The number of times this version has been downloaded */ + downloads: number; + /** A link to the changelog for this version. Always null, only kept for legacy compatibility. */ + changelog_url?: string | null; + environment: EnvironmentEnum; + /** A list of files available for download for this version */ + files: CreateVersionResponseFilesList; +} +export const CreateVersionResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(CreateVersionResponseDependenciesList), + game_versions: CreateVersionResponseGameVersionsList, + version_type: CreateVersionResponseVersionType, + loaders: CreateVersionResponseLoadersList, + featured: S.Boolean, + status: S.optional(CreateVersionResponseStatus), + requested_status: S.optional( + S.NullOr(CreateVersionResponseRequestedStatus), + ), + id: S.String, + project_id: S.String, + author_id: S.String, + date_published: S.String, + downloads: S.Number, + changelog_url: S.optional(S.NullOr(S.String)), + environment: EnvironmentEnum, + files: CreateVersionResponseFilesList, + }), +).annotate({ + identifier: "CreateVersionResponse", +}) as any as S.Schema; + +export type DeleteFileFromHashRequestAlgorithm = "sha1" | "sha512"; +export const DeleteFileFromHashRequestAlgorithm = /*@__PURE__*/ S.String; + +export interface DeleteFileFromHashRequest { + /** The hash of the file, considering its byte content, and encoded in hexadecimal */ + hash: string; + /** The algorithm of the hash */ + algorithm: DeleteFileFromHashRequestAlgorithm | (string & {}); + /** Version ID to delete the version from, if multiple files of the same hash exist */ + version_id?: string; +} +export const DeleteFileFromHashRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hash: S.String.pipe(T.Label()), + algorithm: DeleteFileFromHashRequestAlgorithm.pipe(T.Query()), + version_id: S.optional(S.String.pipe(T.Query())), + }).pipe(T.Http({ method: "DELETE", uri: "/version_file/{hash}", code: 200 })), +).annotate({ + identifier: "DeleteFileFromHashRequest", +}) as any as S.Schema; + +export interface DeleteFileFromHashResponse {} +export const DeleteFileFromHashResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteFileFromHashResponse", +}) as any as S.Schema; + +export interface DeleteGalleryImageRequest { + /** The ID or slug of the project */ + id_slug: string; + /** URL link of the image to delete */ + url: string; +} +export const DeleteGalleryImageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + url: S.String.pipe(T.Query()), + }).pipe( + T.Http({ method: "DELETE", uri: "/project/{id_slug}/gallery", code: 200 }), + ), +).annotate({ + identifier: "DeleteGalleryImageRequest", +}) as any as S.Schema; + +export interface DeleteGalleryImageResponse {} +export const DeleteGalleryImageResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteGalleryImageResponse", +}) as any as S.Schema; + +export interface DeleteNotificationRequest { + /** The ID of the notification */ + id: string; +} +export const DeleteNotificationRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "DELETE", uri: "/notification/{id}", code: 200 })), +).annotate({ + identifier: "DeleteNotificationRequest", +}) as any as S.Schema; + +export interface DeleteNotificationResponse {} +export const DeleteNotificationResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteNotificationResponse", +}) as any as S.Schema; + +export interface DeleteNotificationsRequest { + /** The IDs of the notifications */ + ids: string; +} +export const DeleteNotificationsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "DELETE", uri: "/notifications", code: 200 })), +).annotate({ + identifier: "DeleteNotificationsRequest", +}) as any as S.Schema; + +export interface DeleteNotificationsResponse {} +export const DeleteNotificationsResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteNotificationsResponse", +}) as any as S.Schema; + +export interface DeleteProjectRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const DeleteProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "DELETE", uri: "/project/{id_slug}", code: 200 })), +).annotate({ + identifier: "DeleteProjectRequest", +}) as any as S.Schema; + +export interface DeleteProjectResponse {} +export const DeleteProjectResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteProjectResponse", +}) as any as S.Schema; + +export interface DeleteProjectIconRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const DeleteProjectIconRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "DELETE", uri: "/project/{id_slug}/icon", code: 200 }), + ), +).annotate({ + identifier: "DeleteProjectIconRequest", +}) as any as S.Schema; + +export interface DeleteProjectIconResponse {} +export const DeleteProjectIconResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteProjectIconResponse", +}) as any as S.Schema; + +export interface DeleteTeamMemberRequest { + /** The ID of the team */ + id: string; + /** The ID or username of the user */ + id_username: string; +} +export const DeleteTeamMemberRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ + method: "DELETE", + uri: "/team/{id}/members/{id_username}", + code: 200, + }), + ), +).annotate({ + identifier: "DeleteTeamMemberRequest", +}) as any as S.Schema; + +export interface DeleteTeamMemberResponse {} +export const DeleteTeamMemberResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteTeamMemberResponse", +}) as any as S.Schema; + +export interface DeleteThreadMessageRequest { + /** The ID of the message */ + id: string; +} +export const DeleteThreadMessageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "DELETE", uri: "/message/{id}", code: 200 })), +).annotate({ + identifier: "DeleteThreadMessageRequest", +}) as any as S.Schema; + +export interface DeleteThreadMessageResponse {} +export const DeleteThreadMessageResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteThreadMessageResponse", +}) as any as S.Schema; + +export interface DeleteUserIconRequest { + /** The ID or username of the user */ + id_username: string; +} +export const DeleteUserIconRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "DELETE", uri: "/user/{id_username}/icon", code: 200 }), + ), +).annotate({ + identifier: "DeleteUserIconRequest", +}) as any as S.Schema; + +export interface DeleteUserIconResponse {} +export const DeleteUserIconResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteUserIconResponse", +}) as any as S.Schema; + +export interface DeleteVersionRequest { + /** The ID of the version */ + id: string; +} +export const DeleteVersionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "DELETE", uri: "/version/{id}", code: 200 })), +).annotate({ + identifier: "DeleteVersionRequest", +}) as any as S.Schema; + +export interface DeleteVersionResponse {} +export const DeleteVersionResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "DeleteVersionResponse", +}) as any as S.Schema; + +export interface DonationPlatformListRequest {} +export const DonationPlatformListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe( + T.Http({ method: "GET", uri: "/tag/donation_platform", code: 200 }), + ), +).annotate({ + identifier: "DonationPlatformListRequest", +}) as any as S.Schema; + +export interface DonationPlatformTag { + /** The short identifier of the donation platform */ + short: string; + /** The full name of the donation platform */ + name: string; +} +export const DonationPlatformTag = /*@__PURE__*/ S.suspend(() => + S.Struct({ + short: S.String, + name: S.String, + }), +).annotate({ + identifier: "DonationPlatformTag", +}) as any as S.Schema; + +export type DonationPlatformListResponseBodyList = Array; +export const DonationPlatformListResponseBodyList = /*@__PURE__*/ S.Array( + DonationPlatformTag, +) as any as S.Schema; + +export type DonationPlatformListResponse = DonationPlatformListResponseBodyList; +export const DonationPlatformListResponse = /*@__PURE__*/ S.suspend(() => + DonationPlatformListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "DonationPlatformListResponse", +}) as any as S.Schema; + +export interface FollowProjectRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const FollowProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "POST", uri: "/project/{id_slug}/follow", code: 200 }), + ), +).annotate({ + identifier: "FollowProjectRequest", +}) as any as S.Schema; + +export interface FollowProjectResponse {} +export const FollowProjectResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "FollowProjectResponse", +}) as any as S.Schema; + +export type ForgeUpdatesRequestNeoforge = "only" | "include"; +export const ForgeUpdatesRequestNeoforge = /*@__PURE__*/ S.String; + +export interface ForgeUpdatesRequest { + /** The ID or slug of the project */ + id_slug: string; + /** Whether to include NeoForge versions. Can be `only` (NeoForge-only versions), `include` (both Forge and NeoForge versions), or omitted (Forge-only versions). */ + neoforge?: ForgeUpdatesRequestNeoforge | (string & {}); +} +export const ForgeUpdatesRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + neoforge: S.optional(ForgeUpdatesRequestNeoforge.pipe(T.Query())), + }).pipe( + T.Http({ + method: "GET", + uri: "/updates/{id_slug}/forge_updates.json", + code: 200, + }), + ), +).annotate({ + identifier: "ForgeUpdatesRequest", +}) as any as S.Schema; + +/** A list of the recommended and latest versions for each Minecraft release */ +export interface ForgeUpdateCheckerPromos { + /** The mod version that is recommended for `{version}`. Excludes versions with the `alpha` and `beta` version types. */ + _version__recommended?: string; + /** The latest mod version for `{version}`. Shows versions with the `alpha` and `beta` version types. */ + _version__latest?: string; +} +export const ForgeUpdateCheckerPromos = /*@__PURE__*/ S.suspend(() => + S.Struct({ + _version__recommended: S.optional( + S.String.pipe(T.Body("{version}-recommended")), + ), + _version__latest: S.optional(S.String.pipe(T.Body("{version}-latest"))), + }), +).annotate({ + identifier: "ForgeUpdateCheckerPromos", +}) as any as S.Schema; + +/** Mod version information that can be consumed by Forge's update checker */ +export interface ForgeUpdates { + /** A link to the mod page */ + homepage?: string; + promos?: ForgeUpdateCheckerPromos; +} +export const ForgeUpdates = /*@__PURE__*/ S.suspend(() => + S.Struct({ + homepage: S.optional(S.String), + promos: S.optional(ForgeUpdateCheckerPromos), + }), +).annotate({ identifier: "ForgeUpdates" }) as any as S.Schema; + +export interface GetDependenciesRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const GetDependenciesRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe( + T.Http({ + method: "GET", + uri: "/project/{id_slug}/dependencies", + code: 200, + }), + ), +).annotate({ + identifier: "GetDependenciesRequest", +}) as any as S.Schema; + +/** Projects that the project depends upon */ +export type ProjectDependencyListProjectsList = Array; +export const ProjectDependencyListProjectsList = /*@__PURE__*/ S.Array( + Project, +) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type VersionDependenciesList = Array; +export const VersionDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type VersionGameVersionsList = Array; +export const VersionGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type VersionVersionType = "release" | "beta" | "alpha"; +export const VersionVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type VersionLoadersList = Array; +export const VersionLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type VersionStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const VersionStatus = /*@__PURE__*/ S.String; + +export type VersionRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const VersionRequestedStatus = /*@__PURE__*/ S.String; + +/** A list of files available for download for this version */ +export type VersionFilesList = Array; +export const VersionFilesList = /*@__PURE__*/ S.Array( + VersionFile, +) as any as S.Schema; + +export interface Version { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: VersionDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: VersionGameVersionsList; + /** The release channel for this version */ + version_type: VersionVersionType; + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: VersionLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: VersionStatus; + requested_status?: VersionRequestedStatus | null; + /** The ID of the version, encoded as a base62 string */ + id: string; + /** The ID of the project this version is for */ + project_id: string; + /** The ID of the author who published this version */ + author_id: string; + date_published: string; + /** The number of times this version has been downloaded */ + downloads: number; + /** A link to the changelog for this version. Always null, only kept for legacy compatibility. */ + changelog_url?: string | null; + environment: EnvironmentEnum; + /** A list of files available for download for this version */ + files: VersionFilesList; +} +export const Version = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(VersionDependenciesList), + game_versions: VersionGameVersionsList, + version_type: VersionVersionType, + loaders: VersionLoadersList, + featured: S.Boolean, + status: S.optional(VersionStatus), + requested_status: S.optional(S.NullOr(VersionRequestedStatus)), + id: S.String, + project_id: S.String, + author_id: S.String, + date_published: S.String, + downloads: S.Number, + changelog_url: S.optional(S.NullOr(S.String)), + environment: EnvironmentEnum, + files: VersionFilesList, + }), +).annotate({ identifier: "Version" }) as any as S.Schema; + +/** Versions that the project depends upon */ +export type ProjectDependencyListVersionsList = Array; +export const ProjectDependencyListVersionsList = /*@__PURE__*/ S.Array( + Version, +) as any as S.Schema; + +export interface ProjectDependencyList { + /** Projects that the project depends upon */ + projects?: ProjectDependencyListProjectsList; + /** Versions that the project depends upon */ + versions?: ProjectDependencyListVersionsList; +} +export const ProjectDependencyList = /*@__PURE__*/ S.suspend(() => + S.Struct({ + projects: S.optional(ProjectDependencyListProjectsList), + versions: S.optional(ProjectDependencyListVersionsList), + }), +).annotate({ + identifier: "ProjectDependencyList", +}) as any as S.Schema; + +export interface GetFollowedProjectsRequest { + /** The ID or username of the user */ + id_username: string; +} +export const GetFollowedProjectsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "GET", uri: "/user/{id_username}/follows", code: 200 }), + ), +).annotate({ + identifier: "GetFollowedProjectsRequest", +}) as any as S.Schema; + +export type GetFollowedProjectsResponseBodyList = Array; +export const GetFollowedProjectsResponseBodyList = /*@__PURE__*/ S.Array( + Project, +) as any as S.Schema; + +export type GetFollowedProjectsResponse = GetFollowedProjectsResponseBodyList; +export const GetFollowedProjectsResponse = /*@__PURE__*/ S.suspend(() => + GetFollowedProjectsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetFollowedProjectsResponse", +}) as any as S.Schema; + +export type GetLatestVersionFromHashRequestAlgorithm = "sha1" | "sha512"; +export const GetLatestVersionFromHashRequestAlgorithm = /*@__PURE__*/ S.String; + +export type GetLatestVersionFromHashRequestLoadersList = Array; +export const GetLatestVersionFromHashRequestLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type GetLatestVersionFromHashRequestGameVersionsList = Array; +export const GetLatestVersionFromHashRequestGameVersionsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export type GetLatestVersionFromHashRequestVersionTypes = + | "release" + | "alpha" + | "beta"; +export const GetLatestVersionFromHashRequestVersionTypes = + /*@__PURE__*/ S.String; + +export interface GetLatestVersionFromHashRequest { + /** The hash of the file, considering its byte content, and encoded in hexadecimal */ + hash: string; + /** The algorithm of the hash */ + algorithm: GetLatestVersionFromHashRequestAlgorithm | (string & {}); + loaders: GetLatestVersionFromHashRequestLoadersList; + game_versions: GetLatestVersionFromHashRequestGameVersionsList; + version_types?: GetLatestVersionFromHashRequestVersionTypes | (string & {}); +} +export const GetLatestVersionFromHashRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hash: S.String.pipe(T.Label()), + algorithm: GetLatestVersionFromHashRequestAlgorithm.pipe(T.Query()), + loaders: GetLatestVersionFromHashRequestLoadersList, + game_versions: GetLatestVersionFromHashRequestGameVersionsList, + version_types: S.optional(GetLatestVersionFromHashRequestVersionTypes), + }).pipe( + T.Http({ method: "POST", uri: "/version_file/{hash}/update", code: 200 }), + ), +).annotate({ + identifier: "GetLatestVersionFromHashRequest", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type GetLatestVersionFromHashResponseDependenciesList = + Array; +export const GetLatestVersionFromHashResponseDependenciesList = + /*@__PURE__*/ S.Array( + VersionDependency, + ) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type GetLatestVersionFromHashResponseGameVersionsList = Array; +export const GetLatestVersionFromHashResponseGameVersionsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +/** The release channel for this version */ +export type GetLatestVersionFromHashResponseVersionType = + | "release" + | "beta" + | "alpha"; +export const GetLatestVersionFromHashResponseVersionType = + /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type GetLatestVersionFromHashResponseLoadersList = Array; +export const GetLatestVersionFromHashResponseLoadersList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export type GetLatestVersionFromHashResponseStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const GetLatestVersionFromHashResponseStatus = /*@__PURE__*/ S.String; + +export type GetLatestVersionFromHashResponseRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const GetLatestVersionFromHashResponseRequestedStatus = + /*@__PURE__*/ S.String; + +/** A list of files available for download for this version */ +export type GetLatestVersionFromHashResponseFilesList = Array; +export const GetLatestVersionFromHashResponseFilesList = /*@__PURE__*/ S.Array( + VersionFile, +) as any as S.Schema; + +export interface GetLatestVersionFromHashResponse { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: GetLatestVersionFromHashResponseDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: GetLatestVersionFromHashResponseGameVersionsList; + /** The release channel for this version */ + version_type: GetLatestVersionFromHashResponseVersionType; + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: GetLatestVersionFromHashResponseLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: GetLatestVersionFromHashResponseStatus; + requested_status?: GetLatestVersionFromHashResponseRequestedStatus | null; + /** The ID of the version, encoded as a base62 string */ + id: string; + /** The ID of the project this version is for */ + project_id: string; + /** The ID of the author who published this version */ + author_id: string; + date_published: string; + /** The number of times this version has been downloaded */ + downloads: number; + /** A link to the changelog for this version. Always null, only kept for legacy compatibility. */ + changelog_url?: string | null; + environment: EnvironmentEnum; + /** A list of files available for download for this version */ + files: GetLatestVersionFromHashResponseFilesList; +} +export const GetLatestVersionFromHashResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(GetLatestVersionFromHashResponseDependenciesList), + game_versions: GetLatestVersionFromHashResponseGameVersionsList, + version_type: GetLatestVersionFromHashResponseVersionType, + loaders: GetLatestVersionFromHashResponseLoadersList, + featured: S.Boolean, + status: S.optional(GetLatestVersionFromHashResponseStatus), + requested_status: S.optional( + S.NullOr(GetLatestVersionFromHashResponseRequestedStatus), + ), + id: S.String, + project_id: S.String, + author_id: S.String, + date_published: S.String, + downloads: S.Number, + changelog_url: S.optional(S.NullOr(S.String)), + environment: EnvironmentEnum, + files: GetLatestVersionFromHashResponseFilesList, + }), +).annotate({ + identifier: "GetLatestVersionFromHashResponse", +}) as any as S.Schema; + +export type GetLatestVersionsFromHashesRequestHashesList = Array; +export const GetLatestVersionsFromHashesRequestHashesList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export type GetLatestVersionsFromHashesRequestAlgorithm = "sha1" | "sha512"; +export const GetLatestVersionsFromHashesRequestAlgorithm = + /*@__PURE__*/ S.String; + +export type GetLatestVersionsFromHashesRequestLoadersList = Array; +export const GetLatestVersionsFromHashesRequestLoadersList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export type GetLatestVersionsFromHashesRequestGameVersionsList = Array; +export const GetLatestVersionsFromHashesRequestGameVersionsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export type GetLatestVersionsFromHashesRequestVersionTypes = + | "release" + | "alpha" + | "beta"; +export const GetLatestVersionsFromHashesRequestVersionTypes = + /*@__PURE__*/ S.String; + +export interface GetLatestVersionsFromHashesRequest { + hashes: GetLatestVersionsFromHashesRequestHashesList; + algorithm: GetLatestVersionsFromHashesRequestAlgorithm | (string & {}); + loaders: GetLatestVersionsFromHashesRequestLoadersList; + game_versions: GetLatestVersionsFromHashesRequestGameVersionsList; + version_types?: + | GetLatestVersionsFromHashesRequestVersionTypes + | (string & {}); +} +export const GetLatestVersionsFromHashesRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hashes: GetLatestVersionsFromHashesRequestHashesList, + algorithm: GetLatestVersionsFromHashesRequestAlgorithm, + loaders: GetLatestVersionsFromHashesRequestLoadersList, + game_versions: GetLatestVersionsFromHashesRequestGameVersionsList, + version_types: S.optional(GetLatestVersionsFromHashesRequestVersionTypes), + }).pipe(T.Http({ method: "POST", uri: "/version_files/update", code: 200 })), +).annotate({ + identifier: "GetLatestVersionsFromHashesRequest", +}) as any as S.Schema; + +/** A map from hashes to versions */ +export type HashVersionMap = { [key: string]: Version | undefined }; +export const HashVersionMap = /*@__PURE__*/ S.Record( + S.String, + Version, +) as any as S.Schema; + +export type GetLatestVersionsFromHashesResponse = HashVersionMap; +export const GetLatestVersionsFromHashesResponse = /*@__PURE__*/ S.suspend(() => + HashVersionMap.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetLatestVersionsFromHashesResponse", +}) as any as S.Schema; + +export interface GetNotificationRequest { + /** The ID of the notification */ + id: string; +} +export const GetNotificationRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/notification/{id}", code: 200 })), +).annotate({ + identifier: "GetNotificationRequest", +}) as any as S.Schema; + +/** The type of notification */ +export type NotificationType = + | "project_update" + | "team_invite" + | "status_change" + | "moderator_message"; +export const NotificationType = /*@__PURE__*/ S.String; + +/** The HTTP code and path to request in order to perform this action. */ +export type NotificationActionActionRouteList = Array; +export const NotificationActionActionRouteList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** An action that can be performed on a notification */ +export interface NotificationAction { + /** The friendly name for this action */ + title?: string; + /** The HTTP code and path to request in order to perform this action. */ + action_route?: NotificationActionActionRouteList; +} +export const NotificationAction = /*@__PURE__*/ S.suspend(() => + S.Struct({ + title: S.optional(S.String), + action_route: S.optional(NotificationActionActionRouteList), + }), +).annotate({ + identifier: "NotificationAction", +}) as any as S.Schema; + +/** A list of actions that can be performed */ +export type NotificationActionsList = Array; +export const NotificationActionsList = /*@__PURE__*/ S.Array( + NotificationAction, +) as any as S.Schema; + +export interface Notification { + /** The id of the notification */ + id: string; + /** The id of the user who received the notification */ + user_id: string; + /** The type of notification */ + type?: NotificationType | null; + /** The title of the notification */ + title: string; + /** The body text of the notification */ + text: string; + /** A link to the related project or version */ + link: string; + /** Whether the notification has been read or not */ + read: boolean; + /** The time at which the notification was created */ + created: string; + /** A list of actions that can be performed */ + actions: NotificationActionsList; +} +export const Notification = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + user_id: S.String, + type: S.optional(S.NullOr(NotificationType)), + title: S.String, + text: S.String, + link: S.String, + read: S.Boolean, + created: S.String, + actions: NotificationActionsList, + }), +).annotate({ identifier: "Notification" }) as any as S.Schema; + +export interface GetNotificationsRequest { + /** The IDs of the notifications */ + ids: string; +} +export const GetNotificationsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/notifications", code: 200 })), +).annotate({ + identifier: "GetNotificationsRequest", +}) as any as S.Schema; + +export type GetNotificationsResponseBodyList = Array; +export const GetNotificationsResponseBodyList = /*@__PURE__*/ S.Array( + Notification, +) as any as S.Schema; + +export type GetNotificationsResponse = GetNotificationsResponseBodyList; +export const GetNotificationsResponse = /*@__PURE__*/ S.suspend(() => + GetNotificationsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetNotificationsResponse", +}) as any as S.Schema; + +export interface GetOpenReportsRequest { + count?: number; +} +export const GetOpenReportsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + count: S.optional(S.Number.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/report", code: 200 })), +).annotate({ + identifier: "GetOpenReportsRequest", +}) as any as S.Schema; + +/** The type of the item being reported */ +export type ReportItemType = "project" | "user" | "version"; +export const ReportItemType = /*@__PURE__*/ S.String; + +export interface Report { + /** The type of the report being sent */ + report_type: string; + /** The ID of the item (project, version, or user) being reported */ + item_id: string; + /** The type of the item being reported */ + item_type: ReportItemType; + /** The extended explanation of the report */ + body: string; + /** The ID of the report */ + id?: string; + /** The ID of the user who reported the item */ + reporter: string; + /** The time at which the report was created */ + created: string; + /** Whether the report is resolved */ + closed: boolean; + /** The ID of the moderation thread associated with this report */ + thread_id: string; +} +export const Report = /*@__PURE__*/ S.suspend(() => + S.Struct({ + report_type: S.String, + item_id: S.String, + item_type: ReportItemType, + body: S.String, + id: S.optional(S.String), + reporter: S.String, + created: S.String, + closed: S.Boolean, + thread_id: S.String, + }), +).annotate({ identifier: "Report" }) as any as S.Schema; + +export type GetOpenReportsResponseBodyList = Array; +export const GetOpenReportsResponseBodyList = /*@__PURE__*/ S.Array( + Report, +) as any as S.Schema; + +export type GetOpenReportsResponse = GetOpenReportsResponseBodyList; +export const GetOpenReportsResponse = /*@__PURE__*/ S.suspend(() => + GetOpenReportsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetOpenReportsResponse", +}) as any as S.Schema; + +export interface GetPayoutHistoryRequest { + /** The ID or username of the user */ + id_username: string; +} +export const GetPayoutHistoryRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "GET", uri: "/user/{id_username}/payouts", code: 200 }), + ), +).annotate({ + identifier: "GetPayoutHistoryRequest", +}) as any as S.Schema; + +export interface UserPayoutHistoryEntry { + /** The date of this transaction */ + created?: string; + /** The amount of this transaction in USD */ + amount?: number; + /** The status of this transaction */ + status?: string; +} +export const UserPayoutHistoryEntry = /*@__PURE__*/ S.suspend(() => + S.Struct({ + created: S.optional(S.String), + amount: S.optional(S.Number), + status: S.optional(S.String), + }), +).annotate({ + identifier: "UserPayoutHistoryEntry", +}) as any as S.Schema; + +/** A history of all of the user's past transactions */ +export type UserPayoutHistoryPayoutsList = Array; +export const UserPayoutHistoryPayoutsList = /*@__PURE__*/ S.Array( + UserPayoutHistoryEntry, +) as any as S.Schema; + +export interface UserPayoutHistory { + /** The all-time balance accrued by this user in USD */ + all_time?: string; + /** The amount in USD made by the user in the previous 30 days */ + last_month?: string; + /** A history of all of the user's past transactions */ + payouts?: UserPayoutHistoryPayoutsList; +} +export const UserPayoutHistory = /*@__PURE__*/ S.suspend(() => + S.Struct({ + all_time: S.optional(S.String), + last_month: S.optional(S.String), + payouts: S.optional(UserPayoutHistoryPayoutsList), + }), +).annotate({ + identifier: "UserPayoutHistory", +}) as any as S.Schema; + +export interface GetProjectRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const GetProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/project/{id_slug}", code: 200 })), +).annotate({ + identifier: "GetProjectRequest", +}) as any as S.Schema; + +export interface GetProjectsRequest { + /** The IDs and/or slugs of the projects */ + ids: string; +} +export const GetProjectsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/projects", code: 200 })), +).annotate({ + identifier: "GetProjectsRequest", +}) as any as S.Schema; + +export type GetProjectsResponseBodyList = Array; +export const GetProjectsResponseBodyList = /*@__PURE__*/ S.Array( + Project, +) as any as S.Schema; + +export type GetProjectsResponse = GetProjectsResponseBodyList; +export const GetProjectsResponse = /*@__PURE__*/ S.suspend(() => + GetProjectsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetProjectsResponse", +}) as any as S.Schema; + +export interface GetProjectTeamMembersRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const GetProjectTeamMembersRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "GET", uri: "/project/{id_slug}/members", code: 200 }), + ), +).annotate({ + identifier: "GetProjectTeamMembersRequest", +}) as any as S.Schema; + +/** The wallet that the user has selected */ +export type UserPayoutDataPayoutWallet = "paypal" | "venmo"; +export const UserPayoutDataPayoutWallet = /*@__PURE__*/ S.String; + +/** The type of the user's wallet */ +export type UserPayoutDataPayoutWalletType = "email" | "phone" | "user_handle"; +export const UserPayoutDataPayoutWalletType = /*@__PURE__*/ S.String; + +/** Various data relating to the user's payouts status (you can only see your own) */ +export interface UserPayoutData { + /** The payout balance available for the user to withdraw (note, you cannot modify this in a PATCH request) */ + balance?: number; + /** The wallet that the user has selected */ + payout_wallet?: UserPayoutDataPayoutWallet | (string & {}); + /** The type of the user's wallet */ + payout_wallet_type?: UserPayoutDataPayoutWalletType | (string & {}); + /** The user's payout address */ + payout_address?: string; +} +export const UserPayoutData = /*@__PURE__*/ S.suspend(() => + S.Struct({ + balance: S.optional(S.Number), + payout_wallet: S.optional(UserPayoutDataPayoutWallet), + payout_wallet_type: S.optional(UserPayoutDataPayoutWalletType), + payout_address: S.optional(S.String), + }), +).annotate({ identifier: "UserPayoutData" }) as any as S.Schema; + +/** The user's role */ +export type UserRole = "admin" | "moderator" | "developer"; +export const UserRole = /*@__PURE__*/ S.String; + +/** A list of authentication providers you have signed up for (only displayed if requesting your own account) */ +export type UserAuthProvidersList = Array; +export const UserAuthProvidersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface User { + /** The user's username */ + username: string; + /** The user's display name */ + name?: string | null; + /** The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope. */ + email?: string | null; + /** A description of the user */ + bio?: string; + payout_data?: UserPayoutData | null; + /** The user's ID */ + id: string; + /** The user's avatar url */ + avatar_url: string; + /** The time at which the user was created */ + created: string; + /** The user's role */ + role: UserRole; + /** Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change In order from first to seventh bit, the current bits are: - (unused) - EARLY_MODPACK_ADOPTER - EARLY_RESPACK_ADOPTER - EARLY_PLUGIN_ADOPTER - ALPHA_TESTER - CONTRIBUTOR - TRANSLATOR */ + badges?: number; + /** A list of authentication providers you have signed up for (only displayed if requesting your own account) */ + auth_providers?: UserAuthProvidersList | null; + /** Whether your email is verified (only displayed if requesting your own account) */ + email_verified?: boolean | null; + /** Whether you have a password associated with your account (only displayed if requesting your own account) */ + has_password?: boolean | null; + /** Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account) */ + has_totp?: boolean | null; + /** Deprecated - this is no longer public for security reasons and is always null */ + github_id?: number | null; +} +export const User = /*@__PURE__*/ S.suspend(() => + S.Struct({ + username: S.String, + name: S.optional(S.NullOr(S.String)), + email: S.optional(S.NullOr(S.String)), + bio: S.optional(S.String), + payout_data: S.optional(S.NullOr(UserPayoutData)), + id: S.String, + avatar_url: S.String, + created: S.String, + role: UserRole, + badges: S.optional(S.Number), + auth_providers: S.optional(S.NullOr(UserAuthProvidersList)), + email_verified: S.optional(S.NullOr(S.Boolean)), + has_password: S.optional(S.NullOr(S.Boolean)), + has_totp: S.optional(S.NullOr(S.Boolean)), + github_id: S.optional(S.NullOr(S.Number)), + }), +).annotate({ identifier: "User" }) as any as S.Schema; + +export interface TeamMember { + /** The ID of the team this team member is a member of */ + team_id: string; + user: User; + /** The user's role on the team */ + role: string; + /** The user's permissions in bitfield format (requires authorization to view) In order from first to tenth bit, the bits are: - UPLOAD_VERSION - DELETE_VERSION - EDIT_DETAILS - EDIT_BODY - MANAGE_INVITES - REMOVE_MEMBER - EDIT_MEMBER - DELETE_PROJECT - VIEW_ANALYTICS - VIEW_PAYOUTS */ + permissions?: number; + /** Whether or not the user has accepted to be on the team (requires authorization to view) */ + accepted: boolean; + /** The split of payouts going to this user. The proportion of payouts they get is their split divided by the sum of the splits of all members. */ + payouts_split?: number; + /** The order of the team member. */ + ordering?: number; +} +export const TeamMember = /*@__PURE__*/ S.suspend(() => + S.Struct({ + team_id: S.String, + user: User, + role: S.String, + permissions: S.optional(S.Number), + accepted: S.Boolean, + payouts_split: S.optional(S.Number), + ordering: S.optional(S.Number), + }), +).annotate({ identifier: "TeamMember" }) as any as S.Schema; + +/** An array of team members */ +export type GetProjectTeamMembersResponseBodyList = Array; +export const GetProjectTeamMembersResponseBodyList = /*@__PURE__*/ S.Array( + TeamMember, +) as any as S.Schema; + +export type GetProjectTeamMembersResponse = + GetProjectTeamMembersResponseBodyList; +export const GetProjectTeamMembersResponse = /*@__PURE__*/ S.suspend(() => + GetProjectTeamMembersResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetProjectTeamMembersResponse", +}) as any as S.Schema; + +export interface GetProjectVersionsRequest { + /** The ID or slug of the project */ + id_slug: string; + /** The types of loaders to filter for */ + loaders?: string; + /** The game versions to filter for */ + game_versions?: string; + /** Allows to filter for featured or non-featured versions only */ + featured?: boolean; + /** Allows you to toggle the inclusion of the changelog field in the response. It is highly recommended to use include_changelog=false in most cases unless you specifically need the changelog for all versions. */ + include_changelog?: boolean; +} +export const GetProjectVersionsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + loaders: S.optional(S.String.pipe(T.Query())), + game_versions: S.optional(S.String.pipe(T.Query())), + featured: S.optional(S.Boolean.pipe(T.Query())), + include_changelog: S.optional(S.Boolean.pipe(T.Query())), + }).pipe( + T.Http({ method: "GET", uri: "/project/{id_slug}/version", code: 200 }), + ), +).annotate({ + identifier: "GetProjectVersionsRequest", +}) as any as S.Schema; + +export type GetProjectVersionsResponseBodyList = Array; +export const GetProjectVersionsResponseBodyList = /*@__PURE__*/ S.Array( + Version, +) as any as S.Schema; + +export type GetProjectVersionsResponse = GetProjectVersionsResponseBodyList; +export const GetProjectVersionsResponse = /*@__PURE__*/ S.suspend(() => + GetProjectVersionsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetProjectVersionsResponse", +}) as any as S.Schema; + +export interface GetReportRequest { + /** The ID of the report */ + id: string; +} +export const GetReportRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/report/{id}", code: 200 })), +).annotate({ + identifier: "GetReportRequest", +}) as any as S.Schema; + +/** The type of the item being reported */ +export type GetReportResponseItemType = "project" | "user" | "version"; +export const GetReportResponseItemType = /*@__PURE__*/ S.String; + +export interface GetReportResponse { + /** The type of the report being sent */ + report_type: string; + /** The ID of the item (project, version, or user) being reported */ + item_id: string; + /** The type of the item being reported */ + item_type: GetReportResponseItemType; + /** The extended explanation of the report */ + body: string; + /** The ID of the report */ + id?: string; + /** The ID of the user who reported the item */ + reporter: string; + /** The time at which the report was created */ + created: string; + /** Whether the report is resolved */ + closed: boolean; + /** The ID of the moderation thread associated with this report */ + thread_id: string; +} +export const GetReportResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + report_type: S.String, + item_id: S.String, + item_type: GetReportResponseItemType, + body: S.String, + id: S.optional(S.String), + reporter: S.String, + created: S.String, + closed: S.Boolean, + thread_id: S.String, + }), +).annotate({ + identifier: "GetReportResponse", +}) as any as S.Schema; + +export interface GetReportsRequest { + /** The IDs of the reports */ + ids: string; +} +export const GetReportsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/reports", code: 200 })), +).annotate({ + identifier: "GetReportsRequest", +}) as any as S.Schema; + +export type GetReportsResponseBodyList = Array; +export const GetReportsResponseBodyList = /*@__PURE__*/ S.Array( + Report, +) as any as S.Schema; + +export type GetReportsResponse = GetReportsResponseBodyList; +export const GetReportsResponse = /*@__PURE__*/ S.suspend(() => + GetReportsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetReportsResponse", +}) as any as S.Schema; + +export interface GetTeamMembersRequest { + /** The ID of the team */ + id: string; +} +export const GetTeamMembersRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/team/{id}/members", code: 200 })), +).annotate({ + identifier: "GetTeamMembersRequest", +}) as any as S.Schema; + +/** An array of team members */ +export type GetTeamMembersResponseBodyList = Array; +export const GetTeamMembersResponseBodyList = /*@__PURE__*/ S.Array( + TeamMember, +) as any as S.Schema; + +export type GetTeamMembersResponse = GetTeamMembersResponseBodyList; +export const GetTeamMembersResponse = /*@__PURE__*/ S.suspend(() => + GetTeamMembersResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetTeamMembersResponse", +}) as any as S.Schema; + +export interface GetTeamsRequest { + /** The IDs of the teams */ + ids: string; +} +export const GetTeamsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/teams", code: 200 })), +).annotate({ + identifier: "GetTeamsRequest", +}) as any as S.Schema; + +export type GetTeamsResponseBodyItemList = Array; +export const GetTeamsResponseBodyItemList = /*@__PURE__*/ S.Array( + TeamMember, +) as any as S.Schema; + +export type GetTeamsResponseBodyList = Array; +export const GetTeamsResponseBodyList = /*@__PURE__*/ S.Array( + GetTeamsResponseBodyItemList, +) as any as S.Schema; + +export type GetTeamsResponse = GetTeamsResponseBodyList; +export const GetTeamsResponse = /*@__PURE__*/ S.suspend(() => + GetTeamsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetTeamsResponse", +}) as any as S.Schema; + +export interface GetThreadRequest { + /** The ID of the thread */ + id: string; +} +export const GetThreadRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/thread/{id}", code: 200 })), +).annotate({ + identifier: "GetThreadRequest", +}) as any as S.Schema; + +export type ThreadType = "project" | "report" | "direct_message"; +export const ThreadType = /*@__PURE__*/ S.String; + +/** The type of message */ +export type ThreadMessageBodyType = + | "status_change" + | "text" + | "thread_closure" + | "deleted"; +export const ThreadMessageBodyType = /*@__PURE__*/ S.String; + +/** The old status of the project. **Only present for `status_change` message type** */ +export type ThreadMessageBodyOldStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const ThreadMessageBodyOldStatus = /*@__PURE__*/ S.String; + +/** The new status of the project. **Only present for `status_change` message type** */ +export type ThreadMessageBodyNewStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const ThreadMessageBodyNewStatus = /*@__PURE__*/ S.String; + +/** The contents of the message. **Fields will vary depending on message type.** */ +export interface ThreadMessageBody { + /** The type of message */ + type: ThreadMessageBodyType; + /** The actual message text. **Only present for `text` message type** */ + body?: string; + /** Whether the message is only visible to moderators. **Only present for `text` message type** */ + private?: boolean; + /** The ID of the message being replied to by this message. **Only present for `text` message type** */ + replying_to?: string | null; + /** The old status of the project. **Only present for `status_change` message type** */ + old_status?: ThreadMessageBodyOldStatus; + /** The new status of the project. **Only present for `status_change` message type** */ + new_status?: ThreadMessageBodyNewStatus; +} +export const ThreadMessageBody = /*@__PURE__*/ S.suspend(() => + S.Struct({ + type: ThreadMessageBodyType, + body: S.optional(S.String), + private: S.optional(S.Boolean), + replying_to: S.optional(S.NullOr(S.String)), + old_status: S.optional(ThreadMessageBodyOldStatus), + new_status: S.optional(ThreadMessageBodyNewStatus), + }), +).annotate({ + identifier: "ThreadMessageBody", +}) as any as S.Schema; + +export interface ThreadMessage { + /** The ID of the message itself */ + id: string; + /** The ID of the author */ + author_id?: string | null; + body: ThreadMessageBody; + /** The time at which the message was created */ + created: string; +} +export const ThreadMessage = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + author_id: S.optional(S.NullOr(S.String)), + body: ThreadMessageBody, + created: S.String, + }), +).annotate({ identifier: "ThreadMessage" }) as any as S.Schema; + +export type ThreadMessagesList = Array; +export const ThreadMessagesList = /*@__PURE__*/ S.Array( + ThreadMessage, +) as any as S.Schema; + +export type ThreadMembersList = Array; +export const ThreadMembersList = /*@__PURE__*/ S.Array( + User, +) as any as S.Schema; + +export interface Thread { + /** The ID of the thread */ + id: string; + type: ThreadType; + /** The ID of the associated project if a project thread */ + project_id?: string | null; + /** The ID of the associated report if a report thread */ + report_id?: string | null; + messages: ThreadMessagesList; + members: ThreadMembersList; +} +export const Thread = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String, + type: ThreadType, + project_id: S.optional(S.NullOr(S.String)), + report_id: S.optional(S.NullOr(S.String)), + messages: ThreadMessagesList, + members: ThreadMembersList, + }), +).annotate({ identifier: "Thread" }) as any as S.Schema; + +export interface GetThreadsRequest { + /** The IDs of the threads */ + ids: string; +} +export const GetThreadsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/threads", code: 200 })), +).annotate({ + identifier: "GetThreadsRequest", +}) as any as S.Schema; + +export type GetThreadsResponseBodyList = Array; +export const GetThreadsResponseBodyList = /*@__PURE__*/ S.Array( + Thread, +) as any as S.Schema; + +export type GetThreadsResponse = GetThreadsResponseBodyList; +export const GetThreadsResponse = /*@__PURE__*/ S.suspend(() => + GetThreadsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetThreadsResponse", +}) as any as S.Schema; + +export interface GetUserRequest { + /** The ID or username of the user */ + id_username: string; +} +export const GetUserRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/user/{id_username}", code: 200 })), +).annotate({ identifier: "GetUserRequest" }) as any as S.Schema; + +/** The user's role */ +export type GetUserResponseRole = "admin" | "moderator" | "developer"; +export const GetUserResponseRole = /*@__PURE__*/ S.String; + +/** A list of authentication providers you have signed up for (only displayed if requesting your own account) */ +export type GetUserResponseAuthProvidersList = Array; +export const GetUserResponseAuthProvidersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface GetUserResponse { + /** The user's username */ + username: string; + /** The user's display name */ + name?: string | null; + /** The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope. */ + email?: string | null; + /** A description of the user */ + bio?: string; + payout_data?: UserPayoutData | null; + /** The user's ID */ + id: string; + /** The user's avatar url */ + avatar_url: string; + /** The time at which the user was created */ + created: string; + /** The user's role */ + role: GetUserResponseRole; + /** Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change In order from first to seventh bit, the current bits are: - (unused) - EARLY_MODPACK_ADOPTER - EARLY_RESPACK_ADOPTER - EARLY_PLUGIN_ADOPTER - ALPHA_TESTER - CONTRIBUTOR - TRANSLATOR */ + badges?: number; + /** A list of authentication providers you have signed up for (only displayed if requesting your own account) */ + auth_providers?: GetUserResponseAuthProvidersList | null; + /** Whether your email is verified (only displayed if requesting your own account) */ + email_verified?: boolean | null; + /** Whether you have a password associated with your account (only displayed if requesting your own account) */ + has_password?: boolean | null; + /** Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account) */ + has_totp?: boolean | null; + /** Deprecated - this is no longer public for security reasons and is always null */ + github_id?: number | null; +} +export const GetUserResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + username: S.String, + name: S.optional(S.NullOr(S.String)), + email: S.optional(S.NullOr(S.String)), + bio: S.optional(S.String), + payout_data: S.optional(S.NullOr(UserPayoutData)), + id: S.String, + avatar_url: S.String, + created: S.String, + role: GetUserResponseRole, + badges: S.optional(S.Number), + auth_providers: S.optional(S.NullOr(GetUserResponseAuthProvidersList)), + email_verified: S.optional(S.NullOr(S.Boolean)), + has_password: S.optional(S.NullOr(S.Boolean)), + has_totp: S.optional(S.NullOr(S.Boolean)), + github_id: S.optional(S.NullOr(S.Number)), + }), +).annotate({ + identifier: "GetUserResponse", +}) as any as S.Schema; + +export interface GetUserFromAuthRequest {} +export const GetUserFromAuthRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe(T.Http({ method: "GET", uri: "/user", code: 200 })), +).annotate({ + identifier: "GetUserFromAuthRequest", +}) as any as S.Schema; + +/** The user's role */ +export type GetUserFromAuthResponseRole = "admin" | "moderator" | "developer"; +export const GetUserFromAuthResponseRole = /*@__PURE__*/ S.String; + +/** A list of authentication providers you have signed up for (only displayed if requesting your own account) */ +export type GetUserFromAuthResponseAuthProvidersList = Array; +export const GetUserFromAuthResponseAuthProvidersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface GetUserFromAuthResponse { + /** The user's username */ + username: string; + /** The user's display name */ + name?: string | null; + /** The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope. */ + email?: string | null; + /** A description of the user */ + bio?: string; + payout_data?: UserPayoutData | null; + /** The user's ID */ + id: string; + /** The user's avatar url */ + avatar_url: string; + /** The time at which the user was created */ + created: string; + /** The user's role */ + role: GetUserFromAuthResponseRole; + /** Any badges applicable to this user. These are currently unused and undisplayed, and as such are subject to change In order from first to seventh bit, the current bits are: - (unused) - EARLY_MODPACK_ADOPTER - EARLY_RESPACK_ADOPTER - EARLY_PLUGIN_ADOPTER - ALPHA_TESTER - CONTRIBUTOR - TRANSLATOR */ + badges?: number; + /** A list of authentication providers you have signed up for (only displayed if requesting your own account) */ + auth_providers?: GetUserFromAuthResponseAuthProvidersList | null; + /** Whether your email is verified (only displayed if requesting your own account) */ + email_verified?: boolean | null; + /** Whether you have a password associated with your account (only displayed if requesting your own account) */ + has_password?: boolean | null; + /** Whether you have TOTP two-factor authentication connected to your account (only displayed if requesting your own account) */ + has_totp?: boolean | null; + /** Deprecated - this is no longer public for security reasons and is always null */ + github_id?: number | null; +} +export const GetUserFromAuthResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + username: S.String, + name: S.optional(S.NullOr(S.String)), + email: S.optional(S.NullOr(S.String)), + bio: S.optional(S.String), + payout_data: S.optional(S.NullOr(UserPayoutData)), + id: S.String, + avatar_url: S.String, + created: S.String, + role: GetUserFromAuthResponseRole, + badges: S.optional(S.Number), + auth_providers: S.optional( + S.NullOr(GetUserFromAuthResponseAuthProvidersList), + ), + email_verified: S.optional(S.NullOr(S.Boolean)), + has_password: S.optional(S.NullOr(S.Boolean)), + has_totp: S.optional(S.NullOr(S.Boolean)), + github_id: S.optional(S.NullOr(S.Number)), + }), +).annotate({ + identifier: "GetUserFromAuthResponse", +}) as any as S.Schema; + +export interface GetUserNotificationsRequest { + /** The ID or username of the user */ + id_username: string; +} +export const GetUserNotificationsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ + method: "GET", + uri: "/user/{id_username}/notifications", + code: 200, + }), + ), +).annotate({ + identifier: "GetUserNotificationsRequest", +}) as any as S.Schema; + +export type GetUserNotificationsResponseBodyList = Array; +export const GetUserNotificationsResponseBodyList = /*@__PURE__*/ S.Array( + Notification, +) as any as S.Schema; + +export type GetUserNotificationsResponse = GetUserNotificationsResponseBodyList; +export const GetUserNotificationsResponse = /*@__PURE__*/ S.suspend(() => + GetUserNotificationsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetUserNotificationsResponse", +}) as any as S.Schema; + +export interface GetUserProjectsRequest { + /** The ID or username of the user */ + id_username: string; +} +export const GetUserProjectsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "GET", uri: "/user/{id_username}/projects", code: 200 }), + ), +).annotate({ + identifier: "GetUserProjectsRequest", +}) as any as S.Schema; + +export type GetUserProjectsResponseBodyList = Array; +export const GetUserProjectsResponseBodyList = /*@__PURE__*/ S.Array( + Project, +) as any as S.Schema; + +export type GetUserProjectsResponse = GetUserProjectsResponseBodyList; +export const GetUserProjectsResponse = /*@__PURE__*/ S.suspend(() => + GetUserProjectsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetUserProjectsResponse", +}) as any as S.Schema; + +export interface GetUsersRequest { + /** The IDs of the users */ + ids: string; +} +export const GetUsersRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/users", code: 200 })), +).annotate({ + identifier: "GetUsersRequest", +}) as any as S.Schema; + +export type GetUsersResponseBodyList = Array; +export const GetUsersResponseBodyList = /*@__PURE__*/ S.Array( + User, +) as any as S.Schema; + +export type GetUsersResponse = GetUsersResponseBodyList; +export const GetUsersResponse = /*@__PURE__*/ S.suspend(() => + GetUsersResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetUsersResponse", +}) as any as S.Schema; + +export interface GetVersionRequest { + /** The ID of the version */ + id: string; +} +export const GetVersionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/version/{id}", code: 200 })), +).annotate({ + identifier: "GetVersionRequest", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type GetVersionResponseDependenciesList = Array; +export const GetVersionResponseDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type GetVersionResponseGameVersionsList = Array; +export const GetVersionResponseGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type GetVersionResponseVersionType = "release" | "beta" | "alpha"; +export const GetVersionResponseVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type GetVersionResponseLoadersList = Array; +export const GetVersionResponseLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type GetVersionResponseStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const GetVersionResponseStatus = /*@__PURE__*/ S.String; + +export type GetVersionResponseRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const GetVersionResponseRequestedStatus = /*@__PURE__*/ S.String; + +/** A list of files available for download for this version */ +export type GetVersionResponseFilesList = Array; +export const GetVersionResponseFilesList = /*@__PURE__*/ S.Array( + VersionFile, +) as any as S.Schema; + +export interface GetVersionResponse { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: GetVersionResponseDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: GetVersionResponseGameVersionsList; + /** The release channel for this version */ + version_type: GetVersionResponseVersionType; + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: GetVersionResponseLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: GetVersionResponseStatus; + requested_status?: GetVersionResponseRequestedStatus | null; + /** The ID of the version, encoded as a base62 string */ + id: string; + /** The ID of the project this version is for */ + project_id: string; + /** The ID of the author who published this version */ + author_id: string; + date_published: string; + /** The number of times this version has been downloaded */ + downloads: number; + /** A link to the changelog for this version. Always null, only kept for legacy compatibility. */ + changelog_url?: string | null; + environment: EnvironmentEnum; + /** A list of files available for download for this version */ + files: GetVersionResponseFilesList; +} +export const GetVersionResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(GetVersionResponseDependenciesList), + game_versions: GetVersionResponseGameVersionsList, + version_type: GetVersionResponseVersionType, + loaders: GetVersionResponseLoadersList, + featured: S.Boolean, + status: S.optional(GetVersionResponseStatus), + requested_status: S.optional(S.NullOr(GetVersionResponseRequestedStatus)), + id: S.String, + project_id: S.String, + author_id: S.String, + date_published: S.String, + downloads: S.Number, + changelog_url: S.optional(S.NullOr(S.String)), + environment: EnvironmentEnum, + files: GetVersionResponseFilesList, + }), +).annotate({ + identifier: "GetVersionResponse", +}) as any as S.Schema; + +export interface GetVersionFromIdOrNumberRequest { + /** The ID or slug of the project */ + id_slug: string; + /** The version ID or version number */ + id_number: string; +} +export const GetVersionFromIdOrNumberRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + id_number: S.String.pipe(T.Label()), + }).pipe( + T.Http({ + method: "GET", + uri: "/project/{id_slug}/version/{id_number}", + code: 200, + }), + ), +).annotate({ + identifier: "GetVersionFromIdOrNumberRequest", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type GetVersionFromIdOrNumberResponseDependenciesList = + Array; +export const GetVersionFromIdOrNumberResponseDependenciesList = + /*@__PURE__*/ S.Array( + VersionDependency, + ) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type GetVersionFromIdOrNumberResponseGameVersionsList = Array; +export const GetVersionFromIdOrNumberResponseGameVersionsList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +/** The release channel for this version */ +export type GetVersionFromIdOrNumberResponseVersionType = + | "release" + | "beta" + | "alpha"; +export const GetVersionFromIdOrNumberResponseVersionType = + /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type GetVersionFromIdOrNumberResponseLoadersList = Array; +export const GetVersionFromIdOrNumberResponseLoadersList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +export type GetVersionFromIdOrNumberResponseStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const GetVersionFromIdOrNumberResponseStatus = /*@__PURE__*/ S.String; + +export type GetVersionFromIdOrNumberResponseRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const GetVersionFromIdOrNumberResponseRequestedStatus = + /*@__PURE__*/ S.String; + +/** A list of files available for download for this version */ +export type GetVersionFromIdOrNumberResponseFilesList = Array; +export const GetVersionFromIdOrNumberResponseFilesList = /*@__PURE__*/ S.Array( + VersionFile, +) as any as S.Schema; + +export interface GetVersionFromIdOrNumberResponse { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: GetVersionFromIdOrNumberResponseDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: GetVersionFromIdOrNumberResponseGameVersionsList; + /** The release channel for this version */ + version_type: GetVersionFromIdOrNumberResponseVersionType; + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: GetVersionFromIdOrNumberResponseLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: GetVersionFromIdOrNumberResponseStatus; + requested_status?: GetVersionFromIdOrNumberResponseRequestedStatus | null; + /** The ID of the version, encoded as a base62 string */ + id: string; + /** The ID of the project this version is for */ + project_id: string; + /** The ID of the author who published this version */ + author_id: string; + date_published: string; + /** The number of times this version has been downloaded */ + downloads: number; + /** A link to the changelog for this version. Always null, only kept for legacy compatibility. */ + changelog_url?: string | null; + environment: EnvironmentEnum; + /** A list of files available for download for this version */ + files: GetVersionFromIdOrNumberResponseFilesList; +} +export const GetVersionFromIdOrNumberResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(GetVersionFromIdOrNumberResponseDependenciesList), + game_versions: GetVersionFromIdOrNumberResponseGameVersionsList, + version_type: GetVersionFromIdOrNumberResponseVersionType, + loaders: GetVersionFromIdOrNumberResponseLoadersList, + featured: S.Boolean, + status: S.optional(GetVersionFromIdOrNumberResponseStatus), + requested_status: S.optional( + S.NullOr(GetVersionFromIdOrNumberResponseRequestedStatus), + ), + id: S.String, + project_id: S.String, + author_id: S.String, + date_published: S.String, + downloads: S.Number, + changelog_url: S.optional(S.NullOr(S.String)), + environment: EnvironmentEnum, + files: GetVersionFromIdOrNumberResponseFilesList, + }), +).annotate({ + identifier: "GetVersionFromIdOrNumberResponse", +}) as any as S.Schema; + +export interface GetVersionsRequest { + /** The IDs of the versions */ + ids: string; +} +export const GetVersionsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/versions", code: 200 })), +).annotate({ + identifier: "GetVersionsRequest", +}) as any as S.Schema; + +export type GetVersionsResponseBodyList = Array; +export const GetVersionsResponseBodyList = /*@__PURE__*/ S.Array( + Version, +) as any as S.Schema; + +export type GetVersionsResponse = GetVersionsResponseBodyList; +export const GetVersionsResponse = /*@__PURE__*/ S.suspend(() => + GetVersionsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "GetVersionsResponse", +}) as any as S.Schema; + +export interface JoinTeamRequest { + /** The ID of the team */ + id: string; +} +export const JoinTeamRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "POST", uri: "/team/{id}/join", code: 200 })), +).annotate({ + identifier: "JoinTeamRequest", +}) as any as S.Schema; + +export interface JoinTeamResponse {} +export const JoinTeamResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "JoinTeamResponse", +}) as any as S.Schema; + +export interface LicenseTextRequest { + /** The license ID to get the text of */ + id: string; +} +export const LicenseTextRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "GET", uri: "/tag/license/{id}", code: 200 })), +).annotate({ + identifier: "LicenseTextRequest", +}) as any as S.Schema; + +/** A full license */ +export interface License { + title?: string; + body?: string; +} +export const License = /*@__PURE__*/ S.suspend(() => + S.Struct({ + title: S.optional(S.String), + body: S.optional(S.String), + }), +).annotate({ identifier: "License" }) as any as S.Schema; + +export interface LoaderListRequest {} +export const LoaderListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe(T.Http({ method: "GET", uri: "/tag/loader", code: 200 })), +).annotate({ + identifier: "LoaderListRequest", +}) as any as S.Schema; + +/** The project types that this loader is applicable to */ +export type LoaderTagSupportedProjectTypesList = Array; +export const LoaderTagSupportedProjectTypesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export interface LoaderTag { + /** The SVG icon of a loader */ + icon: string; + /** The name of the loader */ + name: string; + /** The project types that this loader is applicable to */ + supported_project_types: LoaderTagSupportedProjectTypesList; +} +export const LoaderTag = /*@__PURE__*/ S.suspend(() => + S.Struct({ + icon: S.String, + name: S.String, + supported_project_types: LoaderTagSupportedProjectTypesList, + }), +).annotate({ identifier: "LoaderTag" }) as any as S.Schema; + +export type LoaderListResponseBodyList = Array; +export const LoaderListResponseBodyList = /*@__PURE__*/ S.Array( + LoaderTag, +) as any as S.Schema; + +export type LoaderListResponse = LoaderListResponseBodyList; +export const LoaderListResponse = /*@__PURE__*/ S.suspend(() => + LoaderListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "LoaderListResponse", +}) as any as S.Schema; + +export interface ModifyGalleryImageRequest { + /** The ID or slug of the project */ + id_slug: string; + /** URL link of the image to modify */ + url: string; + /** Whether the image is featured */ + featured?: boolean; + /** New title of the image */ + title?: string; + /** New description of the image */ + description?: string; + /** New ordering of the image */ + ordering?: number; +} +export const ModifyGalleryImageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + url: S.String.pipe(T.Query()), + featured: S.optional(S.Boolean.pipe(T.Query())), + title: S.optional(S.String.pipe(T.Query())), + description: S.optional(S.String.pipe(T.Query())), + ordering: S.optional(S.Number.pipe(T.Query())), + }).pipe( + T.Http({ method: "PATCH", uri: "/project/{id_slug}/gallery", code: 200 }), + ), +).annotate({ + identifier: "ModifyGalleryImageRequest", +}) as any as S.Schema; + +export interface ModifyGalleryImageResponse {} +export const ModifyGalleryImageResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ModifyGalleryImageResponse", +}) as any as S.Schema; + +/** A list of the featured categories that the project has. */ +export type ModifyProjectRequestCategoriesList = Array; +export const ModifyProjectRequestCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again. */ +export type ModifyProjectRequestAdditionalCategoriesList = Array; +export const ModifyProjectRequestAdditionalCategoriesList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +/** The status of the project */ +export type ModifyProjectRequestStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const ModifyProjectRequestStatus = /*@__PURE__*/ S.String; + +/** The requested status when submitting for review or scheduling the project for release. Approved status refers to "Public" visibility. */ +export type ModifyProjectRequestRequestedStatus = + | "approved" + | "archived" + | "unlisted" + | "private" + | "draft"; +export const ModifyProjectRequestRequestedStatus = /*@__PURE__*/ S.String; + +/** A list of donation links for the project */ +export type ModifyProjectRequestDonationUrlsList = Array; +export const ModifyProjectRequestDonationUrlsList = /*@__PURE__*/ S.Array( + ProjectDonationURL, +) as any as S.Schema; + +/** Deprecated - use `environment` instead. */ +export type ModifyProjectRequestClientSide = + | "required" + | "optional" + | "unsupported"; +export const ModifyProjectRequestClientSide = /*@__PURE__*/ S.String; + +/** Deprecated - use `environment` instead. */ +export type ModifyProjectRequestServerSide = + | "required" + | "optional" + | "unsupported"; +export const ModifyProjectRequestServerSide = /*@__PURE__*/ S.String; + +export interface ModifyProjectRequest { + /** The ID or slug of the project */ + id_slug: string; + /** The slug of a project, used for vanity URLs. Regex: ```^[\w!@$()`.+,"\-']{3,64}$``` */ + slug?: string; + /** The title or name of the project */ + title?: string; + /** A short sentence summarizing the project, no more than a sentence or two. */ + description?: string; + /** A long form description of the project */ + body?: string; + /** A list of the featured categories that the project has. */ + categories?: ModifyProjectRequestCategoriesList; + /** A list of additional categories that the project also has. These are supplementary to the featured categories, and does not include them again. */ + additional_categories?: ModifyProjectRequestAdditionalCategoriesList; + /** The status of the project */ + status?: ModifyProjectRequestStatus | (string & {}); + /** The requested status when submitting for review or scheduling the project for release. Approved status refers to "Public" visibility. */ + requested_status?: ModifyProjectRequestRequestedStatus | (string & {}) | null; + /** 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. */ + discord_url?: string | null; + /** A list of donation links for the project */ + donation_urls?: ModifyProjectRequestDonationUrlsList; + /** Deprecated - use `environment` instead. */ + client_side?: ModifyProjectRequestClientSide | (string & {}); + /** Deprecated - use `environment` instead. */ + server_side?: ModifyProjectRequestServerSide | (string & {}); + /** The SPDX license ID of a project */ + license_id?: string; + /** The URL to this license */ + license_url?: string | null; + /** The title of the moderators' message for the project */ + moderation_message?: string | null; + /** The body of the moderators' message for the project */ + moderation_message_body?: string | null; +} +export const ModifyProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + slug: S.optional(S.String), + title: S.optional(S.String), + description: S.optional(S.String), + body: S.optional(S.String), + categories: S.optional(ModifyProjectRequestCategoriesList), + additional_categories: S.optional( + ModifyProjectRequestAdditionalCategoriesList, + ), + status: S.optional(ModifyProjectRequestStatus), + requested_status: S.optional(S.NullOr(ModifyProjectRequestRequestedStatus)), + issues_url: S.optional(S.NullOr(S.String)), + source_url: S.optional(S.NullOr(S.String)), + wiki_url: S.optional(S.NullOr(S.String)), + discord_url: S.optional(S.NullOr(S.String)), + donation_urls: S.optional(ModifyProjectRequestDonationUrlsList), + client_side: S.optional(ModifyProjectRequestClientSide), + server_side: S.optional(ModifyProjectRequestServerSide), + license_id: S.optional(S.String), + license_url: S.optional(S.NullOr(S.String)), + moderation_message: S.optional(S.NullOr(S.String)), + moderation_message_body: S.optional(S.NullOr(S.String)), + }).pipe(T.Http({ method: "PATCH", uri: "/project/{id_slug}", code: 200 })), +).annotate({ + identifier: "ModifyProjectRequest", +}) as any as S.Schema; + +export interface ModifyProjectResponse {} +export const ModifyProjectResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ModifyProjectResponse", +}) as any as S.Schema; + +export interface ModifyReportRequest { + /** The ID of the report */ + id: string; + /** The contents of the report */ + body?: string; + /** Whether the thread should be closed */ + closed?: boolean; +} +export const ModifyReportRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + body: S.optional(S.String), + closed: S.optional(S.Boolean), + }).pipe(T.Http({ method: "PATCH", uri: "/report/{id}", code: 200 })), +).annotate({ + identifier: "ModifyReportRequest", +}) as any as S.Schema; + +export interface ModifyReportResponse {} +export const ModifyReportResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ModifyReportResponse", +}) as any as S.Schema; + +export interface ModifyTeamMemberRequest { + /** The ID of the team */ + id: string; + /** The ID or username of the user */ + id_username: string; + role?: string; + /** The user's permissions in bitfield format In order from first to tenth bit, the bits are: - UPLOAD_VERSION - DELETE_VERSION - EDIT_DETAILS - EDIT_BODY - MANAGE_INVITES - REMOVE_MEMBER - EDIT_MEMBER - DELETE_PROJECT - VIEW_ANALYTICS - VIEW_PAYOUTS */ + permissions?: number; + /** The split of payouts going to this user. The proportion of payouts they get is their split divided by the sum of the splits of all members. */ + payouts_split?: number; + /** The order of the team member. */ + ordering?: number; +} +export const ModifyTeamMemberRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + id_username: S.String.pipe(T.Label()), + role: S.optional(S.String), + permissions: S.optional(S.Number), + payouts_split: S.optional(S.Number), + ordering: S.optional(S.Number), + }).pipe( + T.Http({ + method: "PATCH", + uri: "/team/{id}/members/{id_username}", + code: 200, + }), + ), +).annotate({ + identifier: "ModifyTeamMemberRequest", +}) as any as S.Schema; + +export interface ModifyTeamMemberResponse {} +export const ModifyTeamMemberResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ModifyTeamMemberResponse", +}) as any as S.Schema; + +export interface ModifyUserRequest { + /** The ID or username of the user */ + id_username: string; + /** The user's username */ + username: string; + /** The user's display name */ + name?: string | null; + /** The user's email (only displayed if requesting your own account). Requires `USER_READ_EMAIL` PAT scope. */ + email?: string | null; + /** A description of the user */ + bio?: string; + payout_data?: UserPayoutData | null; +} +export const ModifyUserRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + username: S.String, + name: S.optional(S.NullOr(S.String)), + email: S.optional(S.NullOr(S.String)), + bio: S.optional(S.String), + payout_data: S.optional(S.NullOr(UserPayoutData)), + }).pipe(T.Http({ method: "PATCH", uri: "/user/{id_username}", code: 200 })), +).annotate({ + identifier: "ModifyUserRequest", +}) as any as S.Schema; + +export interface ModifyUserResponse {} +export const ModifyUserResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ModifyUserResponse", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type ModifyVersionRequestDependenciesList = Array; +export const ModifyVersionRequestDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type ModifyVersionRequestGameVersionsList = Array; +export const ModifyVersionRequestGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type ModifyVersionRequestVersionType = "release" | "beta" | "alpha"; +export const ModifyVersionRequestVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type ModifyVersionRequestLoadersList = Array; +export const ModifyVersionRequestLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type ModifyVersionRequestStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const ModifyVersionRequestStatus = /*@__PURE__*/ S.String; + +export type ModifyVersionRequestRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const ModifyVersionRequestRequestedStatus = /*@__PURE__*/ S.String; + +/** The hash format and the hash of the new primary file */ +export type ModifyVersionRequestPrimaryFileList = Array; +export const ModifyVersionRequestPrimaryFileList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of file_types to edit */ +export type ModifyVersionRequestFileTypesList = Array; +export const ModifyVersionRequestFileTypesList = /*@__PURE__*/ S.Array( + EditableFileType, +) as any as S.Schema; + +export interface ModifyVersionRequest { + /** The ID of the version */ + id: string; + /** The name of this version */ + name?: string; + /** The version number. Ideally will follow semantic versioning */ + version_number?: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: ModifyVersionRequestDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions?: ModifyVersionRequestGameVersionsList; + /** The release channel for this version */ + version_type?: ModifyVersionRequestVersionType | (string & {}); + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders?: ModifyVersionRequestLoadersList; + /** Whether the version is featured or not */ + featured?: boolean; + status?: ModifyVersionRequestStatus | (string & {}); + requested_status?: ModifyVersionRequestRequestedStatus | (string & {}) | null; + /** The hash format and the hash of the new primary file */ + primary_file?: ModifyVersionRequestPrimaryFileList; + /** A list of file_types to edit */ + file_types?: ModifyVersionRequestFileTypesList; +} +export const ModifyVersionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + name: S.optional(S.String), + version_number: S.optional(S.String), + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(ModifyVersionRequestDependenciesList), + game_versions: S.optional(ModifyVersionRequestGameVersionsList), + version_type: S.optional(ModifyVersionRequestVersionType), + loaders: S.optional(ModifyVersionRequestLoadersList), + featured: S.optional(S.Boolean), + status: S.optional(ModifyVersionRequestStatus), + requested_status: S.optional(S.NullOr(ModifyVersionRequestRequestedStatus)), + primary_file: S.optional(ModifyVersionRequestPrimaryFileList), + file_types: S.optional(ModifyVersionRequestFileTypesList), + }).pipe(T.Http({ method: "PATCH", uri: "/version/{id}", code: 200 })), +).annotate({ + identifier: "ModifyVersionRequest", +}) as any as S.Schema; + +export interface ModifyVersionResponse {} +export const ModifyVersionResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ModifyVersionResponse", +}) as any as S.Schema; + +/** Set all of the categories to the categories specified here */ +export type PatchProjectsRequestCategoriesList = Array; +export const PatchProjectsRequestCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** Add all of the categories specified here */ +export type PatchProjectsRequestAddCategoriesList = Array; +export const PatchProjectsRequestAddCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** Remove all of the categories specified here */ +export type PatchProjectsRequestRemoveCategoriesList = Array; +export const PatchProjectsRequestRemoveCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** Set all of the additional categories to the categories specified here */ +export type PatchProjectsRequestAdditionalCategoriesList = Array; +export const PatchProjectsRequestAdditionalCategoriesList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +/** Add all of the additional categories specified here */ +export type PatchProjectsRequestAddAdditionalCategoriesList = Array; +export const PatchProjectsRequestAddAdditionalCategoriesList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +/** Remove all of the additional categories specified here */ +export type PatchProjectsRequestRemoveAdditionalCategoriesList = Array; +export const PatchProjectsRequestRemoveAdditionalCategoriesList = + /*@__PURE__*/ S.Array( + S.String, + ) as any as S.Schema; + +/** Set all of the donation links to the donation links specified here */ +export type PatchProjectsRequestDonationUrlsList = Array; +export const PatchProjectsRequestDonationUrlsList = /*@__PURE__*/ S.Array( + ProjectDonationURL, +) as any as S.Schema; + +/** Add all of the donation links specified here */ +export type PatchProjectsRequestAddDonationUrlsList = Array; +export const PatchProjectsRequestAddDonationUrlsList = /*@__PURE__*/ S.Array( + ProjectDonationURL, +) as any as S.Schema; + +/** Remove all of the donation links specified here */ +export type PatchProjectsRequestRemoveDonationUrlsList = + Array; +export const PatchProjectsRequestRemoveDonationUrlsList = /*@__PURE__*/ S.Array( + ProjectDonationURL, +) as any as S.Schema; + +export interface PatchProjectsRequest { + /** The IDs and/or slugs of the projects */ + ids: string; + /** Set all of the categories to the categories specified here */ + categories?: PatchProjectsRequestCategoriesList; + /** Add all of the categories specified here */ + add_categories?: PatchProjectsRequestAddCategoriesList; + /** Remove all of the categories specified here */ + remove_categories?: PatchProjectsRequestRemoveCategoriesList; + /** Set all of the additional categories to the categories specified here */ + additional_categories?: PatchProjectsRequestAdditionalCategoriesList; + /** Add all of the additional categories specified here */ + add_additional_categories?: PatchProjectsRequestAddAdditionalCategoriesList; + /** Remove all of the additional categories specified here */ + remove_additional_categories?: PatchProjectsRequestRemoveAdditionalCategoriesList; + /** Set all of the donation links to the donation links specified here */ + donation_urls?: PatchProjectsRequestDonationUrlsList; + /** Add all of the donation links specified here */ + add_donation_urls?: PatchProjectsRequestAddDonationUrlsList; + /** Remove all of the donation links specified here */ + remove_donation_urls?: PatchProjectsRequestRemoveDonationUrlsList; + /** An optional link to where to submit bugs or issues with the projects */ + issues_url?: string | null; + /** An optional link to the source code of the projects */ + source_url?: string | null; + /** An optional link to the projects' wiki page or other relevant information */ + wiki_url?: string | null; + /** An optional invite link to the projects' discord */ + discord_url?: string | null; +} +export const PatchProjectsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + categories: S.optional(PatchProjectsRequestCategoriesList), + add_categories: S.optional(PatchProjectsRequestAddCategoriesList), + remove_categories: S.optional(PatchProjectsRequestRemoveCategoriesList), + additional_categories: S.optional( + PatchProjectsRequestAdditionalCategoriesList, + ), + add_additional_categories: S.optional( + PatchProjectsRequestAddAdditionalCategoriesList, + ), + remove_additional_categories: S.optional( + PatchProjectsRequestRemoveAdditionalCategoriesList, + ), + donation_urls: S.optional(PatchProjectsRequestDonationUrlsList), + add_donation_urls: S.optional(PatchProjectsRequestAddDonationUrlsList), + remove_donation_urls: S.optional( + PatchProjectsRequestRemoveDonationUrlsList, + ), + issues_url: S.optional(S.NullOr(S.String)), + source_url: S.optional(S.NullOr(S.String)), + wiki_url: S.optional(S.NullOr(S.String)), + discord_url: S.optional(S.NullOr(S.String)), + }).pipe(T.Http({ method: "PATCH", uri: "/projects", code: 200 })), +).annotate({ + identifier: "PatchProjectsRequest", +}) as any as S.Schema; + +export interface PatchProjectsResponse {} +export const PatchProjectsResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "PatchProjectsResponse", +}) as any as S.Schema; + +export interface ProjectTypeListRequest {} +export const ProjectTypeListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe( + T.Http({ method: "GET", uri: "/tag/project_type", code: 200 }), + ), +).annotate({ + identifier: "ProjectTypeListRequest", +}) as any as S.Schema; + +export type ProjectTypeListResponseBodyList = Array; +export const ProjectTypeListResponseBodyList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type ProjectTypeListResponse = ProjectTypeListResponseBodyList; +export const ProjectTypeListResponse = /*@__PURE__*/ S.suspend(() => + ProjectTypeListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "ProjectTypeListResponse", +}) as any as S.Schema; + +export interface RandomProjectsRequest { + /** The number of random projects to return */ + count: number; +} +export const RandomProjectsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + count: S.Number.pipe(T.Query()), + }).pipe(T.Http({ method: "GET", uri: "/projects_random", code: 200 })), +).annotate({ + identifier: "RandomProjectsRequest", +}) as any as S.Schema; + +export type RandomProjectsResponseBodyList = Array; +export const RandomProjectsResponseBodyList = /*@__PURE__*/ S.Array( + Project, +) as any as S.Schema; + +export type RandomProjectsResponse = RandomProjectsResponseBodyList; +export const RandomProjectsResponse = /*@__PURE__*/ S.suspend(() => + RandomProjectsResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "RandomProjectsResponse", +}) as any as S.Schema; + +export interface ReadNotificationRequest { + /** The ID of the notification */ + id: string; +} +export const ReadNotificationRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + }).pipe(T.Http({ method: "PATCH", uri: "/notification/{id}", code: 200 })), +).annotate({ + identifier: "ReadNotificationRequest", +}) as any as S.Schema; + +export interface ReadNotificationResponse {} +export const ReadNotificationResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ReadNotificationResponse", +}) as any as S.Schema; + +export interface ReadNotificationsRequest { + /** The IDs of the notifications */ + ids: string; +} +export const ReadNotificationsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + ids: S.String.pipe(T.Query()), + }).pipe(T.Http({ method: "PATCH", uri: "/notifications", code: 200 })), +).annotate({ + identifier: "ReadNotificationsRequest", +}) as any as S.Schema; + +export interface ReadNotificationsResponse {} +export const ReadNotificationsResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ReadNotificationsResponse", +}) as any as S.Schema; + +export interface ReportTypeListRequest {} +export const ReportTypeListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe( + T.Http({ method: "GET", uri: "/tag/report_type", code: 200 }), + ), +).annotate({ + identifier: "ReportTypeListRequest", +}) as any as S.Schema; + +export type ReportTypeListResponseBodyList = Array; +export const ReportTypeListResponseBodyList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type ReportTypeListResponse = ReportTypeListResponseBodyList; +export const ReportTypeListResponse = /*@__PURE__*/ S.suspend(() => + ReportTypeListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "ReportTypeListResponse", +}) as any as S.Schema; + +/** The requested status when scheduling the project for release */ +export type ScheduleProjectRequestRequestedStatus = + | "approved" + | "archived" + | "unlisted" + | "private" + | "draft"; +export const ScheduleProjectRequestRequestedStatus = /*@__PURE__*/ S.String; + +export interface ScheduleProjectRequest { + /** The ID or slug of the project */ + id_slug: string; + time: string; + /** The requested status when scheduling the project for release */ + requested_status: ScheduleProjectRequestRequestedStatus | (string & {}); +} +export const ScheduleProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + time: S.String, + requested_status: ScheduleProjectRequestRequestedStatus, + }).pipe( + T.Http({ method: "POST", uri: "/project/{id_slug}/schedule", code: 200 }), + ), +).annotate({ + identifier: "ScheduleProjectRequest", +}) as any as S.Schema; + +export interface ScheduleProjectResponse {} +export const ScheduleProjectResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ScheduleProjectResponse", +}) as any as S.Schema; + +/** The requested status when scheduling the project for release */ +export type ScheduleVersionRequestRequestedStatus = + | "approved" + | "archived" + | "unlisted" + | "private" + | "draft"; +export const ScheduleVersionRequestRequestedStatus = /*@__PURE__*/ S.String; + +export interface ScheduleVersionRequest { + /** The ID of the version */ + id: string; + time: string; + /** The requested status when scheduling the project for release */ + requested_status: ScheduleVersionRequestRequestedStatus | (string & {}); +} +export const ScheduleVersionRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + time: S.String, + requested_status: ScheduleVersionRequestRequestedStatus, + }).pipe(T.Http({ method: "POST", uri: "/version/{id}/schedule", code: 200 })), +).annotate({ + identifier: "ScheduleVersionRequest", +}) as any as S.Schema; + +export interface ScheduleVersionResponse {} +export const ScheduleVersionResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "ScheduleVersionResponse", +}) as any as S.Schema; + +export type SearchProjectsRequestIndex = + | "relevance" + | "downloads" + | "follows" + | "newest" + | "updated"; +export const SearchProjectsRequestIndex = /*@__PURE__*/ S.String; + +export interface SearchProjectsRequest { + /** The query to search for */ + query?: string; + /** Facets are an essential concept for understanding how to filter out results. These are the most commonly used facet types: - `project_type` - `all_project_types` (matches against every project type across all of the project's versions, not just the primary/version-specific type) - `categories` (loaders are lumped in with categories in search) - `versions` - `open_source` - `environment` (one of the following values) - `client_and_server` - `client_only` - `client_only_server_optional` - `singleplayer_only` - `server_only` - `server_only_client_optional` - `dedicated_server_only` - `client_or_server` - `client_or_server_prefers_both` - `unknown` - `disclosure_types` (list of any of the following values) - `ai_content` - `ai_content_code` - `ai_content_assets` - `ai_content_text` - `ai_content_functionality` - `advertisements` - `epilepsy_triggers` - `system_interactions` - `telemetry` - `telemetry_opt_in` - `telemetry_opt_out` - `telemetry_always_active` - `derivative_work` - `paid_features` - `archived` - `client_side` (deprecated - use `environment` instead) - `server_side` (deprecated - use `environment` instead) Several others are also available for use, though these should not be used outside very specific use cases. - `title` - `author` - `follows` - `project_id` - `license` - `downloads` - `created_timestamp` (uses Unix timestamp) - `modified_timestamp` (uses Unix timestamp) In order to then use these facets, you need a value to filter by, as well as an operation to perform on this value. The most common operation is `:` (same as `=`), though you can also use `!=`, `>=`, `>`, `<=`, and `<`. Join together the type, operation, and value, and you've got your string. ``` {type} {operation} {value} ``` Examples: ``` categories = adventure versions != 1.20.1 downloads <= 100 ``` 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, the search `[["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, the search `[["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 */ + index?: SearchProjectsRequestIndex | (string & {}); + /** The offset into the search. Skips this number of results */ + offset?: number; + /** The number of results returned by the search */ + limit?: number; +} +export const SearchProjectsRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + query: S.optional(S.String.pipe(T.Query())), + facets: S.optional(S.String.pipe(T.Query())), + index: S.optional(SearchProjectsRequestIndex.pipe(T.Query())), + offset: S.optional(S.Number.pipe(T.Query())), + limit: S.optional(S.Number.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/search", code: 200 })), +).annotate({ + identifier: "SearchProjectsRequest", +}) as any as S.Schema; + +/** The project type of the project */ +export type ProjectResultProjectType = + | "mod" + | "modpack" + | "resourcepack" + | "shader"; +export const ProjectResultProjectType = /*@__PURE__*/ S.String; + +export type ProjectResultAllProjectTypesItem = + | "mod" + | "resourcepack" + | "datapack" + | "shader" + | "modpack" + | "plugin"; +export const ProjectResultAllProjectTypesItem = /*@__PURE__*/ S.String; + +/** All project types across every version of the project, unlike `project_type` which only reflects a version-specific type */ +export type ProjectResultAllProjectTypesList = + Array; +export const ProjectResultAllProjectTypesList = /*@__PURE__*/ S.Array( + ProjectResultAllProjectTypesItem, +) as any as S.Schema; + +/** A list of the featured categories that the project has. */ +export type ProjectResultCategoriesList = Array; +export const ProjectResultCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of the featured categories that the project has. Equivalent to `categories` on the project itself. */ +export type ProjectResultDisplayCategoriesList = Array; +export const ProjectResultDisplayCategoriesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** A list of the minecraft versions supported by the project */ +export type ProjectResultVersionsList = Array; +export const ProjectResultVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system */ +export type ProjectResultEnvironmentList = Array; +export const ProjectResultEnvironmentList = /*@__PURE__*/ S.Array( + EnvironmentEnum, +) as any as S.Schema; + +export type DisclosureTypeEnum = + | "ai_content" + | "ai_content_code" + | "ai_content_assets" + | "ai_content_text" + | "ai_content_functionality" + | "advertisements" + | "epilepsy_triggers" + | "system_interactions" + | "telemetry" + | "telemetry_opt_in" + | "telemetry_opt_out" + | "telemetry_always_active" + | "derivative_work" + | "paid_features" + | "archived"; +export const DisclosureTypeEnum = /*@__PURE__*/ S.String; + +/** Disclosures listed on the project. */ +export type ProjectResultDisclosureTypesList = Array; +export const ProjectResultDisclosureTypesList = /*@__PURE__*/ S.Array( + DisclosureTypeEnum, +) as any as S.Schema; + +/** A list of images that have been uploaded to the project's gallery */ +export type ProjectResultGalleryList = Array; +export const ProjectResultGalleryList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** Deprecated - use `environment` instead. The client side support of the project */ +export type ProjectResultClientSide = + | "required" + | "optional" + | "unsupported" + | "unknown"; +export const ProjectResultClientSide = /*@__PURE__*/ S.String; + +/** Deprecated - use `environment` instead. The server side support of the project */ +export type ProjectResultServerSide = + | "required" + | "optional" + | "unsupported" + | "unknown"; +export const ProjectResultServerSide = /*@__PURE__*/ S.String; + +export interface ProjectResult { + /** The ID of the project, encoded as a base62 string */ + project_id: string; + /** The project type of the project */ + project_type: ProjectResultProjectType; + /** All project types across every version of the project, unlike `project_type` which only reflects a version-specific type */ + all_project_types: ProjectResultAllProjectTypesList; + /** The title or name of the project */ + title: string; + /** A short sentence summarizing the project, no more than a sentence or two. */ + description: string; + /** The username of the project's author */ + author: string; + /** A list of the featured categories that the project has. */ + categories: ProjectResultCategoriesList; + /** A list of the featured categories that the project has. Equivalent to `categories` on the project itself. */ + display_categories: ProjectResultDisplayCategoriesList; + /** A list of the minecraft versions supported by the project */ + versions: ProjectResultVersionsList; + /** The total number of downloads of the project */ + downloads: number; + /** The total number of users following the project */ + follows: number; + /** The URL of the project's icon */ + icon_url: string; + /** The date the project was created */ + date_created: string; + /** The date the latest version of the project was created */ + date_modified: string; + /** The ID of the latest version of the project */ + latest_version: string; + /** The SPDX license ID of a project */ + license: string; + /** All the environments that versions of this project support. Not in any particular order, we recommend using the environment information on a version instead. For an explanation of each environment, see the blog post here: https://modrinth.com/news/article/new-environments/#new-system */ + environment: ProjectResultEnvironmentList; + /** Disclosures listed on the project. */ + disclosure_types: ProjectResultDisclosureTypesList; + /** A list of images that have been uploaded to the project's gallery */ + gallery: ProjectResultGalleryList; + /** The slug of a project, used for vanity URLs. Regex: ```^[\w!@$()`.+,"\-']{3,64}$``` */ + slug?: string | null; + /** The ID of the project's author */ + author_id?: string | null; + /** The name of the organization that owns this project */ + organization?: string | null; + /** The ID of the organization that owns this project */ + organization_id?: string | null; + /** The featured gallery image of the project */ + featured_gallery?: string | null; + /** The RGB color of the project, automatically generated from the project icon */ + color?: number | null; + /** Deprecated - use `environment` instead. The client side support of the project */ + client_side: ProjectResultClientSide; + /** Deprecated - use `environment` instead. The server side support of the project */ + server_side: ProjectResultServerSide; +} +export const ProjectResult = /*@__PURE__*/ S.suspend(() => + S.Struct({ + project_id: S.String, + project_type: ProjectResultProjectType, + all_project_types: ProjectResultAllProjectTypesList, + title: S.String, + description: S.String, + author: S.String, + categories: ProjectResultCategoriesList, + display_categories: ProjectResultDisplayCategoriesList, + versions: ProjectResultVersionsList, + downloads: S.Number, + follows: S.Number, + icon_url: S.String, + date_created: S.String, + date_modified: S.String, + latest_version: S.String, + license: S.String, + environment: ProjectResultEnvironmentList, + disclosure_types: ProjectResultDisclosureTypesList, + gallery: ProjectResultGalleryList, + slug: S.optional(S.NullOr(S.String)), + author_id: S.optional(S.NullOr(S.String)), + organization: S.optional(S.NullOr(S.String)), + organization_id: S.optional(S.NullOr(S.String)), + featured_gallery: S.optional(S.NullOr(S.String)), + color: S.optional(S.NullOr(S.Number)), + client_side: ProjectResultClientSide, + server_side: ProjectResultServerSide, + }), +).annotate({ identifier: "ProjectResult" }) as any as S.Schema; + +/** The list of results */ +export type SearchResultsHitsList = Array; +export const SearchResultsHitsList = /*@__PURE__*/ S.Array( + ProjectResult, +) as any as S.Schema; + +export interface SearchResults { + /** The list of results */ + hits: SearchResultsHitsList; + /** The number of results that were skipped by the query */ + offset: number; + /** The number of results that were returned by the query */ + limit: number; + /** The total number of results that match the query */ + total_hits: number; +} +export const SearchResults = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hits: SearchResultsHitsList, + offset: S.Number, + limit: S.Number, + total_hits: S.Number, + }), +).annotate({ identifier: "SearchResults" }) as any as S.Schema; + +/** The type of message */ +export type SendThreadMessageRequestType = + | "status_change" + | "text" + | "thread_closure" + | "deleted"; +export const SendThreadMessageRequestType = /*@__PURE__*/ S.String; + +/** The old status of the project. **Only present for `status_change` message type** */ +export type SendThreadMessageRequestOldStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const SendThreadMessageRequestOldStatus = /*@__PURE__*/ S.String; + +/** The new status of the project. **Only present for `status_change` message type** */ +export type SendThreadMessageRequestNewStatus = + | "approved" + | "archived" + | "rejected" + | "draft" + | "unlisted" + | "processing" + | "withheld" + | "scheduled" + | "private" + | "unknown"; +export const SendThreadMessageRequestNewStatus = /*@__PURE__*/ S.String; + +export interface SendThreadMessageRequest { + /** The ID of the thread */ + id: string; + /** The type of message */ + type: SendThreadMessageRequestType | (string & {}); + /** The actual message text. **Only present for `text` message type** */ + body?: string; + /** Whether the message is only visible to moderators. **Only present for `text` message type** */ + private?: boolean; + /** The ID of the message being replied to by this message. **Only present for `text` message type** */ + replying_to?: string | null; + /** The old status of the project. **Only present for `status_change` message type** */ + old_status?: SendThreadMessageRequestOldStatus | (string & {}); + /** The new status of the project. **Only present for `status_change` message type** */ + new_status?: SendThreadMessageRequestNewStatus | (string & {}); +} +export const SendThreadMessageRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + type: SendThreadMessageRequestType, + body: S.optional(S.String), + private: S.optional(S.Boolean), + replying_to: S.optional(S.NullOr(S.String)), + old_status: S.optional(SendThreadMessageRequestOldStatus), + new_status: S.optional(SendThreadMessageRequestNewStatus), + }).pipe(T.Http({ method: "POST", uri: "/thread/{id}", code: 200 })), +).annotate({ + identifier: "SendThreadMessageRequest", +}) as any as S.Schema; + +export interface SideTypeListRequest {} +export const SideTypeListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe( + T.Http({ method: "GET", uri: "/tag/side_type", code: 200 }), + ), +).annotate({ + identifier: "SideTypeListRequest", +}) as any as S.Schema; + +export type SideTypeListResponseBodyList = Array; +export const SideTypeListResponseBodyList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type SideTypeListResponse = SideTypeListResponseBodyList; +export const SideTypeListResponse = /*@__PURE__*/ S.suspend(() => + SideTypeListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "SideTypeListResponse", +}) as any as S.Schema; + +export interface Statistics2Request {} +export const Statistics2Request = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe(T.Http({ method: "GET", uri: "/statistics", code: 200 })), +).annotate({ + identifier: "Statistics2Request", +}) as any as S.Schema; + +export interface Statistics { + /** Number of projects on Modrinth */ + projects?: number; + /** Number of versions on Modrinth */ + versions?: number; + /** Number of version files on Modrinth */ + files?: number; + /** Number of authors (users with projects) on Modrinth */ + authors?: number; +} +export const Statistics = /*@__PURE__*/ S.suspend(() => + S.Struct({ + projects: S.optional(S.Number), + versions: S.optional(S.Number), + files: S.optional(S.Number), + authors: S.optional(S.Number), + }), +).annotate({ identifier: "Statistics" }) as any as S.Schema; + +/** The type of the item being reported */ +export type SubmitReportRequestItemType = "project" | "user" | "version"; +export const SubmitReportRequestItemType = /*@__PURE__*/ S.String; + +export interface SubmitReportRequest { + /** The type of the report being sent */ + report_type: string; + /** The ID of the item (project, version, or user) being reported */ + item_id: string; + /** The type of the item being reported */ + item_type: SubmitReportRequestItemType | (string & {}); + /** The extended explanation of the report */ + body: string; +} +export const SubmitReportRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + report_type: S.String, + item_id: S.String, + item_type: SubmitReportRequestItemType, + body: S.String, + }).pipe(T.Http({ method: "POST", uri: "/report", code: 200 })), +).annotate({ + identifier: "SubmitReportRequest", +}) as any as S.Schema; + +/** The type of the item being reported */ +export type SubmitReportResponseItemType = "project" | "user" | "version"; +export const SubmitReportResponseItemType = /*@__PURE__*/ S.String; + +export interface SubmitReportResponse { + /** The type of the report being sent */ + report_type: string; + /** The ID of the item (project, version, or user) being reported */ + item_id: string; + /** The type of the item being reported */ + item_type: SubmitReportResponseItemType; + /** The extended explanation of the report */ + body: string; + /** The ID of the report */ + id?: string; + /** The ID of the user who reported the item */ + reporter: string; + /** The time at which the report was created */ + created: string; + /** Whether the report is resolved */ + closed: boolean; + /** The ID of the moderation thread associated with this report */ + thread_id: string; +} +export const SubmitReportResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + report_type: S.String, + item_id: S.String, + item_type: SubmitReportResponseItemType, + body: S.String, + id: S.optional(S.String), + reporter: S.String, + created: S.String, + closed: S.Boolean, + thread_id: S.String, + }), +).annotate({ + identifier: "SubmitReportResponse", +}) as any as S.Schema; + +export interface TransferTeamOwnershipRequest { + /** The ID of the team */ + id: string; + user_id: string; +} +export const TransferTeamOwnershipRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id: S.String.pipe(T.Label()), + user_id: S.String, + }).pipe(T.Http({ method: "PATCH", uri: "/team/{id}/owner", code: 200 })), +).annotate({ + identifier: "TransferTeamOwnershipRequest", +}) as any as S.Schema; + +export interface TransferTeamOwnershipResponse {} +export const TransferTeamOwnershipResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "TransferTeamOwnershipResponse", +}) as any as S.Schema; + +export interface UnfollowProjectRequest { + /** The ID or slug of the project */ + id_slug: string; +} +export const UnfollowProjectRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_slug: S.String.pipe(T.Label()), + }).pipe( + T.Http({ method: "DELETE", uri: "/project/{id_slug}/follow", code: 200 }), + ), +).annotate({ + identifier: "UnfollowProjectRequest", +}) as any as S.Schema; + +export interface UnfollowProjectResponse {} +export const UnfollowProjectResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "UnfollowProjectResponse", +}) as any as S.Schema; + +export type VersionFromHashRequestAlgorithm = "sha1" | "sha512"; +export const VersionFromHashRequestAlgorithm = /*@__PURE__*/ S.String; + +export interface VersionFromHashRequest { + /** The hash of the file, considering its byte content, and encoded in hexadecimal */ + hash: string; + /** The algorithm of the hash */ + algorithm: VersionFromHashRequestAlgorithm | (string & {}); + /** Whether to return multiple results when looking for this hash */ + multiple?: boolean; +} +export const VersionFromHashRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hash: S.String.pipe(T.Label()), + algorithm: VersionFromHashRequestAlgorithm.pipe(T.Query()), + multiple: S.optional(S.Boolean.pipe(T.Query())), + }).pipe(T.Http({ method: "GET", uri: "/version_file/{hash}", code: 200 })), +).annotate({ + identifier: "VersionFromHashRequest", +}) as any as S.Schema; + +/** A list of specific versions of projects that this version depends on */ +export type VersionFromHashResponseDependenciesList = Array; +export const VersionFromHashResponseDependenciesList = /*@__PURE__*/ S.Array( + VersionDependency, +) as any as S.Schema; + +/** A list of versions of Minecraft that this version supports */ +export type VersionFromHashResponseGameVersionsList = Array; +export const VersionFromHashResponseGameVersionsList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +/** The release channel for this version */ +export type VersionFromHashResponseVersionType = "release" | "beta" | "alpha"; +export const VersionFromHashResponseVersionType = /*@__PURE__*/ S.String; + +/** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ +export type VersionFromHashResponseLoadersList = Array; +export const VersionFromHashResponseLoadersList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type VersionFromHashResponseStatus = + | "listed" + | "archived" + | "draft" + | "unlisted" + | "scheduled" + | "unknown"; +export const VersionFromHashResponseStatus = /*@__PURE__*/ S.String; + +export type VersionFromHashResponseRequestedStatus = + | "listed" + | "archived" + | "draft" + | "unlisted"; +export const VersionFromHashResponseRequestedStatus = /*@__PURE__*/ S.String; + +/** A list of files available for download for this version */ +export type VersionFromHashResponseFilesList = Array; +export const VersionFromHashResponseFilesList = /*@__PURE__*/ S.Array( + VersionFile, +) as any as S.Schema; + +export interface VersionFromHashResponse { + /** The name of this version */ + name: string; + /** The version number. Ideally will follow semantic versioning */ + version_number: string; + /** The changelog for this version */ + changelog?: string | null; + /** A list of specific versions of projects that this version depends on */ + dependencies?: VersionFromHashResponseDependenciesList; + /** A list of versions of Minecraft that this version supports */ + game_versions: VersionFromHashResponseGameVersionsList; + /** The release channel for this version */ + version_type: VersionFromHashResponseVersionType; + /** The mod loaders that this version supports. In case of resource packs, use "minecraft" */ + loaders: VersionFromHashResponseLoadersList; + /** Whether the version is featured or not */ + featured: boolean; + status?: VersionFromHashResponseStatus; + requested_status?: VersionFromHashResponseRequestedStatus | null; + /** The ID of the version, encoded as a base62 string */ + id: string; + /** The ID of the project this version is for */ + project_id: string; + /** The ID of the author who published this version */ + author_id: string; + date_published: string; + /** The number of times this version has been downloaded */ + downloads: number; + /** A link to the changelog for this version. Always null, only kept for legacy compatibility. */ + changelog_url?: string | null; + environment: EnvironmentEnum; + /** A list of files available for download for this version */ + files: VersionFromHashResponseFilesList; +} +export const VersionFromHashResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({ + name: S.String, + version_number: S.String, + changelog: S.optional(S.NullOr(S.String)), + dependencies: S.optional(VersionFromHashResponseDependenciesList), + game_versions: VersionFromHashResponseGameVersionsList, + version_type: VersionFromHashResponseVersionType, + loaders: VersionFromHashResponseLoadersList, + featured: S.Boolean, + status: S.optional(VersionFromHashResponseStatus), + requested_status: S.optional( + S.NullOr(VersionFromHashResponseRequestedStatus), + ), + id: S.String, + project_id: S.String, + author_id: S.String, + date_published: S.String, + downloads: S.Number, + changelog_url: S.optional(S.NullOr(S.String)), + environment: EnvironmentEnum, + files: VersionFromHashResponseFilesList, + }), +).annotate({ + identifier: "VersionFromHashResponse", +}) as any as S.Schema; + +export interface VersionListRequest {} +export const VersionListRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({}).pipe( + T.Http({ method: "GET", uri: "/tag/game_version", code: 200 }), + ), +).annotate({ + identifier: "VersionListRequest", +}) as any as S.Schema; + +/** The type of the game version */ +export type GameVersionTagVersionType = + | "release" + | "snapshot" + | "alpha" + | "beta"; +export const GameVersionTagVersionType = /*@__PURE__*/ S.String; + +export interface GameVersionTag { + /** The name/number of the game version */ + version: string; + /** The type of the game version */ + version_type: GameVersionTagVersionType; + /** The date of the game version release */ + date: string; + /** Whether or not this is a major version, used for Featured Versions */ + major: boolean; +} +export const GameVersionTag = /*@__PURE__*/ S.suspend(() => + S.Struct({ + version: S.String, + version_type: GameVersionTagVersionType, + date: S.String, + major: S.Boolean, + }), +).annotate({ identifier: "GameVersionTag" }) as any as S.Schema; + +export type VersionListResponseBodyList = Array; +export const VersionListResponseBodyList = /*@__PURE__*/ S.Array( + GameVersionTag, +) as any as S.Schema; + +export type VersionListResponse = VersionListResponseBodyList; +export const VersionListResponse = /*@__PURE__*/ S.suspend(() => + VersionListResponseBodyList.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "VersionListResponse", +}) as any as S.Schema; + +export type VersionsFromHashesRequestHashesList = Array; +export const VersionsFromHashesRequestHashesList = /*@__PURE__*/ S.Array( + S.String, +) as any as S.Schema; + +export type VersionsFromHashesRequestAlgorithm = "sha1" | "sha512"; +export const VersionsFromHashesRequestAlgorithm = /*@__PURE__*/ S.String; + +export interface VersionsFromHashesRequest { + hashes: VersionsFromHashesRequestHashesList; + algorithm: VersionsFromHashesRequestAlgorithm | (string & {}); +} +export const VersionsFromHashesRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + hashes: VersionsFromHashesRequestHashesList, + algorithm: VersionsFromHashesRequestAlgorithm, + }).pipe(T.Http({ method: "POST", uri: "/version_files", code: 200 })), +).annotate({ + identifier: "VersionsFromHashesRequest", +}) as any as S.Schema; + +export type VersionsFromHashesResponse = HashVersionMap; +export const VersionsFromHashesResponse = /*@__PURE__*/ S.suspend(() => + HashVersionMap.pipe(T.RawResponseRoot()), +).annotate({ + identifier: "VersionsFromHashesResponse", +}) as any as S.Schema; + +export interface WithdrawPayoutRequest { + /** The ID or username of the user */ + id_username: string; + /** Amount to withdraw */ + amount: number; +} +export const WithdrawPayoutRequest = /*@__PURE__*/ S.suspend(() => + S.Struct({ + id_username: S.String.pipe(T.Label()), + amount: S.Number.pipe(T.Query()), + }).pipe( + T.Http({ method: "POST", uri: "/user/{id_username}/payouts", code: 200 }), + ), +).annotate({ + identifier: "WithdrawPayoutRequest", +}) as any as S.Schema; + +export interface WithdrawPayoutResponse {} +export const WithdrawPayoutResponse = /*@__PURE__*/ S.suspend(() => + S.Struct({}), +).annotate({ + identifier: "WithdrawPayoutResponse", +}) as any as S.Schema; + +export type AddFilesToVersionError = NotFound | ModrinthOpError; +/** Add files to version Project files are attached. `.mrpack` and `.jar` files are accepted. */ +export const addFilesToVersion: API.OperationMethod< + AddFilesToVersionRequest, + AddFilesToVersionResponse, + AddFilesToVersionError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: AddFilesToVersionRequest, + output: AddFilesToVersionResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type AddGalleryImageError = BadRequest | NotFound | ModrinthOpError; +/** Add a gallery image Modrinth allows you to upload files of up to 5MiB to a project's gallery. */ +export const addGalleryImage: API.OperationMethod< + AddGalleryImageRequest, + AddGalleryImageResponse, + AddGalleryImageError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: AddGalleryImageRequest, + output: AddGalleryImageResponse, + errors: [BadRequest, NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type AddTeamMemberError = NotFound | ModrinthOpError; +/** Add a user to a team */ +export const addTeamMember: API.OperationMethod< + AddTeamMemberRequest, + AddTeamMemberResponse, + AddTeamMemberError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: AddTeamMemberRequest, + output: AddTeamMemberResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type CategoryListError = ModrinthOpError; +/** Get a list of categories Gets an array of categories, their icons, and applicable project types */ +export const categoryList: API.OperationMethod< + CategoryListRequest, + CategoryListResponse, + CategoryListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: CategoryListRequest, + output: CategoryListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ChangeProjectIconError = BadRequest | ModrinthOpError; +/** Change project's icon The new icon may be up to 256KiB in size. */ +export const changeProjectIcon: API.OperationMethod< + ChangeProjectIconRequest, + ChangeProjectIconResponse, + ChangeProjectIconError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ChangeProjectIconRequest, + output: ChangeProjectIconResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ChangeUserIconError = BadRequest | NotFound | ModrinthOpError; +/** Change user's avatar The new avatar may be up to 2MiB in size. */ +export const changeUserIcon: API.OperationMethod< + ChangeUserIconRequest, + ChangeUserIconResponse, + ChangeUserIconError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ChangeUserIconRequest, + output: ChangeUserIconResponse, + errors: [BadRequest, NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type CheckProjectValidityError = NotFound | ModrinthOpError; +/** Check project slug/ID validity */ +export const checkProjectValidity: API.OperationMethod< + CheckProjectValidityRequest, + ProjectIdentifier, + CheckProjectValidityError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: CheckProjectValidityRequest, + output: ProjectIdentifier, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type CreateProjectError = BadRequest | ModrinthOpError; +/** Create a project */ +export const createProject: API.OperationMethod< + CreateProjectRequest, + Project, + CreateProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: CreateProjectRequest, + output: Project, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type CreateVersionError = BadRequest | ModrinthOpError; +/** Create a version This route creates a version on an existing project. There must be at least one file attached to each new version, unless the new version's status is `draft`. `.mrpack`, `.jar`, `.zip`, and `.litemod` files are accepted. The request is a [multipart request](https://www.ietf.org/rfc/rfc2388.txt) with at least two form fields: one is `data`, which includes a JSON body with the version metadata as shown below, and at least one field containing an upload file. You can name the file parts anything you would like, but you must list each of the parts' names in `file_parts`, and optionally, provide one to use as the primary file in `primary_file`. */ +export const createVersion: API.OperationMethod< + CreateVersionRequest, + CreateVersionResponse, + CreateVersionError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: CreateVersionRequest, + output: CreateVersionResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteFileFromHashError = NotFound | ModrinthOpError; +/** Delete a file from its hash */ +export const deleteFileFromHash: API.OperationMethod< + DeleteFileFromHashRequest, + DeleteFileFromHashResponse, + DeleteFileFromHashError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteFileFromHashRequest, + output: DeleteFileFromHashResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteGalleryImageError = BadRequest | ModrinthOpError; +/** Delete a gallery image */ +export const deleteGalleryImage: API.OperationMethod< + DeleteGalleryImageRequest, + DeleteGalleryImageResponse, + DeleteGalleryImageError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteGalleryImageRequest, + output: DeleteGalleryImageResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteNotificationError = NotFound | ModrinthOpError; +/** Delete notification */ +export const deleteNotification: API.OperationMethod< + DeleteNotificationRequest, + DeleteNotificationResponse, + DeleteNotificationError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteNotificationRequest, + output: DeleteNotificationResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteNotificationsError = NotFound | ModrinthOpError; +/** Delete multiple notifications */ +export const deleteNotifications: API.OperationMethod< + DeleteNotificationsRequest, + DeleteNotificationsResponse, + DeleteNotificationsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteNotificationsRequest, + output: DeleteNotificationsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteProjectError = BadRequest | ModrinthOpError; +/** Delete a project */ +export const deleteProject: API.OperationMethod< + DeleteProjectRequest, + DeleteProjectResponse, + DeleteProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteProjectRequest, + output: DeleteProjectResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteProjectIconError = BadRequest | ModrinthOpError; +/** Delete project's icon */ +export const deleteProjectIcon: API.OperationMethod< + DeleteProjectIconRequest, + DeleteProjectIconResponse, + DeleteProjectIconError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteProjectIconRequest, + output: DeleteProjectIconResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteTeamMemberError = NotFound | ModrinthOpError; +/** Remove a member from a team */ +export const deleteTeamMember: API.OperationMethod< + DeleteTeamMemberRequest, + DeleteTeamMemberResponse, + DeleteTeamMemberError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteTeamMemberRequest, + output: DeleteTeamMemberResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteThreadMessageError = NotFound | ModrinthOpError; +/** Delete a thread message */ +export const deleteThreadMessage: API.OperationMethod< + DeleteThreadMessageRequest, + DeleteThreadMessageResponse, + DeleteThreadMessageError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteThreadMessageRequest, + output: DeleteThreadMessageResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteUserIconError = BadRequest | NotFound | ModrinthOpError; +/** Remove user's avatar */ +export const deleteUserIcon: API.OperationMethod< + DeleteUserIconRequest, + DeleteUserIconResponse, + DeleteUserIconError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteUserIconRequest, + output: DeleteUserIconResponse, + errors: [BadRequest, NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DeleteVersionError = NotFound | ModrinthOpError; +/** Delete a version */ +export const deleteVersion: API.OperationMethod< + DeleteVersionRequest, + DeleteVersionResponse, + DeleteVersionError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DeleteVersionRequest, + output: DeleteVersionResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type DonationPlatformListError = ModrinthOpError; +/** Get a list of donation platforms Gets an array of donation platforms and information about them */ +export const donationPlatformList: API.OperationMethod< + DonationPlatformListRequest, + DonationPlatformListResponse, + DonationPlatformListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: DonationPlatformListRequest, + output: DonationPlatformListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type FollowProjectError = BadRequest | ModrinthOpError; +/** Follow a project */ +export const followProject: API.OperationMethod< + FollowProjectRequest, + FollowProjectResponse, + FollowProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: FollowProjectRequest, + output: FollowProjectResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ForgeUpdates2Error = BadRequest | ModrinthOpError; +/** Forge Updates JSON file If you're a Forge mod developer, your Modrinth mods have an automatically generated `updates.json` using the [Forge Update Checker](https://docs.minecraftforge.net/en/latest/misc/updatechecker/). The only setup is to insert the URL into the `[[mods]]` section of your `mods.toml` file as such: ```toml [[mods]] # the other stuff here - ID, version, display name, etc. updateJSONURL = "https://api.modrinth.com/updates/{slug|ID}/forge_updates.json" ``` Replace `{slug|id}` with the slug or ID of your project. Modrinth will handle the rest! When you update your mod, Forge will notify your users that their copy of your mod is out of date. Make sure that the version format you use for your Modrinth releases is the same as the version format you use in your `mods.toml`. If you use a format such as `1.2.3-forge` or `1.2.3+1.19` with your Modrinth releases but your `mods.toml` only has `1.2.3`, the update checker may not function properly. If you're using NeoForge, NeoForge versions will, by default, not appear in the default URL. You will need to add `?neoforge=only` to show your NeoForge-only versions, or `?neoforge=include` for both. ```toml [[mods]] # the other stuff here - ID, version, display name, etc. updateJSONURL = "https://api.modrinth.com/updates/{slug|ID}/forge_updates.json?neoforge=only" ``` */ +export const forgeUpdates2: API.OperationMethod< + ForgeUpdatesRequest, + ForgeUpdates, + ForgeUpdates2Error, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ForgeUpdatesRequest, + output: ForgeUpdates, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetDependenciesError = NotFound | ModrinthOpError; +/** Get all of a project's dependencies */ +export const getDependencies: API.OperationMethod< + GetDependenciesRequest, + ProjectDependencyList, + GetDependenciesError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetDependenciesRequest, + output: ProjectDependencyList, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetFollowedProjectsError = NotFound | ModrinthOpError; +/** Get user's followed projects */ +export const getFollowedProjects: API.OperationMethod< + GetFollowedProjectsRequest, + GetFollowedProjectsResponse, + GetFollowedProjectsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetFollowedProjectsRequest, + output: GetFollowedProjectsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetLatestVersionFromHashError = + | BadRequest + | NotFound + | ModrinthOpError; +/** Latest version of a project from a hash, loader(s), and game version(s) */ +export const getLatestVersionFromHash: API.OperationMethod< + GetLatestVersionFromHashRequest, + GetLatestVersionFromHashResponse, + GetLatestVersionFromHashError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetLatestVersionFromHashRequest, + output: GetLatestVersionFromHashResponse, + errors: [BadRequest, NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetLatestVersionsFromHashesError = BadRequest | ModrinthOpError; +/** Latest versions of multiple projects from hashes, loader(s), and game version(s) This is the same as [`/version_file/{hash}/update`](#operation/getLatestVersionFromHash) except it accepts multiple hashes. */ +export const getLatestVersionsFromHashes: API.OperationMethod< + GetLatestVersionsFromHashesRequest, + GetLatestVersionsFromHashesResponse, + GetLatestVersionsFromHashesError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetLatestVersionsFromHashesRequest, + output: GetLatestVersionsFromHashesResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetNotificationError = NotFound | ModrinthOpError; +/** Get notification from ID */ +export const getNotification: API.OperationMethod< + GetNotificationRequest, + Notification, + GetNotificationError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetNotificationRequest, + output: Notification, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetNotificationsError = NotFound | ModrinthOpError; +/** Get multiple notifications */ +export const getNotifications: API.OperationMethod< + GetNotificationsRequest, + GetNotificationsResponse, + GetNotificationsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetNotificationsRequest, + output: GetNotificationsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetOpenReportsError = NotFound | ModrinthOpError; +/** Get your open reports */ +export const getOpenReports: API.OperationMethod< + GetOpenReportsRequest, + GetOpenReportsResponse, + GetOpenReportsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetOpenReportsRequest, + output: GetOpenReportsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetPayoutHistoryError = NotFound | ModrinthOpError; +/** Get user's payout history */ +export const getPayoutHistory: API.OperationMethod< + GetPayoutHistoryRequest, + UserPayoutHistory, + GetPayoutHistoryError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetPayoutHistoryRequest, + output: UserPayoutHistory, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetProjectError = NotFound | ModrinthOpError; +/** Get a project */ +export const getProject: API.OperationMethod< + GetProjectRequest, + Project, + GetProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetProjectRequest, + output: Project, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetProjectsError = ModrinthOpError; +/** Get multiple projects */ +export const getProjects: API.OperationMethod< + GetProjectsRequest, + GetProjectsResponse, + GetProjectsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetProjectsRequest, + output: GetProjectsResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetProjectTeamMembersError = NotFound | ModrinthOpError; +/** Get a project's team members */ +export const getProjectTeamMembers: API.OperationMethod< + GetProjectTeamMembersRequest, + GetProjectTeamMembersResponse, + GetProjectTeamMembersError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetProjectTeamMembersRequest, + output: GetProjectTeamMembersResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetProjectVersionsError = NotFound | ModrinthOpError; +/** List project's versions */ +export const getProjectVersions: API.OperationMethod< + GetProjectVersionsRequest, + GetProjectVersionsResponse, + GetProjectVersionsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetProjectVersionsRequest, + output: GetProjectVersionsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetReportError = NotFound | ModrinthOpError; +/** Get report from ID */ +export const getReport: API.OperationMethod< + GetReportRequest, + GetReportResponse, + GetReportError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetReportRequest, + output: GetReportResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetReportsError = NotFound | ModrinthOpError; +/** Get multiple reports */ +export const getReports: API.OperationMethod< + GetReportsRequest, + GetReportsResponse, + GetReportsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetReportsRequest, + output: GetReportsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetTeamMembersError = ModrinthOpError; +/** Get a team's members */ +export const getTeamMembers: API.OperationMethod< + GetTeamMembersRequest, + GetTeamMembersResponse, + GetTeamMembersError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetTeamMembersRequest, + output: GetTeamMembersResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetTeamsError = ModrinthOpError; +/** Get the members of multiple teams */ +export const getTeams: API.OperationMethod< + GetTeamsRequest, + GetTeamsResponse, + GetTeamsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetTeamsRequest, + output: GetTeamsResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetThreadError = NotFound | ModrinthOpError; +/** Get a thread */ +export const getThread: API.OperationMethod< + GetThreadRequest, + Thread, + GetThreadError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetThreadRequest, + output: Thread, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetThreadsError = NotFound | ModrinthOpError; +/** Get multiple threads */ +export const getThreads: API.OperationMethod< + GetThreadsRequest, + GetThreadsResponse, + GetThreadsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetThreadsRequest, + output: GetThreadsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetUserError = NotFound | ModrinthOpError; +/** Get a user */ +export const getUser: API.OperationMethod< + GetUserRequest, + GetUserResponse, + GetUserError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetUserRequest, + output: GetUserResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetUserFromAuthError = ModrinthOpError; +/** Get user from authorization header */ +export const getUserFromAuth: API.OperationMethod< + GetUserFromAuthRequest, + GetUserFromAuthResponse, + GetUserFromAuthError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetUserFromAuthRequest, + output: GetUserFromAuthResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetUserNotificationsError = NotFound | ModrinthOpError; +/** Get user's notifications */ +export const getUserNotifications: API.OperationMethod< + GetUserNotificationsRequest, + GetUserNotificationsResponse, + GetUserNotificationsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetUserNotificationsRequest, + output: GetUserNotificationsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetUserProjectsError = NotFound | ModrinthOpError; +/** Get user's projects */ +export const getUserProjects: API.OperationMethod< + GetUserProjectsRequest, + GetUserProjectsResponse, + GetUserProjectsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetUserProjectsRequest, + output: GetUserProjectsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetUsersError = ModrinthOpError; +/** Get multiple users */ +export const getUsers: API.OperationMethod< + GetUsersRequest, + GetUsersResponse, + GetUsersError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetUsersRequest, + output: GetUsersResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetVersionError = NotFound | ModrinthOpError; +/** Get a version */ +export const getVersion: API.OperationMethod< + GetVersionRequest, + GetVersionResponse, + GetVersionError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetVersionRequest, + output: GetVersionResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetVersionFromIdOrNumberError = NotFound | ModrinthOpError; +/** Get a version given a version number or ID Please note that, if the version number provided matches multiple versions, only the **oldest matching version** will be returned. */ +export const getVersionFromIdOrNumber: API.OperationMethod< + GetVersionFromIdOrNumberRequest, + GetVersionFromIdOrNumberResponse, + GetVersionFromIdOrNumberError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetVersionFromIdOrNumberRequest, + output: GetVersionFromIdOrNumberResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type GetVersionsError = ModrinthOpError; +/** Get multiple versions */ +export const getVersions: API.OperationMethod< + GetVersionsRequest, + GetVersionsResponse, + GetVersionsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: GetVersionsRequest, + output: GetVersionsResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type JoinTeamError = NotFound | ModrinthOpError; +/** Join a team */ +export const joinTeam: API.OperationMethod< + JoinTeamRequest, + JoinTeamResponse, + JoinTeamError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: JoinTeamRequest, + output: JoinTeamResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type LicenseTextError = BadRequest | ModrinthOpError; +/** Get the text and title of a license */ +export const licenseText: API.OperationMethod< + LicenseTextRequest, + License, + LicenseTextError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: LicenseTextRequest, + output: License, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type LoaderListError = ModrinthOpError; +/** Get a list of loaders Gets an array of loaders, their icons, and supported project types */ +export const loaderList: API.OperationMethod< + LoaderListRequest, + LoaderListResponse, + LoaderListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: LoaderListRequest, + output: LoaderListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ModifyGalleryImageError = NotFound | ModrinthOpError; +/** Modify a gallery image */ +export const modifyGalleryImage: API.OperationMethod< + ModifyGalleryImageRequest, + ModifyGalleryImageResponse, + ModifyGalleryImageError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ModifyGalleryImageRequest, + output: ModifyGalleryImageResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ModifyProjectError = NotFound | ModrinthOpError; +/** Modify a project */ +export const modifyProject: API.OperationMethod< + ModifyProjectRequest, + ModifyProjectResponse, + ModifyProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ModifyProjectRequest, + output: ModifyProjectResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ModifyReportError = BadRequest | NotFound | ModrinthOpError; +/** Modify a report */ +export const modifyReport: API.OperationMethod< + ModifyReportRequest, + ModifyReportResponse, + ModifyReportError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ModifyReportRequest, + output: ModifyReportResponse, + errors: [BadRequest, NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ModifyTeamMemberError = NotFound | ModrinthOpError; +/** Modify a team member's information */ +export const modifyTeamMember: API.OperationMethod< + ModifyTeamMemberRequest, + ModifyTeamMemberResponse, + ModifyTeamMemberError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ModifyTeamMemberRequest, + output: ModifyTeamMemberResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ModifyUserError = NotFound | ModrinthOpError; +/** Modify a user */ +export const modifyUser: API.OperationMethod< + ModifyUserRequest, + ModifyUserResponse, + ModifyUserError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ModifyUserRequest, + output: ModifyUserResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ModifyVersionError = NotFound | ModrinthOpError; +/** Modify a version */ +export const modifyVersion: API.OperationMethod< + ModifyVersionRequest, + ModifyVersionResponse, + ModifyVersionError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ModifyVersionRequest, + output: ModifyVersionResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type PatchProjectsError = BadRequest | ModrinthOpError; +/** Bulk-edit multiple projects */ +export const patchProjects: API.OperationMethod< + PatchProjectsRequest, + PatchProjectsResponse, + PatchProjectsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: PatchProjectsRequest, + output: PatchProjectsResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ProjectTypeListError = ModrinthOpError; +/** Get a list of project types Gets an array of valid project types */ +export const projectTypeList: API.OperationMethod< + ProjectTypeListRequest, + ProjectTypeListResponse, + ProjectTypeListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ProjectTypeListRequest, + output: ProjectTypeListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type RandomProjectsError = BadRequest | ModrinthOpError; +/** Get a list of random projects */ +export const randomProjects: API.OperationMethod< + RandomProjectsRequest, + RandomProjectsResponse, + RandomProjectsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: RandomProjectsRequest, + output: RandomProjectsResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ReadNotificationError = NotFound | ModrinthOpError; +/** Mark notification as read */ +export const readNotification: API.OperationMethod< + ReadNotificationRequest, + ReadNotificationResponse, + ReadNotificationError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ReadNotificationRequest, + output: ReadNotificationResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ReadNotificationsError = NotFound | ModrinthOpError; +/** Mark multiple notifications as read */ +export const readNotifications: API.OperationMethod< + ReadNotificationsRequest, + ReadNotificationsResponse, + ReadNotificationsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ReadNotificationsRequest, + output: ReadNotificationsResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ReportTypeListError = ModrinthOpError; +/** Get a list of report types Gets an array of valid report types */ +export const reportTypeList: API.OperationMethod< + ReportTypeListRequest, + ReportTypeListResponse, + ReportTypeListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ReportTypeListRequest, + output: ReportTypeListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ScheduleProjectError = BadRequest | ModrinthOpError; +/** Schedule a project */ +export const scheduleProject: API.OperationMethod< + ScheduleProjectRequest, + ScheduleProjectResponse, + ScheduleProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ScheduleProjectRequest, + output: ScheduleProjectResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type ScheduleVersionError = BadRequest | ModrinthOpError; +/** Schedule a version */ +export const scheduleVersion: API.OperationMethod< + ScheduleVersionRequest, + ScheduleVersionResponse, + ScheduleVersionError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: ScheduleVersionRequest, + output: ScheduleVersionResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type SearchProjectsError = BadRequest | ModrinthOpError; +/** Search projects */ +export const searchProjects: API.OperationMethod< + SearchProjectsRequest, + SearchResults, + SearchProjectsError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: SearchProjectsRequest, + output: SearchResults, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type SendThreadMessageError = BadRequest | NotFound | ModrinthOpError; +/** Send a text message to a thread */ +export const sendThreadMessage: API.OperationMethod< + SendThreadMessageRequest, + Thread, + SendThreadMessageError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: SendThreadMessageRequest, + output: Thread, + errors: [BadRequest, NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type SideTypeListError = ModrinthOpError; +/** Get a list of side types Gets an array of valid side types */ +export const sideTypeList: API.OperationMethod< + SideTypeListRequest, + SideTypeListResponse, + SideTypeListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: SideTypeListRequest, + output: SideTypeListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type Statistics2Error = ModrinthOpError; +/** Various statistics about this Modrinth instance */ +export const statistics2: API.OperationMethod< + Statistics2Request, + Statistics, + Statistics2Error, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: Statistics2Request, + output: Statistics, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type SubmitReportError = BadRequest | ModrinthOpError; +/** Report a project, user, or version Bring a project, user, or version to the attention of the moderators by reporting it. */ +export const submitReport: API.OperationMethod< + SubmitReportRequest, + SubmitReportResponse, + SubmitReportError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: SubmitReportRequest, + output: SubmitReportResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type TransferTeamOwnershipError = NotFound | ModrinthOpError; +/** Transfer team's ownership to another user */ +export const transferTeamOwnership: API.OperationMethod< + TransferTeamOwnershipRequest, + TransferTeamOwnershipResponse, + TransferTeamOwnershipError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: TransferTeamOwnershipRequest, + output: TransferTeamOwnershipResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type UnfollowProjectError = BadRequest | ModrinthOpError; +/** Unfollow a project */ +export const unfollowProject: API.OperationMethod< + UnfollowProjectRequest, + UnfollowProjectResponse, + UnfollowProjectError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: UnfollowProjectRequest, + output: UnfollowProjectResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type VersionFromHashError = NotFound | ModrinthOpError; +/** Get version from hash */ +export const versionFromHash: API.OperationMethod< + VersionFromHashRequest, + VersionFromHashResponse, + VersionFromHashError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: VersionFromHashRequest, + output: VersionFromHashResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type VersionListError = ModrinthOpError; +/** Get a list of game versions Gets an array of game versions and information about them */ +export const versionList: API.OperationMethod< + VersionListRequest, + VersionListResponse, + VersionListError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: VersionListRequest, + output: VersionListResponse, + errors: [UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type VersionsFromHashesError = BadRequest | ModrinthOpError; +/** Get versions from hashes This is the same as [`/version_file/{hash}`](#operation/versionFromHash) except it accepts multiple hashes. */ +export const versionsFromHashes: API.OperationMethod< + VersionsFromHashesRequest, + VersionsFromHashesResponse, + VersionsFromHashesError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: VersionsFromHashesRequest, + output: VersionsFromHashesResponse, + errors: [BadRequest, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); + +export type WithdrawPayoutError = NotFound | ModrinthOpError; +/** Withdraw payout balance to PayPal or Venmo Warning: certain amounts get withheld for fees. Please do not call this API endpoint without first acknowledging the warnings on the corresponding frontend page. */ +export const withdrawPayout: API.OperationMethod< + WithdrawPayoutRequest, + WithdrawPayoutResponse, + WithdrawPayoutError, + ModrinthOpContext +> = /*@__PURE__*/ API.make(() => ({ + input: WithdrawPayoutRequest, + output: WithdrawPayoutResponse, + errors: [NotFound, UnknownModrinthError], + protocol: ModrinthProtocol, + retry: Retry.Retry, +})); diff --git a/packages/modrinth/src/traits.ts b/packages/modrinth/src/traits.ts new file mode 100644 index 000000000..85be8b2e4 --- /dev/null +++ b/packages/modrinth/src/traits.ts @@ -0,0 +1,44 @@ +/** + * Modrinth SDK trait surface — hand-written. + * + * Re-exports the generic protocol traits from core (so generated operations + * import everything from one place). Modrinth has no envelope of its own; the + * REST-protocol traits (SensitiveValue / RawResponse) come from + * `core/protocol-rest`. + */ +export { + Body, + Header, + Query, + Label, + Http, + ResponseCode, + HttpBody, + FormDataFile, + KeyDictionary, + UnionCases, + applyErrorMatchers, + getErrorMatchers, + type HttpTrait, + type ErrorMatcher, + bodySymbol, + headerSymbol, + querySymbol, + labelSymbol, + httpSymbol, + responseCodeSymbol, + httpBodySymbol, + formDataFileSymbol, + keyDictionarySymbol, + unionCasesSymbol, + errorMatchersSymbol, +} from "@distilled.cloud/core/trait"; + +export { + SensitiveValue, + RawResponse, + RawResponseRoot, + sensitiveValueSymbol, + rawResponseSymbol, + rawResponseRootSymbol, +} from "@distilled.cloud/core/protocol-rest"; diff --git a/packages/modrinth/tsconfig.json b/packages/modrinth/tsconfig.json new file mode 100644 index 000000000..56b16e575 --- /dev/null +++ b/packages/modrinth/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*.ts"], + "compilerOptions": { + "composite": true, + "noEmit": false, + "outDir": "./lib", + "rootDir": "./src", + "paths": { + "@distilled.cloud/core/*": ["../core/src/*"] + } + }, + "references": [{ "path": "../core" }] +} diff --git a/packages/modrinth/tsconfig.scripts.json b/packages/modrinth/tsconfig.scripts.json new file mode 100644 index 000000000..be37c3474 --- /dev/null +++ b/packages/modrinth/tsconfig.scripts.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["scripts/**/*.ts"], + "compilerOptions": { + "composite": true, + "noEmit": false, + "emitDeclarationOnly": true, + "outDir": "./.scripts-types", + "rootDir": "./scripts", + "tsBuildInfoFile": "./.scripts-types/tsconfig.scripts.tsbuildinfo", + // Resolve @distilled.cloud/core/* to src (the bun condition), matching + // how the scripts actually run under bun. + "rewriteRelativeImportExtensions": false, + "customConditions": ["bun"] + }, + "references": [{ "path": "../core" }] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a5b177f1..f3cb846eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -408,6 +408,25 @@ importers: specifier: catalog:tooling version: 26.4.0 + packages/modrinth: + dependencies: + '@distilled.cloud/core': + specifier: workspace:* + version: link:../core + effect: + specifier: catalog:effect + version: 4.0.0-rc.112 + devDependencies: + '@effect/platform-bun': + specifier: catalog:effect + version: 4.0.0-rc.112(effect@4.0.0-rc.112) + '@types/bun': + specifier: catalog:tooling + version: 1.4.0 + '@types/node': + specifier: catalog:tooling + version: 26.4.0 + packages/mongodb-atlas: dependencies: '@distilled.cloud/core': diff --git a/stacks/distilled-submodules/SpecRepos.ts b/stacks/distilled-submodules/SpecRepos.ts index 97e991a7b..c5d1819d9 100644 --- a/stacks/distilled-submodules/SpecRepos.ts +++ b/stacks/distilled-submodules/SpecRepos.ts @@ -62,6 +62,7 @@ export const SPEC_REPOS: readonly SpecRepo[] = [ { package: "hetzner" }, { package: "huggingface" }, { package: "kubernetes" }, + { package: "modrinth" }, { package: "mongodb-atlas" }, { package: "modal" }, { package: "neon" }, diff --git a/stacks/distilled-submodules/spec-repos/modrinth/fetch-specs.ts b/stacks/distilled-submodules/spec-repos/modrinth/fetch-specs.ts new file mode 100644 index 000000000..30916e469 --- /dev/null +++ b/stacks/distilled-submodules/spec-repos/modrinth/fetch-specs.ts @@ -0,0 +1,69 @@ +#!/usr/bin/env bun +/** + * Fetches the Modrinth Labrinth OpenAPI spec to ../specs/. + * + * Modrinth publishes ONE OpenAPI 3.0 document — the same file its docs site + * renders at https://docs.modrinth.com/openapi.yaml. There is no git repo + * and no versioned URL, so the mirror snapshots it as JSON. + * + * Usage: + * bun run fetch-specs.ts + * + * The spec is saved to: + * ../specs/openapi.json + */ + +const OPENAPI_SPEC_URL = "https://docs.modrinth.com/openapi.yaml"; +const SPECS_DIR = "../specs"; +const OUTPUT_PATH = `${SPECS_DIR}/openapi.json`; + +import { existsSync, mkdirSync } from "fs"; + +// Ensure the specs directory exists +if (!existsSync(SPECS_DIR)) { + mkdirSync(SPECS_DIR, { recursive: true }); +} + +async function main() { + console.log(`Fetching OpenAPI spec from ${OPENAPI_SPEC_URL}...`); + + const response = await fetch(OPENAPI_SPEC_URL, { + headers: { + accept: "application/yaml, text/yaml, application/json", + "user-agent": "distilled.cloud-modrinth-spec-mirror", + }, + }); + + if (!response.ok) { + throw new Error( + `Failed to fetch OpenAPI spec: ${response.status} ${response.statusText}`, + ); + } + + const spec = Bun.YAML.parse(await response.text()) as Record; + + // Fail here rather than three steps later in the generator: a login page or + // a gutted response is still valid YAML, but it is not an OpenAPI document. + if ( + (typeof spec.openapi !== "string" && typeof spec.swagger !== "string") || + spec.paths === undefined + ) { + throw new Error( + `${OPENAPI_SPEC_URL} returned YAML/JSON without \`openapi\`/\`swagger\`/\`paths\` — not an OpenAPI document`, + ); + } + + console.log(`Writing spec to ${OUTPUT_PATH}...`); + // 2-space indent + trailing newline so a whitespace-only change upstream + // produces no diff. + await Bun.write(OUTPUT_PATH, JSON.stringify(spec, null, 2) + "\n"); + + console.log( + `Done! OpenAPI ${spec.openapi ?? spec.swagger} — ${Object.keys(spec.paths as object).length} paths`, + ); +} + +main().catch((err) => { + console.error("Fatal error:", err); + process.exit(1); +}); diff --git a/stacks/distilled-submodules/spec-repos/modrinth/package.json b/stacks/distilled-submodules/spec-repos/modrinth/package.json new file mode 100644 index 000000000..43969a1e9 --- /dev/null +++ b/stacks/distilled-submodules/spec-repos/modrinth/package.json @@ -0,0 +1,27 @@ +{ + "name": "modrinth-spec", + "private": true, + "type": "module", + "scripts": { + "fetch-specs": "bun run fetch-specs.ts", + "tsc": "tsc --noEmit", + "lint": "oxlint .", + "fmt": "oxfmt --write .", + "fmt:check": "oxfmt --check .", + "check": "bun run tsc && bun run lint && bun run fmt:check" + }, + "workspaces": { + "catalog": { + "@typescript/native-preview": "latest", + "oxfmt": "0.21.0", + "oxlint": "1.36.0" + } + }, + "dependencies": { + "@typescript/native-preview": "catalog:" + }, + "devDependencies": { + "oxfmt": "catalog:", + "oxlint": "catalog:" + } +} diff --git a/stacks/distilled-submodules/spec-repos/modrinth/readme.md b/stacks/distilled-submodules/spec-repos/modrinth/readme.md new file mode 100644 index 000000000..46b5d2634 --- /dev/null +++ b/stacks/distilled-submodules/spec-repos/modrinth/readme.md @@ -0,0 +1,26 @@ +# spec-mirror-modrinth + +A git mirror of Modrinth's [OpenAPI spec](https://docs.modrinth.com/openapi.yaml). The spec is fetched and committed as a JSON file so the repo serves as a versioned snapshot. + +The mirror is updated every 24 hours and is designed to be used as a stable git submodule. + +## Usage as a submodule + +```sh +git submodule add https://github.com/distilled-mirror/spec-mirror-modrinth.git +``` + +## Updating specs + +From `.meta/`: + +```sh +bun install +bun run fetch-specs +``` + +--- + +This repository is managed by the `distilled-submodules` Alchemy stack in +[alchemy-run/distilled](https://github.com/alchemy-run/distilled) (`stacks/distilled-submodules`). +Its scaffolding is generated — edit it there, not here. diff --git a/tsconfig.json b/tsconfig.json index 7289e61be..cd1b68f92 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,60 +1,176 @@ { "files": [], "references": [ - { "path": "./packages/core/tsconfig.json" }, - { "path": "./packages/cloudflare/tsconfig.json" }, - { "path": "./packages/cloudflare/tsconfig.scripts.json" }, - { "path": "./packages/aws/tsconfig.json" }, - { "path": "./packages/aws/tsconfig.scripts.json" }, - { "path": "./packages/axiom/tsconfig.json" }, - { "path": "./packages/axiom/tsconfig.scripts.json" }, - { "path": "./packages/azure/tsconfig.json" }, - { "path": "./packages/azure/tsconfig.scripts.json" }, - { "path": "./packages/coinbase/tsconfig.json" }, - { "path": "./packages/coinbase/tsconfig.scripts.json" }, - { "path": "./packages/discord/tsconfig.json" }, - { "path": "./packages/discord/tsconfig.scripts.json" }, - { "path": "./packages/expo-eas/tsconfig.json" }, - { "path": "./packages/expo-eas/tsconfig.scripts.json" }, - { "path": "./packages/fly-io/tsconfig.json" }, - { "path": "./packages/fly-io/tsconfig.scripts.json" }, - { "path": "./packages/gcp/tsconfig.json" }, - { "path": "./packages/gcp/tsconfig.scripts.json" }, - { "path": "./packages/github/tsconfig.json" }, - { "path": "./packages/github/tsconfig.scripts.json" }, - { "path": "./packages/hetzner/tsconfig.json" }, - { "path": "./packages/hetzner/tsconfig.scripts.json" }, - { "path": "./packages/huggingface/tsconfig.json" }, - { "path": "./packages/huggingface/tsconfig.scripts.json" }, - { "path": "./packages/kubernetes/tsconfig.json" }, - { "path": "./packages/kubernetes/tsconfig.scripts.json" }, - { "path": "./packages/mongodb-atlas/tsconfig.json" }, - { "path": "./packages/mongodb-atlas/tsconfig.scripts.json" }, - { "path": "./packages/modal/tsconfig.json" }, - { "path": "./packages/modal/tsconfig.scripts.json" }, - { "path": "./packages/neon/tsconfig.json" }, - { "path": "./packages/neon/tsconfig.scripts.json" }, - { "path": "./packages/planetscale/tsconfig.json" }, - { "path": "./packages/planetscale/tsconfig.scripts.json" }, - { "path": "./packages/posthog/tsconfig.json" }, - { "path": "./packages/posthog/tsconfig.scripts.json" }, - { "path": "./packages/prisma-postgres/tsconfig.json" }, - { "path": "./packages/prisma-postgres/tsconfig.scripts.json" }, - { "path": "./packages/railway/tsconfig.json" }, - { "path": "./packages/railway/tsconfig.scripts.json" }, - { "path": "./packages/stripe/tsconfig.json" }, - { "path": "./packages/stripe/tsconfig.scripts.json" }, - { "path": "./packages/supabase/tsconfig.json" }, - { "path": "./packages/supabase/tsconfig.scripts.json" }, - { "path": "./packages/turso/tsconfig.json" }, - { "path": "./packages/turso/tsconfig.scripts.json" }, - { "path": "./packages/typesense/tsconfig.json" }, - { "path": "./packages/typesense/tsconfig.scripts.json" }, - { "path": "./packages/vercel/tsconfig.json" }, - { "path": "./packages/vercel/tsconfig.scripts.json" }, - { "path": "./packages/whop/tsconfig.json" }, - { "path": "./packages/whop/tsconfig.scripts.json" }, - { "path": "./packages/workos/tsconfig.json" }, - { "path": "./packages/workos/tsconfig.scripts.json" } + { + "path": "./packages/core/tsconfig.json" + }, + { + "path": "./packages/cloudflare/tsconfig.json" + }, + { + "path": "./packages/cloudflare/tsconfig.scripts.json" + }, + { + "path": "./packages/aws/tsconfig.json" + }, + { + "path": "./packages/aws/tsconfig.scripts.json" + }, + { + "path": "./packages/axiom/tsconfig.json" + }, + { + "path": "./packages/axiom/tsconfig.scripts.json" + }, + { + "path": "./packages/azure/tsconfig.json" + }, + { + "path": "./packages/azure/tsconfig.scripts.json" + }, + { + "path": "./packages/coinbase/tsconfig.json" + }, + { + "path": "./packages/coinbase/tsconfig.scripts.json" + }, + { + "path": "./packages/discord/tsconfig.json" + }, + { + "path": "./packages/discord/tsconfig.scripts.json" + }, + { + "path": "./packages/expo-eas/tsconfig.json" + }, + { + "path": "./packages/expo-eas/tsconfig.scripts.json" + }, + { + "path": "./packages/fly-io/tsconfig.json" + }, + { + "path": "./packages/fly-io/tsconfig.scripts.json" + }, + { + "path": "./packages/gcp/tsconfig.json" + }, + { + "path": "./packages/gcp/tsconfig.scripts.json" + }, + { + "path": "./packages/github/tsconfig.json" + }, + { + "path": "./packages/github/tsconfig.scripts.json" + }, + { + "path": "./packages/hetzner/tsconfig.json" + }, + { + "path": "./packages/hetzner/tsconfig.scripts.json" + }, + { + "path": "./packages/huggingface/tsconfig.json" + }, + { + "path": "./packages/huggingface/tsconfig.scripts.json" + }, + { + "path": "./packages/kubernetes/tsconfig.json" + }, + { + "path": "./packages/kubernetes/tsconfig.scripts.json" + }, + { + "path": "./packages/modal/tsconfig.json" + }, + { + "path": "./packages/modal/tsconfig.scripts.json" + }, + { + "path": "./packages/modrinth/tsconfig.json" + }, + { + "path": "./packages/modrinth/tsconfig.scripts.json" + }, + { + "path": "./packages/mongodb-atlas/tsconfig.json" + }, + { + "path": "./packages/mongodb-atlas/tsconfig.scripts.json" + }, + { + "path": "./packages/neon/tsconfig.json" + }, + { + "path": "./packages/neon/tsconfig.scripts.json" + }, + { + "path": "./packages/planetscale/tsconfig.json" + }, + { + "path": "./packages/planetscale/tsconfig.scripts.json" + }, + { + "path": "./packages/posthog/tsconfig.json" + }, + { + "path": "./packages/posthog/tsconfig.scripts.json" + }, + { + "path": "./packages/prisma-postgres/tsconfig.json" + }, + { + "path": "./packages/prisma-postgres/tsconfig.scripts.json" + }, + { + "path": "./packages/railway/tsconfig.json" + }, + { + "path": "./packages/railway/tsconfig.scripts.json" + }, + { + "path": "./packages/stripe/tsconfig.json" + }, + { + "path": "./packages/stripe/tsconfig.scripts.json" + }, + { + "path": "./packages/supabase/tsconfig.json" + }, + { + "path": "./packages/supabase/tsconfig.scripts.json" + }, + { + "path": "./packages/turso/tsconfig.json" + }, + { + "path": "./packages/turso/tsconfig.scripts.json" + }, + { + "path": "./packages/typesense/tsconfig.json" + }, + { + "path": "./packages/typesense/tsconfig.scripts.json" + }, + { + "path": "./packages/vercel/tsconfig.json" + }, + { + "path": "./packages/vercel/tsconfig.scripts.json" + }, + { + "path": "./packages/whop/tsconfig.json" + }, + { + "path": "./packages/whop/tsconfig.scripts.json" + }, + { + "path": "./packages/workos/tsconfig.json" + }, + { + "path": "./packages/workos/tsconfig.scripts.json" + } ] }