diff --git a/.github/workflows/canary-beta-release.yml b/.github/workflows/canary-beta-release.yml new file mode 100644 index 000000000..6762f3e25 --- /dev/null +++ b/.github/workflows/canary-beta-release.yml @@ -0,0 +1,43 @@ +name: Canary Beta Release + +on: + push: + branches: + - v2.0.0 + paths: + - packages/** + +permissions: + contents: read + +jobs: + publish-canary: + name: Publish Canary Beta + runs-on: ubuntu-latest + if: ${{ github.repository == 'PaloAltoNetworks/docusaurus-openapi-docs' && github.ref == 'refs/heads/v2.0.0' && github.event_name == 'push' }} + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 # Needed to get the commit number with "git rev-list --count HEAD" + - name: Set up Node + uses: actions/setup-node@v3 + with: + node-version: "18" + cache: yarn + - name: Prepare git + run: | + git config --global user.name "Steven Serrata" + git config --global user.email "sserrata@paloaltonetworks.com" + git fetch + git checkout v2.0.0 + echo "//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}" >> .npmrc + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + - name: Installation + run: yarn && yarn build-packages + - name: Publish Canary release + run: | + yarn canaryBeta + env: + NPM_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} diff --git a/.github/workflows/canary-release.yml b/.github/workflows/canary-release.yml index 8426777d3..09b87ae6b 100644 --- a/.github/workflows/canary-release.yml +++ b/.github/workflows/canary-release.yml @@ -17,7 +17,7 @@ jobs: if: ${{ github.repository == 'PaloAltoNetworks/docusaurus-openapi-docs' && github.ref == 'refs/heads/main' && github.event_name == 'push' }} steps: - name: Checkout - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3 + uses: actions/checkout@v3 with: fetch-depth: 0 # Needed to get the commit number with "git rev-list --count HEAD" - name: Set up Node @@ -32,9 +32,6 @@ jobs: git fetch git checkout main echo "//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}" >> .npmrc - cat .npmrc - echo "npm whoami" - npm whoami env: NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} - name: Installation diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index 9f53d6724..b0454c33e 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -5,10 +5,55 @@ on: branches: [main, v2.0.0] jobs: + precheck: + name: Precheck + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + outputs: + is-org-member-result: ${{ steps.is-org-member.outputs.is-org-member-result }} + steps: + - name: Check if actor is org member + id: is-org-member + run: echo "is-org-member-result=$(gh api -X GET orgs/PaloAltoNetworks/memberships/${{ github.actor }} | jq -r .message)" >> "$GITHUB_OUTPUT" + env: + GH_TOKEN: ${{ secrets.PAT }} + analyze: - if: github.repository_owner == 'PaloAltoNetworks' + if: github.repository_owner == 'PaloAltoNetworks' && needs.precheck.outputs.is-org-member-result == 'null' name: Analyze + needs: precheck + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + + strategy: + fail-fast: true + matrix: + language: ["javascript"] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + + analyze_unsafe: + if: github.repository_owner == 'PaloAltoNetworks' && needs.precheck.outputs.is-org-member-result != 'null' + name: Analyze Unsafe + needs: precheck runs-on: ubuntu-latest + environment: default permissions: contents: read security-events: write @@ -34,7 +79,10 @@ jobs: build: name: Build - needs: analyze + needs: [analyze, analyze_unsafe] + if: | + !failure() && !cancelled() && + (success('analyze') || success('analyze_unsafe')) runs-on: ubuntu-latest permissions: contents: read @@ -68,6 +116,7 @@ jobs: deploy: name: Deploy needs: build + if: ${{ !failure() && !cancelled() }} runs-on: ubuntu-latest steps: diff --git a/.github/workflows/release-beta.yaml b/.github/workflows/release-beta.yaml new file mode 100644 index 000000000..5903a8d48 --- /dev/null +++ b/.github/workflows/release-beta.yaml @@ -0,0 +1,31 @@ +name: Release Beta + +on: + push: + branches: + - v2.0.0 + +env: + FORCE_COLOR: true + +jobs: + release: + name: Release Beta + runs-on: ubuntu-latest + if: ${{ github.repository == 'PaloAltoNetworks/docusaurus-openapi-docs' }} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + - uses: actions/setup-node@v2 + with: + node-version: "*" + registry-url: "https://registry.npmjs.org" + - name: Release Beta + run: npx ts-node --transpile-only scripts/publish-beta.ts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b7e3559f6..622a8729a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -4,7 +4,6 @@ on: push: branches: - main - - v2.0.0 env: FORCE_COLOR: true @@ -13,7 +12,7 @@ jobs: release: name: Release runs-on: ubuntu-latest - if: ${{ github.repository == 'PaloAltoNetworks/docusaurus-openapi-docs' && github.ref == 'refs/heads/main' && github.event_name == 'push' }} + if: ${{ github.repository == 'PaloAltoNetworks/docusaurus-openapi-docs' }} steps: - uses: actions/checkout@v3 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b5a61703..740022163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,44 @@ +## 1.7.3 (May 5, 2023) + +High level enhancements + +- Add optional `markdownGenerators` config option ([#567](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/567)) +- Add more debug info to resolveJsonRefs ([#560](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/560)) + +Other enhancements and bug fixes + +- [Bug] Add handler for oneOf properties, fix nested `
  • ` and avoid duplicate properties in createAnyOneOf ([#561](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/561)) + +## 1.7.2 (Apr 20, 2023) + +High level enhancements + +- Upgrade redocly-core and json-schema-ref-parser ([#551](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/551)) + +## 1.7.1 (Apr 20, 2023) + +High level enhancements + +- Remove PWA ([#548](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/548)) +- Add classnames to MethodEndpoint ([#541](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/541)) +- [Enhancement] Add support for rendering vendor extensions ([#527](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/527)) +- Update deploy preview workflow + +## 1.7.0 (Mar 20, 2023) + +High level enhancements + +- Added support for powershell +- Now including `language / variant` in code block title. + +Other enhancements and bug fixes + +- [Bug] Fix double scrollbars ([#504](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/504)) +- [Enhancement] Add support for powershell ([#507](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/507)) +- Bump webpack from 5.75.0 to 5.76.0 ([#498](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/498)) +- [Bug] Set ignoreAdditionalProperties back to true ([#493](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/493)) +- [Bug] Add bold, svg and ensure parity between opening/closing regex ([#479](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/pull/479)) + ## 1.6.1 (Feb 28, 2023) High level enhancements diff --git a/README.md b/README.md index b55e2b573..9dc7e938f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ OpenAPI plugin for generating API reference docs in Docusaurus v2.

    -[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/HEAD/LICENSE) [![npm latest package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/latest.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm downloads](https://img.shields.io/npm/dm/docusaurus-plugin-openapi-docs.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm canary package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/canary.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) +[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/HEAD/LICENSE) [![npm latest package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/latest.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm downloads](https://img.shields.io/npm/dm/docusaurus-plugin-openapi-docs.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm canary package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/canary.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm beta package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/beta.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs)
    [![build](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/actions/workflows/validate.yaml/badge.svg)](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/actions/workflows/validate.yaml) [![prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier) [![Cypress.io](https://img.shields.io/badge/tested%20with-Cypress-04C38E.svg)](https://www.cypress.io/) [![jest](https://jestjs.io/img/jest-badge.svg)](https://github.com/facebook/jest) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/HEAD/CONTRIBUTING.md#pull-requests)
    @@ -35,9 +35,39 @@ Key Features: - **Compatible:** Works with Swagger 2.0 and OpenAPI 3.0. - **Fast:** Convert large OpenAPI specs into MDX docs in seconds. 🔥 - **Stylish:** Based on the same [Infima styling framework](https://infima.dev/) that powers the Docusaurus UI. -- **Capable:** Supports single, multi and _even micro_ OpenAPI specs. +- **Flexible:** Supports single, multi and _even micro_ OpenAPI specs. -## Installation +## Compatibility Matrix + +| Docusaurus OpenAPI Docs | Docusaurus | +| ----------------------- | --------------- | +| 1.x.x | `2.0.1 - 2.2.0` | +| 2.x.x (beta) | `2.3.0 - 2.4.0` | + +## Bootstrapping from Template (new Docusaurus site) + +Run the following to bootstrap a Docsaurus v2 site (classic theme) with `docusaurus-openapi-docs`: + +```bash +npx create-docusaurus@2.2.0 my-website --package-manager yarn +``` + +> When prompted to select a template choose `Git repository`. + +Template Repository URL: + +```bash +https://github.com/PaloAltoNetworks/docusaurus-template-openapi-docs.git +``` + +> When asked how the template repo should be cloned choose "copy" (unless you know better). + +```bash +cd my-website +yarn start +``` + +## Installation (existing Docusaurus site) Plugin: @@ -53,7 +83,7 @@ yarn add docusaurus-theme-openapi-docs ## Configuring `docusaurus.config.js` (Plugin and theme usage) -Here is an example of properly configuring your `docusaurus.config.js` file for `docusaurus-plugin-openapi-docs` and `docusaurus-theme-openapi-docs` usage. +Here is an example of properly configuring `docusaurus.config.js` file for `docusaurus-plugin-openapi-docs` and `docusaurus-theme-openapi-docs` usage. ```js // docusaurus.config.js @@ -66,17 +96,13 @@ Here is an example of properly configuring your `docusaurus.config.js` file for ({ docs: { sidebarPath: require.resolve("./sidebars.js"), - // Please change this to your repo. - // Remove this to remove the "edit this page" links. editUrl: "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/", docLayoutComponent: "@theme/DocPage", - docItemComponent: "@theme/ApiItem" // Derived from docusaurus-theme-openapi-docs + docItemComponent: "@theme/ApiItem" // derived from docusaurus-theme-openapi-docs }, blog: { showReadingTime: true, - // Please change this to your repo. - // Remove this to remove the "edit this page" links. editUrl: "https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/" }, @@ -91,14 +117,14 @@ Here is an example of properly configuring your `docusaurus.config.js` file for [ 'docusaurus-plugin-openapi-docs', { - id: "apiDocs", - docsPluginId: "classic", + id: "api", // plugin id + docsPluginId: "classic", // id of plugin-content-docs or preset for rendering docs config: { - petstore: { // Note: petstore key is treated as the and can be used to specify an API doc instance when using CLI commands - specPath: "examples/petstore.yaml", // Path to designated spec file - outputDir: "api/petstore", // Output directory for generated .mdx docs - sidebarOptions: { - groupPathsBy: "tag", + petstore: { // the referenced when running CLI commands + specPath: "examples/petstore.yaml", // path to OpenAPI spec, URLs supported + outputDir: "api/petstore", // output directory for generated files + sidebarOptions: { // optional, instructs plugin to generate sidebar.js + groupPathsBy: "tag", // group sidebar items by operation "tag" }, }, burgers: { @@ -109,7 +135,7 @@ Here is an example of properly configuring your `docusaurus.config.js` file for }, ] ], - themes: ["docusaurus-theme-openapi-docs"], // Allows use of @theme/ApiItem and other components + themes: ["docusaurus-theme-openapi-docs"], // export theme components } ``` @@ -121,26 +147,28 @@ The `docusaurus-plugin-openapi-docs` plugin can be configured with the following | Name | Type | Default | Description | | -------------- | -------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| `id` | `string` | `null` | A unique document id. | +| `id` | `string` | `null` | A unique plugin ID. | | `docsPluginId` | `string` | `null` | The ID associated with the `plugin-content-docs` or `preset` instance used to render the OpenAPI docs (e.g. "your-plugin-id", "classic", "default"). | ### config `config` can be configured with the following options: -| Name | Type | Default | Description | -| ---------------- | --------- | ------- | --------------------------------------------------------------------------------------------------------------------------- | -| `specPath` | `string` | `null` | Designated URL or path to the source of an OpenAPI specification file or directory of multiple OpenAPI specification files. | -| `ouputDir` | `string` | `null` | Desired output path for generated MDX files. | -| `proxy` | `string` | `null` | _Optional:_ Proxy URL to prepend to base URL when performing API requests from browser. | -| `template` | `string` | `null` | _Optional:_ Customize MDX content with a desired template. | -| `downloadUrl` | `string` | `null` | _Optional:_ Designated URL for downloading OpenAPI specification. (requires `info` section/doc) | -| `hideSendButton` | `boolean` | `null` | _Optional:_ If set to `true`, hides the "Send API Request" button in API demo panel | -| `sidebarOptions` | `object` | `null` | _Optional:_ Set of options for sidebar configuration. See below for a list of supported options. | -| `version` | `string` | `null` | _Optional:_ Version assigned to single or micro-spec API specified in `specPath`. | -| `label` | `string` | `null` | _Optional:_ Version label used when generating version selector dropdown menu. | -| `baseUrl` | `string` | `null` | _Optional:_ Version base URL used when generating version selector dropdown menu. | -| `versions` | `object` | `null` | _Optional:_ Set of options for versioning configuration. See below for a list of supported options. | +| Name | Type | Default | Description | +| -------------------- | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| `specPath` | `string` | `null` | Designated URL or path to the source of an OpenAPI specification file or directory of multiple OpenAPI specification files. | +| `ouputDir` | `string` | `null` | Desired output path for generated MDX and sidebar files. | +| `proxy` | `string` | `null` | _Optional:_ Proxy URL to prepend to base URL when performing API requests from browser. | +| `template` | `string` | `null` | _Optional:_ Customize MDX content with a desired template. | +| `downloadUrl` | `string` | `null` | _Optional:_ Designated URL for downloading OpenAPI specification. (requires `info` section/doc) | +| `hideSendButton` | `boolean` | `null` | _Optional:_ If set to `true`, hides the "Send API Request" button in API demo panel | +| `showExtensions` | `boolean` | `null` | _Optional:_ If set to `true`, renders operation-level vendor-extensions in description. | +| `sidebarOptions` | `object` | `null` | _Optional:_ Set of options for sidebar configuration. See below for a list of supported options. | +| `version` | `string` | `null` | _Optional:_ Version assigned to single or micro-spec API specified in `specPath`. | +| `label` | `string` | `null` | _Optional:_ Version label used when generating version selector dropdown menu. | +| `baseUrl` | `string` | `null` | _Optional:_ Version base URL used when generating version selector dropdown menu. | +| `versions` | `object` | `null` | _Optional:_ Set of options for versioning configuration. See below for a list of supported options. | +| `markdownGenerators` | `object` | `null` | _Optional:_ Customize MDX content with a set of options for specifying markdown generator functions. See below for a list of supported options. | `sidebarOptions` can be configured with the following options: @@ -165,6 +193,16 @@ The `docusaurus-plugin-openapi-docs` plugin can be configured with the following > All versions will automatically inherit `sidebarOptions` from the parent/base config. +### markdownGenerators + +`markdownGenerators` can be configured with the following options: + +| Name | Type | Default | Description | +| ------------------ | ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| `createApiPageMD` | `function` | `null` | _Optional:_ Returns a string of the raw markdown body for API pages.

    **Function type:** `(pageData: ApiPageMetadata) => string` | +| `createInfoPageMD` | `function` | `null` | _Optional:_ Returns a string of the raw markdown body for info pages.

    **Function type:** `(pageData: InfoPageMetadata) => string` | +| `createTagPageMD` | `function` | `null` | _Optional:_ Returns a string of the raw markdown body for tag pages.

    **Function type:** `(pageData: TagPageMetadata) => string` | + ## CLI Usage ```bash @@ -255,29 +293,6 @@ yarn docusaurus gen-api-docs:version petstore:all > Substitue `all` with a specific version ID to generate/clean a specific version. Generating for `all` or a specific version ID will automatically update the `versions.json` file. -## Installing from Template - -Run the following to bootstrap a Docsaurus v2 site (classic theme) with `docusaurus-openapi-docs`: - -```bash -npx create-docusaurus@2.1.0 my-website --package-manager yarn -``` - -> When prompted to select a template choose `Git repository`. - -Template Repository URL: - -```bash -https://github.com/PaloAltoNetworks/docusaurus-template-openapi-docs.git -``` - -> When asked how the template repo should be cloned choose "copy" (unless you know better). - -```bash -cd my-website -yarn -``` - ## Developer Quick Start > Looking to make a contribution? Make sure to checkout out our contributing guide. diff --git a/demo/api.mustache b/demo/api.mustache index 95f5cbb77..9a78cab49 100644 --- a/demo/api.mustache +++ b/demo/api.mustache @@ -31,6 +31,9 @@ proxy: {{{frontMatter.proxy}}} {{#frontMatter.hide_send_button}} hide_send_button: true {{/frontMatter.hide_send_button}} +{{#frontMatter.show_extensions}} +show_extensions: true +{{/frontMatter.show_extensions}} --- {{{markdown}}} \ No newline at end of file diff --git a/demo/docs/customization/languagetabs.md b/demo/docs/customization/languagetabs.md index bdcf89f28..0d9de3d36 100644 --- a/demo/docs/customization/languagetabs.md +++ b/demo/docs/customization/languagetabs.md @@ -10,16 +10,17 @@ description: Configuring language tabs for the API Demo Panel. The Docusaurus OpenAPI docs plugin comes with support for 8 languages which you can render as code snippets on an API operation page. The languages currently supported are: -| Language | Prism Highlighter | Variants | -| -------- | ----------------- | ------------------------------------------------ | -| `curl` | bash | `curl`\* | -| `python` | python | `requests`\*, `http.client` | -| `go` | go | `native`\* | -| `nodejs` | javascript | `axios`\*, `native`, `requests`, `unirest` | -| `ruby` | ruby | `net::http`\* | -| `csharp` | csharp | `restsharp`\*, `httpclient` | -| `php` | php | `curl`\*, `guzzle`, `pecl_http`, `http_request2` | -| `java` | java | `okhttp`\*, `unirest` | +| Language | Prism Highlighter | Variants | +| ------------ | ----------------- | ------------------------------------------------ | +| `curl` | bash | `curl`\* | +| `python` | python | `requests`\*, `http.client` | +| `go` | go | `native`\* | +| `nodejs` | javascript | `axios`\*, `native`, `requests`, `unirest` | +| `ruby` | ruby | `net::http`\* | +| `csharp` | csharp | `restsharp`\*, `httpclient` | +| `php` | php | `curl`\*, `guzzle`, `pecl_http`, `http_request2` | +| `java` | java | `okhttp`\*, `unirest` | +| `powershell` | powershell | `RestMethod`\* | \* Default variant @@ -60,6 +61,7 @@ The demo site disables the `ruby` and `php` languages using the following `langu highlight: "python", language: "python", logoClass: "python", + variant: "requests", }, { highlight: "go", @@ -70,26 +72,34 @@ The demo site disables the `ruby` and `php` languages using the following `langu highlight: "javascript", language: "nodejs", logoClass: "nodejs", + variant: "axios", + }, + { + highlight: "ruby", + language: "ruby", + logoClass: "ruby", }, - // { - // highlight: "ruby", - // language: "ruby", - // logoClass: "ruby", - // }, { highlight: "csharp", language: "csharp", logoClass: "csharp", + variant: "httpclient", + }, + { + highlight: "php", + language: "php", + logoClass: "php", }, - // { - // highlight: "php", - // language: "php", - // logoClass: "php", - // }, { highlight: "java", language: "java", logoClass: "java", + variant: "unirest", + }, + { + highlight: "powershell", + language: "powershell", + logoClass: "powershell", }, ], ``` diff --git a/demo/docs/intro.mdx b/demo/docs/intro.mdx index 6881bbfab..06356dcdc 100644 --- a/demo/docs/intro.mdx +++ b/demo/docs/intro.mdx @@ -27,7 +27,7 @@ OpenAPI plugin for generating API reference docs in Docusaurus v2.

    -[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/HEAD/LICENSE) [![npm latest package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/latest.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm downloads](https://img.shields.io/npm/dm/docusaurus-plugin-openapi-docs.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm canary package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/canary.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) +[![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/HEAD/LICENSE) [![npm latest package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/latest.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm downloads](https://img.shields.io/npm/dm/docusaurus-plugin-openapi-docs.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm canary package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/canary.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs) [![npm beta package](https://img.shields.io/npm/v/docusaurus-plugin-openapi-docs/beta.svg)](https://www.npmjs.com/package/docusaurus-plugin-openapi-docs)