docusaurus-plugin-openapi-docs 0.0.0-349 → 0.0.0-352

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/lib/index.js +32 -7
  2. package/lib/markdown/createContactInfo.d.ts +2 -0
  3. package/lib/markdown/createContactInfo.js +49 -0
  4. package/lib/markdown/createLicense.d.ts +2 -0
  5. package/lib/markdown/createLicense.js +33 -0
  6. package/lib/markdown/createTermsOfService.d.ts +1 -0
  7. package/lib/markdown/createTermsOfService.js +32 -0
  8. package/lib/markdown/index.d.ts +1 -1
  9. package/lib/markdown/index.js +7 -1
  10. package/lib/openapi/openapi.d.ts +4 -3
  11. package/lib/openapi/openapi.js +35 -19
  12. package/lib/openapi/types.d.ts +4 -1
  13. package/lib/sidebars/index.d.ts +2 -1
  14. package/lib/sidebars/index.js +63 -19
  15. package/lib/types.d.ts +2 -0
  16. package/package.json +8 -8
  17. package/src/index.ts +44 -8
  18. package/src/markdown/createContactInfo.ts +48 -0
  19. package/src/markdown/createLicense.ts +32 -0
  20. package/src/markdown/createTermsOfService.ts +30 -0
  21. package/src/markdown/index.ts +8 -1
  22. package/src/openapi/openapi.ts +29 -12
  23. package/src/openapi/types.ts +4 -1
  24. package/src/sidebars/index.ts +80 -20
  25. package/src/types.ts +2 -0
  26. package/lib/markdown/createFullWidthTable.d.ts +0 -2
  27. package/lib/markdown/createFullWidthTable.js +0 -18
  28. package/lib/markdown/createParamsTable.d.ts +0 -7
  29. package/lib/markdown/createParamsTable.js +0 -80
  30. package/lib/markdown/createRequestBodyTable.d.ts +0 -6
  31. package/lib/markdown/createRequestBodyTable.js +0 -14
  32. package/lib/markdown/createSchemaTable.d.ts +0 -14
  33. package/lib/markdown/createSchemaTable.js +0 -217
  34. package/src/markdown/createFullWidthTable.ts +0 -16
  35. package/src/markdown/createParamsTable.ts +0 -102
  36. package/src/markdown/createRequestBodyTable.ts +0 -17
  37. package/src/markdown/createSchemaTable.ts +0 -275
  38. package/yarn-error.log +0 -15179
package/lib/index.js CHANGED
@@ -25,7 +25,7 @@ function pluginOpenAPI(context, options) {
25
25
  const contentPath = path_1.default.resolve(siteDir, specPath);
26
26
  try {
27
27
  const openapiFiles = await (0, openapi_1.readOpenapiFiles)(contentPath, {});
28
- const loadedApi = await (0, openapi_1.processOpenapiFiles)(openapiFiles);
28
+ const [loadedApi, tags] = await (0, openapi_1.processOpenapiFiles)(openapiFiles);
29
29
  if (!fs_1.default.existsSync(outputDir)) {
30
30
  try {
31
31
  fs_1.default.mkdirSync(outputDir, { recursive: true });
@@ -38,7 +38,7 @@ function pluginOpenAPI(context, options) {
38
38
  // TODO: figure out better way to set default
39
39
  if (Object.keys(sidebarOptions !== null && sidebarOptions !== void 0 ? sidebarOptions : {}).length > 0) {
40
40
  const sidebarSlice = (0, sidebars_1.default)(sidebarOptions, // TODO: find a better way to handle null
41
- options, loadedApi);
41
+ options, loadedApi, tags);
42
42
  const sidebarSliceTemplate = template
43
43
  ? fs_1.default.readFileSync(template).toString()
44
44
  : `module.exports = {{{slice}}};`;
@@ -59,7 +59,12 @@ function pluginOpenAPI(context, options) {
59
59
  ? fs_1.default.readFileSync(template).toString()
60
60
  : `---
61
61
  id: {{{id}}}
62
+ {{^api}}
63
+ sidebar_label: Introduction
64
+ {{/api}}
65
+ {{#api}}
62
66
  sidebar_label: {{{title}}}
67
+ {{/api}}
63
68
  {{^api}}
64
69
  sidebar_position: 0
65
70
  {{/api}}
@@ -76,6 +81,23 @@ sidebar_class_name: "{{{api.method}}} api-method"
76
81
  ---
77
82
 
78
83
  {{{markdown}}}
84
+ `;
85
+ const infoMdTemplate = template
86
+ ? fs_1.default.readFileSync(template).toString()
87
+ : `---
88
+ id: {{{id}}}
89
+ sidebar_label: {{{title}}}
90
+ hide_title: true
91
+ ---
92
+
93
+ {{{markdown}}}
94
+
95
+ \`\`\`mdx-code-block
96
+ import DocCardList from '@theme/DocCardList';
97
+ import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
98
+
99
+ <DocCardList items={useCurrentSidebarCategory().items}/>
100
+ \`\`\`
79
101
  `;
80
102
  loadedApi.map(async (item) => {
81
103
  const markdown = item.type === "api" ? (0, markdown_1.createApiPageMD)(item) : (0, markdown_1.createInfoPageMD)(item);
@@ -84,6 +106,7 @@ sidebar_class_name: "{{{api.method}}} api-method"
84
106
  item.json = JSON.stringify(item.api);
85
107
  }
86
108
  const view = (0, mustache_1.render)(mdTemplate, item);
109
+ const utils = (0, mustache_1.render)(infoMdTemplate, item);
87
110
  if (item.type === "api") {
88
111
  if (!fs_1.default.existsSync(`${outputDir}/${item.id}.api.mdx`)) {
89
112
  try {
@@ -97,13 +120,15 @@ sidebar_class_name: "{{{api.method}}} api-method"
97
120
  }
98
121
  // TODO: determine if we actually want/need this
99
122
  if (item.type === "info") {
100
- if (!fs_1.default.existsSync(`${outputDir}/index.api.mdx`)) {
123
+ if (!fs_1.default.existsSync(`${outputDir}/${item.id}.info.mdx`)) {
101
124
  try {
102
- fs_1.default.writeFileSync(`${outputDir}/index.api.mdx`, view, "utf8");
103
- console.log(chalk_1.default.green(`Successfully created "${outputDir}/index.api.mdx"`));
125
+ (sidebarOptions === null || sidebarOptions === void 0 ? void 0 : sidebarOptions.useInfoAsCategoryLink)
126
+ ? fs_1.default.writeFileSync(`${outputDir}/${item.id}.info.mdx`, utils, "utf8")
127
+ : fs_1.default.writeFileSync(`${outputDir}/${item.id}.info.mdx`, view, "utf8");
128
+ console.log(chalk_1.default.green(`Successfully created "${outputDir}/${item.id}.info.mdx"`));
104
129
  }
105
130
  catch (err) {
106
- console.error(chalk_1.default.red(`Failed to write "${outputDir}/index.api.mdx"`), chalk_1.default.yellow(err));
131
+ console.error(chalk_1.default.red(`Failed to write "${outputDir}/${item.id}.info.mdx"`), chalk_1.default.yellow(err));
107
132
  }
108
133
  }
109
134
  }
@@ -119,7 +144,7 @@ sidebar_class_name: "{{{api.method}}} api-method"
119
144
  async function cleanApiDocs(options) {
120
145
  const { outputDir } = options;
121
146
  const apiDir = path_1.default.join(siteDir, outputDir);
122
- const apiMdxFiles = await (0, utils_1.Globby)(["*.api.mdx"], {
147
+ const apiMdxFiles = await (0, utils_1.Globby)(["*.api.mdx", "*.info.mdx"], {
123
148
  cwd: path_1.default.resolve(apiDir),
124
149
  });
125
150
  const sidebarFile = await (0, utils_1.Globby)(["sidebar.js"], {
@@ -0,0 +1,2 @@
1
+ import { ContactObject } from "../openapi/types";
2
+ export declare function createContactInfo(contact: ContactObject): string;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /* ============================================================================
3
+ * Copyright (c) Palo Alto Networks
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ * ========================================================================== */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createContactInfo = void 0;
10
+ const utils_1 = require("./utils");
11
+ function createContactInfo(contact) {
12
+ if (!contact)
13
+ return "";
14
+ const { name, url, email } = contact;
15
+ return (0, utils_1.create)("div", {
16
+ style: {
17
+ display: "flex",
18
+ flexDirection: "column",
19
+ marginBottom: "var(--ifm-paragraph-margin-bottom)",
20
+ },
21
+ children: [
22
+ (0, utils_1.create)("h3", {
23
+ style: {
24
+ marginBottom: "0.25rem",
25
+ },
26
+ children: "Contact",
27
+ }),
28
+ (0, utils_1.create)("span", {
29
+ children: [
30
+ `${name}: `,
31
+ (0, utils_1.create)("a", {
32
+ href: `mailto:${email}`,
33
+ children: `${email}`,
34
+ }),
35
+ ],
36
+ }),
37
+ (0, utils_1.create)("span", {
38
+ children: [
39
+ "URL: ",
40
+ (0, utils_1.create)("a", {
41
+ href: `${url}`,
42
+ children: `${url}`,
43
+ }),
44
+ ],
45
+ }),
46
+ ],
47
+ });
48
+ }
49
+ exports.createContactInfo = createContactInfo;
@@ -0,0 +1,2 @@
1
+ import { LicenseObject } from "../openapi/types";
2
+ export declare function createLicense(license: LicenseObject): string;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /* ============================================================================
3
+ * Copyright (c) Palo Alto Networks
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ * ========================================================================== */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createLicense = void 0;
10
+ const utils_1 = require("./utils");
11
+ function createLicense(license) {
12
+ if (!license)
13
+ return "";
14
+ const { name, url } = license;
15
+ return (0, utils_1.create)("div", {
16
+ style: {
17
+ marginBottom: "var(--ifm-paragraph-margin-bottom)",
18
+ },
19
+ children: [
20
+ (0, utils_1.create)("h3", {
21
+ style: {
22
+ marginBottom: "0.25rem",
23
+ },
24
+ children: "License",
25
+ }),
26
+ (0, utils_1.create)("a", {
27
+ href: url,
28
+ children: name,
29
+ }),
30
+ ],
31
+ });
32
+ }
33
+ exports.createLicense = createLicense;
@@ -0,0 +1 @@
1
+ export declare function createTermsOfService(termsOfService: string | undefined): string;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /* ============================================================================
3
+ * Copyright (c) Palo Alto Networks
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ * ========================================================================== */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createTermsOfService = void 0;
10
+ const utils_1 = require("./utils");
11
+ function createTermsOfService(termsOfService) {
12
+ if (!createTermsOfService)
13
+ return "";
14
+ return (0, utils_1.create)("div", {
15
+ style: {
16
+ marginBottom: "var(--ifm-paragraph-margin-bottom)",
17
+ },
18
+ children: [
19
+ (0, utils_1.create)("h3", {
20
+ style: {
21
+ marginBottom: "0.25rem",
22
+ },
23
+ children: "Terms of Service",
24
+ }),
25
+ (0, utils_1.create)("a", {
26
+ href: `${termsOfService}`,
27
+ children: termsOfService,
28
+ }),
29
+ ],
30
+ });
31
+ }
32
+ exports.createTermsOfService = createTermsOfService;
@@ -1,3 +1,3 @@
1
1
  import { ApiPageMetadata, InfoPageMetadata } from "../types";
2
2
  export declare function createApiPageMD({ title, api: { deprecated, "x-deprecated-description": deprecatedDescription, description, parameters, requestBody, responses, }, }: ApiPageMetadata): string;
3
- export declare function createInfoPageMD({ info: { title, version, description }, }: InfoPageMetadata): string;
3
+ export declare function createInfoPageMD({ info: { title, version, description, contact, license, termsOfService }, }: InfoPageMetadata): string;
@@ -8,11 +8,14 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.createInfoPageMD = exports.createApiPageMD = void 0;
10
10
  const lodash_1 = require("lodash");
11
+ const createContactInfo_1 = require("./createContactInfo");
11
12
  const createDeprecationNotice_1 = require("./createDeprecationNotice");
12
13
  const createDescription_1 = require("./createDescription");
14
+ const createLicense_1 = require("./createLicense");
13
15
  const createParamsDetails_1 = require("./createParamsDetails");
14
16
  const createRequestBodyDetails_1 = require("./createRequestBodyDetails");
15
17
  const createStatusCodes_1 = require("./createStatusCodes");
18
+ const createTermsOfService_1 = require("./createTermsOfService");
16
19
  const createVersionBadge_1 = require("./createVersionBadge");
17
20
  const utils_1 = require("./utils");
18
21
  function createApiPageMD({ title, api: { deprecated, "x-deprecated-description": deprecatedDescription, description, parameters, requestBody, responses, }, }) {
@@ -33,11 +36,14 @@ function createApiPageMD({ title, api: { deprecated, "x-deprecated-description":
33
36
  ]);
34
37
  }
35
38
  exports.createApiPageMD = createApiPageMD;
36
- function createInfoPageMD({ info: { title, version, description }, }) {
39
+ function createInfoPageMD({ info: { title, version, description, contact, license, termsOfService }, }) {
37
40
  return (0, utils_1.render)([
38
41
  (0, createVersionBadge_1.createVersionBadge)(version),
39
42
  `# ${(0, lodash_1.escape)(title)}\n\n`,
40
43
  (0, createDescription_1.createDescription)(description),
44
+ (0, createContactInfo_1.createContactInfo)(contact),
45
+ (0, createTermsOfService_1.createTermsOfService)(termsOfService),
46
+ (0, createLicense_1.createLicense)(license),
41
47
  ]);
42
48
  }
43
49
  exports.createInfoPageMD = createInfoPageMD;
@@ -1,11 +1,12 @@
1
1
  import { ApiMetadata } from "../types";
2
- import { OpenApiObjectWithRef } from "./types";
2
+ import { OpenApiObjectWithRef, TagObject } from "./types";
3
3
  interface OpenApiFiles {
4
4
  source: string;
5
5
  sourceDirName: string;
6
6
  data: OpenApiObjectWithRef;
7
7
  }
8
8
  export declare function readOpenapiFiles(openapiPath: string, _options: {}): Promise<OpenApiFiles[]>;
9
- export declare function processOpenapiFiles(files: OpenApiFiles[]): Promise<ApiMetadata[]>;
10
- export declare function processOpenapiFile(openapiDataWithRefs: OpenApiObjectWithRef): Promise<ApiMetadata[]>;
9
+ export declare function processOpenapiFiles(files: OpenApiFiles[]): Promise<[ApiMetadata[], TagObject[]]>;
10
+ export declare function processOpenapiFile(openapiDataWithRefs: OpenApiObjectWithRef): Promise<[ApiMetadata[], TagObject[]]>;
11
+ export declare function getTagDisplayName(tagName: string, tags: TagObject[]): string;
11
12
  export {};
@@ -9,7 +9,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.processOpenapiFile = exports.processOpenapiFiles = exports.readOpenapiFiles = void 0;
12
+ exports.getTagDisplayName = exports.processOpenapiFile = exports.processOpenapiFiles = exports.readOpenapiFiles = void 0;
13
13
  const path_1 = __importDefault(require("path"));
14
14
  const utils_1 = require("@docusaurus/utils");
15
15
  const openapi_to_postmanv2_1 = __importDefault(require("@paloaltonetworks/openapi-to-postmanv2"));
@@ -64,22 +64,24 @@ async function createPostmanCollection(openapiData) {
64
64
  return await jsonToCollection(data);
65
65
  }
66
66
  function createItems(openapiData) {
67
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
67
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
68
68
  // TODO: Find a better way to handle this
69
69
  let items = [];
70
70
  // Only create an info page if we have a description.
71
71
  if (openapiData.info.description) {
72
+ const infoId = (0, lodash_1.kebabCase)(openapiData.info.title);
72
73
  const infoPage = {
73
74
  type: "info",
74
- id: "introduction",
75
- unversionedId: "introduction",
76
- title: "Introduction",
75
+ id: infoId,
76
+ unversionedId: infoId,
77
+ title: openapiData.info.title,
77
78
  description: openapiData.info.description,
78
- slug: "/introduction",
79
+ slug: "/" + infoId,
79
80
  frontMatter: {},
80
81
  info: {
81
82
  ...openapiData.info,
82
- title: (_a = openapiData.info.title) !== null && _a !== void 0 ? _a : "Introduction",
83
+ tags: (_a = openapiData.tags) === null || _a === void 0 ? void 0 : _a.map((tagName) => { var _a; return getTagDisplayName(tagName.name, (_a = openapiData.tags) !== null && _a !== void 0 ? _a : []); }),
84
+ title: (_b = openapiData.info.title) !== null && _b !== void 0 ? _b : "Introduction",
83
85
  },
84
86
  };
85
87
  items.push(infoPage);
@@ -87,16 +89,16 @@ function createItems(openapiData) {
87
89
  for (let [path, pathObject] of Object.entries(openapiData.paths)) {
88
90
  const { $ref, description, parameters, servers, summary, ...rest } = pathObject;
89
91
  for (let [method, operationObject] of Object.entries({ ...rest })) {
90
- const title = (_c = (_b = operationObject.summary) !== null && _b !== void 0 ? _b : operationObject.operationId) !== null && _c !== void 0 ? _c : "Missing summary";
92
+ const title = (_d = (_c = operationObject.summary) !== null && _c !== void 0 ? _c : operationObject.operationId) !== null && _d !== void 0 ? _d : "Missing summary";
91
93
  if (operationObject.description === undefined) {
92
94
  operationObject.description =
93
- (_e = (_d = operationObject.summary) !== null && _d !== void 0 ? _d : operationObject.operationId) !== null && _e !== void 0 ? _e : "";
95
+ (_f = (_e = operationObject.summary) !== null && _e !== void 0 ? _e : operationObject.operationId) !== null && _f !== void 0 ? _f : "";
94
96
  }
95
97
  const baseId = (0, lodash_1.kebabCase)(title);
96
- const servers = (_g = (_f = operationObject.servers) !== null && _f !== void 0 ? _f : pathObject.servers) !== null && _g !== void 0 ? _g : openapiData.servers;
97
- const security = (_h = operationObject.security) !== null && _h !== void 0 ? _h : openapiData.security;
98
+ const servers = (_h = (_g = operationObject.servers) !== null && _g !== void 0 ? _g : pathObject.servers) !== null && _h !== void 0 ? _h : openapiData.servers;
99
+ const security = (_j = operationObject.security) !== null && _j !== void 0 ? _j : openapiData.security;
98
100
  // Add security schemes so we know how to handle security.
99
- const securitySchemes = (_j = openapiData.components) === null || _j === void 0 ? void 0 : _j.securitySchemes;
101
+ const securitySchemes = (_k = openapiData.components) === null || _k === void 0 ? void 0 : _k.securitySchemes;
100
102
  // Make sure schemes are lowercase. See: https://github.com/cloud-annotations/docusaurus-plugin-openapi/issues/79
101
103
  if (securitySchemes) {
102
104
  for (let securityScheme of Object.values(securitySchemes)) {
@@ -106,7 +108,7 @@ function createItems(openapiData) {
106
108
  }
107
109
  }
108
110
  let jsonRequestBodyExample;
109
- const body = (_l = (_k = operationObject.requestBody) === null || _k === void 0 ? void 0 : _k.content) === null || _l === void 0 ? void 0 : _l["application/json"];
111
+ const body = (_m = (_l = operationObject.requestBody) === null || _l === void 0 ? void 0 : _l.content) === null || _m === void 0 ? void 0 : _m["application/json"];
110
112
  if (body === null || body === void 0 ? void 0 : body.schema) {
111
113
  jsonRequestBodyExample = (0, createExample_1.sampleFromSchema)(body.schema);
112
114
  }
@@ -122,7 +124,7 @@ function createItems(openapiData) {
122
124
  frontMatter: {},
123
125
  api: {
124
126
  ...defaults,
125
- tags: (_m = operationObject.tags) === null || _m === void 0 ? void 0 : _m.map((tagName) => { var _a; return getTagDisplayName(tagName, (_a = openapiData.tags) !== null && _a !== void 0 ? _a : []); }),
127
+ tags: (_o = operationObject.tags) === null || _o === void 0 ? void 0 : _o.map((tagName) => { var _a; return getTagDisplayName(tagName, (_a = openapiData.tags) !== null && _a !== void 0 ? _a : []); }),
126
128
  method,
127
129
  path,
128
130
  servers,
@@ -192,14 +194,23 @@ async function readOpenapiFiles(openapiPath, _options) {
192
194
  exports.readOpenapiFiles = readOpenapiFiles;
193
195
  async function processOpenapiFiles(files) {
194
196
  const promises = files.map(async (file) => {
195
- const items = await processOpenapiFile(file.data);
196
- return items.map((item) => ({
197
+ const processedFile = await processOpenapiFile(file.data);
198
+ const itemsObjectsArray = processedFile[0].map((item) => ({
197
199
  ...item,
198
200
  }));
201
+ const tags = processedFile[1];
202
+ return [itemsObjectsArray, tags];
199
203
  });
200
204
  const metadata = await Promise.all(promises);
201
- const items = metadata.flat();
202
- return items;
205
+ const items = metadata
206
+ .map(function (x) {
207
+ return x[0];
208
+ })
209
+ .flat();
210
+ const tags = metadata.map(function (x) {
211
+ return x[1];
212
+ });
213
+ return [items, tags];
203
214
  }
204
215
  exports.processOpenapiFiles = processOpenapiFiles;
205
216
  async function processOpenapiFile(openapiDataWithRefs) {
@@ -207,7 +218,11 @@ async function processOpenapiFile(openapiDataWithRefs) {
207
218
  const postmanCollection = await createPostmanCollection(openapiData);
208
219
  const items = createItems(openapiData);
209
220
  bindCollectionToApiItems(items, postmanCollection);
210
- return items;
221
+ let tags = [];
222
+ if (openapiData.tags !== undefined) {
223
+ tags = openapiData.tags;
224
+ }
225
+ return [items, tags];
211
226
  }
212
227
  exports.processOpenapiFile = processOpenapiFile;
213
228
  // order for picking items as a display name of tags
@@ -229,3 +244,4 @@ function getTagDisplayName(tagName, tags) {
229
244
  // always default to the tagName
230
245
  return tagName;
231
246
  }
247
+ exports.getTagDisplayName = getTagDisplayName;
@@ -29,6 +29,7 @@ export interface InfoObject {
29
29
  contact?: ContactObject;
30
30
  license?: LicenseObject;
31
31
  version: string;
32
+ tags?: String[];
32
33
  }
33
34
  export interface ContactObject {
34
35
  name?: string;
@@ -237,7 +238,7 @@ export interface LinkObject {
237
238
  export declare type HeaderObject = Omit<ParameterObject, "name" | "in">;
238
239
  export declare type HeaderObjectWithRef = Omit<ParameterObjectWithRef, "name" | "in">;
239
240
  export interface TagObject {
240
- name: string;
241
+ name?: string;
241
242
  description?: string;
242
243
  externalDocs?: ExternalDocumentationObject;
243
244
  "x-displayName"?: string;
@@ -305,6 +306,8 @@ export interface HttpSecuritySchemeObject {
305
306
  description?: string;
306
307
  scheme: string;
307
308
  bearerFormat?: string;
309
+ name?: string;
310
+ in?: string;
308
311
  }
309
312
  export interface Oauth2SecuritySchemeObject {
310
313
  type: "oauth2";
@@ -1,3 +1,4 @@
1
1
  import { ProcessedSidebar } from "@docusaurus/plugin-content-docs/src/sidebars/types";
2
+ import { TagObject } from "../openapi/types";
2
3
  import type { SidebarOptions, APIOptions, ApiMetadata } from "../types";
3
- export default function generateSidebarSlice(sidebarOptions: SidebarOptions, options: APIOptions, api: ApiMetadata[]): ProcessedSidebar;
4
+ export default function generateSidebarSlice(sidebarOptions: SidebarOptions, options: APIOptions, api: ApiMetadata[], tags: TagObject[]): ProcessedSidebar;
@@ -10,25 +10,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const clsx_1 = __importDefault(require("clsx"));
13
+ const lodash_1 = require("lodash");
13
14
  const uniq_1 = __importDefault(require("lodash/uniq"));
14
15
  function isApiItem(item) {
15
16
  return item.type === "api";
16
17
  }
17
- function groupByTags(items, sidebarOptions, options) {
18
- // TODO: Figure out how to handle these
19
- // const intros = items.filter(isInfoItem).map((item) => {
20
- // return {
21
- // type: "link" as const,
22
- // label: item.title,
23
- // href: item.permalink,
24
- // docId: item.id,
25
- // };
26
- // });
18
+ function isInfoItem(item) {
19
+ return item.type === "info";
20
+ }
21
+ function groupByTags(items, sidebarOptions, options, tags) {
27
22
  const { outputDir } = options;
28
- const { sidebarCollapsed, sidebarCollapsible, customProps } = sidebarOptions;
23
+ const { sidebarCollapsed, sidebarCollapsible, customProps, categoryLinkSource, } = sidebarOptions;
24
+ const linkSource = categoryLinkSource !== null && categoryLinkSource !== void 0 ? categoryLinkSource : "tag";
29
25
  const apiItems = items.filter(isApiItem);
26
+ const infoItems = items.filter(isInfoItem);
27
+ const intros = infoItems.map((item) => {
28
+ return {
29
+ id: item.id,
30
+ title: item.title,
31
+ description: item.description,
32
+ tags: item.info.tags,
33
+ };
34
+ });
30
35
  // TODO: make sure we only take the first tag
31
- const tags = (0, uniq_1.default)(apiItems
36
+ const tags_ = (0, uniq_1.default)(apiItems
32
37
  .flatMap((item) => item.api.tags)
33
38
  .filter((item) => !!item));
34
39
  // TODO: optimize this or make it a function
@@ -51,11 +56,47 @@ function groupByTags(items, sidebarOptions, options) {
51
56
  }, item.api.method),
52
57
  };
53
58
  }
54
- const tagged = tags
59
+ let introDoc = undefined;
60
+ if (linkSource === "info") {
61
+ const infoItem = infoItems[0];
62
+ const id = infoItem.id;
63
+ introDoc = {
64
+ type: "doc",
65
+ id: `${basePath}/${id}`,
66
+ };
67
+ }
68
+ const tagged = tags_
55
69
  .map((tag) => {
70
+ // TODO: should we also use the info.title as generated-index title?
71
+ const infoObject = intros.find((i) => i.tags.includes(tag));
72
+ const tagObject = tags.flat().find((t) => {
73
+ var _a;
74
+ return (_a = (tag === t.name || tag === t["x-displayName"])) !== null && _a !== void 0 ? _a : {
75
+ name: tag,
76
+ description: `${tag} Index`,
77
+ };
78
+ });
79
+ // TODO: perhaps move all this into a getLinkConfig() function
80
+ let linkConfig = undefined;
81
+ if (infoObject !== undefined && linkSource === "info") {
82
+ linkConfig = {
83
+ type: "doc",
84
+ id: `${basePath}/${infoObject.id}`,
85
+ };
86
+ }
87
+ if (tagObject !== undefined && linkSource === "tag") {
88
+ const linkDescription = tagObject === null || tagObject === void 0 ? void 0 : tagObject.description;
89
+ linkConfig = {
90
+ type: "generated-index",
91
+ title: tag,
92
+ description: linkDescription,
93
+ slug: "/category/" + (0, lodash_1.kebabCase)(tag),
94
+ };
95
+ }
56
96
  return {
57
97
  type: "category",
58
98
  label: tag,
99
+ link: linkConfig,
59
100
  collapsible: sidebarCollapsible,
60
101
  collapsed: sidebarCollapsed,
61
102
  items: apiItems
@@ -64,25 +105,28 @@ function groupByTags(items, sidebarOptions, options) {
64
105
  };
65
106
  })
66
107
  .filter((item) => item.items.length > 0); // Filter out any categories with no items.
108
+ // TODO: determine how we want to handle these
67
109
  // const untagged = [
68
- // // TODO: determine if needed and how
69
110
  // {
70
111
  // type: "category" as const,
71
112
  // label: "UNTAGGED",
72
- // // collapsible: options.sidebarCollapsible, TODO: add option
73
- // // collapsed: options.sidebarCollapsed, TODO: add option
113
+ // collapsible: sidebarCollapsible,
114
+ // collapsed: sidebarCollapsed,
74
115
  // items: apiItems
75
- // //@ts-ignore
76
116
  // .filter(({ api }) => api.tags === undefined || api.tags.length === 0)
77
117
  // .map(createDocItem),
78
118
  // },
79
119
  // ];
120
+ // Shift intro doc to top of sidebar
121
+ if (introDoc && linkSource === "info") {
122
+ tagged.unshift(introDoc);
123
+ }
80
124
  return [...tagged];
81
125
  }
82
- function generateSidebarSlice(sidebarOptions, options, api) {
126
+ function generateSidebarSlice(sidebarOptions, options, api, tags) {
83
127
  let sidebarSlice = [];
84
128
  if (sidebarOptions.groupPathsBy === "tags") {
85
- sidebarSlice = groupByTags(api, sidebarOptions, options);
129
+ sidebarSlice = groupByTags(api, sidebarOptions, options, tags);
86
130
  }
87
131
  return sidebarSlice;
88
132
  }
package/lib/types.d.ts CHANGED
@@ -60,6 +60,8 @@ export interface ApiNavLink {
60
60
  }
61
61
  export interface SidebarOptions {
62
62
  groupPathsBy?: string;
63
+ useInfoAsCategoryLink?: boolean;
64
+ categoryLinkSource?: string;
63
65
  customProps?: {
64
66
  [key: string]: unknown;
65
67
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "docusaurus-plugin-openapi-docs",
3
3
  "description": "OpenAPI plugin for Docusaurus.",
4
- "version": "0.0.0-349",
4
+ "version": "0.0.0-352",
5
5
  "license": "MIT",
6
6
  "keywords": [
7
7
  "openapi",
@@ -28,18 +28,18 @@
28
28
  "watch": "tsc --watch"
29
29
  },
30
30
  "devDependencies": {
31
- "@docusaurus/module-type-aliases": "2.0.0-beta.20",
32
- "@docusaurus/types": "2.0.0-beta.20",
31
+ "@docusaurus/module-type-aliases": "2.0.0-beta.18",
32
+ "@docusaurus/types": "2.0.0-beta.18",
33
33
  "@types/fs-extra": "^9.0.13",
34
34
  "@types/json-schema": "^7.0.9",
35
35
  "@types/lodash": "^4.14.176",
36
36
  "utility-types": "^3.10.0"
37
37
  },
38
38
  "dependencies": {
39
- "@docusaurus/mdx-loader": "2.0.0-beta.20",
40
- "@docusaurus/plugin-content-docs": "2.0.0-beta.20",
41
- "@docusaurus/utils": "2.0.0-beta.20",
42
- "@docusaurus/utils-validation": "2.0.0-beta.20",
39
+ "@docusaurus/mdx-loader": "2.0.0-beta.18",
40
+ "@docusaurus/plugin-content-docs": "2.0.0-beta.18",
41
+ "@docusaurus/utils": "2.0.0-beta.18",
42
+ "@docusaurus/utils-validation": "2.0.0-beta.18",
43
43
  "@paloaltonetworks/openapi-to-postmanv2": "3.1.0-hotfix.1",
44
44
  "@paloaltonetworks/postman-collection": "^4.1.0",
45
45
  "@types/js-yaml": "^4.0.5",
@@ -60,5 +60,5 @@
60
60
  "engines": {
61
61
  "node": ">=14"
62
62
  },
63
- "gitHead": "0fafe223e6bbb9e5b67128c30a0a3ef84af0d074"
63
+ "gitHead": "dc9b85400c4cf3f675641234bf38c398b5ba9dd0"
64
64
  }