diff --git a/.github/workflows/demo-deploy-s3.yml b/.github/workflows/demo-deploy-s3.yml
deleted file mode 100644
index efb2ca19..00000000
--- a/.github/workflows/demo-deploy-s3.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: Redoc demo CI/CD
-
-on:
- push:
- tags:
- - v[0-9]*.[0-9]*.[0-9]*
-
-jobs:
- build-and-unit:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v1
- - run: npm ci
- - run: npm run bundle
- - run: npm test
- deploy:
- needs: build-and-unit
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v1
- - name: cache node modules
- uses: actions/cache@v1
- with:
- path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
- key: npm-${{ hashFiles('package-lock.json') }}
- restore-keys: |
- npm-${{ hashFiles('package-lock.json') }}
- npm-
- - name: Configure AWS Credentials
- uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- aws-region: us-east-1
- - name: Install dependencies
- run: npm ci
- - name: Build package
- run: npm run build:demo
- - name: Deploy to S3 bucket
- run: npm run deploy:demo
- - name: Invalidate
- run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CF_DEMO_DISTRIBUTION_ID }} --paths "/*"
diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
new file mode 100644
index 00000000..514a3193
--- /dev/null
+++ b/.github/workflows/e2e-tests.yml
@@ -0,0 +1,12 @@
+name: Tests e2e
+
+on: [push]
+
+jobs:
+ build-and-e2e:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - run: npm ci
+ - run: npm run bundle
+ - run: npm run e2e
diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml
new file mode 100644
index 00000000..ea39efae
--- /dev/null
+++ b/.github/workflows/publish-cli.yml
@@ -0,0 +1,121 @@
+name: Publish cli
+
+on:
+ push:
+ branches:
+ - master
+
+
+jobs:
+ bundle:
+ needs: [ check-version-cli ]
+ if: needs.check-version-cli.outputs.changed == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v2
+ - name: Cache node modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
+ key: npm-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ npm-${{ hashFiles('package-lock.json') }}
+ npm-
+ - run: npm ci
+ - run: npm run bundle
+ - name: Store bundle artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: bundles-cli
+ path: bundles
+ retention-days: 1
+ unit-tests:
+ needs: [ check-version-cli ]
+ if: needs.check-version-cli.outputs.changed == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - run: npm ci
+ - run: npm test
+ e2e-tests:
+ needs: [ bundle ]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - run: npm ci
+ - name: Download bundled artifact
+ uses: actions/download-artifact@v2
+ with:
+ name: bundles-cli
+ path: bundles
+ - run: npm run e2e
+ bundle-cli:
+ needs: [ check-version-cli ]
+ if: needs.check-version-cli.outputs.changed == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v2
+ - name: Cache node modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm
+ key: npm-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ npm-${{ hashFiles('package-lock.json') }}
+ npm-
+ - name: Install dependencies
+ run: npm ci
+ - name: Bundle
+ run: npm run compile:cli
+ - name: Store bundle artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: cli
+ path: cli
+ retention-days: 1
+ check-version-cli:
+ name: Check Version
+ runs-on: ubuntu-latest
+ outputs:
+ changed: ${{ steps.check.outputs.changed }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ - name: Check if version has been updated
+ id: check
+ uses: EndBug/version-check@v2.0.1
+ with:
+ file-name: ./cli/package.json
+ file-url: https://unpkg.com/redoc-cli/package.json
+ static-checking: localIsNew
+ publish-cli:
+ needs: [bundle-cli, unit-tests, e2e-tests]
+ if: needs.check-version-cli.outputs.changed == 'true'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/setup-node@v1
+ with:
+ node-version: "14.x"
+ registry-url: 'https://registry.npmjs.org'
+ - uses: actions/checkout@v2
+ - name: Download cli bundled artifact
+ uses: actions/download-artifact@v2
+ with:
+ name: cli
+ path: cli
+ - name: Cache node modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
+ key: npm-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ npm-${{ hashFiles('package-lock.json') }}
+ npm-
+ - name: Publish to NPM
+ run: cd cli/ && npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 00000000..b6d05316
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,100 @@
+name: Publish
+
+on:
+ push:
+ tags:
+ - v[0-9]*.[0-9]*.[0-9]*
+
+jobs:
+ bundle:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v2
+ - name: Cache node modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
+ key: npm-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ npm-${{ hashFiles('package-lock.json') }}
+ npm-
+ - run: npm ci
+ - run: npm run bundle
+ - name: Store bundle artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: bundles
+ path: bundles
+ retention-days: 1
+ unit-tests:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - run: npm ci
+ - run: npm test
+ e2e-tests:
+ needs: [bundle]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v1
+ - run: npm ci
+ - name: Download bundled artifact
+ uses: actions/download-artifact@v2
+ with:
+ name: bundles
+ path: bundles
+ - run: npm run e2e
+ # disable this for now
+ # deploy-demo:
+ # needs: [bundle, unit-tests, e2e-tests]
+ # runs-on: ubuntu-latest
+ # steps:
+ # - uses: actions/checkout@v1
+ # - name: Configure AWS Credentials
+ # uses: aws-actions/configure-aws-credentials@v1
+ # with:
+ # aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ # aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ # aws-region: us-east-1
+ # - name: Install dependencies
+ # run: npm ci
+ # - name: Download bundled artifacts
+ # uses: actions/download-artifact@v2
+ # with:
+ # name: bundles
+ # path: bundles
+ # - name: Build package
+ # run: npm run build:demo
+ # - name: Deploy to S3 bucket
+ # run: npm run deploy:demo
+ # - name: Invalidate
+ # run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CF_DEMO_DISTRIBUTION_ID }} --paths "/*"
+ publish:
+ needs: [bundle, unit-tests, e2e-tests]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/setup-node@v1
+ with:
+ node-version: "14.x"
+ registry-url: 'https://registry.npmjs.org'
+ - uses: actions/checkout@v2
+ - name: Download bundled artifacts
+ uses: actions/download-artifact@v2
+ with:
+ name: bundles
+ path: bundles
+ - name: Cache node modules
+ uses: actions/cache@v2
+ with:
+ path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS
+ key: npm-${{ hashFiles('package-lock.json') }}
+ restore-keys: |
+ npm-${{ hashFiles('package-lock.json') }}
+ npm-
+ - name: Before deploy
+ run: npm ci && npm run declarations
+ - name: Publish to NPM
+ run: npm publish
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml
index 09e54a63..a0a0bbd1 100644
--- a/.github/workflows/unit-tests.yml
+++ b/.github/workflows/unit-tests.yml
@@ -9,4 +9,4 @@ jobs:
- uses: actions/checkout@v1
- run: npm ci
- run: npm run bundle
- - run: npm test
+ - run: npm test
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 03ac1fa4..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-language: node_js
-node_js:
-- '12'
-cache:
- directories:
- - "~/.cache"
-env:
- global:
- - GH_REF: github.com/Redocly/redoc.git
- - GIT_AUTHOR_EMAIL: redoc-bot@users.noreply.github.com
- - GIT_AUTHOR_NAME: RedocBot
- - secure: apiavCfCQngL9Een1m7MIXMf3bqO3rY4YY59TMBl/yFKi80CEsHPHhgVUkl6hC+aM5PeBt/vgjh37rHMX31j/pcSZ4Z8SO/4Bwr36iHfhSxSEuAQog8P07qWqH7wYYWGIVmF682stgl0fYF+GN92sx/6edFVzsWVECf2G7imtICKSTbhKGm3Dhn2JwGnhD7eyfgZ33omgiaswumdu0xABoXDfqSZR+16fC4Ap5rhv3fXO9ndvRNy1STn376nT+my6e86UrQL4aS/S+HNHgIe1BUs+5cOp6Jgw6t0ie7phY0EAiECsRxy9K4e3Dctv9m6+Wma4+vy65MS0zGyrqey6oyV4l827sCOjrD1qcqc9bX6FlMSouVoNfE4ZjINNAbgigTaiLSoDSPcf5I5smkkM2ezzFOMSZwZxNdaNL2LKb97vc8m/ZUkv0sKZyT7oqVL7aJweEivsSHj5l2KR8Z7XrVB1y2eI6GvyTSa/d+CL4dSRzjh8+IRN047YBrdTKD5IkdT0upfoBu14WPUfFmLKxX+iMCslXRWb6kwojhrWNYmZvL65KRAzJ6+eIPDG/W5QUOpYyYT77bLlBQjVo6NmVvl9v3HMECq9CHH0ivKFBGPiKMOx7cJkTax3FuyznOW2WCXB9kTb5Zk9toaiNlSp9L6ll/h2Eyxa6n6sWUgmmM=
- - secure: vVRg9BKGBwF2MbXQnEccFL+XW0/7RaBmge9k7jbGYScBwkP3XjnQ/Xaj0cvTz2CM2EqXsbpwfvr4Jo+enW/E3MGy5RiEzv5hUe/jIFRR0gfAFbZxSTvg5xiFhTDffqQk0fncO4jXu+wPO5lZ2CMRWzyXz3i1MZhjMcAgoDr1+TRss/EGXLNHxr2RM88tpUW0fV2prIRoyGqhCgnYZtrm7hmr41Ej+itg1MqZLml/Rjkt3KsNgI+z0O5Qn3QSAO8GtPZqeftQxAjevOmxZGcssxY8EJvqbjAujr4y51WncXpEmCRPSY2J9R5+fkgZurqwnJapbQpjwKYemok3ps7EHg2gWkAlmPdQO4LKpbffGkM/o5b+8+HdIuQZugsSWQD9hUSftTAFLcfA1isi7V2lHE1m8bX/vk9zIyDdcPSwIaFe9y+w3PexwFmTjPLq+nia/UY2kARFZMEIFAJby6gkA70DcAJ50QOM86InJu5DSzGbIssgTGAXCn0TPPyGveaurVLw8x61j3yh8LDF46gUHey3rqv6WjpCM9h/vg7X/gq5ve/5Q2KHscUKfs/sA53Mt7qPeqRZY1QCaaRjzqJO/ZraHqWWeKmPKaWhPGR0kYEnkvB+K9GZ+HNSWCltjCO4SJ1xeEl7CRqQxAwdiMATF5SKqyiC+bn5oc35mFgbRF8=
- - secure: ela1tn4wkJQZ8O4iv+4pIZi5cebxeCStVF1tEUe6qa6WWgJYVXmS2tEv3QQ36NUBFrP58Y6yl10XguPnvj/2BCqcZI4FUBHh3BfiBoUtXxDCVKI5LtlniNiOFGUwfzEeYka8T51zFlcUXSCCaxHkRZbmBsIzeJ39UwTi5fy0qwLv9GgL0czhwm8I8sZ8gyWdGmqpXNFEsb9JP4ZA3mw2qpWkGpGAqQPD9XSCkU3LmX1/ltwsBMAgGYKLLo7vU8d5KV2c8L1Gnxfl6BvfmqUD/dsas/1rnk08rU2nez5ekuQa2tJRkDLOv8bqvrGRLjHSUa3yPuisC6SsDGSU7/3DcozZyYsz7WQ6WI8tYabyjqqeJTF1N8a5T3IbZaZNV1J4JHOO9Cb/y7gIg4edANg6tbe7MzZpdEPRBnw6OkdTdirpNsWQ/jnfpY1hn6mraQZz/q8yaz3W21NjbBJhVnvfh5gWLKQ3YAAziCBhmmrThFhUu0czz+G920MuFo477TBcxvlrE7CaNJ0Q6yYkDehEPOv3jvEs1QVHPwuRrlaLTbBhrlTICKZ58gdX30O8N4i0Xgp/v6qrC03bplnMQc8E/uC61wcVLJixnlZVp8FODpUvPjsxVFkpuNSOIAaiqcERmoiPXx05Epzmr78hjU5rYCx/1MmVoeB4gs9YO+4guD4=
-addons:
- chrome: stable
- apt:
- packages:
- - libgconf-2-4
-before_script: npm run bundle
-script: npm test && ([ "${TRAVIS_PULL_REQUEST}" = "false" ] && npm run e2e-ci || npm
- run e2e)
-after_script: cat ./coverage/lcov.info | coveralls
-before_deploy: npm run compile:cli && npm run declarations
-deploy:
-- provider: npm
- skip_cleanup: true
- email: gotsijroman@gmail.com
- tag: next
- api_key: "$NPM_TOKEN"
- on:
- tags: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b73fb105..0ee0e446 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,26 @@
+# [2.0.0-rc.57](https://github.com/Redocly/redoc/compare/v2.0.0-rc.56...v2.0.0-rc.57) (2021-10-11)
+
+
+### Bug Fixes
+
+* fix deref logic for oas3.1 ([#1767](https://github.com/Redocly/redoc/issues/1767)) ([4fb9c83](https://github.com/Redocly/redoc/commit/4fb9c835256b9e44bcecabde7baf0f0f3e5beb3f))
+* improve publish action scripts ([#1729](https://github.com/Redocly/redoc/issues/1729)) ([952c05c](https://github.com/Redocly/redoc/commit/952c05c6b4b95fe6082611fed9e2f0913272b904))
+* No match scenario in search ([#1667](https://github.com/Redocly/redoc/issues/1667)) ([352a851](https://github.com/Redocly/redoc/commit/352a8518576dfb6b240ec41212a64f1c7312ab67))
+* OpenAPI 3.1: Missing description when $ref used [#1727](https://github.com/Redocly/redoc/issues/1727) ([fe6909e](https://github.com/Redocly/redoc/commit/fe6909ed80dd6053b48c30f63a2460614bf957a9))
+* OpenAPI 3.1: Missing description when $ref used [#1727](https://github.com/Redocly/redoc/issues/1727) ([35f7787](https://github.com/Redocly/redoc/commit/35f77878de7d1dd250040771f17757a5a6ce85f9))
+* Redoc spelling ([c87600d](https://github.com/Redocly/redoc/commit/c87600d520f037d291169b44b5803a35af16b5a5))
+* Schema for events incorrectly omits readOnly and includes writeOnly ([#1720](https://github.com/Redocly/redoc/issues/1720) [#1540](https://github.com/Redocly/redoc/issues/1540)) ([a8e0c29](https://github.com/Redocly/redoc/commit/a8e0c296852661dec1dcad2388d7589f9e0d3609))
+* scrolling to the first item ([#1753](https://github.com/Redocly/redoc/issues/1753)) ([bccd213](https://github.com/Redocly/redoc/commit/bccd21394ef79940c2efbe24a0d866c7af103d94))
+* The number of items in the array in the array is incorrect [#1762](https://github.com/Redocly/redoc/issues/1762) ([#1763](https://github.com/Redocly/redoc/issues/1763)) ([3b8d644](https://github.com/Redocly/redoc/commit/3b8d6441bd9978b849a53021d40fd4fe150272ea))
+
+
+### Features
+
+* add q/kdb+ syntax highlighting ([#1605](https://github.com/Redocly/redoc/issues/1605)) ([43451ba](https://github.com/Redocly/redoc/commit/43451ba4cd24270b8629a967d3fd2ce2eed8912e))
+* new option generatedPayloadSamplesMaxDepth ([#1642](https://github.com/Redocly/redoc/issues/1642)) ([bd9390a](https://github.com/Redocly/redoc/commit/bd9390a5bfc5458c06121110db33968a20fcebe4))
+
+
+
# [2.0.0-rc.56](https://github.com/Redocly/redoc/compare/v2.0.0-rc.53...v2.0.0-rc.56) (2021-08-11)
diff --git a/README.md b/README.md
index 63e50ffb..901694c8 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
-

+

- **OpenAPI/Swagger-generated API Reference Documentation**
+ # Generate interactive API documentation from OpenAPI definitions
[](https://travis-ci.com/Redocly/redoc) [](https://coveralls.io/github/Redocly/redoc?branch=master) [](https://david-dm.org/Redocly/redoc) [](https://david-dm.org/Redocly/redoc#info=devDependencies) [](https://www.npmjs.com/package/redoc) [](https://github.com/Redocly/redoc/blob/master/LICENSE)
@@ -11,30 +11,93 @@
**This is the README for the `2.x` version of Redoc (React-based).**
**The README for the `1.x` version is on the [v1.x](https://github.com/Redocly/redoc/tree/v1.x) branch**
-
+## About Redoc
-## [Live demo](http://redocly.github.io/redoc/)
+Redoc is an open-source tool for generating documentation from OpenAPI (fka Swagger) definitions.
-[

](https://github.com/Rebilly/generator-openapi-repo#generator-openapi-repo--) [

](https://redoc.ly) [

](https://redoc.ly/#services)
+By default Redoc offers a three-panel, responsive layout:
+
+- The left panel contains a search bar and navigation menu.
+- The central panel contains the documentation.
+- The right panel contains request and response examples.
+
+
+
+## Live demo
+
+If you want to see how Redoc will render your OpenAPI definition,
+you can try it out online at https://redocly.github.io/redoc/.
+
+A version of the Swagger Petstore API is displayed by default.
+To test it with your own OpenAPI definition,
+enter the URL for your definition and select **TRY IT**.
+
+## Redoc vs. Reference vs. Portals
+
+Redoc is Redocly's community-edition product. Looking for something more?
+Checkout the following feature comparison of Redocly's premium products versus Redoc:
+
+| Features | Redoc | Reference | Portals |
+|------------------------------|:---------:|:---------:|:-----------:|
+| **Specs** | | | |
+| Swagger 2.0 | √ | √ | √ |
+| OpenAPI 3.0 | √ | √ | √ |
+| OpenAPI 3.1 | √ (basic) | √ | √ |
+| | | | |
+| **Theming** | | | |
+| Fonts/colors | √ | √ | √ |
+| Extra theme options | | √ | √ |
+| | | | |
+| **Performance** | | | |
+| Pagination | | √ | √ |
+| Search (enhanced) | | √ | √ |
+| Search (server-side) | | | √ |
+| | | | |
+| **Multiple APIs** | | | |
+| Multiple versions | | √ | √ |
+| Multiple APIs | | | √ |
+| API catalog | | | √ |
+| | | | |
+| **Additional features** | | | |
+| Try-it console | | √ | √ |
+| Automated code samples | | √ | √ |
+| Deep links | | √ | √ |
+| More SEO control | | | √ |
+| Contextual docs | | | √ |
+| Landing pages | | | √ |
+| React hooks for more control | | | √ |
+| Personalization | | | √ |
+| Analytics integrations | | | √ |
+| Feedback | | | Coming Soon |
+
+Refer to the Redocly's documentation for more information on these products:
+
+- [Portals](https://redoc.ly/docs/developer-portal/introduction/)
+- [Reference](https://redoc.ly/docs/api-reference-docs/getting-started/)
+- [Redoc](https://redoc.ly/docs/redoc/quickstart/intro/)
## Features
-- [Multiple deployment options](https://redoc.ly/docs/redoc/deployment/intro/)
-- [Server-side rendering (SSR) ready](https://redoc.ly/docs/redoc/deployment/cli/#redoc-cli-commands)
-- [Simple integration with `create-react-app`](https://redoc.ly/docs/redoc/deployment/react/)
-
- [See an example](https://github.com/APIs-guru/create-react-app-redoc)
-- [Command-line interface to bundle your docs into a **zero-dependency** HTML file](https://redoc.ly/docs/redoc/deployment/cli/)
- Responsive three-panel design with menu/scrolling synchronization
-- Deep linking support
+- [Multiple deployment options](https://redoc.ly/docs/redoc/quickstart/intro/)
+- [Server-side rendering (SSR) ready](https://redoc.ly/docs/redoc/quickstart/cli/#redoc-cli-commands)
- Ability to integrate your API introduction into the side menu
-- High-level grouping in side-menu with [`x-tagGroups`](https://redoc.ly/docs/api-reference-docs/specification-extensions/x-tag-groups/) specification extension
+- [Simple integration with `create-react-app`](https://redoc.ly/docs/redoc/quickstart/react/)
+
+ [Example repo](https://github.com/APIs-guru/create-react-app-redoc)
+- [Command-line interface to bundle your docs into a **zero-dependency** HTML file](https://redoc.ly/docs/redoc/quickstart/cli/)
+- Neat **interactive** documentation for nested objects
+ 
+
+## Customization options
+[

](https://redoc.ly/#services)
+- High-level grouping in side-menu with the [`x-tagGroups`](https://redoc.ly/docs/api-reference-docs/specification-extensions/x-tag-groups/) specification extension
- Branding/customizations using the [`theme` option](https://redoc.ly/docs/api-reference-docs/configuration/theming/)
+
+## Support
- OpenAPI v3.0 support
- Basic OpenAPI v3.1 support
- Broad OpenAPI v2.0 feature support (yes, it supports even `discriminator`)

-- Neat **interactive** documentation for nested objects
- 
- Code samples support (via vendor extension)

@@ -44,12 +107,12 @@
- `next` release: https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js
Additionally, all the 1.x releases are hosted on our GitHub Pages-based CDN **(deprecated)**:
-- particular release, e.g. `v1.2.0`: https://rebilly.github.io/ReDoc/releases/v1.2.0/redoc.min.js
+- particular release, for example `v1.2.0`: https://rebilly.github.io/ReDoc/releases/v1.2.0/redoc.min.js
- `v1.x.x` release: https://rebilly.github.io/ReDoc/releases/v1.x.x/redoc.min.js
- `latest` release: https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js - it will point to latest 1.x.x release since 2.x releases are not hosted on this CDN but on unpkg.
## Version Guidance
-| ReDoc Release | OpenAPI Specification |
+| Redoc Release | OpenAPI Specification |
|:--------------|:----------------------|
| 2.0.0-alpha.54| 3.1, 3.0.x, 2.0 |
| 2.0.0-alpha.x | 3.0, 2.0 |
@@ -66,16 +129,60 @@ Additionally, all the 1.x releases are hosted on our GitHub Pages-based CDN **(d
- [APIs.guru](https://apis.guru/api-doc/)
- [BoxKnight](https://www.docs.boxknight.com/)
+## Lint OpenAPI definitions
+
+Redocly's OpenAPI CLI is an open source command-line tool that you can use to lint
+your OpenAPI definition. Linting helps you to catch errors and inconsistencies in your
+OpenAPI definition before publishing.
+
+Refer to [Lint configuration](https://redoc.ly/docs/cli/guides/lint/) in the OpenAPI documentation for more information.
+
## Deployment
+
+### TL;DR final code example
+
+To render your OpenAPI definition using Redoc, use the following HTML code sample and
+replace the `spec-url` attribute with the url or local file address to your definition.
+
+```html
+
+
+
+
Redoc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
For step-by-step instructions for how to get started using Redoc
to render your OpenAPI definition, refer to the
-[Redoc quickstart guide](https://redoc.ly/docs/redoc/quickstart/intro/).
+[**Redoc quickstart guide**](https://redoc.ly/docs/redoc/quickstart/intro/).
-[**IE11 Support Notes**](docs/usage-with-ie11.md)
+See [**IE11 Support Notes**](docs/usage-with-ie11.md) for information on
+IE support for Redoc.
-## ReDoc CLI
+## Redoc CLI
For more information on Redoc's commmand-line interface, refer to
-[Using the Redoc CLI](https://redoc.ly/docs/redoc/quickstart).
+[**Using the Redoc CLI**](https://redoc.ly/docs/redoc/quickstart/cli/).
+
## Configuration
@@ -105,6 +212,7 @@ You can use all of the following options with the standalone version of the
=0.10.0"
}
},
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/ripemd160": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
@@ -2451,22 +2454,22 @@
"integrity": "sha512-GoXw0U2Qaa33m3eUcxuHnHpNvHjNlLo0gtV091XBpaRINaB4X6FGCG5XKxSFNFiPpugUDqNruHzaqpTdDm4AOg=="
},
"@redocly/ajv": {
- "version": "6.12.4",
- "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-6.12.4.tgz",
- "integrity": "sha512-RB6vWO78v6c+SW/3bZh+XZMr4nGdJKAiPGsBALuUZnLuCiQ7aXCT1AuFHqnfS2gyXbEUEj+kw8p4ux8KdAfs3A==",
+ "version": "8.6.2",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.2.tgz",
+ "integrity": "sha512-tU8fQs0D76ZKhJ2cWtnfQthWqiZgGBx0gH0+5D8JvaBEBaqA8foPPBt3Nonwr3ygyv5xrw2IzKWgIY86BlGs+w==",
"requires": {
"fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
}
},
"@redocly/openapi-core": {
- "version": "1.0.0-beta.50",
- "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.50.tgz",
- "integrity": "sha512-GuXn4IETxpbRd8dlAQDQPtvqOpbMvPMeC/e5mv5MOXkLIznNk4vjiQVe6QSCbZbCHzzpb2+89B6S7asebPm4Rg==",
+ "version": "1.0.0-beta.62",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.62.tgz",
+ "integrity": "sha512-g4iPB7qpSNFCOpf/FgKiic+QCaCn4mdNQOWVEPuwpN7l72hlQ7J3YUa9cssJomkJXXxZ1zdP4h208s12LkhwVA==",
"requires": {
- "@redocly/ajv": "^6.12.3",
+ "@redocly/ajv": "^8.6.2",
"@types/node": "^14.11.8",
"colorette": "^1.2.0",
"js-levenshtein": "^1.1.6",
@@ -2478,9 +2481,9 @@
},
"dependencies": {
"@types/node": {
- "version": "14.17.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.3.tgz",
- "integrity": "sha512-e6ZowgGJmTuXa3GyaPbTGxX17tnThl2aSSizrFthQ7m9uLGZBXiGhgE55cjRZTF5kjZvYn9EOPOMljdjwbflxw=="
+ "version": "14.17.21",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.21.tgz",
+ "integrity": "sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA=="
}
}
},
@@ -2525,7 +2528,8 @@
"@types/node": {
"version": "15.12.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
- "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww=="
+ "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
+ "dev": true
},
"ansi-regex": {
"version": "5.0.0",
@@ -2841,9 +2845,9 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"colorette": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
- "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="
},
"concat-map": {
"version": "0.0.1",
@@ -3064,11 +3068,6 @@
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
"fast-safe-stringify": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
@@ -3273,9 +3272,9 @@
}
},
"json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
},
"lodash": {
"version": "4.17.21",
@@ -3741,14 +3740,13 @@
}
},
"redoc": {
- "version": "2.0.0-rc.56",
- "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0-rc.56.tgz",
- "integrity": "sha512-ir2TtQ2d/1FqZWIoLmUZ3qvAAnO6jg8dt0SV75TanmfCXpEABcElXWH3mtUf6qKlvgDVt40diDCVuSvyPPxkAw==",
+ "version": "2.0.0-rc.57",
+ "resolved": "https://registry.npmjs.org/redoc/-/redoc-2.0.0-rc.57.tgz",
+ "integrity": "sha512-f8XIqvZF1agphq6xmOU9jTDVNDFHJt3MzDq1lUgZojb/7YY4eqLyDi6er/yCWYkY9DuB+v2jHCOn5UUbMuKAfg==",
"requires": {
"@babel/runtime": "^7.14.0",
- "@redocly/openapi-core": "^1.0.0-beta.50",
+ "@redocly/openapi-core": "^1.0.0-beta.54",
"@redocly/react-dropdown-aria": "^2.0.11",
- "@types/node": "^15.6.1",
"classnames": "^2.3.1",
"decko": "^1.2.0",
"dompurify": "^2.2.8",
@@ -3794,6 +3792,11 @@
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
},
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+ },
"ripemd160": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
diff --git a/cli/package.json b/cli/package.json
index 379f5cfe..c5289576 100644
--- a/cli/package.json
+++ b/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "redoc-cli",
- "version": "0.12.3",
+ "version": "0.13.0",
"description": "ReDoc's Command Line Interface",
"main": "index.js",
"bin": "index.js",
@@ -19,7 +19,7 @@
"node-libs-browser": "^2.2.1",
"react": "^17.0.1",
"react-dom": "^17.0.1",
- "redoc": "2.0.0-rc.56",
+ "redoc": "2.0.0-rc.57",
"styled-components": "^5.3.0",
"yargs": "^17.0.1"
},
diff --git a/demo/openapi-3-1.yaml b/demo/openapi-3-1.yaml
index 31063d4b..ac89619d 100644
--- a/demo/openapi-3-1.yaml
+++ b/demo/openapi-3-1.yaml
@@ -533,6 +533,20 @@ paths:
subscriptionId:
type: string
example: AAA-123-BBB-456
+ '200':
+ description: Successful operation
+ content:
+ application/json:
+ schema:
+ type: array
+ maxItems: 999
+ minItems: 0
+ items:
+ type: array
+ maxItems: 777
+ minItems: 111
+ items:
+ type: number
callbacks:
orderInProgress:
'{$request.body#/callbackUrl}?event={$request.body#/eventName}':
diff --git a/demo/openapi.yaml b/demo/openapi.yaml
index c570cc60..5cf19340 100644
--- a/demo/openapi.yaml
+++ b/demo/openapi.yaml
@@ -377,7 +377,9 @@ paths:
application/xml:
schema:
type: array
+ maxItems: 999
items:
+ maxItems: 111
$ref: '#/components/schemas/Pet'
'400':
description: Invalid tag value
diff --git a/docs/images/redoc.png b/docs/images/redoc.png
new file mode 100644
index 00000000..15579760
Binary files /dev/null and b/docs/images/redoc.png differ
diff --git a/e2e/integration/menu.e2e.ts b/e2e/integration/menu.e2e.ts
index e1b053d1..533fb0ea 100644
--- a/e2e/integration/menu.e2e.ts
+++ b/e2e/integration/menu.e2e.ts
@@ -25,6 +25,29 @@ describe('Menu', () => {
.should('be.visible');
});
+ it('should sync active menu items while scroll back and scroll again', () => {
+ cy.contains('h2', 'Add a new pet to the store')
+ .scrollIntoView()
+ .wait(100)
+ .get('[role=menuitem].active')
+ .children()
+ .last()
+ .should('have.text', 'Add a new pet to the store')
+ .should('be.visible');
+
+ cy.contains('h1', 'Swagger Petstore')
+ .scrollIntoView()
+ .wait(100)
+
+ cy.contains('h1', 'Introduction')
+ .scrollIntoView()
+ .wait(100)
+ .get('[role=menuitem].active')
+ .should('have.text', 'Introduction');
+
+ cy.url().should('include', '#section/Introduction');
+ });
+
it('should update URL hash when clicking on menu items', () => {
cy.contains('[role=menuitem].-depth1', 'pet').click({ force: true });
cy.location('hash').should('equal', '#tag/pet');
diff --git a/e2e/integration/search.e2e.ts b/e2e/integration/search.e2e.ts
index a44cafb7..b1a7d4a7 100644
--- a/e2e/integration/search.e2e.ts
+++ b/e2e/integration/search.e2e.ts
@@ -53,4 +53,10 @@ describe('Search', () => {
getSearchInput().type('int', { force: true });
cy.get('[data-markjs]').should('exist');
});
+
+ it('should show proper message when no search results are found', () => {
+ getSearchResults().should('not.exist');
+ getSearchInput().type('xzss', {force: true});
+ getSearchResults().should('exist').should('contain', 'No results found');
+ })
});
diff --git a/package-lock.json b/package-lock.json
index 73cfe473..9e8aca4a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,17 +1,16 @@
{
"name": "redoc",
- "version": "2.0.0-rc.56",
+ "version": "2.0.0-rc.57",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "version": "2.0.0-rc.56",
+ "version": "2.0.0-rc.57",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.14.0",
- "@redocly/openapi-core": "^1.0.0-beta.50",
+ "@redocly/openapi-core": "^1.0.0-beta.54",
"@redocly/react-dropdown-aria": "^2.0.11",
- "@types/node": "^15.6.1",
"classnames": "^2.3.1",
"decko": "^1.2.0",
"dompurify": "^2.2.8",
@@ -59,6 +58,7 @@
"@types/lunr": "^2.3.3",
"@types/mark.js": "^8.11.5",
"@types/marked": "^1.1.0",
+ "@types/node": "^15.6.1",
"@types/prismjs": "^1.16.5",
"@types/prop-types": "^15.7.3",
"@types/react": "^17.0.8",
@@ -2672,13 +2672,13 @@
}
},
"node_modules/@redocly/ajv": {
- "version": "6.12.4",
- "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-6.12.4.tgz",
- "integrity": "sha512-RB6vWO78v6c+SW/3bZh+XZMr4nGdJKAiPGsBALuUZnLuCiQ7aXCT1AuFHqnfS2gyXbEUEj+kw8p4ux8KdAfs3A==",
+ "version": "8.6.2",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.2.tgz",
+ "integrity": "sha512-tU8fQs0D76ZKhJ2cWtnfQthWqiZgGBx0gH0+5D8JvaBEBaqA8foPPBt3Nonwr3ygyv5xrw2IzKWgIY86BlGs+w==",
"dependencies": {
"fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
@@ -2686,12 +2686,17 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/@redocly/ajv/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
"node_modules/@redocly/openapi-core": {
- "version": "1.0.0-beta.50",
- "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.50.tgz",
- "integrity": "sha512-GuXn4IETxpbRd8dlAQDQPtvqOpbMvPMeC/e5mv5MOXkLIznNk4vjiQVe6QSCbZbCHzzpb2+89B6S7asebPm4Rg==",
+ "version": "1.0.0-beta.54",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.54.tgz",
+ "integrity": "sha512-uYs0N1Trjkh7u8IMIuCU2VxCXhMyGWSZUkP/WNdTR1OgBUtvNdF9C32zoQV+hyCIH4gVu42ROHkjisy333ZX+w==",
"dependencies": {
- "@redocly/ajv": "^6.12.3",
+ "@redocly/ajv": "^8.6.2",
"@types/node": "^14.11.8",
"colorette": "^1.2.0",
"js-levenshtein": "^1.1.6",
@@ -3038,7 +3043,8 @@
"node_modules/@types/node": {
"version": "15.12.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
- "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww=="
+ "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
+ "dev": true
},
"node_modules/@types/normalize-package-data": {
"version": "2.4.0",
@@ -8358,7 +8364,8 @@
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
@@ -13267,7 +13274,8 @@
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@@ -16757,7 +16765,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -22961,22 +22968,29 @@
}
},
"@redocly/ajv": {
- "version": "6.12.4",
- "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-6.12.4.tgz",
- "integrity": "sha512-RB6vWO78v6c+SW/3bZh+XZMr4nGdJKAiPGsBALuUZnLuCiQ7aXCT1AuFHqnfS2gyXbEUEj+kw8p4ux8KdAfs3A==",
+ "version": "8.6.2",
+ "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.6.2.tgz",
+ "integrity": "sha512-tU8fQs0D76ZKhJ2cWtnfQthWqiZgGBx0gH0+5D8JvaBEBaqA8foPPBt3Nonwr3ygyv5xrw2IzKWgIY86BlGs+w==",
"requires": {
"fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
+ },
+ "dependencies": {
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ }
}
},
"@redocly/openapi-core": {
- "version": "1.0.0-beta.50",
- "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.50.tgz",
- "integrity": "sha512-GuXn4IETxpbRd8dlAQDQPtvqOpbMvPMeC/e5mv5MOXkLIznNk4vjiQVe6QSCbZbCHzzpb2+89B6S7asebPm4Rg==",
+ "version": "1.0.0-beta.54",
+ "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.54.tgz",
+ "integrity": "sha512-uYs0N1Trjkh7u8IMIuCU2VxCXhMyGWSZUkP/WNdTR1OgBUtvNdF9C32zoQV+hyCIH4gVu42ROHkjisy333ZX+w==",
"requires": {
- "@redocly/ajv": "^6.12.3",
+ "@redocly/ajv": "^8.6.2",
"@types/node": "^14.11.8",
"colorette": "^1.2.0",
"js-levenshtein": "^1.1.6",
@@ -23312,7 +23326,8 @@
"@types/node": {
"version": "15.12.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
- "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww=="
+ "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
+ "dev": true
},
"@types/normalize-package-data": {
"version": "2.4.0",
@@ -27480,7 +27495,8 @@
"fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
},
"fast-levenshtein": {
"version": "2.0.6",
@@ -31180,7 +31196,8 @@
"json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@@ -33869,8 +33886,7 @@
"require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
},
"require-main-filename": {
"version": "2.0.0",
diff --git a/package.json b/package.json
index 6f57959e..905992a1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "redoc",
- "version": "2.0.0-rc.56",
+ "version": "2.0.0-rc.57",
"description": "ReDoc",
"repository": {
"type": "git",
@@ -79,6 +79,7 @@
"@types/json-pointer": "^1.0.30",
"@types/lodash": "^4.14.170",
"@types/lunr": "^2.3.3",
+ "@types/node": "^15.6.1",
"@types/mark.js": "^8.11.5",
"@types/marked": "^1.1.0",
"@types/prismjs": "^1.16.5",
@@ -146,9 +147,8 @@
},
"dependencies": {
"@babel/runtime": "^7.14.0",
- "@redocly/openapi-core": "^1.0.0-beta.50",
+ "@redocly/openapi-core": "^1.0.0-beta.54",
"@redocly/react-dropdown-aria": "^2.0.11",
- "@types/node": "^15.6.1",
"classnames": "^2.3.1",
"decko": "^1.2.0",
"dompurify": "^2.2.8",
diff --git a/src/common-elements/fields-layout.ts b/src/common-elements/fields-layout.ts
index 5b9a578f..8738b014 100644
--- a/src/common-elements/fields-layout.ts
+++ b/src/common-elements/fields-layout.ts
@@ -1,5 +1,3 @@
-// import { transparentize } from 'polished';
-
import styled, { extensionsHook, media } from '../styled-components';
import { deprecatedCss } from './mixins';
diff --git a/src/components/Responses/styled.elements.ts b/src/components/Responses/styled.elements.ts
index a592d4b5..92b790c2 100644
--- a/src/components/Responses/styled.elements.ts
+++ b/src/components/Responses/styled.elements.ts
@@ -1,5 +1,3 @@
-// import { transparentize } from 'polished';
-
import { UnderlinedHeader } from '../../common-elements';
import styled from '../../styled-components';
import { ResponseTitle } from './ResponseTitle';
diff --git a/src/components/Schema/ArraySchema.tsx b/src/components/Schema/ArraySchema.tsx
index eab37595..0b555c07 100644
--- a/src/components/Schema/ArraySchema.tsx
+++ b/src/components/Schema/ArraySchema.tsx
@@ -13,15 +13,12 @@ const PaddedSchema = styled.div`
export class ArraySchema extends React.PureComponent {
render() {
- const itemsSchema = this.props.schema.items!;
const schema = this.props.schema;
+ const itemsSchema = schema.items;
- const itemConstraintSchema = (
- min: number | undefined = undefined,
- max: number | undefined = undefined,
- ) => ({ type: 'array', minItems: min, maxItems: max });
-
- const minMaxItems = humanizeConstraints(itemConstraintSchema(itemsSchema?.schema?.minItems, itemsSchema?.schema?.maxItems));
+ const minMaxItems = schema.minItems === undefined && schema.maxItems === undefined ?
+ '' :
+ `(${humanizeConstraints(schema)})`;
if (schema.displayType && !itemsSchema && !minMaxItems.length) {
return (
@@ -31,7 +28,7 @@ export class ArraySchema extends React.PureComponent
{
return (
-
Array ({minMaxItems})
+
Array {minMaxItems}
diff --git a/src/components/SearchBox/SearchBox.tsx b/src/components/SearchBox/SearchBox.tsx
index 21900862..f0427eb8 100644
--- a/src/components/SearchBox/SearchBox.tsx
+++ b/src/components/SearchBox/SearchBox.tsx
@@ -16,6 +16,7 @@ import {
SearchResultsBox,
SearchWrap,
} from './styled.elements';
+import { l } from '../../services/Labels';
export interface SearchBoxProps {
search: SearchStore
;
@@ -28,6 +29,7 @@ export interface SearchBoxProps {
export interface SearchBoxState {
results: SearchResult[];
+ noResults: boolean;
term: string;
activeItemIdx: number;
}
@@ -39,6 +41,7 @@ export class SearchBox extends React.PureComponent {
this.setState({
results: [],
+ noResults: false,
term: '',
activeItemIdx: -1,
});
@@ -95,6 +100,7 @@ export class SearchBox extends React.PureComponent
)}
+ {this.state.term && this.state.noResults ? (
+ {l('noResultsFound')}
+ ) : null}
);
}
diff --git a/src/components/SecurityRequirement/SecurityRequirement.tsx b/src/components/SecurityRequirement/SecurityRequirement.tsx
index 91bf9f43..fb45fed2 100644
--- a/src/components/SecurityRequirement/SecurityRequirement.tsx
+++ b/src/components/SecurityRequirement/SecurityRequirement.tsx
@@ -1,4 +1,3 @@
-// import { transparentize } from 'polished';
import * as React from 'react';
import styled, { media } from '../../styled-components';
diff --git a/src/components/SideMenu/MenuItem.tsx b/src/components/SideMenu/MenuItem.tsx
index 9a19fa07..4597bec6 100644
--- a/src/components/SideMenu/MenuItem.tsx
+++ b/src/components/SideMenu/MenuItem.tsx
@@ -1,4 +1,3 @@
-// import { observe } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
diff --git a/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap b/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap
index fe5617ed..7af7b482 100644
--- a/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap
+++ b/src/components/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap
@@ -33,6 +33,8 @@ exports[`Components SchemaView discriminator should correctly render discriminat
"format": undefined,
"isCircular": undefined,
"isPrimitive": true,
+ "maxItems": undefined,
+ "minItems": undefined,
"options": "<<>>",
"pattern": undefined,
"pointer": "#/components/schemas/Dog/properties/packSize",
@@ -86,6 +88,8 @@ exports[`Components SchemaView discriminator should correctly render discriminat
"format": undefined,
"isCircular": undefined,
"isPrimitive": true,
+ "maxItems": undefined,
+ "minItems": undefined,
"options": "<<>>",
"pattern": undefined,
"pointer": "#/components/schemas/Dog/properties/type",
diff --git a/src/services/Labels.ts b/src/services/Labels.ts
index 71b83e58..378ef143 100644
--- a/src/services/Labels.ts
+++ b/src/services/Labels.ts
@@ -10,6 +10,7 @@ export interface LabelsConfig {
arrayOf: string;
webhook: string;
const: string;
+ noResultsFound: string;
download: string;
downloadSpecification: string;
responses: string;
@@ -32,6 +33,7 @@ const labels: LabelsConfig = {
arrayOf: 'Array of ',
webhook: 'Event',
const: 'Value',
+ noResultsFound: 'No results found',
download: 'Download',
downloadSpecification: 'Download OpenAPI specification',
responses: 'Responses',
diff --git a/src/services/MenuStore.ts b/src/services/MenuStore.ts
index ac60fee8..65f6c7c8 100644
--- a/src/services/MenuStore.ts
+++ b/src/services/MenuStore.ts
@@ -210,6 +210,7 @@ export class MenuStore {
this.deactivate(this.activeItem);
if (!item) {
+ this.activeItemIdx = -1;
this.history.replace('', rewriteHistory);
return;
}
diff --git a/src/services/OpenAPIParser.ts b/src/services/OpenAPIParser.ts
index 11a001aa..4881c99e 100644
--- a/src/services/OpenAPIParser.ts
+++ b/src/services/OpenAPIParser.ts
@@ -174,6 +174,18 @@ export class OpenAPIParser {
return obj;
}
+ shallowDeref(obj: OpenAPIRef | T): T {
+ if (this.isRef(obj)) {
+ const schemaName = getDefinitionName(obj.$ref);
+ if (schemaName && this.options.ignoreNamedSchemas.has(schemaName)) {
+ return { type: 'object', title: schemaName } as T;
+ }
+ const resolved = this.byRef(obj.$ref);
+ return this.allowMergeRefs ? this.mergeRefs(obj, resolved, false) : (resolved as T);
+ }
+ return obj;
+ }
+
mergeRefs(ref, resolved, mergeAsAllOf: boolean) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const { $ref, ...rest } = ref;
@@ -183,7 +195,7 @@ export class OpenAPIParser {
}
if (mergeAsAllOf && keys.some((k) => k !== 'description' && k !== 'title' && k !== 'externalDocs')) {
return {
- allOf: [resolved, rest],
+ allOf: [rest, resolved],
};
} else {
// small optimization
@@ -194,13 +206,6 @@ export class OpenAPIParser {
}
}
- shalowDeref(obj: OpenAPIRef | T): T {
- if (this.isRef(obj)) {
- return this.byRef(obj.$ref)!;
- }
- return obj;
- }
-
/**
* Merge allOf constraints.
* @param schema schema with allOF
diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts
index c2407b97..be1df279 100644
--- a/src/services/RedocNormalizedOptions.ts
+++ b/src/services/RedocNormalizedOptions.ts
@@ -42,6 +42,7 @@ export interface RedocRawOptions {
maxDisplayedEnumValues?: number;
ignoreNamedSchemas?: string[] | string;
hideSchemaPattern?: boolean;
+ generatedPayloadSamplesMaxDepth?: number;
}
export function argValueToBoolean(val?: string | boolean, defaultValue?: boolean): boolean {
@@ -163,6 +164,16 @@ export class RedocNormalizedOptions {
return 2;
}
+ private static normalizeGeneratedPayloadSamplesMaxDepth(
+ value?: number | string | undefined,
+ ): number {
+ if (!isNaN(Number(value))) {
+ return Math.max(0, Number(value));
+ }
+
+ return 10;
+ }
+
theme: ResolvedThemeInterface;
scrollYOffset: () => number;
hideHostname: boolean;
@@ -196,6 +207,7 @@ export class RedocNormalizedOptions {
ignoreNamedSchemas: Set;
hideSchemaPattern: boolean;
+ generatedPayloadSamplesMaxDepth: number;
constructor(raw: RedocRawOptions, defaults: RedocRawOptions = {}) {
raw = { ...defaults, ...raw };
@@ -257,5 +269,9 @@ export class RedocNormalizedOptions {
: raw.ignoreNamedSchemas?.split(',').map((s) => s.trim());
this.ignoreNamedSchemas = new Set(ignoreNamedSchemas);
this.hideSchemaPattern = argValueToBoolean(raw.hideSchemaPattern);
+ this.generatedPayloadSamplesMaxDepth =
+ RedocNormalizedOptions.normalizeGeneratedPayloadSamplesMaxDepth(
+ raw.generatedPayloadSamplesMaxDepth,
+ );
}
}
diff --git a/src/services/__tests__/OpenAPIParser.test.ts b/src/services/__tests__/OpenAPIParser.test.ts
index b79f61b4..b8b211ba 100644
--- a/src/services/__tests__/OpenAPIParser.test.ts
+++ b/src/services/__tests__/OpenAPIParser.test.ts
@@ -1,5 +1,6 @@
import { OpenAPIParser } from '../OpenAPIParser';
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
+import { OpenAPIParameter, Referenced } from '../../types';
const opts = new RedocNormalizedOptions({});
@@ -13,5 +14,18 @@ describe('Models', () => {
parser = new OpenAPIParser(spec, undefined, opts);
expect(parser.mergeAllOf(spec.components.schemas.test)).toMatchSnapshot();
});
+
+ test('should override description from $ref of the referenced component, when sibling description exists ', () => {
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const spec = require('./fixtures/siblingRefDescription.json');
+ parser = new OpenAPIParser(spec, undefined, opts);
+ const schemaOrRef: Referenced = {
+ $ref: '#/components/schemas/Test',
+ description: 'Overriden description',
+ };
+
+ expect(parser.shallowDeref(schemaOrRef)).toMatchSnapshot();
+ });
+
});
});
diff --git a/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap b/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap
index 74a26ed0..ffbcbff5 100644
--- a/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap
+++ b/src/services/__tests__/__snapshots__/OpenAPIParser.test.ts.snap
@@ -86,3 +86,10 @@ Object {
],
}
`;
+
+exports[`Models Schema should override description from $ref of the referenced component, when sibling description exists 1`] = `
+Object {
+ "description": "Overriden description",
+ "type": "object",
+}
+`;
diff --git a/src/services/__tests__/fixtures/siblingRefDescription.json b/src/services/__tests__/fixtures/siblingRefDescription.json
new file mode 100644
index 00000000..b090a963
--- /dev/null
+++ b/src/services/__tests__/fixtures/siblingRefDescription.json
@@ -0,0 +1,39 @@
+{
+ "openapi": "3.1.0",
+ "info": {
+ "title": "AA",
+ "version": "1.0"
+ },
+ "paths": {
+ "/test": {
+ "get": {
+ "operationId": "test",
+ "responses": {
+ "200": {
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "testAttr": {
+ "description": "Overriden description",
+ "$ref": "#/components/schemas/Test"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "Test": {
+ "type": "object",
+ "description": "Refed description"
+ }
+ }
+ }
+}
diff --git a/src/services/models/MediaType.ts b/src/services/models/MediaType.ts
index 8987fbbb..25dae807 100644
--- a/src/services/models/MediaType.ts
+++ b/src/services/models/MediaType.ts
@@ -14,6 +14,7 @@ export class MediaTypeModel {
name: string;
isRequestType: boolean;
onlyRequiredInSamples: boolean;
+ generatedPayloadSamplesMaxDepth: number;
/**
* @param isRequestType needed to know if skipe RO/RW fields in objects
@@ -29,6 +30,7 @@ export class MediaTypeModel {
this.isRequestType = isRequestType;
this.schema = info.schema && new SchemaModel(parser, info.schema, '', options);
this.onlyRequiredInSamples = options.onlyRequiredInSamples;
+ this.generatedPayloadSamplesMaxDepth = options.generatedPayloadSamplesMaxDepth;
if (info.examples !== undefined) {
this.examples = mapValues(
info.examples,
@@ -38,7 +40,7 @@ export class MediaTypeModel {
this.examples = {
default: new ExampleModel(
parser,
- { value: parser.shalowDeref(info.example) },
+ { value: parser.shallowDeref(info.example) },
name,
info.encoding,
),
@@ -53,7 +55,7 @@ export class MediaTypeModel {
skipReadOnly: this.isRequestType,
skipWriteOnly: !this.isRequestType,
skipNonRequired: this.isRequestType && this.onlyRequiredInSamples,
- maxSampleDepth: 10,
+ maxSampleDepth: this.generatedPayloadSamplesMaxDepth,
};
if (this.schema && this.schema.oneOf) {
this.examples = {};
diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts
index d79d738b..b155d254 100644
--- a/src/services/models/Schema.ts
+++ b/src/services/models/Schema.ts
@@ -63,6 +63,8 @@ export class SchemaModel {
const: any;
contentEncoding?: string;
contentMediaType?: string;
+ minItems?: number;
+ maxItems?: number;
/**
* @param isChild if schema discriminator Child
@@ -128,6 +130,8 @@ export class SchemaModel {
this.const = schema.const || '';
this.contentEncoding = schema.contentEncoding;
this.contentMediaType = schema.contentMediaType;
+ this.minItems = schema.minItems;
+ this.maxItems = schema.maxItems;
if (!!schema.nullable || schema['x-nullable']) {
if (Array.isArray(this.type) && !this.type.some((value) => value === null || value === 'null')) {
@@ -359,7 +363,7 @@ function buildFields(
): FieldModel[] {
const props = schema.properties || {};
const additionalProps = schema.additionalProperties;
- const defaults = schema.default || {};
+ const defaults = schema.default;
let fields = Object.keys(props || []).map((fieldName) => {
let field = props[fieldName];
@@ -380,7 +384,7 @@ function buildFields(
required,
schema: {
...field,
- default: field.default === undefined ? defaults[fieldName] : field.default,
+ default: field.default === undefined && defaults ? defaults[fieldName] : field.default,
},
},
$ref + '/properties/' + fieldName,
diff --git a/src/utils/__tests__/__snapshots__/loadAndBundleSpec.test.ts.snap b/src/utils/__tests__/__snapshots__/loadAndBundleSpec.test.ts.snap
index 7807e39e..6cd0a034 100644
--- a/src/utils/__tests__/__snapshots__/loadAndBundleSpec.test.ts.snap
+++ b/src/utils/__tests__/__snapshots__/loadAndBundleSpec.test.ts.snap
@@ -729,7 +729,9 @@ try {
"schema": Object {
"items": Object {
"$ref": "#/components/schemas/Pet",
+ "maxItems": 111,
},
+ "maxItems": 999,
"type": "array",
},
},
@@ -3245,6 +3247,26 @@ culpa qui officia deserunt mollit anim id est laborum.
},
},
"responses": Object {
+ "200": Object {
+ "content": Object {
+ "application/json": Object {
+ "schema": Object {
+ "items": Object {
+ "items": Object {
+ "type": "number",
+ },
+ "maxItems": 777,
+ "minItems": 111,
+ "type": "array",
+ },
+ "maxItems": 999,
+ "minItems": 0,
+ "type": "array",
+ },
+ },
+ },
+ "description": "Successful operation",
+ },
"201": Object {
"content": Object {
"application/json": Object {
diff --git a/src/utils/__tests__/openapi.test.ts b/src/utils/__tests__/openapi.test.ts
index d4f23e02..6f40d974 100644
--- a/src/utils/__tests__/openapi.test.ts
+++ b/src/utils/__tests__/openapi.test.ts
@@ -412,10 +412,10 @@ describe('Utils', () => {
describe('openapi humanizeConstraints', () => {
const itemConstraintSchema = (
- min: number | undefined = undefined,
- max: number | undefined = undefined,
- multipleOf: number | undefined = undefined,
- uniqueItems?: boolean,
+ min?: number,
+ max?: number,
+ multipleOf?: number,
+ uniqueItems?: boolean
) => ({ type: 'array', minItems: min, maxItems: max, multipleOf, uniqueItems });
it('should not have a humanized constraint without schema constraints', () => {
diff --git a/src/utils/highlight.ts b/src/utils/highlight.ts
index 036b9129..23cdd43d 100644
--- a/src/utils/highlight.ts
+++ b/src/utils/highlight.ts
@@ -15,6 +15,7 @@ import 'prismjs/components/prism-objectivec.js';
import 'prismjs/components/prism-perl.js';
import 'prismjs/components/prism-php.js';
import 'prismjs/components/prism-python.js';
+import 'prismjs/components/prism-q.js';
import 'prismjs/components/prism-ruby.js';
import 'prismjs/components/prism-scala.js';
import 'prismjs/components/prism-sql.js';
diff --git a/src/utils/openapi.ts b/src/utils/openapi.ts
index ad267722..d0b081f5 100644
--- a/src/utils/openapi.ts
+++ b/src/utils/openapi.ts
@@ -505,13 +505,13 @@ export function mergeParams(
): Array> {
const operationParamNames = {};
operationParams.forEach(param => {
- param = parser.shalowDeref(param);
+ param = parser.shallowDeref(param);
operationParamNames[param.name + '_' + param.in] = true;
});
// filter out path params overridden by operation ones with the same name
pathParams = pathParams.filter(param => {
- param = parser.shalowDeref(param);
+ param = parser.shallowDeref(param);
return !operationParamNames[param.name + '_' + param.in];
});