diff --git a/docusaurus.config.js b/docusaurus.config.js index eed2ee41d5..3035e9bea5 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -21,6 +21,7 @@ import MoodleBannerRemark from './src/remark/moodleBanner.js'; import TrackerLinksRemark from './src/remark/trackerLinks.js'; import UnversionedDocsLinksRemark from './src/remark/unversionedDocsLinks.js'; import * as nextVersion from './nextVersion.js'; +import { updateMarketplaceApiSpec } from './src/utils/marketplaceApiSpec.js'; // eslint-disable global-require @@ -122,6 +123,25 @@ const config = { }, }), ], + + // Moodle Marketplace API reference. + // Rendered with Redoc in general/community/plugincontribution/moodlemarketplaceapi.mdx. + // The spec is refreshed from the Marketplace on every build (see the default export below). + [ + 'redocusaurus', + { + specs: [ + { + id: 'marketplace-api', + spec: 'static/marketplace-api/openapi.json', + url: '/marketplace-api/openapi.json', + }, + ], + theme: { + primaryColor: '#bd5b00', + }, + }, + ], ], /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ @@ -241,4 +261,10 @@ const config = { ], }; -export default config; +export default async function createConfig() { + // Keep the Marketplace API reference up to date. + // The committed copy is used if the Marketplace is unreachable. + await updateMarketplaceApiSpec(); + + return config; +} diff --git a/general/community/plugincontribution/moodlemarketplaceapi.md b/general/community/plugincontribution/moodlemarketplaceapi.md deleted file mode 100644 index 019c7becac..0000000000 --- a/general/community/plugincontribution/moodlemarketplaceapi.md +++ /dev/null @@ -1,232 +0,0 @@ ---- -title: Moodle Marketplace API -sidebar_position: 2 -sidebar_label: Moodle Marketplace API -tags: - - Guidelines for contributors - - Plugins - - Plugin documentation - - Moodle Marketplace ---- - -Use the Moodle Marketplace API to access Moodle Marketplace data and automate tasks such as submitting new plugin versions. - -This guide explains how to authenticate with the API, submit plugin versions and automate plugin version submission from CI. - ---- - -## Contents - -- [Authentication](#authentication) -- [Conventions](#conventions) -- [Add a new plugin version](#add-a-new-plugin-version) -- [API limitations](#api-limitations) - ---- - -## Authentication - -All Moodle Marketplace API endpoints require a bearer token. - -### Create an API token - -1. Log in to Moodle Marketplace. -2. Go to **Account → Security** (https://marketplace.moodle.com/account/security). -3. Under **API tokens**, create a token. Give it a name you'll recognise and, optionally, set an expiry date. - -> **Save your token when you create it.** The token is shown only once and is available for 60 seconds. If you lose it, you'll need to revoke it and create a new one. - -You can have up to 10 active API tokens. - -Treat API tokens like passwords. A token has the same access to Moodle Marketplace as the account that created it. - -### Use an API token - -Include the token as a bearer token in the `Authorization` header: - -```text -Authorization: Bearer YOUR_TOKEN -``` - -### Troubleshoot authentication - -A missing, malformed, expired or revoked token returns a `401` response from the API rather than redirecting you to the login page. - -If you receive an unexpected `401`, check that: - -- the token has not expired or been revoked -- your HTTP client is not removing the `Authorization` header when following a redirect - ---- - -## Conventions - -### Content type - -All responses use `application/json`. - -### Dates - -Dates use ISO 8601 format with a timezone offset: - -```text -2025-08-21T14:03:00+00:00 -``` - ---- - -## Add a new plugin version - -Use this endpoint to submit a new version of a plugin you maintain: - -```text -POST https://marketplace.moodle.com/api/plugins/{frankenstyle}/versions -``` - -You must be a maintainer of the plugin. Requests use `multipart/form-data`. - -You can submit a plugin ZIP package either by uploading the file or providing a URL. - -### Upload a plugin ZIP package - -```bash -curl -s -X POST \ - -H "Authorization: Bearer $MKPL_TOKEN" \ - -F "file=@mod_quiz.zip" \ - -F "releaseNotes=Fixes the grade calculation for group submissions" \ - -F "vcsTag=v1.4.0" \ - "https://marketplace.moodle.com/api/plugins/mod_quiz/versions" -``` - -### Submit a plugin ZIP package by URL - -If the plugin ZIP package is already available online, provide its URL and Moodle Marketplace will retrieve it: - -```bash -curl -s -X POST \ - -H "Authorization: Bearer $MKPL_TOKEN" \ - -F "fileUrl=https://github.com/example/moodle-mod_quiz/releases/download/v1.4.0/mod_quiz.zip" \ - "https://marketplace.moodle.com/api/plugins/mod_quiz/versions" -``` - -The URL must use `https` and resolve to a publicly accessible address. - -### What you send, and what you must not - -Submit a plugin ZIP package using **either** `file` or `fileUrl`. If you provide both or neither, the API returns a `422` response. - -Moodle Marketplace gets the following information from the package's `version.php` file: - -- build number -- release name -- maturity -- supported Moodle versions - -You can't provide or override these values through the API. - -The following fields are optional: - -| Field | Description | -| --- | --- | -| `releaseNotes` | What changed in this release | -| `vcsRepositoryUrl` | Repository the package was built from | -| `vcsBranch` | Branch the package was built from | -| `vcsTag` | Tag the package was built from | - -### Response - -A successful submission returns a `201` response with the created version: - -```json -{ - "id": 871, - "version": "2025082100", - "releaseName": "1.4.0", - "maturity": "STABLE", - "status": "in_testing", - "moodleVersions": ["4.5", "5.0"], - "releaseNotes": "Fixes the grade calculation for group submissions", - "vcsTag": "v1.4.0", - "createdAt": "2025-08-21T14:03:00+00:00" -} -``` - -The `status` is `in_testing`, not `uploaded`. Submitting a version immediately queues it for automated prechecks, so `uploaded` is an internal status that you won't see. Do not poll for it. - -### If it fails - -| Status | Cause | -| --- | --- | -| `403` Forbidden | You don't maintain this plugin. | -| `404` Not found | No plugin exists with this frankenstyle. | -| `409` Conflict | The plugin is in a state that does not accept new versions. | -| `422` Unprocessable Content | Both `file` and `fileUrl` were provided, or neither was provided. | -| `422` Unprocessable Content | The file isn't a ZIP file or doesn't contain a valid `version.php`. | -| `422` Unprocessable Content | The build number already exists for this plugin. | -| `422` Unprocessable Content | `fileUrl` doesn't use `https`, is unreachable or doesn't resolve to a public address. | -| `422` Unprocessable Content | The plugin ZIP package exceeds the Moodle Marketplace size limit. | - -If a submission fails, no version is created. Fix the issue and submit the version again. - ---- - -### Automate plugin version submission from CI - -You can use the Moodle Marketplace API to submit a new plugin version automatically as part of a continuous integration (CI) workflow. - -:::info - -For releasing a new plugin version using GitHub Actions, follow the setup instructions at [moodlehq/moodle-plugin-release](https://github.com/moodlehq/moodle-plugin-release) - -::: - -The following example shows a basic release job: - -```bash -#!/usr/bin/env bash -set -euo pipefail - -: "${MKPL_TOKEN:?set MKPL_TOKEN}" # a secret in your CI settings, never in the repo -PLUGIN_FRANKENSTYLE="mod_quiz" -BASE=https://marketplace.moodle.com/api - -response=$(curl -sS -w '\n%{http_code}' -X POST \ - -H "Authorization: Bearer $MKPL_TOKEN" \ - -F "file=@build/mod_quiz.zip" \ - -F "releaseNotes=$(git tag -l --format='%(contents)' "$GIT_TAG")" \ - -F "vcsRepositoryUrl=$REPO_URL" \ - -F "vcsTag=$GIT_TAG" \ - "$BASE/plugins/$PLUGIN_FRANKENSTYLE/versions") - -status=$(tail -n1 <<<"$response") -body=$(sed '$d' <<<"$response") - -if [[ "$status" != "201" ]]; then - echo "Submission failed ($status):" >&2 - jq -r '.violations[]? | " \(.propertyPath): \(.message)"' <<<"$body" >&2 || echo "$body" >&2 - exit 1 -fi - -echo "Submitted version $(jq -r .version <<<"$body"), status $(jq -r .status <<<"$body")" -``` - -### Recommendations - -- **Store the token as a CI secret.** Never store it in the repository. Give the token a name that identifies the pipeline so you can revoke it independently if the pipeline is compromised. -- **Fail the job on any response other than `201`.** Print `violations` to show the reason for the failure. -- **Do not retry a `422` response.** The request will fail again without changes. Retry only `5xx` responses and connection errors. -- **Submitting is not publishing.** A `201` response means the version has been accepted for automated prechecks. - ---- - -## API limitations - -- **Editing versions:** You cannot edit a version through the API after submitting it. To correct version information, edit the version in Moodle Marketplace. -- **Plugin ZIP package size:** The same size limit applies as when uploading a plugin ZIP package through Moodle Marketplace. If the package exceeds the limit, the API returns a `422` response. -- **Remote file retrieval:** Moodle Marketplace stops trying to retrieve a file after 10 seconds or as soon as it exceeds the size limit. If the host is slow, upload the plugin ZIP package instead. - -:::tip - -Something missing or not working as expected? [Contact](https://moodle.atlassian.net/servicedesk/customer/portal/166) the Moodle Marketplace team. The API is still evolving, and your feedback can help shape future improvements. - -::: diff --git a/general/community/plugincontribution/moodlemarketplaceapi.mdx b/general/community/plugincontribution/moodlemarketplaceapi.mdx new file mode 100644 index 0000000000..59c90e4d97 --- /dev/null +++ b/general/community/plugincontribution/moodlemarketplaceapi.mdx @@ -0,0 +1,17 @@ +--- +title: Moodle Marketplace API +sidebar_position: 2 +sidebar_label: Moodle Marketplace API +hide_title: true +hide_table_of_contents: true +description: Reference documentation for the Moodle Marketplace API. +tags: + - Guidelines for contributors + - Plugins + - Plugin documentation + - Moodle Marketplace +--- + +import ApiDocMdx from '@theme/ApiDocMdx'; + + diff --git a/general/community/plugincontribution/pluginsdirectory/api.md b/general/community/plugincontribution/pluginsdirectory/api.md index 2c78dd8618..f55a71bed1 100644 --- a/general/community/plugincontribution/pluginsdirectory/api.md +++ b/general/community/plugincontribution/pluginsdirectory/api.md @@ -9,7 +9,7 @@ tags: :::warning -This page describes the Plugins Directory API, not [Moodle Marketplace APIs](general/community/plugincontribution/moodlemarketplaceapi.md). +This page describes the Plugins Directory API, not [Moodle Marketplace APIs](../moodlemarketplaceapi.mdx). For current Moodle Marketplace documentation, see [Moodle Marketplace documentation](https://moodle.atlassian.net/wiki/external/YTI4MmY4MWU2MDQyNDk5MTllZWY4YTBiNjA5ZDRjNWY). diff --git a/package.json b/package.json index f2a766b794..accafaad82 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,9 @@ "@docusaurus/faster": "^3.10.2", "@docusaurus/plugin-pwa": "^3.10.2", "@docusaurus/preset-classic": "^3.10.2", + "@docusaurus/theme-common": "^3.10.2", "@docusaurus/theme-mermaid": "^3.10.2", + "@docusaurus/utils": "^3.10.2", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "@mdx-js/react": "^3.0.0", @@ -58,6 +60,7 @@ "react": "19", "react-dom": "19", "react-player": "^2.16.0", + "redocusaurus": "^2.5.2", "unist-util-find": "^3.0.0", "unist-util-visit": "^5.0.0" }, diff --git a/src/css/custom.css b/src/css/custom.css index 8daba563b9..3a05425966 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -143,6 +143,9 @@ html { footer.theme-doc-footer .theme-doc-footer-edit-meta-row { position: sticky; bottom: 0; + + /* Stay above positioned page content, such as the Redoc API reference. */ + z-index: 2; background-color: var(--ifm-background-color); margin-top: 0.5rem; padding-top: 0.5rem; @@ -170,3 +173,13 @@ ul ol { .roadmap-table table tbody tr:nth-child(3) { background-color: #fef7c8; } .roadmap-table table tbody tr:nth-child(4) { background-color: #ffeceb; } .roadmap-table table tbody tr:nth-child(5) { background-color: #f8eefe; } + +/* Show the Redoc menu on the right, like the table of contents on other pages. */ +.redocusaurus .redoc-wrap { + flex-direction: row-reverse; +} + +.redocusaurus .menu-content { + border-right: none; + border-left: 1px solid var(--ifm-toc-border-color); +} diff --git a/src/utils/marketplaceApiSpec.js b/src/utils/marketplaceApiSpec.js new file mode 100644 index 0000000000..3b61910c46 --- /dev/null +++ b/src/utils/marketplaceApiSpec.js @@ -0,0 +1,92 @@ +/** + * Copyright (c) Moodle Pty Ltd. + * + * Moodle is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Moodle is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moodle. If not, see . + */ + +const fs = require('fs/promises'); +const path = require('path'); + +const specUrl = 'https://marketplace.next.moodle.org/api/docs.jsonopenapi'; + +// The copy of the spec used to build the site. +// It is committed so that the site still builds when the Marketplace is unreachable. +const specFile = path.join(__dirname, '../../static/marketplace-api/openapi.json'); + +/** + * Make site-relative links in the spec point to the Marketplace instead of this site. + * + * Covers Markdown links, e.g. [security settings](/account/security), and HTML href/src attributes. + * + * @param {*} value Any value from the spec. + * @param {string} origin The Marketplace origin. + * @returns {*} + */ +const absolutiseLinks = (value, origin) => { + if (typeof value === 'string') { + return value + .replace(/\]\(\/(?!\/)/g, `](${origin}/`) + .replace(/\b(?href|src)=(?["'])\/(?!\/)/g, `$=$${origin}/`); + } + if (Array.isArray(value)) { + return value.map((item) => absolutiseLinks(item, origin)); + } + if (value && typeof value === 'object') { + return Object.fromEntries( + Object.entries(value).map(([key, item]) => [key, absolutiseLinks(item, origin)]), + ); + } + + return value; +}; + +/** + * Refresh the local copy of the Marketplace API spec from the Marketplace. + * + * If the Marketplace cannot be reached, or returns something that is not an OpenAPI spec, + * the committed copy is kept and used instead. + * + * @returns {Promise} The path to the spec file. + */ +const updateMarketplaceApiSpec = async () => { + try { + const response = await fetch(specUrl, { signal: AbortSignal.timeout(15000) }); + if (!response.ok) { + throw new Error(`HTTP ${response.status}`); + } + const spec = await response.json(); + if (!spec?.openapi || !spec?.paths) { + throw new Error('The response is not an OpenAPI spec'); + } + + const content = `${JSON.stringify(absolutiseLinks(spec, new URL(specUrl).origin), null, 2)}\n`; + const current = await fs.readFile(specFile, 'utf8').catch(() => null); + if (content !== current) { + await fs.mkdir(path.dirname(specFile), { recursive: true }); + await fs.writeFile(specFile, content); + } + } catch (error) { + const message = `Unable to fetch the Marketplace API spec from ${specUrl}: ${error.message}`; + await fs.access(specFile).catch(() => { + throw new Error(`${message}. No local copy exists.`); + }); + console.warn(`[WARNING] ${message}. Using the local copy.`); + } + + return specFile; +}; + +module.exports = { + updateMarketplaceApiSpec, +}; diff --git a/src/utils/marketplaceApiSpec.test.js b/src/utils/marketplaceApiSpec.test.js new file mode 100644 index 0000000000..cb6c70204f --- /dev/null +++ b/src/utils/marketplaceApiSpec.test.js @@ -0,0 +1,176 @@ +/** + * Copyright (c) Moodle Pty Ltd. + * + * Moodle is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Moodle is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moodle. If not, see . + */ + +const fs = require('fs/promises'); +const path = require('path'); +const { updateMarketplaceApiSpec } = require('./marketplaceApiSpec'); + +jest.mock('fs/promises'); + +const specUrl = 'https://marketplace.next.moodle.org/api/docs.jsonopenapi'; +const specFile = path.join(__dirname, '../../static/marketplace-api/openapi.json'); + +const remoteSpec = { + openapi: '3.1.0', + info: { + title: 'Moodle Marketplace API', + description: 'Create a token from your [security settings](/account/security).', + }, + paths: {}, +}; + +const expectedContent = `${JSON.stringify({ + ...remoteSpec, + info: { + ...remoteSpec.info, + description: 'Create a token from your [security settings](https://marketplace.next.moodle.org/account/security).', + }, +}, null, 2)}\n`; + +const jsonResponse = (body, status = 200) => ({ + ok: status >= 200 && status < 300, + status, + json: async () => body, +}); + +describe('updateMarketplaceApiSpec', () => { + let warn; + + beforeEach(() => { + jest.resetAllMocks(); + jest.spyOn(global, 'fetch').mockImplementation(); + warn = jest.spyOn(console, 'warn').mockImplementation(() => {}); + + // By default, a local copy exists with older content. + fs.readFile.mockResolvedValue('{}\n'); + fs.access.mockResolvedValue(); + fs.mkdir.mockResolvedValue(); + fs.writeFile.mockResolvedValue(); + }); + + afterEach(() => { + jest.restoreAllMocks(); + }); + + describe('when the Marketplace returns a valid spec', () => { + it('fetches the spec with a 15 second timeout', async () => { + const { signal } = new AbortController(); + const timeout = jest.spyOn(AbortSignal, 'timeout').mockReturnValue(signal); + global.fetch.mockResolvedValue(jsonResponse(remoteSpec)); + + await updateMarketplaceApiSpec(); + + expect(timeout).toHaveBeenCalledWith(15000); + expect(global.fetch).toHaveBeenCalledWith(specUrl, { signal }); + }); + + it('replaces the local copy with the rewritten spec', async () => { + global.fetch.mockResolvedValue(jsonResponse(remoteSpec)); + + await expect(updateMarketplaceApiSpec()).resolves.toBe(specFile); + + expect(fs.mkdir).toHaveBeenCalledWith(path.dirname(specFile), { recursive: true }); + expect(fs.writeFile).toHaveBeenCalledWith(specFile, expectedContent); + expect(warn).not.toHaveBeenCalled(); + }); + + it('creates the local copy when none exists', async () => { + global.fetch.mockResolvedValue(jsonResponse(remoteSpec)); + fs.readFile.mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' })); + + await expect(updateMarketplaceApiSpec()).resolves.toBe(specFile); + + expect(fs.writeFile).toHaveBeenCalledWith(specFile, expectedContent); + }); + + it('leaves the local copy untouched when the spec has not changed', async () => { + global.fetch.mockResolvedValue(jsonResponse(remoteSpec)); + fs.readFile.mockResolvedValue(expectedContent); + + await expect(updateMarketplaceApiSpec()).resolves.toBe(specFile); + + expect(fs.writeFile).not.toHaveBeenCalled(); + expect(warn).not.toHaveBeenCalled(); + }); + }); + + describe('when the Marketplace cannot provide the spec', () => { + it.each([ + [ + 'an HTTP error', + () => global.fetch.mockResolvedValue(jsonResponse({ title: 'Service Unavailable' }, 503)), + 'HTTP 503', + ], + [ + 'a timeout', + () => global.fetch.mockRejectedValue( + new DOMException('The operation was aborted due to timeout', 'TimeoutError'), + ), + 'The operation was aborted due to timeout', + ], + [ + 'a network error', + () => global.fetch.mockRejectedValue(new TypeError('fetch failed')), + 'fetch failed', + ], + [ + 'a response that is not JSON', + () => global.fetch.mockResolvedValue({ + ok: true, + status: 200, + json: async () => { + throw new SyntaxError('Unexpected token < in JSON at position 0'); + }, + }), + 'Unexpected token < in JSON at position 0', + ], + [ + 'a JSON response that is not an OpenAPI spec', + () => global.fetch.mockResolvedValue(jsonResponse({ error: 'Not found' })), + 'The response is not an OpenAPI spec', + ], + [ + 'an OpenAPI response without paths', + () => global.fetch.mockResolvedValue(jsonResponse({ openapi: '3.1.0', info: {} })), + 'The response is not an OpenAPI spec', + ], + ])('falls back to the local copy on %s', async (_, mockFailure, reason) => { + mockFailure(); + + await expect(updateMarketplaceApiSpec()).resolves.toBe(specFile); + + expect(fs.access).toHaveBeenCalledWith(specFile); + expect(fs.writeFile).not.toHaveBeenCalled(); + expect(warn).toHaveBeenCalledTimes(1); + expect(warn).toHaveBeenCalledWith( + `[WARNING] Unable to fetch the Marketplace API spec from ${specUrl}: ${reason}. Using the local copy.`, + ); + }); + + it('fails the build when there is no local copy to fall back to', async () => { + global.fetch.mockResolvedValue(jsonResponse({}, 503)); + fs.access.mockRejectedValue(Object.assign(new Error('ENOENT'), { code: 'ENOENT' })); + + await expect(updateMarketplaceApiSpec()).rejects.toThrow( + `Unable to fetch the Marketplace API spec from ${specUrl}: HTTP 503. No local copy exists.`, + ); + + expect(fs.writeFile).not.toHaveBeenCalled(); + expect(warn).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/static/marketplace-api/openapi.json b/static/marketplace-api/openapi.json new file mode 100644 index 0000000000..00e39dc61c --- /dev/null +++ b/static/marketplace-api/openapi.json @@ -0,0 +1,421 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Moodle Marketplace API", + "description": "Programmatic access to the Moodle Marketplace: browse the plugin catalogue and submit new\nversions of the plugins you maintain.\n\n## Authenticating\n\nEvery request needs a bearer token. Create one from your account's\n[security settings](https://marketplace.next.moodle.org/account/security), under **API tokens**.\n\n> The raw token is shown **once**, in a dialog that stops offering it after 60 seconds. It is\n> stored hashed and cannot be retrieved later, only replaced. You may hold up to **10 active\n> tokens**; past that, revoke one before creating another.\n\nSend it on every call:\n\n```\nAuthorization: Bearer YOUR_TOKEN\n```\n\nTo try the endpoints from this page, click **Authorize** above and paste the raw token — with\nno `Bearer ` prefix, Swagger adds it for you.\n\nA missing, malformed, expired or revoked token gives `401`. Tokens act as you: an endpoint\nreturns exactly what your user account is allowed to see or do.\n\n## Responses\n\nEverything is plain JSON (`application/json`). Collections are **bare JSON arrays**.\n\nThere is **no pagination**: a collection returns everything you are allowed to see in one\nresponse.\n\n## Errors\n\nFailures answer with the appropriate status code and an\n[RFC 9457](https://www.rfc-editor.org/rfc/rfc9457) `application/problem+json` body. There is no\nsuccess flag to check in the body — the status code is the answer.\n\n```json\n{\n \"status\": 422,\n \"title\": \"An error occurred\",\n \"detail\": \"file: The archive does not contain a valid version.php.\",\n \"violations\": [\n { \"propertyPath\": \"file\", \"message\": \"The archive does not contain a valid version.php.\" }\n ]\n}\n```\n\n| Status | Meaning |\n| --- | --- |\n| `400` Bad request | The request itself was malformed. |\n| `401` Unauthorized | No token, or the token is not valid. |\n| `403` Forbidden | Authenticated, but not allowed to see or change this resource. |\n| `404` Not found | No such resource. |\n| `406` Not acceptable | You asked for a media type this API does not serve. |\n| `409` Conflict | The resource is in a state that does not allow this operation. |\n| `422` Unprocessable Content | The request was well formed but its contents were rejected. See `violations`. |\n\n`violations` lists one entry per problem, each with the offending `propertyPath` and a\nhuman-readable `message`. Show those to the user; do not parse the messages.\n\n## Stability\n\nThis is version 1 of a young API and it will grow. **New fields may be added to any response\nwithout notice**, so parse defensively and ignore what you do not recognise. Fields will not be\nremoved or change meaning within `v1`.", + "version": "1.0.0" + }, + "servers": [ + { + "url": "/", + "description": "" + } + ], + "paths": { + "/api/plugins/{frankenStyle}/versions": { + "post": { + "operationId": "api_plugins_frankenStyleversions_post", + "tags": [ + "Version" + ], + "responses": { + "201": { + "description": "The plugin version was submitted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VersionCreate" + } + } + }, + "links": {} + }, + "400": { + "description": "Invalid input", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + }, + "links": {} + }, + "401": { + "description": "Missing or invalid token." + }, + "403": { + "description": "You do not have permission to maintain this plugin." + }, + "404": { + "description": "No plugin with that frankenStyle exists." + }, + "409": { + "description": "The plugin state does not accept new versions." + }, + "422": { + "description": "The archive was rejected, or the request named no usable source for it. See \"violations\".", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ConstraintViolation" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConstraintViolation" + } + } + }, + "links": {} + } + }, + "summary": "Adds a new version release of a plugin", + "description": "Submits a new version of a plugin you have permission to maintain, as `multipart/form-data`.\n\nGive the archive **exactly one** way: upload it in `file`, or point at it over HTTPS in `fileUrl`. Sending both, or neither, is a 422.\n\nThe build number, release name, maturity and supported Moodle versions are read out of the archive's `version.php` — do not send them, they cannot be overridden. The remaining fields are optional and are the only things the archive cannot tell us.\n\nOn success you get **201** with the created version. Its `status` normally reads `in_testing` rather than `uploaded`: submitting a version queues it for automated pre-check straight away, so `uploaded` is never observable. Do not poll for it.\n\nA rejected archive answers **422** with one entry per problem under `violations`. The same shape covers a bad URL, an unreachable one, and an archive over the size limit.", + "parameters": [ + { + "name": "frankenStyle", + "in": "path", + "description": "Component name of the plugin in its full frankenstyle format.", + "required": true, + "deprecated": false, + "schema": { + "type": "string" + }, + "style": "simple", + "explode": false + } + ], + "requestBody": { + "description": "The new VersionCreate resource", + "content": { + "multipart/form-data": { + "schema": { + "$ref": "#/components/schemas/VersionCreate.VersionCreateInput.multipart" + } + } + }, + "required": true + } + } + } + }, + "components": { + "schemas": { + "ConstraintViolation": { + "type": "object", + "description": "Unprocessable entity", + "properties": { + "status": { + "default": 422, + "type": "integer" + }, + "violations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "propertyPath": { + "type": "string", + "description": "The property path of the violation" + }, + "message": { + "type": "string", + "description": "The message associated with the violation" + }, + "code": { + "type": "string", + "description": "The code of the violation" + }, + "hint": { + "type": "string", + "description": "An extra hint to understand the violation" + }, + "payload": { + "type": "object", + "additionalProperties": true, + "description": "The serialized payload of the violation" + } + }, + "required": [ + "propertyPath", + "message" + ] + } + }, + "detail": { + "readOnly": true, + "type": "string" + }, + "type": { + "readOnly": true, + "type": "string" + }, + "title": { + "readOnly": true, + "type": [ + "string", + "null" + ] + }, + "instance": { + "readOnly": true, + "type": [ + "string", + "null" + ] + } + } + }, + "Error": { + "type": "object", + "description": "A representation of common errors.", + "properties": { + "title": { + "readOnly": true, + "description": "A short, human-readable summary of the problem.", + "type": [ + "string", + "null" + ] + }, + "detail": { + "readOnly": true, + "description": "A human-readable explanation specific to this occurrence of the problem.", + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "integer", + "null" + ], + "examples": [ + 404 + ], + "default": 400 + }, + "instance": { + "readOnly": true, + "description": "A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.", + "type": [ + "string", + "null" + ] + }, + "type": { + "readOnly": true, + "description": "A URI reference that identifies the problem type", + "type": "string" + } + } + }, + "VersionCreate": { + "type": "object", + "description": "Adds a new version release of a plugin", + "properties": { + "id": { + "description": "Marketplace identifier for this version.", + "example": 871, + "type": [ + "integer", + "null" + ] + }, + "version": { + "description": "The 10-digit build number declared in version.php.", + "example": "2025082100", + "type": "string" + }, + "releaseName": { + "description": "Human-readable release name, from version.php.", + "example": "1.4.0", + "type": [ + "string", + "null" + ] + }, + "maturity": { + "description": "Moodle maturity level declared by the release.", + "example": "STABLE", + "type": [ + "string", + "null" + ], + "enum": [ + "ALPHA", + "BETA", + "RC", + "STABLE" + ] + }, + "status": { + "description": "Release lifecycle state.", + "example": "ci_passed", + "type": [ + "string", + "null" + ], + "enum": [ + "uploaded", + "in_testing", + "ci_passed", + "ci_failed", + "discarded" + ] + }, + "releaseNotes": { + "description": "What changed in this release, as supplied by the maintainer.", + "example": "Fixes the grade calculation for group submissions.", + "type": [ + "string", + "null" + ] + }, + "moodleVersions": { + "description": "Moodle release names this version supports, from version.php.", + "example": [ + "4.5", + "5.0" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "vcsRepositoryUrl": { + "description": "Repository this release was built from.", + "example": "https://github.com/example/moodle-mod_quiz", + "type": [ + "string", + "null" + ] + }, + "vcsBranch": { + "description": "Branch this release was built from.", + "example": "main", + "type": [ + "string", + "null" + ] + }, + "vcsTag": { + "description": "Tag this release was built from.", + "example": "v1.4.0", + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "description": "When the version was submitted, ISO 8601.", + "example": "2025-08-21T14:03:00+00:00", + "type": [ + "string", + "null" + ], + "format": "date-time" + } + } + }, + "VersionCreate.VersionCreateInput.multipart": { + "type": "object", + "description": "Adds a new version release of a plugin", + "properties": { + "file": { + "description": "The plugin zip, uploaded directly. Give this **or** `fileUrl`, not both.", + "type": [ + "string", + "null" + ], + "format": "binary" + }, + "fileUrl": { + "format": "uri", + "description": "HTTPS URL the Marketplace should download the plugin zip from. Give this **or** `file`, not both. Must be https and must resolve to a public address.", + "externalDocs": { + "url": "https://schema.org/url" + }, + "example": "https://github.com/example/moodle-mod_quiz/releases/download/v1.4.0/mod_quiz.zip", + "type": [ + "string", + "null" + ] + }, + "releaseNotes": { + "maxLength": 10000, + "description": "What changed in this release. Optional.", + "example": "Fixes the grade calculation for group submissions.", + "type": [ + "string", + "null" + ] + }, + "vcsRepositoryUrl": { + "format": "uri", + "maxLength": 255, + "description": "Repository this release was built from. Optional.", + "externalDocs": { + "url": "https://schema.org/url" + }, + "example": "https://github.com/example/moodle-mod_quiz", + "type": [ + "string", + "null" + ] + }, + "vcsBranch": { + "maxLength": 255, + "description": "Branch this release was built from. Optional.", + "example": "main", + "type": [ + "string", + "null" + ] + }, + "vcsTag": { + "maxLength": 255, + "description": "Tag this release was built from. Optional.", + "example": "v1.4.0", + "type": [ + "string", + "null" + ] + } + } + } + }, + "responses": {}, + "parameters": {}, + "examples": {}, + "requestBodies": {}, + "headers": {}, + "securitySchemes": { + "bearerAuth": { + "type": "http", + "description": "Value for the http bearer parameter.", + "scheme": "bearer", + "bearerFormat": "Opaque token" + } + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "tags": [ + { + "name": "Version", + "description": "A released version of a plugin." + } + ], + "webhooks": {} +} diff --git a/yarn.lock b/yarn.lock index d8417995f9..bdeacbe372 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1703,6 +1703,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.17.8": + version: 7.29.7 + resolution: "@babel/runtime@npm:7.29.7" + checksum: 10/9883b4951787779fd382b121f22f92966d85f19434841f65fb00b2dfec232107e139683f47c6f252891826ad8ee18317b46c3a0e4819116a9885f47b46d7126a + languageName: node + linkType: hard + "@babel/template@npm:^7.12.7, @babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2, @babel/template@npm:^7.3.3": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" @@ -3468,7 +3475,7 @@ __metadata: languageName: node linkType: hard -"@docusaurus/theme-common@npm:3.10.2": +"@docusaurus/theme-common@npm:3.10.2, @docusaurus/theme-common@npm:^3.10.2": version: 3.10.2 resolution: "@docusaurus/theme-common@npm:3.10.2" dependencies: @@ -3599,7 +3606,7 @@ __metadata: languageName: node linkType: hard -"@docusaurus/utils@npm:3.10.2": +"@docusaurus/utils@npm:3.10.2, @docusaurus/utils@npm:^3.10.2": version: 3.10.2 resolution: "@docusaurus/utils@npm:3.10.2" dependencies: @@ -3695,6 +3702,15 @@ __metadata: languageName: node linkType: hard +"@emotion/is-prop-valid@npm:1.4.0": + version: 1.4.0 + resolution: "@emotion/is-prop-valid@npm:1.4.0" + dependencies: + "@emotion/memoize": "npm:^0.9.0" + checksum: 10/6fbec4d5cd90b5b68c85047ec1425bccb1fd332df08fa2aea0c15e430c467f01547363ad9108e452ef0494d805074419a7a45c6c866667c39b797f9223e6311d + languageName: node + linkType: hard + "@emotion/is-prop-valid@npm:^1.3.0": version: 1.3.1 resolution: "@emotion/is-prop-valid@npm:1.3.1" @@ -3844,6 +3860,13 @@ __metadata: languageName: node linkType: hard +"@exodus/schemasafe@npm:^1.0.0-rc.2": + version: 1.3.0 + resolution: "@exodus/schemasafe@npm:1.3.0" + checksum: 10/791d9e4b437fe04c6d7cf028d145ed963b8fe973ba6d5811aedf7edea40d5a055a49522241efdafbc32f964c27beaddf1c85fbcc8bf5436cf394623b08e5518b + languageName: node + linkType: hard + "@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": version: 9.3.0 resolution: "@hapi/hoek@npm:9.3.0" @@ -4781,6 +4804,13 @@ __metadata: languageName: node linkType: hard +"@nodable/entities@npm:^3.0.1": + version: 3.1.0 + resolution: "@nodable/entities@npm:3.1.0" + checksum: 10/b07d97b1dac8e0bc8a124ea52cdb6d6a50a8a750592acf540e47c4740a8b96b5add8d9dcce4dfbe74e08b2ab95303c1a2078cf4ba01a085a6de88a879f45576e + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -5045,6 +5075,80 @@ __metadata: languageName: node linkType: hard +"@redocly/ajv@npm:8.11.2": + version: 8.11.2 + resolution: "@redocly/ajv@npm:8.11.2" + dependencies: + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js-replace: "npm:^1.0.1" + checksum: 10/75d6d8bcc2ca79d0e818d2dbc8ec1bc1b2dc64036b6fccddaa20b547b0c06e4d0317101a5c7b736ecf94f16e7324ca4cc81a4d31de3c9fc4a0826a5f65a6a5b7 + languageName: node + linkType: hard + +"@redocly/ajv@npm:^8.11.0": + version: 8.18.3 + resolution: "@redocly/ajv@npm:8.18.3" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + checksum: 10/5cdcc45c1a69d02fc3cd152a9c8b68f0a7346f80626254df937a43d86ee5279c991e5f7c21664adf46bae2be2fa137142a96dc3832f274c80d6ab745a5d0608a + languageName: node + linkType: hard + +"@redocly/config@npm:0.22.0": + version: 0.22.0 + resolution: "@redocly/config@npm:0.22.0" + checksum: 10/57a4f3da8a6b1e163b76a9819a87f2150fc62b0a56707dd787e0f4fc519ef9c067f9906513b421ca6f40080ce32e144b35708a8728052a2dfc5f28b98aeeb758 + languageName: node + linkType: hard + +"@redocly/config@npm:^0.6.0": + version: 0.6.3 + resolution: "@redocly/config@npm:0.6.3" + checksum: 10/0d5df7024882ae6c525a8b7cdfcaf43964d3aded7970193bcaaaf19ef7bad2029c9315f113922899c485a7c8c69d758c4daa5bf7d6093597144de4476ee7fd98 + languageName: node + linkType: hard + +"@redocly/openapi-core@npm:1.16.0": + version: 1.16.0 + resolution: "@redocly/openapi-core@npm:1.16.0" + dependencies: + "@redocly/ajv": "npm:^8.11.0" + "@redocly/config": "npm:^0.6.0" + colorette: "npm:^1.2.0" + https-proxy-agent: "npm:^7.0.4" + js-levenshtein: "npm:^1.1.6" + js-yaml: "npm:^4.1.0" + lodash.isequal: "npm:^4.5.0" + minimatch: "npm:^5.0.1" + node-fetch: "npm:^2.6.1" + pluralize: "npm:^8.0.0" + yaml-ast-parser: "npm:0.0.43" + checksum: 10/542d828b7c18661254bacd021c35bc98ad42a60a631dc4642dc8bf360754dd3ee76380bb6f88486bd45250273d752e458031c0093b906d45a182edbe8f407ed8 + languageName: node + linkType: hard + +"@redocly/openapi-core@npm:^1.4.0": + version: 1.34.20 + resolution: "@redocly/openapi-core@npm:1.34.20" + dependencies: + "@redocly/ajv": "npm:8.11.2" + "@redocly/config": "npm:0.22.0" + colorette: "npm:1.4.0" + https-proxy-agent: "npm:7.0.6" + js-levenshtein: "npm:1.1.6" + js-yaml: "npm:4.3.2" + minimatch: "npm:5.1.9" + pluralize: "npm:8.0.0" + yaml-ast-parser: "npm:0.0.43" + checksum: 10/ec279315944056b07067c4d1b15fed52caa6e6192d4057ec2776d74f5bf28f3ce71669e0f0732d68339c9993697aaea0af80c9a0306554700c6a623ca736b723 + languageName: node + linkType: hard + "@rollup/plugin-babel@npm:^5.2.0": version: 5.3.1 resolution: "@rollup/plugin-babel@npm:5.3.1" @@ -6405,7 +6509,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.6, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -7328,6 +7432,13 @@ __metadata: languageName: node linkType: hard +"anynum@npm:^1.0.1": + version: 1.0.1 + resolution: "anynum@npm:1.0.1" + checksum: 10/096acef76cc8b9f34d43ec37ae9ba7a3d4e2e8c722a0dd59a78995248a8eb4021713ee91b55de106366ac4eaa47578ceb0fffe9829ef01d78b20f9fd6d412a88 + languageName: node + linkType: hard + "arg@npm:^5.0.0": version: 5.0.2 resolution: "arg@npm:5.0.2" @@ -8194,6 +8305,13 @@ __metadata: languageName: node linkType: hard +"camelize@npm:^1.0.0": + version: 1.0.1 + resolution: "camelize@npm:1.0.1" + checksum: 10/0e147b4299ac6363c50050716aadfae42831257ec56ce54773ffd2a94a88abb2e2540c5ccc38345e8a39963105b76d86cb24477165a36b78c9958fb304513db3 + languageName: node + linkType: hard + "caniuse-api@npm:^3.0.0": version: 3.0.0 resolution: "caniuse-api@npm:3.0.0" @@ -8459,6 +8577,13 @@ __metadata: languageName: node linkType: hard +"classnames@npm:^2.3.2": + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 + languageName: node + linkType: hard + "clean-css@npm:^5.2.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": version: 5.3.3 resolution: "clean-css@npm:5.3.3" @@ -8677,6 +8802,13 @@ __metadata: languageName: node linkType: hard +"colorette@npm:1.4.0, colorette@npm:^1.2.0": + version: 1.4.0 + resolution: "colorette@npm:1.4.0" + checksum: 10/c8d6c8c3ef5a99acfc3dd9a68f48019f1479ec347551387e4a1762e40f69e98ce19d4dc321ffb4919d1f28a7bdc90c39d4e9a901f4c474fd2124ad93a00c0454 + languageName: node + linkType: hard + "colorette@npm:^2.0.10, colorette@npm:^2.0.20": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -9235,6 +9367,13 @@ __metadata: languageName: node linkType: hard +"css-color-keywords@npm:^1.0.0": + version: 1.0.0 + resolution: "css-color-keywords@npm:1.0.0" + checksum: 10/8f125e3ad477bd03c77b533044bd9e8a6f7c0da52d49bbc0bbe38327b3829d6ba04d368ca49dd9ff3b667d2fc8f1698d891c198bbf8feade1a5501bf5a296408 + languageName: node + linkType: hard + "css-declaration-sorter@npm:^7.2.0": version: 7.2.0 resolution: "css-declaration-sorter@npm:7.2.0" @@ -9352,6 +9491,17 @@ __metadata: languageName: node linkType: hard +"css-to-react-native@npm:3.2.0": + version: 3.2.0 + resolution: "css-to-react-native@npm:3.2.0" + dependencies: + camelize: "npm:^1.0.0" + css-color-keywords: "npm:^1.0.0" + postcss-value-parser: "npm:^4.0.2" + checksum: 10/62ef744254e333abc696efdc945ecf13ad6ba7b726d0a39c0405b2fcb86542aa2f3fe7b7b6770f67ae9679d98b159b4d66353107bf7d6144a445eafcf5fa250a + languageName: node + linkType: hard + "css-tree@npm:^2.3.1": version: 2.3.1 resolution: "css-tree@npm:2.3.1" @@ -9482,6 +9632,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:3.2.3": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10/ad41baf7e2ffac65ab544d79107bf7cd1a4bb9bab9ac3302f59ab4ba655d5e30942a8ae46e10ba160c6f4ecea464cc95b975ca2fefbdeeacd6ac63f12f99fe1f + languageName: node + linkType: hard + "csstype@npm:^3.0.2, csstype@npm:^3.1.3": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -10017,6 +10174,13 @@ __metadata: languageName: node linkType: hard +"decko@npm:^1.2.0": + version: 1.2.0 + resolution: "decko@npm:1.2.0" + checksum: 10/43259629a28f617c063a05e596aa711b0de2874b67bdbbf1893c3283c72e90a78db2e1e5dcc1e6d55f9e2677acf27ed8aae9fe9c2e32db9c596532810c230648 + languageName: node + linkType: hard + "decode-named-character-reference@npm:^1.0.0": version: 1.1.0 resolution: "decode-named-character-reference@npm:1.1.0" @@ -10226,7 +10390,9 @@ __metadata: "@docusaurus/module-type-aliases": "npm:^3.10.2" "@docusaurus/plugin-pwa": "npm:^3.10.2" "@docusaurus/preset-classic": "npm:^3.10.2" + "@docusaurus/theme-common": "npm:^3.10.2" "@docusaurus/theme-mermaid": "npm:^3.10.2" + "@docusaurus/utils": "npm:^3.10.2" "@emotion/react": "npm:^11.10.5" "@emotion/styled": "npm:^11.10.5" "@mdx-js/react": "npm:^3.0.0" @@ -10275,6 +10441,7 @@ __metadata: react: "npm:19" react-dom: "npm:19" react-player: "npm:^2.16.0" + redocusaurus: "npm:^2.5.2" stylelint: "npm:^15.10.1" stylelint-config-standard: "npm:^29.0.0" ts-jest: "npm:^29.0.3" @@ -10345,6 +10512,37 @@ __metadata: languageName: node linkType: hard +"docusaurus-plugin-redoc@npm:2.5.0": + version: 2.5.0 + resolution: "docusaurus-plugin-redoc@npm:2.5.0" + dependencies: + "@redocly/openapi-core": "npm:1.16.0" + redoc: "npm:2.4.0" + peerDependencies: + "@docusaurus/utils": ^3.6.0 + checksum: 10/dff9c454d90e2b784ad106bdb6fb927361ffa955cb8f9a6abb9d7d0a1348d587d51888eff8cdddd2cb51b0b5ad62c32e31c4611a9cc7f15d13a72da209d54a38 + languageName: node + linkType: hard + +"docusaurus-theme-redoc@npm:2.5.1": + version: 2.5.1 + resolution: "docusaurus-theme-redoc@npm:2.5.1" + dependencies: + "@redocly/openapi-core": "npm:1.16.0" + clsx: "npm:^1.2.1" + lodash: "npm:^4.17.23" + mobx: "npm:^6.12.4" + postcss: "npm:^8.4.45" + postcss-prefix-selector: "npm:^1.16.1" + redoc: "npm:2.4.0" + styled-components: "npm:^6.1.11" + peerDependencies: + "@docusaurus/theme-common": ^3.6.0 + webpack: ^5.0.0 + checksum: 10/cadfdbe7f31786b8f5961df9d94e8ae53acfd645f24a6d99545071ffbc2ba699f9d6d6187329706e9418d271144319a84be957f73db430af23e9d87dea382821 + languageName: node + linkType: hard + "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -10411,6 +10609,18 @@ __metadata: languageName: node linkType: hard +"dompurify@npm:^3.0.6": + version: 3.4.16 + resolution: "dompurify@npm:3.4.16" + dependencies: + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: 10/a571d0e2bede4f739666afd640398a86854abd27c71ce0724910249e2fd2ca7ddb8098a9ab579d3a5b39058419af694421f8fe859a81fd6d8acda16019a8ab9d + languageName: node + linkType: hard + "dompurify@npm:^3.2.5": version: 3.4.12 resolution: "dompurify@npm:3.4.12" @@ -10811,6 +11021,13 @@ __metadata: languageName: node linkType: hard +"es6-promise@npm:^3.2.1": + version: 3.3.1 + resolution: "es6-promise@npm:3.3.1" + checksum: 10/14f46a0a20164d4d6f8a39133c7220688bb9ee2d89a78f2345694b8ac9b6ea7b94f73488e289a083dce732831f4040013b25222d1820580c7b10b698c50c8267 + languageName: node + linkType: hard + "esast-util-from-estree@npm:^2.0.0": version: 2.0.0 resolution: "esast-util-from-estree@npm:2.0.0" @@ -11593,6 +11810,13 @@ __metadata: languageName: node linkType: hard +"fast-safe-stringify@npm:^2.0.7": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: 10/dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 + languageName: node + linkType: hard + "fast-uri@npm:^3.0.1": version: 3.1.8 resolution: "fast-uri@npm:3.1.8" @@ -11600,6 +11824,32 @@ __metadata: languageName: node linkType: hard +"fast-xml-builder@npm:^1.2.0": + version: 1.3.1 + resolution: "fast-xml-builder@npm:1.3.1" + dependencies: + path-expression-matcher: "npm:^1.6.2" + xml-naming: "npm:^0.3.0" + checksum: 10/6e2774b07a089c325dbf9d193325a1bf78592e7f3877dfdb643f4898d89a154aa17054cea7270b8b3cc4a7a1145988b0d8a5a974c7086f0e28a6af22a536f55f + languageName: node + linkType: hard + +"fast-xml-parser@npm:^5.5.1": + version: 5.11.2 + resolution: "fast-xml-parser@npm:5.11.2" + dependencies: + "@nodable/entities": "npm:^3.0.1" + fast-xml-builder: "npm:^1.2.0" + is-unsafe: "npm:^2.0.0" + path-expression-matcher: "npm:^1.6.2" + strnum: "npm:^2.4.2" + xml-naming: "npm:^0.3.0" + bin: + fxparser: src/cli/cli.js + checksum: 10/aa88bd2af831876b458a51c302a84f83a92bbd747606a1f0a85f7085461e2f3c52cb7438f4ef2dc136fbcb0cb33d450d007178a24b23c148d8a84b5ccfb70c58 + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.16": version: 1.0.16 resolution: "fastest-levenshtein@npm:1.0.16" @@ -11870,6 +12120,13 @@ __metadata: languageName: node linkType: hard +"foreach@npm:^2.0.4": + version: 2.0.6 + resolution: "foreach@npm:2.0.6" + checksum: 10/93b0e65b3f03d9f696418d45f589d0135268b97bf71b4c2628687ce77ce49c20abd60f3c1b23052306b4e789435683a467a7828beac486d2ea17ba8b80933d38 + languageName: node + linkType: hard + "foreground-child@npm:^3.1.0": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" @@ -12919,6 +13176,13 @@ __metadata: languageName: node linkType: hard +"http2-client@npm:^1.2.5": + version: 1.3.5 + resolution: "http2-client@npm:1.3.5" + checksum: 10/34ef17ea2814acbf9d9b5184f9e2c0767846d62abc357bd63c67b3d1f65e7b6ba772d4950ec4f5188686d3d8bfa15e3fb73721150db5bdb47bcefdba71734729 + languageName: node + linkType: hard + "http2-wrapper@npm:^2.1.10": version: 2.2.1 resolution: "http2-wrapper@npm:2.2.1" @@ -12929,7 +13193,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:7.0.6, https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.4": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -13731,6 +13995,13 @@ __metadata: languageName: node linkType: hard +"is-unsafe@npm:^2.0.0": + version: 2.0.2 + resolution: "is-unsafe@npm:2.0.2" + checksum: 10/ebd5b9abfa1e66b221649c9e7f6ed5f1de51dc9913a5c35b192be81b2aeeccb99ef97ae11535d1aa32817e43f73538fb9271c709148f634173b78cebe2eebd2e + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.2": version: 2.0.2 resolution: "is-weakmap@npm:2.0.2" @@ -14423,6 +14694,13 @@ __metadata: languageName: node linkType: hard +"js-levenshtein@npm:1.1.6, js-levenshtein@npm:^1.1.6": + version: 1.1.6 + resolution: "js-levenshtein@npm:1.1.6" + checksum: 10/bb034043fdebab606122fe5b5c0316036f1bb0ea352038af8b0ba4cda4b016303b24f64efb59d9918f66e3680eea97ff421396ff3c153cb00a6f982908f61f8a + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -14441,26 +14719,26 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" +"js-yaml@npm:4.3.2, js-yaml@npm:^4.3.2": + version: 4.3.2 + resolution: "js-yaml@npm:4.3.2" dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" + argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10/9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 + checksum: 10/05c44b9c73e4901d92703b155e76518df64bf01ac62e4c036b47de4b391e19b72e32656e8954d51b436307f08cc9d0c0d4ec617d061cf2f65fffee9f3114bee7 languageName: node linkType: hard -"js-yaml@npm:^4.3.2": - version: 4.3.2 - resolution: "js-yaml@npm:4.3.2" +"js-yaml@npm:^3.13.1, js-yaml@npm:^3.14.0": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" dependencies: - argparse: "npm:^2.0.1" + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 10/05c44b9c73e4901d92703b155e76518df64bf01ac62e4c036b47de4b391e19b72e32656e8954d51b436307f08cc9d0c0d4ec617d061cf2f65fffee9f3114bee7 + checksum: 10/9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 languageName: node linkType: hard @@ -14519,6 +14797,15 @@ __metadata: languageName: node linkType: hard +"json-pointer@npm:0.6.2, json-pointer@npm:^0.6.2": + version: 0.6.2 + resolution: "json-pointer@npm:0.6.2" + dependencies: + foreach: "npm:^2.0.4" + checksum: 10/1d8fc507008cf28815ad398baa7a6d62a73cce2d5ca7859097bb56043b3b6889e393bf5285db9674ddcdb8bc10551146cf8048d3d6430d55ce922105813661e2 + languageName: node + linkType: hard + "json-schema-migrate@npm:^2.0.0": version: 2.0.0 resolution: "json-schema-migrate@npm:2.0.0" @@ -15043,6 +15330,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: 10/82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 + languageName: node + linkType: hard + "lodash.iteratee@npm:^4.0.0": version: 4.7.0 resolution: "lodash.iteratee@npm:4.7.0" @@ -15085,7 +15379,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.23": version: 4.18.1 resolution: "lodash@npm:4.18.1" checksum: 10/306fea53dfd39dad1f03d45ba654a2405aebd35797b673077f401edb7df2543623dc44b9effbb98f69b32152295fff725a4cec99c684098947430600c6af0c3f @@ -15195,6 +15489,13 @@ __metadata: languageName: node linkType: hard +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 10/f2f6db34c046f5a767782fe2454e6dd69c75ba3c5cf5c1cb9cacca2313a99c2ba78ff8fa67dac866fb7c4ffd5f22e06684793f5f15ba14bddb598b94513d54bf + languageName: node + linkType: hard + "magic-string@npm:^0.25.0, magic-string@npm:^0.25.7": version: 0.25.9 resolution: "magic-string@npm:0.25.9" @@ -15282,6 +15583,13 @@ __metadata: languageName: node linkType: hard +"mark.js@npm:^8.11.1": + version: 8.11.1 + resolution: "mark.js@npm:8.11.1" + checksum: 10/3b01b9ea4761f2104ab1fbe2cc917c0a9ca580f778f62edde7eb95c6322330cba0ddc45f8aa163ef5b0b3b3eeba20df683b42831fbe5e8429ff3b4b4cecfd28a + languageName: node + linkType: hard + "markdown-escapes@npm:^1.0.0": version: 1.0.4 resolution: "markdown-escapes@npm:1.0.4" @@ -15386,6 +15694,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 10/c830bb4cb3705b754ca342b656e8a582d7428706b2678c898b856f6030c134ce2d1e19136efa3e6a1841f7330efbd24963d6bdeddc57d2938e906250f99895d0 + languageName: node + linkType: hard + "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -16466,6 +16783,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:5.1.9": + version: 5.1.9 + resolution: "minimatch@npm:5.1.9" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/23b4feb64dcb77ba93b70a72be551eb2e2677ac02178cf1ed3d38836cc4cd84802d90b77f60ef87f2bac64d270d2d8eba242e428f0554ea4e36bfdb7e9d25d0c + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -16656,6 +16982,47 @@ __metadata: languageName: node linkType: hard +"mobx-react-lite@npm:^4.1.1": + version: 4.1.1 + resolution: "mobx-react-lite@npm:4.1.1" + dependencies: + use-sync-external-store: "npm:^1.4.0" + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 10/ce2c848129c052e1901f530329ec440e4b7f7264073e0f91bda240b2c37826f964d1fcab8cf43c4a1fa0d596074364e9ce52094e3db0bd5ca1d59147b92200f7 + languageName: node + linkType: hard + +"mobx-react@npm:^9.1.1": + version: 9.2.2 + resolution: "mobx-react@npm:9.2.2" + dependencies: + mobx-react-lite: "npm:^4.1.1" + peerDependencies: + mobx: ^6.9.0 + react: ^16.8.0 || ^17 || ^18 || ^19 + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + checksum: 10/fb50f2bc6246ee74cd28a0294abe65699f62cc7aae47ccca139a98a3ca3facadda5d014d07d30e8fc1a65bc05667719216a37b5bfe8fb622a40de4ff0b3292a2 + languageName: node + linkType: hard + +"mobx@npm:^6.12.4": + version: 6.16.1 + resolution: "mobx@npm:6.16.1" + checksum: 10/01753230a35d2f8a376d4f0e5b0096848141a6c1567f09f4a5e6f7a983814e971141eccb58288e737a7b259618312e4c963523100ccc13f5505881ead7066c80 + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": version: 2.0.1 resolution: "mrmime@npm:2.0.1" @@ -16721,6 +17088,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.18": + version: 3.3.19 + resolution: "nanoid@npm:3.3.19" + bin: + nanoid: bin/nanoid.cjs + checksum: 10/a330adb28dad63eccb0a0c95a2a61353e84b7e067061fff94167803d94be8eef0f7b75cf2da1bece06e8b7afb892abbe52cf0ec33298c817a083eedccd7656e4 + languageName: node + linkType: hard + "napi-build-utils@npm:^2.0.0": version: 2.0.0 resolution: "napi-build-utils@npm:2.0.0" @@ -16808,6 +17184,29 @@ __metadata: languageName: node linkType: hard +"node-fetch-h2@npm:^2.3.0": + version: 2.3.0 + resolution: "node-fetch-h2@npm:2.3.0" + dependencies: + http2-client: "npm:^1.2.5" + checksum: 10/9495b4e52cfb23241a1bca187640a15bcaacb7a0667a825074f9dbf2c1a9b10fedd5344d775d57dea8944eeee1049959a3f662492e2f57d6d5f34c7d296e7c65 + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.1": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: "npm:^5.0.0" + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 10/b24f8a3dc937f388192e59bcf9d0857d7b6940a2496f328381641cb616efccc9866e89ec43f2ec956bbd6c3d3ee05524ce77fe7b29ccd34692b3a16f237d6676 + languageName: node + linkType: hard + "node-fetch@npm:^3.3.0": version: 3.3.2 resolution: "node-fetch@npm:3.3.2" @@ -16866,6 +17265,15 @@ __metadata: languageName: node linkType: hard +"node-readfiles@npm:^0.2.0": + version: 0.2.0 + resolution: "node-readfiles@npm:0.2.0" + dependencies: + es6-promise: "npm:^3.2.1" + checksum: 10/1db0f009955665e63983395f38c2479ef18b4ea8db1d12e03c155238ebe567f2e83981c0e47ac7c6d29ab4a3628082d5e02683e62d26e1af79852e0d8b77e3fb + languageName: node + linkType: hard + "node-releases@npm:^2.0.57": version: 2.0.57 resolution: "node-releases@npm:2.0.57" @@ -16996,6 +17404,64 @@ __metadata: languageName: node linkType: hard +"oas-kit-common@npm:^1.0.8": + version: 1.0.8 + resolution: "oas-kit-common@npm:1.0.8" + dependencies: + fast-safe-stringify: "npm:^2.0.7" + checksum: 10/576ab5f7c7fde551a9c780fde9392cb9dec5159b62c3ad4499e334bffdb12e089e97dccf2a9d0d1ac5be208f9d6f0e72da5ac3744d878134ef0177eed135cc52 + languageName: node + linkType: hard + +"oas-linter@npm:^3.2.2": + version: 3.2.2 + resolution: "oas-linter@npm:3.2.2" + dependencies: + "@exodus/schemasafe": "npm:^1.0.0-rc.2" + should: "npm:^13.2.1" + yaml: "npm:^1.10.0" + checksum: 10/8111c6c759648215b466e0e507e21e3c125762caf925dff28628c1ac0144bc82fe7f231a3249dd0400dff051574b4d5a7bbcc64b95d2f2f7e41a3377e859c395 + languageName: node + linkType: hard + +"oas-resolver@npm:^2.5.6": + version: 2.5.6 + resolution: "oas-resolver@npm:2.5.6" + dependencies: + node-fetch-h2: "npm:^2.3.0" + oas-kit-common: "npm:^1.0.8" + reftools: "npm:^1.1.9" + yaml: "npm:^1.10.0" + yargs: "npm:^17.0.1" + bin: + resolve: resolve.js + checksum: 10/9e20118bf722cb9e9f71a7079336ce705259eb380fa9c2a776d9647b93725314c23abdb6b7b3bc3c91a3559485bbb729447f72ce0c3ca9ce48281b8214a9612d + languageName: node + linkType: hard + +"oas-schema-walker@npm:^1.1.5": + version: 1.1.5 + resolution: "oas-schema-walker@npm:1.1.5" + checksum: 10/27bdeda1ebcf557b90cfb5d2ac3ca8e851f601d96215747c19ce0ae8f8458ad8012701b615fe313eacf4665b733f46ec12870f72d453251217b8a3ceb2be9abf + languageName: node + linkType: hard + +"oas-validator@npm:^5.0.8": + version: 5.0.8 + resolution: "oas-validator@npm:5.0.8" + dependencies: + call-me-maybe: "npm:^1.0.1" + oas-kit-common: "npm:^1.0.8" + oas-linter: "npm:^3.2.2" + oas-resolver: "npm:^2.5.6" + oas-schema-walker: "npm:^1.1.5" + reftools: "npm:^1.1.9" + should: "npm:^13.2.1" + yaml: "npm:^1.10.0" + checksum: 10/3e392d6c99659e58860b78ef1a46eaf8ad782449fe9a21ccb594b74f88a2c211d39ab9d016ec08c995d8728a250229aba84cb02ca3381f0fb2cc1e6782f4e21a + languageName: node + linkType: hard + "oauth-sign@npm:~0.9.0": version: 0.9.0 resolution: "oauth-sign@npm:0.9.0" @@ -17167,6 +17633,17 @@ __metadata: languageName: node linkType: hard +"openapi-sampler@npm:^1.5.0": + version: 1.7.6 + resolution: "openapi-sampler@npm:1.7.6" + dependencies: + "@types/json-schema": "npm:^7.0.7" + fast-xml-parser: "npm:^5.5.1" + json-pointer: "npm:0.6.2" + checksum: 10/6fcf03055e55bc1ceeab94738e6dacadea23bca530f19c4365a83fc164adaac2befce8a5f7d1d68813c820dba867b0d98471744e0532a5f40ddef97557bd1de3 + languageName: node + linkType: hard + "opener@npm:^1.5.2": version: 1.5.2 resolution: "opener@npm:1.5.2" @@ -17484,6 +17961,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 10/7e7368a5207e7c6b9051ef045711d0dc3c2b6203e96057e408e6e74d09f383061010d2be95cb8593fe6258a767c3e9fc6b2bfc7ce8d48ae8c3d9f6994cca9ad8 + languageName: node + linkType: hard + "path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": version: 0.1.0 resolution: "path-data-parser@npm:0.1.0" @@ -17505,6 +17989,13 @@ __metadata: languageName: node linkType: hard +"path-expression-matcher@npm:^1.6.2": + version: 1.6.2 + resolution: "path-expression-matcher@npm:1.6.2" + checksum: 10/d7786b170933dd82ed897144daed7d54dbe2e7b7d8684182ee9bf51a966cc92548788e2f49280922202a0186409008d816aefa37ed4650e4038184181a73c4bd + languageName: node + linkType: hard + "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -17594,6 +18085,13 @@ __metadata: languageName: node linkType: hard +"perfect-scrollbar@npm:^1.5.5": + version: 1.5.6 + resolution: "perfect-scrollbar@npm:1.5.6" + checksum: 10/81b681fe7ec13fb278efb2ee2107aa4208093c29a994d7fc0541d90a55efb86bd22f776e28e6a2d10cbe50964915f84136c03593b4cd1939af6df61bd7cdb8da + languageName: node + linkType: hard + "performance-now@npm:^2.1.0": version: 2.1.0 resolution: "performance-now@npm:2.1.0" @@ -17692,6 +18190,13 @@ __metadata: languageName: node linkType: hard +"pluralize@npm:8.0.0, pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 10/17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec + languageName: node + linkType: hard + "points-on-curve@npm:0.2.0, points-on-curve@npm:^0.2.0": version: 0.2.0 resolution: "points-on-curve@npm:0.2.0" @@ -17709,6 +18214,15 @@ __metadata: languageName: node linkType: hard +"polished@npm:^4.2.2": + version: 4.3.1 + resolution: "polished@npm:4.3.1" + dependencies: + "@babel/runtime": "npm:^7.17.8" + checksum: 10/0902fe2eb16aecde1587a00efee7db8081b1331ac7bcfb6e61214d266388723a84858d732ad9395028e0aecd2bb8d0c39cc03d14b4c24c22329a0e40c38141eb + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -18314,6 +18828,15 @@ __metadata: languageName: node linkType: hard +"postcss-prefix-selector@npm:^1.16.1": + version: 1.16.1 + resolution: "postcss-prefix-selector@npm:1.16.1" + peerDependencies: + postcss: ">4 <9" + checksum: 10/e6a138f2c2f4be38013e778d0242f7fced1468759b508b3f85349ec1a5cd0bd6e7194998749508edb7a987fff9d4f3ee89b7d4f34e5df34dbf65130bf3bc680c + languageName: node + linkType: hard + "postcss-preset-env@npm:^10.2.1": version: 10.2.4 resolution: "postcss-preset-env@npm:10.2.4" @@ -18523,7 +19046,7 @@ __metadata: languageName: node linkType: hard -"postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": +"postcss-value-parser@npm:^4.0.2, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0": version: 4.2.0 resolution: "postcss-value-parser@npm:4.2.0" checksum: 10/e4e4486f33b3163a606a6ed94f9c196ab49a37a7a7163abfcd469e5f113210120d70b8dd5e33d64636f41ad52316a3725655421eb9a1094f1bcab1db2f555c62 @@ -18550,6 +19073,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.45": + version: 8.5.28 + resolution: "postcss@npm:8.5.28" + dependencies: + nanoid: "npm:^3.3.18" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10/c34814c1da499f370cd3b02a085a2d866989a966629b7bd4025f4a2a10d538a2ec83dc3181e1008550edb4cf44e49a0c40ec82332b08d9600877e6841240ad05 + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.2": version: 7.1.3 resolution: "prebuild-install@npm:7.1.3" @@ -18674,7 +19208,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:^15.5.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -19039,6 +19573,18 @@ __metadata: languageName: node linkType: hard +"react-tabs@npm:^6.0.2": + version: 6.1.1 + resolution: "react-tabs@npm:6.1.1" + dependencies: + clsx: "npm:^2.0.0" + prop-types: "npm:^15.5.0" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + checksum: 10/e978669f3e1274c655524080078048125a2570e9529fcf200aa3ae381928b0a2dd93fe70d0c44492ddd949d3e193c2fa02ba18618ca6f72466e3f240b8db3104 + languageName: node + linkType: hard + "react-transition-group@npm:^4.4.5": version: 4.4.5 resolution: "react-transition-group@npm:4.4.5" @@ -19177,6 +19723,54 @@ __metadata: languageName: node linkType: hard +"redoc@npm:2.4.0": + version: 2.4.0 + resolution: "redoc@npm:2.4.0" + dependencies: + "@redocly/openapi-core": "npm:^1.4.0" + classnames: "npm:^2.3.2" + decko: "npm:^1.2.0" + dompurify: "npm:^3.0.6" + eventemitter3: "npm:^5.0.1" + json-pointer: "npm:^0.6.2" + lunr: "npm:^2.3.9" + mark.js: "npm:^8.11.1" + marked: "npm:^4.3.0" + mobx-react: "npm:^9.1.1" + openapi-sampler: "npm:^1.5.0" + path-browserify: "npm:^1.0.1" + perfect-scrollbar: "npm:^1.5.5" + polished: "npm:^4.2.2" + prismjs: "npm:^1.29.0" + prop-types: "npm:^15.8.1" + react-tabs: "npm:^6.0.2" + slugify: "npm:~1.4.7" + stickyfill: "npm:^1.1.1" + swagger2openapi: "npm:^7.0.8" + url-template: "npm:^2.0.8" + peerDependencies: + core-js: ^3.1.4 + mobx: ^6.0.4 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 + checksum: 10/4604572cc4fdff1d4649ab72da21e41aba6fb885502fc2956fab4a4c75ba53f75606614c9047c62dce0f39dd3254b947e395402f37e5928bef35b2758570b904 + languageName: node + linkType: hard + +"redocusaurus@npm:^2.5.2": + version: 2.5.2 + resolution: "redocusaurus@npm:2.5.2" + dependencies: + docusaurus-plugin-redoc: "npm:2.5.0" + docusaurus-theme-redoc: "npm:2.5.1" + peerDependencies: + "@docusaurus/theme-common": ^3.6.0 + "@docusaurus/utils": ^3.6.0 + checksum: 10/3f7c0c140a5e8779b46bad9f52d8bd96ff63742560f6394c635525d26b435ba155f840b8f99c2ebf0e6d8c3b7ed4bbae17dd4f1fd3dae3c1b9a2231992b02c09 + languageName: node + linkType: hard + "refa@npm:^0.11.0": version: 0.11.0 resolution: "refa@npm:0.11.0" @@ -19209,6 +19803,13 @@ __metadata: languageName: node linkType: hard +"reftools@npm:^1.1.9": + version: 1.1.9 + resolution: "reftools@npm:1.1.9" + checksum: 10/6a124748f1c4af84bf651c31c76b7ed0a7f766533530a80cbf2d2517b26e6bfaadc0b1b3e399675343328ab861ab04881e64c8bc3c2f40fc7be27a8aacf8775e + languageName: node + linkType: hard + "regenerate-unicode-properties@npm:^10.2.0": version: 10.2.0 resolution: "regenerate-unicode-properties@npm:10.2.0" @@ -20174,6 +20775,62 @@ __metadata: languageName: node linkType: hard +"should-equal@npm:^2.0.0": + version: 2.0.0 + resolution: "should-equal@npm:2.0.0" + dependencies: + should-type: "npm:^1.4.0" + checksum: 10/700e38f7815937f15e415b29df45ae22929c98c87979eb71e3a1085ba94cd0c601f435272eef3c9399ff74fa2d424df37ff03672f61ceda21630edcc77810744 + languageName: node + linkType: hard + +"should-format@npm:^3.0.3": + version: 3.0.3 + resolution: "should-format@npm:3.0.3" + dependencies: + should-type: "npm:^1.3.0" + should-type-adaptors: "npm:^1.0.1" + checksum: 10/099157f4f9bf458919bce8e981438e139c21789bb45f8b5cd8cf4bf01c5df498f1a1e666211bfd906b72b77d645a187563554ab38af807f8cd1aaf270e326186 + languageName: node + linkType: hard + +"should-type-adaptors@npm:^1.0.1": + version: 1.1.0 + resolution: "should-type-adaptors@npm:1.1.0" + dependencies: + should-type: "npm:^1.3.0" + should-util: "npm:^1.0.0" + checksum: 10/ca0fc7b24b916373e987b46e0c54db4aa824a80090a2fbff201679fd059240f4efabe415ffef9f5cfb99d85bf4241bdc3f212a9939724413203258a7dd73c24e + languageName: node + linkType: hard + +"should-type@npm:^1.3.0, should-type@npm:^1.4.0": + version: 1.4.0 + resolution: "should-type@npm:1.4.0" + checksum: 10/3e99a930fd43a47b0967fb5e8d0be31d9e2339c49267d3eabae014717012f4bd7cd942686fc49675114982240dcbfedba94ef49d0811b8f491c7cd74343bf97f + languageName: node + linkType: hard + +"should-util@npm:^1.0.0": + version: 1.0.1 + resolution: "should-util@npm:1.0.1" + checksum: 10/c3be15e0fdc851f8338676b3f8b590d330bbea94ec41c1343cc9983dea295915073f69a215795454b6adda6579ec8927c7c0ab178b83f9f11a0247ccdba53381 + languageName: node + linkType: hard + +"should@npm:^13.2.1": + version: 13.2.3 + resolution: "should@npm:13.2.3" + dependencies: + should-equal: "npm:^2.0.0" + should-format: "npm:^3.0.3" + should-type: "npm:^1.4.0" + should-type-adaptors: "npm:^1.0.1" + should-util: "npm:^1.0.0" + checksum: 10/4d3da94f11fee3db17be09673a73cd1939b0b75ebde102161eecef5559991deed691071ccab1d9289f4b69a45ef1a9d2362686a5f1ac530a43161d5832f6aa7d + languageName: node + linkType: hard + "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -20369,6 +21026,13 @@ __metadata: languageName: node linkType: hard +"slugify@npm:~1.4.7": + version: 1.4.7 + resolution: "slugify@npm:1.4.7" + checksum: 10/643d863a486d23b5f179ce0dd62da0e457c312e52e6cd07b3a774fc4e8b5f72d28b098eeec34e362bb9642ca92b2ec150f7c82005a6d5b73aa02c6a30b911c69 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -20668,6 +21332,13 @@ __metadata: languageName: node linkType: hard +"stickyfill@npm:^1.1.1": + version: 1.1.1 + resolution: "stickyfill@npm:1.1.1" + checksum: 10/502ac0310579a13bcfc39529b3f9270a66e308208f1c13cdb465bc55c7f0c088df08007589a2c90ffc569a451f32a04eb96fae4d36e90bbd3751884210e6ad14 + languageName: node + linkType: hard + "string-argv@npm:0.3.2": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -20920,6 +21591,15 @@ __metadata: languageName: node linkType: hard +"strnum@npm:^2.4.2": + version: 2.4.2 + resolution: "strnum@npm:2.4.2" + dependencies: + anynum: "npm:^1.0.1" + checksum: 10/c624b2f1a4ba0962cfa66e645b583782e868d0f0ab2e038c3c554e81c2040c3e48463d1e078ff1d6ab4932a0b352f34bc51fdd4f8bbd9bf8da66bf9332c85cf4 + languageName: node + linkType: hard + "style-search@npm:^0.1.0": version: 0.1.0 resolution: "style-search@npm:0.1.0" @@ -20945,6 +21625,30 @@ __metadata: languageName: node linkType: hard +"styled-components@npm:^6.1.11": + version: 6.5.3 + resolution: "styled-components@npm:6.5.3" + dependencies: + "@emotion/is-prop-valid": "npm:1.4.0" + css-to-react-native: "npm:3.2.0" + csstype: "npm:3.2.3" + stylis: "npm:4.3.6" + peerDependencies: + css-to-react-native: ">= 3.2.0" + react: ">= 16.8.0" + react-dom: ">= 16.8.0" + react-native: ">= 0.68.0" + peerDependenciesMeta: + css-to-react-native: + optional: true + react-dom: + optional: true + react-native: + optional: true + checksum: 10/58f19a1ea02d8a2288f865e51ac62961453549969a646936b0ca335038286dbc64d7163f740adc817b5a4e96dc412d919797e246d2cb5a46caabde905929b791 + languageName: node + linkType: hard + "stylehacks@npm:^6.1.1": version: 6.1.1 resolution: "stylehacks@npm:6.1.1" @@ -21034,7 +21738,7 @@ __metadata: languageName: node linkType: hard -"stylis@npm:^4.3.6": +"stylis@npm:4.3.6, stylis@npm:^4.3.6": version: 4.3.6 resolution: "stylis@npm:4.3.6" checksum: 10/6ebe8a37827124e0caf0704c13d39c121f6e6a8433eb8c67cfce508477b24a4434d1731198ba0b6e453655022bbf5beda93585f38ff420545e5356f925f83761 @@ -21107,6 +21811,29 @@ __metadata: languageName: node linkType: hard +"swagger2openapi@npm:^7.0.8": + version: 7.0.8 + resolution: "swagger2openapi@npm:7.0.8" + dependencies: + call-me-maybe: "npm:^1.0.1" + node-fetch: "npm:^2.6.1" + node-fetch-h2: "npm:^2.3.0" + node-readfiles: "npm:^0.2.0" + oas-kit-common: "npm:^1.0.8" + oas-resolver: "npm:^2.5.6" + oas-schema-walker: "npm:^1.1.5" + oas-validator: "npm:^5.0.8" + reftools: "npm:^1.1.9" + yaml: "npm:^1.10.0" + yargs: "npm:^17.0.1" + bin: + boast: boast.js + oas-validate: oas-validate.js + swagger2openapi: swagger2openapi.js + checksum: 10/f95fe71d306ff2b5763aaa488465c4f111810a6a19f233d3ed63495a544c040d544b914921d8362e31137290bb249585e07944bd91fbb1ecad2ad6e60e9c5a72 + languageName: node + linkType: hard + "swc-loader@npm:^0.2.6": version: 0.2.6 resolution: "swc-loader@npm:0.2.6" @@ -21423,6 +22150,13 @@ __metadata: languageName: node linkType: hard +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 10/8f1f5aa6cb232f9e1bdc86f485f916b7aa38caee8a778b378ffec0b70d9307873f253f5cbadbe2955ece2ac5c83d0dc14a77513166ccd0a0c7fe197e21396695 + languageName: node + linkType: hard + "tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": version: 1.1.0 resolution: "tree-dump@npm:1.1.0" @@ -22126,6 +22860,13 @@ __metadata: languageName: node linkType: hard +"uri-js-replace@npm:^1.0.1": + version: 1.0.1 + resolution: "uri-js-replace@npm:1.0.1" + checksum: 10/9c6761023a66eea5c7ff75127e3ea733a64362e4fd232203f627ace86d5f170dc69eda80449e3457448591b8a11e566e29cc0746da6392c9f8de4d5911f57e51 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -22152,6 +22893,22 @@ __metadata: languageName: node linkType: hard +"url-template@npm:^2.0.8": + version: 2.0.8 + resolution: "url-template@npm:2.0.8" + checksum: 10/fc6a4cf6c3c3c3d7f0a0bb4405c41b81934e583b454e52ace7b2e5d7ed32ec9c2970ff1826d240c5823955fcb13531a1fc4ff6ba4569b1886a2976665353e952 + languageName: node + linkType: hard + +"use-sync-external-store@npm:^1.4.0": + version: 1.7.0 + resolution: "use-sync-external-store@npm:1.7.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/cc102e193d079dda118846627f97ac8d34059ae7e1112188ed6330bd42a6b31c209cbb39923d4d663ddc42e5969913015778397131fcd3249909756c88ba9906 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -22451,6 +23208,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: 10/b65b9f8d6854572a84a5c69615152b63371395f0c5dcd6729c45789052296df54314db2bc3e977df41705eacb8bc79c247cee139a63fa695192f95816ed528ad + languageName: node + linkType: hard + "webidl-conversions@npm:^4.0.2": version: 4.0.2 resolution: "webidl-conversions@npm:4.0.2" @@ -22649,6 +23413,16 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 10/f95adbc1e80820828b45cc671d97da7cd5e4ef9deb426c31bcd5ab00dc7103042291613b3ef3caec0a2335ed09e0d5ed026c940755dbb6d404e2b27f940fdf07 + languageName: node + linkType: hard + "whatwg-url@npm:^7.0.0": version: 7.1.0 resolution: "whatwg-url@npm:7.1.0" @@ -23137,6 +23911,13 @@ __metadata: languageName: node linkType: hard +"xml-naming@npm:^0.3.0": + version: 0.3.0 + resolution: "xml-naming@npm:0.3.0" + checksum: 10/1a09c3f14747bf243d4bbcfdb9917c40e9cbb4b6464f2b9fe6927976770dfa38eedfe94190b5b6db470f22429fd4bda688b1831ca36a769a6745ccb9bb595150 + languageName: node + linkType: hard + "xtend@npm:^4.0.0, xtend@npm:^4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" @@ -23172,6 +23953,13 @@ __metadata: languageName: node linkType: hard +"yaml-ast-parser@npm:0.0.43": + version: 0.0.43 + resolution: "yaml-ast-parser@npm:0.0.43" + checksum: 10/a54d00c8e0716a392c6e76eee965b3b4bba434494196490946e416fc47f20a1d89820461afacd9431edbb8209e28fce33bcff1fb42dd83f90e51fc31e80251c9 + languageName: node + linkType: hard + "yaml@npm:2.3.1": version: 2.3.1 resolution: "yaml@npm:2.3.1" @@ -23209,6 +23997,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^17.0.1": + version: 17.7.3 + resolution: "yargs@npm:17.7.3" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: 10/a3826798c03b159e139d0580a3b2733953889a9a1bac8e4e1ca7a1a249b55315b213c323a6a1dbdb305f6e59496a9eaa810742c87e34abcf1a0584d8f59212a1 + languageName: node + linkType: hard + "yargs@npm:^17.3.1": version: 17.7.2 resolution: "yargs@npm:17.7.2"