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.
- package/lib/index.js +32 -7
- package/lib/markdown/createContactInfo.d.ts +2 -0
- package/lib/markdown/createContactInfo.js +49 -0
- package/lib/markdown/createLicense.d.ts +2 -0
- package/lib/markdown/createLicense.js +33 -0
- package/lib/markdown/createTermsOfService.d.ts +1 -0
- package/lib/markdown/createTermsOfService.js +32 -0
- package/lib/markdown/index.d.ts +1 -1
- package/lib/markdown/index.js +7 -1
- package/lib/openapi/openapi.d.ts +4 -3
- package/lib/openapi/openapi.js +35 -19
- package/lib/openapi/types.d.ts +4 -1
- package/lib/sidebars/index.d.ts +2 -1
- package/lib/sidebars/index.js +63 -19
- package/lib/types.d.ts +2 -0
- package/package.json +8 -8
- package/src/index.ts +44 -8
- package/src/markdown/createContactInfo.ts +48 -0
- package/src/markdown/createLicense.ts +32 -0
- package/src/markdown/createTermsOfService.ts +30 -0
- package/src/markdown/index.ts +8 -1
- package/src/openapi/openapi.ts +29 -12
- package/src/openapi/types.ts +4 -1
- package/src/sidebars/index.ts +80 -20
- package/src/types.ts +2 -0
- package/lib/markdown/createFullWidthTable.d.ts +0 -2
- package/lib/markdown/createFullWidthTable.js +0 -18
- package/lib/markdown/createParamsTable.d.ts +0 -7
- package/lib/markdown/createParamsTable.js +0 -80
- package/lib/markdown/createRequestBodyTable.d.ts +0 -6
- package/lib/markdown/createRequestBodyTable.js +0 -14
- package/lib/markdown/createSchemaTable.d.ts +0 -14
- package/lib/markdown/createSchemaTable.js +0 -217
- package/src/markdown/createFullWidthTable.ts +0 -16
- package/src/markdown/createParamsTable.ts +0 -102
- package/src/markdown/createRequestBodyTable.ts +0 -17
- package/src/markdown/createSchemaTable.ts +0 -275
- package/yarn-error.log +0 -15179
package/src/index.ts
CHANGED
|
@@ -32,8 +32,7 @@ export default function pluginOpenAPI(
|
|
|
32
32
|
|
|
33
33
|
try {
|
|
34
34
|
const openapiFiles = await readOpenapiFiles(contentPath, {});
|
|
35
|
-
const loadedApi = await processOpenapiFiles(openapiFiles);
|
|
36
|
-
|
|
35
|
+
const [loadedApi, tags] = await processOpenapiFiles(openapiFiles);
|
|
37
36
|
if (!fs.existsSync(outputDir)) {
|
|
38
37
|
try {
|
|
39
38
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
@@ -51,7 +50,8 @@ export default function pluginOpenAPI(
|
|
|
51
50
|
const sidebarSlice = generateSidebarSlice(
|
|
52
51
|
sidebarOptions!, // TODO: find a better way to handle null
|
|
53
52
|
options,
|
|
54
|
-
loadedApi
|
|
53
|
+
loadedApi,
|
|
54
|
+
tags
|
|
55
55
|
);
|
|
56
56
|
|
|
57
57
|
const sidebarSliceTemplate = template
|
|
@@ -81,7 +81,12 @@ export default function pluginOpenAPI(
|
|
|
81
81
|
? fs.readFileSync(template).toString()
|
|
82
82
|
: `---
|
|
83
83
|
id: {{{id}}}
|
|
84
|
+
{{^api}}
|
|
85
|
+
sidebar_label: Introduction
|
|
86
|
+
{{/api}}
|
|
87
|
+
{{#api}}
|
|
84
88
|
sidebar_label: {{{title}}}
|
|
89
|
+
{{/api}}
|
|
85
90
|
{{^api}}
|
|
86
91
|
sidebar_position: 0
|
|
87
92
|
{{/api}}
|
|
@@ -100,6 +105,24 @@ sidebar_class_name: "{{{api.method}}} api-method"
|
|
|
100
105
|
{{{markdown}}}
|
|
101
106
|
`;
|
|
102
107
|
|
|
108
|
+
const infoMdTemplate = template
|
|
109
|
+
? fs.readFileSync(template).toString()
|
|
110
|
+
: `---
|
|
111
|
+
id: {{{id}}}
|
|
112
|
+
sidebar_label: {{{title}}}
|
|
113
|
+
hide_title: true
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
{{{markdown}}}
|
|
117
|
+
|
|
118
|
+
\`\`\`mdx-code-block
|
|
119
|
+
import DocCardList from '@theme/DocCardList';
|
|
120
|
+
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
|
|
121
|
+
|
|
122
|
+
<DocCardList items={useCurrentSidebarCategory().items}/>
|
|
123
|
+
\`\`\`
|
|
124
|
+
`;
|
|
125
|
+
|
|
103
126
|
loadedApi.map(async (item) => {
|
|
104
127
|
const markdown =
|
|
105
128
|
item.type === "api" ? createApiPageMD(item) : createInfoPageMD(item);
|
|
@@ -108,6 +131,7 @@ sidebar_class_name: "{{{api.method}}} api-method"
|
|
|
108
131
|
item.json = JSON.stringify(item.api);
|
|
109
132
|
}
|
|
110
133
|
const view = render(mdTemplate, item);
|
|
134
|
+
const utils = render(infoMdTemplate, item);
|
|
111
135
|
|
|
112
136
|
if (item.type === "api") {
|
|
113
137
|
if (!fs.existsSync(`${outputDir}/${item.id}.api.mdx`)) {
|
|
@@ -129,15 +153,27 @@ sidebar_class_name: "{{{api.method}}} api-method"
|
|
|
129
153
|
|
|
130
154
|
// TODO: determine if we actually want/need this
|
|
131
155
|
if (item.type === "info") {
|
|
132
|
-
if (!fs.existsSync(`${outputDir}
|
|
156
|
+
if (!fs.existsSync(`${outputDir}/${item.id}.info.mdx`)) {
|
|
133
157
|
try {
|
|
134
|
-
|
|
158
|
+
sidebarOptions?.useInfoAsCategoryLink
|
|
159
|
+
? fs.writeFileSync(
|
|
160
|
+
`${outputDir}/${item.id}.info.mdx`,
|
|
161
|
+
utils,
|
|
162
|
+
"utf8"
|
|
163
|
+
)
|
|
164
|
+
: fs.writeFileSync(
|
|
165
|
+
`${outputDir}/${item.id}.info.mdx`,
|
|
166
|
+
view,
|
|
167
|
+
"utf8"
|
|
168
|
+
);
|
|
135
169
|
console.log(
|
|
136
|
-
chalk.green(
|
|
170
|
+
chalk.green(
|
|
171
|
+
`Successfully created "${outputDir}/${item.id}.info.mdx"`
|
|
172
|
+
)
|
|
137
173
|
);
|
|
138
174
|
} catch (err) {
|
|
139
175
|
console.error(
|
|
140
|
-
chalk.red(`Failed to write "${outputDir}
|
|
176
|
+
chalk.red(`Failed to write "${outputDir}/${item.id}.info.mdx"`),
|
|
141
177
|
chalk.yellow(err)
|
|
142
178
|
);
|
|
143
179
|
}
|
|
@@ -155,7 +191,7 @@ sidebar_class_name: "{{{api.method}}} api-method"
|
|
|
155
191
|
async function cleanApiDocs(options: APIOptions) {
|
|
156
192
|
const { outputDir } = options;
|
|
157
193
|
const apiDir = path.join(siteDir, outputDir);
|
|
158
|
-
const apiMdxFiles = await Globby(["*.api.mdx"], {
|
|
194
|
+
const apiMdxFiles = await Globby(["*.api.mdx", "*.info.mdx"], {
|
|
159
195
|
cwd: path.resolve(apiDir),
|
|
160
196
|
});
|
|
161
197
|
const sidebarFile = await Globby(["sidebar.js"], {
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* Copyright (c) Palo Alto Networks
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
* ========================================================================== */
|
|
7
|
+
|
|
8
|
+
import { ContactObject } from "../openapi/types";
|
|
9
|
+
import { create } from "./utils";
|
|
10
|
+
|
|
11
|
+
export function createContactInfo(contact: ContactObject) {
|
|
12
|
+
if (!contact) return "";
|
|
13
|
+
const { name, url, email } = contact;
|
|
14
|
+
|
|
15
|
+
return create("div", {
|
|
16
|
+
style: {
|
|
17
|
+
display: "flex",
|
|
18
|
+
flexDirection: "column",
|
|
19
|
+
marginBottom: "var(--ifm-paragraph-margin-bottom)",
|
|
20
|
+
},
|
|
21
|
+
children: [
|
|
22
|
+
create("h3", {
|
|
23
|
+
style: {
|
|
24
|
+
marginBottom: "0.25rem",
|
|
25
|
+
},
|
|
26
|
+
children: "Contact",
|
|
27
|
+
}),
|
|
28
|
+
create("span", {
|
|
29
|
+
children: [
|
|
30
|
+
`${name}: `,
|
|
31
|
+
create("a", {
|
|
32
|
+
href: `mailto:${email}`,
|
|
33
|
+
children: `${email}`,
|
|
34
|
+
}),
|
|
35
|
+
],
|
|
36
|
+
}),
|
|
37
|
+
create("span", {
|
|
38
|
+
children: [
|
|
39
|
+
"URL: ",
|
|
40
|
+
create("a", {
|
|
41
|
+
href: `${url}`,
|
|
42
|
+
children: `${url}`,
|
|
43
|
+
}),
|
|
44
|
+
],
|
|
45
|
+
}),
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* Copyright (c) Palo Alto Networks
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
* ========================================================================== */
|
|
7
|
+
|
|
8
|
+
import { LicenseObject } from "../openapi/types";
|
|
9
|
+
import { create } from "./utils";
|
|
10
|
+
|
|
11
|
+
export function createLicense(license: LicenseObject) {
|
|
12
|
+
if (!license) return "";
|
|
13
|
+
const { name, url } = license;
|
|
14
|
+
|
|
15
|
+
return create("div", {
|
|
16
|
+
style: {
|
|
17
|
+
marginBottom: "var(--ifm-paragraph-margin-bottom)",
|
|
18
|
+
},
|
|
19
|
+
children: [
|
|
20
|
+
create("h3", {
|
|
21
|
+
style: {
|
|
22
|
+
marginBottom: "0.25rem",
|
|
23
|
+
},
|
|
24
|
+
children: "License",
|
|
25
|
+
}),
|
|
26
|
+
create("a", {
|
|
27
|
+
href: url,
|
|
28
|
+
children: name,
|
|
29
|
+
}),
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* ============================================================================
|
|
2
|
+
* Copyright (c) Palo Alto Networks
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
* ========================================================================== */
|
|
7
|
+
|
|
8
|
+
import { create } from "./utils";
|
|
9
|
+
|
|
10
|
+
export function createTermsOfService(termsOfService: string | undefined) {
|
|
11
|
+
if (!createTermsOfService) return "";
|
|
12
|
+
|
|
13
|
+
return create("div", {
|
|
14
|
+
style: {
|
|
15
|
+
marginBottom: "var(--ifm-paragraph-margin-bottom)",
|
|
16
|
+
},
|
|
17
|
+
children: [
|
|
18
|
+
create("h3", {
|
|
19
|
+
style: {
|
|
20
|
+
marginBottom: "0.25rem",
|
|
21
|
+
},
|
|
22
|
+
children: "Terms of Service",
|
|
23
|
+
}),
|
|
24
|
+
create("a", {
|
|
25
|
+
href: `${termsOfService}`,
|
|
26
|
+
children: termsOfService,
|
|
27
|
+
}),
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
}
|
package/src/markdown/index.ts
CHANGED
|
@@ -7,12 +7,16 @@
|
|
|
7
7
|
|
|
8
8
|
import { escape } from "lodash";
|
|
9
9
|
|
|
10
|
+
import { ContactObject, LicenseObject } from "../openapi/types";
|
|
10
11
|
import { ApiPageMetadata, InfoPageMetadata } from "../types";
|
|
12
|
+
import { createContactInfo } from "./createContactInfo";
|
|
11
13
|
import { createDeprecationNotice } from "./createDeprecationNotice";
|
|
12
14
|
import { createDescription } from "./createDescription";
|
|
15
|
+
import { createLicense } from "./createLicense";
|
|
13
16
|
import { createParamsDetails } from "./createParamsDetails";
|
|
14
17
|
import { createRequestBodyDetails } from "./createRequestBodyDetails";
|
|
15
18
|
import { createStatusCodes } from "./createStatusCodes";
|
|
19
|
+
import { createTermsOfService } from "./createTermsOfService";
|
|
16
20
|
import { createVersionBadge } from "./createVersionBadge";
|
|
17
21
|
import { render } from "./utils";
|
|
18
22
|
|
|
@@ -45,11 +49,14 @@ export function createApiPageMD({
|
|
|
45
49
|
}
|
|
46
50
|
|
|
47
51
|
export function createInfoPageMD({
|
|
48
|
-
info: { title, version, description },
|
|
52
|
+
info: { title, version, description, contact, license, termsOfService },
|
|
49
53
|
}: InfoPageMetadata) {
|
|
50
54
|
return render([
|
|
51
55
|
createVersionBadge(version),
|
|
52
56
|
`# ${escape(title)}\n\n`,
|
|
53
57
|
createDescription(description),
|
|
58
|
+
createContactInfo(contact as ContactObject),
|
|
59
|
+
createTermsOfService(termsOfService),
|
|
60
|
+
createLicense(license as LicenseObject),
|
|
54
61
|
]);
|
|
55
62
|
}
|
package/src/openapi/openapi.ts
CHANGED
|
@@ -81,16 +81,20 @@ function createItems(openapiData: OpenApiObject): ApiMetadata[] {
|
|
|
81
81
|
|
|
82
82
|
// Only create an info page if we have a description.
|
|
83
83
|
if (openapiData.info.description) {
|
|
84
|
+
const infoId = kebabCase(openapiData.info.title);
|
|
84
85
|
const infoPage: PartialPage<InfoPageMetadata> = {
|
|
85
86
|
type: "info",
|
|
86
|
-
id:
|
|
87
|
-
unversionedId:
|
|
88
|
-
title:
|
|
87
|
+
id: infoId,
|
|
88
|
+
unversionedId: infoId,
|
|
89
|
+
title: openapiData.info.title,
|
|
89
90
|
description: openapiData.info.description,
|
|
90
|
-
slug: "/
|
|
91
|
+
slug: "/" + infoId,
|
|
91
92
|
frontMatter: {},
|
|
92
93
|
info: {
|
|
93
94
|
...openapiData.info,
|
|
95
|
+
tags: openapiData.tags?.map((tagName) =>
|
|
96
|
+
getTagDisplayName(tagName.name!, openapiData.tags ?? [])
|
|
97
|
+
),
|
|
94
98
|
title: openapiData.info.title ?? "Introduction",
|
|
95
99
|
},
|
|
96
100
|
};
|
|
@@ -245,34 +249,47 @@ export async function readOpenapiFiles(
|
|
|
245
249
|
|
|
246
250
|
export async function processOpenapiFiles(
|
|
247
251
|
files: OpenApiFiles[]
|
|
248
|
-
): Promise<ApiMetadata[]> {
|
|
252
|
+
): Promise<[ApiMetadata[], TagObject[]]> {
|
|
249
253
|
const promises = files.map(async (file) => {
|
|
250
|
-
const
|
|
251
|
-
|
|
254
|
+
const processedFile = await processOpenapiFile(file.data);
|
|
255
|
+
const itemsObjectsArray = processedFile[0].map((item) => ({
|
|
252
256
|
...item,
|
|
253
257
|
}));
|
|
258
|
+
const tags = processedFile[1];
|
|
259
|
+
return [itemsObjectsArray, tags];
|
|
254
260
|
});
|
|
255
261
|
const metadata = await Promise.all(promises);
|
|
256
|
-
const items = metadata
|
|
257
|
-
|
|
262
|
+
const items = metadata
|
|
263
|
+
.map(function (x) {
|
|
264
|
+
return x[0];
|
|
265
|
+
})
|
|
266
|
+
.flat();
|
|
267
|
+
const tags = metadata.map(function (x) {
|
|
268
|
+
return x[1];
|
|
269
|
+
});
|
|
270
|
+
return [items as ApiMetadata[], tags as TagObject[]];
|
|
258
271
|
}
|
|
259
272
|
|
|
260
273
|
export async function processOpenapiFile(
|
|
261
274
|
openapiDataWithRefs: OpenApiObjectWithRef
|
|
262
|
-
): Promise<ApiMetadata[]> {
|
|
275
|
+
): Promise<[ApiMetadata[], TagObject[]]> {
|
|
263
276
|
const openapiData = await resolveRefs(openapiDataWithRefs);
|
|
264
277
|
const postmanCollection = await createPostmanCollection(openapiData);
|
|
265
278
|
const items = createItems(openapiData);
|
|
266
279
|
|
|
267
280
|
bindCollectionToApiItems(items, postmanCollection);
|
|
268
281
|
|
|
269
|
-
|
|
282
|
+
let tags: TagObject[] = [];
|
|
283
|
+
if (openapiData.tags !== undefined) {
|
|
284
|
+
tags = openapiData.tags;
|
|
285
|
+
}
|
|
286
|
+
return [items, tags];
|
|
270
287
|
}
|
|
271
288
|
|
|
272
289
|
// order for picking items as a display name of tags
|
|
273
290
|
const tagDisplayNameProperties = ["x-displayName", "name"] as const;
|
|
274
291
|
|
|
275
|
-
function getTagDisplayName(tagName: string, tags: TagObject[]): string {
|
|
292
|
+
export function getTagDisplayName(tagName: string, tags: TagObject[]): string {
|
|
276
293
|
// find the very own tagObject
|
|
277
294
|
const tagObject = tags.find((tagObject) => tagObject.name === tagName) ?? {
|
|
278
295
|
// if none found, just fake one
|
package/src/openapi/types.ts
CHANGED
|
@@ -40,6 +40,7 @@ export interface InfoObject {
|
|
|
40
40
|
contact?: ContactObject;
|
|
41
41
|
license?: LicenseObject;
|
|
42
42
|
version: string;
|
|
43
|
+
tags?: String[];
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
export interface ContactObject {
|
|
@@ -294,7 +295,7 @@ export type HeaderObject = Omit<ParameterObject, "name" | "in">;
|
|
|
294
295
|
export type HeaderObjectWithRef = Omit<ParameterObjectWithRef, "name" | "in">;
|
|
295
296
|
|
|
296
297
|
export interface TagObject {
|
|
297
|
-
name
|
|
298
|
+
name?: string;
|
|
298
299
|
description?: string;
|
|
299
300
|
externalDocs?: ExternalDocumentationObject;
|
|
300
301
|
"x-displayName"?: string;
|
|
@@ -400,6 +401,8 @@ export interface HttpSecuritySchemeObject {
|
|
|
400
401
|
description?: string;
|
|
401
402
|
scheme: string;
|
|
402
403
|
bearerFormat?: string;
|
|
404
|
+
name?: string;
|
|
405
|
+
in?: string;
|
|
403
406
|
}
|
|
404
407
|
|
|
405
408
|
export interface Oauth2SecuritySchemeObject {
|
package/src/sidebars/index.ts
CHANGED
|
@@ -7,11 +7,14 @@
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
ProcessedSidebar,
|
|
10
|
+
SidebarItemCategoryLinkConfig,
|
|
10
11
|
SidebarItemDoc,
|
|
11
12
|
} from "@docusaurus/plugin-content-docs/src/sidebars/types";
|
|
12
13
|
import clsx from "clsx";
|
|
14
|
+
import { kebabCase } from "lodash";
|
|
13
15
|
import uniq from "lodash/uniq";
|
|
14
16
|
|
|
17
|
+
import { TagObject } from "../openapi/types";
|
|
15
18
|
import type {
|
|
16
19
|
SidebarOptions,
|
|
17
20
|
APIOptions,
|
|
@@ -23,28 +26,38 @@ function isApiItem(item: ApiMetadata): item is ApiMetadata {
|
|
|
23
26
|
return item.type === "api";
|
|
24
27
|
}
|
|
25
28
|
|
|
29
|
+
function isInfoItem(item: ApiMetadata): item is ApiMetadata {
|
|
30
|
+
return item.type === "info";
|
|
31
|
+
}
|
|
32
|
+
|
|
26
33
|
function groupByTags(
|
|
27
34
|
items: ApiPageMetadata[],
|
|
28
35
|
sidebarOptions: SidebarOptions,
|
|
29
|
-
options: APIOptions
|
|
36
|
+
options: APIOptions,
|
|
37
|
+
tags: TagObject[]
|
|
30
38
|
): ProcessedSidebar {
|
|
31
|
-
// TODO: Figure out how to handle these
|
|
32
|
-
// const intros = items.filter(isInfoItem).map((item) => {
|
|
33
|
-
// return {
|
|
34
|
-
// type: "link" as const,
|
|
35
|
-
// label: item.title,
|
|
36
|
-
// href: item.permalink,
|
|
37
|
-
// docId: item.id,
|
|
38
|
-
// };
|
|
39
|
-
// });
|
|
40
|
-
|
|
41
39
|
const { outputDir } = options;
|
|
42
|
-
const {
|
|
40
|
+
const {
|
|
41
|
+
sidebarCollapsed,
|
|
42
|
+
sidebarCollapsible,
|
|
43
|
+
customProps,
|
|
44
|
+
categoryLinkSource,
|
|
45
|
+
} = sidebarOptions;
|
|
46
|
+
const linkSource = categoryLinkSource ?? "tag";
|
|
43
47
|
|
|
44
48
|
const apiItems = items.filter(isApiItem);
|
|
49
|
+
const infoItems = items.filter(isInfoItem);
|
|
50
|
+
const intros = infoItems.map((item: any) => {
|
|
51
|
+
return {
|
|
52
|
+
id: item.id,
|
|
53
|
+
title: item.title,
|
|
54
|
+
description: item.description,
|
|
55
|
+
tags: item.info.tags,
|
|
56
|
+
};
|
|
57
|
+
});
|
|
45
58
|
|
|
46
59
|
// TODO: make sure we only take the first tag
|
|
47
|
-
const
|
|
60
|
+
const tags_ = uniq(
|
|
48
61
|
apiItems
|
|
49
62
|
.flatMap((item) => item.api.tags)
|
|
50
63
|
.filter((item): item is string => !!item)
|
|
@@ -74,11 +87,51 @@ function groupByTags(
|
|
|
74
87
|
};
|
|
75
88
|
}
|
|
76
89
|
|
|
77
|
-
|
|
90
|
+
let introDoc = undefined;
|
|
91
|
+
if (linkSource === "info") {
|
|
92
|
+
const infoItem = infoItems[0];
|
|
93
|
+
const id = infoItem.id;
|
|
94
|
+
introDoc = {
|
|
95
|
+
type: "doc" as const,
|
|
96
|
+
id: `${basePath}/${id}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const tagged = tags_
|
|
78
101
|
.map((tag) => {
|
|
102
|
+
// TODO: should we also use the info.title as generated-index title?
|
|
103
|
+
const infoObject = intros.find((i) => i.tags.includes(tag));
|
|
104
|
+
const tagObject = tags.flat().find(
|
|
105
|
+
(t) =>
|
|
106
|
+
(tag === t.name || tag === t["x-displayName"]) ?? {
|
|
107
|
+
name: tag,
|
|
108
|
+
description: `${tag} Index`,
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// TODO: perhaps move all this into a getLinkConfig() function
|
|
113
|
+
let linkConfig = undefined;
|
|
114
|
+
if (infoObject !== undefined && linkSource === "info") {
|
|
115
|
+
linkConfig = {
|
|
116
|
+
type: "doc",
|
|
117
|
+
id: `${basePath}/${infoObject.id}`,
|
|
118
|
+
} as SidebarItemCategoryLinkConfig;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (tagObject !== undefined && linkSource === "tag") {
|
|
122
|
+
const linkDescription = tagObject?.description;
|
|
123
|
+
linkConfig = {
|
|
124
|
+
type: "generated-index" as "generated-index",
|
|
125
|
+
title: tag,
|
|
126
|
+
description: linkDescription,
|
|
127
|
+
slug: "/category/" + kebabCase(tag),
|
|
128
|
+
} as SidebarItemCategoryLinkConfig;
|
|
129
|
+
}
|
|
130
|
+
|
|
79
131
|
return {
|
|
80
132
|
type: "category" as const,
|
|
81
133
|
label: tag,
|
|
134
|
+
link: linkConfig,
|
|
82
135
|
collapsible: sidebarCollapsible,
|
|
83
136
|
collapsed: sidebarCollapsed,
|
|
84
137
|
items: apiItems
|
|
@@ -88,33 +141,40 @@ function groupByTags(
|
|
|
88
141
|
})
|
|
89
142
|
.filter((item) => item.items.length > 0); // Filter out any categories with no items.
|
|
90
143
|
|
|
144
|
+
// TODO: determine how we want to handle these
|
|
91
145
|
// const untagged = [
|
|
92
|
-
// // TODO: determine if needed and how
|
|
93
146
|
// {
|
|
94
147
|
// type: "category" as const,
|
|
95
148
|
// label: "UNTAGGED",
|
|
96
|
-
//
|
|
97
|
-
//
|
|
149
|
+
// collapsible: sidebarCollapsible,
|
|
150
|
+
// collapsed: sidebarCollapsed,
|
|
98
151
|
// items: apiItems
|
|
99
|
-
// //@ts-ignore
|
|
100
152
|
// .filter(({ api }) => api.tags === undefined || api.tags.length === 0)
|
|
101
153
|
// .map(createDocItem),
|
|
102
154
|
// },
|
|
103
155
|
// ];
|
|
156
|
+
|
|
157
|
+
// Shift intro doc to top of sidebar
|
|
158
|
+
if (introDoc && linkSource === "info") {
|
|
159
|
+
tagged.unshift(introDoc as any);
|
|
160
|
+
}
|
|
161
|
+
|
|
104
162
|
return [...tagged];
|
|
105
163
|
}
|
|
106
164
|
|
|
107
165
|
export default function generateSidebarSlice(
|
|
108
166
|
sidebarOptions: SidebarOptions,
|
|
109
167
|
options: APIOptions,
|
|
110
|
-
api: ApiMetadata[]
|
|
168
|
+
api: ApiMetadata[],
|
|
169
|
+
tags: TagObject[]
|
|
111
170
|
) {
|
|
112
171
|
let sidebarSlice: ProcessedSidebar = [];
|
|
113
172
|
if (sidebarOptions.groupPathsBy === "tags") {
|
|
114
173
|
sidebarSlice = groupByTags(
|
|
115
174
|
api as ApiPageMetadata[],
|
|
116
175
|
sidebarOptions,
|
|
117
|
-
options
|
|
176
|
+
options,
|
|
177
|
+
tags
|
|
118
178
|
);
|
|
119
179
|
}
|
|
120
180
|
return sidebarSlice;
|
package/src/types.ts
CHANGED
|
@@ -90,6 +90,8 @@ export interface ApiNavLink {
|
|
|
90
90
|
|
|
91
91
|
export interface SidebarOptions {
|
|
92
92
|
groupPathsBy?: string;
|
|
93
|
+
useInfoAsCategoryLink?: boolean; // TODO: confirm name of option
|
|
94
|
+
categoryLinkSource?: string;
|
|
93
95
|
customProps?: { [key: string]: unknown };
|
|
94
96
|
sidebarCollapsible?: boolean;
|
|
95
97
|
sidebarCollapsed?: boolean;
|
|
@@ -1,18 +0,0 @@
|
|
|
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.createFullWidthTable = void 0;
|
|
10
|
-
const utils_1 = require("./utils");
|
|
11
|
-
function createFullWidthTable({ children, style, ...rest }) {
|
|
12
|
-
return (0, utils_1.create)("table", {
|
|
13
|
-
style: { display: "table", width: "100%", ...style },
|
|
14
|
-
...rest,
|
|
15
|
-
children,
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
exports.createFullWidthTable = createFullWidthTable;
|
|
@@ -1,80 +0,0 @@
|
|
|
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.createParamsTable = void 0;
|
|
10
|
-
const lodash_1 = require("lodash");
|
|
11
|
-
const createDescription_1 = require("./createDescription");
|
|
12
|
-
const createFullWidthTable_1 = require("./createFullWidthTable");
|
|
13
|
-
const schema_1 = require("./schema");
|
|
14
|
-
const utils_1 = require("./utils");
|
|
15
|
-
function createParamsTable({ parameters, type }) {
|
|
16
|
-
if (parameters === undefined) {
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
const params = parameters.filter((param) => (param === null || param === void 0 ? void 0 : param.in) === type);
|
|
20
|
-
if (params.length === 0) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
return (0, createFullWidthTable_1.createFullWidthTable)({
|
|
24
|
-
children: [
|
|
25
|
-
(0, utils_1.create)("thead", {
|
|
26
|
-
children: (0, utils_1.create)("tr", {
|
|
27
|
-
children: (0, utils_1.create)("th", {
|
|
28
|
-
style: { textAlign: "left" },
|
|
29
|
-
children: `${type.charAt(0).toUpperCase() + type.slice(1)} Parameters`,
|
|
30
|
-
}),
|
|
31
|
-
}),
|
|
32
|
-
}),
|
|
33
|
-
(0, utils_1.create)("tbody", {
|
|
34
|
-
children: params.map((param) => (0, utils_1.create)("tr", {
|
|
35
|
-
children: (0, utils_1.create)("td", {
|
|
36
|
-
children: [
|
|
37
|
-
(0, utils_1.create)("code", { children: param.name }),
|
|
38
|
-
(0, utils_1.guard)(param.schema, (schema) => (0, utils_1.create)("span", {
|
|
39
|
-
style: { opacity: "0.6" },
|
|
40
|
-
children: ` ${(0, schema_1.getSchemaName)(schema)}`,
|
|
41
|
-
})),
|
|
42
|
-
(0, utils_1.guard)(param.required, () => [
|
|
43
|
-
(0, utils_1.create)("span", {
|
|
44
|
-
style: { opacity: "0.6" },
|
|
45
|
-
children: " — ",
|
|
46
|
-
}),
|
|
47
|
-
(0, utils_1.create)("strong", {
|
|
48
|
-
style: {
|
|
49
|
-
fontSize: "var(--ifm-code-font-size)",
|
|
50
|
-
color: "var(--openapi-required)",
|
|
51
|
-
},
|
|
52
|
-
children: " REQUIRED",
|
|
53
|
-
}),
|
|
54
|
-
]),
|
|
55
|
-
(0, utils_1.guard)((0, schema_1.getQualifierMessage)(param.schema), (message) => (0, utils_1.create)("div", {
|
|
56
|
-
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
57
|
-
children: (0, createDescription_1.createDescription)(message),
|
|
58
|
-
})),
|
|
59
|
-
(0, utils_1.guard)(param.description, (description) => (0, utils_1.create)("div", {
|
|
60
|
-
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
61
|
-
children: (0, createDescription_1.createDescription)(description),
|
|
62
|
-
})),
|
|
63
|
-
(0, utils_1.guard)(param.example, (example) => (0, utils_1.create)("div", {
|
|
64
|
-
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
65
|
-
children: (0, lodash_1.escape)(`Example: ${example}`),
|
|
66
|
-
})),
|
|
67
|
-
(0, utils_1.guard)(param.examples, (examples) => (0, utils_1.create)("div", {
|
|
68
|
-
style: { marginTop: "var(--ifm-table-cell-padding)" },
|
|
69
|
-
children: Object.entries(examples).map(([k, v]) => (0, utils_1.create)("div", {
|
|
70
|
-
children: (0, lodash_1.escape)(`Example (${k}): ${v.value}`),
|
|
71
|
-
})),
|
|
72
|
-
})),
|
|
73
|
-
],
|
|
74
|
-
}),
|
|
75
|
-
})),
|
|
76
|
-
}),
|
|
77
|
-
],
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
exports.createParamsTable = createParamsTable;
|
|
@@ -1,14 +0,0 @@
|
|
|
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.createRequestBodyTable = void 0;
|
|
10
|
-
const createSchemaTable_1 = require("./createSchemaTable");
|
|
11
|
-
function createRequestBodyTable({ title, body }) {
|
|
12
|
-
return (0, createSchemaTable_1.createSchemaTable)({ title, body });
|
|
13
|
-
}
|
|
14
|
-
exports.createRequestBodyTable = createRequestBodyTable;
|