Using the API Plugin
The pan.dev site now uses docusaurus-openapi-docs plugin to generate markdown files from OpenAPI Spec files. If you want to get a more in depth understanding of the plugin, refer to this readme
CLI
The plugin utilizes a list of cli commands to generate and clean the API documentation from the directory. These scripts are meant to run before starting or building the site. For that reason, we have included the generation within the yarn start and yarn build commands.
Configuration
The plugin has a configuration within docusaurus.config.js.
See an example configuration
[
"docusaurus-plugin-openapi-docs",
{
"id": "default",
"docsPluginId": "default",
"config": {
"auth": {
"specPath": "openapi-specs/sase/auth",
"outputDir": "products/sase/api/auth",
"sidebarOptions": {
"groupPathsBy": "tag"
}
},
"iam": {
"specPath": "openapi-specs/sase/iam",
"outputDir": "products/sase/api/iam",
"sidebarOptions": {
"groupPathsBy": "tag",
"categoryLinkSource": "info"
}
},
"insights": {
"specPath": "openapi-specs/access/insights/2.0",
"outputDir": "products/access/api/insights",
"sidebarOptions": { "groupPathsBy": "tag" },
"version": "2.0",
"label": "v2.0",
"baseUrl": "/access/api/insights/",
"versions": {
"1.0": {
"specPath": "openapi-specs/access/insights/1.0",
"outputDir": "products/access/api/insights/1.0",
"label": "v1.0",
"baseUrl": "/access/api/insights/1.0/"
}
}
}
}
}
]
For each API we have a configuration. In the above example auth, iam, and insights are the API IDs. For each separate API Doc section (i.e. if you want the API to have its own sidebar), you should add an entry to this configuration.
At a minimum, each API needs to specify
specPathis used to denote the directory that your OpenAPI Specification is in. This needs to be unique for each API. This should follow the pattern ofopenapi-specs/<product>/<api-name-if-needed>outputDiris the directory the markdown files will be written out to. This needs to be unique for each API. This should follow the patternproducts/<product>/api/<api-name-if-needed>
You will likely also need to use sidebarOptions based on how your OpenAPI Spec is set up.
Sidebars for APIs that use tagging
If you use tags on all your operations, the plugin will create a sidebar.ts that groups the operations by their tag. Ensure that the tags are defined globally. To use this options you can add the follow options to the APIs config.
sidebarOptions: {
groupPathsBy: "tag"
}
You will then need to add this sidebar array in the products/<product>/sidebars.ts file. You can also include any docs you want to show up in the API Sidebar by including their docIds in the sidebar.
module.exports = {
<product-name>-api: [
"doc-1", "doc-2", // All docs you want to include before go here
require("./api/<product>/<api-name-if-needed>/sidebar")
],
<product-name>-docs: [
// Docs Sidebar goes here
]
};
Sidebars for APIs that don't use tagging
If you don't use tags, you can use the autogenerated sidebars feature. For this option you need to add a __category__.json like the one below:
{
"label": "Sidebar Category Name",
"collapsible": true,
"link": {
"type": "generated-index",
"title": " Sidebar Category Name"
}
}
You then need to edit the products/product/sidebars.ts to know to autogenerate the sidebar for the API Directory.
module.exports = {
<product-name>-api: [
{
type: "autogenerated",
dirName: "./api", // generate sidebar from the api folder
},
],
<product-name>-docs: [
// Docs Sidebar goes here
]
};
APIs with versions
Visit the Plugin docs for information on versioned APIs. If you add a new versioned API, you might need to make updates to the package.json to ensure the commands yarn clean-all and yarn gen-all work.
- to the
gen-allcommand add&& docusaurus gen-api-docs:version \<id\>:allto the end, similar to the insights. - to the
clean-allcommand add&& docusaurus clean-api-docs:version \<id\>:allto the end, similar to the insights.
Example of APIs to reference
There are 4 variables to consider when deciding how to configure your API.
-
Single or Multiple Spec files
-
Uses Tags or Doesn't Use Tags
Note: If you have multiple specs you must use tags or create a separate config for each spec file
-
One API for the Product or Multiple APIs for the Product
-
One Version or Multiple Versions of the API
** Single Spec, Uses Tags, One API, One Version **
See dns-security. Note the following:
sidebarOptionsin thedocusaurus.config.js- sidebars.ts in
products/dns-security/sidebars.ts
** Single Spec, No tags, One API, One Version **
See iot. Note the following:
- lack of
sidebarOptionsin thedocusaurus.config.js - autogenerated sidebar in
products/iot/sidebars.ts
** Multiple Specs, Uses Tags, Multiple APIs **
See sase, which consists of auth, iam, mt-monitor, subscription, and tenancy APIs. Note the following:
- Each API has it's own configuration in
docusaurus.config.jswithsidebarOptions - Each API has it's own sidebar in
products/sase/sidebars.ts
** An API with Multiple Versions **
See access/api/insights. Note the following:
- More complex configuration in
docusaurus.config.jswithversion,label,baseUrl, andversionsobject products/access/sidebars.tshasinsightVersions(name this for your product)- Require of
versionSelectandversionCrumbinproducts/access/sidebars.ts. You will need to copy these lines. saseinsightsv1/saseinsightsv2sidebars inproducts/access/sidebars.ts.- You can also visit the Plugin docs for more information on versioned APIs
FAQs
I want to add a new API, is there anything special I need to do?
If your product doesn't already have a directory in the products/ directory, you will need to create one with a sidebars.ts file and a folder for api inside of it. See the above examples for ideas of how to get started.
How are the URLs created for each endpoint?
The URLs are the path of the API directory (minus products/) plus the operationID in kebab-case.
I updated my spec file, do I need to do anything?
Yes. After updating the spec file, you need to clean the existing API Docs. To do this you can run a yarn clean-api-docs <id> where the ID is the key of the APIs configuration in docusaurus.config.js. i.e. for iot you would run yarn clean-api-docs iot. The command is slightly different for versioned docs, see the docs.. After cleaning you can generate the new docs with the yarn gen-api-docs <id>.
Things don't seem to be working
Issues running yarn gen-api-docs <id> or yarn gen-all
There is potentially a problem with your OpenAPI Spec file. Please make sure it is valid. We recommend using Spectral within VSCode to spot any issues. Else, make sure the configuration of your API Doc is referencing the right paths.
Issues running yarn start or yarn build
- If you see a long list paths one line at a time (e.g. threat-vault/docs/response-fields/threat-vault-response), it's most likely an issue with your sidebar. Make sure your sidebars.ts is using the correct docIDs and referecing the right API sidebar.
- For other issues, try to run a
yarn sosto clean up the project before runningyarn start - If these don't work contact us in #pan-dev on Slack and provide the output of running a
yarn sos && yarn startcommand.